@astryxdesign/core 0.6.3-canary.ea2f048 → 0.6.3-canary.ebaebc4

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 (101) hide show
  1. package/dist/Button/Button.d.ts.map +1 -1
  2. package/dist/Button/Button.js +13 -28
  3. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  4. package/dist/Chat/ChatLayoutScrollButton.js +43 -33
  5. package/dist/Citation/Citation.d.ts +1 -1
  6. package/dist/Citation/Citation.d.ts.map +1 -1
  7. package/dist/Citation/Citation.js +3 -2
  8. package/dist/CodeBlock/highlightRanges.d.ts.map +1 -1
  9. package/dist/CodeBlock/highlightRanges.js +14 -3
  10. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  11. package/dist/Dialog/DialogHeader.js +4 -4
  12. package/dist/Icon/Icon.d.ts +6 -31
  13. package/dist/Icon/Icon.d.ts.map +1 -1
  14. package/dist/Icon/Icon.js +8 -71
  15. package/dist/Icon/IconDefaultSizeContext.d.ts +4 -0
  16. package/dist/Icon/IconDefaultSizeContext.d.ts.map +1 -0
  17. package/dist/Icon/IconDefaultSizeContext.js +18 -0
  18. package/dist/Icon/IconSize.stylex.d.ts +65 -0
  19. package/dist/Icon/IconSize.stylex.d.ts.map +1 -0
  20. package/dist/Icon/IconSize.stylex.js +75 -0
  21. package/dist/Link/useLinkComponent.d.ts +5 -15
  22. package/dist/Link/useLinkComponent.d.ts.map +1 -1
  23. package/dist/Link/useLinkComponent.js +34 -51
  24. package/dist/Markdown/Markdown.js +2 -2
  25. package/dist/Markdown/url.d.ts +2 -0
  26. package/dist/Markdown/url.d.ts.map +1 -1
  27. package/dist/Markdown/url.js +8 -2
  28. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  29. package/dist/PowerSearch/PowerSearchValueEditor.js +5 -0
  30. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  31. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  32. package/dist/TopNav/TopNavMenu.js +3 -2
  33. package/dist/astryx.css +0 -2
  34. package/dist/hooks/useClickableContainer.d.ts +10 -1
  35. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  36. package/dist/hooks/useClickableContainer.js +15 -4
  37. package/dist/theme/declarationBoundary.d.ts +17 -0
  38. package/dist/theme/declarationBoundary.d.ts.map +1 -0
  39. package/dist/theme/declarationBoundary.js +343 -0
  40. package/dist/theme/generateThemeRules.d.ts +13 -7
  41. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  42. package/dist/theme/generateThemeRules.js +131 -35
  43. package/dist/utils/safeUrl.d.ts +11 -0
  44. package/dist/utils/safeUrl.d.ts.map +1 -0
  45. package/dist/utils/safeUrl.js +78 -0
  46. package/package.json +3 -3
  47. package/src/Button/Button.doc.mjs +5 -5
  48. package/src/Button/Button.tsx +15 -13
  49. package/src/Chat/ChatLayoutScrollButton.spec.md +338 -0
  50. package/src/Chat/ChatLayoutScrollButton.tsx +15 -10
  51. package/src/Chat/__tests__/ChatLayoutScrollButton.a11y.chromium.spec.ts +6 -2
  52. package/src/Chat/__tests__/ChatLayoutScrollButtonSurface.a11y.chromium.spec.ts +740 -0
  53. package/src/Citation/Citation.doc.mjs +2 -2
  54. package/src/Citation/Citation.test.tsx +17 -0
  55. package/src/Citation/Citation.tsx +4 -2
  56. package/src/ClickableCard/ClickableCard.doc.mjs +2 -2
  57. package/src/CodeBlock/highlightRanges.test.ts +143 -1
  58. package/src/CodeBlock/highlightRanges.ts +15 -5
  59. package/src/Dialog/Dialog.doc.mjs +2 -0
  60. package/src/Dialog/DialogHeader.doc.mjs +10 -0
  61. package/src/Dialog/DialogHeader.test.tsx +70 -3
  62. package/src/Dialog/DialogHeader.tsx +14 -5
  63. package/src/Dialog/modules/DialogHeader.spec.md +62 -40
  64. package/src/Icon/Icon.doc.mjs +7 -5
  65. package/src/Icon/Icon.spec.md +81 -40
  66. package/src/Icon/Icon.test.tsx +6 -3
  67. package/src/Icon/Icon.tsx +20 -68
  68. package/src/Icon/IconDefaultSizeContext.ts +23 -0
  69. package/src/Icon/IconSize.stylex.ts +70 -0
  70. package/src/IconButton/IconButton.doc.mjs +3 -3
  71. package/src/IconButton/IconButton.test.tsx +40 -0
  72. package/src/Item/Item.doc.mjs +2 -2
  73. package/src/Link/Link.doc.mjs +6 -4
  74. package/src/Link/LinkProvider.doc.mjs +2 -2
  75. package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +261 -0
  76. package/src/Link/useLinkComponent.test.tsx +333 -0
  77. package/src/Link/useLinkComponent.ts +29 -57
  78. package/src/List/ListItem.doc.mjs +2 -2
  79. package/src/Markdown/Markdown.doc.mjs +2 -2
  80. package/src/Markdown/Markdown.renderBoundary.test.tsx +72 -0
  81. package/src/Markdown/Markdown.spec.md +19 -15
  82. package/src/Markdown/Markdown.test.tsx +52 -0
  83. package/src/Markdown/Markdown.tsx +2 -2
  84. package/src/Markdown/parser.test.ts +20 -0
  85. package/src/Markdown/url.ts +9 -3
  86. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +51 -0
  87. package/src/PowerSearch/PowerSearchValueEditor.tsx +4 -0
  88. package/src/Token/Token.doc.mjs +2 -2
  89. package/src/TopNav/TopNavMenu.doc.mjs +2 -2
  90. package/src/TopNav/TopNavMenu.test.tsx +30 -0
  91. package/src/TopNav/TopNavMenu.tsx +7 -2
  92. package/src/hooks/useClickableContainer.test.tsx +236 -0
  93. package/src/hooks/useClickableContainer.ts +20 -4
  94. package/src/theme/Theme.test.tsx +32 -0
  95. package/src/theme/declarationBoundary.test.ts +126 -0
  96. package/src/theme/declarationBoundary.ts +347 -0
  97. package/src/theme/generateThemeRules.test.ts +470 -2
  98. package/src/theme/generateThemeRules.ts +219 -51
  99. package/src/theme/tokenValueCompat.test.ts +4 -1
  100. package/src/utils/safeUrl.test.ts +88 -0
  101. package/src/utils/safeUrl.ts +85 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../src/Button/Button.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../src/Button/Button.tsx"],"names":[],"mappings":"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"}
