@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,45 @@
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
+ const path = require('path');
11
+ const fs = require('fs');
12
+ const m = require('./log-message');
13
+
14
+ module.exports = function writeParentIndex(
15
+ filePath,
16
+ { pathname, importAliasRoot = '.' }
17
+ ) {
18
+ const relativePath = path.relative('.', filePath);
19
+
20
+ const existing = fs.existsSync(filePath);
21
+
22
+ const file = fs.openSync(filePath, 'a+');
23
+
24
+ const line = `export * from '${importAliasRoot}/${pathname}';`;
25
+
26
+ const content = fs.readFileSync(file);
27
+
28
+ if (content.includes(line)) {
29
+ console.log(m(`\x1b[33m${relativePath} \x1b[0mis up to date`, 'success'));
30
+ return;
31
+ }
32
+
33
+ const isLastNewLine =
34
+ content.toString().length === 0 || /[\n]$/.test(content.toString());
35
+
36
+ fs.appendFileSync(file, isLastNewLine ? `${line}\n` : `\n${line}\n`);
37
+
38
+ if (existing) {
39
+ console.log(m(`\x1b[33m${relativePath} \x1b[0mupdated`, 'updated'));
40
+ } else {
41
+ console.log(m(`\x1b[33m${relativePath} \x1b[0mcreated`, 'created'));
42
+ }
43
+
44
+ fs.closeSync(file);
45
+ };
@@ -0,0 +1,113 @@
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
+ module.exports = {
11
+ env: {
12
+ browser: true,
13
+ "jest": true,
14
+ },
15
+ plugins: ['@typescript-eslint'],
16
+ extends: [
17
+ 'preact',
18
+ 'prettier',
19
+ 'plugin:storybook/recommended',
20
+ 'plugin:mdx/recommended',
21
+ ],
22
+ parser: '@typescript-eslint/parser',
23
+ parserOptions: {
24
+ ecmaFeatures: {
25
+ jsx: true,
26
+ },
27
+ ecmaVersion: 12,
28
+ sourceType: 'module',
29
+ },
30
+ settings: {
31
+ 'mdx/code-blocks': true,
32
+ },
33
+ rules: {
34
+ '@typescript-eslint/no-unused-vars': [
35
+ 'error',
36
+ {
37
+ argsIgnorePattern: '^_|^children$',
38
+ },
39
+ ],
40
+ },
41
+ overrides: [
42
+ {
43
+ files: ['*.mdx', '*.md'],
44
+ extends: ['plugin:mdx/overrides'],
45
+ rules: {
46
+ 'react/self-closing-comp': 'off',
47
+ },
48
+ },
49
+ {
50
+ files: ['./src/**/*'],
51
+ rules: {
52
+ 'no-restricted-imports': [
53
+ 'error',
54
+ {
55
+ patterns: [
56
+ {
57
+ group: ['@adobe-commerce/elsie/src/*'],
58
+ message:
59
+ 'Please import from "@adobe-commerce/elsie" instead of "@adobe-commerce/elsie/src/*".',
60
+ },
61
+ {
62
+ group: ['@adobe-commerce/elsie/components/*'],
63
+ message:
64
+ 'Please use "@adobe-commerce/elsie/components" instead. Otherwise, the component will not be externalized and be included in your bundle instead.',
65
+ },
66
+ {
67
+ group: ['preact-i18n'],
68
+ message: 'Please use "@adobe-commerce/elsie/i18n" instead of "preact-i18n".',
69
+ },
70
+ ],
71
+ },
72
+ ],
73
+ },
74
+ },
75
+ {
76
+ files: ['./src/**/*'],
77
+ excludedFiles: ['./src/api/fetch-graphql/fetch-graphql.*'],
78
+ rules: {
79
+ 'no-restricted-imports': [
80
+ 'error',
81
+ {
82
+ patterns: [
83
+ {
84
+ group: ['@adobe-commerce/fetch-graphql'],
85
+ message:
86
+ 'Please use your project instance of fetch-graphql "@/<project>/api" instead of "@adobe-commerce/fetch-graphql".',
87
+ },
88
+ ],
89
+ },
90
+ ],
91
+ },
92
+ },
93
+ {
94
+ files: ['./src/**/*'],
95
+ excludedFiles: ['@preact/signals'],
96
+ rules: {
97
+ 'no-restricted-imports': [
98
+ 'error',
99
+ {
100
+ patterns: [
101
+ {
102
+ group: ['@preact/signals'],
103
+ message:
104
+ 'Please use "@adobe-commerce/elsie/lib/signals" instead of "@preact/signals".',
105
+ },
106
+ ],
107
+ },
108
+ ],
109
+ },
110
+ },
111
+ ],
112
+ ignorePatterns: ['node_modules/', 'dist/', 'src/__generated__/'],
113
+ };
package/config/jest.js ADDED
@@ -0,0 +1,90 @@
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
+ const path = require('path');
11
+
12
+ const { compilerOptions } = require(path.resolve(
13
+ process.cwd(),
14
+ 'tsconfig.json'
15
+ ));
16
+
17
+ const paths = { ...compilerOptions.paths };
18
+
19
+ module.exports = {
20
+ preset: 'jest-preset-preact',
21
+
22
+ prettierPath: null,
23
+
24
+ setupFiles: [
25
+ path.resolve(__dirname, '../tests/__mocks__/browserMocks.ts'),
26
+ path.resolve(__dirname, './setEnvVars.js'),
27
+ ],
28
+
29
+ collectCoverage: true,
30
+
31
+ collectCoverageFrom: [
32
+ './bin/**/*.{js,jsx,ts,tsx}',
33
+ './src/**/*.{js,jsx,ts,tsx}',
34
+ '!./src/**/*.stories.{js,jsx,ts,tsx}',
35
+ '!./src/**/*.stories.helpers.{js,jsx,ts,tsx}',
36
+ ],
37
+
38
+ moduleNameMapper: {
39
+ '\\.(css|less|scss|sass)$': 'identity-obj-proxy',
40
+ '\\.svg': '@adobe-commerce/elsie/__mocks__/svg.js',
41
+ '^@adobe-commerce/elsie/(.*)$': path.resolve(__dirname, '../src/$1'),
42
+
43
+ // generated mocks.ts uses relative path to types.ts
44
+ '^\\.{2}/types$': '<rootDir>/src/__generated__/types.ts',
45
+
46
+ // Map project's tsconfig.json paths
47
+ ...Object.entries(paths).reduce((acc, [key, value]) => {
48
+ const alias = key.replace(/\*$/, '');
49
+ const valueWithoutStar = value[0].replace(/\*$/, '');
50
+ const resolved = path.resolve(valueWithoutStar);
51
+ return { ...acc, [`^${alias}(.*)$`]: `${resolved}/$1` };
52
+ }, {}),
53
+ },
54
+
55
+ coverageThreshold: {
56
+ global: {
57
+ branches: 100,
58
+ functions: 100,
59
+ lines: 100,
60
+ statements: 100,
61
+ },
62
+ },
63
+
64
+ transform: {
65
+ '\\.[jt]sx?$': [
66
+ 'babel-jest',
67
+ {
68
+ presets: [
69
+ [
70
+ '@babel/preset-env',
71
+ {
72
+ targets: {
73
+ esmodules: true,
74
+ },
75
+ },
76
+ ],
77
+ ['@babel/preset-typescript', { jsxPragma: 'h' }],
78
+ ],
79
+ plugins: [
80
+ ['babel-plugin-tsconfig-paths'],
81
+ ['@babel/transform-react-jsx', { runtime: 'automatic' }],
82
+ ],
83
+ },
84
+ ],
85
+ },
86
+
87
+ transformIgnorePatterns: [
88
+ '/node_modules/(?!(@adobe-commerce/elsie|@adobe-commerce/fetch-graphql|@adobe-commerce/event-bus|@adobe-commerce/recaptcha)/)',
89
+ ],
90
+ };
@@ -0,0 +1,16 @@
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
+ module.exports = {
11
+ tabWidth: 2,
12
+ useTabs: false,
13
+ singleQuote: true,
14
+ trailingComma: 'es5',
15
+ semi: true,
16
+ };
@@ -0,0 +1,14 @@
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
+ // Used in the Price component to avoid using the system locale in tests, which can be different between computers
11
+ process.env.LOCALE = "en-US";
12
+
13
+ // Used mainly for the elsie generator to avoid issues with the system locale in tests
14
+ process.env.LANG = "en_US.UTF-8";
@@ -0,0 +1,130 @@
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
+ const path = require('path');
11
+
12
+ module.exports = {
13
+ managerWebpack: async (config) => {
14
+ return config;
15
+ },
16
+
17
+ managerBabel: async (config) => {
18
+ return config;
19
+ },
20
+
21
+ webpackFinal: async (config) => {
22
+ // Development Server
23
+ config.devServer = {
24
+ ...config.devServer,
25
+ headers: {
26
+ ...config.devServer?.headers,
27
+ 'Access-Control-Allow-Origin': '*',
28
+ 'Access-Control-Allow-Methods':
29
+ 'GET, POST, PUT, DELETE, PATCH, OPTIONS',
30
+ 'Access-Control-Allow-Headers':
31
+ 'X-Requested-With, content-type, Authorization',
32
+ },
33
+ };
34
+
35
+ // this modifies the existing image rule to exclude .svg files
36
+ // since we want to handle those files with @svgr/webpack
37
+ const imageRule = config.module.rules.find((rule) =>
38
+ rule.test.test('.svg')
39
+ );
40
+
41
+ imageRule.exclude = /\.svg$/;
42
+
43
+ // configure .svg files to be loaded with @svgr/webpack fo ts/tsx files
44
+ config.module.rules.push({
45
+ test: /\.svg$/,
46
+ issuer: /\.tsx?$/,
47
+ loader: '@svgr/webpack',
48
+ options: {
49
+ svgoConfig: {
50
+ plugins: [
51
+ {
52
+ name: 'prefixIds',
53
+ params: {
54
+ prefixIds: false,
55
+ prefixClassNames: false,
56
+ },
57
+ },
58
+ ],
59
+ },
60
+ },
61
+ });
62
+
63
+ // configure .svg files to be loaded as static files for mdx files
64
+ config.module.rules.push({
65
+ test: /\.svg$/,
66
+ issuer: /\.mdx$/,
67
+ type: 'asset/resource',
68
+ generator: { filename: 'static/media/[path][name][ext]' },
69
+ });
70
+
71
+ // Modify the Babel configuration to include a rule for node_modules files
72
+ // that are not transpiled by default
73
+ config.module.rules.push({
74
+ test: /\.(mjs|tsx?|jsx?)$/,
75
+ loader: 'babel-loader',
76
+ exclude: {
77
+ and: [/node_modules/],
78
+ not: [/@adobe-commerce/],
79
+ },
80
+ options: {
81
+ presets: [
82
+ ['@babel/preset-env'],
83
+ ['@babel/preset-typescript', { jsxPragma: 'h' }],
84
+ ],
85
+ plugins: [
86
+ ['babel-plugin-tsconfig-paths'],
87
+ ['@babel/transform-react-jsx', { runtime: 'automatic' }],
88
+ ],
89
+ },
90
+ });
91
+
92
+ // Return the altered config
93
+ return config;
94
+ },
95
+
96
+ babel: async (config) => {
97
+ config.cacheDirectory = false;
98
+
99
+ config.presets = [
100
+ ['@babel/typescript', { jsxPragma: 'h' }],
101
+ ...(config.presets || []),
102
+ ];
103
+
104
+ config.plugins = [
105
+ ['babel-plugin-tsconfig-paths'],
106
+ ...(config.plugins || []),
107
+ ];
108
+
109
+ return config;
110
+ },
111
+
112
+ previewHead: (head) => {
113
+ return head;
114
+ },
115
+
116
+ previewAnnotations: (entry = []) => {
117
+ return [...entry, path.resolve(__dirname, './preview')];
118
+ },
119
+
120
+ managerEntries: (entry = []) => {
121
+ return [...entry, path.resolve(__dirname, './manager')];
122
+ },
123
+
124
+ docs: (docsConfig, { docs: docsMode }) => ({
125
+ ...docsConfig,
126
+ docsMode,
127
+ autodocs: 'tag',
128
+ defaultName: 'Overview',
129
+ }),
130
+ };
@@ -0,0 +1,192 @@
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 { createContext, memo, useCallback, useContext, useState } from 'react';
11
+
12
+ const ctx = createContext(0);
13
+
14
+ function useIndent() {
15
+ return useContext(ctx);
16
+ }
17
+
18
+ const Tree = ({ children }) => (
19
+ <div
20
+ style={{
21
+ marginTop: '0.5rem',
22
+ userSelect: 'none',
23
+ fontSize: '14px',
24
+ color: '#333333',
25
+ }}
26
+ >
27
+ <div
28
+ style={{
29
+ display: 'inline-flex',
30
+ flexDirection: 'column',
31
+ borderRadius: '0.375rem',
32
+ border: '1px solid',
33
+ padding: '0.5rem 1rem 0.5rem .25rem',
34
+ borderColor: 'rgb(229, 231, 235)',
35
+ }}
36
+ >
37
+ {children}
38
+ </div>
39
+ </div>
40
+ );
41
+
42
+ function Indent() {
43
+ const indent = useIndent();
44
+
45
+ return (
46
+ <>
47
+ {[...Array(indent)].map((_, i) => (
48
+ <span style={{ display: 'inline-block', width: '0' }} key={i} />
49
+ ))}
50
+ </>
51
+ );
52
+ }
53
+
54
+ const Folder = memo(
55
+ ({
56
+ label,
57
+ name,
58
+ description = null,
59
+ open,
60
+ children,
61
+ defaultOpen = false,
62
+ onToggle,
63
+ }) => {
64
+ const indent = useIndent();
65
+ const [isOpen, setIsOpen] = useState(defaultOpen);
66
+
67
+ const toggle = useCallback(() => {
68
+ onToggle?.(!isOpen);
69
+ setIsOpen(!isOpen);
70
+ }, [isOpen, onToggle]);
71
+
72
+ const isFolderOpen = open === undefined ? isOpen : open;
73
+
74
+ return (
75
+ <li
76
+ style={{
77
+ display: 'flex',
78
+ listStyleType: 'none',
79
+ flexDirection: 'column',
80
+ }}
81
+ >
82
+ <a
83
+ onClick={toggle}
84
+ title={name}
85
+ style={{
86
+ display: 'inline-flex',
87
+ cursor: 'pointer',
88
+ alignItems: 'center',
89
+ padding: '0',
90
+ fontSize: '0.875rem',
91
+ color: '#333333',
92
+ textDecoration: 'none',
93
+ backgroundColor: 'transparent',
94
+ border: 'none',
95
+ outline: 'none',
96
+ transition: 'opacity 0.2s ease-in-out',
97
+ }}
98
+ >
99
+ <Indent />
100
+ <svg
101
+ width="1.5em"
102
+ height="1.5em"
103
+ viewBox="0 0 24 24"
104
+ style={{
105
+ marginLeft: '0.25rem',
106
+ marginRight: '0',
107
+ fill: 'none',
108
+ stroke: 'currentColor',
109
+ strokeLinecap: 'round',
110
+ strokeLinejoin: 'round',
111
+ strokeWidth: 1,
112
+ }}
113
+ >
114
+ <path
115
+ d={
116
+ isFolderOpen
117
+ ? 'M5 19a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h4l2 2h4a2 2 0 0 1 2 2v1M5 19h14a2 2 0 0 0 2-2v-5a2 2 0 0 0-2-2H9a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2Z'
118
+ : 'M3 7v10a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-6l-2-2H5a2 2 0 0 0-2 2Z'
119
+ }
120
+ />
121
+ </svg>
122
+ <span style={{ marginLeft: '0.25rem', fontSize: '14px' }}>
123
+ {label ?? name} {description}
124
+ </span>
125
+ </a>
126
+ {isFolderOpen && (
127
+ <ul
128
+ style={{
129
+ paddingLeft: '1.25rem',
130
+ marginTop: 'auto',
131
+ marginBottom: 'auto',
132
+ }}
133
+ >
134
+ <ctx.Provider value={indent + 1}>{children}</ctx.Provider>
135
+ </ul>
136
+ )}
137
+ </li>
138
+ );
139
+ }
140
+ );
141
+ Folder.displayName = 'Folder';
142
+
143
+ const File = memo(({ label, name, description }) => (
144
+ <li
145
+ style={{ display: 'flex', listStyleType: 'none', flexDirection: 'column' }}
146
+ >
147
+ <a
148
+ style={{
149
+ display: 'inline-flex',
150
+ cursor: 'default',
151
+ alignItems: 'center',
152
+ padding: '0 0 0 .25rem',
153
+ fontSize: '0.875rem',
154
+ color: '#333333',
155
+ textDecoration: 'none',
156
+ backgroundColor: 'transparent',
157
+ border: 'none',
158
+ outline: 'none',
159
+ }}
160
+ >
161
+ <Indent />
162
+ <svg
163
+ width="1.3em"
164
+ height="1.3em"
165
+ viewBox="0 0 24 24"
166
+ style={{
167
+ marginLeft: '0',
168
+ marginRight: '0',
169
+ fill: 'none',
170
+ stroke: 'currentcolor',
171
+ strokeLinecap: 'round',
172
+ strokeLinejoin: 'round',
173
+ strokeWidth: 1,
174
+ }}
175
+ >
176
+ <path d="M9 12h6m-6 4h6m2 5H7a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5.586a1 1 0 0 1 .707.293l5.414 5.414a1 1 0 0 1 .293.707V19a2 2 0 0 1-2 2Z" />
177
+ </svg>
178
+ <span
179
+ style={{
180
+ marginLeft: '0.25rem',
181
+ marginBottom: '-1px',
182
+ fontSize: '14px',
183
+ }}
184
+ >
185
+ {label ?? name} {description}
186
+ </span>
187
+ </a>
188
+ </li>
189
+ ));
190
+ File.displayName = 'File';
191
+
192
+ export const FileTree = Object.assign(Tree, { Folder, File });
@@ -0,0 +1,10 @@
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/config/storybook/components/FileTree/FileTree';
@@ -0,0 +1,21 @@
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 styles from './Flex.module.css';
11
+
12
+ export function Flex({ direction = 'row', itemsPerRow = 2, children }) {
13
+ const gaps = itemsPerRow - 1;
14
+ const root = document.documentElement;
15
+
16
+ root.style.setProperty('--flex-direction', direction);
17
+ root.style.setProperty('--items-per-row', itemsPerRow);
18
+ root.style.setProperty('--number-of-gaps', gaps);
19
+
20
+ return <div className={`${styles.flexItems}`}>{children}</div>;
21
+ }
@@ -0,0 +1,29 @@
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
+ :root {
11
+ --flex-direction: row;
12
+ --items-per-row: 2;
13
+ --number-of-gaps: 0;
14
+ }
15
+
16
+ .flexItems {
17
+ display: flex;
18
+ flex-direction: var(--flex-direction);
19
+ flex-wrap: wrap;
20
+ gap: 1rem;
21
+ margin-top: 2rem;
22
+ }
23
+
24
+ div.flexItems > * {
25
+ flex-basis: calc(
26
+ (100% / var(--items-per-row)) -
27
+ ((var(--number-of-gaps) * 16px + 0px) / var(--items-per-row))
28
+ );
29
+ }
@@ -0,0 +1,10 @@
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/config/storybook/components/Flex/Flex';