@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,398 @@
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 {
12
+ Button as component,
13
+ ButtonProps,
14
+ } from '@adobe-commerce/elsie/components/Button';
15
+ import { Cart, Check, Search, SearchFilled } from '@adobe-commerce/elsie/icons';
16
+ import { Icon } from '@adobe-commerce/elsie/components/Icon';
17
+ import { IconsList } from '@adobe-commerce/elsie/components/Icon/Icon.stories.helpers';
18
+ import { expect, within } from '@storybook/test';
19
+ import { action } from '@storybook/addon-actions';
20
+
21
+ /**
22
+ * Use Buttons to highlight or guide user actions.
23
+ */
24
+ const meta: Meta<ButtonProps> = {
25
+ title: 'Components/Button',
26
+ component,
27
+ argTypes: {
28
+ value: {
29
+ description: 'Add string to pass to the clickHandler.',
30
+ table: {
31
+ type: { summary: 'string' },
32
+ },
33
+ },
34
+ children: {
35
+ description: 'Add text to the button.',
36
+ table: {
37
+ type: { summary: 'ComponentChildren' },
38
+ },
39
+ control: 'text',
40
+ },
41
+ variant: {
42
+ description: 'Change the button style.',
43
+ table: {
44
+ type: { summary: 'string' },
45
+ defaultValue: { summary: 'primary' },
46
+ },
47
+ options: ['primary', 'secondary', 'tertiary'],
48
+ control: 'radio',
49
+ },
50
+ size: {
51
+ description: 'Change the button size.',
52
+ table: {
53
+ type: { summary: 'string' },
54
+ defaultValue: { summary: 'medium' },
55
+ },
56
+ options: ['medium', 'large'],
57
+ control: 'radio',
58
+ },
59
+ icon: {
60
+ description: 'Add Icon component to the button.',
61
+ table: {
62
+ type: { summary: 'FunctionComponent' },
63
+ },
64
+ options: Object.keys(IconsList),
65
+ mapping: IconsList,
66
+ control: 'select',
67
+ },
68
+ disabled: {
69
+ description: 'Disable the button.',
70
+ table: {
71
+ type: { summary: 'boolean' },
72
+ defaultValue: { summary: 'false' },
73
+ },
74
+ control: { type: 'boolean' },
75
+ },
76
+ active: {
77
+ description: 'Activate the button.',
78
+ table: {
79
+ type: { summary: 'boolean' },
80
+ defaultValue: { summary: 'false' },
81
+ },
82
+ control: { type: 'boolean' },
83
+ },
84
+ activeChildren: {
85
+ description: 'Replace value of children prop when button is active.',
86
+ table: {
87
+ type: { summary: 'ComponentChildren' },
88
+ },
89
+ control: 'text',
90
+ },
91
+ activeIcon: {
92
+ description: 'Replace value of icon prop when when button is active.',
93
+ table: {
94
+ type: { summary: 'FunctionComponent' },
95
+ },
96
+ options: Object.keys(IconsList),
97
+ mapping: IconsList,
98
+ control: 'select',
99
+ },
100
+ onClick: {
101
+ description: 'Add a click handler.',
102
+ table: {
103
+ type: { summary: 'function' },
104
+ },
105
+ action: 'onClick',
106
+ },
107
+ href: {
108
+ description: 'Set this value to render the component as a link',
109
+ table: {
110
+ type: { summary: 'string' },
111
+ },
112
+ control: 'text',
113
+ },
114
+ },
115
+ };
116
+ export default meta;
117
+
118
+ type Story = StoryObj<ButtonProps>;
119
+
120
+ /**
121
+ * ```tsx
122
+ * <Button
123
+ * active={false}
124
+ * activeChildren="Active"
125
+ * activeIcon={<Icon source={Check} size="24" />}
126
+ * children="Button"
127
+ * disabled={false}
128
+ * icon={<Icon source={Cart} size="24" />}
129
+ * onClick={handleAddToCart}
130
+ * size="medium"
131
+ * value={undefined}
132
+ * variant="primary"
133
+ * />
134
+ * ```
135
+ */
136
+ export const Button: Story = {
137
+ tags: ['isHidden'], // Hide from direct access/navigation
138
+ args: {
139
+ active: false,
140
+ activeChildren: 'Active',
141
+ activeIcon: <Icon source={Check} size="24" />,
142
+ children: 'Button',
143
+ disabled: false,
144
+ icon: <Icon source={Cart} size="24" />,
145
+ onClick: action('onClick'),
146
+ size: 'medium',
147
+ value: undefined,
148
+ variant: 'primary',
149
+ },
150
+ };
151
+
152
+ /**
153
+ * ```tsx
154
+ * <Button>Button</Button>
155
+ * ```
156
+ * ```tsx
157
+ * <Button children="Button" />
158
+ * ```
159
+ */
160
+ export const Children: Story = {
161
+ tags: ['isHidden'],
162
+ args: {
163
+ children: 'Button',
164
+ },
165
+ };
166
+
167
+ /**
168
+ * ```tsx
169
+ * <Button variant="primary">Primary</Button>
170
+ * ```
171
+ */
172
+ export const Primary: Story = {
173
+ args: {
174
+ ...Button.args,
175
+ activeIcon: undefined,
176
+ icon: undefined,
177
+ children: 'Primary',
178
+ variant: 'primary',
179
+ },
180
+ play: async ({ canvasElement }) => {
181
+ const canvas = within(canvasElement);
182
+ await expect(await canvas.findByRole('button')).toBeVisible();
183
+ },
184
+ };
185
+
186
+ /**
187
+ * ```tsx
188
+ * <Button variant='secondary'>Secondary</Button>
189
+ * ```
190
+ */
191
+ export const Secondary: Story = {
192
+ args: {
193
+ ...Primary.args,
194
+ children: 'Secondary',
195
+ variant: 'secondary',
196
+ },
197
+ };
198
+
199
+ /**
200
+ * ```tsx
201
+ * <Button variant='tertiary'>Tertiary</Button>
202
+ * ```
203
+ */
204
+ export const Tertiary: Story = {
205
+ args: {
206
+ ...Primary.args,
207
+ children: 'Tertiary',
208
+ variant: 'tertiary',
209
+ },
210
+ };
211
+
212
+ /**
213
+ * ```tsx
214
+ * <Button size='large'>Large</Button>
215
+ * ```
216
+ */
217
+ export const LargeSize: Story = {
218
+ args: {
219
+ ...Primary.args,
220
+ children: 'Large',
221
+ size: 'large',
222
+ value: '123',
223
+ },
224
+ };
225
+
226
+ /**
227
+ * ```tsx
228
+ * <Button size='medium'>Medium</Button>
229
+ * ```
230
+ */
231
+ export const MediumSize: Story = {
232
+ args: {
233
+ ...Primary.args,
234
+ children: 'Medium',
235
+ size: 'medium',
236
+ },
237
+ };
238
+
239
+ /**
240
+ * ```tsx
241
+ * <Button
242
+ * icon={<Icon
243
+ * source={Cart}
244
+ * size="24"
245
+ * stroke="2"
246
+ * viewBox="0 0 24 24"
247
+ * aria-label="Search" />}
248
+ * />
249
+ * ```
250
+ */
251
+ export const IconOnly: Story = {
252
+ args: {
253
+ ...Primary.args,
254
+ children: undefined,
255
+ icon: (
256
+ <Icon
257
+ source={Search}
258
+ size="24"
259
+ stroke="2"
260
+ viewBox="0 0 24 24"
261
+ aria-label="Search"
262
+ />
263
+ ),
264
+ },
265
+ play: async ({ canvasElement }) => {
266
+ const canvas = within(canvasElement);
267
+ const searchIcon = document.querySelector(
268
+ 'g[data-name="Search icon"]'
269
+ ) as HTMLElement;
270
+ await expect(await canvas.findByRole('button')).toBeVisible();
271
+ await expect(searchIcon).toBeVisible();
272
+ },
273
+ };
274
+
275
+ /**
276
+ * ```tsx
277
+ * <Button
278
+ * icon={<Icon
279
+ * source={Cart}
280
+ * size="24"
281
+ * stroke="2"
282
+ * viewBox="0 0 24 24"
283
+ * aria-label="Search" />}
284
+ * >
285
+ * Search
286
+ * </Button>
287
+ * ```
288
+ */
289
+ export const TextAndIcon: Story = {
290
+ args: {
291
+ ...IconOnly.args,
292
+ children: 'Search',
293
+ },
294
+ play: async ({ canvasElement }) => {
295
+ const canvas = within(canvasElement);
296
+ const searchIcon = document.querySelector(
297
+ 'g[data-name="Search icon"]'
298
+ ) as HTMLElement;
299
+ await expect(await canvas.findByRole('button')).toBeVisible();
300
+ await expect(searchIcon).toBeVisible();
301
+ await expect(canvas.getByText('Search')).toBeVisible();
302
+ },
303
+ };
304
+
305
+ /**
306
+ * ```tsx
307
+ * <Button disabled>Button</Button>
308
+ * ```
309
+ * ```tsx
310
+ * <Button disabled={true}>Button</Button>
311
+ * ```
312
+ * ```tsx
313
+ * <Button disabled={loop ? false : current < 1}>Button</Button>
314
+ * ```
315
+ */
316
+ export const Disabled: Story = {
317
+ args: {
318
+ ...Primary.args,
319
+ children: 'Button',
320
+ disabled: true,
321
+ },
322
+ play: async ({ canvasElement }) => {
323
+ const canvas = within(canvasElement);
324
+ await expect(await canvas.findByRole('button')).toBeDisabled();
325
+ await expect(canvas.getByText('Button')).toBeVisible();
326
+ },
327
+ };
328
+
329
+ /**
330
+ * ```tsx
331
+ * <Button
332
+ * active={true}
333
+ * activeChildren="Active"
334
+ * activeIcon={<Icon source={SearchFilled} />}
335
+ * children="Not Active"
336
+ * icon={<Icon source={Search} />}
337
+ * />
338
+ * ```
339
+ */
340
+ export const Active: Story = {
341
+ args: {
342
+ ...Primary.args,
343
+ active: true,
344
+ activeChildren: 'Active',
345
+ activeIcon: (
346
+ <Icon source={SearchFilled} size="24" stroke="2" viewBox="0 0 24 24" />
347
+ ),
348
+ children: 'Not Active',
349
+ icon: <Icon source={Search} size="24" stroke="2" viewBox="0 0 24 24" />,
350
+ },
351
+ play: async ({ canvasElement }) => {
352
+ const canvas = within(canvasElement);
353
+ const searchIcon = document.querySelector(
354
+ '[data-name="Search icon filled"]'
355
+ ) as HTMLElement;
356
+ await expect(await canvas.findByRole('button')).toBeVisible();
357
+ await expect(canvas.getByText('Active')).toBeVisible();
358
+ await expect(searchIcon).toBeVisible();
359
+ },
360
+ };
361
+
362
+ /**
363
+ * ```tsx
364
+ * <Button
365
+ * active={false}
366
+ * activeChildren="Active"
367
+ * activeIcon={<Icon source={SearchFilled} />}
368
+ * children="Not Active"
369
+ * icon={<Icon source={Search} />}
370
+ * />
371
+ * ```
372
+ */
373
+ export const NotActive: Story = {
374
+ args: {
375
+ ...Active.args,
376
+ active: false,
377
+ },
378
+ };
379
+
380
+ /**
381
+ * ```tsx
382
+ * <Button href="https://google.com">Link</Button>
383
+ * ```
384
+ */
385
+ export const AsLink: Story = {
386
+ args: {
387
+ ...Primary.args,
388
+ href: 'https://google.com',
389
+ children: 'Link',
390
+ icon: undefined,
391
+ onClick: undefined,
392
+ },
393
+ play: async ({ canvasElement }) => {
394
+ const canvas = within(canvasElement);
395
+ await expect(await canvas.findByRole('link')).toBeVisible();
396
+ await expect(canvas.getByText('Link')).toBeVisible();
397
+ },
398
+ };
@@ -0,0 +1,121 @@
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 { ComponentChildren, FunctionComponent, VNode } from 'preact';
11
+ import { HTMLAttributes } from 'preact/compat';
12
+ import { VComponent, classes } from '@adobe-commerce/elsie/lib';
13
+ import '@adobe-commerce/elsie/components/Button/Button.css';
14
+
15
+ export interface ButtonProps
16
+ extends Omit<
17
+ HTMLAttributes<HTMLButtonElement | HTMLAnchorElement>,
18
+ 'size' | 'icon'
19
+ > {
20
+ variant?: 'primary' | 'secondary' | 'tertiary';
21
+ size?: 'medium' | 'large';
22
+ children?: ComponentChildren;
23
+ icon?: VNode<HTMLAttributes<SVGSVGElement>>;
24
+ disabled?: boolean;
25
+ active?: boolean;
26
+ activeChildren?: ComponentChildren;
27
+ activeIcon?: VNode<HTMLAttributes<SVGSVGElement>>;
28
+ }
29
+
30
+ export const Button: FunctionComponent<ButtonProps> = ({
31
+ value,
32
+ variant = 'primary',
33
+ size = 'medium',
34
+ icon,
35
+ className,
36
+ children,
37
+ disabled = false,
38
+ active = false,
39
+ activeChildren,
40
+ activeIcon,
41
+ href,
42
+ ...props
43
+ }) => {
44
+ let buttonType = 'dropin-button';
45
+
46
+ if (
47
+ (icon && !children) ||
48
+ (icon && active && !activeChildren) ||
49
+ (!icon && active && activeIcon)
50
+ ) {
51
+ buttonType = 'dropin-iconButton';
52
+ }
53
+
54
+ if (active && activeChildren) {
55
+ buttonType = 'dropin-button';
56
+ }
57
+
58
+ className = classes([
59
+ buttonType,
60
+ `${buttonType}--${size}`,
61
+ `${buttonType}--${variant}`,
62
+ [`${buttonType}--${variant}--disabled`, disabled],
63
+ children && icon && `${buttonType}--with-icon`,
64
+ !children && activeChildren && icon && `${buttonType}--with-icon`,
65
+ active && activeIcon && `${buttonType}--with-icon`,
66
+ className,
67
+ ]);
68
+
69
+ const iconClassName = classes([
70
+ 'dropin-button-icon',
71
+ `dropin-button-icon--${variant}`,
72
+ [`dropin-button-icon--${variant}--disabled`, disabled],
73
+ icon?.props.className,
74
+ ]);
75
+
76
+ const attributes = href
77
+ ? {
78
+ node: <a />,
79
+ role: 'link',
80
+ href,
81
+ ...props,
82
+ disabled,
83
+ active,
84
+ onKeyDown: (event: KeyboardEvent) => {
85
+ if (disabled) {
86
+ event.preventDefault();
87
+ }
88
+ },
89
+ tabIndex: disabled ? -1 : 0,
90
+ }
91
+ : {
92
+ node: <button />,
93
+ role: 'button',
94
+ ...props,
95
+ value,
96
+ disabled,
97
+ active,
98
+ };
99
+
100
+ return (
101
+ <VComponent {...attributes} className={className}>
102
+ {icon && !active && <VComponent node={icon} className={iconClassName} />}
103
+
104
+ {activeIcon && active && (
105
+ <VComponent node={activeIcon} className={iconClassName} />
106
+ )}
107
+
108
+ {children &&
109
+ !active &&
110
+ (typeof children === 'string' ? <span>{children}</span> : children)}
111
+
112
+ {active &&
113
+ activeChildren &&
114
+ (typeof activeChildren === 'string' ? (
115
+ <span>{activeChildren}</span>
116
+ ) : (
117
+ activeChildren
118
+ ))}
119
+ </VComponent>
120
+ );
121
+ };
@@ -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/Button/Button';
11
+ export { Button as default } from '@adobe-commerce/elsie/components/Button/Button';
@@ -0,0 +1,34 @@
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-card {
13
+ --bgColor: var(--color-neutral-200);
14
+ background-color: var(--bgColor);
15
+ border-width: 0;
16
+ border-radius: var(--shape-border-radius-2);
17
+ }
18
+
19
+ .dropin-card--secondary {
20
+ --bgColor: var(--color-neutral-50);
21
+ border-width: var(--shape-border-width-2);
22
+ border-style: solid;
23
+ border-color: var(--color-neutral-400);
24
+ }
25
+
26
+ .dropin-card__content {
27
+ display: flex;
28
+ flex-direction: column;
29
+ gap: var(--spacing-medium);
30
+ padding-top: var(--spacing-medium);
31
+ padding-right: var(--spacing-medium);
32
+ padding-bottom: var(--spacing-medium);
33
+ padding-left: var(--spacing-medium);
34
+ }
@@ -0,0 +1,76 @@
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 { Card, CardProps } from '@adobe-commerce/elsie/components/Card';
13
+ import { expect, within } from '@storybook/test';
14
+
15
+ /**
16
+ * Use Cards to group content into a single container.
17
+ */
18
+
19
+ const meta: Meta<CardProps> = {
20
+ title: 'Components/Card',
21
+ component: Card,
22
+ argTypes: {
23
+ variant: {
24
+ options: ['primary', 'secondary'],
25
+ control: { type: 'radio' },
26
+ },
27
+ children: {
28
+ description: 'The content of the Card.',
29
+ control: false,
30
+ type: { name: 'other', value: 'VNode[]' },
31
+ }
32
+ },
33
+ };
34
+
35
+ export default meta;
36
+
37
+ type Story = StoryObj<CardProps>;
38
+
39
+ /**
40
+ * ```ts
41
+ * import { Card } from '@adobe-commerce/elsie/components/Card';
42
+ * ```
43
+ */
44
+
45
+ export const Primary: Story = {
46
+ name: 'Primary Card',
47
+ args: {
48
+ variant: 'primary',
49
+ },
50
+ render: ({ variant }) => (
51
+ <Card variant={variant}>
52
+ <h2 style={{ font: 'var(--type-headline-2-strong-font)' }}>Title</h2>
53
+ <p style={{ font: 'var(--type-body-2-default-font)' }}>
54
+ This is a short description of the item and should be kept to two or
55
+ three lines as maximum.
56
+ </p>
57
+ </Card>
58
+ ),
59
+ play: async ({ canvasElement }) => {
60
+ const canvas = within(canvasElement);
61
+ await expect(await canvas.getByText('Title')).toBeVisible();
62
+ await expect(
63
+ await canvas.getByText(
64
+ 'This is a short description of the item and should be kept to two or three lines as maximum.'
65
+ )
66
+ ).toBeVisible();
67
+ },
68
+ };
69
+
70
+ export const Secondary: Story = {
71
+ name: 'Secondary Card',
72
+ args: {
73
+ variant: 'secondary',
74
+ },
75
+ render: Primary.render,
76
+ };
@@ -0,0 +1,34 @@
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 { ComponentChildren, FunctionComponent } from 'preact';
11
+ import { HTMLAttributes } from 'preact/compat';
12
+ import { classes } from '@adobe-commerce/elsie/lib';
13
+ import '@adobe-commerce/elsie/components/Card/Card.css';
14
+
15
+ export interface CardProps extends HTMLAttributes<HTMLDivElement> {
16
+ variant?: 'primary' | 'secondary';
17
+ children: ComponentChildren | ComponentChildren[];
18
+ }
19
+
20
+ export const Card: FunctionComponent<CardProps> = ({
21
+ variant = 'primary',
22
+ className,
23
+ children,
24
+ ...props
25
+ }) => {
26
+ return (
27
+ <div
28
+ {...props}
29
+ className={classes(['dropin-card', `dropin-card--${variant}`, className])}
30
+ >
31
+ <div class="dropin-card__content">{children}</div>
32
+ </div>
33
+ );
34
+ };
@@ -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/components/Card/Card';