@react-spectrum/s2 3.0.0-nightly-e7053dd8f-250108 → 3.0.0-nightly-e4497fdb6-250110

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 (227) hide show
  1. package/dist/Accordion.cjs +3 -3
  2. package/dist/Accordion.css +2 -2
  3. package/dist/Accordion.mjs +3 -3
  4. package/dist/ActionBar.cjs +32 -32
  5. package/dist/ActionBar.css +34 -34
  6. package/dist/ActionBar.mjs +32 -32
  7. package/dist/ActionButton.cjs +61 -61
  8. package/dist/ActionButton.css +57 -57
  9. package/dist/ActionButton.mjs +61 -61
  10. package/dist/ActionButtonGroup.cjs +4 -4
  11. package/dist/ActionButtonGroup.css +3 -3
  12. package/dist/ActionButtonGroup.mjs +4 -4
  13. package/dist/Avatar.cjs +10 -10
  14. package/dist/Avatar.css +11 -11
  15. package/dist/Avatar.mjs +10 -10
  16. package/dist/AvatarGroup.cjs +97 -97
  17. package/dist/AvatarGroup.css +31 -31
  18. package/dist/AvatarGroup.mjs +97 -97
  19. package/dist/Badge.cjs +31 -31
  20. package/dist/Badge.css +33 -33
  21. package/dist/Badge.mjs +31 -31
  22. package/dist/Breadcrumbs.cjs +83 -82
  23. package/dist/Breadcrumbs.cjs.map +1 -1
  24. package/dist/Breadcrumbs.css +66 -60
  25. package/dist/Breadcrumbs.css.map +1 -1
  26. package/dist/Breadcrumbs.mjs +83 -82
  27. package/dist/Breadcrumbs.mjs.map +1 -1
  28. package/dist/Button.cjs +179 -144
  29. package/dist/Button.cjs.map +1 -1
  30. package/dist/Button.css +167 -86
  31. package/dist/Button.css.map +1 -1
  32. package/dist/Button.mjs +180 -145
  33. package/dist/Button.mjs.map +1 -1
  34. package/dist/ButtonGroup.cjs +15 -15
  35. package/dist/ButtonGroup.css +11 -11
  36. package/dist/ButtonGroup.mjs +15 -15
  37. package/dist/Card.cjs +163 -163
  38. package/dist/Card.css +118 -118
  39. package/dist/Card.mjs +163 -163
  40. package/dist/CardView.cjs +13 -13
  41. package/dist/CardView.css +14 -14
  42. package/dist/CardView.mjs +13 -13
  43. package/dist/CenterBaseline.cjs +1 -1
  44. package/dist/CenterBaseline.css +2 -2
  45. package/dist/CenterBaseline.mjs +1 -1
  46. package/dist/Checkbox.cjs +46 -46
  47. package/dist/Checkbox.css +44 -44
  48. package/dist/Checkbox.mjs +46 -46
  49. package/dist/CheckboxGroup.cjs +39 -39
  50. package/dist/CheckboxGroup.css +32 -32
  51. package/dist/CheckboxGroup.mjs +39 -39
  52. package/dist/ClearButton.cjs +5 -5
  53. package/dist/ClearButton.css +5 -5
  54. package/dist/ClearButton.mjs +5 -5
  55. package/dist/CloseButton.cjs +17 -15
  56. package/dist/CloseButton.cjs.map +1 -1
  57. package/dist/CloseButton.css +24 -16
  58. package/dist/CloseButton.css.map +1 -1
  59. package/dist/CloseButton.mjs +17 -15
  60. package/dist/CloseButton.mjs.map +1 -1
  61. package/dist/ColorArea.cjs +9 -9
  62. package/dist/ColorArea.css +9 -9
  63. package/dist/ColorArea.mjs +9 -9
  64. package/dist/ColorField.cjs +29 -29
  65. package/dist/ColorField.css +24 -24
  66. package/dist/ColorField.mjs +29 -29
  67. package/dist/ColorHandle.cjs +9 -9
  68. package/dist/ColorHandle.css +16 -16
  69. package/dist/ColorHandle.mjs +9 -9
  70. package/dist/ColorSlider.cjs +40 -40
  71. package/dist/ColorSlider.css +42 -42
  72. package/dist/ColorSlider.mjs +40 -40
  73. package/dist/ColorSwatch.cjs +6 -6
  74. package/dist/ColorSwatch.css +14 -14
  75. package/dist/ColorSwatch.mjs +6 -6
  76. package/dist/ColorSwatchPicker.cjs +12 -12
  77. package/dist/ColorSwatchPicker.css +32 -32
  78. package/dist/ColorSwatchPicker.mjs +12 -12
  79. package/dist/ColorWheel.cjs +14 -14
  80. package/dist/ColorWheel.css +14 -14
  81. package/dist/ColorWheel.mjs +14 -14
  82. package/dist/ComboBox.cjs +54 -51
  83. package/dist/ComboBox.cjs.map +1 -1
  84. package/dist/ComboBox.css +48 -48
  85. package/dist/ComboBox.css.map +1 -1
  86. package/dist/ComboBox.mjs +54 -51
  87. package/dist/ComboBox.mjs.map +1 -1
  88. package/dist/ContextualHelp.cjs +5 -5
  89. package/dist/ContextualHelp.css +23 -23
  90. package/dist/ContextualHelp.mjs +5 -5
  91. package/dist/CustomDialog.cjs +8 -8
  92. package/dist/CustomDialog.css +9 -9
  93. package/dist/CustomDialog.mjs +8 -8
  94. package/dist/Dialog.cjs +10 -10
  95. package/dist/Dialog.css +39 -39
  96. package/dist/Dialog.mjs +10 -10
  97. package/dist/Disclosure.cjs +53 -53
  98. package/dist/Disclosure.css +48 -48
  99. package/dist/Disclosure.mjs +53 -53
  100. package/dist/Divider.cjs +5 -5
  101. package/dist/Divider.css +5 -5
  102. package/dist/Divider.mjs +5 -5
  103. package/dist/DropZone.cjs +24 -24
  104. package/dist/DropZone.css +24 -24
  105. package/dist/DropZone.mjs +24 -24
  106. package/dist/Field.cjs +107 -107
  107. package/dist/Field.cjs.map +1 -1
  108. package/dist/Field.css +69 -69
  109. package/dist/Field.mjs +107 -107
  110. package/dist/Field.mjs.map +1 -1
  111. package/dist/Form.cjs +4 -4
  112. package/dist/Form.css +3 -3
  113. package/dist/Form.mjs +4 -4
  114. package/dist/FullscreenDialog.cjs +5 -5
  115. package/dist/FullscreenDialog.css +54 -54
  116. package/dist/FullscreenDialog.mjs +5 -5
  117. package/dist/IllustratedMessage.cjs +126 -126
  118. package/dist/IllustratedMessage.css +58 -58
  119. package/dist/IllustratedMessage.mjs +126 -126
  120. package/dist/Image.cjs +10 -10
  121. package/dist/Image.css +11 -11
  122. package/dist/Image.mjs +10 -10
  123. package/dist/InlineAlert.cjs +50 -50
  124. package/dist/InlineAlert.css +44 -44
  125. package/dist/InlineAlert.mjs +50 -50
  126. package/dist/Link.cjs +27 -27
  127. package/dist/Link.css +28 -28
  128. package/dist/Link.mjs +27 -27
  129. package/dist/Menu.cjs +292 -221
  130. package/dist/Menu.cjs.map +1 -1
  131. package/dist/Menu.css +115 -113
  132. package/dist/Menu.css.map +1 -1
  133. package/dist/Menu.mjs +292 -221
  134. package/dist/Menu.mjs.map +1 -1
  135. package/dist/Meter.cjs +51 -51
  136. package/dist/Meter.css +51 -51
  137. package/dist/Meter.mjs +51 -51
  138. package/dist/Modal.cjs +37 -37
  139. package/dist/Modal.css +35 -35
  140. package/dist/Modal.mjs +37 -37
  141. package/dist/NumberField.cjs +60 -60
  142. package/dist/NumberField.css +66 -66
  143. package/dist/NumberField.mjs +60 -60
  144. package/dist/Picker.cjs +117 -114
  145. package/dist/Picker.cjs.map +1 -1
  146. package/dist/Picker.css +80 -80
  147. package/dist/Picker.css.map +1 -1
  148. package/dist/Picker.mjs +117 -114
  149. package/dist/Picker.mjs.map +1 -1
  150. package/dist/Popover.cjs +40 -40
  151. package/dist/Popover.css +37 -37
  152. package/dist/Popover.mjs +40 -40
  153. package/dist/ProgressBar.cjs +63 -63
  154. package/dist/ProgressBar.css +61 -61
  155. package/dist/ProgressBar.mjs +63 -63
  156. package/dist/ProgressCircle.cjs +3 -3
  157. package/dist/ProgressCircle.css +2 -2
  158. package/dist/ProgressCircle.mjs +3 -3
  159. package/dist/Provider.cjs +4 -4
  160. package/dist/Provider.css +5 -5
  161. package/dist/Provider.mjs +4 -4
  162. package/dist/Radio.cjs +46 -46
  163. package/dist/Radio.css +44 -44
  164. package/dist/Radio.mjs +46 -46
  165. package/dist/RadioGroup.cjs +37 -37
  166. package/dist/RadioGroup.css +32 -32
  167. package/dist/RadioGroup.mjs +37 -37
  168. package/dist/SearchField.cjs +31 -31
  169. package/dist/SearchField.css +29 -29
  170. package/dist/SearchField.mjs +31 -31
  171. package/dist/SegmentedControl.cjs +54 -54
  172. package/dist/SegmentedControl.css +55 -55
  173. package/dist/SegmentedControl.mjs +54 -54
  174. package/dist/Slider.cjs +101 -101
  175. package/dist/Slider.css +82 -82
  176. package/dist/Slider.mjs +101 -101
  177. package/dist/StatusLight.cjs +26 -26
  178. package/dist/StatusLight.css +26 -26
  179. package/dist/StatusLight.mjs +26 -26
  180. package/dist/Switch.cjs +47 -47
  181. package/dist/Switch.css +42 -42
  182. package/dist/Switch.mjs +47 -47
  183. package/dist/TableView.cjs +137 -137
  184. package/dist/TableView.css +76 -76
  185. package/dist/TableView.mjs +137 -137
  186. package/dist/Tabs.cjs +60 -60
  187. package/dist/Tabs.css +53 -53
  188. package/dist/Tabs.mjs +60 -60
  189. package/dist/TabsPicker.cjs +69 -69
  190. package/dist/TabsPicker.css +62 -62
  191. package/dist/TabsPicker.mjs +69 -69
  192. package/dist/TagGroup.cjs +108 -108
  193. package/dist/TagGroup.css +85 -85
  194. package/dist/TagGroup.mjs +108 -108
  195. package/dist/TextField.cjs +36 -36
  196. package/dist/TextField.css +33 -33
  197. package/dist/TextField.mjs +36 -36
  198. package/dist/ToggleButton.cjs +3 -3
  199. package/dist/ToggleButton.css +7 -7
  200. package/dist/ToggleButton.mjs +3 -3
  201. package/dist/Tooltip.cjs +32 -32
  202. package/dist/Tooltip.css +34 -34
  203. package/dist/Tooltip.mjs +32 -32
  204. package/dist/types.d.ts +2 -0
  205. package/dist/types.d.ts.map +1 -1
  206. package/icons/Skeleton.cjs +2 -2
  207. package/icons/Skeleton.css +5 -5
  208. package/icons/Skeleton.mjs +2 -2
  209. package/package.json +19 -19
  210. package/src/Button.tsx +107 -75
  211. package/src/CloseButton.tsx +4 -0
  212. package/src/ComboBox.tsx +2 -1
  213. package/src/Menu.tsx +40 -17
  214. package/src/Picker.tsx +2 -1
  215. package/style/dist/spectrum-theme.cjs +54 -5
  216. package/style/dist/spectrum-theme.cjs.map +1 -1
  217. package/style/dist/spectrum-theme.mjs +54 -5
  218. package/style/dist/spectrum-theme.mjs.map +1 -1
  219. package/style/dist/style-macro.cjs +1 -1
  220. package/style/dist/style-macro.cjs.map +1 -1
  221. package/style/dist/style-macro.mjs +1 -1
  222. package/style/dist/style-macro.mjs.map +1 -1
  223. package/style/dist/types.d.ts +10 -3
  224. package/style/dist/types.d.ts.map +1 -1
  225. package/style/spectrum-theme.ts +66 -7
  226. package/style/style-macro.ts +3 -3
  227. package/style/types.ts +1 -1
