@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,195 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ // https://storybook.js.org/docs/7.0/preact/writing-stories/introduction
11
+ import type { Meta, StoryObj } from '@storybook/preact';
12
+ import {
13
+ Breadcrumbs as component,
14
+ BreadcrumbsProps,
15
+ } from '@adobe-commerce/elsie/components/Breadcrumbs';
16
+ import { Icon } from '@adobe-commerce/elsie/components/Icon';
17
+ import { IconsList } from '@adobe-commerce/elsie/components/Icon/Icon.stories.helpers';
18
+ import { ChevronRight, Placeholder } from '@adobe-commerce/elsie/icons';
19
+ import { expect } from '@storybook/test';
20
+
21
+ const meta: Meta<BreadcrumbsProps> = {
22
+ title: 'Components/Breadcrumbs',
23
+ component,
24
+ tags: ['autodocs'],
25
+ parameters: {
26
+ layout: 'centered', // centered | fullscreen
27
+ },
28
+ argTypes: {
29
+ categories: {
30
+ description: 'List of categories to display on the Breadcrumbs.',
31
+ type: { name: 'other', value: 'VNode[]' },
32
+ control: 'object',
33
+ },
34
+ separator: {
35
+ description: 'Icon used to separate the Breadcrumbs items.',
36
+ type: { name: 'symbol' },
37
+ options: Object.keys(IconsList),
38
+ mapping: IconsList,
39
+ control: 'select',
40
+ },
41
+ },
42
+ };
43
+
44
+ export default meta;
45
+
46
+ type Story = StoryObj<BreadcrumbsProps>;
47
+
48
+ /**
49
+ * ```ts
50
+ * import { Breadcrumbs } from '@adobe-commerce/elsie/components/Breadcrumbs';
51
+ * ```
52
+ */
53
+
54
+ export const Breadcrumbs: Story = {
55
+ args: {
56
+ categories: [
57
+ <a href="#" key="1">
58
+ One
59
+ </a>,
60
+ <a href="/two" key="2">
61
+ Two
62
+ </a>,
63
+ <a key="3">Three</a>,
64
+ ],
65
+ },
66
+ play: async () => {
67
+ const breadcrumbsElement = document.querySelector(
68
+ '.dropin-breadcrumbs__container'
69
+ ) as HTMLElement;
70
+ const categories = breadcrumbsElement.querySelectorAll(
71
+ '.dropin-breadcrumbs__item a'
72
+ );
73
+
74
+ await expect(breadcrumbsElement).toBeVisible();
75
+ await expect(categories[0]).toHaveTextContent('One');
76
+ await expect(categories[1]).toHaveAttribute('href', '/two');
77
+ },
78
+ };
79
+
80
+ export const BreadcrumbsWithLeadingIcon: Story = {
81
+ args: {
82
+ categories: [
83
+ <Icon
84
+ key={0}
85
+ source={Placeholder}
86
+ size="16"
87
+ className="storybook_icon"
88
+ stroke="1"
89
+ viewBox="0 0 24 24"
90
+ aria-label="One"
91
+ style={{ cursor: 'pointer' }}
92
+ onClick={() => console.log('Go to Homepage')}
93
+ />,
94
+ <a href="/two" key="2">
95
+ Two
96
+ </a>,
97
+ <a key="3">Three</a>,
98
+ ],
99
+ },
100
+ play: async () => {
101
+ const breadcrumbsElement = document.querySelector(
102
+ '.dropin-breadcrumbs__container'
103
+ ) as HTMLElement;
104
+ const icon = breadcrumbsElement.querySelector(
105
+ '.dropin-breadcrumbs__item svg'
106
+ ) as HTMLElement;
107
+ const categories = breadcrumbsElement.querySelectorAll(
108
+ '.dropin-breadcrumbs__item a'
109
+ );
110
+
111
+ await expect(breadcrumbsElement).toBeVisible();
112
+ await expect(icon).toBeVisible();
113
+ await expect(categories[0]).toHaveAttribute('href', '/two');
114
+ await expect(categories[1]).toHaveTextContent('Three');
115
+ },
116
+ };
117
+
118
+ export const BreadcrumbsWithSeparator: Story = {
119
+ args: {
120
+ ...Breadcrumbs.args,
121
+ separator: (
122
+ <Icon
123
+ source={ChevronRight}
124
+ size="16"
125
+ className="storybook_icon"
126
+ stroke="1"
127
+ viewBox="0 0 24 24"
128
+ />
129
+ ),
130
+ },
131
+ play: async () => {
132
+ const breadcrumbsElement = document.querySelector(
133
+ '.dropin-breadcrumbs__container'
134
+ ) as HTMLElement;
135
+ const separators = breadcrumbsElement.querySelectorAll(
136
+ '.dropin-breadcrumbs__separator--icon'
137
+ );
138
+
139
+ await expect(breadcrumbsElement).toBeVisible();
140
+ await expect(separators).toHaveLength(2);
141
+ await expect(separators[0]).toBeVisible();
142
+ await expect(separators[1]).toBeVisible();
143
+ },
144
+ };
145
+
146
+ export const BreadcrumbsWithIcons: Story = {
147
+ args: {
148
+ categories: [
149
+ <Icon
150
+ key={0}
151
+ source={Placeholder}
152
+ size="16"
153
+ className="storybook_icon"
154
+ stroke="1"
155
+ viewBox="0 0 24 24"
156
+ aria-label="One"
157
+ style={{ cursor: 'pointer' }}
158
+ onClick={() => console.log('Go to Homepage')}
159
+ />,
160
+ <a href="/two" key="2">
161
+ Two
162
+ </a>,
163
+ <a key="3">Three</a>,
164
+ ],
165
+ separator: (
166
+ <Icon
167
+ source={ChevronRight}
168
+ size="16"
169
+ className="storybook_icon"
170
+ stroke="1"
171
+ viewBox="0 0 24 24"
172
+ />
173
+ ),
174
+ },
175
+ play: async () => {
176
+ const breadcrumbsElement = document.querySelector(
177
+ '.dropin-breadcrumbs__container'
178
+ ) as HTMLElement;
179
+ const icon = breadcrumbsElement.querySelector(
180
+ '.dropin-breadcrumbs__item svg'
181
+ ) as HTMLElement;
182
+ const categories = breadcrumbsElement.querySelectorAll(
183
+ '.dropin-breadcrumbs__item a'
184
+ );
185
+ const separators = breadcrumbsElement.querySelectorAll(
186
+ '.dropin-breadcrumbs__separator--icon'
187
+ );
188
+
189
+ await expect(breadcrumbsElement).toBeVisible();
190
+ await expect(icon).toBeVisible();
191
+ await expect(categories[0]).toHaveAttribute('href', '/two');
192
+ await expect(separators).toHaveLength(2);
193
+ await expect(separators[1]).toBeVisible();
194
+ },
195
+ };
@@ -0,0 +1,71 @@
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 { HTMLAttributes } from 'preact/compat';
11
+ import { FunctionComponent, VNode } from 'preact';
12
+ import { VComponent, classes } from '@adobe-commerce/elsie/lib';
13
+ import '@adobe-commerce/elsie/components/Breadcrumbs/Breadcrumbs.css';
14
+
15
+ export interface BreadcrumbsProps extends HTMLAttributes<HTMLElement> {
16
+ categories: VNode[];
17
+ separator?: VNode<HTMLAttributes<SVGSVGElement>>;
18
+ }
19
+
20
+ export const Breadcrumbs: FunctionComponent<BreadcrumbsProps> = ({
21
+ className,
22
+ categories,
23
+ separator,
24
+ ...props
25
+ }) => {
26
+ return (
27
+ <>
28
+ {categories?.length > 1 && (
29
+ <nav
30
+ role="navigation"
31
+ {...props}
32
+ className={classes(['dropin-breadcrumbs__container', className])}
33
+ >
34
+ <ul className="dropin-breadcrumbs__items">
35
+ {categories?.map((category: VNode, index: number) => {
36
+ return (
37
+ <li
38
+ key={index}
39
+ className={classes([
40
+ 'dropin-breadcrumbs__item',
41
+ [
42
+ 'dropin-breadcrumbs__item--last',
43
+ index === categories.length - 1,
44
+ ],
45
+ ])}
46
+ >
47
+ <VComponent
48
+ node={category}
49
+ className="dropin-breadcrumbs__link"
50
+ />
51
+ {!separator && index !== categories.length - 1 && (
52
+ <span className="dropin-breadcrumbs__separator--default">
53
+ {' '}
54
+ /{' '}
55
+ </span>
56
+ )}
57
+ {separator && index !== categories.length - 1 && (
58
+ <VComponent
59
+ node={separator}
60
+ className="dropin-breadcrumbs__separator--icon"
61
+ />
62
+ )}
63
+ </li>
64
+ );
65
+ })}
66
+ </ul>
67
+ </nav>
68
+ )}
69
+ </>
70
+ );
71
+ };
@@ -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/Breadcrumbs/Breadcrumbs';
11
+ export { Breadcrumbs as default } from '@adobe-commerce/elsie/components/Breadcrumbs/Breadcrumbs';
@@ -0,0 +1,213 @@
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
+ /* Common button styles */
11
+ .dropin-button,
12
+ .dropin-iconButton {
13
+ border: 0 none;
14
+ cursor: pointer;
15
+ white-space: normal;
16
+ }
17
+
18
+ .dropin-button {
19
+ border-radius: var(--shape-border-radius-3);
20
+ font-size: var(--type-button-1-font);
21
+ font-weight: var(--type-button-1-font);
22
+ padding: var(--spacing-xsmall) var(--spacing-medium);
23
+ display: flex;
24
+ justify-content: center;
25
+ align-items: center;
26
+ text-align: left;
27
+ word-wrap: break-word;
28
+ }
29
+
30
+ .dropin-iconButton {
31
+ height: var(--spacing-xbig);
32
+ width: var(--spacing-xbig);
33
+ padding: var(--spacing-xsmall);
34
+ }
35
+
36
+ .dropin-button:disabled,
37
+ .dropin-iconButton:disabled {
38
+ pointer-events: none;
39
+ user-select: none;
40
+ }
41
+
42
+ .dropin-button:not(:disabled),
43
+ .dropin-iconButton:not(:disabled) {
44
+ cursor: pointer;
45
+ }
46
+
47
+ .dropin-button:focus,
48
+ .dropin-iconButton:focus {
49
+ outline: none;
50
+ }
51
+
52
+ .dropin-button:focus-visible,
53
+ .dropin-iconButton:focus-visible {
54
+ outline: var(--spacing-xxsmall) solid var(--color-button-focus);
55
+ }
56
+
57
+ /* Primary */
58
+ .dropin-button--primary,
59
+ a.dropin-button--primary,
60
+ .dropin-iconButton--primary {
61
+ border: none;
62
+ background: var(--color-brand-500) 0 0% no-repeat padding-box;
63
+ color: var(--color-neutral-50);
64
+ text-align: left;
65
+ margin-right: 0;
66
+ }
67
+
68
+ .dropin-iconButton--primary {
69
+ border-radius: var(--spacing-xbig);
70
+ min-height: var(--spacing-xbig);
71
+ min-width: var(--spacing-xbig);
72
+ padding: var(--spacing-xsmall);
73
+ }
74
+
75
+ .dropin-button--primary--disabled,
76
+ a.dropin-button--primary--disabled,
77
+ .dropin-iconButton--primary--disabled {
78
+ background: var(--color-neutral-300) 0 0% no-repeat padding-box;
79
+ color: var(--color-neutral-500);
80
+ fill: var(--color-neutral-300);
81
+ pointer-events: none;
82
+ user-select: none;
83
+ }
84
+
85
+ .dropin-button--primary:hover,
86
+ a.dropin-button--primary:hover,
87
+ .dropin-iconButton--primary:hover,
88
+ .dropin-button--primary:focus:hover,
89
+ .dropin-iconButton--primary:focus:hover {
90
+ background-color: var(--color-button-hover);
91
+ text-decoration: none;
92
+ }
93
+
94
+ .dropin-button--primary:focus,
95
+ .dropin-iconButton--primary:focus {
96
+ background-color: var(--color-brand-500);
97
+ }
98
+
99
+ .dropin-button--primary:hover:active,
100
+ .dropin-iconButton--primary:hover:active {
101
+ background-color: var(--color-button-active);
102
+ }
103
+
104
+ /* Secondary */
105
+ .dropin-button--secondary,
106
+ a.dropin-button--secondary,
107
+ .dropin-iconButton--secondary {
108
+ border: var(--shape-border-width-2) solid var(--color-brand-500);
109
+ background: none 0 0% no-repeat padding-box;
110
+ color: var(--color-brand-500);
111
+ padding-top: calc(var(--spacing-xsmall) - var(--shape-border-width-2));
112
+ padding-left: calc(var(--spacing-medium) - var(--shape-border-width-2));
113
+ }
114
+
115
+ .dropin-iconButton--secondary {
116
+ border-radius: var(--spacing-xbig);
117
+ min-height: var(--spacing-xbig);
118
+ min-width: var(--spacing-xbig);
119
+ padding: var(--spacing-xsmall);
120
+ padding-top: calc(var(--spacing-xsmall) - var(--shape-border-width-2));
121
+ padding-left: calc(var(--spacing-xsmall) - var(--shape-border-width-2));
122
+ }
123
+
124
+ .dropin-button--secondary--disabled,
125
+ a.dropin-button--secondary--disabled,
126
+ .dropin-iconButton--secondary--disabled {
127
+ border: var(--shape-border-width-2) solid var(--color-neutral-300);
128
+ background: none 0 0% no-repeat padding-box;
129
+ color: var(--color-neutral-500);
130
+ fill: var(--color-neutral-300);
131
+ pointer-events: none;
132
+ user-select: none;
133
+ }
134
+
135
+ .dropin-button--secondary:hover,
136
+ a.dropin-button--secondary:hover,
137
+ .dropin-iconButton--secondary:hover {
138
+ border: var(--shape-border-width-2) solid var(--color-button-hover);
139
+ color: var(--color-button-hover);
140
+ text-decoration: none;
141
+ }
142
+
143
+ .dropin-button--secondary:active,
144
+ .dropin-iconButton--secondary:active {
145
+ border: var(--shape-border-width-2) solid var(--color-button-active);
146
+ color: var(--color-button-active);
147
+ }
148
+
149
+ /* Tertiary */
150
+ .dropin-button--tertiary,
151
+ a.dropin-button--tertiary,
152
+ .dropin-iconButton--tertiary {
153
+ border: none;
154
+ background: none 0 0% no-repeat padding-box;
155
+ color: var(--color-brand-500);
156
+ }
157
+
158
+ .dropin-iconButton--tertiary {
159
+ border: none;
160
+ border-radius: var(--spacing-xbig);
161
+ min-height: var(--spacing-xbig);
162
+ min-width: var(--spacing-xbig);
163
+ padding: var(--spacing-xsmall);
164
+ }
165
+
166
+ .dropin-button--tertiary--disabled,
167
+ a.dropin-button--tertiary--disabled,
168
+ .dropin-iconButton--tertiary--disabled {
169
+ border: none;
170
+ color: var(--color-neutral-500);
171
+ pointer-events: none;
172
+ user-select: none;
173
+ }
174
+
175
+ .dropin-button--tertiary:hover,
176
+ a.dropin-button--tertiary:hover,
177
+ .dropin-iconButton--tertiary:hover {
178
+ color: var(--color-button-hover);
179
+ text-decoration: none;
180
+ }
181
+
182
+ .dropin-button--tertiary:active,
183
+ .dropin-iconButton--tertiary:active {
184
+ color: var(--color-button-active);
185
+ }
186
+
187
+ .dropin-button--tertiary:focus-visible,
188
+ .dropin-iconButton--tertiary:focus-visible {
189
+ -webkit-box-shadow: inset 0 0 0 2px var(--color-neutral-800);
190
+ -moz-box-shadow: inset 0 0 0 2px var(--color-neutral-800);
191
+ box-shadow: inset 0 0 0 2px var(--color-neutral-800);
192
+ }
193
+
194
+ /* Button Sizes */
195
+ .dropin-button--large {
196
+ font: var(--type-button-1-font);
197
+ letter-spacing: var(--type-button-1-letter-spacing);
198
+ }
199
+
200
+ .dropin-button--medium {
201
+ font: var(--type-button-2-font);
202
+ letter-spacing: var(--type-button-2-letter-spacing);
203
+ }
204
+
205
+ .dropin-button-icon {
206
+ height: 24px;
207
+ }
208
+
209
+ /* Button with text and icon */
210
+ .dropin-button--with-icon {
211
+ column-gap: var(--spacing-xsmall);
212
+ row-gap: var(--spacing-xsmall);
213
+ }
@@ -0,0 +1,133 @@
1
+ import {
2
+ Meta,
3
+ Unstyled,
4
+ Controls,
5
+ Canvas,
6
+ Story,
7
+ Description,
8
+ } from '@storybook/blocks';
9
+ import { StoryWrapper } from '@adobe-commerce/elsie/config/storybook/components/StoryWrapper';
10
+ import * as ButtonStories from './Button.stories';
11
+ import './Button.css';
12
+
13
+ <Meta of={ButtonStories} />
14
+ <Unstyled>
15
+
16
+ # Button
17
+
18
+ Use Buttons to highlight or guide user actions.
19
+
20
+ ## Usage
21
+
22
+ ```jsx
23
+ import { Button } from '@adobe-commerce/elsie/components';
24
+ ```
25
+
26
+ This example uses all the `Button` properties.
27
+
28
+ <Description of={ButtonStories.Button} />
29
+
30
+ ## All props
31
+
32
+ The table below shows the name, description, and default value of each `Button` prop.
33
+ Use the table controls to learn how each property affects the Button.
34
+
35
+ <Canvas of={ButtonStories.Button} />
36
+ <Controls of={ButtonStories.Button} sort="requiredFirst" />
37
+
38
+ ## Active
39
+
40
+ Setting `active` to `true` overrides the Button's `icon` and `children` properties with the values you set for the `activeIcon` and `activeChildren` properties. With this one property, you can quickly toggle the Button's icon and text.
41
+
42
+ **Note:** Setting the `active` property to `false` (from `true`) returns the button's `children` and `icon` values. It does not disable the button. To disable the button, use the `disabled` property, as described in the [Disabled](#disabled) section below.
43
+
44
+ <StoryWrapper>
45
+ <Story of={ButtonStories.Active} />
46
+ <Story of={ButtonStories.NotActive} />
47
+ </StoryWrapper>
48
+
49
+ <Description of={ButtonStories.Active} />
50
+ <Description of={ButtonStories.NotActive} />
51
+
52
+ ## Children
53
+
54
+ The `children` prop accepts the Preact `ComponentChildren` type. This type is equal to React's `ReactNode` type and can accept any type. But in practice, you should try to limit the `children` prop to a `string`.
55
+
56
+ To create Icon-only buttons, use the `icon` prop. See the [Icons](#icons) section below for more information.
57
+
58
+ <StoryWrapper>
59
+ <Story of={ButtonStories.Children} />
60
+ </StoryWrapper>
61
+
62
+ <Description of={ButtonStories.Children} />
63
+
64
+ ## Disabled
65
+
66
+ The `disabled` prop is a `boolean` that disables the button. Default is `false`.
67
+
68
+ <StoryWrapper>
69
+ <Story of={ButtonStories.Disabled} />
70
+ </StoryWrapper>
71
+
72
+ <Description of={ButtonStories.Disabled} />
73
+
74
+ ## Icons
75
+
76
+ The `icon` prop adds an `Icon` component. You can add an `Icon` with or without Button text.
77
+
78
+ <StoryWrapper>
79
+ <Story of={ButtonStories.IconOnly} />
80
+ <Story of={ButtonStories.TextAndIcon} />
81
+ </StoryWrapper>
82
+
83
+ <Description of={ButtonStories.IconOnly} />
84
+ <Description of={ButtonStories.TextAndIcon} />
85
+
86
+ ## Sizes
87
+
88
+ The `size` prop sets the size of the button.
89
+
90
+ <StoryWrapper>
91
+ <Story of={ButtonStories.MediumSize} />
92
+ <Story of={ButtonStories.LargeSize} />
93
+ </StoryWrapper>
94
+
95
+ <Description of={ButtonStories.MediumSize} />
96
+ <Description of={ButtonStories.LargeSize} />
97
+
98
+ ## Variants
99
+
100
+ The `variant` prop sets the appearance of the button.
101
+
102
+ <StoryWrapper>
103
+ <Story of={ButtonStories.Primary} name="Primary" />
104
+ <Story of={ButtonStories.Secondary} name="Secondary" />
105
+ <Story of={ButtonStories.Tertiary} name="Tertiary" />
106
+ </StoryWrapper>
107
+
108
+ <Description of={ButtonStories.Primary} />
109
+ <Description of={ButtonStories.Secondary} />
110
+ <Description of={ButtonStories.Tertiary} />
111
+
112
+ ### When to use
113
+
114
+ Use buttons to communicate actions users can take and interact with the page.
115
+ Usually, each page should have only one primary button, and any remaining calls to action should be represented as lower-emphasis buttons.
116
+
117
+ ### When not to use
118
+
119
+ Do not use the `onClick()` attribute to make buttons act as navigational elements.
120
+ Instead, render the button as a link when the desired action is to take the user to a new page.
121
+
122
+ ### Render as a link
123
+
124
+ To use a button as a navigation element, set the `href` prop to the target URL.
125
+ This renders the button as an anchor tag (`<a>`) instead of a button tag (`<button>`).
126
+
127
+ <StoryWrapper>
128
+ <Story of={ButtonStories.AsLink} />
129
+ </StoryWrapper>
130
+
131
+ <Description of={ButtonStories.AsLink} />
132
+
133
+ </Unstyled>