@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,91 @@
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, VNode, cloneElement } from 'preact';
11
+ import { HTMLAttributes } from 'preact/compat';
12
+ import { classes } from '@adobe-commerce/elsie/lib';
13
+ import '@adobe-commerce/elsie/components/ActionButtonGroup/ActionButtonGroup.css';
14
+ import { useCallback, useState } from 'preact/hooks';
15
+ import { Children } from 'react';
16
+ import { ActionButtonProps } from '@adobe-commerce/elsie/components/ActionButton';
17
+
18
+ export interface ActionButtonGroupOption {
19
+ value: string | null;
20
+ text: string;
21
+ icon?: VNode<SVGElement>;
22
+ disabled?: boolean;
23
+ }
24
+
25
+ export interface ActionButtonGroupProps extends HTMLAttributes<HTMLDivElement> {
26
+ variant?: 'primary' | 'secondary';
27
+ activeOption?: string;
28
+ disabled?: boolean;
29
+ dividers?: boolean;
30
+ children: VNode<ActionButtonProps>[] | VNode<ActionButtonProps>;
31
+ handleSelect?(value: string): void;
32
+ }
33
+
34
+ export const ActionButtonGroup: FunctionComponent<ActionButtonGroupProps> = ({
35
+ className,
36
+ variant = 'primary',
37
+ activeOption,
38
+ disabled = false,
39
+ dividers = true,
40
+ children,
41
+ handleSelect,
42
+ ...props
43
+ }) => {
44
+ const [activeOptionState, setActiveOptionState] = useState(activeOption);
45
+
46
+ const handleClick = useCallback(
47
+ (option: any) => {
48
+ const isOptionDisabled = disabled || option.props.disabled;
49
+ if (!isOptionDisabled) {
50
+ setActiveOptionState(option.props.value);
51
+ if (handleSelect) {
52
+ handleSelect(option.props.value);
53
+ }
54
+ }
55
+ },
56
+ [handleSelect, setActiveOptionState, disabled]
57
+ );
58
+
59
+ const buttonGroupOptions = Children.map(
60
+ children,
61
+ (child: VNode<ActionButtonProps>) => {
62
+ const isOptionDisabled = disabled || child.props.disabled;
63
+ const isOptionActive = child.props.value === activeOptionState;
64
+ return cloneElement(child, {
65
+ disabled: isOptionDisabled,
66
+ active: isOptionActive,
67
+ onClick: () => handleClick(child),
68
+ className: classes([
69
+ 'dropin-action-button-group__option',
70
+ `dropin-action-button-group__option--${variant}`,
71
+ ['dropin-action-button-group__option--active', isOptionActive],
72
+ ['dropin-action-button-group__option--with-dividers', dividers],
73
+ ]),
74
+ });
75
+ }
76
+ );
77
+
78
+ return (
79
+ <div
80
+ role="group"
81
+ {...props}
82
+ className={classes([
83
+ 'dropin-action-button-group',
84
+ `dropin-action-button-group--${variant}`,
85
+ className,
86
+ ])}
87
+ >
88
+ {buttonGroupOptions}
89
+ </div>
90
+ );
91
+ };
@@ -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/ActionButtonGroup/ActionButtonGroup';
@@ -0,0 +1,144 @@
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-alert-banner {
13
+ background-color: var(--color-alert-800);
14
+ color: var(--color-neutral-50);
15
+ font: var(--type-body-2-strong-font);
16
+ letter-spacing: var(--type-body-2-strong-letter-spacing);
17
+ padding: var(--spacing-small);
18
+ display: grid;
19
+ grid-template-columns: 1fr max-content;
20
+ align-items: center;
21
+ gap: var(--spacing-small);
22
+ }
23
+
24
+ .dropin-alert-banner__actions,
25
+ .dropin-alert-banner__content {
26
+ align-items: center;
27
+ display: grid;
28
+ grid-template-columns: max-content max-content;
29
+ }
30
+
31
+ /* Neutral variant */
32
+ .dropin-alert-banner--neutral {
33
+ background-color: var(--color-neutral-700);
34
+ }
35
+
36
+ .dropin-alert-banner--neutral button.dropin-alert-banner__dismiss-button {
37
+ background-color: var(--color-neutral-700);
38
+ }
39
+ .dropin-alert-banner--neutral button.dropin-alert-banner__dismiss-button:hover,
40
+ .dropin-alert-banner--neutral button.dropin-alert-banner__dismiss-button:focus,
41
+ .dropin-alert-banner--neutral
42
+ button.dropin-alert-banner__dismiss-button:focus:hover,
43
+ .dropin-alert-banner--neutral
44
+ button.dropin-alert-banner__dismiss-button:active {
45
+ background-color: var(--color-neutral-500);
46
+ }
47
+
48
+ /* Brand variant */
49
+ .dropin-alert-banner--brand {
50
+ background-color: var(--color-brand-500);
51
+ }
52
+
53
+ .dropin-alert-banner--brand button.dropin-alert-banner__dismiss-button {
54
+ background-color: var(--color-brand-500);
55
+ }
56
+ .dropin-alert-banner--brand button.dropin-alert-banner__dismiss-button:hover,
57
+ .dropin-alert-banner--brand button.dropin-alert-banner__dismiss-button:focus,
58
+ .dropin-alert-banner--brand
59
+ button.dropin-alert-banner__dismiss-button:focus:hover,
60
+ .dropin-alert-banner--brand button.dropin-alert-banner__dismiss-button:active {
61
+ background-color: var(--color-brand-700);
62
+ }
63
+
64
+ /* Success variant */
65
+ .dropin-alert-banner--success {
66
+ background-color: var(--color-positive-800);
67
+ }
68
+
69
+ .dropin-alert-banner--success button.dropin-alert-banner__dismiss-button {
70
+ background-color: var(--color-positive-800);
71
+ }
72
+ .dropin-alert-banner--success button.dropin-alert-banner__dismiss-button:hover,
73
+ .dropin-alert-banner--success button.dropin-alert-banner__dismiss-button:focus,
74
+ .dropin-alert-banner--success
75
+ button.dropin-alert-banner__dismiss-button:focus:hover,
76
+ .dropin-alert-banner--success
77
+ button.dropin-alert-banner__dismiss-button:active {
78
+ background-color: var(--color-positive-500);
79
+ }
80
+
81
+ /* Warning variant */
82
+ .dropin-alert-banner--warning {
83
+ background-color: var(--color-alert-800);
84
+ }
85
+
86
+ .dropin-alert-banner--warning button.dropin-alert-banner__dismiss-button {
87
+ background-color: var(--color-alert-800);
88
+ }
89
+ .dropin-alert-banner--warning button.dropin-alert-banner__dismiss-button:hover,
90
+ .dropin-alert-banner--warning button.dropin-alert-banner__dismiss-button:focus,
91
+ .dropin-alert-banner--warning
92
+ button.dropin-alert-banner__dismiss-button:focus:hover,
93
+ .dropin-alert-banner--warning
94
+ button.dropin-alert-banner__dismiss-button:active {
95
+ background-color: var(--color-alert-500);
96
+ }
97
+
98
+ .dropin-alert-banner__icon {
99
+ flex-shrink: 0;
100
+ color: var(--color-neutral-50);
101
+ margin-right: var(--spacing-small);
102
+ }
103
+
104
+ button.dropin-alert-banner__dismiss-button {
105
+ margin-left: auto;
106
+ color: var(--color-neutral-50);
107
+ height: 24px;
108
+ min-height: 24px;
109
+ width: 24px;
110
+ min-width: 24px;
111
+ padding: 0;
112
+ }
113
+
114
+ button.dropin-alert-banner__action {
115
+ color: var(--color-neutral-50);
116
+ font: var(--type-body-2-strong-font);
117
+ letter-spacing: var(--type-body-2-strong-letter-spacing);
118
+ padding: 0;
119
+ margin-right: var(--spacing-xxsmall);
120
+ }
121
+
122
+ /* Medium (portrait tablets and large phones, 768px and up) */
123
+ @media only screen and (width >= 400px) and (width < 768px) {
124
+ .dropin-alert-banner__actions,
125
+ .dropin-alert-banner__content {
126
+ grid-template-columns: auto auto;
127
+ word-break: break-word;
128
+ word-wrap: break-word;
129
+ }
130
+
131
+ .dropin-alert-banner__message {
132
+ word-break: break-word;
133
+ word-wrap: break-word;
134
+ }
135
+ }
136
+
137
+ /* Large (landscape tablets, 1024px and up) */
138
+ /* @media only screen and (min-width: 1024px) { } */
139
+
140
+ /* XLarge (laptops/desktops, 1366px and up) */
141
+ /* @media only screen and (min-width: 1366px) { } */
142
+
143
+ /* XXlarge (large laptops and desktops, 1920px and up) */
144
+ /* @media only screen and (min-width: 1920px) { } */
@@ -0,0 +1,165 @@
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
+ AlertBanner as component,
14
+ AlertBannerProps,
15
+ } from '@adobe-commerce/elsie/components/AlertBanner';
16
+ import { action } from '@storybook/addon-actions';
17
+ import { expect } from '@storybook/test';
18
+ import { IconsList } from '@adobe-commerce/elsie/components/Icon/Icon.stories.helpers';
19
+
20
+ /**
21
+ * Use AlertBanners to notify and prompt users to take action.
22
+ */
23
+ const meta: Meta<AlertBannerProps> = {
24
+ title: 'Components/AlertBanner',
25
+ component,
26
+ argTypes: {
27
+ variant: {
28
+ description: 'The AlertBanner variant.',
29
+ table: {
30
+ type: { summary: 'string' },
31
+ },
32
+ options: ['brand', 'neutral', 'success', 'warning'],
33
+ control: 'radio',
34
+ },
35
+ icon: {
36
+ description: 'The AlertBanner icon.',
37
+ table: {
38
+ type: { summary: 'FunctionComponent' },
39
+ },
40
+ options: Object.keys(IconsList),
41
+ mapping: IconsList,
42
+ control: {
43
+ type: 'select',
44
+ },
45
+ },
46
+ message: {
47
+ control: {
48
+ type: 'select',
49
+ labels: {
50
+ Short: 'Short message',
51
+ Long: 'Long message',
52
+ },
53
+ },
54
+ description: 'The AlertBanner message.',
55
+ options: ['Short', 'Long'],
56
+ mapping: {
57
+ Short: <div>Short message</div>,
58
+ Long: <div>Alert banner with an extremely extremely long message</div>,
59
+ },
60
+ },
61
+ onDismiss: {
62
+ description: 'The AlertBanner dismiss handler.',
63
+ table: {
64
+ type: { summary: 'function' },
65
+ },
66
+ action: 'onDismiss',
67
+ },
68
+ action: {
69
+ description:
70
+ 'Optional action that must contain `label` and `onClick()` properties',
71
+ control: false,
72
+ },
73
+ },
74
+ };
75
+
76
+ export default meta;
77
+
78
+ type Story = StoryObj<AlertBannerProps>;
79
+
80
+ /**
81
+ * <AlertBanner>👋 Hello from your new AlertBanner story!</AlertBanner>
82
+ */
83
+ export const Neutral: Story = {
84
+ args: {
85
+ variant: 'neutral',
86
+ //@ts-ignore
87
+ icon: IconsList.InfoFilled,
88
+ message: <span>Hello from your new AlertBanner!</span>,
89
+ onDismiss: action('Dismiss clicked'),
90
+ action: {
91
+ label: 'Action',
92
+ onClick: action('Action clicked'),
93
+ },
94
+ },
95
+ play: async () => {
96
+ const alertBanner = document.querySelector(
97
+ 'div[class*="dropin-alert-banner"]'
98
+ ) as HTMLElement;
99
+
100
+ await expect(alertBanner).toBeVisible();
101
+
102
+ const link = alertBanner.querySelector(
103
+ '.dropin-alert-banner__dismiss-button'
104
+ );
105
+ await expect(link).toBeVisible();
106
+ await expect(link?.ariaLabel).toBe('Dismiss Alert');
107
+
108
+ const icon = alertBanner.querySelector('.dropin-alert-banner__icon');
109
+ await expect(icon).toBeVisible();
110
+ },
111
+ };
112
+
113
+ export const Brand: Story = {
114
+ args: {
115
+ variant: 'brand',
116
+ message: <span>Hello from your new AlertBanner!</span>,
117
+ onDismiss: action('Dismiss clicked'),
118
+ },
119
+ };
120
+
121
+ export const Success: Story = {
122
+ args: {
123
+ variant: 'success',
124
+ //@ts-ignore
125
+ icon: IconsList.CheckWithCircle,
126
+ message: <span>Hello from your new AlertBanner!</span>,
127
+ onDismiss: action('Dismiss clicked'),
128
+ },
129
+ };
130
+
131
+ export const Warning: Story = {
132
+ args: {
133
+ variant: 'warning',
134
+ //@ts-ignore
135
+ icon: IconsList.WarningFilled,
136
+ message: <span>Hello from your new AlertBanner!</span>,
137
+ onDismiss: action('Dismiss clicked'),
138
+ },
139
+ };
140
+
141
+ export const Action: Story = {
142
+ args: {
143
+ variant: 'warning',
144
+ //@ts-ignore
145
+ icon: IconsList.WarningFilled,
146
+ message: <span>Hello from your new AlertBanner!</span>,
147
+ onDismiss: action('Dismiss clicked'),
148
+ action: {
149
+ label: 'Action',
150
+ onClick: action('Action clicked'),
151
+ },
152
+ },
153
+ play: async () => {
154
+ const alertBanner = document.querySelector(
155
+ 'div[class*="dropin-alert-banner"]'
156
+ ) as HTMLElement;
157
+
158
+ await expect(alertBanner).toBeVisible();
159
+
160
+ const action = alertBanner.querySelector('.dropin-alert-banner__action');
161
+
162
+ await expect(action).toBeVisible();
163
+ await expect(action).toHaveTextContent('Action');
164
+ },
165
+ };
@@ -0,0 +1,90 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+
10
+ import { FunctionComponent, VNode } from 'preact';
11
+ import { HTMLAttributes } from 'preact/compat';
12
+ import { classes, VComponent } from '@adobe-commerce/elsie/lib';
13
+ import '@adobe-commerce/elsie/components/AlertBanner/AlertBanner.css';
14
+ import { Button, Icon } from '@adobe-commerce/elsie/components';
15
+ import { Close } from '@adobe-commerce/elsie/icons';
16
+ import { useText } from '@adobe-commerce/elsie/i18n';
17
+
18
+ export interface AlertBannerProps
19
+ extends Omit<HTMLAttributes<HTMLDivElement>, 'icon' | 'action'> {
20
+ variant: 'brand' | 'neutral' | 'success' | 'warning';
21
+ icon?: VNode<HTMLAttributes<SVGSVGElement>>;
22
+ message: VNode;
23
+ onDismiss: () => void;
24
+ action?: {
25
+ label: string;
26
+ onClick: (event: Event) => void;
27
+ };
28
+ }
29
+
30
+ export const AlertBanner: FunctionComponent<AlertBannerProps> = ({
31
+ className,
32
+ variant,
33
+ icon,
34
+ message,
35
+ onDismiss,
36
+ action,
37
+ ...props
38
+ }) => {
39
+ const translations = useText({
40
+ dismiss: 'Dropin.InlineAlert.dismissLabel',
41
+ });
42
+
43
+ return (
44
+ <div
45
+ {...props}
46
+ className={classes([
47
+ className,
48
+ 'dropin-alert-banner',
49
+ `dropin-alert-banner--${variant}`,
50
+ ])}
51
+ >
52
+ <div className={'dropin-alert-banner__content'}>
53
+ {icon && (
54
+ <VComponent
55
+ node={icon}
56
+ aria-hidden="true"
57
+ className={'dropin-alert-banner__icon'}
58
+ />
59
+ )}
60
+
61
+ {/* Message */}
62
+ <VComponent
63
+ node={message}
64
+ className={classes(['dropin-alert-banner__message'])}
65
+ />
66
+ </div>
67
+
68
+ <div className={'dropin-alert-banner__actions'}>
69
+ {action && (
70
+ <Button
71
+ variant="tertiary"
72
+ className={'dropin-alert-banner__action'}
73
+ onClick={action.onClick}
74
+ aria-label={action.label}
75
+ >
76
+ {action.label}
77
+ </Button>
78
+ )}
79
+
80
+ <Button
81
+ icon={<Icon source={Close} size="24" stroke="2" />}
82
+ className="dropin-alert-banner__dismiss-button"
83
+ variant="primary"
84
+ onClick={onDismiss}
85
+ aria-label={translations.dismiss}
86
+ />
87
+ </div>
88
+ </div>
89
+ );
90
+ };
@@ -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/AlertBanner/AlertBanner';
11
+ export { AlertBanner as default } from '@adobe-commerce/elsie/components/AlertBanner/AlertBanner';
@@ -0,0 +1,60 @@
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-breadcrumbs__container {
13
+ display: flex;
14
+ }
15
+
16
+ .dropin-breadcrumbs__items {
17
+ display: flex;
18
+ flex-wrap: wrap;
19
+ font: var(--type-details-caption-1-font);
20
+ list-style: none;
21
+ margin: 0;
22
+ padding: 0;
23
+ }
24
+
25
+ .dropin-breadcrumbs__item {
26
+ display: flex;
27
+ justify-content: center;
28
+ }
29
+
30
+ .dropin-breadcrumbs__item--last > :first-child {
31
+ color: var(--color-brand-500);
32
+ cursor: default;
33
+ }
34
+
35
+ .dropin-breadcrumbs__item--last > :first-child:hover,
36
+ .dropin-breadcrumbs__item--last > :first-child:focus-visible {
37
+ text-decoration: none;
38
+ }
39
+
40
+ .dropin-breadcrumbs__separator--default {
41
+ margin: 0 var(--spacing-xsmall);
42
+ }
43
+
44
+ .dropin-breadcrumbs__separator--icon {
45
+ width: 16px;
46
+ height: 16px;
47
+ margin: 0 var(--spacing-xxsmall);
48
+ }
49
+
50
+ /* Medium (portrait tablets and large phones, 768px and up) */
51
+ /* @media only screen and (min-width: 768px) { } */
52
+
53
+ /* Large (landscape tablets, 1024px and up) */
54
+ /* @media only screen and (min-width: 1024px) { } */
55
+
56
+ /* XLarge (laptops/desktops, 1366px and up) */
57
+ /* @media only screen and (min-width: 1366px) { } */
58
+
59
+ /* XXlarge (large laptops and desktops, 1920px and up) */
60
+ /* @media only screen and (min-width: 1920px) { } */