@astryxdesign/core 0.4.1 → 0.4.2-canary.01592f7

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 (217) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/Avatar/Avatar.d.ts +4 -1
  3. package/dist/Avatar/Avatar.d.ts.map +1 -1
  4. package/dist/Avatar/Avatar.js +19 -23
  5. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  6. package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -2
  7. package/dist/Button/Button.d.ts.map +1 -1
  8. package/dist/Button/Button.js +9 -7
  9. package/dist/Chat/ChatMessage.d.ts +7 -0
  10. package/dist/Chat/ChatMessage.d.ts.map +1 -1
  11. package/dist/Chat/ChatMessageBubble.d.ts +13 -1
  12. package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
  13. package/dist/Chat/ChatMessageBubble.js +19 -1
  14. package/dist/Chat/ChatTokenizedText.js +1 -1
  15. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  16. package/dist/CheckboxInput/CheckboxInput.js +5 -0
  17. package/dist/CommandPalette/CommandPaletteFooter.d.ts.map +1 -1
  18. package/dist/CommandPalette/CommandPaletteFooter.js +5 -3
  19. package/dist/ComplexSelector/ComplexSelector.d.ts +38 -4
  20. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  21. package/dist/ComplexSelector/ComplexSelector.js +96 -35
  22. package/dist/ComplexSelector/index.d.ts +2 -2
  23. package/dist/ComplexSelector/index.d.ts.map +1 -1
  24. package/dist/ComplexSelector/index.js +1 -1
  25. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  26. package/dist/DateTimeInput/DateTimeInput.js +2 -2
  27. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  28. package/dist/DropdownMenu/DropdownMenuSubMenu.js +19 -15
  29. package/dist/HoverCard/HoverCard.d.ts +1 -1
  30. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  31. package/dist/HoverCard/HoverCard.js +5 -13
  32. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  33. package/dist/HoverCard/useHoverCard.js +6 -5
  34. package/dist/InputGroup/groupStyles.d.ts.map +1 -1
  35. package/dist/InputGroup/groupStyles.js +7 -2
  36. package/dist/Layer/layerHost.d.ts +24 -0
  37. package/dist/Layer/layerHost.d.ts.map +1 -0
  38. package/dist/Layer/layerHost.js +79 -0
  39. package/dist/Layer/useLayer.d.ts +14 -6
  40. package/dist/Layer/useLayer.d.ts.map +1 -1
  41. package/dist/Layer/useLayer.js +158 -30
  42. package/dist/Markdown/parser.d.ts.map +1 -1
  43. package/dist/Markdown/parser.js +55 -12
  44. package/dist/NavItem/navItemStyles.stylex.d.ts +17 -5
  45. package/dist/NavItem/navItemStyles.stylex.d.ts.map +1 -1
  46. package/dist/NavItem/navItemStyles.stylex.js +11 -5
  47. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  48. package/dist/RadioList/RadioListItem.js +5 -0
  49. package/dist/SideNav/SideNav.d.ts +7 -9
  50. package/dist/SideNav/SideNav.d.ts.map +1 -1
  51. package/dist/SideNav/SideNav.js +32 -5
  52. package/dist/SideNav/SideNavCollapseButton.d.ts +25 -9
  53. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  54. package/dist/SideNav/SideNavCollapseButton.js +39 -15
  55. package/dist/SideNav/SideNavCollapseContext.d.ts +21 -0
  56. package/dist/SideNav/SideNavCollapseContext.d.ts.map +1 -1
  57. package/dist/SideNav/SideNavCollapseContext.js +16 -2
  58. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  59. package/dist/SideNav/SideNavHeading.js +89 -32
  60. package/dist/SideNav/SideNavItem.d.ts +7 -2
  61. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  62. package/dist/SideNav/SideNavItem.js +119 -75
  63. package/dist/SideNav/SideNavSection.d.ts.map +1 -1
  64. package/dist/SideNav/SideNavSection.js +7 -16
  65. package/dist/SideNav/index.d.ts +1 -1
  66. package/dist/SideNav/index.d.ts.map +1 -1
  67. package/dist/Slider/Slider.d.ts.map +1 -1
  68. package/dist/Slider/Slider.js +56 -15
  69. package/dist/Switch/Switch.d.ts.map +1 -1
  70. package/dist/Switch/Switch.js +5 -0
  71. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  72. package/dist/Thumbnail/Thumbnail.js +5 -0
  73. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  74. package/dist/TopNav/TopNavHeading.js +14 -6
  75. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  76. package/dist/TopNav/TopNavMegaMenu.js +25 -93
  77. package/dist/TopNav/TopNavMegaMenuItem.js +1 -1
  78. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  79. package/dist/TopNav/TopNavMenu.js +10 -5
  80. package/dist/astryx.css +40 -8
  81. package/dist/astryx.umd.js +50 -50
  82. package/dist/astryx.umd.js.map +4 -4
  83. package/dist/hooks/containerReveal.stylex.d.ts +71 -4
  84. package/dist/hooks/containerReveal.stylex.d.ts.map +1 -1
  85. package/dist/hooks/containerReveal.stylex.js +57 -5
  86. package/dist/hooks/index.d.ts +2 -2
  87. package/dist/hooks/index.d.ts.map +1 -1
  88. package/dist/hooks/index.js +1 -1
  89. package/dist/hooks/useContainerReveal.d.ts +60 -3
  90. package/dist/hooks/useContainerReveal.d.ts.map +1 -1
  91. package/dist/hooks/useContainerReveal.js +27 -5
  92. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  93. package/dist/hooks/useFocusTrap.js +16 -2
  94. package/dist/hooks/useMenuHover.d.ts +50 -5
  95. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  96. package/dist/hooks/useMenuHover.js +171 -51
  97. package/dist/theme/defineTheme.d.ts +16 -5
  98. package/dist/theme/defineTheme.d.ts.map +1 -1
  99. package/dist/theme/defineTheme.js +44 -48
  100. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  101. package/dist/theme/derivedVarRegistry.js +7 -0
  102. package/dist/theme/expandColorScale.d.ts.map +1 -1
  103. package/dist/theme/expandColorScale.js +1 -0
  104. package/dist/theme/expandMotionScale.d.ts +1 -0
  105. package/dist/theme/expandMotionScale.d.ts.map +1 -1
  106. package/dist/theme/expandMotionScale.js +1 -0
  107. package/dist/theme/expandRadiusScale.d.ts +1 -0
  108. package/dist/theme/expandRadiusScale.d.ts.map +1 -1
  109. package/dist/theme/expandRadiusScale.js +1 -0
  110. package/dist/theme/expandTypeScale.d.ts +1 -0
  111. package/dist/theme/expandTypeScale.d.ts.map +1 -1
  112. package/dist/theme/expandTypeScale.js +1 -0
  113. package/dist/theme/mergeComponents.d.ts +20 -0
  114. package/dist/theme/mergeComponents.d.ts.map +1 -0
  115. package/dist/theme/mergeComponents.js +56 -0
  116. package/dist/theme/onMediaTokens.d.ts +6 -1
  117. package/dist/theme/onMediaTokens.d.ts.map +1 -1
  118. package/dist/theme/onMediaTokens.js +11 -3
  119. package/dist/theme/tokens.stylex.d.ts +3 -1
  120. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  121. package/dist/theme/tokens.stylex.js +3 -1
  122. package/locales/en.json +84 -0
  123. package/locales/pseudo.json +63 -0
  124. package/package.json +3 -3
  125. package/src/Avatar/Avatar.doc.mjs +5 -2
  126. package/src/Avatar/Avatar.test.tsx +51 -0
  127. package/src/Avatar/Avatar.tsx +30 -20
  128. package/src/AvatarGroup/AvatarGroup.doc.mjs +1 -1
  129. package/src/AvatarGroup/AvatarGroup.test.tsx +14 -0
  130. package/src/AvatarGroup/AvatarGroupOverflow.tsx +3 -2
  131. package/src/Button/Button.tsx +5 -3
  132. package/src/ButtonGroup/ButtonGroup.test.tsx +7 -4
  133. package/src/Card/Card.doc.mjs +2 -0
  134. package/src/Chat/Chat.doc.mjs +4 -1
  135. package/src/Chat/ChatMessage.doc.mjs +3 -3
  136. package/src/Chat/ChatMessage.tsx +7 -0
  137. package/src/Chat/ChatMessageBubble.doc.mjs +7 -0
  138. package/src/Chat/ChatMessageBubble.test.tsx +95 -6
  139. package/src/Chat/ChatMessageBubble.tsx +25 -0
  140. package/src/Chat/ChatTokenizedText.tsx +1 -1
  141. package/src/CheckboxInput/CheckboxInput.tsx +20 -0
  142. package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
  143. package/src/CommandPalette/CommandPaletteFooter.tsx +6 -3
  144. package/src/ComplexSelector/ComplexSelector.doc.mjs +55 -6
  145. package/src/ComplexSelector/ComplexSelector.test.tsx +197 -6
  146. package/src/ComplexSelector/ComplexSelector.tsx +153 -32
  147. package/src/ComplexSelector/index.ts +3 -1
  148. package/src/DateTimeInput/DateTimeInput.tsx +4 -2
  149. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +72 -1
  150. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +24 -20
  151. package/src/HoverCard/HoverCard.doc.mjs +3 -3
  152. package/src/HoverCard/HoverCard.test.tsx +283 -55
  153. package/src/HoverCard/HoverCard.tsx +5 -13
  154. package/src/HoverCard/useHoverCard.tsx +8 -11
  155. package/src/InputGroup/groupStyles.ts +7 -8
  156. package/src/Item/Item.doc.mjs +4 -0
  157. package/src/Layer/layerHost.test.ts +99 -0
  158. package/src/Layer/layerHost.ts +141 -0
  159. package/src/Layer/useLayer.doc.mjs +14 -4
  160. package/src/Layer/useLayer.test.tsx +332 -7
  161. package/src/Layer/useLayer.tsx +235 -36
  162. package/src/Markdown/parser.test.ts +53 -0
  163. package/src/Markdown/parser.ts +53 -12
  164. package/src/MobileNav/MobileNav.doc.mjs +7 -0
  165. package/src/NavItem/navItemStyles.stylex.ts +31 -5
  166. package/src/RadioList/RadioListItem.tsx +20 -0
  167. package/src/SideNav/SideNav.doc.mjs +13 -4
  168. package/src/SideNav/SideNav.test.tsx +858 -2
  169. package/src/SideNav/SideNav.tsx +37 -16
  170. package/src/SideNav/SideNavCollapseButton.doc.mjs +28 -6
  171. package/src/SideNav/SideNavCollapseButton.tsx +67 -15
  172. package/src/SideNav/SideNavCollapseContext.ts +29 -9
  173. package/src/SideNav/SideNavHeading.tsx +53 -25
  174. package/src/SideNav/SideNavItem.doc.mjs +13 -0
  175. package/src/SideNav/SideNavItem.tsx +97 -84
  176. package/src/SideNav/SideNavSection.tsx +6 -20
  177. package/src/SideNav/index.ts +2 -0
  178. package/src/Slider/Slider.test.tsx +69 -33
  179. package/src/Slider/Slider.tsx +65 -13
  180. package/src/Switch/Switch.tsx +20 -0
  181. package/src/TabList/TabList.doc.mjs +3 -0
  182. package/src/Text/Text.doc.mjs +1 -1
  183. package/src/Thumbnail/Thumbnail.doc.mjs +3 -0
  184. package/src/Thumbnail/Thumbnail.tsx +10 -0
  185. package/src/Timestamp/Timestamp.test.tsx +40 -22
  186. package/src/Toolbar/Toolbar.test.tsx +14 -14
  187. package/src/TopNav/TopNav.test.tsx +86 -1
  188. package/src/TopNav/TopNavHeading.tsx +21 -14
  189. package/src/TopNav/TopNavMegaMenu.test.tsx +43 -0
  190. package/src/TopNav/TopNavMegaMenu.tsx +29 -105
  191. package/src/TopNav/TopNavMegaMenuItem.tsx +1 -1
  192. package/src/TopNav/TopNavMenu.test.tsx +41 -0
  193. package/src/TopNav/TopNavMenu.tsx +14 -4
  194. package/src/TreeList/TreeList.doc.mjs +1 -0
  195. package/src/hooks/containerReveal.stylex.ts +140 -9
  196. package/src/hooks/index.ts +6 -1
  197. package/src/hooks/useContainerReveal.doc.mjs +11 -5
  198. package/src/hooks/useContainerReveal.test.tsx +70 -3
  199. package/src/hooks/useContainerReveal.ts +86 -7
  200. package/src/hooks/useFocusTrap.test.tsx +16 -0
  201. package/src/hooks/useFocusTrap.ts +20 -2
  202. package/src/hooks/useMenuHover.test.tsx +364 -0
  203. package/src/hooks/useMenuHover.ts +243 -47
  204. package/src/theme/defineTheme.test.ts +127 -0
  205. package/src/theme/defineTheme.ts +57 -51
  206. package/src/theme/derivedVarRegistry.test.ts +78 -12
  207. package/src/theme/derivedVarRegistry.ts +4 -0
  208. package/src/theme/expandColorScale.ts +1 -0
  209. package/src/theme/expandMotionScale.ts +1 -0
  210. package/src/theme/expandRadiusScale.ts +1 -0
  211. package/src/theme/expandTypeScale.ts +1 -0
  212. package/src/theme/mergeComponents.ts +59 -0
  213. package/src/theme/onMediaTokens.ts +9 -2
  214. package/src/theme/themingTargets.test.ts +152 -26
  215. package/src/theme/tokens.stylex.ts +3 -1
  216. package/src/theme/tokens.test.ts +12 -0
  217. package/src/theme/useTheme.test.tsx +18 -0
