@astryxdesign/core 0.7.1 → 0.7.2-canary.01eab6a

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 (331) hide show
  1. package/dist/AspectRatio/AspectRatio.d.ts +6 -8
  2. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  3. package/dist/AspectRatio/AspectRatio.js +44 -3
  4. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  5. package/dist/Breadcrumbs/BreadcrumbItem.js +5 -2
  6. package/dist/Button/Button.d.ts.map +1 -1
  7. package/dist/Button/Button.js +38 -14
  8. package/dist/CheckboxInput/CheckboxInput.d.ts +1 -1
  9. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  10. package/dist/CheckboxInput/CheckboxInput.js +3 -1
  11. package/dist/CheckboxList/CheckboxListItem.d.ts +9 -1
  12. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  13. package/dist/CheckboxList/CheckboxListItem.js +4 -2
  14. package/dist/CommandPalette/CommandPaletteInput.d.ts +1 -1
  15. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  16. package/dist/CommandPalette/CommandPaletteInput.js +37 -5
  17. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  18. package/dist/ContextMenu/ContextMenu.js +5 -2
  19. package/dist/Dialog/Dialog.d.ts.map +1 -1
  20. package/dist/Dialog/Dialog.js +20 -8
  21. package/dist/Drawer/Drawer.d.ts +191 -0
  22. package/dist/Drawer/Drawer.d.ts.map +1 -0
  23. package/dist/Drawer/Drawer.js +382 -0
  24. package/dist/Drawer/DrawerHeader.d.ts +85 -0
  25. package/dist/Drawer/DrawerHeader.d.ts.map +1 -0
  26. package/dist/Drawer/DrawerHeader.js +134 -0
  27. package/dist/Drawer/index.d.ts +11 -0
  28. package/dist/Drawer/index.d.ts.map +1 -0
  29. package/dist/Drawer/index.js +11 -0
  30. package/dist/Drawer/useDrawerDialogPresence.d.ts +42 -0
  31. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -0
  32. package/dist/Drawer/useDrawerDialogPresence.js +236 -0
  33. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  34. package/dist/DropdownMenu/DropdownMenu.js +47 -4
  35. package/dist/DropdownMenu/DropdownMenuContext.d.ts +17 -0
  36. package/dist/DropdownMenu/DropdownMenuContext.d.ts.map +1 -1
  37. package/dist/DropdownMenu/DropdownMenuContext.js +21 -0
  38. package/dist/DropdownMenu/DropdownMenuDivider.d.ts +5 -3
  39. package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -1
  40. package/dist/DropdownMenu/DropdownMenuDivider.js +7 -3
  41. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  42. package/dist/DropdownMenu/DropdownMenuSubMenu.js +19 -8
  43. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  44. package/dist/EmptyState/EmptyState.js +4 -10
  45. package/dist/Field/Field.d.ts +1 -1
  46. package/dist/Field/Field.d.ts.map +1 -1
  47. package/dist/Field/Field.js +8 -4
  48. package/dist/Grid/GridSpan.d.ts.map +1 -1
  49. package/dist/Grid/GridSpan.js +1 -0
  50. package/dist/Heading/Heading.d.ts.map +1 -1
  51. package/dist/Heading/Heading.js +4 -2
  52. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  53. package/dist/HoverCard/useHoverCard.js +10 -2
  54. package/dist/Item/Item.d.ts +6 -2
  55. package/dist/Item/Item.d.ts.map +1 -1
  56. package/dist/Item/Item.js +19 -4
  57. package/dist/Layer/layerViewportInset.stylex.d.ts +6 -2
  58. package/dist/Layer/layerViewportInset.stylex.d.ts.map +1 -1
  59. package/dist/Layer/layerViewportInset.stylex.js +6 -2
  60. package/dist/Layer/useLayer.d.ts.map +1 -1
  61. package/dist/Layer/useLayer.js +13 -7
  62. package/dist/Layer/useLayerDismissal.d.ts +1 -1
  63. package/dist/Layer/useLayerDismissal.js +1 -1
  64. package/dist/Layout/container.stylex.d.ts +5 -5
  65. package/dist/Layout/container.stylex.js +4 -4
  66. package/dist/List/List.d.ts +46 -19
  67. package/dist/List/List.d.ts.map +1 -1
  68. package/dist/List/List.js +28 -10
  69. package/dist/List/ListContext.d.ts +8 -3
  70. package/dist/List/ListContext.d.ts.map +1 -1
  71. package/dist/List/ListContext.js +7 -2
  72. package/dist/List/ListItem.d.ts +13 -5
  73. package/dist/List/ListItem.d.ts.map +1 -1
  74. package/dist/List/ListItem.js +21 -8
  75. package/dist/List/index.d.ts +1 -1
  76. package/dist/List/index.d.ts.map +1 -1
  77. package/dist/Markdown/Markdown.d.ts.map +1 -1
  78. package/dist/Markdown/Markdown.js +8 -1
  79. package/dist/Markdown/plugins/frontmatter.d.ts.map +1 -1
  80. package/dist/Markdown/plugins/frontmatter.js +7 -3
  81. package/dist/MetadataList/MetadataList.d.ts.map +1 -1
  82. package/dist/MetadataList/MetadataList.js +5 -1
  83. package/dist/MetadataList/MetadataListContext.d.ts +1 -1
  84. package/dist/MetadataList/MetadataListContext.d.ts.map +1 -1
  85. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  86. package/dist/MultiSelector/MultiSelector.js +22 -8
  87. package/dist/MultiSelector/OptionActions.a11y.chromium.spec.js +100 -2
  88. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  89. package/dist/MultiSelector/hooks.js +3 -1
  90. package/dist/Pagination/Pagination.d.ts +8 -5
  91. package/dist/Pagination/Pagination.d.ts.map +1 -1
  92. package/dist/Pagination/Pagination.js +21 -8
  93. package/dist/Popover/Popover.js +2 -2
  94. package/dist/PowerSearch/PowerSearch.js +1 -1
  95. package/dist/RadioList/RadioList.d.ts +1 -1
  96. package/dist/RadioList/RadioList.d.ts.map +1 -1
  97. package/dist/RadioList/RadioList.js +6 -2
  98. package/dist/RadioList/RadioListItem.d.ts +9 -1
  99. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  100. package/dist/RadioList/RadioListItem.js +2 -0
  101. package/dist/Selector/hooks.d.ts.map +1 -1
  102. package/dist/Selector/hooks.js +6 -2
  103. package/dist/SideNav/SideNavItem.d.ts +8 -1
  104. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  105. package/dist/SideNav/SideNavItem.js +71 -9
  106. package/dist/Switch/Switch.d.ts +1 -1
  107. package/dist/Switch/Switch.d.ts.map +1 -1
  108. package/dist/Switch/Switch.js +13 -1
  109. package/dist/TabList/TabMenu.d.ts +2 -2
  110. package/dist/TabList/TabMenu.d.ts.map +1 -1
  111. package/dist/TabList/TabMenu.js +6 -3
  112. package/dist/Text/Text.d.ts.map +1 -1
  113. package/dist/Text/Text.js +4 -2
  114. package/dist/Text/useTruncation.d.ts +7 -5
  115. package/dist/Text/useTruncation.d.ts.map +1 -1
  116. package/dist/Text/useTruncation.js +16 -5
  117. package/dist/ToggleButton/ToggleButton.d.ts +3 -2
  118. package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
  119. package/dist/ToggleButton/ToggleButton.js +12 -1
  120. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  121. package/dist/Tooltip/useTooltip.js +11 -0
  122. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  123. package/dist/TopNav/TopNavMegaMenu.js +3 -3
  124. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  125. package/dist/TopNav/TopNavMenu.js +3 -3
  126. package/dist/TreeList/TreeList.d.ts.map +1 -1
  127. package/dist/TreeList/TreeList.js +1 -0
  128. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  129. package/dist/TreeList/TreeListBranches.js +2 -2
  130. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  131. package/dist/TreeList/TreeListItem.js +57 -9
  132. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  133. package/dist/Typeahead/BaseTypeahead.js +26 -0
  134. package/dist/astryx.css +47 -13
  135. package/dist/hooks/useEntryAnimation.d.ts +2 -1
  136. package/dist/hooks/useEntryAnimation.d.ts.map +1 -1
  137. package/dist/hooks/useEntryAnimation.js +14 -12
  138. package/dist/hooks/useIsHydrating.d.ts +6 -0
  139. package/dist/hooks/useIsHydrating.d.ts.map +1 -0
  140. package/dist/hooks/useIsHydrating.js +30 -0
  141. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  142. package/dist/hooks/useMenuHover.js +18 -13
  143. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  144. package/dist/i18n/generated-locales/en.generated.js +112 -1
  145. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  146. package/dist/i18n/generated-locales/pseudo.generated.js +112 -1
  147. package/dist/index.d.ts +1 -0
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +1 -0
  150. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  151. package/dist/theme/derivedVarRegistry.js +0 -3
  152. package/dist/utils/focusOutline.stylex.d.ts +4 -0
  153. package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
  154. package/dist/utils/focusOutline.stylex.js +4 -0
  155. package/dist/utils/plainDate.d.ts.map +1 -1
  156. package/dist/utils/plainDate.js +15 -9
  157. package/dist/utils/sharedMutationObserver.d.ts +21 -0
  158. package/dist/utils/sharedMutationObserver.d.ts.map +1 -0
  159. package/dist/utils/sharedMutationObserver.js +69 -0
  160. package/locales/en.json +444 -0
  161. package/locales/pseudo.json +333 -0
  162. package/package.json +9 -4
  163. package/src/AspectRatio/AspectRatio.test.tsx +44 -43
  164. package/src/AspectRatio/AspectRatio.tsx +38 -18
  165. package/src/AspectRatio/__tests__/AspectRatioFitLayers.a11y.browser.spec.ts +157 -0
  166. package/src/Avatar/Avatar.doc.mjs +5 -3
  167. package/src/AvatarGroup/AvatarGroup.doc.mjs +3 -2
  168. package/src/Breadcrumbs/BreadcrumbItem.tsx +4 -1
  169. package/src/Breadcrumbs/Breadcrumbs.test.tsx +30 -1
  170. package/src/Button/Button.doc.mjs +2 -2
  171. package/src/Button/Button.test.tsx +155 -9
  172. package/src/Button/Button.tsx +39 -16
  173. package/src/Button/__tests__/Button.a11y.known-failures.ts +1 -62
  174. package/src/Button/__tests__/Button.a11y.states.ts +0 -10
  175. package/src/Chat/__tests__/ChatMessageMetadata.a11y.chromium.spec.ts +3 -1
  176. package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
  177. package/src/CheckboxInput/CheckboxInput.tsx +3 -1
  178. package/src/CheckboxList/CheckboxList.test.tsx +22 -0
  179. package/src/CheckboxList/CheckboxListItem.doc.mjs +16 -0
  180. package/src/CheckboxList/CheckboxListItem.tsx +10 -0
  181. package/src/CommandPalette/CommandPaletteInput.test.tsx +53 -4
  182. package/src/CommandPalette/CommandPaletteInput.tsx +33 -3
  183. package/src/CommandPalette/__tests__/CommandPaletteInputAudit.a11y.chromium.spec.ts +335 -0
  184. package/src/CommandPalette/__tests__/CommandPaletteItemAudit.a11y.chromium.spec.ts +292 -0
  185. package/src/ContextMenu/ContextMenu.doc.mjs +2 -3
  186. package/src/ContextMenu/ContextMenu.tsx +4 -1
  187. package/src/ContextMenu/__tests__/ContextMenuAudit.a11y.chromium.spec.ts +438 -0
  188. package/src/Dialog/Dialog.test.tsx +46 -0
  189. package/src/Dialog/Dialog.tsx +20 -7
  190. package/src/Dialog/__tests__/Dialog.a11y.known-failures.ts +0 -14
  191. package/src/Drawer/Drawer.doc.mjs +472 -0
  192. package/src/Drawer/Drawer.spec.md +357 -0
  193. package/src/Drawer/Drawer.test.tsx +1300 -0
  194. package/src/Drawer/Drawer.tsx +613 -0
  195. package/src/Drawer/DrawerDirection.test.tsx +127 -0
  196. package/src/Drawer/DrawerHeader.doc.mjs +293 -0
  197. package/src/Drawer/DrawerHeader.test.tsx +102 -0
  198. package/src/Drawer/DrawerHeader.tsx +235 -0
  199. package/src/Drawer/__tests__/DrawerAudit.a11y.chromium.spec.ts +401 -0
  200. package/src/Drawer/__tests__/DrawerHeaderAudit.a11y.chromium.spec.ts +297 -0
  201. package/src/Drawer/index.ts +13 -0
  202. package/src/Drawer/useDrawerDialogPresence.ts +284 -0
  203. package/src/DropdownMenu/DropdownMenu.test.tsx +62 -13
  204. package/src/DropdownMenu/DropdownMenu.tsx +47 -4
  205. package/src/DropdownMenu/DropdownMenuContext.tsx +24 -0
  206. package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +2 -2
  207. package/src/DropdownMenu/DropdownMenuDivider.spec.md +192 -0
  208. package/src/DropdownMenu/DropdownMenuDivider.tsx +9 -5
  209. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +185 -0
  210. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +19 -5
  211. package/src/DropdownMenu/__tests__/DropdownMenuDividerAudit.a11y.chromium.spec.ts +280 -0
  212. package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +145 -0
  213. package/src/DropdownMenu/__tests__/Menu.a11y.known-failures.ts +26 -0
  214. package/src/DropdownMenu/__tests__/Menu.a11y.renders.tsx +65 -0
  215. package/src/DropdownMenu/__tests__/Menu.a11y.states.ts +138 -0
  216. package/src/DropdownMenu/__tests__/Menu.a11y.test.tsx +136 -0
  217. package/src/EmptyState/EmptyState.doc.mjs +3 -2
  218. package/src/EmptyState/EmptyState.spec.md +189 -0
  219. package/src/EmptyState/EmptyState.test.tsx +74 -3
  220. package/src/EmptyState/EmptyState.tsx +4 -8
  221. package/src/Field/Field.doc.mjs +14 -8
  222. package/src/Field/Field.spec.md +217 -0
  223. package/src/Field/Field.test.tsx +60 -2
  224. package/src/Field/Field.tsx +17 -8
  225. package/src/Grid/GridSpan.tsx +3 -0
  226. package/src/Heading/Heading.test.tsx +57 -0
  227. package/src/Heading/Heading.tsx +6 -2
  228. package/src/HoverCard/HoverCard.test.tsx +58 -0
  229. package/src/HoverCard/useHoverCard.tsx +10 -2
  230. package/src/IconButton/IconButton.doc.mjs +2 -2
  231. package/src/IconButton/IconButton.test.tsx +3 -1
  232. package/src/Item/Item.doc.mjs +12 -8
  233. package/src/Item/Item.spec.md +226 -0
  234. package/src/Item/Item.test.tsx +61 -0
  235. package/src/Item/Item.tsx +40 -4
  236. package/src/Layer/layerViewportInset.source-build.test.mjs +90 -0
  237. package/src/Layer/layerViewportInset.stylex.ts +6 -2
  238. package/src/Layer/layerViewportInset.test.ts +1 -0
  239. package/src/Layer/useLayer.tsx +24 -13
  240. package/src/Layer/useLayerDismissal.ts +1 -1
  241. package/src/Layout/container.stylex.ts +6 -6
  242. package/src/List/List.doc.mjs +14 -1
  243. package/src/List/List.spec.md +129 -77
  244. package/src/List/List.test.tsx +163 -94
  245. package/src/List/List.tsx +74 -18
  246. package/src/List/ListContext.tsx +9 -3
  247. package/src/List/ListItem.doc.mjs +24 -5
  248. package/src/List/ListItem.tsx +56 -27
  249. package/src/List/index.ts +1 -1
  250. package/src/Markdown/Markdown.tsx +14 -1
  251. package/src/Markdown/plugins/frontmatter.test.tsx +25 -0
  252. package/src/Markdown/plugins/frontmatter.ts +7 -3
  253. package/src/MetadataList/MetadataList.doc.mjs +2 -2
  254. package/src/MetadataList/MetadataList.test.tsx +38 -0
  255. package/src/MetadataList/MetadataList.tsx +8 -1
  256. package/src/MetadataList/MetadataListContext.tsx +1 -1
  257. package/src/MultiSelector/MultiSelector.test.tsx +159 -0
  258. package/src/MultiSelector/MultiSelector.tsx +40 -7
  259. package/src/MultiSelector/OptionActions.a11y.chromium.spec.ts +112 -2
  260. package/src/MultiSelector/hooks.ts +3 -1
  261. package/src/MultiSelector/useMultiCombobox.doc.mjs +267 -0
  262. package/src/Pagination/Pagination.doc.mjs +7 -7
  263. package/src/Pagination/Pagination.spec.md +9 -9
  264. package/src/Pagination/Pagination.test.tsx +242 -0
  265. package/src/Pagination/Pagination.tsx +27 -11
  266. package/src/Popover/Popover.test.tsx +2 -2
  267. package/src/Popover/Popover.tsx +4 -4
  268. package/src/PowerSearch/PowerSearch.test.tsx +85 -0
  269. package/src/PowerSearch/PowerSearch.tsx +2 -2
  270. package/src/RadioList/RadioList.fr10.test.tsx +45 -2
  271. package/src/RadioList/RadioList.test.tsx +22 -0
  272. package/src/RadioList/RadioList.tsx +4 -1
  273. package/src/RadioList/RadioListItem.doc.mjs +16 -0
  274. package/src/RadioList/RadioListItem.tsx +10 -1
  275. package/src/Selector/hooks.ts +6 -2
  276. package/src/Selector/useCombobox.doc.mjs +237 -0
  277. package/src/SideNav/SideNav.test.tsx +179 -0
  278. package/src/SideNav/SideNavItem.doc.mjs +2 -2
  279. package/src/SideNav/SideNavItem.tsx +96 -17
  280. package/src/Slider/Slider.spec.md +39 -18
  281. package/src/Switch/Switch.test.tsx +49 -0
  282. package/src/Switch/Switch.tsx +11 -0
  283. package/src/TabList/TabList.spec.md +57 -44
  284. package/src/TabList/TabList.test.tsx +67 -0
  285. package/src/TabList/TabMenu.doc.mjs +4 -3
  286. package/src/TabList/TabMenu.tsx +7 -4
  287. package/src/Text/Text.test.tsx +57 -0
  288. package/src/Text/Text.tsx +6 -2
  289. package/src/Text/useTruncation.test.tsx +69 -0
  290. package/src/Text/useTruncation.ts +16 -5
  291. package/src/TimeInput/TimeInput.fr10.test.tsx +15 -0
  292. package/src/ToggleButton/ToggleButton.test.tsx +95 -0
  293. package/src/ToggleButton/ToggleButton.tsx +12 -1
  294. package/src/Tokenizer/Tokenizer.test.tsx +54 -1
  295. package/src/Tooltip/Tooltip.test.tsx +31 -0
  296. package/src/Tooltip/useTooltip.test.tsx +13 -0
  297. package/src/Tooltip/useTooltip.tsx +11 -0
  298. package/src/TopNav/TopNavMegaMenu.test.tsx +22 -0
  299. package/src/TopNav/TopNavMegaMenu.tsx +7 -3
  300. package/src/TopNav/TopNavMenu.test.tsx +19 -0
  301. package/src/TopNav/TopNavMenu.tsx +11 -3
  302. package/src/TreeList/TreeList.doc.mjs +1 -0
  303. package/src/TreeList/TreeList.spec.md +29 -17
  304. package/src/TreeList/TreeList.test.tsx +327 -6
  305. package/src/TreeList/TreeList.tsx +5 -1
  306. package/src/TreeList/TreeListBranches.tsx +6 -0
  307. package/src/TreeList/TreeListItem.tsx +88 -13
  308. package/src/Typeahead/BaseTypeahead.tsx +26 -0
  309. package/src/Typeahead/Typeahead.test.tsx +260 -2
  310. package/src/docPropLiterals.test.ts +36 -10
  311. package/src/hooks/useEntryAnimation.doc.mjs +4 -4
  312. package/src/hooks/useEntryAnimation.ssr.test.tsx +143 -0
  313. package/src/hooks/useEntryAnimation.ts +15 -16
  314. package/src/hooks/useIsHydrating.test.tsx +70 -0
  315. package/src/hooks/useIsHydrating.ts +31 -0
  316. package/src/hooks/useMenuHover.ts +18 -13
  317. package/src/i18n/InternationalizationProvider.doc.mjs +8 -0
  318. package/src/i18n/InternationalizationProvider.spec.md +252 -0
  319. package/src/i18n/__tests__/InternationalizationProvider.test.tsx +128 -0
  320. package/src/i18n/generated-locales/en.generated.ts +121 -0
  321. package/src/i18n/generated-locales/pseudo.generated.ts +121 -0
  322. package/src/i18n/useTranslator.test.tsx +37 -0
  323. package/src/index.ts +1 -0
  324. package/src/reset.css +0 -29
  325. package/src/theme/derivedVarRegistry.test.ts +7 -3
  326. package/src/theme/derivedVarRegistry.ts +0 -3
  327. package/src/utils/focusOutline.stylex.ts +4 -0
  328. package/src/utils/plainDate.test.ts +37 -1
  329. package/src/utils/plainDate.ts +15 -5
  330. package/src/utils/sharedMutationObserver.test.ts +53 -0
  331. package/src/utils/sharedMutationObserver.ts +78 -0
