@adobe-commerce/elsie 2.0.0 → 2.0.1-alpha-20260728135101

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 (249) hide show
  1. package/.elsie.js +3 -3
  2. package/CHANGELOG.md +385 -112
  3. package/LICENSE.md +257 -157
  4. package/README.md +4 -2
  5. package/__mocks__/svg.js +3 -3
  6. package/bin/builders/build/index.js +2 -1
  7. package/bin/builders/changeset/index.js +1 -1
  8. package/bin/builders/concurrently/index.js +1 -1
  9. package/bin/builders/generate/api/index.js +7 -7
  10. package/bin/builders/generate/component/index.js +8 -8
  11. package/bin/builders/generate/config/index.js +5 -5
  12. package/bin/builders/generate/config/templates/elsie.js +1 -1
  13. package/bin/builders/generate/container/index.js +7 -7
  14. package/bin/builders/generate/index.js +36 -36
  15. package/bin/builders/gql/index.js +28 -28
  16. package/bin/builders/gql/validate.js +116 -105
  17. package/bin/builders/lint/index.js +1 -1
  18. package/bin/builders/serve/index.js +1 -1
  19. package/bin/builders/storybook/index.js +9 -1
  20. package/bin/builders/types/index.js +1 -2
  21. package/bin/builders/types/validate-tsconfig.js +5 -5
  22. package/bin/index.js +12 -6
  23. package/bin/lib/cli.js +9 -8
  24. package/bin/lib/resolve-bin.js +9 -0
  25. package/bin/lib/validate-typeof.js +3 -3
  26. package/bin/lib/write-file.js +3 -3
  27. package/bin/lib/write-parent-index.js +4 -4
  28. package/config/eslint.mjs +2 -1
  29. package/config/jest.mjs +7 -2
  30. package/config/plugins/dts-normalize-relative-replacer.cjs +1 -1
  31. package/config/plugins/dts.mjs +4 -3
  32. package/config/prettier.json +25 -3
  33. package/config/setEnvVars.mjs +2 -2
  34. package/config/storybook/addon.js +5 -5
  35. package/config/storybook/components/FileTree/FileTree.jsx +4 -4
  36. package/config/storybook/components/FileTree/index.js +4 -4
  37. package/config/storybook/components/Flex/Flex.jsx +3 -3
  38. package/config/storybook/components/Flex/index.js +3 -3
  39. package/config/storybook/components/OptionsTable/OptionsTable.jsx +3 -3
  40. package/config/storybook/components/OptionsTable/index.js +4 -4
  41. package/config/storybook/components/Panel/Panel.tsx +7 -7
  42. package/config/storybook/components/Panel/index.ts +3 -3
  43. package/config/storybook/components/Screenshot/Screenshot.jsx +3 -3
  44. package/config/storybook/components/Screenshot/index.js +4 -4
  45. package/config/storybook/components/Steps/Steps.jsx +3 -3
  46. package/config/storybook/components/Steps/index.js +4 -4
  47. package/config/storybook/components/StoryWrapper/StoryWrapper.jsx +3 -3
  48. package/config/storybook/components/StoryWrapper/index.js +3 -3
  49. package/config/storybook/components/Summary/Summary.jsx +3 -3
  50. package/config/storybook/components/Summary/index.js +3 -3
  51. package/config/storybook/components/Variants/Variants.jsx +11 -7
  52. package/config/storybook/components/Variants/index.js +3 -3
  53. package/config/storybook/manager.js +3 -3
  54. package/config/storybook/preview.jsx +3 -3
  55. package/config/storybook/theming/fonts.css +12 -4
  56. package/config/storybook/theming/preview.css +3 -1
  57. package/config/storybook/theming/theme.js +3 -3
  58. package/config/vite.mjs +53 -26
  59. package/package.json +36 -34
  60. package/src/components/Accordion/Accordion.css +1 -1
  61. package/src/components/Accordion/Accordion.stories.tsx +18 -18
  62. package/src/components/Accordion/Accordion.tsx +12 -8
  63. package/src/components/Accordion/index.ts +3 -3
  64. package/src/components/ActionButton/ActionButton.stories.tsx +8 -8
  65. package/src/components/ActionButton/ActionButton.tsx +7 -5
  66. package/src/components/ActionButton/index.ts +3 -3
  67. package/src/components/ActionButtonGroup/ActionButtonGroup.stories.tsx +3 -3
  68. package/src/components/ActionButtonGroup/ActionButtonGroup.tsx +2 -2
  69. package/src/components/ActionButtonGroup/index.ts +3 -3
  70. package/src/components/AlertBanner/AlertBanner.stories.tsx +6 -6
  71. package/src/components/AlertBanner/AlertBanner.tsx +12 -10
  72. package/src/components/AlertBanner/index.ts +3 -3
  73. package/src/components/Breadcrumbs/Breadcrumbs.stories.tsx +14 -14
  74. package/src/components/Breadcrumbs/Breadcrumbs.tsx +3 -3
  75. package/src/components/Breadcrumbs/index.ts +3 -3
  76. package/src/components/Button/Button.mdx +24 -11
  77. package/src/components/Button/Button.stories.tsx +6 -6
  78. package/src/components/Button/Button.tsx +7 -8
  79. package/src/components/Button/index.ts +3 -3
  80. package/src/components/Card/Card.stories.tsx +6 -6
  81. package/src/components/Card/Card.tsx +3 -3
  82. package/src/components/Card/index.ts +3 -3
  83. package/src/components/CartItem/CartItem.stories.tsx +12 -12
  84. package/src/components/CartItem/CartItem.tsx +4 -2
  85. package/src/components/CartItem/CartItemSkeleton.tsx +3 -3
  86. package/src/components/CartItem/index.ts +3 -3
  87. package/src/components/CartList/CartList.tsx +3 -3
  88. package/src/components/CartList/index.ts +3 -3
  89. package/src/components/Checkbox/Checkbox.stories.tsx +17 -14
  90. package/src/components/Checkbox/Checkbox.tsx +8 -6
  91. package/src/components/Checkbox/index.ts +3 -3
  92. package/src/components/ColorSwatch/ColorSwatch.css +8 -4
  93. package/src/components/ColorSwatch/ColorSwatch.stories.tsx +6 -6
  94. package/src/components/ColorSwatch/ColorSwatch.tsx +8 -6
  95. package/src/components/ColorSwatch/index.ts +3 -3
  96. package/src/components/ContentGrid/ContentGrid.css +15 -15
  97. package/src/components/ContentGrid/ContentGrid.stories.tsx +4 -4
  98. package/src/components/ContentGrid/ContentGrid.tsx +3 -3
  99. package/src/components/ContentGrid/index.ts +3 -3
  100. package/src/components/Divider/Divider.stories.tsx +7 -4
  101. package/src/components/Divider/Divider.tsx +3 -3
  102. package/src/components/Divider/index.ts +4 -4
  103. package/src/components/Field/Field.stories.tsx +7 -7
  104. package/src/components/Field/Field.tsx +4 -2
  105. package/src/components/Field/index.ts +3 -3
  106. package/src/components/Header/Header.stories.tsx +9 -10
  107. package/src/components/Header/Header.tsx +11 -7
  108. package/src/components/Header/index.ts +3 -3
  109. package/src/components/Icon/Icon.stories.helpers.jsx +4 -4
  110. package/src/components/Icon/Icon.stories.tsx +74 -60
  111. package/src/components/Icon/Icon.tsx +77 -44
  112. package/src/components/Icon/index.ts +3 -3
  113. package/src/components/IllustratedMessage/IllustratedMessage.stories.tsx +8 -8
  114. package/src/components/IllustratedMessage/IllustratedMessage.tsx +7 -5
  115. package/src/components/IllustratedMessage/index.ts +3 -3
  116. package/src/components/Image/Image.stories.tsx +3 -3
  117. package/src/components/Image/Image.tsx +4 -4
  118. package/src/components/Image/index.ts +3 -3
  119. package/src/components/ImageSwatch/ImageSwatch.css +8 -4
  120. package/src/components/ImageSwatch/ImageSwatch.stories.tsx +10 -10
  121. package/src/components/ImageSwatch/ImageSwatch.tsx +25 -23
  122. package/src/components/ImageSwatch/index.ts +3 -3
  123. package/src/components/InLineAlert/InLineAlert.stories.tsx +12 -7
  124. package/src/components/InLineAlert/InLineAlert.tsx +4 -2
  125. package/src/components/InLineAlert/index.ts +3 -3
  126. package/src/components/Incrementer/Incrementer.stories.tsx +9 -9
  127. package/src/components/Incrementer/Incrementer.tsx +75 -37
  128. package/src/components/Incrementer/index.ts +3 -3
  129. package/src/components/Input/Input.css +4 -1
  130. package/src/components/Input/Input.stories.tsx +5 -5
  131. package/src/components/Input/Input.tsx +5 -3
  132. package/src/components/Input/index.ts +3 -3
  133. package/src/components/InputDate/InputDate.tsx +3 -3
  134. package/src/components/InputDate/index.ts +3 -3
  135. package/src/components/InputFile/InputFile.css +16 -16
  136. package/src/components/InputFile/InputFile.stories.tsx +21 -16
  137. package/src/components/InputFile/InputFile.tsx +8 -6
  138. package/src/components/InputFile/index.ts +5 -5
  139. package/src/components/InputPassword/InputPassword.stories.tsx +4 -4
  140. package/src/components/InputPassword/InputPassword.tsx +5 -4
  141. package/src/components/InputPassword/PasswordStatusIndicator/PasswordStatusIndicator.tsx +1 -1
  142. package/src/components/InputPassword/PasswordStatusIndicator/index.ts +3 -3
  143. package/src/components/InputPassword/index.ts +3 -3
  144. package/src/components/Modal/Modal.stories.tsx +27 -16
  145. package/src/components/Modal/Modal.tsx +10 -11
  146. package/src/components/Modal/index.ts +3 -3
  147. package/src/components/MultiSelect/MultiSelect.stories.tsx +15 -15
  148. package/src/components/MultiSelect/MultiSelect.tsx +15 -15
  149. package/src/components/Pagination/Pagination.css +1 -1
  150. package/src/components/Pagination/Pagination.stories.tsx +0 -1
  151. package/src/components/Pagination/Pagination.tsx +17 -12
  152. package/src/components/Pagination/PaginationButton.tsx +2 -3
  153. package/src/components/Pagination/index.ts +3 -3
  154. package/src/components/Picker/Picker.css +3 -1
  155. package/src/components/Picker/Picker.stories.tsx +1 -1
  156. package/src/components/Picker/Picker.tsx +8 -6
  157. package/src/components/Picker/index.ts +3 -3
  158. package/src/components/Portal/Portal.stories.tsx +50 -44
  159. package/src/components/Portal/Portal.tsx +4 -4
  160. package/src/components/Price/Price.stories.tsx +3 -3
  161. package/src/components/Price/Price.tsx +4 -2
  162. package/src/components/Price/index.ts +3 -3
  163. package/src/components/PriceRange/PriceRange.stories.tsx +3 -3
  164. package/src/components/PriceRange/PriceRange.tsx +8 -6
  165. package/src/components/PriceRange/index.ts +3 -3
  166. package/src/components/ProductItemCard/ProductItemCard.tsx +4 -2
  167. package/src/components/ProductItemCard/ProductItemCardSkeleton.tsx +16 -16
  168. package/src/components/ProductItemCard/index.ts +4 -4
  169. package/src/components/ProgressSpinner/ProgressSpinner.stories.tsx +8 -8
  170. package/src/components/ProgressSpinner/ProgressSpinner.tsx +7 -5
  171. package/src/components/ProgressSpinner/index.ts +3 -3
  172. package/src/components/RadioButton/RadioButton.stories.tsx +1 -1
  173. package/src/components/RadioButton/RadioButton.tsx +4 -2
  174. package/src/components/Skeleton/Skeleton.stories.tsx +4 -4
  175. package/src/components/Skeleton/Skeleton.tsx +11 -7
  176. package/src/components/Skeleton/index.ts +3 -3
  177. package/src/components/Table/Table.css +106 -99
  178. package/src/components/Table/Table.stories.tsx +404 -227
  179. package/src/components/Table/Table.tsx +11 -7
  180. package/src/components/Table/index.ts +4 -4
  181. package/src/components/Tag/Tag.stories.tsx +6 -6
  182. package/src/components/Tag/Tag.tsx +7 -5
  183. package/src/components/Tag/index.ts +3 -3
  184. package/src/components/TextArea/TextArea.css +3 -1
  185. package/src/components/TextArea/TextArea.stories.tsx +9 -6
  186. package/src/components/TextArea/TextArea.tsx +3 -3
  187. package/src/components/TextArea/index.ts +3 -3
  188. package/src/components/TextSwatch/TextSwatch.css +4 -2
  189. package/src/components/TextSwatch/TextSwatch.stories.tsx +8 -8
  190. package/src/components/TextSwatch/TextSwatch.tsx +12 -7
  191. package/src/components/TextSwatch/index.ts +3 -3
  192. package/src/components/ToggleButton/ToggleButton.css +6 -2
  193. package/src/components/ToggleButton/ToggleButton.stories.tsx +10 -6
  194. package/src/components/ToggleButton/ToggleButton.tsx +8 -3
  195. package/src/components/ToggleButton/index.ts +3 -3
  196. package/src/components/UIProvider/UIProvider.css +3 -2
  197. package/src/components/UIProvider/UIProvider.tsx +11 -7
  198. package/src/components/UIProvider/debugger.css +5 -6
  199. package/src/components/UIProvider/index.ts +3 -3
  200. package/src/docs/API/event-bus.mdx +64 -37
  201. package/src/docs/API/graphql.mdx +69 -36
  202. package/src/docs/API/initializer.mdx +58 -35
  203. package/src/docs/API/render.mdx +45 -32
  204. package/src/docs/Design/colors.mdx +10 -12
  205. package/src/docs/Design/grid.mdx +41 -14
  206. package/src/docs/Design/overview.mdx +20 -4
  207. package/src/docs/Design/shapes.mdx +8 -7
  208. package/src/docs/Design/spacing.mdx +3 -1
  209. package/src/docs/Design/typography.mdx +3 -2
  210. package/src/docs/Utilities/VComponent.mdx +27 -10
  211. package/src/docs/Utilities/classList.mdx +7 -5
  212. package/src/docs/Utilities/debounce.mdx +6 -7
  213. package/src/docs/Utilities/getCookie.mdx +1 -2
  214. package/src/docs/Utilities/getFormErrors.mdx +1 -2
  215. package/src/docs/Utilities/getFormValues.mdx +1 -2
  216. package/src/docs/Utilities/getPathValue.mdx +2 -4
  217. package/src/docs/Utilities/links.mdx +16 -7
  218. package/src/docs/cli-usage.mdx +8 -3
  219. package/src/docs/components/overview.mdx +14 -4
  220. package/src/docs/quick-start.mdx +69 -22
  221. package/src/docs/slots.mdx +74 -37
  222. package/src/docs/welcome.mdx +13 -4
  223. package/src/i18n/index.ts +3 -3
  224. package/src/lib/aem/assets.ts +9 -9
  225. package/src/lib/aem/configs.ts +16 -8
  226. package/src/lib/classes.ts +4 -4
  227. package/src/lib/config.ts +3 -3
  228. package/src/lib/debounce.ts +3 -3
  229. package/src/lib/deepmerge.ts +6 -13
  230. package/src/lib/deviceUtils.ts +3 -3
  231. package/src/lib/form-values.ts +3 -3
  232. package/src/lib/get-price-formatter.ts +8 -3
  233. package/src/lib/i18n.ts +3 -3
  234. package/src/lib/image-params-keymap.ts +4 -5
  235. package/src/lib/initializer.ts +11 -12
  236. package/src/lib/is-number.ts +3 -3
  237. package/src/lib/locale-config.ts +4 -4
  238. package/src/lib/render.tsx +14 -8
  239. package/src/lib/resolve-image.ts +19 -16
  240. package/src/lib/signals.ts +4 -4
  241. package/src/lib/slot.tsx +34 -27
  242. package/src/lib/tests.tsx +6 -8
  243. package/src/lib/types.ts +3 -3
  244. package/src/lib/vcomponent.tsx +3 -3
  245. package/src/shims/importmap.js +3107 -20
  246. package/static/assets/images/index.ts +3 -3
  247. package/storybook-stories.js +3 -3
  248. package/tests/__mocks__/browserMocks.ts +3 -3
  249. package/tests/__mocks__/fileMocks.ts +3 -3
