@adobe-commerce/elsie 1.0.0-alpha04071347

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/.elsie.js +21 -0
  2. package/.eslintrc.js +18 -0
  3. package/README.md +52 -0
  4. package/__mocks__/svg.js +11 -0
  5. package/bin/builders/build/index.js +20 -0
  6. package/bin/builders/generate/api/index.js +65 -0
  7. package/bin/builders/generate/api/templates/function.js +9 -0
  8. package/bin/builders/generate/api/templates/index.js +7 -0
  9. package/bin/builders/generate/api/templates/story.js +23 -0
  10. package/bin/builders/generate/api/templates/unit-test.js +15 -0
  11. package/bin/builders/generate/component/index.js +87 -0
  12. package/bin/builders/generate/component/templates/Component.js +43 -0
  13. package/bin/builders/generate/component/templates/css.js +24 -0
  14. package/bin/builders/generate/component/templates/index.js +8 -0
  15. package/bin/builders/generate/component/templates/stories.js +46 -0
  16. package/bin/builders/generate/component/templates/unit-test.js +19 -0
  17. package/bin/builders/generate/config/index.js +54 -0
  18. package/bin/builders/generate/config/templates/elsie.js +29 -0
  19. package/bin/builders/generate/container/index.js +65 -0
  20. package/bin/builders/generate/container/templates/Component.js +18 -0
  21. package/bin/builders/generate/container/templates/index.js +8 -0
  22. package/bin/builders/generate/container/templates/stories.js +34 -0
  23. package/bin/builders/generate/container/templates/unit-test.js +19 -0
  24. package/bin/builders/generate/index.js +283 -0
  25. package/bin/builders/gql/createOrClearDirectory.js +33 -0
  26. package/bin/builders/gql/getSchemaRef.js +25 -0
  27. package/bin/builders/gql/index.js +71 -0
  28. package/bin/builders/lint/index.js +5 -0
  29. package/bin/builders/serve/index.js +44 -0
  30. package/bin/builders/storybook/index.js +5 -0
  31. package/bin/builders/test/index.js +5 -0
  32. package/bin/index.js +26 -0
  33. package/bin/lib/cli.js +8 -0
  34. package/bin/lib/config.js +12 -0
  35. package/bin/lib/log-message.js +11 -0
  36. package/bin/lib/string.js +26 -0
  37. package/bin/lib/validate-typeof.js +28 -0
  38. package/bin/lib/write-file.js +30 -0
  39. package/bin/lib/write-parent-index.js +45 -0
  40. package/config/eslint.js +113 -0
  41. package/config/jest.js +90 -0
  42. package/config/prettier.js +16 -0
  43. package/config/setEnvVars.js +14 -0
  44. package/config/storybook/addon.js +130 -0
  45. package/config/storybook/components/FileTree/FileTree.jsx +192 -0
  46. package/config/storybook/components/FileTree/index.js +10 -0
  47. package/config/storybook/components/Flex/Flex.jsx +21 -0
  48. package/config/storybook/components/Flex/Flex.module.css +29 -0
  49. package/config/storybook/components/Flex/index.js +10 -0
  50. package/config/storybook/components/OptionsTable/OptionsTable.jsx +88 -0
  51. package/config/storybook/components/OptionsTable/OptionsTable.module.css +104 -0
  52. package/config/storybook/components/OptionsTable/index.js +10 -0
  53. package/config/storybook/components/Panel/Panel.module.css +56 -0
  54. package/config/storybook/components/Panel/Panel.tsx +46 -0
  55. package/config/storybook/components/Panel/index.ts +10 -0
  56. package/config/storybook/components/Screenshot/Screenshot.jsx +23 -0
  57. package/config/storybook/components/Screenshot/Screenshot.module.css +28 -0
  58. package/config/storybook/components/Screenshot/index.js +10 -0
  59. package/config/storybook/components/Steps/Steps.jsx +21 -0
  60. package/config/storybook/components/Steps/Steps.module.css +43 -0
  61. package/config/storybook/components/Steps/index.js +10 -0
  62. package/config/storybook/components/StoryWrapper/StoryWrapper.jsx +18 -0
  63. package/config/storybook/components/StoryWrapper/StoryWrapper.module.css +22 -0
  64. package/config/storybook/components/StoryWrapper/index.js +10 -0
  65. package/config/storybook/components/Summary/Summary.jsx +19 -0
  66. package/config/storybook/components/Summary/Summary.module.css +20 -0
  67. package/config/storybook/components/Summary/index.js +10 -0
  68. package/config/storybook/components/Variants/Variants.js +57 -0
  69. package/config/storybook/components/Variants/docs.css +48 -0
  70. package/config/storybook/components/Variants/index.js +10 -0
  71. package/config/storybook/components/video/index.jsx +28 -0
  72. package/config/storybook/manager.js +23 -0
  73. package/config/storybook/preview.jsx +88 -0
  74. package/config/storybook/theming/fonts.css +68 -0
  75. package/config/storybook/theming/logo.svg +19 -0
  76. package/config/storybook/theming/manager.css +63 -0
  77. package/config/storybook/theming/preview.css +93 -0
  78. package/config/storybook/theming/theme.js +61 -0
  79. package/config/tsconfig-base.json +16 -0
  80. package/config/tsconfig-preact.json +15 -0
  81. package/config/vite.mjs +306 -0
  82. package/package.json +113 -0
  83. package/post-release.sh +5 -0
  84. package/src/components/Accordion/Accordion.css +88 -0
  85. package/src/components/Accordion/Accordion.stories.tsx +582 -0
  86. package/src/components/Accordion/Accordion.tsx +177 -0
  87. package/src/components/Accordion/index.ts +11 -0
  88. package/src/components/ActionButton/ActionButton.css +100 -0
  89. package/src/components/ActionButton/ActionButton.stories.tsx +169 -0
  90. package/src/components/ActionButton/ActionButton.tsx +53 -0
  91. package/src/components/ActionButton/index.ts +10 -0
  92. package/src/components/ActionButtonGroup/ActionButtonGroup.css +77 -0
  93. package/src/components/ActionButtonGroup/ActionButtonGroup.stories.tsx +97 -0
  94. package/src/components/ActionButtonGroup/ActionButtonGroup.tsx +91 -0
  95. package/src/components/ActionButtonGroup/index.ts +10 -0
  96. package/src/components/AlertBanner/AlertBanner.css +144 -0
  97. package/src/components/AlertBanner/AlertBanner.stories.tsx +165 -0
  98. package/src/components/AlertBanner/AlertBanner.tsx +90 -0
  99. package/src/components/AlertBanner/index.ts +11 -0
  100. package/src/components/Breadcrumbs/Breadcrumbs.css +60 -0
  101. package/src/components/Breadcrumbs/Breadcrumbs.stories.tsx +195 -0
  102. package/src/components/Breadcrumbs/Breadcrumbs.tsx +71 -0
  103. package/src/components/Breadcrumbs/index.ts +11 -0
  104. package/src/components/Button/Button.css +213 -0
  105. package/src/components/Button/Button.mdx +133 -0
  106. package/src/components/Button/Button.stories.tsx +398 -0
  107. package/src/components/Button/Button.tsx +121 -0
  108. package/src/components/Button/index.ts +11 -0
  109. package/src/components/Card/Card.css +34 -0
  110. package/src/components/Card/Card.stories.tsx +76 -0
  111. package/src/components/Card/Card.tsx +34 -0
  112. package/src/components/Card/index.ts +10 -0
  113. package/src/components/CartItem/CartItem.css +509 -0
  114. package/src/components/CartItem/CartItem.stories.tsx +628 -0
  115. package/src/components/CartItem/CartItem.tsx +467 -0
  116. package/src/components/CartItem/CartItemSkeleton.tsx +38 -0
  117. package/src/components/CartItem/index.ts +12 -0
  118. package/src/components/CartList/CartList.css +35 -0
  119. package/src/components/CartList/CartList.stories.tsx +111 -0
  120. package/src/components/CartList/CartList.tsx +40 -0
  121. package/src/components/CartList/index.ts +11 -0
  122. package/src/components/Checkbox/Checkbox.css +255 -0
  123. package/src/components/Checkbox/Checkbox.stories.tsx +290 -0
  124. package/src/components/Checkbox/Checkbox.tsx +138 -0
  125. package/src/components/Checkbox/index.ts +10 -0
  126. package/src/components/ColorSwatch/ColorSwatch.css +132 -0
  127. package/src/components/ColorSwatch/ColorSwatch.stories.tsx +274 -0
  128. package/src/components/ColorSwatch/ColorSwatch.tsx +127 -0
  129. package/src/components/ColorSwatch/index.ts +11 -0
  130. package/src/components/ContentGrid/ContentGrid.css +54 -0
  131. package/src/components/ContentGrid/ContentGrid.stories.tsx +137 -0
  132. package/src/components/ContentGrid/ContentGrid.tsx +57 -0
  133. package/src/components/ContentGrid/index.ts +11 -0
  134. package/src/components/Divider/Divider.css +22 -0
  135. package/src/components/Divider/Divider.stories.tsx +62 -0
  136. package/src/components/Divider/Divider.tsx +33 -0
  137. package/src/components/Divider/index.ts +11 -0
  138. package/src/components/Field/Field.css +83 -0
  139. package/src/components/Field/Field.stories.tsx +238 -0
  140. package/src/components/Field/Field.tsx +84 -0
  141. package/src/components/Field/index.ts +10 -0
  142. package/src/components/Header/Header.css +56 -0
  143. package/src/components/Header/Header.stories.tsx +180 -0
  144. package/src/components/Header/Header.tsx +81 -0
  145. package/src/components/Header/index.ts +11 -0
  146. package/src/components/Icon/Icon.css +26 -0
  147. package/src/components/Icon/Icon.stories.helpers.jsx +21 -0
  148. package/src/components/Icon/Icon.stories.tsx +98 -0
  149. package/src/components/Icon/Icon.tsx +112 -0
  150. package/src/components/Icon/index.ts +10 -0
  151. package/src/components/IllustratedMessage/IllustratedMessage.css +61 -0
  152. package/src/components/IllustratedMessage/IllustratedMessage.stories.tsx +126 -0
  153. package/src/components/IllustratedMessage/IllustratedMessage.tsx +78 -0
  154. package/src/components/IllustratedMessage/index.ts +11 -0
  155. package/src/components/Image/Image.css +52 -0
  156. package/src/components/Image/Image.stories.tsx +89 -0
  157. package/src/components/Image/Image.tsx +66 -0
  158. package/src/components/Image/index.ts +10 -0
  159. package/src/components/ImageSwatch/ImageSwatch.css +154 -0
  160. package/src/components/ImageSwatch/ImageSwatch.stories.tsx +310 -0
  161. package/src/components/ImageSwatch/ImageSwatch.tsx +123 -0
  162. package/src/components/ImageSwatch/index.ts +11 -0
  163. package/src/components/InLineAlert/InLineAlert.css +116 -0
  164. package/src/components/InLineAlert/InLineAlert.stories.tsx +326 -0
  165. package/src/components/InLineAlert/InLineAlert.tsx +128 -0
  166. package/src/components/InLineAlert/index.ts +11 -0
  167. package/src/components/Incrementer/Incrementer.css +165 -0
  168. package/src/components/Incrementer/Incrementer.stories.tsx +172 -0
  169. package/src/components/Incrementer/Incrementer.tsx +192 -0
  170. package/src/components/Incrementer/index.ts +10 -0
  171. package/src/components/Input/Input.css +304 -0
  172. package/src/components/Input/Input.stories.tsx +155 -0
  173. package/src/components/Input/Input.tsx +166 -0
  174. package/src/components/Input/index.ts +11 -0
  175. package/src/components/InputDate/InputDate.css +56 -0
  176. package/src/components/InputDate/InputDate.stories.tsx +117 -0
  177. package/src/components/InputDate/InputDate.tsx +120 -0
  178. package/src/components/InputDate/index.ts +11 -0
  179. package/src/components/InputPassword/InputPassword.css +31 -0
  180. package/src/components/InputPassword/InputPassword.stories.tsx +148 -0
  181. package/src/components/InputPassword/InputPassword.tsx +135 -0
  182. package/src/components/InputPassword/PasswordStatusIndicator/PasswordStatusIndicator.css +31 -0
  183. package/src/components/InputPassword/PasswordStatusIndicator/PasswordStatusIndicator.tsx +96 -0
  184. package/src/components/InputPassword/PasswordStatusIndicator/index.ts +11 -0
  185. package/src/components/InputPassword/index.ts +11 -0
  186. package/src/components/Modal/Modal.css +125 -0
  187. package/src/components/Modal/Modal.stories.tsx +250 -0
  188. package/src/components/Modal/Modal.tsx +157 -0
  189. package/src/components/Modal/index.ts +10 -0
  190. package/src/components/Pagination/Pagination.css +95 -0
  191. package/src/components/Pagination/Pagination.stories.tsx +117 -0
  192. package/src/components/Pagination/Pagination.tsx +149 -0
  193. package/src/components/Pagination/index.ts +11 -0
  194. package/src/components/Picker/Picker.css +220 -0
  195. package/src/components/Picker/Picker.stories.tsx +318 -0
  196. package/src/components/Picker/Picker.tsx +203 -0
  197. package/src/components/Picker/index.ts +10 -0
  198. package/src/components/Price/Price.css +57 -0
  199. package/src/components/Price/Price.stories.tsx +110 -0
  200. package/src/components/Price/Price.tsx +75 -0
  201. package/src/components/Price/index.ts +10 -0
  202. package/src/components/PriceRange/PriceRange.css +66 -0
  203. package/src/components/PriceRange/PriceRange.stories.tsx +240 -0
  204. package/src/components/PriceRange/PriceRange.tsx +248 -0
  205. package/src/components/PriceRange/index.ts +11 -0
  206. package/src/components/ProgressSpinner/ProgressSpinner.css +91 -0
  207. package/src/components/ProgressSpinner/ProgressSpinner.stories.tsx +300 -0
  208. package/src/components/ProgressSpinner/ProgressSpinner.tsx +86 -0
  209. package/src/components/ProgressSpinner/index.ts +11 -0
  210. package/src/components/RadioButton/RadioButton.css +134 -0
  211. package/src/components/RadioButton/RadioButton.stories.tsx +126 -0
  212. package/src/components/RadioButton/RadioButton.tsx +86 -0
  213. package/src/components/RadioButton/index.ts +11 -0
  214. package/src/components/Skeleton/Skeleton.css +145 -0
  215. package/src/components/Skeleton/Skeleton.stories.tsx +265 -0
  216. package/src/components/Skeleton/Skeleton.tsx +133 -0
  217. package/src/components/Skeleton/index.ts +10 -0
  218. package/src/components/Tag/Tag.css +26 -0
  219. package/src/components/Tag/Tag.stories.tsx +103 -0
  220. package/src/components/Tag/Tag.tsx +38 -0
  221. package/src/components/Tag/index.ts +11 -0
  222. package/src/components/TextArea/TextArea.css +140 -0
  223. package/src/components/TextArea/TextArea.stories.tsx +130 -0
  224. package/src/components/TextArea/TextArea.tsx +89 -0
  225. package/src/components/TextArea/index.ts +11 -0
  226. package/src/components/TextSwatch/TextSwatch.css +152 -0
  227. package/src/components/TextSwatch/TextSwatch.stories.tsx +277 -0
  228. package/src/components/TextSwatch/TextSwatch.tsx +131 -0
  229. package/src/components/TextSwatch/index.ts +11 -0
  230. package/src/components/ToggleButton/ToggleButton.css +95 -0
  231. package/src/components/ToggleButton/ToggleButton.stories.tsx +190 -0
  232. package/src/components/ToggleButton/ToggleButton.tsx +75 -0
  233. package/src/components/ToggleButton/index.ts +11 -0
  234. package/src/components/UIProvider/UIProvider.css +140 -0
  235. package/src/components/UIProvider/UIProvider.tsx +61 -0
  236. package/src/components/UIProvider/debugger.css +47 -0
  237. package/src/components/UIProvider/index.ts +10 -0
  238. package/src/components/UIProvider/normalize.css +26 -0
  239. package/src/components/index.ts +49 -0
  240. package/src/docs/API/event-bus.mdx +52 -0
  241. package/src/docs/API/graphql.mdx +214 -0
  242. package/src/docs/API/initializer.mdx +119 -0
  243. package/src/docs/API/render.mdx +125 -0
  244. package/src/docs/Design/colors.mdx +202 -0
  245. package/src/docs/Design/designBlocks.jsx +87 -0
  246. package/src/docs/Design/getTokenData.ts +28 -0
  247. package/src/docs/Design/grid.mdx +365 -0
  248. package/src/docs/Design/overview.mdx +69 -0
  249. package/src/docs/Design/shapes.mdx +100 -0
  250. package/src/docs/Design/spacing.mdx +22 -0
  251. package/src/docs/Design/typography.mdx +126 -0
  252. package/src/docs/Utilities/classList.mdx +52 -0
  253. package/src/docs/Utilities/debounce.mdx +49 -0
  254. package/src/docs/Utilities/deepmerge.mdx +12 -0
  255. package/src/docs/Utilities/getFormErrors.mdx +41 -0
  256. package/src/docs/Utilities/getFormValues.mdx +38 -0
  257. package/src/docs/assets/Banner.png +0 -0
  258. package/src/docs/assets/Colors.png +0 -0
  259. package/src/docs/assets/DropinBanner.png +0 -0
  260. package/src/docs/assets/ShapeStyles.png +0 -0
  261. package/src/docs/assets/Spacing.png +0 -0
  262. package/src/docs/assets/Typography.png +0 -0
  263. package/src/docs/cli-usage.mdx +181 -0
  264. package/src/docs/components/overview.mdx +124 -0
  265. package/src/docs/quick-start.mdx +245 -0
  266. package/src/docs/slots.mdx +211 -0
  267. package/src/docs/welcome.mdx +52 -0
  268. package/src/i18n/en_US.json +146 -0
  269. package/src/i18n/index.ts +26 -0
  270. package/src/icons/Add.svg +9 -0
  271. package/src/icons/AddressBook.svg +3 -0
  272. package/src/icons/Bulk.svg +24 -0
  273. package/src/icons/Burger.svg +5 -0
  274. package/src/icons/Card.svg +7 -0
  275. package/src/icons/Cart.svg +11 -0
  276. package/src/icons/Check.svg +8 -0
  277. package/src/icons/CheckWithCircle.svg +4 -0
  278. package/src/icons/ChevronDown.svg +3 -0
  279. package/src/icons/ChevronRight.svg +8 -0
  280. package/src/icons/ChevronUp.svg +3 -0
  281. package/src/icons/Close.svg +4 -0
  282. package/src/icons/Coupon.svg +3 -0
  283. package/src/icons/Date.svg +4 -0
  284. package/src/icons/Delivery.svg +11 -0
  285. package/src/icons/EmptyBox.svg +3 -0
  286. package/src/icons/Eye.svg +3 -0
  287. package/src/icons/EyeClose.svg +3 -0
  288. package/src/icons/Gift.svg +3 -0
  289. package/src/icons/GiftCard.svg +3 -0
  290. package/src/icons/Heart.svg +3 -0
  291. package/src/icons/HeartFilled.svg +3 -0
  292. package/src/icons/InfoFilled.svg +3 -0
  293. package/src/icons/Locker.svg +11 -0
  294. package/src/icons/Minus.svg +3 -0
  295. package/src/icons/Order.svg +6 -0
  296. package/src/icons/OrderError.svg +15 -0
  297. package/src/icons/OrderSuccess.svg +15 -0
  298. package/src/icons/PaymentError.svg +16 -0
  299. package/src/icons/Placeholder.svg +3 -0
  300. package/src/icons/PlaceholderFilled.svg +4 -0
  301. package/src/icons/Search.svg +9 -0
  302. package/src/icons/SearchFilled.svg +10 -0
  303. package/src/icons/Sort.svg +12 -0
  304. package/src/icons/Star.svg +8 -0
  305. package/src/icons/Trash.svg +7 -0
  306. package/src/icons/User.svg +5 -0
  307. package/src/icons/View.svg +14 -0
  308. package/src/icons/Wallet.svg +6 -0
  309. package/src/icons/Warning.svg +12 -0
  310. package/src/icons/WarningFilled.svg +3 -0
  311. package/src/icons/WarningWithCircle.svg +4 -0
  312. package/src/icons/index.ts +42 -0
  313. package/src/lib/classes.ts +34 -0
  314. package/src/lib/config.ts +24 -0
  315. package/src/lib/debounce.ts +16 -0
  316. package/src/lib/deepmerge.ts +45 -0
  317. package/src/lib/deviceUtils.ts +16 -0
  318. package/src/lib/form-values.ts +31 -0
  319. package/src/lib/i18n.ts +18 -0
  320. package/src/lib/image-params-keymap.ts +36 -0
  321. package/src/lib/index.ts +24 -0
  322. package/src/lib/initializer.ts +134 -0
  323. package/src/lib/is-number.ts +12 -0
  324. package/src/lib/render.tsx +138 -0
  325. package/src/lib/resolve-image.ts +101 -0
  326. package/src/lib/signals.ts +11 -0
  327. package/src/lib/slot.tsx +434 -0
  328. package/src/lib/tests.tsx +47 -0
  329. package/src/lib/types.ts +16 -0
  330. package/src/lib/vcomponent.tsx +42 -0
  331. package/static/assets/images/Card.png +0 -0
  332. package/static/assets/images/example.jpg +0 -0
  333. package/static/assets/images/index.ts +11 -0
  334. package/static/dropin.png +0 -0
  335. package/static/favicon.svg +14 -0
  336. package/storybook-stories.js +21 -0
  337. package/tests/__mocks__/browserMocks.ts +28 -0
  338. package/tests/__mocks__/fileMocks.ts +12 -0
  339. package/tests/__mocks__/styleMock.ts +0 -0
  340. package/types/icons.d.ts +18 -0