@@ -81,7 +81,7 @@ function $5ad421ec19460c48$export$cb6ddd830302c2a8({ children: children }) {
81
81
  // @ts-ignore - compatibility with React < 19
82
82
  inert: "true",
83
83
  ref: $5ad421ec19460c48$export$6b288fe07640c94c(true),
84
- className: $5ad421ec19460c48$export$d2353276f167b21f + " . aa _sb _vb _wb _xb _yb",
84
+ className: $5ad421ec19460c48$export$d2353276f167b21f + " . aa _tb _wb _xb _yb _zb",
85
85
  children: children
86
86
  });
87
87
  }
@@ -101,7 +101,7 @@ function $5ad421ec19460c48$export$6069cbe61f690103({ children: children }) {
101
101
  }
102
102
  function $5ad421ec19460c48$export$4b7803c08fe9a32b(styles) {
103
103
  let isSkeleton = (0, $cHM3s$useContext)($5ad421ec19460c48$export$74e166679b1f49ee);
104
- if (isSkeleton) return (0, $feb886035e0d4633$export$e618dc39ac9ad607)(" . _vb _wb _xb _yb", styles);
104
+ if (isSkeleton) return (0, $feb886035e0d4633$export$e618dc39ac9ad607)(" . _wb _xb _yb _zb", styles);
105
105
  return styles || '';
106
106
  }