@@ -395,6 +395,63 @@
395
395
  "@astryx.listInput.announceAlreadyAtBoundary": {
396
396
  "defaultMessage": "⟦Ţĥíš {itemName} íš àłřéàðý {boundary, select, first {first} last {last} other {}}.⟧"
397
397
  },
398
+ "@astryx.diffViewer.label": {
399
+ "defaultMessage": "⟦Ð탃⟧"
400
+ },
401
+ "@astryx.diffViewer.renamedPath": {
402
+ "defaultMessage": "⟦{oldPath} → {newPath}⟧"
403
+ },
404
+ "@astryx.diffViewer.statusAdded": {
405
+ "defaultMessage": "⟦Àððéð⟧"
406
+ },
407
+ "@astryx.diffViewer.statusDeleted": {
408
+ "defaultMessage": "⟦Ðéłéţéð⟧"
409
+ },
410
+ "@astryx.diffViewer.statusRenamed": {
411
+ "defaultMessage": "⟦Řéñàɱéð⟧"
412
+ },
413
+ "@astryx.diffViewer.addedCount": {
414
+ "defaultMessage": "⟦+{count, number}⟧"
415
+ },
416
+ "@astryx.diffViewer.removedCount": {
417
+ "defaultMessage": "⟦−{count, number}⟧"
418
+ },
419
+ "@astryx.diffViewer.stats": {
420
+ "defaultMessage": "⟦{added, plural, one {# line added} other {# lines added}}, {removed, plural, one {# line removed} other {# lines removed}}⟧"
421
+ },
422
+ "@astryx.diffViewer.added": {
423
+ "defaultMessage": "⟦Àððéð⟧"
424
+ },
425
+ "@astryx.diffViewer.removed": {
426
+ "defaultMessage": "⟦Řéɱóṽéð⟧"
427
+ },
428
+ "@astryx.diffViewer.lineNumberButton": {
429
+ "defaultMessage": "⟦{side, select, old {Original line {line, number}} other {Changed line {line, number}}}⟧"
430
+ },
431
+ "@astryx.diffViewer.columnOldLine": {
432
+ "defaultMessage": "⟦Óříĝíñàł łíñé ñúɱƀéř⟧"
433
+ },
434
+ "@astryx.diffViewer.columnNewLine": {
435
+ "defaultMessage": "⟦Çĥàñĝéð łíñé ñúɱƀéř⟧"
436
+ },
437
+ "@astryx.diffViewer.columnChange": {
438
+ "defaultMessage": "⟦Çĥàñĝé⟧"
439
+ },
440
+ "@astryx.diffViewer.columnCode": {
441
+ "defaultMessage": "⟦Çóðé⟧"
442
+ },
443
+ "@astryx.diffViewer.columnOldCode": {
444
+ "defaultMessage": "⟦Óříĝíñàł çóðé⟧"
445
+ },
446
+ "@astryx.diffViewer.columnNewCode": {
447
+ "defaultMessage": "⟦Çĥàñĝéð çóðé⟧"
448
+ },
449
+ "@astryx.diffViewer.binary": {
450
+ "defaultMessage": "⟦Ɓíñàřý ƒíłé ñóţ šĥóŵñ⟧"
451
+ },
452
+ "@astryx.diffViewer.noChanges": {
453
+ "defaultMessage": "⟦Ñó çóñţéñţ çĥàñĝéš⟧"
454
+ },
398
455
  "@astryx.markdownHeadingLinks.copied": {
399
456
  "defaultMessage": "⟦Łíñķ çóþíéð⟧"
400
457
  },