@@ -0,0 +1,54 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ /* https://cssguidelin.es/#bem-like-naming */
11
+
12
+ .dropin-content-grid {
13
+ container-type: inline-size;
14
+ container-name: dropin-content-grid;
15
+ max-width: inherit;
16
+ overflow: scroll;
17
+ }
18
+
19
+ /* Container for the cart summary grid */
20
+ .dropin-content-grid__content {
21
+ display: grid;
22
+ gap: var(--spacing-small);
23
+ margin: auto;
24
+ justify-items: center;
25
+ }
26
+
27
+ .dropin-content-grid__dynamic-columns-content {
28
+ display: flex;
29
+ flex-wrap: wrap;
30
+ }
31
+
32
+ /* Empty grid message */
33
+ .dropin-content-grid__content--empty {
34
+ grid-template-columns: repeat(1, 1fr);
35
+ }
36
+
37
+ /* Container rules */
38
+ @container dropin-content-grid (width < 360) {
39
+ .dropin-content-grid__content {
40
+ grid-template-columns: repeat(4, 1fr);
41
+ gap: var(--spacing-xsmall);
42
+ }
43
+ }
44
+ /* Medium (portrait tablets and large phones, 768px and up) */
45
+ /* @media only screen and (min-width: 768px) { } */
46
+
47
+ /* Large (landscape tablets, 1024px and up) */
48
+ /* @media only screen and (min-width: 1024px) { } */
49
+
50
+ /* XLarge (laptops/desktops, 1366px and up) */
51
+ /* @media only screen and (min-width: 1366px) { } */
52
+
53
+ /* XXlarge (large laptops and desktops, 1920px and up) */
54
+ /* @media only screen and (min-width: 1920px) { } */
@@ -0,0 +1,137 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ // https://storybook.js.org/docs/7.0/preact/writing-stories/introduction
11
+ import type { Meta, StoryObj } from '@storybook/preact';
12
+ import {
13
+ ContentGrid as component,
14
+ ContentGridProps,
15
+ } from '@adobe-commerce/elsie/components/ContentGrid/index';
16
+
17
+ /**
18
+ * Used to display a grid of content, such as products or images, with a maximum number of columns.
19
+ */
20
+ const meta: Meta<ContentGridProps> = {
21
+ title: 'Components/ContentGrid',
22
+ component,
23
+ argTypes: {
24
+ emptyGridContent: {
25
+ description: 'The content to display when the grid is empty.',
26
+ control: false,
27
+ },
28
+ children: {
29
+ description:
30
+ 'The content to display in the grid. Each child will be displayed in a grid cell.',
31
+ control: false,
32
+ },
33
+ maxColumns: {
34
+ description:
35
+ 'The maximum number of columns to display in the grid. If this is not set, this component will act like a flex container that wraps its children.',
36
+ control: {
37
+ type: 'number',
38
+ },
39
+ columnWidth: {
40
+ description:
41
+ 'The width of each column in the grid. This is a CSS value, such as `1fr` or `100px`.',
42
+ control: {
43
+ type: 'text',
44
+ },
45
+ },
46
+ },
47
+ },
48
+ parameters: {
49
+ layout: 'fullscreen',
50
+ },
51
+ };
52
+
53
+ export default meta;
54
+
55
+ type Story = StoryObj<ContentGridProps>;
56
+
57
+ const defaultProps: ContentGridProps = {
58
+ emptyGridContent: <div data-testid="empty-grid-content">Empty Grid</div>,
59
+ maxColumns: 6,
60
+ columnWidth: '1fr',
61
+ };
62
+
63
+ // Sample products to display in the grid
64
+ const generateSampleContent = (count: number) => {
65
+ return Array.from({ length: count }).map((_, index) => (
66
+ <div
67
+ style={{
68
+ width: '100px',
69
+ height: '100px',
70
+ border: '1px solid black',
71
+ display: 'grid',
72
+ placeItems: 'center',
73
+ }}
74
+ key={index}
75
+ >
76
+ Product {index + 1}
77
+ </div>
78
+ ));
79
+ };
80
+
81
+ /**
82
+ * ```tsx
83
+ * <ContentGrid emptyGridContent={<div>Empty Grid</div>} />
84
+ * ```
85
+ */
86
+ export const EmptyGrid: Story = {
87
+ args: {
88
+ ...defaultProps,
89
+ },
90
+ };
91
+
92
+ /**
93
+ * ```tsx
94
+ * <ContentGrid emptyGridContent={<div>Empty Grid</div>} />
95
+ * <div>Product 1</div>,
96
+ * <div>Product 2</div>,
97
+ * //...
98
+ * <div>Product 29</div>
99
+ * <div>Product 30</div>
100
+ * </ContentGrid>
101
+ * ```
102
+ */
103
+ export const WithContent: Story = {
104
+ args: {
105
+ ...defaultProps,
106
+ children: generateSampleContent(30),
107
+ maxColumns: 6,
108
+ columnWidth: '1fr',
109
+ },
110
+ };
111
+
112
+ export const InsideContainer: Story = {
113
+ args: {
114
+ ...defaultProps,
115
+ children: <>{generateSampleContent(12)}</>,
116
+ maxColumns: 6,
117
+ columnWidth: '1fr',
118
+ },
119
+ parameters: {
120
+ layout: 'centered',
121
+ },
122
+ decorators: [
123
+ (story) => {
124
+ return (
125
+ <div
126
+ style={{
127
+ width: '50vw',
128
+ maxWidth: '800px',
129
+ maxHeight: '100vh',
130
+ }}
131
+ >
132
+ {story()}
133
+ </div>
134
+ );
135
+ },
136
+ ],
137
+ };
@@ -0,0 +1,57 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ import { FunctionComponent, VNode } from 'preact';
11
+ import { HTMLAttributes } from 'preact/compat';
12
+ import { classes } from '@adobe-commerce/elsie/lib';
13
+ import '@adobe-commerce/elsie/components/ContentGrid/ContentGrid.css';
14
+
15
+ export interface ContentGridProps extends HTMLAttributes<HTMLDivElement> {
16
+ emptyGridContent: VNode;
17
+ maxColumns?: number;
18
+ columnWidth?: string;
19
+ }
20
+
21
+ export const ContentGrid: FunctionComponent<ContentGridProps> = ({
22
+ className,
23
+ children,
24
+ maxColumns,
25
+ columnWidth = '1fr',
26
+ emptyGridContent,
27
+ ...props
28
+ }) => {
29
+ const hasChildren =
30
+ !!children && (Array.isArray(children) ? children.length > 0 : true);
31
+
32
+ const additionalStyles = hasChildren
33
+ ? {
34
+ gridTemplateColumns: `repeat(${maxColumns}, ${columnWidth})`,
35
+ }
36
+ : undefined;
37
+
38
+ return (
39
+ <div
40
+ {...props}
41
+ className={classes(['dropin-content-grid', className])}
42
+ tabindex={0}
43
+ >
44
+ <div
45
+ data-testid="content-grid-content"
46
+ className={classes([
47
+ 'dropin-content-grid__content',
48
+ ['dropin-content-grid__dynamic-columns-content', !maxColumns],
49
+ ['dropin-content-grid__content--empty', !hasChildren],
50
+ ])}
51
+ style={additionalStyles}
52
+ >
53
+ {hasChildren ? children : emptyGridContent}
54
+ </div>
55
+ </div>
56
+ );
57
+ };
@@ -0,0 +1,11 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ export * from '@adobe-commerce/elsie/components/ContentGrid/ContentGrid';
11
+ export { ContentGrid as default } from '@adobe-commerce/elsie/components/ContentGrid/ContentGrid';
@@ -0,0 +1,22 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ .dropin-divider {
11
+ border: none;
12
+ }
13
+
14
+ .dropin-divider--primary {
15
+ border-top: var(--shape-border-width-3) solid var(--color-neutral-400);
16
+ margin: var(--spacing-xbig) auto;
17
+ }
18
+
19
+ .dropin-divider--secondary {
20
+ border-top: var(--shape-border-width-2) solid var(--color-neutral-400);
21
+ margin: var(--spacing-medium) auto;
22
+ }
@@ -0,0 +1,62 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ import type { Meta, StoryObj } from '@storybook/preact';
11
+ import { Divider, DividerProps } from '@adobe-commerce/elsie/components/Divider';
12
+ import { expect, within } from '@storybook/test';
13
+
14
+ /**
15
+ * Use Dividers to separate and group content or build rhythm and structure.
16
+ */
17
+ const meta: Meta<DividerProps> = {
18
+ title: 'Components/Divider',
19
+ component: Divider,
20
+ argTypes: {
21
+ variant: {
22
+ description: 'Divider variant: `primary` or `secondary`',
23
+ defaultValue: { summary: 'primary' },
24
+ options: ['primary', 'secondary'],
25
+ control: { type: 'radio' },
26
+ },
27
+ },
28
+ };
29
+
30
+ export default meta;
31
+
32
+ type Story = StoryObj<DividerProps>;
33
+
34
+ export const Primary: Story = {
35
+ args: {
36
+ variant: 'primary',
37
+ },
38
+ render: ({ variant }) => (
39
+ <div style="width: 400px">
40
+ <Divider variant={variant} />
41
+ </div>
42
+ ),
43
+ play: async ({ canvasElement }) => {
44
+ const canvas = within(canvasElement);
45
+ await expect(await canvas.findByRole('separator')).toBeVisible();
46
+ },
47
+ };
48
+
49
+ export const Secondary: Story = {
50
+ args: {
51
+ variant: 'secondary',
52
+ },
53
+ render: ({ variant }) => (
54
+ <div style="width: 400px">
55
+ <Divider variant={variant} />
56
+ </div>
57
+ ),
58
+ play: async ({ canvasElement }) => {
59
+ const canvas = within(canvasElement);
60
+ await expect(await canvas.findByRole('separator')).toBeVisible();
61
+ },
62
+ };
@@ -0,0 +1,33 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ import { FunctionComponent } from 'preact';
11
+ import { HTMLAttributes } from 'preact/compat';
12
+ import { classes } from '@adobe-commerce/elsie/lib';
13
+ import '@adobe-commerce/elsie/components/Divider/Divider.css';
14
+
15
+ export interface DividerProps extends HTMLAttributes<HTMLHRElement> {
16
+ variant?: 'primary' | 'secondary';
17
+ }
18
+
19
+ export const Divider: FunctionComponent<DividerProps> = ({
20
+ variant = 'primary',
21
+ className,
22
+ }) => {
23
+ return (
24
+ <hr
25
+ role="separator"
26
+ className={classes([
27
+ 'dropin-divider',
28
+ `dropin-divider--${variant}`,
29
+ className,
30
+ ])}
31
+ />
32
+ );
33
+ };
@@ -0,0 +1,11 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ export * from '@adobe-commerce/elsie/components/Divider/Divider';
11
+ export { Divider as default } from '@adobe-commerce/elsie/components/Divider/Divider';
@@ -0,0 +1,83 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ /* https://cssguidelin.es/#bem-like-naming */
11
+ .dropin-field {
12
+ display: grid;
13
+ font: var(--type-body-2-strong-font);
14
+ grid-auto-rows: max-content;
15
+ }
16
+
17
+ .dropin-field__label--medium {
18
+ font: var(--type-details-caption-1-font);
19
+ letter-spacing: var(--type-details-caption-1-letter-spacing);
20
+ color: var(--color-neutral-800);
21
+ text-align: left;
22
+ padding-bottom: var(--spacing-xsmall);
23
+ }
24
+
25
+ .dropin-field__label--large {
26
+ font: var(--type-body-2-strong-font);
27
+ letter-spacing: var(--type-body-2-strong-letter-spacing);
28
+ color: var(--color-neutral-800);
29
+ text-align: left;
30
+ padding-bottom: var(--spacing-xsmall);
31
+ }
32
+
33
+ .dropin-field__label--disabled {
34
+ color: var(--color-neutral-500);
35
+ }
36
+
37
+ .dropin-field__content {
38
+ display: grid;
39
+ grid-auto-rows: max-content;
40
+ }
41
+
42
+ .dropin-field__hint {
43
+ font: var(--type-details-caption-2-font);
44
+ letter-spacing: var(--type-details-caption-2-letter-spacing);
45
+ color: var(--color-neutral-700);
46
+ text-align: left;
47
+ }
48
+
49
+ .dropin-field__hint:empty {
50
+ display: none;
51
+ }
52
+
53
+ .dropin-field__hint--medium {
54
+ padding-top: var(--spacing-xsmall);
55
+ }
56
+
57
+ .dropin-field__hint--large {
58
+ padding-top: var(--spacing-small);
59
+ }
60
+
61
+ .dropin-field__hint--error {
62
+ color: var(--color-alert-800);
63
+ }
64
+
65
+ .dropin-field__hint--success {
66
+ color: var(--color-positive-800);
67
+ }
68
+
69
+ .dropin-field__hint--disabled {
70
+ color: var(--color-neutral-500);
71
+ }
72
+
73
+ /* Medium (portrait tablets and large phones, 768px and up) */
74
+ /* @media only screen and (min-width: 768px) { } */
75
+
76
+ /* Large (landscape tablets, 1024px and up) */
77
+ /* @media only screen and (min-width: 1024px) { } */
78
+
79
+ /* XLarge (laptops/desktops, 1366px and up) */
80
+ /* @media only screen and (min-width: 1366px) { } */
81
+
82
+ /* XXlarge (large laptops and desktops, 1920px and up) */
83
+ /* @media only screen and (min-width: 1920px) { } */