107
107
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-spectrum/s2",
3
- "version": "3.0.0-nightly-e7053dd8f-250108",
3
+ "version": "3.0.0-nightly-e4497fdb6-250110",
4
4
  "description": "Spectrum 2 UI components in React",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -57,25 +57,25 @@
57
57
  "src"
58
58
  ],
59
59
  "dependencies": {
60
- "@react-aria/collections": "3.0.0-nightly-e7053dd8f-250108",
61
- "@react-aria/i18n": "3.0.0-nightly-e7053dd8f-250108",
62
- "@react-aria/interactions": "3.0.0-nightly-e7053dd8f-250108",
63
- "@react-aria/live-announcer": "3.0.0-nightly-e7053dd8f-250108",
64
- "@react-aria/utils": "3.0.0-nightly-e7053dd8f-250108",
65
- "@react-spectrum/utils": "3.0.0-nightly-e7053dd8f-250108",
66
- "@react-stately/layout": "3.0.0-nightly-e7053dd8f-250108",
67
- "@react-stately/utils": "3.0.0-nightly-e7053dd8f-250108",
68
- "@react-stately/virtualizer": "3.0.0-nightly-e7053dd8f-250108",
69
- "@react-types/color": "3.0.0-nightly-e7053dd8f-250108",
70
- "@react-types/dialog": "3.0.0-nightly-e7053dd8f-250108",
71
- "@react-types/grid": "3.0.0-nightly-e7053dd8f-250108",
72
- "@react-types/provider": "3.0.0-nightly-e7053dd8f-250108",
73
- "@react-types/shared": "3.0.0-nightly-e7053dd8f-250108",
74
- "@react-types/table": "3.0.0-nightly-e7053dd8f-250108",
75
- "@react-types/textfield": "3.0.0-nightly-e7053dd8f-250108",
60
+ "@react-aria/collections": "3.0.0-nightly-e4497fdb6-250110",
61
+ "@react-aria/i18n": "3.0.0-nightly-e4497fdb6-250110",
62
+ "@react-aria/interactions": "3.0.0-nightly-e4497fdb6-250110",
63
+ "@react-aria/live-announcer": "3.0.0-nightly-e4497fdb6-250110",
64
+ "@react-aria/utils": "3.0.0-nightly-e4497fdb6-250110",
65
+ "@react-spectrum/utils": "3.0.0-nightly-e4497fdb6-250110",
66
+ "@react-stately/layout": "3.0.0-nightly-e4497fdb6-250110",
67
+ "@react-stately/utils": "3.0.0-nightly-e4497fdb6-250110",
68
+ "@react-stately/virtualizer": "3.0.0-nightly-e4497fdb6-250110",
69
+ "@react-types/color": "3.0.0-nightly-e4497fdb6-250110",
70
+ "@react-types/dialog": "3.0.0-nightly-e4497fdb6-250110",
71
+ "@react-types/grid": "3.0.0-nightly-e4497fdb6-250110",
72
+ "@react-types/provider": "3.0.0-nightly-e4497fdb6-250110",
73
+ "@react-types/shared": "3.0.0-nightly-e4497fdb6-250110",
74
+ "@react-types/table": "3.0.0-nightly-e4497fdb6-250110",
75
+ "@react-types/textfield": "3.0.0-nightly-e4497fdb6-250110",
76
76
  "csstype": "^3.0.2",
77
- "react-aria": "3.0.0-nightly-e7053dd8f-250108",
78
- "react-aria-components": "3.0.0-nightly-e7053dd8f-250108"
77
+ "react-aria": "3.0.0-nightly-e4497fdb6-250110",
78
+ "react-aria-components": "3.0.0-nightly-e4497fdb6-250110"
79
79
  },