package/CHANGELOG.md CHANGED
@@ -1,59 +1,108 @@
1
1
  # @adobe-commerce/elsie
2
2
 
3
+ ## 2.0.1-alpha-20260728135101
4
+
5
+ ### Patch Changes
6
+
7
+ - 7e84f40: chore: migrate build tooling from Yarn to pnpm
8
+
9
+ The monorepo now uses pnpm instead of Yarn v1. As part of this, elsie's CLI
10
+ (`lint`/`test`/`storybook`/`changeset`/`types`) no longer shells out to bare
11
+ command names — each tool is resolved and spawned directly, fixing a latent
12
+ path-with-spaces bug and command-injection surface.
13
+
14
+ - a920177: fix(Incrementer): prevent quantity input flicker during in-progress
15
+ typing, and prevent double onValue call when debounce fires before blur
16
+
3
17
  ## 2.0.0
4
18
 
5
19
  ### Major Changes
6
20
 
7
21
  - ea02d5f: Upgrade Jest to 30.4.2 and Storybook to 10.4.0
8
22
 
9
- Updated testing and component development tools to latest stable versions. Jest 30.4.2 provides enhanced snapshot handling and improved test performance. Storybook 10.4.0 includes updated addon ecosystem, improved Preact Vite integration, and enhanced accessibility features with addon-a11y and addon-coverage support.
23
+ Updated testing and component development tools to latest stable versions.
24
+ Jest 30.4.2 provides enhanced snapshot handling and improved test performance.
25
+ Storybook 10.4.0 includes updated addon ecosystem, improved Preact Vite
26
+ integration, and enhanced accessibility features with addon-a11y and
27
+ addon-coverage support.
10
28
 
11
29
  - 9cd299b: Upgrade TypeScript to 6.0 and ESLint to 9 (flat config)
12
30
 
13
31
  ## What changed
14
32
 