@@ -158,14 +158,12 @@ export function TopNavHeading({
158
158
  role: 'none',
159
159
  hasCloseButton: false
160
160
  });
161
- const closeMenuCtx = useMemo(() => ({
162
- closeMenu: popover.hide
163
- }), [popover.hide]);
164
161
  const {
165
162
  triggerProps,
166
163
  contentProps,
167
164
  menuRef,
168
- setTriggerEl
165
+ setTriggerEl,
166
+ close: closeMenu
169
167
  } = useMenuHover({
170
168
  show: popover.show,
171
169
  hide: popover.hide,
@@ -173,7 +171,14 @@ export function TopNavHeading({
173
171
  isEnabled: !!menu,
174
172
  showDelay: 0
175
173
  });
176
- const setRef = mergeRefs(rootRef, setTriggerEl, ref, menu ? popover.triggerRef : undefined);
174
+ const closeMenuCtx = useMemo(() => ({
175
+ closeMenu
176
+ }), [closeMenu]);
177
+
178
+ // setTriggerEl belongs on the chevron button, not this root: it is the
179
+ // focus-restore target and a <div> cannot take focus. triggerRef stays here
180
+ // because the panel anchors to the whole heading.
181
+ const setRef = mergeRefs(rootRef, ref, menu ? popover.triggerRef : undefined);
177
182
  const showChevron = !!menu;
178
183
  const hasAnyHref = !!(headingHref || superheadingHref || subheadingHref);
179
184
 
@@ -247,7 +252,8 @@ export function TopNavHeading({
247
252
  ...{
248
253
  className: "x78zum5 x6s0dn4 x1txdalj xh8yej3 xjbqb8w xjb2p0i x1qlqyl8 x1heor9g x1yc453h xkoleio x12gdq22 x1betex2 x1djylfy xt970qd xcsaf9d x1p37lm5 xhrcg97 x1ypdohk"
249
254
  },
250
- onClick: triggerProps.onClick,
255
+ // A close affordance, not the trigger: dismiss only.
256
+ onClick: closeMenu,
251
257
  children: [logo && /*#__PURE__*/_jsx("span", {
252
258
  ...{
253
259
  className: "x2lah0s x78zum5 x6s0dn4 xl56j7k"
@@ -315,6 +321,7 @@ export function TopNavHeading({
315
321
  // Stays a <button>: this box is the popover trigger, so it carries
316
322
  // the accessible name and handlers — only the glyph moves to Icon.
317
323
  _jsx("button", {
324
+ ref: setTriggerEl,
318
325
  type: "button",
319
326
  "aria-label": t('@astryx.topNav.heading.openMenu'),
320
327
  onClick: e => {
@@ -381,6 +388,7 @@ export function TopNavHeading({
381
388
  // carries the accessible name and handlers — only the glyph
382
389
  // moves to Icon.
383
390
  _jsx("button", {
391
+ ref: setTriggerEl,
384
392
  type: "button",
385
393
  "aria-label": t('@astryx.topNav.heading.openMenu'),
386
394
  onClick: e => {
@@ -1 +1 @@
1
- {"version":3,"file":"TopNavMegaMenu.d.ts","sourceRoot":"","sources":["../../src/TopNav/TopNavMegaMenu.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,EAKZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAiBf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAoM5C,MAAM,WAAW,mBAAoB,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IACvE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,cAAc,CAAC,EAC7B,GAAG,EACH,KAAK,EACL,KAAK,EACL,QAAQ,EACR,KAAW,EACX,SAAe,EACf,YAAY,GACb,EAAE,mBAAmB,4BA+BrB;yBAvCe,cAAc"}
1
+ {"version":3,"file":"TopNavMegaMenu.d.ts","sourceRoot":"","sources":["../../src/TopNav/TopNavMegaMenu.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,EAKZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAkBf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAoM5C,MAAM,WAAW,mBAAoB,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IACvE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,cAAc,CAAC,EAC7B,GAAG,EACH,KAAK,EACL,KAAK,EACL,QAAQ,EACR,KAAW,EACX,SAAe,EACf,YAAY,GACb,EAAE,mBAAmB,4BA+BrB;yBAvCe,cAAc"}
@@ -34,6 +34,7 @@ import * as stylex from '@stylexjs/stylex';
34
34
  import "../theme/tokens.stylex.js";
35
35
  import { colorVars, spacingVars, radiusVars, durationVars, easeVars, fontWeightVars, shadowVars, typeScaleVars, borderVars } from "../theme/tokens.stylex.js";
36
36
  import { usePopover } from "../Popover/usePopover.js";
37
+ import { useMenuHover } from "../hooks/useMenuHover.js";
37
38
  import { Grid } from "../Grid/Grid.js";
38
39
  import { Icon } from "../Icon/index.js";
39
40
  import { mergeProps, mergeRefs } from "../utils/index.js";
@@ -233,7 +234,8 @@ TopNavMegaMenu.displayName = 'TopNavMegaMenu';
233
234
  // DefaultMegaMenu — desktop popover mode
234
235
  // =============================================================================
235
236
 
236
- const CLICK_GUARD_MS = 500;
237
+ /** The panel is a grid of links, not `role="menuitem"` rows. */
238
+ const PANEL_ITEM_SELECTOR = 'a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])';
237
239
  function DefaultMegaMenu({
238
240
  ref,
239
241
  label,
@@ -244,17 +246,11 @@ function DefaultMegaMenu({
244
246
  onOpenChange
245
247
  }) {
246
248
  const slot = useTopNavSlot();
247
- const showTimeoutRef = useRef(null);
248
- const hideTimeoutRef = useRef(null);
249
249
  const triggerButtonRef = useRef(null);
250
- const hoverOpenedAtRef = useRef(0);
251
- const stickyRef = useRef(false);
252
250
  const handlePopoverShow = useCallback(() => {
253
251
  onOpenChange?.(true);
254
252
  }, [onOpenChange]);
255
253
  const handlePopoverHide = useCallback(() => {
256
- hoverOpenedAtRef.current = 0;
257
- stickyRef.current = false;
258
254
  onOpenChange?.(false);
259
255
  }, [onOpenChange]);
260
256
  const popover = usePopover({
@@ -288,93 +284,29 @@ function DefaultMegaMenu({
288
284
  popover.triggerRef(null);
289
285
  };
290
286
  }, [popover]);
291
- const clearTimeouts = useCallback(() => {
292
- if (showTimeoutRef.current) {
293
- clearTimeout(showTimeoutRef.current);
294
- showTimeoutRef.current = null;
295
- }
296
- if (hideTimeoutRef.current) {
297
- clearTimeout(hideTimeoutRef.current);
298
- hideTimeoutRef.current = null;
299
- }
300
- }, []);
301
- const scheduleShow = useCallback(() => {
302
- clearTimeouts();
303
- showTimeoutRef.current = setTimeout(() => {
304
- hoverOpenedAtRef.current = Date.now();
305
- popover.show({
306
- skipAutoFocus: true
307
- });
308
- }, delay);
309
- }, [clearTimeouts, delay, popover]);
310
- const scheduleHide = useCallback(() => {
311
- clearTimeouts();
312
- hideTimeoutRef.current = setTimeout(() => {
313
- popover.hide();
314
- }, hideDelay);
315
- }, [clearTimeouts, hideDelay, popover]);
316
- const focusFirstPanelItem = useCallback(() => {
317
- popover.contentRef.current?.querySelector('a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])')?.focus();
318
- }, [popover.contentRef]);
319
- const handleTriggerMouseEnter = useCallback(() => {
320
- clearTimeouts();
321
- if (!popover.isOpen) {
322
- scheduleShow();
323
- }
324
- }, [clearTimeouts, popover.isOpen, scheduleShow]);
325
- const handlePanelMouseEnter = useCallback(() => {
326
- clearTimeouts();
327
- }, [clearTimeouts]);
328
- const handleMouseLeave = useCallback(() => {
329
- if (!stickyRef.current) {
330
- scheduleHide();
331
- }
332
- }, [scheduleHide]);
333
- const handleClick = useCallback(event => {
334
- // Cancel the native invoker toggle so this guard is the single source of
335
- // truth for trigger activation. popoverTarget still establishes the
336
- // invoker relationship used by native light-dismiss and stacking.
337
- event.preventDefault();
338
- clearTimeouts();
339
- if (event.detail === 0) {
340
- stickyRef.current = true;
341
- hoverOpenedAtRef.current = 0;
342
- if (popover.isOpen) {
343
- focusFirstPanelItem();
344
- } else {
345
- popover.show();
346
- }
347
- } else if (!popover.isOpen) {
348
- stickyRef.current = true;
349
- popover.show({
350
- skipAutoFocus: true
351
- });
352
- } else if (Date.now() - hoverOpenedAtRef.current < CLICK_GUARD_MS) {
353
- // A click that naturally follows a hover-open confirms the open state
354
- // instead of toggling the panel shut. From here it behaves like any
355
- // other click-open and stays pinned until explicit dismissal.
356
- stickyRef.current = true;
357
- hoverOpenedAtRef.current = 0;
358
- } else {
359
- popover.hide();
360
- triggerButtonRef.current?.focus();
361
- }
362
- }, [clearTimeouts, focusFirstPanelItem, popover]);
363
- useEffect(() => {
364
- return () => {
365
- clearTimeouts();
366
- };
367
- }, [clearTimeouts]);
287
+ const {
288
+ triggerProps: hoverTriggerProps,
289
+ contentProps,
290
+ menuRef,
291
+ setTriggerEl
292
+ } = useMenuHover({
293
+ show: popover.show,
294
+ hide: popover.hide,
295
+ isOpen: popover.isOpen,
296
+ isEnabled: true,
297
+ showDelay: delay,
298
+ hideDelay,
299
+ itemSelector: PANEL_ITEM_SELECTOR,
300
+ // Trigger sits outside an auto popover; the invoker relationship exempts it
301
+ // from light dismiss.
302
+ popoverId: popover.id
303
+ });
368
304
  return /*#__PURE__*/_jsxs(_Fragment, {
369
305
  children: [/*#__PURE__*/_jsxs("button", {
370
- ref: mergeRefs(triggerButtonRef, ref),
306
+ ref: mergeRefs(triggerButtonRef, setTriggerEl, ref),
371
307
  type: "button",
372
308
  ...popover.triggerProps,
373
- // Native invoker prevents trigger light-dismiss.
374
- popoverTarget: popover.id,
375
- onClick: handleClick,
376
- onMouseEnter: handleTriggerMouseEnter,
377
- onMouseLeave: handleMouseLeave,
309
+ ...hoverTriggerProps,
378
310
  ...mergeProps(themeProps('top-nav-mega-menu'), focusOutlineProps.focusVisible(styles.trigger, popover.isOpen && styles.triggerOpen)),
379
311
  children: [label, /*#__PURE__*/_jsx(Icon, {
380
312
  icon: "chevronDown",
@@ -386,10 +318,10 @@ function DefaultMegaMenu({
386
318
  // role="group" — a mega menu is a browsing grid of links, not an
387
319
  // ARIA menu of menuitems (per the WAI-ARIA APG, the menu role is
388
320
  // for action menus; link mega menus are the documented anti-case).
321
+ ref: menuRef,
389
322
  role: "group",
390
323
  "aria-label": label,
391
- onMouseEnter: handlePanelMouseEnter,
392
- onMouseLeave: handleMouseLeave,
324
+ ...contentProps,
393
325
  ...{
394
326
  className: "x1prclbq x11xkdxz x13fuv20 x1pc3f07 x1hviunn x1i5ehqx xb3r6kr x78zum5 xdt5ytf x2lwn1j"
395
327
  },
@@ -439,7 +371,7 @@ function DrawerMegaMenu({
439
371
  "aria-controls": `${menuId}-items`,
440
372
  ...mergeProps(themeProps('top-nav-mega-menu', {
441
373
  mode: 'drawer'
442
- }), stylex.props(navItemStyles.item, styles.drawerHeader)),
374
+ }), focusOutlineProps.focusVisible(navItemStyles.item, styles.drawerHeader)),
443
375
  children: [label, /*#__PURE__*/_jsx(Icon, {
444
376
  icon: "chevronDown",
445
377
  size: "sm",
@@ -126,7 +126,7 @@ export function TopNavMegaMenuItem({
126
126
  ...elementProps,
127
127
  ...mergeProps(themeProps('top-nav-mega-menu-item', {
128
128
  mode: 'drawer'
129
- }), stylex.props(navItemStyles.item, styles.drawerItem)),
129
+ }), focusOutlineProps.focusVisible(navItemStyles.item, styles.drawerItem)),
130
130
  children: [icon && /*#__PURE__*/_jsx("div", {
131
131
  ...{
132
132
  className: "x78zum5 x6s0dn4 xl56j7k x1td3qas x10w6t97 xh6dtrn x17x4s8c x2lah0s xv9yike xjc2qm6"
@@ -1 +1 @@
1
- {"version":3,"file":"TopNavMenu.d.ts","sourceRoot":"","sources":["../../src/TopNav/TopNavMenu.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,EAKZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAQf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA8L5C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAMD,MAAM,WAAW,eAAgB,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IACnE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAE5B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,wBAAgB,UAAU,CAAC,EACzB,GAAG,EACH,KAAK,EACL,KAAK,EACL,KAAW,EACX,SAAe,GAChB,EAAE,eAAe,4BAkOjB;yBAxOe,UAAU"}
1
+ {"version":3,"file":"TopNavMenu.d.ts","sourceRoot":"","sources":["../../src/TopNav/TopNavMenu.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,EAKZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAQf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA8L5C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAMD,MAAM,WAAW,eAAgB,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IACnE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAE5B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,wBAAgB,UAAU,CAAC,EACzB,GAAG,EACH,KAAK,EACL,KAAK,EACL,KAAW,EACX,SAAe,GAChB,EAAE,eAAe,4BA4OjB;yBAlPe,UAAU"}
@@ -197,14 +197,18 @@ export function TopNavMenu({
197
197
  triggerProps,
198
198
  contentProps,
199
199
  menuRef,
200
- setTriggerEl
200
+ setTriggerEl,
201
+ close
201
202
  } = useMenuHover({
202
203
  show: popover.show,
203
204
  hide: popover.hide,
204
205
  isOpen: popover.isOpen,
205
206
  isEnabled: true,
206
207
  showDelay: delay,
207
- hideDelay
208
+ hideDelay,
209
+ // Trigger sits outside an auto popover; the invoker relationship exempts
210
+ // it from light dismiss.
211
+ popoverId: popover.id
208
212
  });
209
213
  const setTriggerRef = mergeRefs(triggerButtonRef, popover.triggerRef, setTriggerEl, ref);
210
214
 
@@ -221,7 +225,8 @@ export function TopNavMenu({
221
225
  } = useListFocus({
222
226
  itemSelector: '[role="menuitem"]',
223
227
  hasRovingTabIndex: true,
224
- onEscape: popover.hide
228
+ // Not popover.hide: Escape must also restore focus to the trigger.
229
+ onEscape: close
225
230
  });
226
231
 
227
232
  // First-character typeahead over the menu items (menus-11).
@@ -272,7 +277,7 @@ export function TopNavMenu({
272
277
  onClick: () => setDrawerExpanded(v => !v),
273
278
  "aria-expanded": drawerExpanded,
274
279
  "aria-controls": `${menuId}-items`,
275
- ...stylex.props(navItemStyles.item, drawerStyles.header),
280
+ ...focusOutlineProps.focusVisible(navItemStyles.item, drawerStyles.header),
276
281
  children: [label, /*#__PURE__*/_jsx(Icon, {
277
282
  icon: "chevronDown",
278
283
  size: "sm",
@@ -299,7 +304,7 @@ export function TopNavMenu({
299
304
  item.onClick?.();
300
305
  closeMobileNav();
301
306
  },
302
- ...stylex.props(navItemStyles.item, drawerStyles.item),
307
+ ...focusOutlineProps.focusVisible(navItemStyles.item, drawerStyles.item),
303
308
  children: [item.icon && /*#__PURE__*/_jsx("span", {
304
309
  ...{
305
310
  className: "x2lah0s xw4jnvo x1qx5ct2"
package/dist/astryx.css CHANGED
@@ -4,6 +4,7 @@
4
4
  @layer astryx-base {
5
5
  @property --x---_avatar-group-overlap { syntax: "*"; inherits: false;}
6
6
  @property --x---_codeblock-gutter-width { syntax: "*"; inherits: false;}
7
+ @property --x---_hover-delay { syntax: "*"; inherits: false;}
7
8
  @property --x---_tab-indicator-bottom { syntax: "*"; inherits: false;}
8
9
  @property --x---container-max-height { syntax: "*"; inherits: false;}
9
10
  @property --x---layout-content-width { syntax: "*"; inherits: false;}
@@ -91,24 +92,33 @@
91
92
  .xk0ittl{--_chat-composer-padding:var(--spacing-3)}
92
93
  .xx161y6{--_chat-composer-radius:var(--radius-chat)}
93
94
  .xtk08jq{--_codeblock-gutter-width:var(--x---_codeblock-gutter-width)}
95
+ .x9pmotm{--_conceal-opacity:0}
94
96
  .x1kgmhs9{--_conceal-opacity:1}
95
97
  .xvuvksw{--_dialog-radius:var(--radius-container)}
96
98
  .xgory14{--_dropdown-menu-padding:var(--spacing-1)}
97
99
  .x1fcsqxe{--_dropdown-menu-radius:var(--radius-container)}
100
+ .x13l1x9d{--_fade-delay:0s}
98
101
  .x1832zxr{--_field-radius:var(--radius-element)}
99
102
  .xgzxwq1{--_focus-outline-offset:0}
100
103
  .x17wzz1v{--_focus-outline:none}
104
+ .xhg274n{--_hover-delay:0s}
105
+ .x8xu23y{--_hover-delay:var(--x---_hover-delay)}
101
106
  .xqwz7mz{--_hovercard-radius:var(--radius-container)}
102
107
  .xqlix59{--_item-description-color:var(--color-error)}
103
108
  .xufyqxy{--_item-label-color:var(--color-error)}
109
+ .xdjmrzf{--_reveal-delay-reduced:0s,0s}
110
+ .x1dejzja{--_reveal-delay:0s,0s}
104
111
  .x1xiarpw{--_reveal-delay:0s,var(--duration-fast)}
105
112
  .xct0gwe{--_reveal-opacity:0}
113
+ .x5setjs{--_reveal-opacity:1}
106
114
  .xp0pj8v{--_reveal-position:absolute}
115
+ .x1r6s5ct{--_reveal-position:static}
107
116
  .x18jk3ff{--_segmented-control-padding:var(--spacing-0-5)}
108
117
  .x9icjy1{--_segmented-control-radius:var(--radius-element)}
109
118
  .xficto1{--_tab-indicator-bottom:calc(-1 * (var(--spacing-1) + var(--border-width)))}
110
119
  .xbrl7fg{--_tab-indicator-bottom:var(--x---_tab-indicator-bottom)}
111
120
  .x1kdpo6e{--_textarea-inline-padding:var(--spacing-2)}
121
+ .x1ur4yav{--_thumbnail-hit-inset:0px}
112
122
  .xnvcwyz{--astryx-section-padding:var(--spacing-0-5)}
113
123
  .xvdw317{--astryx-section-padding:var(--spacing-0)}
114
124
  .x1rj2uvf{--astryx-section-padding:var(--spacing-1-5)}
@@ -288,8 +298,10 @@
288
298
  .xkce8z9{--separator-display:flex}
289
299
  .xpa4xmd{--tree-list-indent:var(--spacing-4)}
290
300
  .x1xbi2jf{--tree-list-row-gap:var(--spacing-0-5)}
301
+ .x1wfyzv7:focus-within{--_fade-delay:0s}
291
302
  .xqchwus:focus-visible{--_focus-outline-offset:var(--focus-outline-offset)}
292
303
  .xqih627:focus-visible{--_focus-outline:var(--focus-outline-width) var(--focus-outline-style) var(--focus-outline-color)}
304
+ .x1z42dm:focus-within{--_reveal-delay-reduced:0s,0s}
293
305
  .x1mjsb9v:focus-within{--_reveal-delay:0s,0s}
294
306
  .xi33vf3:focus-within{--_reveal-opacity:1}
295
307
  .xoa21yc:focus-within{--_reveal-position:static}
@@ -297,12 +309,24 @@
297
309
  .x1ibt0lz:first-child{--separator-display:none}
298
310
  .x1rht92:nth-child(even){--table-row-overlay:var(--color-background-muted)}
299
311
  .x1m3wso9:hover{--indicator-color:var(--color-accent)}
312
+ @media (any-pointer: coarse){.x1hl81f0.x1hl81f0{--_fade-delay:0s}}
313
+ @media (any-pointer: coarse){.xm1aeao.xm1aeao{--_reveal-delay-reduced:0s,0s}}
300
314
  @media (any-pointer: coarse){.x1pn63d7.x1pn63d7{--_reveal-delay:0s,0s}}
301
315
  @media (any-pointer: coarse){.xi7d7de.xi7d7de{--_reveal-opacity:1}}
302
316
  @media (any-pointer: coarse){.xarvkxi.xarvkxi{--_reveal-position:static}}
317
+ @media (pointer: coarse){.x1h9khjt.x1h9khjt{--_thumbnail-hit-inset:-2px}}
303
318
  @media (hover: hover){.xb9fdgj.xb9fdgj:hover{--_conceal-opacity:0}}
319
+ @media (hover: hover){.xflzsy.xflzsy:hover{--_conceal-opacity:1}}
320
+ @media (hover: hover){.x3tau1w.x3tau1w:hover{--_fade-delay:0s}}
321
+ @media (hover: hover){.x1ho7nxo.x1ho7nxo:hover{--_fade-delay:var(--_hover-delay,0s)}}
322
+ @media (hover: hover){.xfu6dsl.xfu6dsl:hover{--_reveal-delay-reduced:0s,0s}}
323
+ @media (hover: hover){.x1g1w2pt.x1g1w2pt:hover{--_reveal-delay-reduced:var(--_hover-delay,0s),var(--_hover-delay,0s)}}
304
324
  @media (hover: hover){.xp1dr9k.xp1dr9k:hover{--_reveal-delay:0s,0s}}
325
+ @media (hover: hover){.x619wqp.x619wqp:hover{--_reveal-delay:0s,var(--duration-fast)}}
326
+ @media (hover: hover){.x1qamfbu.x1qamfbu:hover{--_reveal-delay:var(--_hover-delay,0s),var(--_hover-delay,0s)}}
327
+ @media (hover: hover){.xichi0p.xichi0p:hover{--_reveal-opacity:0}}
305
328
  @media (hover: hover){.x1wblmmc.x1wblmmc:hover{--_reveal-opacity:1}}
329
+ @media (hover: hover){.x1sacq21.x1sacq21:hover{--_reveal-position:absolute}}
306
330
  @media (hover: hover){.x106rhu.x106rhu:hover{--_reveal-position:static}}
307
331
  @media (hover: hover){.x1pkcbo2.x1pkcbo2:hover{--table-row-overlay:var(--color-overlay-hover)}}
308
332
  .xln7xf2:not(#\#){font:inherit}
@@ -997,6 +1021,7 @@
997
1021
  .x10l6tqk:not(#\#):not(#\#):not(#\#){position:absolute}
998
1022
  .xixxii4:not(#\#):not(#\#):not(#\#){position:fixed}
999
1023
  .x1n2onr6:not(#\#):not(#\#):not(#\#){position:relative}
1024
+ .x1uhb9sk:not(#\#):not(#\#):not(#\#){position:static}
1000
1025
  .x7wzq59:not(#\#):not(#\#):not(#\#){position:sticky}
1001
1026
  .x1mf7ja4:not(#\#):not(#\#):not(#\#){position:var(--_reveal-position,static)}
1002
1027
  .xtt52l0:not(#\#):not(#\#):not(#\#){resize:none}
@@ -1068,6 +1093,7 @@
1068
1093
  .xd00j3c:not(#\#):not(#\#):not(#\#){transition-behavior:allow-discrete}
1069
1094
  .x5h36tt:not(#\#):not(#\#):not(#\#){transition-delay:.15s}
1070
1095
  .x1ahifba:not(#\#):not(#\#):not(#\#){transition-delay:0s}
1096
+ .x4avkj2:not(#\#):not(#\#):not(#\#){transition-delay:var(--_fade-delay,0s)}
1071
1097
  .x1rq8cwj:not(#\#):not(#\#):not(#\#){transition-delay:var(--_reveal-delay,0s,0s)}
1072
1098
  .x10b1n17:not(#\#):not(#\#):not(#\#){transition-delay:var(--duration-fast)}
1073
1099
  .x11bq7d0:not(#\#):not(#\#):not(#\#){transition-duration:.06s}
@@ -1148,15 +1174,16 @@
1148
1174
  .xfd3fxj:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#){animation-name:x1c2q33o-B}
1149
1175
  .x1vxsm5i:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#){animation-name:xu7jd1z-B}
1150
1176
  .x18lne9g:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#){animation-name:xwmkjkf-B}
1151
- .xajhecq:not(:has(~ *:not([popover]))):not(#\#):not(#\#):not(#\#){border-end-end-radius:var(--radius-element)}
1152
- .x12tyzlf:not(:has(~ *:not([popover]))):not(#\#):not(#\#):not(#\#){border-end-start-radius:var(--radius-element)}
1153
- .xbfdvlp:not(:has(~ *:not([popover]))):not(#\#):not(#\#):not(#\#){border-start-end-radius:var(--radius-element)}
1177
+ .x1rmb4wm:not(:has(~ *:not([popover]):not(template))):not(#\#):not(#\#):not(#\#){border-end-end-radius:var(--radius-element)}
1178
+ .xturttb:not(:has(~ *:not([popover]):not(template))):not(#\#):not(#\#):not(#\#){border-end-start-radius:var(--radius-element)}
1179
+ .x1tzxhge:not(:has(~ *:not([popover]):not(template))):not(#\#):not(#\#):not(#\#){border-start-end-radius:var(--radius-element)}
1154
1180
  .xuihb5h:focus-within:not(#\#):not(#\#):not(#\#){box-shadow:inset 0 0 0 2px var(--color-accent-muted)}
1155
1181
  .x15ysqaf:focus-within:not(#\#):not(#\#):not(#\#){box-shadow:none}
1156
1182
  .xyavpck:focus-within:not(#\#):not(#\#):not(#\#){box-shadow:var(--shadow-med)}
1157
1183
  .x10wafsz:focus-within:not(#\#):not(#\#):not(#\#){clip-path:none}
1158
1184
  .x1y40yee:popover-open:not(#\#):not(#\#):not(#\#){display:flex}
1159
1185
  .x1sik18w:not(:first-child):not(#\#):not(#\#):not(#\#){margin-inline-start:var(--_avatar-group-overlap)}
1186
+ .x1euntei:focus-within:not(#\#):not(#\#):not(#\#){opacity:1}
1160
1187
  .x25t5g8:focus-visible:not(#\#):not(#\#):not(#\#){opacity:1}
1161
1188
  .xof6bs:is(th:hover *):not(#\#):not(#\#):not(#\#){opacity:1}
1162
1189
  .xofkqq2:popover-open:not(#\#):not(#\#):not(#\#){opacity:1}
@@ -1169,6 +1196,7 @@
1169
1196
  .x1jhp3zv:focus-visible:not(#\#):not(#\#):not(#\#){outline-style:var(--focus-outline-style)}
1170
1197
  .x1vidyx5:focus-visible:not(#\#):not(#\#):not(#\#){outline-width:var(--focus-outline-width)}
1171
1198
  .xbt4iw:focus-within:not(#\#):not(#\#):not(#\#){pointer-events:auto}
1199
+ .xo74pv5:focus-within:not(#\#):not(#\#):not(#\#){position:static}
1172
1200
  .x1mqgsch:is([data-astryx-scrolling]):not(#\#):not(#\#):not(#\#){scrollbar-width:none}
1173
1201
  .xaafvuh:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#){transform:scaleX(-1) rotate(0deg)}
1174
1202
  .x1nxqau:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#){transform:scaleX(-1) rotate(90deg)}
@@ -1184,10 +1212,6 @@
1184
1212
  .x9cjr8z:popover-open:not(#\#):not(#\#):not(#\#){transform:translateY(0)}
1185
1213
  .x75qhwu:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#){transform:var(--x-sj6hyi)}
1186
1214
  .x1rm9qnc:focus-within:not(#\#):not(#\#):not(#\#){z-index:1}
1187
- .x1vej5at:has(+ [popover] + [popover]:last-child):not(#\#):not(#\#):not(#\#){border-end-end-radius:var(--radius-element)}
1188
- .xxd14kb:has(+ [popover]:last-child):not(#\#):not(#\#):not(#\#){border-end-end-radius:var(--radius-element)}
1189
- .x1ir7nn6:has(+ [popover] + [popover]:last-child):not(#\#):not(#\#):not(#\#){border-start-end-radius:var(--radius-element)}
1190
- .xpufgd0:has(+ [popover]:last-child):not(#\#):not(#\#):not(#\#){border-start-end-radius:var(--radius-element)}
1191
1215
  .x1btxeh5:has(input:focus-visible):not(#\#):not(#\#):not(#\#){box-shadow:inset 0 0 0 2px var(--color-accent)}
1192
1216
  .x92e2el:has(> [data-astryx-edge-comp]:last-child):not(#\#):not(#\#):not(#\#){margin-inline-end:var(--x-4drmnv)}
1193
1217
  .x1kftj4p:has(> [data-astryx-edge-comp]:first-child):not(#\#):not(#\#):not(#\#){margin-inline-start:var(--x-126w13d)}
@@ -1242,11 +1266,13 @@
1242
1266
  @media (max-width: 480px){.x1rpgqan.x1rpgqan:not(#\#):not(#\#):not(#\#){flex-direction:column}}
1243
1267
  @media (pointer: coarse){.x6pjikd.x6pjikd:not(#\#):not(#\#):not(#\#){font-size:max(1rem,var(--text-body-size))}}
1244
1268
  @media (pointer: coarse){.xdk3u5w.xdk3u5w:not(#\#):not(#\#):not(#\#){font-size:max(1rem,var(--text-label-size))}}
1269
+ @media (pointer: coarse){.x1hsn8va.x1hsn8va:not(#\#):not(#\#):not(#\#){inset-inline-start:50%}}
1245
1270
  @media (pointer: coarse){.x1jymrmb.x1jymrmb:not(#\#):not(#\#):not(#\#){margin-inline-start:auto}}
1246
1271
  @media (forced-colors: active){.x1tbh5bv.x1tbh5bv:not(#\#):not(#\#):not(#\#){opacity:1}}
1247
1272
  @media (pointer: coarse){.xozvky.xozvky:not(#\#):not(#\#):not(#\#){order:1}}
1248
1273
  @media (prefers-reduced-motion: reduce){.xg83hb1.xg83hb1:not(#\#):not(#\#):not(#\#){scroll-behavior:auto}}
1249
- @media (prefers-reduced-motion: reduce){.x1k6wr6r.x1k6wr6r:not(#\#):not(#\#):not(#\#){transition-delay:0s,0s}}
1274
+ @media (pointer: coarse){.x8i4i9p.x8i4i9p:not(#\#):not(#\#):not(#\#){transform:translate(-50%,-50%)}}
1275
+ @media (prefers-reduced-motion: reduce){.xwgk2z2.xwgk2z2:not(#\#):not(#\#):not(#\#){transition-delay:var(--_reveal-delay-reduced,0s,0s)}}
1250
1276
  @media (prefers-reduced-motion: reduce){.xsagj69.xsagj69:not(#\#):not(#\#):not(#\#){transition-duration:.01ms}}
1251
1277
  @media (prefers-reduced-motion: reduce){.xzg1mie.xzg1mie:not(#\#):not(#\#):not(#\#){transition-duration:.01s}}
1252
1278
  @media (prefers-reduced-motion: reduce){.xsr0bmt.xsr0bmt:not(#\#):not(#\#):not(#\#){transition-duration:0s,0s}}
@@ -1283,6 +1309,8 @@
1283
1309
  @media (hover: hover){.x4z56r7.x4z56r7:hover:not(#\#):not(#\#):not(#\#){color:color-mix(in srgb,var(--color-text-primary),var(--color-tint-hover) 15%)}}
1284
1310
  @media (hover: hover){.x7ruf5d.x7ruf5d:hover:not(#\#):not(#\#):not(#\#){color:color-mix(in srgb,var(--color-text-secondary),var(--color-tint-hover) 15%)}}
1285
1311
  @media (hover: hover){.x140uwzg.x140uwzg:hover:not(#\#):not(#\#):not(#\#){color:var(--color-text-primary)}}
1312
+ @media (forced-colors: active){.x1vo6n7o.x1vo6n7o:active:not(#\#):not(#\#):not(#\#){background-color:Highlight}}
1313
+ @media (hover: hover){@media (forced-colors: active){.x1jawyga.x1jawyga.x1jawyga:hover:not(#\#):not(#\#):not(#\#){background-color:Highlight}}}
1286
1314
  .xib2hle:not(#\#):not(#\#):not(#\#):not(#\#){border-bottom-color:var(--color-border-emphasized)}
1287
1315
  .xw8gpjh:not(#\#):not(#\#):not(#\#):not(#\#){border-bottom-color:var(--color-border)}
1288
1316
  .x1q0q8m5:not(#\#):not(#\#):not(#\#):not(#\#){border-bottom-style:solid}
@@ -1587,12 +1615,16 @@
1587
1615
  .x15cytp8:focus:not(#\#):not(#\#):not(#\#):not(#\#){height:auto}
1588
1616
  .x1rw3289:focus:not(#\#):not(#\#):not(#\#):not(#\#){top:var(--spacing-2)}
1589
1617
  .x1jqxupm:focus:not(#\#):not(#\#):not(#\#):not(#\#){width:auto}
1618
+ @media (pointer: coarse){.x80b3aj.x80b3aj:not(#\#):not(#\#):not(#\#):not(#\#){min-height:24px}}
1590
1619
  @media (pointer: coarse){.x17aqpur.x17aqpur:not(#\#):not(#\#):not(#\#):not(#\#){min-height:44px}}
1620
+ @media (pointer: coarse){.xkagaj0.xkagaj0:not(#\#):not(#\#):not(#\#):not(#\#){min-width:24px}}
1591
1621
  @media (pointer: coarse){.x1xrq5m.x1xrq5m:not(#\#):not(#\#):not(#\#):not(#\#){min-width:44px}}
1622
+ @media (pointer: coarse){.xijlfn0.xijlfn0:not(#\#):not(#\#):not(#\#):not(#\#){top:50%}}
1592
1623
  @starting-style{.x1sopeo2.x1sopeo2:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#){grid-template-rows:0fr}}
1593
1624
  .x1xsm0q9:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::after{inset:-14px}
1594
1625
  .xarstr8:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::after{inset:0}
1595
1626
  .xxx281p:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::before{inset:0}
1627
+ .xeu5z55:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#)::after{inset:var(--_thumbnail-hit-inset)}
1596
1628
  @starting-style{.x4itv7f.x4itv7f:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#){opacity:0}}
1597
1629
  @starting-style{.xub2912.xub2912:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#){transform:translateY(-100%)}}
1598
1630
  @starting-style{.x12p7p72.x12p7p72:not(#\#):not(#\#):not(#\#):not(#\#):not(#\#){transform:translateY(-4px)}}