@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,40 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ import { FunctionComponent } from 'preact';
11
+ import { HTMLAttributes, Children } from 'preact/compat';
12
+ import { classes } from '@adobe-commerce/elsie/lib';
13
+
14
+ import '@adobe-commerce/elsie/components/CartList/CartList.css';
15
+
16
+ export interface CartListProps extends HTMLAttributes<HTMLDivElement> {}
17
+
18
+ export const CartList: FunctionComponent<CartListProps> = ({
19
+ className,
20
+ children,
21
+ ...props
22
+ }) => {
23
+ return (
24
+ <div {...props} className={classes(['dropin-cart-list', className])}>
25
+ <div
26
+ className="dropin-cart-list__wrapper"
27
+ aria-live="assertive"
28
+ aria-relevant="all"
29
+ >
30
+ {Children.map(children, (child, key) => {
31
+ return (
32
+ <div key={key} className="dropin-cart-list__item">
33
+ {child}
34
+ </div>
35
+ );
36
+ })}
37
+ </div>
38
+ </div>
39
+ );
40
+ };
@@ -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/CartList/CartList';
11
+ export { CartList as default } from '@adobe-commerce/elsie/components/CartList/CartList';
@@ -0,0 +1,255 @@
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-checkbox {
13
+ align-items: flex-start;
14
+ display: grid;
15
+ grid-template-columns: var(--spacing-small) auto;
16
+ grid-gap: var(--spacing-xxsmall) 0;
17
+ }
18
+
19
+ .dropin-checkbox__checkbox {
20
+ display: none;
21
+ margin: 0;
22
+ }
23
+
24
+ .dropin-checkbox__checkbox-icon {
25
+ display: flex;
26
+ align-items: center;
27
+ }
28
+
29
+ .dropin-checkbox__box {
30
+ margin: 0;
31
+ width: 14px;
32
+ height: 14px;
33
+ border-radius: var(--shape-border-radius-1);
34
+ border: var(--shape-border-width-1) solid var(--color-neutral-600);
35
+ background: var(--color-neutral-50) 0 0 no-repeat padding-box;
36
+ cursor: pointer;
37
+ }
38
+
39
+ .dropin-checkbox__checkmark {
40
+ opacity: 0;
41
+ border-radius: var(--shape-border-radius-1);
42
+ }
43
+
44
+ /* checked */
45
+
46
+ .dropin-checkbox__checkbox:checked
47
+ + .dropin-checkbox__checkbox-icon
48
+ .dropin-checkbox__box {
49
+ border: none;
50
+ }
51
+
52
+ .dropin-checkbox__checkbox:checked
53
+ + .dropin-checkbox__checkbox-icon
54
+ .dropin-checkbox__box
55
+ .dropin-checkbox__checkmark {
56
+ opacity: 1;
57
+ color: var(--color-neutral-50);
58
+ background: var(--color-neutral-700) 0 0 no-repeat padding-box;
59
+ top: -1px;
60
+ position: relative;
61
+ }
62
+
63
+ /* hover */
64
+
65
+ .dropin-checkbox__box:hover {
66
+ border: var(--shape-border-width-1) solid var(--color-neutral-800);
67
+ }
68
+
69
+ /* checked + hover */
70
+
71
+ .dropin-checkbox__checkbox:checked
72
+ + .dropin-checkbox__checkbox-icon
73
+ .dropin-checkbox__box:hover {
74
+ border: none;
75
+ background: var(--color-neutral-800) 0 0 no-repeat padding-box;
76
+ }
77
+
78
+ .dropin-checkbox__checkbox:checked
79
+ + .dropin-checkbox__checkbox-icon
80
+ .dropin-checkbox__box
81
+ .dropin-checkbox__checkmark:hover {
82
+ background: var(--color-neutral-800) 0 0 no-repeat padding-box;
83
+ }
84
+
85
+ /* focus */
86
+
87
+ .dropin-checkbox__box:focus-visible {
88
+ border: var(--shape-border-width-1) solid var(--color-neutral-800);
89
+ outline: var(--shape-border-width-3) solid var(--color-neutral-400);
90
+ }
91
+
92
+ .dropin-checkbox__checkbox:checked
93
+ + .dropin-checkbox__checkbox-icon
94
+ .dropin-checkbox__box:focus-visible {
95
+ width: var(--spacing-small);
96
+ height: var(--spacing-small);
97
+ border: none;
98
+ background: var(--color-neutral-800) 0 0 no-repeat padding-box;
99
+ outline: var(--shape-border-width-3) solid var(--color-neutral-400);
100
+ }
101
+
102
+ .dropin-checkbox__checkbox:checked
103
+ + .dropin-checkbox__checkbox-icon
104
+ .dropin-checkbox__box:focus-visible
105
+ .dropin-checkbox__checkmark {
106
+ top: 0;
107
+ }
108
+
109
+ /* label and description */
110
+
111
+ .dropin-checkbox__label,
112
+ .dropin-checkbox__label--medium {
113
+ padding-left: var(--spacing-xsmall);
114
+ color: var(--color-neutral-800);
115
+ font: var(--type-body-2-default-font);
116
+ letter-spacing: var(--type-body-2-default-letter-spacing);
117
+ text-align: left;
118
+ }
119
+
120
+ .dropin-checkbox__label--large {
121
+ padding-left: var(--spacing-small);
122
+ color: var(--color-neutral-800);
123
+ font: var(--type-body-1-default-font);
124
+ letter-spacing: var(--type-body-1-default-letter-spacing);
125
+ text-align: left;
126
+ }
127
+
128
+ .dropin-checkbox__label--medium a {
129
+ font: var(--type-body-2-strong-font);
130
+ letter-spacing: var(--type-body-2-strong-letter-spacing);
131
+ }
132
+
133
+ .dropin-checkbox__label--large a {
134
+ font: var(--type-body-1-strong-font);
135
+ letter-spacing: var(--type-body-1-strong-letter-spacing);
136
+ }
137
+
138
+ .dropin-checkbox__description {
139
+ display: block;
140
+ clear: both;
141
+ flex-basis: 100%;
142
+ width: 100%;
143
+ }
144
+
145
+ .dropin-checkbox__description,
146
+ .dropin-checkbox__description--medium {
147
+ padding-left: var(--spacing-xsmall);
148
+ color: var(--color-neutral-700);
149
+ font: var(--type-details-caption-2-font);
150
+ letter-spacing: var(--type-details-caption-2-letter-spacing);
151
+ text-align: left;
152
+ }
153
+
154
+ .dropin-checkbox__description--large {
155
+ padding-left: var(--spacing-small);
156
+ color: var(--color-neutral-700);
157
+ font: var(--type-body-2-default-font);
158
+ letter-spacing: var(--type-body-2-default-letter-spacing);
159
+ text-align: left;
160
+ }
161
+
162
+ .dropin-checkbox,
163
+ .dropin-checkbox--checkbox:not(:disabled) {
164
+ cursor: pointer;
165
+ }
166
+
167
+ /* error */
168
+
169
+ .dropin-checkbox__box--error {
170
+ border: var(--shape-border-width-2) solid var(--color-alert-500);
171
+ background: var(--color-neutral-50) 0 0 no-repeat padding-box;
172
+ }
173
+
174
+ .dropin-checkbox__box--error:hover {
175
+ border: var(--shape-border-width-2) solid var(--color-alert-500);
176
+ background: var(--color-neutral-50) 0 0 no-repeat padding-box;
177
+ }
178
+
179
+ .dropin-checkbox__checkbox:checked
180
+ + .dropin-checkbox__checkbox-icon
181
+ .dropin-checkbox__box--error,
182
+ .dropin-checkbox__checkbox:checked
183
+ + .dropin-checkbox__checkbox-icon
184
+ .dropin-checkbox__box--error:hover {
185
+ border: none;
186
+ background: var(--color-alert-500) 0 0 no-repeat padding-box;
187
+ }
188
+
189
+ .dropin-checkbox__checkbox:checked
190
+ + .dropin-checkbox__checkbox-icon
191
+ .dropin-checkbox__box--error
192
+ > .dropin-checkbox__checkmark,
193
+ .dropin-checkbox__checkbox:checked
194
+ + .dropin-checkbox__checkbox-icon
195
+ .dropin-checkbox__box--error
196
+ > .dropin-checkbox__checkmark:hover {
197
+ background: var(--color-alert-500) 0 0 no-repeat padding-box;
198
+ }
199
+
200
+ .dropin-checkbox__checkmark--error {
201
+ opacity: 1;
202
+ color: var(--color-neutral-50);
203
+ border: var(--color-alert-500);
204
+ background: var(--color-alert-500) 0 0 no-repeat padding-box;
205
+ }
206
+
207
+ /* disabled */
208
+
209
+ .dropin-checkbox--disabled,
210
+ .dropin-checkbox__label--disabled,
211
+ .dropin-checkbox__description--disabled {
212
+ color: var(--color-neutral-500);
213
+ cursor: default;
214
+ pointer-events: none;
215
+ }
216
+
217
+ .dropin-checkbox__box--disabled,
218
+ .dropin-checkbox__box--disabled:hover {
219
+ background: var(--color-neutral-300) 0 0 no-repeat padding-box;
220
+ border: var(--shape-border-width-1) solid var(--color-neutral-500);
221
+ cursor: default;
222
+ }
223
+
224
+ .dropin-checkbox__checkbox:checked
225
+ + .dropin-checkbox__checkbox-icon
226
+ .dropin-checkbox__box--disabled,
227
+ .dropin-checkbox__checkbox:checked
228
+ + .dropin-checkbox__checkbox-icon
229
+ .dropin-checkbox__box--disabled:hover {
230
+ border: none;
231
+ background: var(--color-neutral-300) 0 0 no-repeat padding-box;
232
+ }
233
+
234
+ .dropin-checkbox__checkbox:checked
235
+ + .dropin-checkbox__checkbox-icon
236
+ .dropin-checkbox__box--disabled
237
+ > .dropin-checkbox__checkmark,
238
+ .dropin-checkbox__checkbox:checked
239
+ + .dropin-checkbox__checkbox-icon
240
+ .dropin-checkbox__box--disabled
241
+ > .dropin-checkbox__checkmark:hover {
242
+ background: var(--color-neutral-300) 0 0 no-repeat padding-box;
243
+ }
244
+
245
+ /* Medium (portrait tablets and large phones, 768px and up) */
246
+ /* @media only screen and (min-width: 768px) { } */
247
+
248
+ /* Large (landscape tablets, 1024px and up) */
249
+ /* @media only screen and (min-width: 1024px) { } */
250
+
251
+ /* XLarge (laptops/desktops, 1366px and up) */
252
+ /* @media only screen and (min-width: 1366px) { } */
253
+
254
+ /* XXlarge (large laptops and desktops, 1920px and up) */
255
+ /* @media only screen and (min-width: 1920px) { } */
@@ -0,0 +1,290 @@
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 { Checkbox, CheckboxProps } from '@adobe-commerce/elsie/components/Checkbox';
13
+ import { expect, within, userEvent } from '@storybook/test';
14
+
15
+ /**
16
+ * Use Checkboxes to let users pick multiple options from a list or mark a single item as selected.
17
+ */
18
+ const meta: Meta<CheckboxProps> = {
19
+ title: 'Components/Checkbox',
20
+ component: Checkbox,
21
+ argTypes: {
22
+ name: {
23
+ description: 'Field name (used for mapping the value in a form)',
24
+ type: {
25
+ required: false,
26
+ name: 'string',
27
+ },
28
+ },
29
+ value: {
30
+ description: 'Field value',
31
+ type: 'string',
32
+ },
33
+ label: {
34
+ description: 'Label for the checkbox',
35
+ control: {
36
+ type: 'text',
37
+ },
38
+ table: {
39
+ type: {
40
+ summary: 'string | VNode',
41
+ },
42
+ },
43
+ },
44
+ description: {
45
+ description:
46
+ 'Additional secondary description if needed. This can be a string or a Nodes',
47
+ type: 'string',
48
+ summary: 'Optional description text goes here',
49
+ },
50
+ size: {
51
+ description:
52
+ 'Available sizes for the checkbox label and description texts',
53
+ type: 'string',
54
+ options: ['medium', 'large'],
55
+ default: 'medium',
56
+ control: {
57
+ type: 'radio',
58
+ default: 'medium',
59
+ },
60
+ },
61
+ disabled: {
62
+ description: 'Whether or not the checkbox is disabled',
63
+ type: 'boolean',
64
+ default: false,
65
+ },
66
+ checked: {
67
+ description: 'Whether or not the checkbox is active',
68
+ type: 'boolean',
69
+ default: false,
70
+ },
71
+ error: {
72
+ description: 'Whether or not the checkbox is on error status',
73
+ type: 'boolean',
74
+ default: false,
75
+ },
76
+ },
77
+ };
78
+
79
+ export default meta;
80
+
81
+ type Story = StoryObj<CheckboxProps>;
82
+
83
+ /**
84
+ * Import the Checkbox component
85
+ *
86
+ * ```ts
87
+ * import { Checkbox } from '@adobe-commerce/elsie/components/Checkbox';
88
+ * ```
89
+ */
90
+
91
+ export const Primary: Story = {
92
+ name: 'Enabled and not Active',
93
+ args: {
94
+ name: 'checkboxField',
95
+ label: 'Option',
96
+ description: 'Optional description text goes here',
97
+ },
98
+ play: async ({ canvasElement }) => {
99
+ const canvas = within(canvasElement);
100
+ const checkboxField = document.querySelector(
101
+ 'input[name="checkboxField"]'
102
+ ) as HTMLElement;
103
+ await expect(checkboxField).not.toBeChecked();
104
+ await userEvent.click(canvas.getByText('Option'));
105
+ await expect(checkboxField).toBeChecked();
106
+ await userEvent.click(checkboxField);
107
+ await expect(checkboxField).not.toBeChecked();
108
+ },
109
+ };
110
+
111
+ export const CheckboxEnabledAndActive: Story = {
112
+ name: 'Enabled and Active',
113
+ args: {
114
+ name: 'checkboxField',
115
+ label: 'Option',
116
+ description: 'Optional description text goes here',
117
+ checked: true,
118
+ },
119
+ play: async ({ canvasElement }) => {
120
+ const canvas = within(canvasElement);
121
+ const checkboxField = document.querySelector(
122
+ 'input[name="checkboxField"]'
123
+ ) as HTMLElement;
124
+ await expect(checkboxField).toBeChecked();
125
+ await userEvent.click(canvas.getByText('Option'));
126
+ await expect(checkboxField).not.toBeChecked();
127
+ await userEvent.click(checkboxField);
128
+ await expect(checkboxField).toBeChecked();
129
+ },
130
+ };
131
+
132
+ export const CheckboxEnabledAndNotActiveWithError: Story = {
133
+ name: 'Enabled and not Active with Error',
134
+ args: {
135
+ name: 'checkboxField',
136
+ label: 'Option',
137
+ description: 'Optional description text goes here',
138
+ error: true,
139
+ },
140
+ };
141
+
142
+ export const CheckboxEnabledAndActiveWithError: Story = {
143
+ name: 'Enabled and Active with Error',
144
+ args: {
145
+ name: 'checkboxField',
146
+ label: 'Option',
147
+ description: 'Optional description text goes here',
148
+ checked: true,
149
+ error: true,
150
+ },
151
+ };
152
+
153
+ export const CheckboxDisabled: Story = {
154
+ name: 'Disabled',
155
+ args: {
156
+ name: 'checkboxField',
157
+ label: 'Option',
158
+ description: 'Optional description text goes here',
159
+ disabled: true,
160
+ },
161
+ play: async () => {
162
+ const checkboxField = document.querySelector(
163
+ 'input[name="checkboxField"]'
164
+ ) as HTMLElement;
165
+ await expect(checkboxField).not.toBeChecked();
166
+ await expect(checkboxField).toBeDisabled();
167
+ },
168
+ };
169
+
170
+ export const CheckboxDisabledWithALink: Story = {
171
+ name: 'Disabled with a link',
172
+ args: {
173
+ name: 'checkboxField',
174
+ label: (
175
+ <span>
176
+ Option with{' '}
177
+ <a href="https://www.adobe.com" target="_blank" rel="noreferrer">
178
+ a link
179
+ </a>
180
+ </span>
181
+ ),
182
+ description: 'Optional description text goes here',
183
+ disabled: true,
184
+ },
185
+ play: async () => {
186
+ const checkboxField = document.querySelector(
187
+ 'input[name="checkboxField"]'
188
+ ) as HTMLElement;
189
+ await expect(checkboxField).not.toBeChecked();
190
+ await expect(checkboxField).toBeDisabled();
191
+ },
192
+ };
193
+
194
+ export const CheckboxDisabledAndActive: Story = {
195
+ name: 'Disabled and Active',
196
+ args: {
197
+ name: 'checkboxField',
198
+ label: 'Option',
199
+ description: 'Optional description text goes here',
200
+ disabled: true,
201
+ checked: true,
202
+ },
203
+ play: async () => {
204
+ const checkboxField = document.querySelector(
205
+ 'input[name="checkboxField"]'
206
+ ) as HTMLElement;
207
+ await expect(checkboxField).toBeChecked();
208
+ await expect(checkboxField).toBeDisabled();
209
+ },
210
+ };
211
+
212
+ export const CheckboxWithNodeLabelAndDescription: Story = {
213
+ name: 'Active with label and description as Nodes',
214
+ args: {
215
+ name: 'checkboxField',
216
+ label: <span>Option</span>,
217
+ description: <div>Optional description text goes here</div>,
218
+ checked: true,
219
+ },
220
+ play: async () => {
221
+ const checkboxField = document.querySelector(
222
+ 'input[name="checkboxField"]'
223
+ ) as HTMLElement;
224
+ await expect(checkboxField).toBeChecked();
225
+ },
226
+ };
227
+
228
+ export const CheckboxWithALink: Story = {
229
+ name: 'With a link in the label',
230
+ args: {
231
+ name: 'checkboxField',
232
+ label: (
233
+ <span>
234
+ Option with{' '}
235
+ <a href="https://www.adobe.com" target="_blank" rel="noreferrer">
236
+ a link
237
+ </a>{' '}
238
+ and a{' '}
239
+ <a href="https://www.adobe.com" target="_blank" rel="noreferrer">
240
+ second link
241
+ </a>
242
+ </span>
243
+ ),
244
+ description: 'Optional description text goes here',
245
+ checked: false,
246
+ },
247
+ play: async () => {
248
+ const checkboxField = document.querySelector(
249
+ 'input[name="checkboxField"]'
250
+ ) as HTMLElement;
251
+ const checkboxLink = document.querySelector(
252
+ '.dropin-checkbox a'
253
+ ) as HTMLElement;
254
+ await expect(checkboxField).not.toBeChecked();
255
+ await expect(checkboxLink).toBeDefined();
256
+ },
257
+ };
258
+
259
+ export const CheckboxWithLongLabel: Story = {
260
+ name: 'With a long label',
261
+ args: {
262
+ name: 'checkboxField',
263
+ label: (
264
+ <span style={{ width: '200px', display: 'inline-block' }}>
265
+ Option with{' '}
266
+ <a href="https://www.adobe.com" target="_blank" rel="noreferrer">
267
+ a link
268
+ </a>{' '}
269
+ and a{' '}
270
+ <a href="https://www.adobe.com" target="_blank" rel="noreferrer">
271
+ second link
272
+ </a>{' '}
273
+ plus a long text to test the wrapping and the checkbox alignment to the
274
+ top of the label
275
+ </span>
276
+ ),
277
+ description: 'Optional description text goes here',
278
+ checked: false,
279
+ },
280
+ play: async () => {
281
+ const checkboxField = document.querySelector(
282
+ 'input[name="checkboxField"]'
283
+ ) as HTMLElement;
284
+ const checkboxLink = document.querySelector(
285
+ '.dropin-checkbox a'
286
+ ) as HTMLElement;
287
+ await expect(checkboxField).not.toBeChecked();
288
+ await expect(checkboxLink).toBeDefined();
289
+ },
290
+ };