@@ -1231,5 +1288,281 @@
1231
1288
  },
1232
1289
  "@astryx.transferListSelector.triggerLabel": {
1233
1290
  "defaultMessage": "⟦{count, number} šéłéçţéð⟧"
1291
+ },
1292
+ "@astryx.emojiPicker.label": {
1293
+ "defaultMessage": "⟦Éɱóĵí⟧"
1294
+ },
1295
+ "@astryx.emojiPicker.searchLabel": {
1296
+ "defaultMessage": "⟦Šéàřçĥ éɱóĵí⟧"
1297
+ },
1298
+ "@astryx.emojiPicker.frequentlyUsed": {
1299
+ "defaultMessage": "⟦Ƒřéɋúéñţłý úšéð⟧"
1300
+ },
1301
+ "@astryx.emojiPicker.searchResults": {
1302
+ "defaultMessage": "⟦Šéàřçĥ řéšúłţš⟧"
1303
+ },
1304
+ "@astryx.emojiPicker.noResults": {
1305
+ "defaultMessage": "⟦Ñó éɱóĵí ɱàţçĥ “{query}”⟧"
1306
+ },
1307
+ "@astryx.emojiPicker.loading": {
1308
+ "defaultMessage": "⟦Łóàðíñĝ éɱóĵí⟧"
1309
+ },
1310
+ "@astryx.emojiPicker.loadFailed": {
1311
+ "defaultMessage": "⟦Ṁóřé éɱóĵí çóúłðñ'ţ ƀé łóàðéð.⟧"
1312
+ },
1313
+ "@astryx.emojiPicker.groupSmileysEmotion": {
1314
+ "defaultMessage": "⟦Šɱíłéýš & éɱóţíóñ⟧"
1315
+ },
1316
+ "@astryx.emojiPicker.groupPeopleBody": {
1317
+ "defaultMessage": "⟦Þéóþłé & ƀóðý⟧"
1318
+ },
1319
+ "@astryx.emojiPicker.groupAnimalsNature": {
1320
+ "defaultMessage": "⟦Àñíɱàłš & ñàţúřé⟧"
1321
+ },
1322
+ "@astryx.emojiPicker.groupFoodDrink": {
1323
+ "defaultMessage": "⟦Ƒóóð & ðříñķ⟧"
1324
+ },
1325
+ "@astryx.emojiPicker.groupTravelPlaces": {
1326
+ "defaultMessage": "⟦Ţřàṽéł & þłàçéš⟧"
1327
+ },
1328
+ "@astryx.emojiPicker.groupActivities": {
1329
+ "defaultMessage": "⟦Àçţíṽíţíéš⟧"
1330
+ },
1331
+ "@astryx.emojiPicker.groupObjects": {
1332
+ "defaultMessage": "⟦Óƀĵéçţš⟧"
1333
+ },
1334
+ "@astryx.emojiPicker.groupSymbols": {
1335
+ "defaultMessage": "⟦Šýɱƀółš⟧"
1336
+ },
1337
+ "@astryx.emojiPicker.groupFlags": {
1338
+ "defaultMessage": "⟦Ƒłàĝš⟧"
1339
+ },
1340
+ "@astryx.comments.retry": {
1341
+ "defaultMessage": "⟦Řéţřý⟧"
1342
+ },
1343
+ "@astryx.commentComposer.placeholder": {
1344
+ "defaultMessage": "⟦Ŵříţé à çóɱɱéñţ…⟧"
1345
+ },
1346
+ "@astryx.commentComposer.noAgents": {
1347
+ "defaultMessage": "⟦Ñó àĝéñţš⟧"
1348
+ },
1349
+ "@astryx.commentComposer.agents": {
1350
+ "defaultMessage": "⟦Àĝéñţš⟧"
1351
+ },
1352
+ "@astryx.commentComposer.uploadFailed": {
1353
+ "defaultMessage": "⟦Íɱàĝéš çóúłðñ'ţ ƀé àððéð⟧"
1354
+ },
1355
+ "@astryx.commentComposer.imagesOnly": {
1356
+ "defaultMessage": "⟦Óñłý íɱàĝé ƒíłéš çàñ ƀé àððéð⟧"
1357
+ },
1358
+ "@astryx.commentComposer.chooseImages": {
1359
+ "defaultMessage": "⟦Çĥóóšé íɱàĝéš⟧"
1360
+ },
1361
+ "@astryx.commentComposer.imageAlt": {
1362
+ "defaultMessage": "⟦Íɱàĝé àţţàçĥɱéñţ⟧"
1363
+ },
1364
+ "@astryx.commentComposer.removeQuote": {
1365
+ "defaultMessage": "⟦Řéɱóṽé ɋúóţéð ţéẋţ⟧"
1366
+ },
1367
+ "@astryx.commentComposer.attachImages": {
1368
+ "defaultMessage": "⟦Àţţàçĥ íɱàĝéš⟧"
1369
+ },
1370
+ "@astryx.commentComposer.addEmoji": {
1371
+ "defaultMessage": "⟦Àðð éɱóĵí⟧"
1372
+ },
1373
+ "@astryx.commentComposer.cancel": {
1374
+ "defaultMessage": "⟦Çàñçéł⟧"
1375
+ },
1376
+ "@astryx.comments.actionsLabel": {
1377
+ "defaultMessage": "⟦Àçţíóñš ƒóř {name}'š çóɱɱéñţ⟧"
1378
+ },
1379
+ "@astryx.comments.addReaction": {
1380
+ "defaultMessage": "⟦Àðð řéàçţíóñ⟧"
1381
+ },
1382
+ "@astryx.comments.agentBadge": {
1383
+ "defaultMessage": "⟦Àĝéñţ⟧"
1384
+ },
1385
+ "@astryx.comments.agentLogo": {
1386
+ "defaultMessage": "⟦{name} łóĝó⟧"
1387
+ },
1388
+ "@astryx.comments.chooseReaction": {
1389
+ "defaultMessage": "⟦Çĥóóšé à řéàçţíóñ⟧"
1390
+ },
1391
+ "@astryx.comments.copyLink": {
1392
+ "defaultMessage": "⟦Çóþý çóɱɱéñţ łíñķ⟧"
1393
+ },
1394
+ "@astryx.comments.currentVersion": {
1395
+ "defaultMessage": "⟦Çúřřéñţ ṽéřšíóñ⟧"
1396
+ },
1397
+ "@astryx.comments.delete": {
1398
+ "defaultMessage": "⟦Ðéłéţé⟧"
1399
+ },
1400
+ "@astryx.comments.deleteDescription": {
1401
+ "defaultMessage": "⟦Ðéłéţé {name}'š çóɱɱéñţ? Ţĥíš àçţíóñ çàññóţ ƀé úñðóñé.⟧"
1402
+ },
1403
+ "@astryx.comments.deleteFailed": {
1404
+ "defaultMessage": "⟦Ţĥíš çóɱɱéñţ çóúłðñ'ţ ƀé ðéłéţéð.⟧"
1405
+ },
1406
+ "@astryx.comments.deleteFailedRetry": {
1407
+ "defaultMessage": "⟦Ţĥíš çóɱɱéñţ çóúłðñ'ţ ƀé ðéłéţéð. Ţřý àĝàíñ.⟧"
1408
+ },
1409
+ "@astryx.comments.deleteTitle": {
1410
+ "defaultMessage": "⟦Ðéłéţé çóɱɱéñţ?⟧"
1411
+ },
1412
+ "@astryx.comments.edit": {
1413
+ "defaultMessage": "⟦Éðíţ⟧"
1414
+ },
1415
+ "@astryx.comments.editFailed": {
1416
+ "defaultMessage": "⟦Ýóúř éðíţ çóúłðñ'ţ ƀé šàṽéð.⟧"
1417
+ },
1418
+ "@astryx.comments.editPlaceholder": {
1419
+ "defaultMessage": "⟦Éðíţ çóɱɱéñţ⟧"
1420
+ },
1421
+ "@astryx.comments.edited": {
1422
+ "defaultMessage": "⟦Éðíţéð⟧"
1423
+ },
1424
+ "@astryx.comments.editingContext": {
1425
+ "defaultMessage": "⟦Éðíţíñĝ çóɱɱéñţ⟧"
1426
+ },
1427
+ "@astryx.comments.hideReplies": {
1428
+ "defaultMessage": "⟦Ĥíðé řéþłíéš⟧"
1429
+ },
1430
+ "@astryx.comments.historyEmptyDescription": {
1431
+ "defaultMessage": "⟦Ţĥíš çóɱɱéñţ ĥàš ñó éàřłíéř ṽéřšíóñš.⟧"
1432
+ },
1433
+ "@astryx.comments.historyEmptyTitle": {
1434
+ "defaultMessage": "⟦Ñó éðíţ ĥíšţóřý⟧"
1435
+ },
1436
+ "@astryx.comments.historyFailed": {
1437
+ "defaultMessage": "⟦Éðíţ ĥíšţóřý çóúłðñ'ţ łóàð⟧"
1438
+ },
1439
+ "@astryx.comments.historyLoadFailed": {
1440
+ "defaultMessage": "⟦Ţĥé çóɱɱéñţ'š éðíţ ĥíšţóřý çóúłðñ'ţ ƀé łóàðéð. Ţřý àĝàíñ.⟧"
1441
+ },
1442
+ "@astryx.comments.historyLoading": {
1443
+ "defaultMessage": "⟦Łóàðíñĝ éðíţ ĥíšţóřý⟧"
1444
+ },
1445
+ "@astryx.comments.historySubtitle": {
1446
+ "defaultMessage": "⟦Çóɱɱéñţ ƀý {name}⟧"
1447
+ },
1448
+ "@astryx.comments.historyTitle": {
1449
+ "defaultMessage": "⟦Éðíţ ĥíšţóřý⟧"
1450
+ },
1451
+ "@astryx.comments.linkCopied": {
1452
+ "defaultMessage": "⟦Çóɱɱéñţ łíñķ çóþíéð⟧"
1453
+ },
1454
+ "@astryx.comments.otherReactors": {
1455
+ "defaultMessage": "⟦{count, plural, one {# other} other {# others}}⟧"
1456
+ },
1457
+ "@astryx.comments.outdated": {
1458
+ "defaultMessage": "⟦Óúţðàţéð⟧"
1459
+ },
1460
+ "@astryx.comments.reactionCelebrate": {
1461
+ "defaultMessage": "⟦Çéłéƀřàţé⟧"
1462
+ },
1463
+ "@astryx.comments.reactionCount": {
1464
+ "defaultMessage": "⟦{reaction}: {count, number}⟧"
1465
+ },
1466
+ "@astryx.comments.reactionFailed": {
1467
+ "defaultMessage": "⟦Ýóúř řéàçţíóñ çóúłðñ'ţ ƀé šàṽéð.⟧"
1468
+ },
1469
+ "@astryx.comments.reactionLaugh": {
1470
+ "defaultMessage": "⟦Ĥàĥà⟧"
1471
+ },
1472
+ "@astryx.comments.reactionLike": {
1473
+ "defaultMessage": "⟦Łíķé⟧"
1474
+ },
1475
+ "@astryx.comments.reactionLove": {
1476
+ "defaultMessage": "⟦Łóṽé⟧"
1477
+ },
1478
+ "@astryx.comments.reactionSad": {
1479
+ "defaultMessage": "⟦Šàð⟧"
1480
+ },
1481
+ "@astryx.comments.reactionWow": {
1482
+ "defaultMessage": "⟦Ŵóŵ⟧"
1483
+ },
1484
+ "@astryx.comments.reopen": {
1485
+ "defaultMessage": "⟦Řéóþéñ⟧"
1486
+ },
1487
+ "@astryx.comments.reopenFailed": {
1488
+ "defaultMessage": "⟦Ţĥíš ţĥřéàð çóúłðñ'ţ ƀé řéóþéñéð.⟧"
1489
+ },
1490
+ "@astryx.comments.reply": {
1491
+ "defaultMessage": "⟦Řéþłý⟧"
1492
+ },
1493
+ "@astryx.comments.replyFailed": {
1494
+ "defaultMessage": "⟦Ýóúř řéþłý çóúłðñ'ţ ƀé þóšţéð.⟧"
1495
+ },
1496
+ "@astryx.comments.replyPlaceholder": {
1497
+ "defaultMessage": "⟦Řéþłý ţó {name}…⟧"
1498
+ },
1499
+ "@astryx.comments.replyingContext": {
1500
+ "defaultMessage": "⟦Řéþłýíñĝ ţó {name}⟧"
1501
+ },
1502
+ "@astryx.comments.resolve": {
1503
+ "defaultMessage": "⟦Ṁàřķ àš řéšółṽéð⟧"
1504
+ },
1505
+ "@astryx.comments.resolveFailed": {
1506
+ "defaultMessage": "⟦Ţĥíš ţĥřéàð çóúłðñ'ţ ƀé řéšółṽéð.⟧"
1507
+ },
1508
+ "@astryx.comments.resolved": {
1509
+ "defaultMessage": "⟦Řéšółṽéð⟧"
1510
+ },
1511
+ "@astryx.comments.resolvedBy": {
1512
+ "defaultMessage": "⟦Řéšółṽéð ƀý {name}⟧"
1513
+ },
1514
+ "@astryx.comments.retryFailed": {
1515
+ "defaultMessage": "⟦Řéţřýíñĝ ðíðñ'ţ ŵóřķ.⟧"
1516
+ },
1517
+ "@astryx.comments.sendFailed": {
1518
+ "defaultMessage": "⟦Çóúłðñ'ţ šéñð ţĥíš çóɱɱéñţ.⟧"
1519
+ },
1520
+ "@astryx.comments.threadLabel": {
1521
+ "defaultMessage": "⟦Ţĥřéàð ƀý {name}⟧"
1522
+ },
1523
+ "@astryx.comments.unread": {
1524
+ "defaultMessage": "⟦Ñéŵ⟧"
1525
+ },
1526
+ "@astryx.comments.unsavedDraft": {
1527
+ "defaultMessage": "⟦Úñšàṽéð ðřàƒţ. Ðíšɱíšš àĝàíñ ţó ðíšçàřð íţ.⟧"
1528
+ },
1529
+ "@astryx.comments.versionAuthor": {
1530
+ "defaultMessage": "⟦ƀý {name}⟧"
1531
+ },
1532
+ "@astryx.comments.viewHistory": {
1533
+ "defaultMessage": "⟦Ṽíéŵ éðíţ ĥíšţóřý⟧"
1534
+ },
1535
+ "@astryx.comments.viewReplies": {
1536
+ "defaultMessage": "⟦Ṽíéŵ {count, plural, one {# reply} other {# replies}}⟧"
1537
+ },
1538
+ "@astryx.comments.commentsLabel": {
1539
+ "defaultMessage": "⟦Ţĥřéàðš íñ {label}⟧"
1540
+ },
1541
+ "@astryx.comments.emptyDescription": {
1542
+ "defaultMessage": "⟦Šţàřţ ţĥé ðíšçúššíóñ ŵíţĥ à çóɱɱéñţ.⟧"
1543
+ },
1544
+ "@astryx.comments.emptyReadOnlyDescription": {
1545
+ "defaultMessage": "⟦Ţĥéřé íš ñó ðíšçúššíóñ óñ ţĥíš íţéɱ.⟧"
1546
+ },
1547
+ "@astryx.comments.emptyTitle": {
1548
+ "defaultMessage": "⟦Ñó çóɱɱéñţš ýéţ⟧"
1549
+ },
1550
+ "@astryx.comments.label": {
1551
+ "defaultMessage": "⟦Çóɱɱéñţš⟧"
1552
+ },
1553
+ "@astryx.comments.loadFailed": {
1554
+ "defaultMessage": "⟦Çóɱɱéñţš çóúłðñ'ţ łóàð⟧"
1555
+ },
1556
+ "@astryx.comments.loadOlder": {
1557
+ "defaultMessage": "⟦Łóàð éàřłíéř çóɱɱéñţš⟧"
1558
+ },
1559
+ "@astryx.comments.loading": {
1560
+ "defaultMessage": "⟦Łóàðíñĝ çóɱɱéñţš⟧"
1561
+ },
1562
+ "@astryx.comments.olderFailed": {
1563
+ "defaultMessage": "⟦Éàřłíéř çóɱɱéñţš çóúłðñ'ţ łóàð⟧"
1564
+ },
1565
+ "@astryx.comments.postFailed": {
1566
+ "defaultMessage": "⟦Ýóúř çóɱɱéñţ çóúłðñ'ţ ƀé þóšţéð.⟧"
1234
1567
  }