15
33
  ### TypeScript 4.7 → 6.0
16
-
17
- - `tsconfig-base.json` updated with correct TS 6 defaults. Two new-default opt-outs are deferred as tech debt: `exactOptionalPropertyTypes` and `verbatimModuleSyntax`.
18
- - `moduleResolution` changed from `"nodenext"` to `"bundler"` across all packages — the correct pairing for `module: "esnext"` in a Vite monorepo. Only `packages/elsie` keeps `"NodeNext"` (paired with `module: "NodeNext"` for its dual CJS/ESM output).
19
- - `baseUrl` removed from all tsconfigs (deprecated in TS 6; `paths` resolves relative to the tsconfig file directly).
20
- - `rootDir` added explicitly to `build-tools`, `event-bus`, `fetch-graphql`, and `recaptcha` tsconfigs (implicit `rootDir` deprecated in TS 6).
21
- - `types: []` set in `tsconfig-base.json` to prevent ambient test types from leaking into declaration output. Each package's own `tsconfig.json` declares its `types` explicitly (`jest`, `node`, `vite/client`, etc.).
22
- - `babel-plugin-tsconfig-paths` removed it was a no-op in every package that listed it.
23
- - `noUncheckedIndexedAccess` enabled violations were few enough to fix in source.
34
+ - `tsconfig-base.json` updated with correct TS 6 defaults. Two new-default
35
+ opt-outs are deferred as tech debt: `exactOptionalPropertyTypes` and
36
+ `verbatimModuleSyntax`.
37
+ - `moduleResolution` changed from `"nodenext"` to `"bundler"` across all
38
+ packages the correct pairing for `module: "esnext"` in a Vite monorepo.
39
+ Only `packages/elsie` keeps `"NodeNext"` (paired with `module: "NodeNext"`
40
+ for its dual CJS/ESM output).
41
+ - `baseUrl` removed from all tsconfigs (deprecated in TS 6; `paths` resolves
42
+ relative to the tsconfig file directly).
43
+ - `rootDir` added explicitly to `build-tools`, `event-bus`, `fetch-graphql`,
44
+ and `recaptcha` tsconfigs (implicit `rootDir` deprecated in TS 6).
45
+ - `types: []` set in `tsconfig-base.json` to prevent ambient test types from
46
+ leaking into declaration output. Each package's own `tsconfig.json` declares
47
+ its `types` explicitly (`jest`, `node`, `vite/client`, etc.).
48
+ - `babel-plugin-tsconfig-paths` removed — it was a no-op in every package that
49
+ listed it.
50
+ - `noUncheckedIndexedAccess` enabled — violations were few enough to fix in
51
+ source.
24
52
 
25
53
  ### ESLint 8 → 9 (flat config)
26
-
27
- - `@typescript-eslint/parser` and `@typescript-eslint/eslint-plugin` (v5) removed; replaced by the unified `typescript-eslint` v8 package.
54
+ - `@typescript-eslint/parser` and `@typescript-eslint/eslint-plugin` (v5)
55
+ removed; replaced by the unified `typescript-eslint` v8 package.
28
56
  - `eslint-config-preact` bumped to `^2.0.0` (ESLint 9 support).
29
57
  - `eslint-config-prettier` bumped to `^10.0.0`.
30
- - `eslint-plugin-mdx` bumped to `^3.8.1`. **ESLint 10 is not supported** — `eslint-plugin-mdx` vendors an internal ESLint API removed in v10; ESLint 9 is pinned until a fix is released.
58
+ - `eslint-plugin-mdx` bumped to `^3.8.1`. **ESLint 10 is not supported** —
59
+ `eslint-plugin-mdx` vendors an internal ESLint API removed in v10; ESLint 9
60
+ is pinned until a fix is released.
31
61
  - `globals` added (`^15.0.0`) for `languageOptions.globals` in flat config.
32
- - Shared config (`packages/elsie/config/eslint.mjs`) rewritten as a flat-config array export.
33
- - Per-package `.eslintrc.js` files deleted; replaced with `eslint.config.js` (ESM flat config).
34
- - Several `typescript-eslint` v8 rules disabled to preserve prior behavior: `no-explicit-any`, `ban-ts-comment`, `no-unused-expressions`, `no-unsafe-function-type`, `no-require-imports`, `no-empty-object-type`. Tracked as tech debt.
35
- - `reportUnusedDisableDirectives` disabled to avoid sweeping pre-existing inline disable comments.
62
+ - Shared config (`packages/elsie/config/eslint.mjs`) rewritten as a
63
+ flat-config array export.
64
+ - Per-package `.eslintrc.js` files deleted; replaced with `eslint.config.js`
65
+ (ESM flat config).
66
+ - Several `typescript-eslint` v8 rules disabled to preserve prior behavior:
67
+ `no-explicit-any`, `ban-ts-comment`, `no-unused-expressions`,
68
+ `no-unsafe-function-type`, `no-require-imports`, `no-empty-object-type`.
69
+ Tracked as tech debt.
70
+ - `reportUnusedDisableDirectives` disabled to avoid sweeping pre-existing
71
+ inline disable comments.
36
72
 
37
73
  ### `vite-plugin-dts` removed; replaced with custom `dtsPlugin`
38
74
 
39
- `vite-plugin-dts@3.9.1` declared a `typescript <5.0` peer range and its v5 successor was incompatible with this monorepo's layout (cross-package sources, workspace symlinks, multi-`outDir`). It was removed and replaced with a thin custom Vite plugin at `packages/elsie/config/plugins/dts.mjs` (`dtsPlugin`) that runs `tsc` directly. The resulting `dist/` layout is identical to what v3.9 produced (147 `.d.ts` files, 12 top-level entry shims).
75
+ `vite-plugin-dts@3.9.1` declared a `typescript <5.0` peer range and its v5
76
+ successor was incompatible with this monorepo's layout (cross-package sources,
77
+ workspace symlinks, multi-`outDir`). It was removed and replaced with a thin
78
+ custom Vite plugin at `packages/elsie/config/plugins/dts.mjs` (`dtsPlugin`)
79
+ that runs `tsc` directly. The resulting `dist/` layout is identical to what
80
+ v3.9 produced (147 `.d.ts` files, 12 top-level entry shims).
40
81
 
41
82
  ### Module format standardization
42
83
 
43
84
  All tooling config files now follow a consistent format:
44
85
 
