clippedBox.stories.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import {Fragment, useState} from 'react';
  2. import styled from '@emotion/styled';
  3. import onboardingFrameworkSelectionJavascript from 'sentry-images/spot/onboarding-framework-selection-javascript.svg';
  4. import ClippedBox from 'sentry/components/clippedBox';
  5. import JSXNode from 'sentry/components/stories/jsxNode';
  6. import JSXProperty from 'sentry/components/stories/jsxProperty';
  7. import Matrix from 'sentry/components/stories/matrix';
  8. import SideBySide from 'sentry/components/stories/sideBySide';
  9. import SizingWindow from 'sentry/components/stories/sizingWindow';
  10. import storyBook from 'sentry/stories/storyBook';
  11. import {space} from 'sentry/styles/space';
  12. export default storyBook(ClippedBox, story => {
  13. story('Default', () => (
  14. <Fragment>
  15. <p>
  16. By default <JSXNode name="ClippedBox" /> is just a container. Add{' '}
  17. <JSXProperty name="defaultClipped" value /> to occlude the bottom part of the
  18. content if the content height is larger than{' '}
  19. <JSXProperty name="clipHeight" value={Number} />. You should also set{' '}
  20. <JSXProperty name="clipHeight" value={Number} /> (default: 300) to be something
  21. reasonable for the situation.
  22. </p>
  23. <p>
  24. Once expanded, <JSXNode name="ClippedBox" /> cannot be collapsed again.
  25. </p>
  26. <SizingWindow>
  27. <ClippedBox>
  28. <img src={onboardingFrameworkSelectionJavascript} height={300} />
  29. </ClippedBox>
  30. </SizingWindow>
  31. </Fragment>
  32. ));
  33. const CustomFade = styled('div')`
  34. position: absolute;
  35. left: 0;
  36. right: 0;
  37. bottom: 0;
  38. padding: ${space(1)};
  39. background: ${p => p.theme.background};
  40. text-align: center;
  41. pointer-events: none;
  42. `;
  43. story('Title', () => (
  44. <SizingWindow>
  45. <ClippedBox title="This is the title">
  46. <img src={onboardingFrameworkSelectionJavascript} height={300} />
  47. </ClippedBox>
  48. </SizingWindow>
  49. ));
  50. story('Custom Button & Fade', () => (
  51. <Matrix
  52. render={ClippedBox}
  53. propMatrix={{
  54. btnText: ['Custom Label'],
  55. buttonProps: [undefined, {priority: 'danger'}],
  56. clipHeight: [100],
  57. clipFade: [
  58. undefined,
  59. ({showMoreButton}) => <CustomFade>{showMoreButton}</CustomFade>,
  60. ],
  61. children: [
  62. <img key="img" src={onboardingFrameworkSelectionJavascript} height={150} />,
  63. ],
  64. }}
  65. selectedProps={['buttonProps', 'clipFade']}
  66. />
  67. ));
  68. story('Callbacks', () => {
  69. return (
  70. <Fragment>
  71. <p>
  72. Some callbacks are available:{' '}
  73. <JSXProperty name="onSetRenderedHeight" value={Function} />
  74. & <JSXProperty name="onReveal" value={Function} />.
  75. </p>
  76. <SideBySide>
  77. {[50, 100, 150].map(imgHeight => {
  78. const [isRevealed, setIsRevealed] = useState(false);
  79. const [renderedHeight, setRenderedHeight] = useState<number | undefined>(
  80. undefined
  81. );
  82. return (
  83. <div key={imgHeight}>
  84. <p>
  85. <JSXNode name="ClippedBox" props={{clipHeight: 100}}>
  86. <JSXNode name="img" props={{height: imgHeight}} />
  87. </JSXNode>
  88. </p>
  89. <p>isRevealed = {String(isRevealed)}</p>
  90. <p>renderedHeight = {renderedHeight}</p>
  91. <SizingWindow>
  92. <ClippedBox
  93. clipHeight={100}
  94. onReveal={() => setIsRevealed(true)}
  95. onSetRenderedHeight={setRenderedHeight}
  96. >
  97. <img
  98. src={onboardingFrameworkSelectionJavascript}
  99. height={imgHeight}
  100. />
  101. </ClippedBox>
  102. </SizingWindow>
  103. </div>
  104. );
  105. })}
  106. </SideBySide>
  107. </Fragment>
  108. );
  109. });
  110. });