1235
1568
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astryxdesign/core",
3
- "version": "0.7.1",
3
+ "version": "0.7.2-canary.01eab6a",
4
4
  "displayName": "Astryx Core",
5
5
  "description": "The component library. Accessible, themeable React components with built-in spacing, dark mode, and StyleX styling.",
6
6
  "author": "Meta Open Source",
@@ -329,6 +329,11 @@
329
329
  "types": "./dist/Divider/index.d.ts",
330
330
  "default": "./dist/Divider/index.js"
331
331
  },
332
+ "./Drawer": {
333
+ "source": "./src/Drawer/index.ts",
334
+ "types": "./dist/Drawer/index.d.ts",
335
+ "default": "./dist/Drawer/index.js"
336
+ },
332
337
  "./DropdownMenu": {
333
338
  "source": "./src/DropdownMenu/index.ts",
334
339
  "types": "./dist/DropdownMenu/index.d.ts",
@@ -787,6 +792,8 @@
787
792
  "react-dom": ">=19.0.0"
788
793
  },
789
794
  "devDependencies": {
795
+ "@astryxdesign/a11y-spec": "0.7.2-canary.01eab6a",
796
+ "@astryxdesign/cli": "0.7.2-canary.01eab6a",
790
797
  "@babel/cli": "^7.29.7",
791
798
  "@babel/core": "^7.29.7",
792
799
  "@babel/preset-react": "^7.29.7",
@@ -797,9 +804,7 @@
797
804
  "@testing-library/jest-dom": "^6.6.0",
798
805
  "@testing-library/react": "^16.3.2",
799
806
  "@types/babel__core": "^7.20.5",
800
- "tailwindcss": "^4.3.2",
801
- "@astryxdesign/a11y-spec": "0.0.0",
802
- "@astryxdesign/cli": "0.7.1"
807
+ "tailwindcss": "^4.3.2"
803
808
  },