@@ -24,6 +24,8 @@ import "../theme/tokens.stylex.js";
24
24
  import { colorVars, sizeVars, spacingVars, radiusVars, borderVars, durationVars, easeVars, fontWeightVars, typeScaleVars, shadowVars, focusVars } from "../theme/tokens.stylex.js";
25
25
  import { Spinner } from "../Spinner/index.js";
26
26
  import { VisuallyHidden } from "../VisuallyHidden/index.js";
27
+ import { IconDefaultSizeProvider } from "../Icon/IconDefaultSizeContext.js";
28
+ import { iconBoxSizeStyles } from "../Icon/IconSize.stylex.js";
27
29
  import { EDGE_COMP_ATTR } from "../Layout/edgeCompensation.stylex.js";
28
30
  import { useSize } from "../SizeContext/SizeContext.js";
29
31
  import { useButtonGroup } from "../ButtonGroup/ButtonGroupContext.js";
@@ -132,32 +134,6 @@ const sizeStyles = {
132
134
  }
133
135
  };
134
136
 
135
- /**
136
- * Icon size per button size.
137
- * Matches Icon sizing: sm/md=16px, lg=20px.
138
- * fontSize is set so emoji and text-based icons scale correctly.
139
- */
140
- const iconSizeStyles = {
141
- sm: {
142
- kzqmXN: "x1kky2od",
143
- kZKoxP: "xlup9mm",
144
- kGuDYH: "x1j61zf2",
145
- $$css: true
146
- },
147
- md: {
148
- kzqmXN: "x1kky2od",
149
- kZKoxP: "xlup9mm",
150
- kGuDYH: "x1j61zf2",
151
- $$css: true
152
- },
153
- lg: {
154
- kzqmXN: "xw4jnvo",
155
- kZKoxP: "x1qx5ct2",
156
- kGuDYH: "xwsyq91",
157
- $$css: true
158
- }
159
- };
160
-
161
137
  /**
162
138
  * Resting elevation for floating buttons (e.g. a FAB). `none` is the default
163
139
  * flat button; `low`/`med`/`high` map to the shadow token scale. 'none' stays
@@ -221,6 +197,11 @@ const variants = {
221
197
  * Button size type derived from the sizeStyles StyleX object
222
198
  */
223
199
 
200
+ const iconSizeByButtonSize = {
201
+ sm: 'sm',
202
+ md: 'sm',
203
+ lg: 'md'
204
+ };
224
205
  const spinnerReveal = "x18re5ia-B";
225
206
  const contentHide = "x188b6p3-B";
226
207
 
@@ -457,6 +438,7 @@ export function Button({
457
438
  size,
458
439
  elevation: buttonGroup ? 'none' : elevation
459
440
  }), sharedStylexProps, className, style);