45
- - **ESLint / Jest / Vite configs** — ESM (`.js` in `"type":"module"` packages; `.mjs` in elsie).
46
- - **Prettier** — JSON only (`@adobe-commerce/elsie/config/prettier.json` referenced via each package's `"prettier"` key). `prettier.config.*` files deleted from all packages.
86
+ - **ESLint / Jest / Vite configs** — ESM (`.js` in `"type":"module"` packages;
87
+ `.mjs` in elsie).
88
+ - **Prettier** — JSON only (`@adobe-commerce/elsie/config/prettier.json`
89
+ referenced via each package's `"prettier"` key). `prettier.config.*` files
90
+ deleted from all packages.
47
91
  - **elsie CLI** (`bin/**`) — intentionally stays CommonJS.
48
92
 
49
93
  See `architecture/decisions/009-module-format.md` for the full convention.
50
94
 
51
95
  ### `.elsie.js` → `.elsie.cjs`
52
96
 
53
- The consumer project config file is renamed from `.elsie.js` to `.elsie.cjs`. With `"type":"module"` now required in consumer packages, a plain `.js` file is treated as ES module — making `module.exports` a SyntaxError and making `require()` in the elsie CLI fail with `ERR_REQUIRE_ESM`. The `.cjs` extension forces CommonJS regardless of the package's `"type"` field.
97
+ The consumer project config file is renamed from `.elsie.js` to `.elsie.cjs`.
98
+ With `"type":"module"` now required in consumer packages, a plain `.js` file
99
+ is treated as ES module — making `module.exports` a SyntaxError and making
100
+ `require()` in the elsie CLI fail with `ERR_REQUIRE_ESM`. The `.cjs` extension
101
+ forces CommonJS regardless of the package's `"type"` field.
54
102
 
55
103
  - `elsie generate config` now writes `.elsie.cjs`.
56
- - The CLI (`bin/lib/config.js`) and `config/vite.mjs` both prefer `.elsie.cjs` and fall back to `.elsie.js` for packages not yet migrated.
104
+ - The CLI (`bin/lib/config.js`) and `config/vite.mjs` both prefer `.elsie.cjs`
105
+ and fall back to `.elsie.js` for packages not yet migrated.
57
106
  - `.elsie.cjs` added to `.npmignore` in all consumer packages.
58
107
 
59
108
  ## Consumer migration
@@ -61,20 +110,29 @@
61
110
  See `docs/elsie-v2-migration.md` for the full step-by-step guide. Key actions:
62
111
 
63
112
  1. Add `"type": "module"` to `package.json`.
64
- 2. Replace `.eslintrc.js` with `eslint.config.js` (ESM flat config importing from `@adobe-commerce/elsie/config/eslint.mjs`).
113
+ 2. Replace `.eslintrc.js` with `eslint.config.js` (ESM flat config importing
114
+ from `@adobe-commerce/elsie/config/eslint.mjs`).
65
115
  3. Rename `.elsie.js` → `.elsie.cjs` (keep `module.exports` content as-is).
66
- 4. Add `"prettier": "@adobe-commerce/elsie/config/prettier.json"` to `package.json`; delete `prettier.config.js`.
67
- 5. Update `tsconfig.json`: remove `baseUrl`, add explicit `rootDir` and `types`.
116
+ 4. Add `"prettier": "@adobe-commerce/elsie/config/prettier.json"` to
117
+ `package.json`; delete `prettier.config.js`.
118
+ 5. Update `tsconfig.json`: remove `baseUrl`, add explicit `rootDir` and
119
+ `types`.
68
120
  6. Add `tsconfig.build.json` for declaration emit (required by `dtsPlugin`).
69
- 7. Convert `.elsie.js` imports in `.storybook/main.js` and `storybook-stories.js` to reference `.elsie.cjs`.
121
+ 7. Convert `.elsie.js` imports in `.storybook/main.js` and
122
+ `storybook-stories.js` to reference `.elsie.cjs`.
70
123
 
71
124
  ### Minor Changes
72
125
 
73
126
  - c21a378: Add optional `cypress` export to shared ESLint config
74
127
 
75
- `cypress` is a new named export from `@adobe-commerce/elsie/config/eslint.mjs` that provides a pre-configured ESLint flat config for Cypress test files (`cypress/**/*.js`). It applies `eslint-plugin-cypress`'s recommended rules with `jest/expect-expect` turned off.
128
+ `cypress` is a new named export from `@adobe-commerce/elsie/config/eslint.mjs`
129
+ that provides a pre-configured ESLint flat config for Cypress test files
130
+ (`cypress/**/*.js`). It applies `eslint-plugin-cypress`'s recommended rules
131
+ with `jest/expect-expect` turned off.
76
132
 
77
- The plugin is declared as an optional peer dependency — `cypress` resolves to an empty array when `eslint-plugin-cypress` is not installed, so projects that don't use Cypress are unaffected.
133
+ The plugin is declared as an optional peer dependency — `cypress` resolves to
134
+ an empty array when `eslint-plugin-cypress` is not installed, so projects that
135
+ don't use Cypress are unaffected.
78
136
 
79
137
  ## Usage
80
138
 
@@ -95,41 +153,102 @@
95
153
  export default [...base, ...cypress, ...sourceImportRestrictions];
96
154
  ```
97
155
 
98
- - 9d558ed: Adds `window.DROPINS.showOverlays(state)` — a developer utility that visually outlines all dropin containers and slots on the page with labeled overlays, making it easier to understand how the storefront is composed at runtime.
156
+ - 9d558ed: Adds `window.DROPINS.showOverlays(state)` — a developer utility that
157
+ visually outlines all dropin containers and slots on the page with labeled
158
+ overlays, making it easier to understand how the storefront is composed at
159
+ runtime.
99
160
 
100
- `DROPINS.showSlots()` is deprecated in favor of `showOverlays()` and will log a console warning when called.
161
+ `DROPINS.showSlots()` is deprecated in favor of `showOverlays()` and will log
162
+ a console warning when called.
101
163
 
102
164
  - c25a5d7: feat(elsie): add `changeset` builder command
103
165
 
104
- Adds `elsie changeset` as a first-class CLI command, wrapping `@changesets/cli`. All subcommands pass through transparently (`status`, `version`, `publish`, `--snapshot`, etc.). `@changesets/cli` is now a dependency of elsie, so consumers no longer need to install it separately.
166
+ Adds `elsie changeset` as a first-class CLI command, wrapping
167
+ `@changesets/cli`. All subcommands pass through transparently (`status`,
168
+ `version`, `publish`, `--snapshot`, etc.). `@changesets/cli` is now a
169
+ dependency of elsie, so consumers no longer need to install it separately.
105
170
 
106
- - 005edc7: Adds validation to the Incrementer component when the field is changed to "empty".
171
+ - 005edc7: Adds validation to the Incrementer component when the field is
172
+ changed to "empty".
107
173
 
108
174
  ### Patch Changes
109
175
 
110
- - bf352d2: Fix InputDate showing wrong format after selecting a date from the calendar
111
- - 4c3d82d: fix(field): associate error messages with inputs via aria-describedby (WCAG 3.3.1)
112
- - 36354d9: Add disableWhenSingle prop to Picker; defaults to true (preserves existing behavior). Pass false to keep the picker interactive when only one option is available.
113
- - 09c2100: Declare `preact` as a runtime dependency. It previously sat in `devDependencies` (unlike `@preact/signals` and `preact-i18n`), so standalone consumers of `@adobe-commerce/elsie` had an unmet `preact` — also the unmet peer of `@preact/preset-vite`, `@storybook/preact-vite` and `@testing-library/preact`. It now resolves to the same `~10.22.1` bundled into `@dropins/tools`. The emitted bundle is unchanged.
114
- - 4641ab0: Fix `Field` and `InLineAlert` status/error messages not being announced by screen readers. `Field`'s description/hint element now always carries `role="status"` and `aria-live="polite"`, instead of only adding `aria-live` once an error appeared, so assistive technology reliably announces validation and success messages (WCAG 4.1.3). `InLineAlert` now sets `role="alert"`/`aria-live="assertive"` for `type="error"` and `role="status"`/`aria-live="polite"` for `success`/`warning`, since it previously had no live-region semantics at all.
115
- - ccada8c: Reset default margin on Header and CartItem titles to support rendering them as semantic headings
116
- - cb6eb81: Fix `InLineAlert` additional-action buttons announcing the same accessible name across multiple alerts. Each entry in `additionalActions` may now include an optional `'aria-label'` that is applied to the rendered button (falling back to `label` when omitted), so consumers can give visually identical "Undo"/"Dismiss" style buttons unique, descriptive names for assistive technology.
117
- - ab5cf32: Fix `Modal` accessibility: the dialog now exposes `role="dialog"`, `aria-modal="true"`, and an `aria-labelledby` linked to its title. Focus moves into the modal when it opens (falling back to the dialog body when there are no focusable elements), Tab/Shift+Tab now cycles between the first and last focusable elements instead of escaping the modal, and focus returns to the previously focused element when the modal closes.
118
- - 58da630: Fix `Picker` accessible name and label association. The `<select>` now falls back to `floatingLabel` or `placeholder` for its `aria-label` when no `name` is provided, and the floating `<label>` is now correctly associated with the rendered `<select>` via its generated id instead of the raw `id` prop.
119
- - 450c408: fix(Picker): auto-select and emit the sole option when the control auto-disables, so single-option narrowing on configurable PDPs no longer leaves the value unselected and Add to Cart permanently disabled
120
- - 33ebe8a: Add accessible labels to password validation and input status icons (WCAG 1.1.1)
121
- - 2ad7316: Fix `ToggleButton`'s underlying radio input announcing the shared radio-group `name` (e.g. "payment-method") as its accessible name for every option instead of the option's own visible label, which violates WCAG 2.4.6 (Headings and Labels) and 2.5.3 (Label in Name). The radio input's accessible name now defaults to `aria-labelledby` pointing at the option's own visible label content (e.g. "Check / Money order"), which works correctly whether `label` is a string or a `VNode`. An optional `ariaLabel` prop is still available for consumers who need to set an explicit accessible name via `aria-label` instead.
122
- - 256007e: Fix ToggleButton generating invalid HTML ids when value prop contains spaces, breaking aria-labelledby label association
123
- - 016a558: Fix low-contrast field label text in `Input` when a field is in an error state. The floating label color now meets WCAG AA contrast requirements for normal-size text against light backgrounds, matching the color already used for error text elsewhere (helper text, alerts).
124
- - 51fcb35: fix(a11y): darken low-contrast focus indicators to meet WCAG 1.4.11 (3:1 non-text contrast)
125
-
126
- The default keyboard focus indicator across Button, IconButton, Checkbox, RadioButton, ActionButton, ActionButtonGroup, ToggleButton, TextSwatch, ColorSwatch, ImageSwatch, and links used `--color-neutral-400` (#d6d6d6, ~1.45:1 against white), below the 3:1 minimum required by WCAG 1.4.11. These focus indicators now use `--color-neutral-600` (#8f8f8f, ~3.2:1), so keyboard users can reliably see which control is focused.
176
+ - bf352d2: Fix InputDate showing wrong format after selecting a date from the
177
+ calendar
178
+ - 4c3d82d: fix(field): associate error messages with inputs via aria-describedby
179
+ (WCAG 3.3.1)
180
+ - 36354d9: Add disableWhenSingle prop to Picker; defaults to true (preserves
181
+ existing behavior). Pass false to keep the picker interactive when only one
182
+ option is available.
183
+ - 09c2100: Declare `preact` as a runtime dependency. It previously sat in
184
+ `devDependencies` (unlike `@preact/signals` and `preact-i18n`), so standalone
185
+ consumers of `@adobe-commerce/elsie` had an unmet `preact` also the unmet
186
+ peer of `@preact/preset-vite`, `@storybook/preact-vite` and
187
+ `@testing-library/preact`. It now resolves to the same `~10.22.1` bundled into
188
+ `@dropins/tools`. The emitted bundle is unchanged.
189
+ - 4641ab0: Fix `Field` and `InLineAlert` status/error messages not being
190
+ announced by screen readers. `Field`'s description/hint element now always
191
+ carries `role="status"` and `aria-live="polite"`, instead of only adding
192
+ `aria-live` once an error appeared, so assistive technology reliably announces
193
+ validation and success messages (WCAG 4.1.3). `InLineAlert` now sets
194
+ `role="alert"`/`aria-live="assertive"` for `type="error"` and
195
+ `role="status"`/`aria-live="polite"` for `success`/`warning`, since it
196
+ previously had no live-region semantics at all.
197
+ - ccada8c: Reset default margin on Header and CartItem titles to support
198
+ rendering them as semantic headings
199
+ - cb6eb81: Fix `InLineAlert` additional-action buttons announcing the same
200
+ accessible name across multiple alerts. Each entry in `additionalActions` may
201
+ now include an optional `'aria-label'` that is applied to the rendered button
202
+ (falling back to `label` when omitted), so consumers can give visually
203
+ identical "Undo"/"Dismiss" style buttons unique, descriptive names for
204
+ assistive technology.
205
+ - ab5cf32: Fix `Modal` accessibility: the dialog now exposes `role="dialog"`,
206
+ `aria-modal="true"`, and an `aria-labelledby` linked to its title. Focus moves
207
+ into the modal when it opens (falling back to the dialog body when there are
208
+ no focusable elements), Tab/Shift+Tab now cycles between the first and last
209
+ focusable elements instead of escaping the modal, and focus returns to the
210
+ previously focused element when the modal closes.
211
+ - 58da630: Fix `Picker` accessible name and label association. The `<select>`
212
+ now falls back to `floatingLabel` or `placeholder` for its `aria-label` when
213
+ no `name` is provided, and the floating `<label>` is now correctly associated
214
+ with the rendered `<select>` via its generated id instead of the raw `id`
215
+ prop.
216
+ - 450c408: fix(Picker): auto-select and emit the sole option when the control
217
+ auto-disables, so single-option narrowing on configurable PDPs no longer
218
+ leaves the value unselected and Add to Cart permanently disabled
219
+ - 33ebe8a: Add accessible labels to password validation and input status icons
220
+ (WCAG 1.1.1)
221
+ - 2ad7316: Fix `ToggleButton`'s underlying radio input announcing the shared
222
+ radio-group `name` (e.g. "payment-method") as its accessible name for every
223
+ option instead of the option's own visible label, which violates WCAG 2.4.6
224
+ (Headings and Labels) and 2.5.3 (Label in Name). The radio input's accessible
225
+ name now defaults to `aria-labelledby` pointing at the option's own visible
226
+ label content (e.g. "Check / Money order"), which works correctly whether
227
+ `label` is a string or a `VNode`. An optional `ariaLabel` prop is still
228
+ available for consumers who need to set an explicit accessible name via
229
+ `aria-label` instead.
230
+ - 256007e: Fix ToggleButton generating invalid HTML ids when value prop contains
231
+ spaces, breaking aria-labelledby label association
232
+ - 016a558: Fix low-contrast field label text in `Input` when a field is in an
233
+ error state. The floating label color now meets WCAG AA contrast requirements
234
+ for normal-size text against light backgrounds, matching the color already
235
+ used for error text elsewhere (helper text, alerts).
236
+ - 51fcb35: fix(a11y): darken low-contrast focus indicators to meet WCAG 1.4.11
237
+ (3:1 non-text contrast)
238
+
239
+ The default keyboard focus indicator across Button, IconButton, Checkbox,
240
+ RadioButton, ActionButton, ActionButtonGroup, ToggleButton, TextSwatch,
241
+ ColorSwatch, ImageSwatch, and links used `--color-neutral-400` (#d6d6d6,
242
+ ~1.45:1 against white), below the 3:1 minimum required by WCAG 1.4.11. These
243
+ focus indicators now use `--color-neutral-600` (#8f8f8f, ~3.2:1), so keyboard
244
+ users can reliably see which control is focused.
127
245
 
128
246
  ## 2.0.0-beta.1
129
247
 
130
248
  ### Patch Changes
131
249
 
132
- - 256007e: Fix ToggleButton generating invalid HTML ids when value prop contains spaces, breaking aria-labelledby label association
250
+ - 256007e: Fix ToggleButton generating invalid HTML ids when value prop contains
251
+ spaces, breaking aria-labelledby label association
133
252
 
134
253
  ## 2.0.0-beta.0
135
254
 
@@ -137,54 +256,89 @@
137
256
 
138
257
  - ea02d5f: Upgrade Jest to 30.4.2 and Storybook to 10.4.0
139
258
 
140
- Updated testing and component development tools to latest stable versions. Jest 30.4.2 provides enhanced snapshot handling and improved test performance. Storybook 10.4.0 includes updated addon ecosystem, improved Preact Vite integration, and enhanced accessibility features with addon-a11y and addon-coverage support.
259
+ Updated testing and component development tools to latest stable versions.
260
+ Jest 30.4.2 provides enhanced snapshot handling and improved test performance.
261
+ Storybook 10.4.0 includes updated addon ecosystem, improved Preact Vite
262
+ integration, and enhanced accessibility features with addon-a11y and
263
+ addon-coverage support.
141
264
 
142
265
  - 9cd299b: Upgrade TypeScript to 6.0 and ESLint to 9 (flat config)
143
266
 
144
267
  ## What changed
145
268
 
146
269
  ### TypeScript 4.7 → 6.0
147
-
148
- - `tsconfig-base.json` updated with correct TS 6 defaults. Two new-default opt-outs are deferred as tech debt: `exactOptionalPropertyTypes` and `verbatimModuleSyntax`.
149
- - `moduleResolution` changed from `"nodenext"` to `"bundler"` across all packages — the correct pairing for `module: "esnext"` in a Vite monorepo. Only `packages/elsie` keeps `"NodeNext"` (paired with `module: "NodeNext"` for its dual CJS/ESM output).
150
- - `baseUrl` removed from all tsconfigs (deprecated in TS 6; `paths` resolves relative to the tsconfig file directly).
151
- - `rootDir` added explicitly to `build-tools`, `event-bus`, `fetch-graphql`, and `recaptcha` tsconfigs (implicit `rootDir` deprecated in TS 6).
152
- - `types: []` set in `tsconfig-base.json` to prevent ambient test types from leaking into declaration output. Each package's own `tsconfig.json` declares its `types` explicitly (`jest`, `node`, `vite/client`, etc.).
153
- - `babel-plugin-tsconfig-paths` removed it was a no-op in every package that listed it.
154
- - `noUncheckedIndexedAccess` enabled violations were few enough to fix in source.
270
+ - `tsconfig-base.json` updated with correct TS 6 defaults. Two new-default
271
+ opt-outs are deferred as tech debt: `exactOptionalPropertyTypes` and
272
+ `verbatimModuleSyntax`.
273
+ - `moduleResolution` changed from `"nodenext"` to `"bundler"` across all
274
+ packages the correct pairing for `module: "esnext"` in a Vite monorepo.
275
+ Only `packages/elsie` keeps `"NodeNext"` (paired with `module: "NodeNext"`
276
+ for its dual CJS/ESM output).
277
+ - `baseUrl` removed from all tsconfigs (deprecated in TS 6; `paths` resolves
278
+ relative to the tsconfig file directly).
279
+ - `rootDir` added explicitly to `build-tools`, `event-bus`, `fetch-graphql`,
280
+ and `recaptcha` tsconfigs (implicit `rootDir` deprecated in TS 6).
281
+ - `types: []` set in `tsconfig-base.json` to prevent ambient test types from
282
+ leaking into declaration output. Each package's own `tsconfig.json` declares
283
+ its `types` explicitly (`jest`, `node`, `vite/client`, etc.).
284
+ - `babel-plugin-tsconfig-paths` removed — it was a no-op in every package that
285
+ listed it.
286
+ - `noUncheckedIndexedAccess` enabled — violations were few enough to fix in
287
+ source.
155
288
 
156
289
  ### ESLint 8 → 9 (flat config)
157
-
158
- - `@typescript-eslint/parser` and `@typescript-eslint/eslint-plugin` (v5) removed; replaced by the unified `typescript-eslint` v8 package.
290
+ - `@typescript-eslint/parser` and `@typescript-eslint/eslint-plugin` (v5)
291
+ removed; replaced by the unified `typescript-eslint` v8 package.
159
292
  - `eslint-config-preact` bumped to `^2.0.0` (ESLint 9 support).
160
293
  - `eslint-config-prettier` bumped to `^10.0.0`.
161
- - `eslint-plugin-mdx` bumped to `^3.8.1`. **ESLint 10 is not supported** — `eslint-plugin-mdx` vendors an internal ESLint API removed in v10; ESLint 9 is pinned until a fix is released.
294
+ - `eslint-plugin-mdx` bumped to `^3.8.1`. **ESLint 10 is not supported** —
295
+ `eslint-plugin-mdx` vendors an internal ESLint API removed in v10; ESLint 9
296
+ is pinned until a fix is released.
162
297
  - `globals` added (`^15.0.0`) for `languageOptions.globals` in flat config.
163
- - Shared config (`packages/elsie/config/eslint.mjs`) rewritten as a flat-config array export.
164
- - Per-package `.eslintrc.js` files deleted; replaced with `eslint.config.js` (ESM flat config).
165
- - Several `typescript-eslint` v8 rules disabled to preserve prior behavior: `no-explicit-any`, `ban-ts-comment`, `no-unused-expressions`, `no-unsafe-function-type`, `no-require-imports`, `no-empty-object-type`. Tracked as tech debt.
166
- - `reportUnusedDisableDirectives` disabled to avoid sweeping pre-existing inline disable comments.
298
+ - Shared config (`packages/elsie/config/eslint.mjs`) rewritten as a
299
+ flat-config array export.
300
+ - Per-package `.eslintrc.js` files deleted; replaced with `eslint.config.js`
301
+ (ESM flat config).
302
+ - Several `typescript-eslint` v8 rules disabled to preserve prior behavior:
303
+ `no-explicit-any`, `ban-ts-comment`, `no-unused-expressions`,
304
+ `no-unsafe-function-type`, `no-require-imports`, `no-empty-object-type`.
305
+ Tracked as tech debt.
306
+ - `reportUnusedDisableDirectives` disabled to avoid sweeping pre-existing
307
+ inline disable comments.
167
308
 
168
309
  ### `vite-plugin-dts` removed; replaced with custom `dtsPlugin`
169
310
 
170
- `vite-plugin-dts@3.9.1` declared a `typescript <5.0` peer range and its v5 successor was incompatible with this monorepo's layout (cross-package sources, workspace symlinks, multi-`outDir`). It was removed and replaced with a thin custom Vite plugin at `packages/elsie/config/plugins/dts.mjs` (`dtsPlugin`) that runs `tsc` directly. The resulting `dist/` layout is identical to what v3.9 produced (147 `.d.ts` files, 12 top-level entry shims).
311
+ `vite-plugin-dts@3.9.1` declared a `typescript <5.0` peer range and its v5
312
+ successor was incompatible with this monorepo's layout (cross-package sources,
313
+ workspace symlinks, multi-`outDir`). It was removed and replaced with a thin
314
+ custom Vite plugin at `packages/elsie/config/plugins/dts.mjs` (`dtsPlugin`)
315
+ that runs `tsc` directly. The resulting `dist/` layout is identical to what
316
+ v3.9 produced (147 `.d.ts` files, 12 top-level entry shims).
171
317
 
172
318
  ### Module format standardization
173
319
 
174
320
  All tooling config files now follow a consistent format:
175
321
 
176
- - **ESLint / Jest / Vite configs** — ESM (`.js` in `"type":"module"` packages; `.mjs` in elsie).
177
- - **Prettier** — JSON only (`@adobe-commerce/elsie/config/prettier.json` referenced via each package's `"prettier"` key). `prettier.config.*` files deleted from all packages.
322
+ - **ESLint / Jest / Vite configs** — ESM (`.js` in `"type":"module"` packages;
323
+ `.mjs` in elsie).
324
+ - **Prettier** — JSON only (`@adobe-commerce/elsie/config/prettier.json`
325
+ referenced via each package's `"prettier"` key). `prettier.config.*` files
326
+ deleted from all packages.
178
327
  - **elsie CLI** (`bin/**`) — intentionally stays CommonJS.
179
328
 
180
329
  See `architecture/decisions/009-module-format.md` for the full convention.
181
330
 
182
331
  ### `.elsie.js` → `.elsie.cjs`
183
332
 
184
- The consumer project config file is renamed from `.elsie.js` to `.elsie.cjs`. With `"type":"module"` now required in consumer packages, a plain `.js` file is treated as ES module — making `module.exports` a SyntaxError and making `require()` in the elsie CLI fail with `ERR_REQUIRE_ESM`. The `.cjs` extension forces CommonJS regardless of the package's `"type"` field.
333
+ The consumer project config file is renamed from `.elsie.js` to `.elsie.cjs`.
334
+ With `"type":"module"` now required in consumer packages, a plain `.js` file
335
+ is treated as ES module — making `module.exports` a SyntaxError and making
336
+ `require()` in the elsie CLI fail with `ERR_REQUIRE_ESM`. The `.cjs` extension
337
+ forces CommonJS regardless of the package's `"type"` field.
185
338
 
186
339
  - `elsie generate config` now writes `.elsie.cjs`.
187
- - The CLI (`bin/lib/config.js`) and `config/vite.mjs` both prefer `.elsie.cjs` and fall back to `.elsie.js` for packages not yet migrated.
340
+ - The CLI (`bin/lib/config.js`) and `config/vite.mjs` both prefer `.elsie.cjs`
341
+ and fall back to `.elsie.js` for packages not yet migrated.
188
342
  - `.elsie.cjs` added to `.npmignore` in all consumer packages.
189
343
 
190
344
  ## Consumer migration
@@ -192,20 +346,29 @@
192
346
  See `docs/elsie-v2-migration.md` for the full step-by-step guide. Key actions:
193
347
 
194
348
  1. Add `"type": "module"` to `package.json`.
195
- 2. Replace `.eslintrc.js` with `eslint.config.js` (ESM flat config importing from `@adobe-commerce/elsie/config/eslint.mjs`).
349
+ 2. Replace `.eslintrc.js` with `eslint.config.js` (ESM flat config importing
350
+ from `@adobe-commerce/elsie/config/eslint.mjs`).
196
351
  3. Rename `.elsie.js` → `.elsie.cjs` (keep `module.exports` content as-is).
197
- 4. Add `"prettier": "@adobe-commerce/elsie/config/prettier.json"` to `package.json`; delete `prettier.config.js`.
198
- 5. Update `tsconfig.json`: remove `baseUrl`, add explicit `rootDir` and `types`.
352
+ 4. Add `"prettier": "@adobe-commerce/elsie/config/prettier.json"` to
353
+ `package.json`; delete `prettier.config.js`.
354
+ 5. Update `tsconfig.json`: remove `baseUrl`, add explicit `rootDir` and
355
+ `types`.
199
356
  6. Add `tsconfig.build.json` for declaration emit (required by `dtsPlugin`).
200
- 7. Convert `.elsie.js` imports in `.storybook/main.js` and `storybook-stories.js` to reference `.elsie.cjs`.
357
+ 7. Convert `.elsie.js` imports in `.storybook/main.js` and
358
+ `storybook-stories.js` to reference `.elsie.cjs`.
201
359
 
202
360
  ### Minor Changes
203
361
 
204
362
  - c21a378: Add optional `cypress` export to shared ESLint config
205
363
 
206
- `cypress` is a new named export from `@adobe-commerce/elsie/config/eslint.mjs` that provides a pre-configured ESLint flat config for Cypress test files (`cypress/**/*.js`). It applies `eslint-plugin-cypress`'s recommended rules with `jest/expect-expect` turned off.
364
+ `cypress` is a new named export from `@adobe-commerce/elsie/config/eslint.mjs`
365
+ that provides a pre-configured ESLint flat config for Cypress test files
366
+ (`cypress/**/*.js`). It applies `eslint-plugin-cypress`'s recommended rules
367
+ with `jest/expect-expect` turned off.
207
368
 
208
- The plugin is declared as an optional peer dependency — `cypress` resolves to an empty array when `eslint-plugin-cypress` is not installed, so projects that don't use Cypress are unaffected.
369
+ The plugin is declared as an optional peer dependency — `cypress` resolves to
370
+ an empty array when `eslint-plugin-cypress` is not installed, so projects that
371
+ don't use Cypress are unaffected.
209
372
 
210
373
  ## Usage
211
374
 
@@ -226,34 +389,93 @@
226
389
  export default [...base, ...cypress, ...sourceImportRestrictions];
227
390
  ```
228
391
 
229
- - 9d558ed: Adds `window.DROPINS.showOverlays(state)` — a developer utility that visually outlines all dropin containers and slots on the page with labeled overlays, making it easier to understand how the storefront is composed at runtime.
392
+ - 9d558ed: Adds `window.DROPINS.showOverlays(state)` — a developer utility that
393
+ visually outlines all dropin containers and slots on the page with labeled
394
+ overlays, making it easier to understand how the storefront is composed at
395
+ runtime.
230
396
 
231
- `DROPINS.showSlots()` is deprecated in favor of `showOverlays()` and will log a console warning when called.
397
+ `DROPINS.showSlots()` is deprecated in favor of `showOverlays()` and will log
398
+ a console warning when called.
232
399
 
233
400
  - c25a5d7: feat(elsie): add `changeset` builder command
234
401
 
235
- Adds `elsie changeset` as a first-class CLI command, wrapping `@changesets/cli`. All subcommands pass through transparently (`status`, `version`, `publish`, `--snapshot`, etc.). `@changesets/cli` is now a dependency of elsie, so consumers no longer need to install it separately.
402
+ Adds `elsie changeset` as a first-class CLI command, wrapping
403
+ `@changesets/cli`. All subcommands pass through transparently (`status`,
404
+ `version`, `publish`, `--snapshot`, etc.). `@changesets/cli` is now a
405
+ dependency of elsie, so consumers no longer need to install it separately.
236
406
 
237
- - 005edc7: Adds validation to the Incrementer component when the field is changed to "empty".
407
+ - 005edc7: Adds validation to the Incrementer component when the field is
408
+ changed to "empty".
238
409
 
239
410
  ### Patch Changes
240
411
 
241
- - bf352d2: Fix InputDate showing wrong format after selecting a date from the calendar
242
- - 4c3d82d: fix(field): associate error messages with inputs via aria-describedby (WCAG 3.3.1)
243
- - 36354d9: Add disableWhenSingle prop to Picker; defaults to true (preserves existing behavior). Pass false to keep the picker interactive when only one option is available.
244
- - 09c2100: Declare `preact` as a runtime dependency. It previously sat in `devDependencies` (unlike `@preact/signals` and `preact-i18n`), so standalone consumers of `@adobe-commerce/elsie` had an unmet `preact` — also the unmet peer of `@preact/preset-vite`, `@storybook/preact-vite` and `@testing-library/preact`. It now resolves to the same `~10.22.1` bundled into `@dropins/tools`. The emitted bundle is unchanged.
245
- - 4641ab0: Fix `Field` and `InLineAlert` status/error messages not being announced by screen readers. `Field`'s description/hint element now always carries `role="status"` and `aria-live="polite"`, instead of only adding `aria-live` once an error appeared, so assistive technology reliably announces validation and success messages (WCAG 4.1.3). `InLineAlert` now sets `role="alert"`/`aria-live="assertive"` for `type="error"` and `role="status"`/`aria-live="polite"` for `success`/`warning`, since it previously had no live-region semantics at all.
246
- - ccada8c: Reset default margin on Header and CartItem titles to support rendering them as semantic headings
247
- - cb6eb81: Fix `InLineAlert` additional-action buttons announcing the same accessible name across multiple alerts. Each entry in `additionalActions` may now include an optional `'aria-label'` that is applied to the rendered button (falling back to `label` when omitted), so consumers can give visually identical "Undo"/"Dismiss" style buttons unique, descriptive names for assistive technology.
248
- - ab5cf32: Fix `Modal` accessibility: the dialog now exposes `role="dialog"`, `aria-modal="true"`, and an `aria-labelledby` linked to its title. Focus moves into the modal when it opens (falling back to the dialog body when there are no focusable elements), Tab/Shift+Tab now cycles between the first and last focusable elements instead of escaping the modal, and focus returns to the previously focused element when the modal closes.
249
- - 58da630: Fix `Picker` accessible name and label association. The `<select>` now falls back to `floatingLabel` or `placeholder` for its `aria-label` when no `name` is provided, and the floating `<label>` is now correctly associated with the rendered `<select>` via its generated id instead of the raw `id` prop.
250
- - 450c408: fix(Picker): auto-select and emit the sole option when the control auto-disables, so single-option narrowing on configurable PDPs no longer leaves the value unselected and Add to Cart permanently disabled
251
- - 33ebe8a: Add accessible labels to password validation and input status icons (WCAG 1.1.1)
252
- - 2ad7316: Fix `ToggleButton`'s underlying radio input announcing the shared radio-group `name` (e.g. "payment-method") as its accessible name for every option instead of the option's own visible label, which violates WCAG 2.4.6 (Headings and Labels) and 2.5.3 (Label in Name). The radio input's accessible name now defaults to `aria-labelledby` pointing at the option's own visible label content (e.g. "Check / Money order"), which works correctly whether `label` is a string or a `VNode`. An optional `ariaLabel` prop is still available for consumers who need to set an explicit accessible name via `aria-label` instead.
253
- - 016a558: Fix low-contrast field label text in `Input` when a field is in an error state. The floating label color now meets WCAG AA contrast requirements for normal-size text against light backgrounds, matching the color already used for error text elsewhere (helper text, alerts).
254
- - 51fcb35: fix(a11y): darken low-contrast focus indicators to meet WCAG 1.4.11 (3:1 non-text contrast)
255
-
256
- The default keyboard focus indicator across Button, IconButton, Checkbox, RadioButton, ActionButton, ActionButtonGroup, ToggleButton, TextSwatch, ColorSwatch, ImageSwatch, and links used `--color-neutral-400` (#d6d6d6, ~1.45:1 against white), below the 3:1 minimum required by WCAG 1.4.11. These focus indicators now use `--color-neutral-600` (#8f8f8f, ~3.2:1), so keyboard users can reliably see which control is focused.
412
+ - bf352d2: Fix InputDate showing wrong format after selecting a date from the
413
+ calendar
414
+ - 4c3d82d: fix(field): associate error messages with inputs via aria-describedby
415
+ (WCAG 3.3.1)
416
+ - 36354d9: Add disableWhenSingle prop to Picker; defaults to true (preserves
417
+ existing behavior). Pass false to keep the picker interactive when only one
418
+ option is available.
419
+ - 09c2100: Declare `preact` as a runtime dependency. It previously sat in
420
+ `devDependencies` (unlike `@preact/signals` and `preact-i18n`), so standalone
421
+ consumers of `@adobe-commerce/elsie` had an unmet `preact` also the unmet
422
+ peer of `@preact/preset-vite`, `@storybook/preact-vite` and
423
+ `@testing-library/preact`. It now resolves to the same `~10.22.1` bundled into
424
+ `@dropins/tools`. The emitted bundle is unchanged.
425
+ - 4641ab0: Fix `Field` and `InLineAlert` status/error messages not being
426
+ announced by screen readers. `Field`'s description/hint element now always
427
+ carries `role="status"` and `aria-live="polite"`, instead of only adding
428
+ `aria-live` once an error appeared, so assistive technology reliably announces
429
+ validation and success messages (WCAG 4.1.3). `InLineAlert` now sets
430
+ `role="alert"`/`aria-live="assertive"` for `type="error"` and
431
+ `role="status"`/`aria-live="polite"` for `success`/`warning`, since it
432
+ previously had no live-region semantics at all.
433
+ - ccada8c: Reset default margin on Header and CartItem titles to support
434
+ rendering them as semantic headings
435
+ - cb6eb81: Fix `InLineAlert` additional-action buttons announcing the same
436
+ accessible name across multiple alerts. Each entry in `additionalActions` may
437
+ now include an optional `'aria-label'` that is applied to the rendered button
438
+ (falling back to `label` when omitted), so consumers can give visually
439
+ identical "Undo"/"Dismiss" style buttons unique, descriptive names for
440
+ assistive technology.
441
+ - ab5cf32: Fix `Modal` accessibility: the dialog now exposes `role="dialog"`,
442
+ `aria-modal="true"`, and an `aria-labelledby` linked to its title. Focus moves
443
+ into the modal when it opens (falling back to the dialog body when there are
444
+ no focusable elements), Tab/Shift+Tab now cycles between the first and last
445
+ focusable elements instead of escaping the modal, and focus returns to the
446
+ previously focused element when the modal closes.
447
+ - 58da630: Fix `Picker` accessible name and label association. The `<select>`
448
+ now falls back to `floatingLabel` or `placeholder` for its `aria-label` when
449
+ no `name` is provided, and the floating `<label>` is now correctly associated
450
+ with the rendered `<select>` via its generated id instead of the raw `id`
451
+ prop.
452
+ - 450c408: fix(Picker): auto-select and emit the sole option when the control
453
+ auto-disables, so single-option narrowing on configurable PDPs no longer
454
+ leaves the value unselected and Add to Cart permanently disabled
455
+ - 33ebe8a: Add accessible labels to password validation and input status icons
456
+ (WCAG 1.1.1)
457
+ - 2ad7316: Fix `ToggleButton`'s underlying radio input announcing the shared
458
+ radio-group `name` (e.g. "payment-method") as its accessible name for every
459
+ option instead of the option's own visible label, which violates WCAG 2.4.6
460
+ (Headings and Labels) and 2.5.3 (Label in Name). The radio input's accessible
461
+ name now defaults to `aria-labelledby` pointing at the option's own visible
462
+ label content (e.g. "Check / Money order"), which works correctly whether
463
+ `label` is a string or a `VNode`. An optional `ariaLabel` prop is still
464
+ available for consumers who need to set an explicit accessible name via
465
+ `aria-label` instead.
466
+ - 016a558: Fix low-contrast field label text in `Input` when a field is in an
467
+ error state. The floating label color now meets WCAG AA contrast requirements
468
+ for normal-size text against light backgrounds, matching the color already
469
+ used for error text elsewhere (helper text, alerts).
470
+ - 51fcb35: fix(a11y): darken low-contrast focus indicators to meet WCAG 1.4.11
471
+ (3:1 non-text contrast)
472
+
473
+ The default keyboard focus indicator across Button, IconButton, Checkbox,
474
+ RadioButton, ActionButton, ActionButtonGroup, ToggleButton, TextSwatch,
475
+ ColorSwatch, ImageSwatch, and links used `--color-neutral-400` (#d6d6d6,
476
+ ~1.45:1 against white), below the 3:1 minimum required by WCAG 1.4.11. These
477
+ focus indicators now use `--color-neutral-600` (#8f8f8f, ~3.2:1), so keyboard
478
+ users can reliably see which control is focused.
257
479
 
258
480
  ## 1.9.0
259
481
 
@@ -261,28 +483,59 @@
261
483
 
262
484
  - af62897: Update minimum Node.js requirement to 22 LTS
263
485
 
264
- Packages are now built with Node.js 22. `elsie` requires `>=22`; browser-only packages (`fetch-graphql`, `event-bus`, `recaptcha`, `storefront-design`, `build-tools`) do not declare an `engines` field as they do not run in Node.js.
486
+ Packages are now built with Node.js 22. `elsie` requires `>=22`; browser-only
487
+ packages (`fetch-graphql`, `event-bus`, `recaptcha`, `storefront-design`,
488
+ `build-tools`) do not declare an `engines` field as they do not run in
489
+ Node.js.
265
490
 
266
- - 62adf1c: Reduce HTTP requests on page load through three bundling optimizations. The preact runtime is isolated in its own vendor chunk so it no longer co-locates into other chunks. Dropin API and internal component modules are consolidated into `chunks/api.js` and `chunks/components.js` respectively, replacing the previous pattern of one chunk file per function or component. All SVG icons are consolidated into a single `chunks/icons.js` chunk instead of one chunk per icon.
491
+ - 62adf1c: Reduce HTTP requests on page load through three bundling
492
+ optimizations. The preact runtime is isolated in its own vendor chunk so it no
493
+ longer co-locates into other chunks. Dropin API and internal component modules
494
+ are consolidated into `chunks/api.js` and `chunks/components.js` respectively,
495
+ replacing the previous pattern of one chunk file per function or component.
496
+ All SVG icons are consolidated into a single `chunks/icons.js` chunk instead
497
+ of one chunk per icon.
267
498
 
268
- Drop-ins must be rebuilt against this release to get the reduced request footprint. No source changes are required.
499
+ Drop-ins must be rebuilt against this release to get the reduced request
500
+ footprint. No source changes are required.
269
501
 
270
502
  ### Patch Changes
271
503
 
272
- - d2aacc7: Fix: GraphQL fragment source files are no longer incorrectly bundled into `chunks/api.js`. The `manualChunks` function now walks the full importer graph (with cycle protection) to determine whether an api-directory module is owned by the fragments barrel, so fragment files stay in the fragments output chunk even when accessed through intermediate sub-barrels.
273
- - 5c64620: Implement a new `fragment-import-redirect` build plugin that automatically detects and redirects any dropin source file that directly imports a fragment source file (bypassing the barrel). The import is silently redirected to the fragments barrel at build time and a warning is emitted identifying the file so it can be corrected in source. This ensures fragment constants always appear as local declarations in `fragments.js` regardless of how dropin source code references them.
504
+ - d2aacc7: Fix: GraphQL fragment source files are no longer incorrectly bundled
505
+ into `chunks/api.js`. The `manualChunks` function now walks the full importer
506
+ graph (with cycle protection) to determine whether an api-directory module is
507
+ owned by the fragments barrel, so fragment files stay in the fragments output
508
+ chunk even when accessed through intermediate sub-barrels.
509
+ - 5c64620: Implement a new `fragment-import-redirect` build plugin that
510
+ automatically detects and redirects any dropin source file that directly
511
+ imports a fragment source file (bypassing the barrel). The import is silently
512
+ redirected to the fragments barrel at build time and a warning is emitted
513
+ identifying the file so it can be corrected in source. This ensures fragment
514
+ constants always appear as local declarations in `fragments.js` regardless of
515
+ how dropin source code references them.
274
516
 
275
517
  ## 1.9.0-beta.3
276
518
 
277
519
  ### Patch Changes
278
520
 
279
- - 5c64620: Implement a new `fragment-import-redirect` build plugin that automatically detects and redirects any dropin source file that directly imports a fragment source file (bypassing the barrel). The import is silently redirected to the fragments barrel at build time and a warning is emitted identifying the file so it can be corrected in source. This ensures fragment constants always appear as local declarations in `fragments.js` regardless of how dropin source code references them.
521
+ - 5c64620: Implement a new `fragment-import-redirect` build plugin that
522
+ automatically detects and redirects any dropin source file that directly
523
+ imports a fragment source file (bypassing the barrel). The import is silently
524
+ redirected to the fragments barrel at build time and a warning is emitted
525
+ identifying the file so it can be corrected in source. This ensures fragment
526
+ constants always appear as local declarations in `fragments.js` regardless of
527
+ how dropin source code references them.
280
528
 
281
529
  ## 1.9.0-beta.2
282
530
 
283
531
  ### Patch Changes
284
532
 
285
- - d2aacc7: Fix: GraphQL fragment source files are no longer incorrectly bundled into `chunks/api.js`. The `manualChunks` function now walks the full importer graph (with cycle protection) to determine whether an api-directory module is owned by the fragments barrel, so fragment files stay in the fragments output chunk even when accessed through intermediate sub-barrels. Boilerplate GraphQL overrides work correctly in all dropin barrel structures.
533
+ - d2aacc7: Fix: GraphQL fragment source files are no longer incorrectly bundled
534
+ into `chunks/api.js`. The `manualChunks` function now walks the full importer
535
+ graph (with cycle protection) to determine whether an api-directory module is
536
+ owned by the fragments barrel, so fragment files stay in the fragments output
537
+ chunk even when accessed through intermediate sub-barrels. Boilerplate GraphQL
538
+ overrides work correctly in all dropin barrel structures.
286
539
 
287
540
  ## 1.9.0-beta.1
288
541
 
@@ -290,35 +543,53 @@
290
543
 
291
544
  - af62897: Update minimum Node.js requirement to 22 LTS
292
545
 
293
- Packages are now built with Node.js 22. `elsie` requires `>=22`; browser-only packages (`fetch-graphql`, `event-bus`, `recaptcha`, `storefront-design`, `build-tools`) do not declare an `engines` field as they do not run in Node.js.
546
+ Packages are now built with Node.js 22. `elsie` requires `>=22`; browser-only
547
+ packages (`fetch-graphql`, `event-bus`, `recaptcha`, `storefront-design`,
548
+ `build-tools`) do not declare an `engines` field as they do not run in
549
+ Node.js.
294
550
 
295
551
  ## 1.9.0-beta.0
296
552
 
297
553
  ### Minor Changes
298
554
 
299
- - 62adf1c: Reduce HTTP requests on page load through three bundling optimizations. The preact runtime is isolated in its own vendor chunk so it no longer co-locates into other chunks. Dropin API and internal component modules are consolidated into `chunks/api.js` and `chunks/components.js` respectively, replacing the previous pattern of one chunk file per function or component. All SVG icons are consolidated into a single `chunks/icons.js` chunk instead of one chunk per icon.
555
+ - 62adf1c: Reduce HTTP requests on page load through three bundling
556
+ optimizations. The preact runtime is isolated in its own vendor chunk so it no
557
+ longer co-locates into other chunks. Dropin API and internal component modules
558
+ are consolidated into `chunks/api.js` and `chunks/components.js` respectively,
559
+ replacing the previous pattern of one chunk file per function or component.
560
+ All SVG icons are consolidated into a single `chunks/icons.js` chunk instead
561
+ of one chunk per icon.
300
562
 
301
- Drop-ins must be rebuilt against this release to get the reduced request footprint. No source changes are required.
563
+ Drop-ins must be rebuilt against this release to get the reduced request
564
+ footprint. No source changes are required.
302
565
 
303
566
  ## 1.8.1
304
567
 
305
568
  ### Patch Changes
306
569
 
307
- - e44f618: Fixed `srcset w` descriptors to use actual image widths instead of viewport breakpoints, preventing blurry product images.
308
- - 46d57ca: Add optional `sizes` prop to the `Image` component so dropins can provide layout-aware sizing hints for more accurate srcset image source selection.
570
+ - e44f618: Fixed `srcset w` descriptors to use actual image widths instead of
571
+ viewport breakpoints, preventing blurry product images.
572
+ - 46d57ca: Add optional `sizes` prop to the `Image` component so dropins can
573
+ provide layout-aware sizing hints for more accurate srcset image source
574
+ selection.
309
575
 
310
576
  ## 1.8.1-beta.0
311
577
 
312
578
  ### Patch Changes
313
579
 
314
- - e44f618: Fixed `srcset w` descriptors to use actual image widths instead of viewport breakpoints, preventing blurry product images.
315
- - 46d57ca: Add optional `sizes` prop to the `Image` component so dropins can provide layout-aware sizing hints for more accurate srcset image source selection.
580
+ - e44f618: Fixed `srcset w` descriptors to use actual image widths instead of
581
+ viewport breakpoints, preventing blurry product images.
582
+ - 46d57ca: Add optional `sizes` prop to the `Image` component so dropins can
583
+ provide layout-aware sizing hints for more accurate srcset image source
584
+ selection.
316
585
 
317
586
  ## 1.8.0
318
587
 
319
588
  ### Minor Changes
320
589
 
321
- - c4da094: Enhance the Vite build process to automatically generate a package.json file and include both the LICENSE and CHANGELOG files in the dist directory.
590
+ - c4da094: Enhance the Vite build process to automatically generate a
591
+ package.json file and include both the LICENSE and CHANGELOG files in the dist
592
+ directory.
322
593
 
323
594
  ### Patch Changes
324
595
 
@@ -334,4 +605,6 @@
334
605
 
335
606
  ### Minor Changes
336
607
 
337
- - c4da094: Enhance the Vite build process to automatically generate a package.json file and include both the LICENSE and CHANGELOG files in the dist directory.
608
+ - c4da094: Enhance the Vite build process to automatically generate a
609
+ package.json file and include both the LICENSE and CHANGELOG files in the dist
610
+ directory.