804
809
  "dependencies": {
805
810
  "intl-messageformat": "^11.2.9"
@@ -9,7 +9,7 @@
9
9
  * SYNC: When AspectRatio.tsx changes, update tests to match new behavior
10
10
  */
11
11
 
12
- import {describe, it, expect, vi, beforeAll} from 'vitest';
12
+ import {describe, it, expect, vi} from 'vitest';
13
13
  import {render, screen} from '@testing-library/react';
14
14
  import {AspectRatio} from './AspectRatio';
15
15
 
@@ -230,9 +230,8 @@ describe('AspectRatio', () => {
230
230
  <img src="test.jpg" alt="Test" data-testid="image" />
231
231
  </AspectRatio>,
232
232
  );
233
- // The marker sits on the child's actual parent, so the reset.css
234
- // sizing rules are direct-child selectors with no dependence on
235
- // AspectRatio's internal structure.
233
+ // Earlier releases documented the marker, so it stays on the child's
234
+ // direct parent for product CSS that targets it.
236
235
  const wrapper = screen.getByTestId('image').parentElement;
237
236
  expect(wrapper).toHaveAttribute(
238
237
  'data-astryx-aspect-ratio-override',
@@ -274,8 +273,11 @@ describe('AspectRatio', () => {
274
273
  );
275
274
  const wrapper = screen.getByTestId('image').parentElement;
276
275
  expect(wrapper).not.toHaveAttribute('data-astryx-aspect-ratio-override');
277
- // Without the marker, none of the reset.css fit rules can match, so
278
- // existing self-styled children render exactly as before.
276
+ // Without fit the wrapper carries no child-sizing styles, so existing
277
+ // self-styled children render exactly as before.
278
+ expect(wrapper?.className).not.toContain('childFill');
279
+ expect(wrapper?.className).not.toContain('childCover');
280
+ expect(wrapper?.className).not.toContain('childContain');
279
281
  expect(screen.getByTestId('image')).not.toHaveAttribute('class');
280
282
  });
281
283
 
@@ -292,13 +294,37 @@ describe('AspectRatio', () => {
292
294
  </AspectRatio>,
293
295
  );
294
296
  const image = screen.getByTestId('image');
295
- // Fit styling is pure CSS (zero-specificity reset rules); the child's
296
- // own className/style pass through untouched and always win, so
297
- // children that already size themselves keep their behavior.
297
+ // Fit styling is a direct-child rule on the wrapper; the child's own
298
+ // className/style pass through untouched, and an inline style still
299
+ // wins over it.
298
300
  expect(image.className).toBe('consumer-class');
299
301
  expect(image.style.objectFit).toBe('contain');
300
302
  });
301
303
 
304
+ it('sizes the child from the wrapper with fit="cover"', () => {
305
+ render(
306
+ <AspectRatio ratio={16 / 9} fit="cover">
307
+ <img src="test.jpg" alt="Test" data-testid="image" />
308
+ </AspectRatio>,
309
+ );
310
+ const wrapper = screen.getByTestId('image').parentElement;
311
+ expect(wrapper?.className).toContain('childFill');
312
+ expect(wrapper?.className).toContain('childCover');
313
+ expect(wrapper?.className).not.toContain('childContain');
314
+ });
315
+
316
+ it('sizes the child from the wrapper with fit="contain"', () => {
317
+ render(
318
+ <AspectRatio ratio={16 / 9} fit="contain">
319
+ <img src="test.jpg" alt="Test" data-testid="image" />
320
+ </AspectRatio>,
321
+ );
322
+ const wrapper = screen.getByTestId('image').parentElement;
323
+ expect(wrapper?.className).toContain('childFill');
324
+ expect(wrapper?.className).toContain('childContain');
325
+ expect(wrapper?.className).not.toContain('childCover');
326
+ });
327
+
302
328
  it('centers the child via the wrapper with fit="center"', () => {
303
329
  render(
304
330
  <AspectRatio ratio={16 / 9} fit="center">
@@ -309,6 +335,7 @@ describe('AspectRatio', () => {
309
335
  expect(image).not.toHaveAttribute('class');
310
336
  const wrapper = image.parentElement;
311
337
  expect(wrapper?.className).toContain('childCenter');
338
+ expect(wrapper?.className).not.toContain('childFill');
312
339
  });
313
340
 
314
341
  it('does not center the wrapper for other fit values', () => {
@@ -353,45 +380,19 @@ describe('AspectRatio', () => {
353
380
  });
354
381
  });
355
382
 
356
- describe('reset.css fit baseline rules', () => {
357
- // The cover/contain child sizing ships as zero-specificity baseline
358
- // rules in reset.css keyed on the data-astryx-aspect-ratio-override
359
- // marker the component sets on the child's direct parent. These
360
- // assertions keep the stylesheet in sync with the component contract.
361
- let resetCSS: string;
362
-
363
- beforeAll(async () => {
383
+ describe('reset.css', () => {
384
+ it('carries no AspectRatio rules', async () => {
385
+ // fit ships with the component's StyleX styles in `astryx-base`. A
386
+ // rule in reset.css sits below the layer the documented Tailwind
387
+ // setups give preflight, whose `img, video { height: auto }` would
388
+ // undo the fill.
364
389
  const fs = await import('fs');
365
390
  const path = await import('path');
366
- resetCSS = fs.readFileSync(
391
+ const resetCSS = fs.readFileSync(
367
392
  path.resolve(__dirname, '../reset.css'),
368
393
  'utf-8',
369
394
  );
370
- });
371
-
372
- it('sizes the child to fill the box for cover and contain', () => {
373
- const fillMatch = resetCSS.match(
374
- /:where\(\[data-astryx-aspect-ratio-override="cover"\], \[data-astryx-aspect-ratio-override="contain"\]\)\s*>\s*:where\(\*\)\s*\{([^}]+)\}/,
375
- );
376
- expect(fillMatch).not.toBeNull();
377
- expect(fillMatch![1]).toContain('width: 100%');
378
- expect(fillMatch![1]).toContain('height: 100%');
379
- });
380
-
381
- it('crops media with object-fit: cover for fit="cover"', () => {
382
- const coverMatch = resetCSS.match(
383
- /:where\(\[data-astryx-aspect-ratio-override="cover"\]\)\s*>\s*:where\(img, video\)\s*\{([^}]+)\}/,
384
- );
385
- expect(coverMatch).not.toBeNull();
386
- expect(coverMatch![1]).toContain('object-fit: cover');
387
- });
388
-
389
- it('letterboxes media with object-fit: contain for fit="contain"', () => {
390
- const containMatch = resetCSS.match(
391
- /:where\(\[data-astryx-aspect-ratio-override="contain"\]\)\s*>\s*:where\(img, video\)\s*\{([^}]+)\}/,
392
- );
393
- expect(containMatch).not.toBeNull();
394
- expect(containMatch![1]).toContain('object-fit: contain');
395
+ expect(resetCSS).not.toContain('aspect-ratio-override');
395
396
  });
396
397
  });
397
398
  });
@@ -9,7 +9,6 @@
9
9
  * SYNC: When modified, update these files to stay in sync:
10
10
  * - /packages/core/src/AspectRatio/AspectRatio.doc.mjs
11
11
  * - /packages/core/src/AspectRatio/AspectRatio.test.tsx
12
- * - /packages/core/src/reset.css (AspectRatio fit baseline rules)
13
12
  * - /apps/storybook/stories/AspectRatio.stories.tsx
14
13
  * - /packages/cli/assets/templates/blocks/components/AspectRatio/ (showcase blocks)
15
14
  */
@@ -91,13 +90,12 @@ export interface AspectRatioProps extends BaseProps<HTMLDivElement> {
91
90
  * (`object-fit: contain`).
92
91
  * - `center`: child keeps its natural size, centered in the box.
93
92
  *
94
- * `cover`/`contain` child sizing ships as zero-specificity baseline rules
95
- * in `reset.css`, keyed on the `data-astryx-aspect-ratio-override`
96
- * attribute the component sets on the child's direct parent. Any styles
97
- * the child sets itself still win, so children that already size
98
- * themselves keep their behavior. When omitted, the child is left
99
- * unstyled (the pre-existing contract). `fit` is structural, not visual,
100
- * so it is not exposed on the theming surface.
93
+ * `cover`/`contain` size the child from the component's own styles, in
94
+ * the `astryx-base` cascade layer. Styles in a later layer (Tailwind
95
+ * utilities, `astryx-theme`), unlayered CSS, and inline styles on the
96
+ * child still win. When omitted, the child is left unstyled (the
97
+ * pre-existing contract). `fit` is structural, not visual, so it is not
98
+ * exposed on the theming surface.
101
99
  *
102
100
  * @example
103
101
  * ```
@@ -140,15 +138,33 @@ const styles = stylex.create({
140
138
  height: '100%',
141
139
  },
142
140
  // fit="center" centers the child at its natural size from the wrapper —
143
- // no styles on the child itself. The `cover`/`contain` child sizing can't
144
- // live here (StyleX has no descendant selectors); it ships as baseline
145
- // rules in reset.css keyed on the `data-astryx-aspect-ratio-override`
146
- // attribute the wrapper carries (see below).
141
+ // no styles on the child itself.
147
142
  childCenter: {
148
143
  display: 'flex',
149
144
  alignItems: 'center',
150
145
  justifyContent: 'center',
151
146
  },
147
+ // `cover`/`contain` must style the child itself (`object-fit` only applies
148
+ // on the replaced element), and StyleX has no child selector. The
149
+ // `:not([stylex-hack])` pseudo-class always matches, so StyleX accepts the
150
+ // key and emits `.x:not([stylex-hack]) > *`, a direct-child rule in the
151
+ // `astryx-base` layer like every other component style.
152
+ childFill: {
153
+ ':not([stylex-hack]) > *': {
154
+ width: '100%',
155
+ height: '100%',
156
+ },
157
+ },
158
+ childCover: {
159
+ ':not([stylex-hack]) > :is(img, video)': {
160
+ objectFit: 'cover',
161
+ },
162
+ },
163
+ childContain: {
164
+ ':not([stylex-hack]) > :is(img, video)': {
165
+ objectFit: 'contain',
166
+ },
167
+ },
152
168
  });
153
169
 
154
170
  // The ratio compiles to a CSS variable + a class-level declaration
@@ -234,14 +250,18 @@ export function AspectRatio({
234
250
  style,
235
251
  )}
236
252
  {...props}>
237
- {/* The marker attribute carries the fit value so the reset.css child
238
- sizing can use direct-child selectors on this wrapper — the child's
239
- actual parent — without depending on AspectRatio's internal
240
- structure or on the theming surface (fit is structural, not
241
- themeable). The name is namespaced to avoid collisions. */}
253
+ {/* The marker attribute carries the fit value. No Astryx style keys on
254
+ it any more, but earlier releases documented it, so product CSS may
255
+ still target it. */}
242
256
  <div
243
257
  data-astryx-aspect-ratio-override={fit}
244
- {...stylex.props(styles.child, fit === 'center' && styles.childCenter)}>
258
+ {...stylex.props(
259
+ styles.child,
260
+ fit === 'center' && styles.childCenter,
261
+ (fit === 'cover' || fit === 'contain') && styles.childFill,
262
+ fit === 'cover' && styles.childCover,
263
+ fit === 'contain' && styles.childContain,
264
+ )}>
245
265
  {children}
246
266
  </div>
247
267
  </div>