@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,133 @@
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 } from 'preact/compat';
12
+ import { classes } from '@adobe-commerce/elsie/lib';
13
+ import '@adobe-commerce/elsie/components/Skeleton/Skeleton.css';
14
+
15
+ export interface SkeletonRowProps
16
+ extends Omit<HTMLAttributes<HTMLDivElement>, 'size'> {
17
+ fullWidth?: boolean;
18
+ lines?: number;
19
+ size?: 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';
20
+ variant?: 'heading' | 'row' | 'empty';
21
+ multilineGap?: 'xsmall' | 'small' | 'medium' | 'big' | 'xbig';
22
+ children?: string;
23
+ }
24
+
25
+ const SINGLELINE = 1;
26
+
27
+ export const SkeletonRow: FunctionComponent<SkeletonRowProps> = ({
28
+ className,
29
+ fullWidth = false,
30
+ lines = SINGLELINE,
31
+ size = 'small',
32
+ variant = 'row',
33
+ children = null,
34
+ multilineGap = 'medium',
35
+ ...props
36
+ }) => {
37
+ const sharedClasses = [
38
+ [`dropin-skeleton-row__${variant}`, variant],
39
+ [`dropin-skeleton-row__${variant}-${size}`, variant && size],
40
+ ];
41
+
42
+ if (!children && variant === 'empty') {
43
+ return (
44
+ <div
45
+ className={classes([
46
+ 'dropin-skeleton-row dropin-skeleton-row__empty',
47
+ className,
48
+ ])}
49
+ />
50
+ );
51
+ }
52
+
53
+ if (children) {
54
+ const svg = children.trim();
55
+ return (
56
+ <div
57
+ {...props}
58
+ class={classes([
59
+ 'dropin-skeleton-row',
60
+ [`dropin-skeleton-row--full`, fullWidth],
61
+ className,
62
+ ])}
63
+ // eslint-disable-next-line react/no-danger
64
+ dangerouslySetInnerHTML={{ __html: svg }}
65
+ />
66
+ );
67
+ }
68
+
69
+ const isMultiline = lines > SINGLELINE;
70
+
71
+ if (isMultiline === false) {
72
+ return (
73
+ <div
74
+ {...props}
75
+ class={classes([
76
+ 'dropin-skeleton-row',
77
+ [`dropin-skeleton-row--full`, fullWidth],
78
+ 'dropin-skeleton--row__content',
79
+ ...sharedClasses,
80
+ className,
81
+ ])}
82
+ />
83
+ );
84
+ }
85
+
86
+ return (
87
+ <div
88
+ {...props}
89
+ style={{ '--multiline-gap-spacing': `var(--spacing-${multilineGap})` }}
90
+ class={classes([
91
+ 'dropin-skeleton-row--multiline',
92
+ [`dropin-skeleton-row--full`, fullWidth],
93
+ className,
94
+ ])}
95
+ >
96
+ {Array.from({ length: lines }).map((_, index) => (
97
+ <div
98
+ key={index}
99
+ class={classes([
100
+ 'dropin-skeleton-row',
101
+ [`dropin-skeleton-row--full`, fullWidth],
102
+ 'dropin-skeleton--row__content',
103
+ ...sharedClasses,
104
+ ])}
105
+ />
106
+ ))}
107
+ </div>
108
+ );
109
+ };
110
+
111
+ export interface SkeletonProps
112
+ extends Omit<HTMLAttributes<HTMLDivElement>, 'size'> {
113
+ rowGap?: 'xsmall' | 'small' | 'medium' | 'big' | 'xbig';
114
+ }
115
+
116
+ export const Skeleton: FunctionComponent<SkeletonProps> = ({
117
+ className,
118
+ children,
119
+ rowGap = 'medium',
120
+ ...props
121
+ }) => {
122
+ return (
123
+ <div
124
+ style={{ '--row-gap-spacing': `var(--spacing-${rowGap})` }}
125
+ {...props}
126
+ className={classes(['dropin-skeleton', className])}
127
+ role="status"
128
+ aria-label="Loading..."
129
+ >
130
+ {children}
131
+ </div>
132
+ );
133
+ };
@@ -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/Skeleton/Skeleton';
@@ -0,0 +1,26 @@
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
+ .dropin-tag-container {
11
+ position: relative;
12
+ border-radius: 20px;
13
+ user-select: none;
14
+ padding: 8px 16px;
15
+ background-color: var(--color-neutral-400);
16
+ display: flex;
17
+ justify-content: center;
18
+ align-items: center;
19
+ }
20
+
21
+ .dropin-tag-container__label {
22
+ font: var(--type-details-caption-1-font);
23
+ letter-spacing: var(--type-details-overline-letter-spacing);
24
+ color: var(--color-neutral-800);
25
+ line-height: 21px;
26
+ }
@@ -0,0 +1,103 @@
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 { Tag, TagProps } from '@adobe-commerce/elsie/components';
13
+ import { expect } from '@storybook/test';
14
+
15
+ /**
16
+ * Use Tag components to display the message text inside.
17
+ */
18
+ export default {
19
+ title: 'Components/Tag',
20
+ component: Tag,
21
+ parameters: {
22
+ layout: 'centered',
23
+ a11y: {
24
+ config: {
25
+ rules: [{ id: 'color-contrast', enabled: false }],
26
+ },
27
+ },
28
+ },
29
+ args: {
30
+ label: 'Your Message',
31
+ children: '',
32
+ },
33
+ argTypes: {
34
+ label: {
35
+ control: 'text',
36
+ description:
37
+ 'Allows to enter custom text (ignored if `children` is set).',
38
+ },
39
+ children: {
40
+ control: 'text',
41
+ description: 'Overrides the label if provided. Accepts HTML or JSX.',
42
+ },
43
+ },
44
+ } as Meta<any>; // Using "any" as a workaround to accommodate the string type for the children prop
45
+
46
+ const Template: StoryObj<TagProps> = {
47
+ render: (args) => (
48
+ <Tag {...args}>
49
+ {/* This workaround allows children to be edited as plain text in Storybook */}
50
+ {args.children && typeof args.children === 'string' ? (
51
+ <span dangerouslySetInnerHTML={{ __html: args.children }} />
52
+ ) : undefined}
53
+ </Tag>
54
+ ),
55
+ };
56
+
57
+ type Story = StoryObj<TagProps>;
58
+
59
+ export const Default: Story = {
60
+ ...Template,
61
+ args: { label: 'Custom Message' },
62
+ play: async () => {
63
+ const tagElement = document.querySelector(
64
+ '.dropin-tag-container'
65
+ ) as HTMLElement;
66
+ const label = tagElement.querySelector('.dropin-tag-container__label');
67
+
68
+ await expect(tagElement).toBeVisible();
69
+ await expect(label).toHaveTextContent('Custom Message');
70
+ },
71
+ };
72
+
73
+ export const WithUppercase = {
74
+ ...Template,
75
+ args: { label: 'SHIPPING' },
76
+ play: async () => {
77
+ const tagElement = document.querySelector(
78
+ '.dropin-tag-container'
79
+ ) as HTMLElement;
80
+ const label = tagElement.querySelector('.dropin-tag-container__label');
81
+
82
+ await expect(tagElement).toBeVisible();
83
+ await expect(label).toHaveTextContent('SHIPPING');
84
+ },
85
+ };
86
+
87
+ export const WithChildren = {
88
+ ...Template,
89
+ args: {
90
+ label: '',
91
+ children: 'CHILDREN TEXT &nbsp;<button aria-label="Close tag">X</button>',
92
+ },
93
+ play: async () => {
94
+ const tagElement = document.querySelector(
95
+ '.dropin-tag-container'
96
+ ) as HTMLElement;
97
+ const actionButton = tagElement.querySelector('button');
98
+
99
+ await expect(tagElement).toBeVisible();
100
+ await expect(tagElement).toHaveTextContent('CHILDREN TEXT');
101
+ await expect(actionButton).toBeVisible();
102
+ },
103
+ };
@@ -0,0 +1,38 @@
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 { classes } from '@adobe-commerce/elsie/lib';
12
+ import { HTMLAttributes } from 'preact/compat';
13
+ import '@adobe-commerce/elsie/components/Tag/Tag.css';
14
+
15
+ export interface TagProps
16
+ extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'icon'> {
17
+ label?: string;
18
+ children?: VNode | VNode[];
19
+ }
20
+
21
+ export const Tag: FunctionComponent<TagProps> = ({
22
+ label,
23
+ className,
24
+ children,
25
+ ...props
26
+ }) => {
27
+ if (!label && !children) return null;
28
+
29
+ return (
30
+ <div
31
+ {...props}
32
+ className={classes(['dropin-tag-container', className])}
33
+ data-testid="dropin-tag-container"
34
+ >
35
+ {children ?? <span className="dropin-tag-container__label">{label}</span>}
36
+ </div>
37
+ );
38
+ };
@@ -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/Tag/Tag';
11
+ export { Tag as default } from '@adobe-commerce/elsie/components/Tag/Tag';
@@ -0,0 +1,140 @@
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
+ .dropin-textarea-container {
11
+ position: relative;
12
+ }
13
+
14
+ .dropin-textarea.dropin-textarea--error {
15
+ border: var(--shape-border-width-1) solid var(--color-alert-800);
16
+ }
17
+
18
+ .dropin-textarea.dropin-textarea--error .dropin-textarea__label--floating {
19
+ color: var(--color-alert-800);
20
+ }
21
+
22
+ .dropin-textarea__label--floating {
23
+ font: var(--type-body-2-default-font);
24
+ letter-spacing: var(--type-body-2-default-letter-spacing);
25
+ color: var(--color-neutral-700);
26
+ position: absolute;
27
+ top: 18px;
28
+ left: 17px;
29
+ transition: all 0.2s;
30
+ }
31
+
32
+ .dropin-textarea {
33
+ margin: 0;
34
+ padding: 0;
35
+ border: none;
36
+ outline: none;
37
+ resize: none;
38
+ box-shadow: none;
39
+ font: inherit;
40
+ color: inherit;
41
+ background: none;
42
+ overflow: hidden;
43
+ width: 100%;
44
+ }
45
+
46
+ .dropin-textarea {
47
+ border: 1px solid var(--color-neutral-500);
48
+ box-sizing: border-box;
49
+ }
50
+
51
+ .dropin-textarea {
52
+ font: var(--type-body-2-default-font);
53
+ letter-spacing: var(--type-body-2-default-letter-spacing);
54
+ color: var(--color-neutral-800, #3d3d3d);
55
+ min-height: 200px;
56
+ padding: var(--spacing-big) var(--spacing-small);
57
+ border-radius: var(--shape-border-radius-1);
58
+ transition: border-color 0.2s;
59
+ scrollbar-color: var(--color-neutral-500) transparent;
60
+ scrollbar-width: thin;
61
+ overflow-y: hidden;
62
+ }
63
+
64
+ .dropin-textarea::-webkit-scrollbar {
65
+ width: 12px;
66
+ background-color: transparent;
67
+ }
68
+
69
+ .dropin-textarea:disabled {
70
+ border-top-left-radius: var(--shape-border-radius-1);
71
+ border-top-right-radius: var(--shape-border-radius-1);
72
+ border-color: var(--color-neutral-500);
73
+ background-color: var(--color-neutral-300);
74
+ color: var(--color-neutral-500);
75
+ }
76
+
77
+ .dropin-textarea:disabled::-webkit-input-placeholder {
78
+ /* WebKit browsers */
79
+ color: var(--color-neutral-500);
80
+ }
81
+ .dropin-textarea:disabled:-moz-placeholder {
82
+ /* Mozilla Firefox 4 to 18 */
83
+ color: var(--color-neutral-500);
84
+ }
85
+ .dropin-textarea:disabled::-moz-placeholder {
86
+ /* Mozilla Firefox 19+ */
87
+ color: var(--color-neutral-500);
88
+ }
89
+ .dropin-textarea:disabled:-ms-input-placeholder {
90
+ /* Internet Explorer 10+ */
91
+ color: var(--color-neutral-500);
92
+ }
93
+
94
+ .dropin-textarea::placeholder {
95
+ color: var(--color-neutral-700);
96
+ opacity: 0;
97
+ transition: color 0.2s, opacity 0.2s;
98
+ }
99
+
100
+ .dropin-textarea:focus {
101
+ border-color: var(--color-neutral-800, #3d3d3d);
102
+ border-radius: var(--shape-border-radius-1);
103
+ }
104
+
105
+ .dropin-textarea:focus::placeholder {
106
+ color: var(--color-neutral-700);
107
+ opacity: 0.8;
108
+ }
109
+
110
+ .dropin-textarea:not(:placeholder-shown) + .dropin-textarea__label--floating,
111
+ .dropin-textarea:focus + .dropin-textarea__label--floating {
112
+ font: var(--type-details-caption-2-font);
113
+ letter-spacing: var(--type-details-caption-1-letter-spacing);
114
+ color: var(--color-neutral-700, #666666);
115
+ transition: all 0.2s;
116
+ touch-action: manipulation;
117
+ top: 1px;
118
+ left: 1px;
119
+ width: 99%;
120
+ background-color: var(--color-neutral-50);
121
+ border-radius: var(--shape-border-radius-1);
122
+ height: 30px;
123
+ padding: 12px 16px 0;
124
+ box-sizing: border-box;
125
+ }
126
+
127
+ .dropin-textarea:focus + .dropin-textarea__label--floating {
128
+ color: var(--color-neutral-800);
129
+ }
130
+
131
+ .dropin-textarea:focus-visible {
132
+ outline: none;
133
+ }
134
+
135
+ .dropin-textarea__label--floating--error {
136
+ font: var(--type-details-caption-1-font);
137
+ letter-spacing: var(--type-details-caption-1-letter-spacing);
138
+ color: var(--color-alert-800);
139
+ padding-top: var(--spacing-xsmall);
140
+ }
@@ -0,0 +1,130 @@
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 { TextArea, TextAreaProps } from '@adobe-commerce/elsie/components/TextArea';
13
+ import { expect, userEvent, within } from '@storybook/test';
14
+ import { useState, useCallback } from 'preact/hooks';
15
+
16
+ export default {
17
+ title: 'Components/TextArea',
18
+ component: TextArea,
19
+ parameters: {
20
+ layout: 'centered',
21
+ a11y: {
22
+ config: {
23
+ rules: [{ id: 'color-contrast', enabled: false }],
24
+ },
25
+ },
26
+ },
27
+ args: {
28
+ label: 'Your Message',
29
+ name: 'message',
30
+ errorMessage: '',
31
+ value: '',
32
+ },
33
+ argTypes: {
34
+ label: {
35
+ control: 'text',
36
+ description: 'Input field label, indicating expected information.',
37
+ },
38
+ name: {
39
+ control: 'text',
40
+ description:
41
+ 'Unique name attribute for the input, used in form submissions.',
42
+ },
43
+ errorMessage: {
44
+ control: 'text',
45
+ description: 'Error messages.',
46
+ },
47
+ value: {
48
+ control: 'text',
49
+ description: 'Field textarea value.',
50
+ },
51
+ disabled: {
52
+ description: 'disable textarea field',
53
+ control: 'boolean',
54
+ },
55
+ onChange: {
56
+ action: 'clicked',
57
+ defaultValue: () => {
58
+ console.info('onChange');
59
+ },
60
+ description:
61
+ 'Function called when the value of the input changes. It is used to capture and handle the input data.',
62
+ },
63
+ onBlur: {
64
+ action: 'clicked',
65
+ defaultValue: () => {
66
+ console.info('onBlur');
67
+ },
68
+ description:
69
+ 'Function called when the input loses focus. This can be used to trigger validation or other effects when the user moves away from the input field.',
70
+ },
71
+ },
72
+ } as Meta<TextAreaProps>;
73
+
74
+ const Template: StoryObj<TextAreaProps> = {
75
+ render: (args) => {
76
+ const [value, setValue] = useState(args.value);
77
+
78
+ const setTextAreaValue = useCallback((event) => {
79
+ setValue(event.target.value);
80
+ }, []);
81
+
82
+ return <TextArea {...args} value={value} onChange={setTextAreaValue} />;
83
+ },
84
+ };
85
+
86
+ export const DefaultWithValue = {
87
+ ...Template,
88
+ parameters: {
89
+ layout: 'centered',
90
+ a11y: {
91
+ config: {
92
+ rules: [{ id: 'color-contrast', enabled: false }],
93
+ },
94
+ },
95
+ },
96
+ args: {
97
+ label: 'Your Message',
98
+ name: 'message',
99
+ value: 'Initial',
100
+ },
101
+ play: async ({ canvasElement }) => {
102
+ const canvas = within(canvasElement);
103
+ const inputField = document.querySelector('textarea') as HTMLElement;
104
+ await userEvent.type(inputField, ' Storybook Test Text! input max length');
105
+ await expect(
106
+ await canvas.findByDisplayValue(
107
+ 'Initial Storybook Test Text! input max length'
108
+ )
109
+ ).toBeTruthy();
110
+ await userEvent.clear(inputField);
111
+ await expect(await canvas.findByDisplayValue('')).toBeTruthy();
112
+ },
113
+ };
114
+
115
+ export const WithError = {
116
+ ...Template,
117
+ parameters: {
118
+ layout: 'centered',
119
+ a11y: {
120
+ config: {
121
+ rules: [{ id: 'color-contrast', enabled: false }],
122
+ },
123
+ },
124
+ },
125
+ args: {
126
+ label: 'Your Message',
127
+ name: 'message',
128
+ errorMessage: 'Message cannot be empty',
129
+ },
130
+ };
@@ -0,0 +1,89 @@
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 { classes } from '@adobe-commerce/elsie/lib';
12
+ import { HTMLAttributes } from 'preact/compat';
13
+ import '@adobe-commerce/elsie/components/TextArea/TextArea.css';
14
+ import { useRef, useEffect, useId } from 'preact/hooks';
15
+
16
+ export interface TextAreaProps extends HTMLAttributes<HTMLTextAreaElement> {
17
+ id?: string;
18
+ name?: string;
19
+ disabled?: boolean;
20
+ errorMessage?: string;
21
+ }
22
+
23
+ export const TextArea: FunctionComponent<TextAreaProps> = ({
24
+ disabled,
25
+ name = '',
26
+ errorMessage,
27
+ value,
28
+ label,
29
+ className,
30
+ onChange,
31
+ onBlur,
32
+ ...props
33
+ }) => {
34
+ const textareaRef = useRef<HTMLTextAreaElement | null>(null);
35
+ const id = useId();
36
+ const error = !!errorMessage?.length;
37
+
38
+ useEffect(() => {
39
+ const textArea = textareaRef.current;
40
+ if (!textArea) return;
41
+
42
+ textArea.style.height = 'auto';
43
+ textArea.style.height = `${textArea.scrollHeight}px`;
44
+ }, [value]);
45
+
46
+ return (
47
+ <div
48
+ className={classes(['dropin-textarea-container', className])}
49
+ data-testid="dropin-textarea-container"
50
+ >
51
+ <textarea
52
+ ref={textareaRef}
53
+ data-testid="dropin-textarea-field"
54
+ className={classes([
55
+ 'dropin-textarea',
56
+ [`dropin-textarea--error`, error],
57
+ ['dropin-textarea--disabled', !!disabled],
58
+ ])}
59
+ id={id}
60
+ placeholder={label}
61
+ name={name}
62
+ value={value}
63
+ disabled={disabled}
64
+ onBlur={onBlur}
65
+ onChange={onChange}
66
+ {...props}
67
+ />
68
+ <label
69
+ htmlFor={id}
70
+ className={classes([
71
+ `dropin-textarea__label--floating`,
72
+ [`dropin-textarea__label--floating--error`, error],
73
+ ])}
74
+ >
75
+ {label}
76
+ </label>
77
+ {error ? (
78
+ <div
79
+ className={classes([
80
+ `dropin-textarea__label--floating--text`,
81
+ [`dropin-textarea__label--floating--error`, error],
82
+ ])}
83
+ >
84
+ {errorMessage}
85
+ </div>
86
+ ) : null}
87
+ </div>
88
+ );
89
+ };
@@ -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/TextArea/TextArea';
11
+ export { TextArea as default } from '@adobe-commerce/elsie/components/TextArea/TextArea';