@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,214 @@
1
+ import { Meta, Unstyled } from '@storybook/blocks';
2
+
3
+ <Meta title="Build Tools/GraphQL API" />
4
+ <Unstyled>
5
+
6
+ # GraphQL Extensibility API
7
+
8
+ The GraphQL Extensibility API allows developers to extend existing GraphQL operations used by a Drop-in to meet additional data requirements without increasing code complexity or negatively impacting performance.
9
+ This API provides a flexible and efficient way to customize GraphQL Fragments by integrating build-time modifications into the storefront's development pipeline.
10
+
11
+ ## Extend your Drop-in GraphQL Fragments
12
+
13
+ To enable GraphQL Fragments to be extensible in your Drop-in, follow these steps:
14
+
15
+ ### Step 1: Define Your Fragments
16
+
17
+ Create the content for the fragments you are exporting.
18
+
19
+ ```ts
20
+ // ./src/api/fragments/MyFragment.ts
21
+
22
+ export const MY_FRAGMENT = `
23
+ fragment MY_FRAGMENT on FragmentInterface {
24
+ firstname
25
+ lastname
26
+
27
+ favorites {
28
+ uid
29
+ name
30
+ }
31
+ }
32
+ `;
33
+ ```
34
+
35
+ ### Step 2: Create Fragments Manifest File
36
+
37
+ Next, create a new file for your project to list all the fragments you want to expose.
38
+
39
+ ```ts
40
+ // ./src/api/fragments.ts
41
+
42
+ export { MY_FRAGMENT } from '@/my-dropin/api/graphql/MyFragment';
43
+ ```
44
+
45
+ ## Step 3: Update the API Configuration
46
+
47
+ Finally, add the new file reference to the API configuration in `./.elsie.js`.
48
+
49
+ ```js
50
+ // ./.elsie.js
51
+
52
+ module.exports = {
53
+ name: 'MyDropin',
54
+ api: {
55
+ root: './src/api',
56
+ importAliasRoot: '@/my-dropin/api',
57
+ fragments: './fragments.ts', // 👈 add this line
58
+ },
59
+ components: [
60
+ {
61
+ id: 'Components',
62
+ root: './src/components',
63
+ importAliasRoot: '@/my-dropin/components',
64
+ cssPrefix: 'my-dropin',
65
+ default: true,
66
+ },
67
+ ],
68
+ containers: {
69
+ root: './src/containers',
70
+ importAliasRoot: '@/my-dropin/containers',
71
+ },
72
+ schema: {
73
+ endpoint: process.env.ENDPOINT,
74
+ headers: {}
75
+ }
76
+ };
77
+ ```
78
+
79
+ ## Extend the Data module
80
+
81
+ Now that we have made our fragments extensible, we must extend the data model used in our Drop-ins.
82
+
83
+ ### Step 1: Define Typing to the Initializer API
84
+
85
+ First, add the typing to your initializer API in `./src/api/initialize/initialize.ts`.
86
+
87
+ ```ts
88
+ // ./src/api/initialize/initialize.ts
89
+
90
+ import { Initializer, Model } from '@adobe-commerce/elsie/lib';
91
+ import { Lang } from '@adobe-commerce/elsie/i18n';
92
+ import { MyModel } from '@/my-dropin/data/models';
93
+
94
+ type ConfigProps = {
95
+ langDefinitions?: Lang;
96
+
97
+ // 👇 add your models configuration
98
+ models?: {
99
+ MyModel?: Model<MyModel>;
100
+ },
101
+ };
102
+
103
+ export const initialize = new Initializer<ConfigProps>({
104
+ init: async (config) => {
105
+ const defaultConfig = {};
106
+ initialize.config.setConfig({ ...defaultConfig, ...config });
107
+ },
108
+
109
+ listeners: () => [],
110
+ });
111
+
112
+ export const config = initialize.config;
113
+ ```
114
+
115
+ ### Step 2: Extend the Data Transformer
116
+
117
+ Then, use the configuration to extend the data transformer the model uses by deep merging the existing data transformation with the new configuration.
118
+
119
+ ```ts
120
+ // ./src/data/transforms/transform-my-model.ts
121
+ import { merge } from '@adobe-commerce/elsie/lib';
122
+ import { MyModel } from '@/my-dropin/data/models';
123
+
124
+ export function transformMyModel(data: any): MyModel {
125
+ const model = {
126
+ name: `${data.firstname} ${data.lastname}`,
127
+ favorites: data.favorites,
128
+ };
129
+
130
+ // Merge custom transformer, if provided
131
+ return merge(
132
+ model, // default transformer
133
+ config.getConfig().models?.MyModel?.transformer?.(data) // custom transformer
134
+ );
135
+ }
136
+ ```
137
+
138
+ ---
139
+
140
+ # Using the GraphQL Extensibility Feature in Your Storefront
141
+
142
+ By extending the GraphQL Fragments and Models of drop-ins, you can leverage the drop-in's existing GraphQL operations and add extra fields needed to meet your specific business requirements.
143
+ This approach enhances the user experience while maintaining code simplicity and performance efficiency since all modifications are integrated into the storefront's development build-time pipeline.
144
+
145
+ ## Extend Drop-in's Fragments and Models
146
+
147
+ Follow these steps to extend the GraphQL Fragment and Model in your Drop-in:
148
+
149
+ ### Step 1: Extend the GraphQL Fragment
150
+
151
+ Use the `overrideGQLOperations` function to extend the existing GraphQL Fragment, allowing you to add fields to the fragment as needed.
152
+
153
+ The `overrideGQLOperations` functions accept an array of configuration objects where you must specify:
154
+
155
+ #### npm: string
156
+
157
+ The node module name of the drop-in. i.e. "@dropins/my-dropin".
158
+
159
+ #### operations: string[]
160
+
161
+ An array of string or template literal with operations.
162
+
163
+ - Only one definition can be provided in the operation.
164
+ - These must match the operation name as provided by the drop-in. i.e. `MY_FRAGMENT`.
165
+ - The operations must be valid GraphQL operations, such as Fragment. i.e. `fragment MY_FRAGMENT on FragmentInterface { ... }`.
166
+ - In the case of a Fragment, the fragment name must match the same interface as the drop-in. i.e. `FragmentInterface`.
167
+ - If an existing field that has variables is used:
168
+ - If not variables are provided, the existing variables will be used. i.e. `favorites(page: 1) { ... }`.
169
+ - If new variables are provided, the new variable will be added. i.e. `favorites(page: 1, offset: 5) { ... }`.
170
+ - If the existing variables are changed, the new variables will be used. i.e. `favorites(page: 2) { ... }`.
171
+
172
+
173
+ ```js
174
+ import overrideGQLOperations from '@dropins/build-tools/gql-extend.js';
175
+
176
+ overrideGQLOperations([
177
+ {
178
+ npm: '@dropins/my-dropin',
179
+ operations: [`
180
+ fragment MY_FRAGMENT on FragmentInterface {
181
+ age
182
+
183
+ favorites {
184
+ quantity
185
+ }
186
+ }
187
+ `],
188
+ },
189
+ ]);
190
+ ```
191
+
192
+ ### Step 2: Extend the Data Model
193
+
194
+ Next, update the data models to include the new fields added to the fragment, ensuring that the additional data is correctly processed and available for use in the drop-in. i.e., Slots, Event Bus, etc.
195
+
196
+ ```js
197
+ import * as api from '@dropins/storefront-cart/api.js';
198
+
199
+ initializers.register(api.initialize, {
200
+ models: {
201
+ MyModel: {
202
+ transformer: (data) => ({
203
+ age: data?.age,
204
+ favorites: data.favorites.map((favorite) => ({
205
+ quantity: favorite.quantity,
206
+ })),
207
+ }),
208
+ },
209
+ },
210
+ });
211
+
212
+ ```
213
+
214
+ </Unstyled>
@@ -0,0 +1,119 @@
1
+ import { Meta, Unstyled } from '@storybook/blocks';
2
+
3
+ <Meta title="API/Initializer" />
4
+ <Unstyled>
5
+
6
+ # Initializer
7
+
8
+ ```typescript
9
+ // my-dropin/initializer.ts
10
+
11
+ import { Initializer } from '@adobe-commerce/elsie/lib';
12
+ // import { events } from '@adobe-commerce/event-bus';
13
+
14
+ type ConfigProps = {};
15
+
16
+ export const initialize = new Initializer<ConfigProps>({
17
+ init: async (config) => {
18
+ const defaultConfig = {};
19
+ initialize.config.setConfig({ ...defaultConfig, ...config });
20
+ },
21
+
22
+ listeners: () => [
23
+ // events.on('authenticated', (authenticated) => {
24
+ // console.log('authenticated', authenticated);
25
+ // }),
26
+ ],
27
+ });
28
+
29
+ export const config = initialize.config;
30
+ ```
31
+
32
+ ```typescript
33
+ // Host Site
34
+ import { initializers } from '@dropins/tools/initializer.js';
35
+ import { initialize as pkg } from 'my-dropin/initializer.js';
36
+
37
+ // Register Packages
38
+ initializers.register(pkg, { ...config });
39
+
40
+ // Mount Initializers
41
+ window.addEventListener('load', initializers.mount);
42
+ ```
43
+
44
+ </Unstyled>
45
+
46
+ ## `setImageParamKeys(params)`
47
+
48
+ The `setImageParamKeys` method is part of the initializers module in the `@dropins/tools` package.
49
+ It allows you to set image parameters globally for all drop-ins that use the Image component.
50
+
51
+ ### Default Behavior
52
+
53
+ By default, Fastly parameters are used if `setImageParamKeys` is not called or if no parameters are provided.
54
+
55
+ ### Parameters
56
+
57
+ - `params` - `{ [key: string]: string | ((data: any) => [string, string]) }`
58
+ - An object of key-value pairs to map image parameters to their respective keys in the URL.
59
+ - The value can be a string or a function that takes the parameter value as an argument and returns a tuple of the new key and transformed value.
60
+
61
+ ### Functionality
62
+
63
+ - If a parameter key is provided via `setImageParamKeys`, it is used in generating image URLs instead of the default Fastly parameters.
64
+ - If a parameter key is not provided via `setImageParamKeys`, it is omitted from the generated image URLs.
65
+ - If a mapped key is a function and it is not specified as a parameter in the Image component, it is called with `null`. It should return a tuple of the key and value.
66
+ - If a mapping callback is provided, the callback is called with the parameter value (if it exists) and should return a tuple of the new key and transformed value.
67
+ - If a mapping callback returns `null`, the parameter is omitted from the generated image URLs.
68
+
69
+ ### Usage
70
+
71
+ Call the setImageParamKeys() function before the register() and mount() functions in the application layer.
72
+
73
+ ```javascript
74
+ // Set global image parameters
75
+ initializers.setImageParamKeys({
76
+ // Re-map the width parameter to imgWidth
77
+ width: 'imgWidth',
78
+ // Transform the quality parameter
79
+ quality: (value) => ['imgQuality', value * 100],
80
+ // Add an additional parameter to the image URL
81
+ extraParam: () => ['extraParam', 'extraValue'],
82
+ });
83
+
84
+ // Register Initializers
85
+ initializers.register(pkg.initialize, {
86
+ langDefinitions,
87
+ });
88
+
89
+ // Mount Initializers
90
+ initializers.mount();
91
+ ```
92
+
93
+ Now, when a dropin uses the Image component to render an image with a width of 300 pixels and quality value of 0.8:
94
+
95
+ ```jsx
96
+ <Image
97
+ loading={'lazy'}
98
+ src={'https://example.com/image.jpg'}
99
+ alt={'Example Image'}
100
+ width="300"
101
+ height="300"
102
+ params={{ width: 300, quality: 0.8 }}
103
+ />
104
+ ```
105
+
106
+ It renders the following image element:
107
+
108
+ ```html
109
+ <img
110
+ loading="lazy"
111
+ src="https://example.com/image.jpg"
112
+ srcset="https://example.com/image.jpg?imgWidth=300&imgQuality=80&extraParam=extraValue 768w, https://example.com/image.jpg?imgWidth=300&imgQuality=80&extraParam=extraValue 1024w, https://example.com/image.jpg?imgWidth=300&imgQuality=80&extraParam=extraValue 1366w, https://example.com/image.jpg?imgWidth=300&imgQuality=80&extraParam=extraValue 1920w"
113
+ alt="Example Image"
114
+ width="300"
115
+ height="300"
116
+ />
117
+ ```
118
+
119
+ In this example, the width parameter is mapped to imgWidth and the value of the quality parameter is modified and mapped to imgQuality.
@@ -0,0 +1,125 @@
1
+ import { Meta, Unstyled } from '@storybook/blocks';
2
+
3
+ <Meta title="API/Render" />
4
+ <Unstyled>
5
+
6
+ # Render
7
+
8
+ ## Implementing a new render in your dropin
9
+
10
+ To implement a new render in your dropin, you must create an instance of the `Render` class from the `@adobe-commerce/elsie/lib` library, passing in a `Provider` component.
11
+ This setup initializes the rendering context with the specified provider, which can manage state, context, or other dependencies required by your components.
12
+ By exporting this `render` instance, you enable different parts of your application to render components within the defined context, ensuring consistent behavior and integration across your application.
13
+
14
+ ```ts
15
+ // Dropin
16
+
17
+ import { Render } from '@adobe-commerce/elsie/lib';
18
+ import { Provider } from './Provider';
19
+
20
+ export const render = new Render(<Provider />);
21
+ ```
22
+
23
+ ## Rendering a dropin's container in a storefront
24
+
25
+ The render function mounts a drop-in container or component into the DOM and manages its lifecycle.
26
+ It returns a Promise that resolves to an object containing methods for updating and removing the component instance.
27
+
28
+ ```js
29
+ // Storefront
30
+ import { render as provider } from 'my-domain-pkg/render.js';
31
+ import { MyContainer } from 'my-domain-pkg/containers/MyContainer.js';
32
+
33
+ const wrapper = document.getElementById('my-container-root');
34
+
35
+ provider.render(MyContainer, { ...props })(wrapper);
36
+ ```
37
+
38
+ ### Using VNode as a property
39
+
40
+ Some components may require VNodes as properties. If you are using another component from the library, provide the VNode by executing the component as a function.
41
+
42
+ ```js
43
+ // Storefront
44
+
45
+ import { Button, Icon, provider } from '@dropins/tools/components.js';
46
+
47
+ const wrapper = document.getElementById('my-container-root');
48
+
49
+ provider.render(Button, {
50
+ children: 'My Button',
51
+ icon: Icon({ source: 'Heart' }),
52
+ })(wrapper);
53
+ ```
54
+
55
+ You may also create your VNode using the `h` function from the Preact library.
56
+
57
+ ```js
58
+ // Storefront
59
+
60
+ import { Button, provider } from '@dropins/tools/components.js';
61
+ import { h } from '@dropins/tools/preact.js';
62
+
63
+ const wrapper = document.getElementById('my-container-root');
64
+
65
+ provider.render(Button, { icon: h('div', { id: 'my-vnode' }) })(wrapper);
66
+ ```
67
+
68
+ ### Update properties of a rendered component
69
+
70
+ The `setProps` method is provided by the instance returned from the `render` function.
71
+ It allows for dynamic updates to the properties of a rendered component.
72
+ By accepting an updater function, `setProps` lets you modify the component's props based on its previous state.
73
+ This method is particularly useful for making incremental changes or responding to user interactions
74
+ without re-rendering the entire component. It ensures that the component's state remains consistent
75
+ and up-to-date with the latest data or user inputs.
76
+
77
+ #### Example
78
+
79
+ ```js
80
+ // Storefront
81
+
82
+ import { render as provider } from 'my-domain-pkg/render.js';
83
+ import { MyContainer } from 'my-domain-pkg/containers/MyContainer.js';
84
+
85
+ const wrapper = document.getElementById('my-container-root');
86
+ const myContainer = await provider.render(MyContainer, { ...props })(wrapper);
87
+
88
+ const button = document.getElementById('my-button');
89
+
90
+ button.addEventListener('click', () => {
91
+ // Update the component's props
92
+ myContainer.setProps((prevProps) => ({
93
+ ...prevProps,
94
+ newProp: 'new value',
95
+ }));
96
+ });
97
+ ```
98
+
99
+ ### Remove a rendered component from the DOM
100
+
101
+ The `remove` method is provided by the instance returned from the `render` function.
102
+ It allows for the complete removal of a rendered component from the DOM.
103
+ When invoked, `remove` ensures that the component and its associated resources are properly cleaned up,
104
+ preventing memory leaks and maintaining the application's overall performance.
105
+ This method is essential for managing the lifecycle of dynamic components,
106
+ especially in applications where components need to be frequently added and removed based
107
+ on user interactions or other events.
108
+
109
+ ```js
110
+ import { render as provider } from 'my-domain-pkg/render.js';
111
+ import { MyContainer } from 'my-domain-pkg/containers/MyContainer.js';
112
+
113
+ const wrapper = document.getElementById('my-container-root');
114
+ const myContainer = await provider.render(MyContainer, { ...props })(wrapper);
115
+
116
+ const button = document.getElementById('my-button');
117
+
118
+ button.addEventListener('click', () => {
119
+ // Remove the component from the DOM
120
+ myContainer.remove();
121
+ });
122
+ ```
123
+
124
+ </Unstyled>
125
+
@@ -0,0 +1,202 @@
1
+ import { Meta, Unstyled } from '@storybook/blocks';
2
+ import { Block, DesignSwatchGroup, TokenDefinitions } from './designBlocks';
3
+ import colorsData from '@adobe-commerce/storefront-design/base/colors/colors.json';
4
+ import { getTokenData } from './getTokenData';
5
+
6
+ export const tokenData = getTokenData(colorsData);
7
+ export const tokenNames = tokenData.map((token) => token.name);
8
+
9
+ <Meta title="Design/Colors" />
10
+
11
+
12
+ <Unstyled>
13
+
14
+ # Color Design tokens
15
+
16
+ Use color to create meaningful experiences while also expressing hierarchy, state, and brand identity.
17
+ Add as many colors and shades as you need, here you have the basics.
18
+
19
+ ## Available Design tokens
20
+
21
+ ### Brand
22
+
23
+ export const colorBrandPrefix = '--color-brand';
24
+
25
+ <TokenDefinitions
26
+ tokenData={tokenData.filter((data) => data.name.startsWith(colorBrandPrefix))}
27
+ />
28
+
29
+ <Block>
30
+ <DesignSwatchGroup
31
+ property="background"
32
+ prefix={colorBrandPrefix}
33
+ tokens={tokenNames}
34
+ groupStyles={{ margin: 'none' }}
35
+ swatchStyles={{ border: 'none' }}
36
+ />
37
+ </Block>
38
+
39
+ ### Neutrals
40
+
41
+ export const colorNeutralPrefix = '--color-neutral';
42
+
43
+ <TokenDefinitions
44
+ tokenData={tokenData.filter((data) =>
45
+ data.name.startsWith(colorNeutralPrefix)
46
+ )}
47
+ />
48
+
49
+ <Block>
50
+ <DesignSwatchGroup
51
+ property="background"
52
+ prefix={colorNeutralPrefix}
53
+ tokens={tokenNames}
54
+ groupStyles={{ margin: 'none' }}
55
+ swatchStyles={{ border: 'none' }}
56
+ />
57
+ </Block>
58
+
59
+ ### Positive
60
+
61
+ export const colorPositivePrefix = '--color-positive';
62
+
63
+ <TokenDefinitions
64
+ tokenData={tokenData.filter((data) =>
65
+ data.name.startsWith(colorPositivePrefix)
66
+ )}
67
+ />
68
+
69
+ <Block>
70
+ <DesignSwatchGroup
71
+ property="background"
72
+ prefix={colorPositivePrefix}
73
+ tokens={tokenNames}
74
+ groupStyles={{ margin: 'none' }}
75
+ swatchStyles={{ border: 'none' }}
76
+ />
77
+ </Block>
78
+
79
+ ### Informational
80
+
81
+ export const colorInformationalPrefix = '--color-informational';
82
+
83
+ <TokenDefinitions
84
+ tokenData={tokenData.filter((data) =>
85
+ data.name.startsWith(colorInformationalPrefix)
86
+ )}
87
+ />
88
+
89
+ <Block>
90
+ <DesignSwatchGroup
91
+ property="background"
92
+ prefix={colorInformationalPrefix}
93
+ tokens={tokenNames}
94
+ groupStyles={{ margin: 'none' }}
95
+ swatchStyles={{ border: 'none' }}
96
+ />
97
+ </Block>
98
+
99
+ ### Warning
100
+
101
+ export const colorWarningPrefix = '--color-warning';
102
+
103
+ <TokenDefinitions
104
+ tokenData={tokenData.filter((data) =>
105
+ data.name.startsWith(colorWarningPrefix)
106
+ )}
107
+ />
108
+
109
+ <Block>
110
+ <DesignSwatchGroup
111
+ property="background"
112
+ prefix={colorWarningPrefix}
113
+ tokens={tokenNames}
114
+ groupStyles={{ margin: 'none' }}
115
+ swatchStyles={{ border: 'none' }}
116
+ />
117
+ </Block>
118
+
119
+ ### Alert
120
+
121
+ export const colorAlertPrefix = '--color-alert';
122
+
123
+ <TokenDefinitions
124
+ tokenData={tokenData.filter((data) => data.name.startsWith(colorAlertPrefix))}
125
+ />
126
+
127
+ <Block>
128
+ <DesignSwatchGroup
129
+ property="background"
130
+ prefix={colorAlertPrefix}
131
+ tokens={tokenNames}
132
+ groupStyles={{ margin: 'none' }}
133
+ swatchStyles={{ border: 'none' }}
134
+ />
135
+ </Block>
136
+
137
+ ### Opacity
138
+
139
+ export const colorOpacityPrefix = '--color-opacity';
140
+
141
+ <TokenDefinitions
142
+ tokenData={tokenData.filter((data) =>
143
+ data.name.startsWith(colorOpacityPrefix)
144
+ )}
145
+ />
146
+
147
+ <Block
148
+ style={{
149
+ background: 'var(--color-neutral-900)',
150
+ color: 'var(--color-neutral-50)',
151
+ }}
152
+ >
153
+ <DesignSwatchGroup
154
+ property="background"
155
+ prefix={colorOpacityPrefix}
156
+ tokens={tokenNames}
157
+ groupStyles={{ margin: 'none' }}
158
+ swatchStyles={{ border: 'none' }}
159
+ />
160
+ </Block>
161
+
162
+ ### Button States
163
+
164
+ export const colorButtonState = '--color-button';
165
+
166
+ <TokenDefinitions
167
+ tokenData={tokenData.filter((data) =>
168
+ data.name.startsWith(colorButtonState)
169
+ )}
170
+ />
171
+
172
+ <Block>
173
+ <DesignSwatchGroup
174
+ property="background"
175
+ prefix={colorButtonState}
176
+ tokens={tokenNames}
177
+ groupStyles={{ margin: 'none' }}
178
+ swatchStyles={{ border: 'none' }}
179
+ />
180
+ </Block>
181
+
182
+ ### Action Button States
183
+
184
+ export const colorActionButtonState = '--color-action-button';
185
+
186
+ <TokenDefinitions
187
+ tokenData={tokenData.filter((data) =>
188
+ data.name.startsWith(colorActionButtonState)
189
+ )}
190
+ />
191
+
192
+ <Block>
193
+ <DesignSwatchGroup
194
+ property="background"
195
+ prefix={colorActionButtonState}
196
+ tokens={tokenNames}
197
+ groupStyles={{ margin: 'none' }}
198
+ swatchStyles={{ border: 'none' }}
199
+ />
200
+ </Block>
201
+
202
+ </Unstyled>