80
80
  "peerDependencies": {
81
81
  "@testing-library/react": "^15.0.7",
package/src/Button.tsx CHANGED
@@ -138,24 +138,6 @@ const button = style<ButtonRenderProps & ButtonStyleProps & {isStaticColor: bool
138
138
  isDisabled: 'GrayText'
139
139
  }
140
140
  },
141
- backgroundImage: {
142
- variant: {
143
- premium: {
144
- default: linearGradient('96deg', ['fuchsia-900', 0], ['indigo-900', 66], ['blue-900', 100]),
145
- isHovered: linearGradient('96deg', ['fuchsia-1000', 0], ['indigo-1000', 66], ['blue-1000', 100]),
146
- isPressed: linearGradient('96deg', ['fuchsia-1000', 0], ['indigo-1000', 66], ['blue-1000', 100]),
147
- isFocusVisible: linearGradient('96deg', ['fuchsia-1000', 0], ['indigo-1000', 66], ['blue-1000', 100])
148
- },
149
- genai: {
150
- default: linearGradient('96deg', ['red-900', 0], ['magenta-900', 33], ['indigo-900', 100]),
151
- isHovered: linearGradient('96deg', ['red-1000', 0], ['magenta-1000', 33], ['indigo-1000', 100]),
152
- isPressed: linearGradient('96deg', ['red-1000', 0], ['magenta-1000', 33], ['indigo-1000', 100]),
153
- isFocusVisible: linearGradient('96deg', ['red-1000', 0], ['magenta-1000', 33], ['indigo-1000', 100])
154
- }
155
- },
156
- isDisabled: 'none',
157
- forcedColors: 'none'
158
- },
159
141
  backgroundColor: {
160
142
  fillStyle: {
161
143
  fill: {
@@ -296,6 +278,42 @@ const button = style<ButtonRenderProps & ButtonStyleProps & {isStaticColor: bool
296
278
  disableTapHighlight: true
297
279
  }, getAllowedOverrides());
298
280
 
281
+ // Put the gradient background on a separate element from the button to work around a Safari
282
+ // bug where transitions of custom properties cause layout flickering if any properties use rems. 🤣
283
+ // https://bugs.webkit.org/show_bug.cgi?id=285622
284
+ const gradient = style({
285
+ position: 'absolute',
286
+ inset: 0,
287
+ zIndex: -1,
288
+ transition: 'default',
289
+ borderRadius: '[inherit]',
290
+ backgroundImage: {
291
+ variant: {
292
+ premium: {
293
+ default: linearGradient('to bottom right', ['fuchsia-900', 0], ['indigo-900', 66], ['blue-900', 100]),
294
+ isHovered: linearGradient('to bottom right', ['fuchsia-1000', 0], ['indigo-1000', 66], ['blue-1000', 100]),
295
+ isPressed: linearGradient('to bottom right', ['fuchsia-1000', 0], ['indigo-1000', 66], ['blue-1000', 100]),
296
+ isFocusVisible: linearGradient('to bottom right', ['fuchsia-1000', 0], ['indigo-1000', 66], ['blue-1000', 100])
297
+ },
298
+ genai: {
299
+ default: linearGradient('to bottom right', ['red-900', 0], ['magenta-900', 33], ['indigo-900', 100]),
300
+ isHovered: linearGradient('to bottom right', ['red-1000', 0], ['magenta-1000', 33], ['indigo-1000', 100]),
301
+ isPressed: linearGradient('to bottom right', ['red-1000', 0], ['magenta-1000', 33], ['indigo-1000', 100]),
302
+ isFocusVisible: linearGradient('to bottom right', ['red-1000', 0], ['magenta-1000', 33], ['indigo-1000', 100])
303
+ }
304
+ },
305
+ isDisabled: 'none',
306
+ forcedColors: 'none'
307
+ },
308
+ // Force gradient colors to remain static between light and dark theme.
309
+ colorScheme: {
310
+ variant: {
311
+ premium: 'light',
312
+ genai: 'light'
313
+ }
314
+ }
315
+ });
316
+
299
317
  /**
300
318
  * Buttons allow users to perform an action.
301
319
  * They have multiple styles for various needs, and are ideal for calling attention to
@@ -350,65 +368,79 @@ export const Button = forwardRef(function Button(props: ButtonProps, ref: Focusa
350
368
  staticColor,
351
369
  isStaticColor: !!staticColor
352
370
  }, props.styles)}>
353
- <Provider
354
- values={[
355
- [SkeletonContext, null],
356
- [TextContext, {
357
- styles: style({
358
- paddingY: '--labelPadding',
359
- order: 1,
360
- opacity: {
361
- default: 1,
362
- isProgressVisible: 0
363
- }
364
- })({isProgressVisible}),
365
- // @ts-ignore data-attributes allowed on all JSX elements, but adding to DOMProps has been problematic in the past
366
- 'data-rsp-slot': 'text'
367
- }],
368
- [IconContext, {
369
- render: centerBaseline({slot: 'icon', styles: style({order: 0})}),
370
- styles: style({
371
- size: fontRelative(20),
372
- marginStart: '--iconMargin',
373
- flexShrink: 0,
374
- opacity: {
375
- default: 1,
376
- isProgressVisible: 0
377
- }
378
- })({isProgressVisible})
379
- }]
380
- ]}>
381
- {typeof props.children === 'string' ? <Text>{props.children}</Text> : props.children}
382
- {isPending &&
383
- <div
384
- className={style({
385
- position: 'absolute',
386
- top: '[50%]',
387
- left: '[50%]',
388
- transform: 'translate(-50%, -50%)',
389
- opacity: {
390
- default: 0,
391
- isProgressVisible: 1
392
- }
393
- })({isProgressVisible, isPending})}>
394
- <ProgressCircle
395
- isIndeterminate
396
- aria-label={stringFormatter.format('button.pending')}
397
- size="S"
398
- staticColor={staticColor}
399
- styles={style({
400
- size: {
371
+ {(renderProps) => (<>
372
+ {variant === 'genai' || variant === 'premium'
373
+ ? (
374
+ <span
375
+ className={gradient({
376
+ ...renderProps,
377
+ // Retain hover styles when an overlay is open.
378
+ isHovered: renderProps.isHovered || overlayTriggerState?.isOpen || false,
379
+ isDisabled: renderProps.isDisabled || isProgressVisible,
380
+ variant
381
+ })} />
382
+ )
383
+ : null}
384
+ <Provider
385
+ values={[
386
+ [SkeletonContext, null],
387
+ [TextContext, {
388
+ styles: style({
389
+ paddingY: '--labelPadding',
390
+ order: 1,
391
+ opacity: {
392
+ default: 1,
393
+ isProgressVisible: 0
394
+ }
395
+ })({isProgressVisible}),
396
+ // @ts-ignore data-attributes allowed on all JSX elements, but adding to DOMProps has been problematic in the past
397
+ 'data-rsp-slot': 'text'
398
+ }],
399
+ [IconContext, {
400
+ render: centerBaseline({slot: 'icon', styles: style({order: 0})}),
401
+ styles: style({
402
+ size: fontRelative(20),
403
+ marginStart: '--iconMargin',
404
+ flexShrink: 0,
405
+ opacity: {
406
+ default: 1,
407
+ isProgressVisible: 0
408
+ }
409
+ })({isProgressVisible})
410
+ }]
411
+ ]}>
412
+ {typeof props.children === 'string' ? <Text>{props.children}</Text> : props.children}
413
+ {isPending &&
414
+ <div
415
+ className={style({
416
+ position: 'absolute',
417
+ top: '[50%]',
418
+ left: '[50%]',
419
+ transform: 'translate(-50%, -50%)',
420
+ opacity: {
421
+ default: 0,
422
+ isProgressVisible: 1
423
+ }
424
+ })({isProgressVisible, isPending})}>
425
+ <ProgressCircle
426
+ isIndeterminate
427
+ aria-label={stringFormatter.format('button.pending')}
428
+ size="S"
429
+ staticColor={staticColor}
430
+ styles={style({
401
431
  size: {
402
- S: 14,
403
- M: 18,
404
- L: 20,
405
- XL: 24
432
+ size: {
433
+ S: 14,
434
+ M: 18,
435
+ L: 20,
436
+ XL: 24
437
+ }
406
438
  }
407
- }
408
- })({size})} />
409
- </div>
410
- }
411
- </Provider>
439
+ })({size})} />
440
+ </div>
441
+ }
442
+ </Provider>
443
+ </>)}
412
444
  </RACButton>
413
445
  );
414
446
  });
@@ -65,6 +65,10 @@ const styles = style({
65
65
  isStaticColor: {
66
66
  default: baseColor('transparent-overlay-800'),
67
67
  isDisabled: 'transparent-overlay-400'
68
+ },
69
+ forcedColors: {
70
+ default: 'ButtonText',
71
+ isDisabled: 'GrayText'
68
72
  }
69
73
  }
70
74
  },
package/src/ComboBox.tsx CHANGED
@@ -379,11 +379,12 @@ export function ComboBoxItem(props: ComboBoxItemProps) {
379
379
 
380
380
  export interface ComboBoxSectionProps<T extends object> extends SectionProps<T> {}
381
381
  export function ComboBoxSection<T extends object>(props: ComboBoxSectionProps<T>) {
382
+ let {size} = useContext(InternalComboboxContext);
382
383
  return (
383
384
  <>
384
385
  <AriaListBoxSection
385
386
  {...props}
386
- className={section}>
387
+ className={section({size})}>
387
388
  {props.children}
388
389
  </AriaListBoxSection>
389
390
  <Divider />
package/src/Menu.tsx CHANGED
@@ -81,22 +81,26 @@ export interface MenuProps<T> extends Omit<AriaMenuProps<T>, 'children' | 'style
81
81
  /**
82
82
  * The contents of the collection.
83
83
  */
84
- children?: ReactNode | ((item: T) => ReactNode)
84
+ children?: ReactNode | ((item: T) => ReactNode),
85
+ /** Hides the default link out icons on menu items that open links in a new tab. */
86
+ hideLinkOutIcon?: boolean
85
87
  }
86
88
 
87
89
  export const MenuContext = createContext<ContextValue<MenuProps<any>, DOMRefValue<HTMLDivElement>>>(null);
88
90
 
91
+ const menuItemGrid = {
92
+ size: {
93
+ S: [edgeToText(24), 'auto', 'auto', 'minmax(0, 1fr)', 'auto', 'auto', 'auto', edgeToText(24)],
94
+ M: [edgeToText(32), 'auto', 'auto', 'minmax(0, 1fr)', 'auto', 'auto', 'auto', edgeToText(32)],
95
+ L: [edgeToText(40), 'auto', 'auto', 'minmax(0, 1fr)', 'auto', 'auto', 'auto', edgeToText(40)],
96
+ XL: [edgeToText(48), 'auto', 'auto', 'minmax(0, 1fr)', 'auto', 'auto', 'auto', edgeToText(48)]
97
+ }
98
+ } as const;
99
+
89
100
  export let menu = style({
90
101
  outlineStyle: 'none',
91
102
  display: 'grid',
92
- gridTemplateColumns: {
93
- size: {
94
- S: [edgeToText(24), 'auto', 'auto', 'minmax(0, 1fr)', 'auto', 'auto', 'auto', edgeToText(24)],
95
- M: [edgeToText(32), 'auto', 'auto', 'minmax(0, 1fr)', 'auto', 'auto', 'auto', edgeToText(32)],
96
- L: [edgeToText(40), 'auto', 'auto', 'minmax(0, 1fr)', 'auto', 'auto', 'auto', edgeToText(40)],
97
- XL: [edgeToText(48), 'auto', 'auto', 'minmax(0, 1fr)', 'auto', 'auto', 'auto', edgeToText(48)]
98
- }
99
- },
103
+ gridTemplateColumns: menuItemGrid,
100
104
  boxSizing: 'border-box',
101
105
  maxHeight: '[inherit]',
102
106
  overflow: {
@@ -121,7 +125,7 @@ export let section = style({
121
125
  '. checkmark icon label value keyboard descriptor .',
122
126
  '. . . description . . . .'
123
127
  ],
124
- gridTemplateColumns: 'subgrid'
128
+ gridTemplateColumns: menuItemGrid
125
129
  });
126
130
 
127
131
  export let sectionHeader = style<{size?: 'S' | 'M' | 'L' | 'XL'}>({
@@ -310,7 +314,12 @@ let descriptor = style({
310
314
  }
311
315
  });
312
316
 
313
- let InternalMenuContext = createContext<{size: 'S' | 'M' | 'L' | 'XL', isSubmenu: boolean}>({size: 'M', isSubmenu: false});
317
+ let InternalMenuContext = createContext<{size: 'S' | 'M' | 'L' | 'XL', isSubmenu: boolean, hideLinkOutIcon: boolean}>({
318
+ size: 'M',
319
+ isSubmenu: false,
320
+ hideLinkOutIcon: false
321
+ });
322
+
314
323
  let InternalMenuTriggerContext = createContext<Omit<MenuTriggerProps, 'children'> | null>(null);
315
324
 
316
325
  /**
@@ -324,7 +333,8 @@ export const Menu = /*#__PURE__*/ (forwardRef as forwardRefType)(function Menu<T
324
333
  size = ctxSize,
325
334
  UNSAFE_style,
326
335
  UNSAFE_className,
327
- styles
336
+ styles,
337
+ hideLinkOutIcon = false
328
338
  } = props;
329
339
  let ctx = useContext(InternalMenuTriggerContext);
330
340
  let {align = 'start', direction = 'bottom', shouldFlip} = ctx ?? {};
@@ -349,7 +359,7 @@ export const Menu = /*#__PURE__*/ (forwardRef as forwardRefType)(function Menu<T
349
359
  }
350
360
 
351
361
  let content = (
352
- <InternalMenuContext.Provider value={{size, isSubmenu: true}}>
362
+ <InternalMenuContext.Provider value={{size, isSubmenu: true, hideLinkOutIcon}}>
353
363
  <Provider
354
364
  values={[
355
365
  [HeaderContext, {styles: sectionHeader({size})}],
@@ -417,11 +427,12 @@ export function Divider(props: SeparatorProps) {
417
427
  export interface MenuSectionProps<T extends object> extends AriaMenuSectionProps<T> {}
418
428
  export function MenuSection<T extends object>(props: MenuSectionProps<T>) {
419
429
  // remember, context doesn't work if it's around Section nor inside
430
+ let {size} = useContext(InternalMenuContext);
420
431
  return (
421
432
  <>
422
433
  <AriaMenuSection
423
434
  {...props}
424
- className={section}>
435
+ className={section({size})}>
425
436
  {props.children}
426
437
  </AriaMenuSection>
427
438
  <Divider />
@@ -454,7 +465,7 @@ export function MenuItem(props: MenuItemProps) {
454
465
  let ref = useRef(null);
455
466
  let isLink = props.href != null;
456
467
  let isLinkOut = isLink && props.target === '_blank';
457
- let {size} = useContext(InternalMenuContext);
468
+ let {size, hideLinkOutIcon} = useContext(InternalMenuContext);
458
469
  let textValue = props.textValue || (typeof props.children === 'string' ? props.children : undefined);
459
470
  let {direction} = useLocale();
460
471
  return (
@@ -494,13 +505,25 @@ export function MenuItem(props: MenuItemProps) {
494
505
  </div>
495
506
  )}
496
507
  {typeof children === 'string' ? <Text slot="label">{children}</Text> : children}
497
- {isLinkOut && <LinkOutIcon size={linkIconSize[size]} className={descriptor} />}
508
+ {isLinkOut && !hideLinkOutIcon && (
509
+ <div slot="descriptor" className={descriptor}>
510
+ <LinkOutIcon
511
+ size={linkIconSize[size]}
512
+ className={style({
513
+ scaleX: {
514
+ direction: {
515
+ rtl: -1
516
+ }
517
+ }
518
+ })({direction})} />
519
+ </div>
520
+ )}
498
521
  {renderProps.hasSubmenu && (
499
522
  <div slot="descriptor" className={descriptor}>
500
523
  <ChevronRightIcon
501
524
  size={size}
502
525
  className={style({
503
- scale: {
526
+ scaleX: {
504
527
  direction: {
505
528
  rtl: -1
506
529
  }
package/src/Picker.tsx CHANGED
@@ -464,11 +464,12 @@ function DefaultProvider({context, value, children}: {context: React.Context<any
464
464
 
465
465
  export interface PickerSectionProps<T extends object> extends SectionProps<T> {}
466
466
  export function PickerSection<T extends object>(props: PickerSectionProps<T>) {
467
+ let {size} = useContext(InternalPickerContext);
467
468
  return (
468
469
  <>
469
470
  <AriaListBoxSection
470
471
  {...props}
471
- className={section}>
472
+ className={section({size})}>
472
473
  {props.children}
473
474
  </AriaListBoxSection>
474
475
  <Divider />
@@ -492,7 +492,24 @@ function $7dddb03c6ef7d79c$export$9b476054b78b89cd(a, b, percent) {
492
492
  return `[color-mix(in srgb, ${$7dddb03c6ef7d79c$var$parseColor(a)}, ${$7dddb03c6ef7d79c$var$parseColor(b)} ${percent}%)]`;
493
493
  }
494
494
  function $7dddb03c6ef7d79c$export$46def8197cf4dd4c(angle, ...tokens) {
495
- return `linear-gradient(${angle}, ${tokens.map(([color, stop])=>`${$7dddb03c6ef7d79c$var$parseColor(color)} ${stop}%`)})`;
495
+ // Generate @property rules for each gradient stop color. This allows the gradient to be animated.
496
+ let propertyDefinitions = [];
497
+ for(let i = 0; i < tokens.length; i++)propertyDefinitions.push(`@property --g${i} {
498
+ syntax: '<color>';
499
+ initial-value: #0000;
500
+ inherits: false;
501
+ }`);
502
+ if (this && typeof this.addAsset === 'function') this.addAsset({
503
+ type: 'css',
504
+ content: propertyDefinitions.join('\n\n')
505
+ });
506
+ return [
507
+ {
508
+ type: 'linear-gradient',
509
+ angle: angle,
510
+ stops: tokens
511
+ }
512
+ ];
496
513
  }
497
514
  function $7dddb03c6ef7d79c$var$generateSpacing(px) {
498
515
  let res = {};
@@ -671,8 +688,10 @@ let $7dddb03c6ef7d79c$var$gridTrackSize = (value)=>{
671
688
  return value in $7dddb03c6ef7d79c$var$baseSpacing ? $7dddb03c6ef7d79c$var$baseSpacing[value] : value;
672
689
  };
673
690
  const $7dddb03c6ef7d79c$var$transitionProperty = {
674
- default: 'color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, translate, scale, rotate, filter, backdrop-filter',
675
- colors: 'color, background-color, border-color, text-decoration-color, fill, stroke',
691
+ // var(--gp) is generated by the backgroundImage property when setting a gradient.
692
+ // It includes a list of all of the custom properties used for each color stop.
693
+ default: 'color, background-color, var(--gp), border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, translate, scale, rotate, filter, backdrop-filter',
694
+ colors: 'color, background-color, var(--gp), border-color, text-decoration-color, fill, stroke',
676
695
  opacity: 'opacity',
677
696
  shadow: 'box-shadow',
678
697
  transform: 'transform, translate, scale, rotate',
@@ -1147,7 +1166,14 @@ const $7dddb03c6ef7d79c$export$1d567c320f4763bc = (0, $b3643cb9d2948e30$exports.
1147
1166
  rotate: (0, $b3643cb9d2948e30$exports.createArbitraryProperty)((value, property)=>({
1148
1167
  [property]: typeof value === 'number' ? `${value}deg` : value
1149
1168
  })),
1150
- scale: (0, $b3643cb9d2948e30$exports.createArbitraryProperty)(),
1169
+ scaleX: (0, $b3643cb9d2948e30$exports.createArbitraryProperty)((value)=>({
1170
+ '--scaleX': value,
1171
+ scale: 'var(--scaleX, 1) var(--scaleY, 1)'
1172
+ })),
1173
+ scaleY: (0, $b3643cb9d2948e30$exports.createArbitraryProperty)((value)=>({
1174
+ '--scaleY': value,
1175
+ scale: 'var(--scaleX, 1) var(--scaleY, 1)'
1176
+ })),
1151
1177
  transform: (0, $b3643cb9d2948e30$exports.createArbitraryProperty)(),
1152
1178
  position: [
1153
1179
  'absolute',
@@ -1336,7 +1362,26 @@ const $7dddb03c6ef7d79c$export$1d567c320f4763bc = (0, $b3643cb9d2948e30$exports.
1336
1362
  'dark',
1337
1363
  'light dark'
1338
1364
  ],
1339
- backgroundImage: (0, $b3643cb9d2948e30$exports.createArbitraryProperty)(),
1365
+ backgroundImage: (0, $b3643cb9d2948e30$exports.createArbitraryProperty)((value, property)=>{
1366
+ if (typeof value === 'string') return {
1367
+ [property]: value
1368
+ };
1369
+ else if (Array.isArray(value) && value[0]?.type === 'linear-gradient') {
1370
+ let values = {
1371
+ [property]: `linear-gradient(${value[0].angle}, ${value[0].stops.map(([, stop], i)=>`var(--g${i}) ${stop}%`)})`
1372
+ };
1373
+ // Create a CSS var for each color stop so the gradient can be transitioned.
1374
+ // These are registered via @property in the `linearGradient` macro.
1375
+ let properties = [];
1376
+ value[0].stops.forEach(([color], i)=>{
1377
+ properties.push(`--g${i}`);
1378
+ values[`--g${i}`] = $7dddb03c6ef7d79c$var$parseColor(color);
1379
+ });
1380
+ // This is used by transition-property so we automatically transition all of the color stops.
1381
+ values['--gp'] = properties.join(', ');
1382
+ return values;
1383
+ } else throw new Error('Unexpected backgroundImage value: ' + JSON.stringify(value));
1384
+ }),
1340
1385
  // TODO: do we need separate x and y properties?
1341
1386
  backgroundPosition: [
1342
1387
  'bottom',
@@ -1908,6 +1953,10 @@ const $7dddb03c6ef7d79c$export$1d567c320f4763bc = (0, $b3643cb9d2948e30$exports.
1908
1953
  'translateX',
1909
1954
  'translateY'
1910
1955
  ],
1956
+ scale: [
1957
+ 'scaleX',
1958
+ 'scaleY'
1959
+ ],
1911
1960
  inset: [
1912
1961
  'top',
1913
1962
  'bottom',