441
+ const iconSize = iconSizeByButtonSize[size];
460
442
  const buttonContent = /*#__PURE__*/_jsxs(_Fragment, {
461
443
  children: [isLoadingState && /*#__PURE__*/_jsx("span", {
462
444
  ...{
@@ -476,8 +458,11 @@ export function Button({
476
458
  ...stylex.props(styles.contentWrapper, isLoadingState && (delaySpinner ? loadingStyles.hiddenContentDelayed : loadingStyles.hiddenContent)),
477
459
  "aria-hidden": isLoadingState || undefined,
478
460
  children: [icon && /*#__PURE__*/_jsx("span", {
479
- ...stylex.props(styles.iconWrapper, iconSizeStyles[size]),
480
- children: icon
461
+ ...stylex.props(styles.iconWrapper, iconBoxSizeStyles[iconSize]),
462
+ children: /*#__PURE__*/_jsx(IconDefaultSizeProvider, {
463
+ value: iconSize,
464
+ children: icon
465
+ })
481
466
  }), isIconOnly ? null : /*#__PURE__*/_jsx("span", {
482
467
  ...{
483
468
  className: "xb3r6kr xlyipyv xeuugli"
@@ -1 +1 @@
1
- {"version":3,"file":"ChatLayoutScrollButton.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatLayoutScrollButton.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAa1B,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAS5C,MAAM,WAAW,2BAA4B,SAAQ,IAAI,CACvD,SAAS,CAAC,cAAc,CAAC,EACzB,SAAS,CACV;IACC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAsED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,GAAG,EACH,SAAS,EACT,KAAK,EACL,OAAO,EACP,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACR,EAAE,2BAA2B,qBAkC7B;yBA3Ce,sBAAsB"}
1
+ {"version":3,"file":"ChatLayoutScrollButton.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatLayoutScrollButton.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAa1B,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAS5C,MAAM,WAAW,2BAA4B,SAAQ,IAAI,CACvD,SAAS,CAAC,cAAc,CAAC,EACzB,SAAS,CACV;IACC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAsED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,GAAG,EACH,SAAS,EACT,KAAK,EACL,OAAO,EACP,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACR,EAAE,2BAA2B,qBAuC7B;yBAhDe,sBAAsB"}
@@ -75,40 +75,50 @@ export function ChatLayoutScrollButton({
75
75
  ...rest
76
76
  }) {
77
77
  const t = useTranslator();
78
- return /*#__PURE__*/_jsx("div", {
79
- ref: ref,
80
- ...mergeProps(themeProps('chat-layout-scroll-button'), stylex.props(styles.wrapper, xstyle), className, style),
81
- ...rest,
82
- children: /*#__PURE__*/_jsx("div", {
83
- ...{
84
- 0: {
85
- className: "xawy1a7 xb3r6kr xjspbzw x1prclbq x14hfi27 x1ueg155 xrgg2z9 xlr8y92 x2rcmwa x12w9bfk xg01cxk x47corl xlshs6z x1jys5uj"
86
- },
87
- 2: {
88
- className: "xawy1a7 xb3r6kr xjspbzw x1prclbq x14hfi27 x1ueg155 xrgg2z9 xlr8y92 x2rcmwa x12w9bfk x1hc1fzr x67bb7w xnpuxes x1jys5uj"
89
- },
90
- 1: {
91
- className: "xawy1a7 xb3r6kr xjspbzw x1prclbq x14hfi27 x1ueg155 xrgg2z9 xlr8y92 x2rcmwa x12w9bfk xg01cxk x47corl xlshs6z x1ncir08"
92
- },
93
- 3: {
94
- className: "xawy1a7 xb3r6kr xjspbzw x1prclbq x14hfi27 x1ueg155 xrgg2z9 xlr8y92 x2rcmwa x12w9bfk x1hc1fzr x67bb7w xnpuxes x1ncir08"
95
- }
96
- }[!!isVisible << 1 | !!label << 0],
97
- children: /*#__PURE__*/_jsx(Button, {
98
- label: label ?? t('@astryx.chatLayoutScrollButton.scrollToBottom'),
99
- "aria-label": label ?? t('@astryx.chatLayoutScrollButton.scrollToBottom'),
100
- icon: /*#__PURE__*/_jsx(Icon, {
101
- icon: "chevronDown",
102
- size: "md"
103
- }),
104
- variant: "ghost",
105
- size: "md",
106
- isIconOnly: !label,
107
- onClick: onClick,
108
- xstyle: [styles.button, label ? styles.buttonWithLabel : null],
109
- children: label ?? undefined
78
+ return (
79
+ /*#__PURE__*/
80
+ // Two elements, two responsibilities. The outer one centres the pill and
81
+ // holds the gap above the composer — spacing outside the pill's border
82
+ // box, which the pill cannot own itself. The inner one is the pill: it is
83
+ // what a reader sees, so it carries the painted surface AND the public
84
+ // theming target. Keeping the target on the outer element would satisfy
85
+ // every automated check while leaving a theme styling an invisible
86
+ // full-width row (architecture:component-theming-surface INV4).
87
+ _jsx("div", {
88
+ ref: ref,
89
+ ...mergeProps(stylex.props(styles.wrapper, xstyle), className, style),
90
+ ...rest,
91
+ children: /*#__PURE__*/_jsx("div", {
92
+ ...mergeProps(themeProps('chat-layout-scroll-button'), {
93
+ 0: {
94
+ className: "xawy1a7 xb3r6kr xjspbzw x1prclbq x14hfi27 x1ueg155 xrgg2z9 xlr8y92 x2rcmwa x12w9bfk xg01cxk x47corl xlshs6z x1jys5uj"
95
+ },
96
+ 2: {
97
+ className: "xawy1a7 xb3r6kr xjspbzw x1prclbq x14hfi27 x1ueg155 xrgg2z9 xlr8y92 x2rcmwa x12w9bfk x1hc1fzr x67bb7w xnpuxes x1jys5uj"
98
+ },
99
+ 1: {
100
+ className: "xawy1a7 xb3r6kr xjspbzw x1prclbq x14hfi27 x1ueg155 xrgg2z9 xlr8y92 x2rcmwa x12w9bfk xg01cxk x47corl xlshs6z x1ncir08"
101
+ },
102
+ 3: {
103
+ className: "xawy1a7 xb3r6kr xjspbzw x1prclbq x14hfi27 x1ueg155 xrgg2z9 xlr8y92 x2rcmwa x12w9bfk x1hc1fzr x67bb7w xnpuxes x1ncir08"
104
+ }
105
+ }[!!isVisible << 1 | !!label << 0]),
106
+ children: /*#__PURE__*/_jsx(Button, {
107
+ label: label ?? t('@astryx.chatLayoutScrollButton.scrollToBottom'),
108
+ "aria-label": label ?? t('@astryx.chatLayoutScrollButton.scrollToBottom'),
109
+ icon: /*#__PURE__*/_jsx(Icon, {
110
+ icon: "chevronDown",
111
+ size: "md"
112
+ }),
113
+ variant: "ghost",
114
+ size: "md",
115
+ isIconOnly: !label,
116
+ onClick: onClick,
117
+ xstyle: [styles.button, label ? styles.buttonWithLabel : null],
118
+ children: label ?? undefined
119
+ })
110
120
  })
111
121
  })
112
- });
122
+ );
113
123
  }
114
124
  ChatLayoutScrollButton.displayName = 'ChatLayoutScrollButton';
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @file Citation.tsx
3
- * @input Uses React, StyleX, theme tokens
3
+ * @input Uses React, StyleX, theme tokens, and the shared navigation policy
4
4
  * @output Exports Citation component for inline citation references
5
5
  * @position Core implementation; consumed by index.ts
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Citation.d.ts","sourceRoot":"","sources":["../../src/Citation/Citation.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAarC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAK5C,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,aAAc,SAAQ,SAAS,CAAC,WAAW,CAAC;IAC3D,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC9B;AAiHD,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EACH,MAAM,EACN,MAAM,EACN,OAAiB,EACjB,MAAM,EACN,SAAS,EACT,KAAK,EACL,aAAa,EAAE,MAAM,EACrB,GAAG,IAAI,EACR,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CA2FpC;yBArGe,QAAQ"}
1
+ {"version":3,"file":"Citation.d.ts","sourceRoot":"","sources":["../../src/Citation/Citation.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAcrC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAK5C,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,aAAc,SAAQ,SAAS,CAAC,WAAW,CAAC;IAC3D,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC9B;AAiHD,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EACH,MAAM,EACN,MAAM,EACN,OAAiB,EACjB,MAAM,EACN,SAAS,EACT,KAAK,EACL,aAAa,EAAE,MAAM,EACrB,GAAG,IAAI,EACR,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CA4FpC;yBAtGe,QAAQ"}
@@ -4,7 +4,7 @@
4
4
 
5
5
  /**
6
6
  * @file Citation.tsx
7
- * @input Uses React, StyleX, theme tokens
7
+ * @input Uses React, StyleX, theme tokens, and the shared navigation policy
8
8
  * @output Exports Citation component for inline citation references
9
9
  * @position Core implementation; consumed by index.ts
10
10
  *
@@ -19,6 +19,7 @@ import * as stylex from '@stylexjs/stylex';
19
19
  import "../theme/tokens.stylex.js";
20
20
  import { colorVars, spacingVars, radiusVars, typeScaleVars, fontWeightVars, borderVars, durationVars, easeVars } from "../theme/tokens.stylex.js";
21
21
  import { mergeProps } from "../utils/index.js";
22
+ import { isSafeUrl } from "../utils/safeUrl.js";
22
23
  import { themeProps } from "../utils/themeProps.js";
23
24
  import { useTranslator } from "../i18n/index.js";
24
25
  import { renderIconSlot } from "../Icon/index.js";
@@ -103,7 +104,7 @@ export function Citation({
103
104
  }) {
104
105
  const t = useTranslator();
105
106
  const title = source.title ?? String(number);
106
- const href = source.url;
107
+ const href = source.url != null && isSafeUrl(source.url) ? source.url : undefined;
107
108
 
108
109
  // Resolve the source icon. A non-string `icon` node renders as-is (an Astryx
109
110
  // <Icon>, SVG, avatar, etc.). Otherwise fall back to an image URL: `src`, or
@@ -1 +1 @@
1
- {"version":3,"file":"highlightRanges.d.ts","sourceRoot":"","sources":["../../src/CodeBlock/highlightRanges.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAc,SAAS,EAAC,MAAM,aAAa,CAAC;AA8FxD,UAAU,UAAU;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,SAAS,CAAC;CACtB;AAgDD,iBAAS,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAIjD;AA4BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,SAAS,EAAE,GACtB,MAAM,IAAI,CAsHZ;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,SAAS,EAAE,EACvB,SAAS,EAAE,MAAM,GAChB,UAAU,EAAE,CAqBd;AAMD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,WAAW,EACf,UAAU,EAAE,SAAS,EAAE,GACtB,MAAM,IAAI,CA2DZ;AAeD;;GAEG;AACH,OAAO,EAAC,aAAa,EAAC,CAAC"}
1
+ {"version":3,"file":"highlightRanges.d.ts","sourceRoot":"","sources":["../../src/CodeBlock/highlightRanges.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAc,SAAS,EAAC,MAAM,aAAa,CAAC;AAwGxD,UAAU,UAAU;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,SAAS,CAAC;CACtB;AAgDD,iBAAS,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAIjD;AA4BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,SAAS,EAAE,GACtB,MAAM,IAAI,CAsHZ;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,SAAS,EAAE,EACvB,SAAS,EAAE,MAAM,GAChB,UAAU,EAAE,CAqBd;AAMD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,WAAW,EACf,UAAU,EAAE,SAAS,EAAE,GACtB,MAAM,IAAI,CA2DZ;AAeD;;GAEG;AACH,OAAO,EAAC,aAAa,EAAC,CAAC"}
@@ -52,9 +52,20 @@ function ensureDynamicHighlightType(tokenType) {
52
52
  return;
53
53
  }
54
54
  }
55
- const name = `astryx-${tokenType}`;
56
- const colorVar = `var(--color-syntax-${tokenType}, currentColor)`;
57
- dynamicStyleSheet.insertRule(`.astryx-code-block code::highlight(${name}), .astryx-codeeditor code::highlight(${name}) { color: ${colorVar}; }`);
55
+
56
+ // CSS.escape both generated names before they land in rule text: the
57
+ // registry key stays the raw string (a ::highlight() selector matches by
58
+ // ident VALUE, escapes and all), so dotted, non-ASCII, `_private`, and
59
+ // digit-led token types keep their colours — while nothing a token stream
60
+ // carries can step outside its ident and shape the rule.
61
+ const name = CSS.escape(`astryx-${tokenType}`);
62
+ const colorVar = `var(${CSS.escape(`--color-syntax-${tokenType}`)}, currentColor)`;
63
+ try {
64
+ dynamicStyleSheet.insertRule(`.astryx-code-block code::highlight(${name}), .astryx-codeeditor code::highlight(${name}) { color: ${colorVar}; }`);
65
+ } catch {
66
+ // An engine that still refuses the rule costs that type its colour
67
+ // (ranges paint with currentColor) — never the whole code block.
68
+ }
58
69
  }
59
70
 
60
71
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"DialogHeader.d.ts","sourceRoot":"","sources":["../../src/Dialog/DialogHeader.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAoB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAQxD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA2C5C,MAAM,WAAW,iBAAkB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAClE,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;;;;OAKG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IAE5C;;OAEG;IACH,YAAY,CAAC,EAAE,SAAS,CAAC;IAEzB;;OAEG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB;;;;;OAKG;IACH,0BAA0B,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;IAExD;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,0BAA0B,EAC1B,UAAU,EACV,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,iBAAiB,+BA8FnB;yBA3Ge,YAAY"}
1
+ {"version":3,"file":"DialogHeader.d.ts","sourceRoot":"","sources":["../../src/Dialog/DialogHeader.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAoB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAQxD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA2C5C,MAAM,WAAW,iBAAkB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAClE,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;;;;OAKG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IAE5C;;OAEG;IACH,YAAY,CAAC,EAAE,SAAS,CAAC;IAEzB;;OAEG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB;;;;;OAKG;IACH,0BAA0B,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;IAExD;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,0BAA0B,EAC1B,UAAU,EACV,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,iBAAiB,+BAuGnB;yBApHe,YAAY"}
@@ -101,9 +101,9 @@ export function DialogHeader({
101
101
  className: "x78zum5 x1cy8zhl x1qughib xjcht0a"
102
102
  }),
103
103
  children: [startContent && /*#__PURE__*/_jsx("div", {
104
- ...{
104
+ ...mergeProps(themeProps('dialog-header-start-content'), {
105
105
  className: "x78zum5 x6s0dn4 x1txdalj x2lah0s"
106
- },
106
+ }),
107
107
  children: startContent
108
108
  }), /*#__PURE__*/_jsxs("div", {
109
109
  ...mergeProps(themeProps('dialog-header-title-block'), {
@@ -123,7 +123,7 @@ export function DialogHeader({
123
123
  children: subtitle
124
124
  })]
125
125
  }), (endContent || onOpenChange) && /*#__PURE__*/_jsxs("div", {
126
- ...{
126
+ ...mergeProps(themeProps('dialog-header-end-content'), {
127
127
  0: {
128
128
  className: "x78zum5 x6s0dn4 x1txdalj x2lah0s"
129
129
  },
@@ -136,7 +136,7 @@ export function DialogHeader({
136
136
  3: {
137
137
  className: "x78zum5 x6s0dn4 x1txdalj x2lah0s xhzvc8f x3kzqx6"
138
138
  }
139
- }[!!shouldCompensateEndBlock << 1 | !!shouldCompensateEndInline << 0],
139
+ }[!!shouldCompensateEndBlock << 1 | !!shouldCompensateEndInline << 0]),
140
140
  children: [endContent, onOpenChange && /*#__PURE__*/_jsx(Button, {
141
141
  variant: "ghost",
142
142
  label: t('@astryx.dialog.close'),
@@ -21,6 +21,8 @@ import React, { type ComponentType, type SVGProps } from 'react';
21
21
  import * as stylex from '@stylexjs/stylex';
22
22
  import type { StyleXStyles } from '@stylexjs/stylex';
23
23
  import type { IconName, NamespacedIconName } from './globalIconRegistry';
24
+ import { type IconSize } from './IconSize.stylex';
25
+ export type { IconSize } from './IconSize.stylex';
24
26
  declare const colorStyles: Readonly<{
25
27
  readonly primary: Readonly<{
26
28
  readonly color: stylex.StyleXClassNameFor<"color", "light-dark(#0A1317, #DFE2E5)">;
@@ -80,35 +82,7 @@ declare const colorStyles: Readonly<{
80
82
  readonly color: stylex.StyleXClassNameFor<"color", "light-dark(#5B08D8, #7952FF)">;
81
83
  }>;
82
84
  }>;
83
- /**
84
- * Size styles for direct SVG icon components.
85
- * Uses width/height only — SVG components handle their own viewBox scaling.
86
- *
87
- * Sizes are expressed in `rem` (relative to the root font-size) so icons scale
88
- * in step with text when the document font-size changes, matching the rest of
89
- * the design system's rem-based type scale. Values are the px-equivalents at a
90
- * 16px root: 12px → 0.75rem, 16px → 1rem, 20px → 1.25rem, 24px → 1.5rem.
91
- */
92
- declare const sizeStyles: Readonly<{
93
- readonly xsm: Readonly<{
94
- readonly width: stylex.StyleXClassNameFor<"width", "0.75rem">;
95
- readonly height: stylex.StyleXClassNameFor<"height", "0.75rem">;
96
- }>;
97
- readonly sm: Readonly<{
98
- readonly width: stylex.StyleXClassNameFor<"width", "1rem">;
99
- readonly height: stylex.StyleXClassNameFor<"height", "1rem">;
100
- }>;
101
- readonly md: Readonly<{
102
- readonly width: stylex.StyleXClassNameFor<"width", "1.25rem">;
103
- readonly height: stylex.StyleXClassNameFor<"height", "1.25rem">;
104
- }>;
105
- readonly lg: Readonly<{
106
- readonly width: stylex.StyleXClassNameFor<"width", "1.5rem">;
107
- readonly height: stylex.StyleXClassNameFor<"height", "1.5rem">;
108
- }>;
109
- }>;
110
85
  export type IconColor = keyof typeof colorStyles;
111
- export type IconSize = keyof typeof sizeStyles;
112
86
  /**
113
87
  * Type for icon components that can be passed to Icon.
114
88
  * Use this type when accepting an icon prop in other components.
@@ -140,7 +114,9 @@ export interface IconProps extends Omit<SVGProps<SVGSVGElement>, 'ref' | 'color'
140
114
  * - 'sm': 1rem (16px at a 16px root)
141
115
  * - 'md': 1.25rem (20px at a 16px root)
142
116
  * - 'lg': 1.5rem (24px at a 16px root)
143
- * @default 'md'
117
+ *
118
+ * An explicit value wins. When omitted, Icon uses the nearest default supplied
119
+ * by an owning Astryx component for its icon slot, then falls back to 'md'.
144
120
  */
145
121
  size?: IconSize;
146
122
  /**
@@ -195,7 +171,7 @@ export interface IconProps extends Omit<SVGProps<SVGSVGElement>, 'ref' | 'color'
195
171
  * <Icon icon="close" size="md" color="primary" />
196
172
  * ```
197
173
  */
198
- export declare function Icon({ icon, color, size, label, ref, className, style, xstyle, ...props }: IconProps): React.JSX.Element;
174
+ export declare function Icon({ icon, color, size: sizeProp, label, ref, className, style, xstyle, ...props }: IconProps): React.JSX.Element;
199
175
  export declare namespace Icon {
200
176
  var displayName: string;
201
177
  }
@@ -210,5 +186,4 @@ export declare function renderIconSlot(icon: React.ReactNode | IconType, props?:
210
186
  size?: IconSize;
211
187
  color?: IconColor;
212
188
  }): React.ReactNode;
213
- export {};
214
189
  //# sourceMappingURL=Icon.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Icon.d.ts","sourceRoot":"","sources":["../../src/Icon/Icon.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,EAAC,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAC,MAAM,OAAO,CAAC;AAC/D,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAInD,OAAO,KAAK,EAAC,QAAQ,EAAE,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAqBvE,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2Df,CAAC;AAEH;;;;;;;;GAQG;AACH,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;EAiBd,CAAC;AAyCH,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,WAAW,CAAC;AACjD,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,UAAU,CAAC;AAE/C;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;AAE9D;;;GAGG;AACH,MAAM,WAAW,SAAU,SAAQ,IAAI,CACrC,QAAQ,CAAC,aAAa,CAAC,EACvB,KAAK,GAAG,OAAO,CAChB;IACC,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC/B;;;;;;OAMG;IACH,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,kBAAkB,CAAC;IAC/C;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAyBD;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,KAAiB,EACjB,IAAW,EACX,KAAK,EACL,GAAG,EACH,SAAS,EACT,KAAK,EACL,MAAM,EACN,GAAG,KAAK,EACT,EAAE,SAAS,qBA4CX;yBAtDe,IAAI;;;AA+HpB;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,KAAK,CAAC,SAAS,GAAG,QAAQ,EAChC,KAAK,CAAC,EAAE;IAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAC,GAC3C,KAAK,CAAC,SAAS,CAYjB"}
1
+ {"version":3,"file":"Icon.d.ts","sourceRoot":"","sources":["../../src/Icon/Icon.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,EAAC,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAC,MAAM,OAAO,CAAC;AAC/D,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAInD,OAAO,KAAK,EAAC,QAAQ,EAAE,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAIvE,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAC,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAmBhD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2Df,CAAC;AAMH,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,WAAW,CAAC;AAEjD;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;AAE9D;;;GAGG;AACH,MAAM,WAAW,SAAU,SAAQ,IAAI,CACrC,QAAQ,CAAC,aAAa,CAAC,EACvB,KAAK,GAAG,OAAO,CAChB;IACC,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC/B;;;;;;OAMG;IACH,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,kBAAkB,CAAC;IAC/C;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAyBD;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,KAAiB,EACjB,IAAI,EAAE,QAAQ,EACd,KAAK,EACL,GAAG,EACH,SAAS,EACT,KAAK,EACL,MAAM,EACN,GAAG,KAAK,EACT,EAAE,SAAS,qBAkDX;yBA5De,IAAI;;;AAqIpB;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,KAAK,CAAC,SAAS,GAAG,QAAQ,EAChC,KAAK,CAAC,EAAE;IAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAC,GAC3C,KAAK,CAAC,SAAS,CAYjB"}
package/dist/Icon/Icon.js CHANGED
@@ -29,11 +29,13 @@ import { useThemeName } from "../theme/useTheme.js";
29
29
  import { getIcon } from "./globalIconRegistry.js";
30
30
  import { mergeProps } from "../utils/index.js";
31
31
  import { themeProps } from "../utils/themeProps.js";
32
-
32
+ import { useIconSize } from "./IconDefaultSizeContext.js";
33
+ import { iconBoxSizeStyles, iconSizeStyles } from "./IconSize.stylex.js";
34
+ import { jsx as _jsx } from "react/jsx-runtime";
33
35
  // =============================================================================
34
36
  // Styles
35
37
  // =============================================================================
36
- import { jsx as _jsx } from "react/jsx-runtime";
38
+
37
39
  const styles = {
38
40
  root: {
39
41
  kmuXW: "x2lah0s",
@@ -126,72 +128,6 @@ const colorStyles = {
126
128
  }
127
129
  };
128
130
 
129
- /**
130
- * Size styles for direct SVG icon components.
131
- * Uses width/height only — SVG components handle their own viewBox scaling.
132
- *
133
- * Sizes are expressed in `rem` (relative to the root font-size) so icons scale
134
- * in step with text when the document font-size changes, matching the rest of
135
- * the design system's rem-based type scale. Values are the px-equivalents at a
136
- * 16px root: 12px → 0.75rem, 16px → 1rem, 20px → 1.25rem, 24px → 1.5rem.
137
- */
138
- const sizeStyles = {
139
- xsm: {
140
- kzqmXN: "x1jw3ynk",
141
- kZKoxP: "xvle69y",
142
- $$css: true
143
- },
144
- sm: {
145
- kzqmXN: "xcdlrvm",
146
- kZKoxP: "x1l36t39",
147
- $$css: true
148
- },
149
- md: {
150
- kzqmXN: "xwqq7k2",
151
- kZKoxP: "xmll18r",
152
- $$css: true
153
- },
154
- lg: {
155
- kzqmXN: "xp8d6y2",
156
- kZKoxP: "xam5rvr",
157
- $$css: true
158
- }
159
- };
160
-
161
- /**
162
- * Size styles for string-based (registry) icons.
163
- * Includes fontSize so that 1em-based icons from the registry scale correctly.
164
- *
165
- * Expressed in `rem` for the same reason as {@link sizeStyles} — icons track the
166
- * root font-size instead of being locked to absolute pixels.
167
- */
168
- const spanSizeStyles = {
169
- xsm: {
170
- kzqmXN: "x1jw3ynk",
171
- kZKoxP: "xvle69y",
172
- kGuDYH: "xboafo0",
173
- $$css: true
174
- },
175
- sm: {
176
- kzqmXN: "xcdlrvm",
177
- kZKoxP: "x1l36t39",
178
- kGuDYH: "x1jchvi3",
179
- $$css: true
180
- },
181
- md: {
182
- kzqmXN: "xwqq7k2",
183
- kZKoxP: "xmll18r",
184
- kGuDYH: "x1603h9y",
185
- $$css: true
186
- },
187
- lg: {
188
- kzqmXN: "xp8d6y2",
189
- kZKoxP: "xam5rvr",
190
- kGuDYH: "xngnso2",
191
- $$css: true
192
- }
193
- };
194
-
195
131
  // =============================================================================
196
132
  // Types
197
133
  // =============================================================================
@@ -241,7 +177,7 @@ function getIconA11yProps(label) {
241
177
  export function Icon({
242
178
  icon,
243
179
  color = 'inherit',
244
- size = 'md',
180
+ size: sizeProp,
245
181
  label,
246
182
  ref,
247
183
  className,
@@ -249,6 +185,7 @@ export function Icon({
249
185
  xstyle,
250
186
  ...props
251
187
  }) {
188
+ const size = useIconSize(sizeProp);
252
189
  // Derive ARIA from `label`: decorative (aria-hidden) by default, or a
253
190
  // meaningful image (role="img" + aria-label) when `label` is non-empty.
254
191
  const a11yProps = getIconA11yProps(label);
@@ -279,7 +216,7 @@ export function Icon({
279
216
  ...mergeProps(themeProps('icon', {
280
217
  size,
281
218
  color
282
- }), stylex.props(styles.root, colorStyles[color], sizeStyles[size], xstyle), className ?? undefined, style),
219
+ }), stylex.props(styles.root, colorStyles[color], iconSizeStyles[size], xstyle), className ?? undefined, style),
283
220
  ...props
284
221
  });
285
222
  }
@@ -324,7 +261,7 @@ function IconFromRegistry({
324
261
  ...mergeProps(themeProps('icon', {
325
262
  size,
326
263
  color
327
- }), stylex.props(styles.span, colorStyles[color], spanSizeStyles[size], xstyle), className ?? undefined, style),
264
+ }), stylex.props(styles.span, colorStyles[color], iconBoxSizeStyles[size], xstyle), className ?? undefined, style),
328
265
  children: resolvedIcon
329
266
  });
330
267
  }
@@ -0,0 +1,4 @@
1
+ import type { IconSize } from './IconSize.stylex';
2
+ export declare const IconDefaultSizeProvider: import("react").Provider<"xsm" | "sm" | "lg" | "md" | null>;
3
+ export declare function useIconSize(size: IconSize | undefined): IconSize;
4
+ //# sourceMappingURL=IconDefaultSizeContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconDefaultSizeContext.d.ts","sourceRoot":"","sources":["../../src/Icon/IconDefaultSizeContext.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAKhD,eAAO,MAAM,uBAAuB,6DAAkC,CAAC;AAEvE,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAGhE"}
@@ -0,0 +1,18 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file IconDefaultSizeContext.ts
7
+ * @input Uses React context and an optional Icon size prop
8
+ * @output Supplies a component-owned default size to descendant Icon instances
9
+ * @position Internal Icon sizing context; consumed by Icon and icon-slot owners
10
+ */
11
+ import { createContext, use } from 'react';
12
+ const IconDefaultSizeContext = /*#__PURE__*/createContext(null);
13
+ IconDefaultSizeContext.displayName = 'IconDefaultSizeContext';
14
+ export const IconDefaultSizeProvider = IconDefaultSizeContext.Provider;
15
+ export function useIconSize(size) {
16
+ const contextualSize = use(IconDefaultSizeContext);
17
+ return size ?? contextualSize ?? 'md';
18
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @file IconSize.stylex.ts
3
+ * @input Defines the Icon size scale
4
+ * @output Exports shared Icon size types and StyleX styles
5
+ * @position Internal Icon sizing source; consumed by Icon and icon-slot owners
6
+ */
7
+ import * as stylex from '@stylexjs/stylex';
8
+ /**
9
+ * Icon sizes are expressed in `rem` so they scale with the root font-size.
10
+ * Values are the px-equivalents at a 16px root: 12, 16, 20, and 24px.
11
+ */
12
+ declare const iconSizeValues: {
13
+ readonly xsm: "0.75rem";
14
+ readonly sm: "1rem";
15
+ readonly md: "1.25rem";
16
+ readonly lg: "1.5rem";
17
+ };
18
+ export type IconSize = keyof typeof iconSizeValues;
19
+ /** Size styles for direct SVG icon components. */
20
+ export declare const iconSizeStyles: Readonly<{
21
+ readonly xsm: Readonly<{
22
+ readonly width: stylex.StyleXClassNameFor<"width", "0.75rem">;
23
+ readonly height: stylex.StyleXClassNameFor<"height", "0.75rem">;
24
+ }>;
25
+ readonly sm: Readonly<{
26
+ readonly width: stylex.StyleXClassNameFor<"width", "1rem">;
27
+ readonly height: stylex.StyleXClassNameFor<"height", "1rem">;
28
+ }>;
29
+ readonly md: Readonly<{
30
+ readonly width: stylex.StyleXClassNameFor<"width", "1.25rem">;
31
+ readonly height: stylex.StyleXClassNameFor<"height", "1.25rem">;
32
+ }>;
33
+ readonly lg: Readonly<{
34
+ readonly width: stylex.StyleXClassNameFor<"width", "1.5rem">;
35
+ readonly height: stylex.StyleXClassNameFor<"height", "1.5rem">;
36
+ }>;
37
+ }>;
38
+ /**
39
+ * Size styles for icon boxes and string-based registry icons. `fontSize`
40
+ * keeps 1em-based icons in step with the box.
41
+ */
42
+ export declare const iconBoxSizeStyles: Readonly<{
43
+ readonly xsm: Readonly<{
44
+ readonly width: stylex.StyleXClassNameFor<"width", "0.75rem">;
45
+ readonly height: stylex.StyleXClassNameFor<"height", "0.75rem">;
46
+ readonly fontSize: stylex.StyleXClassNameFor<"fontSize", "0.75rem">;
47
+ }>;
48
+ readonly sm: Readonly<{
49
+ readonly width: stylex.StyleXClassNameFor<"width", "1rem">;
50
+ readonly height: stylex.StyleXClassNameFor<"height", "1rem">;
51
+ readonly fontSize: stylex.StyleXClassNameFor<"fontSize", "1rem">;
52
+ }>;
53
+ readonly md: Readonly<{
54
+ readonly width: stylex.StyleXClassNameFor<"width", "1.25rem">;
55
+ readonly height: stylex.StyleXClassNameFor<"height", "1.25rem">;
56
+ readonly fontSize: stylex.StyleXClassNameFor<"fontSize", "1.25rem">;
57
+ }>;
58
+ readonly lg: Readonly<{
59
+ readonly width: stylex.StyleXClassNameFor<"width", "1.5rem">;
60
+ readonly height: stylex.StyleXClassNameFor<"height", "1.5rem">;
61
+ readonly fontSize: stylex.StyleXClassNameFor<"fontSize", "1.5rem">;
62
+ }>;
63
+ }>;
64
+ export {};
65
+ //# sourceMappingURL=IconSize.stylex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconSize.stylex.d.ts","sourceRoot":"","sources":["../../src/Icon/IconSize.stylex.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAE3C;;;GAGG;AACH,QAAA,MAAM,cAAc;;;;;CAKV,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,cAAc,CAAC;AAEnD,kDAAkD;AAClD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;EAiBzB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;EAqB5B,CAAC"}