@jobber/components 8.21.1 → 8.23.0

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 (93) hide show
  1. package/Dialog.d.ts +1 -0
  2. package/Dialog.js +17 -0
  3. package/dist/BottomSheet-cjs.js +34 -7
  4. package/dist/BottomSheet-es.js +34 -8
  5. package/dist/CSPContext-cjs.js +69 -0
  6. package/dist/CSPContext-es.js +46 -0
  7. package/dist/Card/index.cjs +3 -0
  8. package/dist/Card/index.mjs +3 -0
  9. package/dist/ComboboxChipRemove-cjs.js +54 -211
  10. package/dist/ComboboxChipRemove-es.js +8 -164
  11. package/dist/DataDump/index.cjs +3 -0
  12. package/dist/DataDump/index.mjs +3 -0
  13. package/dist/Dialog/Dialog.d.ts +3 -0
  14. package/dist/Dialog/Dialog.types.d.ts +205 -0
  15. package/dist/Dialog/DialogBottomSheet.d.ts +28 -0
  16. package/dist/Dialog/DialogModal.d.ts +20 -0
  17. package/dist/Dialog/constants.d.ts +1 -0
  18. package/dist/Dialog/dialogComposableShared.d.ts +53 -0
  19. package/dist/Dialog/dialogReturnFocus.d.ts +43 -0
  20. package/dist/Dialog/index.cjs +33 -0
  21. package/dist/Dialog/index.d.ts +4 -0
  22. package/dist/Dialog/index.mjs +25 -0
  23. package/dist/DrawerDescription-cjs.js +410 -0
  24. package/dist/DrawerDescription-es.js +383 -0
  25. package/dist/DrawerTitle-cjs.js +116 -0
  26. package/dist/DrawerTitle-es.js +92 -0
  27. package/dist/InputNumberExperimental-cjs.js +24 -23
  28. package/dist/InputNumberExperimental-es.js +3 -2
  29. package/dist/InternalBackdrop-es.js +3 -3
  30. package/dist/Menu/index.cjs +3 -0
  31. package/dist/Menu/index.mjs +3 -0
  32. package/dist/Menu-cjs.js +6 -4
  33. package/dist/Menu-es.js +6 -4
  34. package/dist/MenuSubmenuTrigger-cjs.js +53 -103
  35. package/dist/MenuSubmenuTrigger-es.js +55 -103
  36. package/dist/NumberFieldInput-cjs.js +9 -9
  37. package/dist/NumberFieldInput-es.js +3 -3
  38. package/dist/Page/index.cjs +3 -0
  39. package/dist/Page/index.mjs +3 -0
  40. package/dist/ScrollAreaViewport-cjs.js +921 -960
  41. package/dist/ScrollAreaViewport-es.js +917 -958
  42. package/dist/SelectGroupLabel-cjs.js +1924 -0
  43. package/dist/SelectGroupLabel-es.js +1888 -0
  44. package/dist/SelectPrimitive-cjs.js +112 -0
  45. package/dist/SelectPrimitive-es.js +110 -0
  46. package/dist/ToolbarRootContext-cjs.js +35 -0
  47. package/dist/ToolbarRootContext-es.js +14 -0
  48. package/dist/dialogReturnFocus-cjs.js +427 -0
  49. package/dist/dialogReturnFocus-es.js +423 -0
  50. package/dist/docs/SelectPrimitive/SelectPrimitive.md +326 -0
  51. package/dist/docs/index.md +1 -0
  52. package/dist/floating-ui.react-dom-cjs.js +1 -0
  53. package/dist/floating-ui.react-dom-es.js +2 -2
  54. package/dist/floating-ui.utils.dom-es.js +1 -1
  55. package/dist/index.cjs +15 -7
  56. package/dist/index.d.mts +1 -0
  57. package/dist/index.d.ts +1 -0
  58. package/dist/index.mjs +12 -7
  59. package/dist/primitives/BottomSheet/BottomSheet.d.ts +19 -1
  60. package/dist/primitives/BottomSheet/BottomSheet.types.d.ts +8 -0
  61. package/dist/primitives/BottomSheet/index.cjs +2 -0
  62. package/dist/primitives/BottomSheet/index.d.ts +1 -1
  63. package/dist/primitives/BottomSheet/index.mjs +2 -1
  64. package/dist/primitives/ComboboxPrimitive/index.cjs +3 -1
  65. package/dist/primitives/ComboboxPrimitive/index.mjs +3 -1
  66. package/dist/primitives/InputNumberExperimental/index.cjs +2 -1
  67. package/dist/primitives/InputNumberExperimental/index.mjs +2 -1
  68. package/dist/primitives/SelectPrimitive/SelectPrimitive.d.ts +63 -0
  69. package/dist/primitives/SelectPrimitive/index.cjs +29 -0
  70. package/dist/primitives/SelectPrimitive/index.d.ts +2 -0
  71. package/dist/primitives/SelectPrimitive/index.mjs +23 -0
  72. package/dist/primitives/SelectPrimitive/types.d.ts +16 -0
  73. package/dist/primitives/index.cjs +9 -1
  74. package/dist/primitives/index.d.ts +1 -0
  75. package/dist/primitives/index.mjs +8 -2
  76. package/dist/primitives/mergeClassName.d.ts +12 -0
  77. package/dist/resolveAriaLabelledBy-cjs.js +195 -0
  78. package/dist/resolveAriaLabelledBy-es.js +162 -0
  79. package/dist/styles.css +685 -0
  80. package/dist/unstyledPrimitives/index.cjs +434 -259
  81. package/dist/unstyledPrimitives/index.d.ts +2 -0
  82. package/dist/unstyledPrimitives/index.mjs +425 -252
  83. package/dist/useButton-cjs.js +2 -0
  84. package/dist/useButton-es.js +3 -2
  85. package/dist/useCompositeListItem-es.js +4 -4
  86. package/dist/useLabel-cjs.js +3 -329
  87. package/dist/useLabel-es.js +4 -299
  88. package/dist/useLabelableId-cjs.js +332 -0
  89. package/dist/useLabelableId-es.js +300 -0
  90. package/dist/useRenderElement-cjs.js +3 -0
  91. package/dist/useRenderElement-es.js +4 -1
  92. package/dist/utils/meta/meta.json +11 -1
  93. package/package.json +2 -2
@@ -3,19 +3,26 @@
3
3
  var React = require('react');
4
4
  var useButton = require('../useButton-cjs.js');
5
5
  var ComboboxChipRemove = require('../ComboboxChipRemove-cjs.js');
6
+ var resolveAriaLabelledBy = require('../resolveAriaLabelledBy-cjs.js');
6
7
  var jsxRuntime = require('react/jsx-runtime');
7
8
  var Separator = require('../Separator-cjs.js');
9
+ var DrawerDescription = require('../DrawerDescription-cjs.js');
10
+ var DrawerTitle = require('../DrawerTitle-cjs.js');
8
11
  var ScrollAreaViewport = require('../ScrollAreaViewport-cjs.js');
9
- var MenuSubmenuTrigger = require('../MenuSubmenuTrigger-cjs.js');
10
12
  var useRenderElement = require('../useRenderElement-cjs.js');
11
13
  var floatingUi_utils_dom = require('../floating-ui.utils.dom-cjs.js');
12
14
  var clamp = require('../clamp-cjs.js');
13
15
  var InternalBackdrop = require('../InternalBackdrop-cjs.js');
14
16
  var ReactDOM = require('react-dom');
17
+ var MenuSubmenuTrigger = require('../MenuSubmenuTrigger-cjs.js');
15
18
  var useCompositeListItem = require('../useCompositeListItem-cjs.js');
16
19
  var index_esm = require('../index.esm-cjs.js');
17
20
  var NumberFieldInput = require('../NumberFieldInput-cjs.js');
18
- require('../useLabel-cjs.js');
21
+ var SelectGroupLabel = require('../SelectGroupLabel-cjs.js');
22
+ var useLabelableId = require('../useLabelableId-cjs.js');
23
+ var useLabel = require('../useLabel-cjs.js');
24
+ require('../CSPContext-cjs.js');
25
+ require('../ToolbarRootContext-cjs.js');
19
26
  require('../floating-ui.react-dom-cjs.js');
20
27
 
21
28
  function _interopNamespaceDefault(e) {
@@ -108,7 +115,7 @@ function AutocompleteRoot(props) {
108
115
  if (highlightedValue == null) {
109
116
  setInlineInputValue('');
110
117
  } else {
111
- setInlineInputValue(ComboboxChipRemove.stringifyAsLabel(highlightedValue, itemToStringValue));
118
+ setInlineInputValue(resolveAriaLabelledBy.stringifyAsLabel(highlightedValue, itemToStringValue));
112
119
  }
113
120
  } else {
114
121
  setInlineInputValue('');
@@ -147,7 +154,7 @@ function AutocompleteValue(props) {
147
154
  });
148
155
  }
149
156
 
150
- var index_parts$5 = /*#__PURE__*/Object.freeze({
157
+ var index_parts$7 = /*#__PURE__*/Object.freeze({
151
158
  __proto__: null,
152
159
  Arrow: ComboboxChipRemove.ComboboxArrow,
153
160
  Backdrop: ComboboxChipRemove.ComboboxBackdrop,
@@ -174,40 +181,20 @@ var index_parts$5 = /*#__PURE__*/Object.freeze({
174
181
  useFilteredItems: ComboboxChipRemove.useFilteredItems
175
182
  });
176
183
 
177
- /**
178
- * A paragraph with additional information about the dialog.
179
- * Renders a `<p>` element.
180
- *
181
- * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)
182
- */
183
- const DialogDescription = /*#__PURE__*/React__namespace.forwardRef(function DialogDescription(componentProps, forwardedRef) {
184
- const {
185
- render,
186
- className,
187
- id: idProp,
188
- ...elementProps
189
- } = componentProps;
190
- const {
191
- store
192
- } = ScrollAreaViewport.useDialogRootContext();
193
- const id = useButton.useBaseUiId(idProp);
194
- store.useSyncedValueWithCleanup('descriptionElementId', id);
195
- return useRenderElement.useRenderElement('p', componentProps, {
196
- ref: forwardedRef,
197
- props: [{
198
- id
199
- }, elementProps]
200
- });
184
+ var index_parts$6 = /*#__PURE__*/Object.freeze({
185
+ __proto__: null,
186
+ Backdrop: DrawerDescription.DialogBackdrop,
187
+ Close: DrawerTitle.DialogClose,
188
+ Description: DrawerDescription.DialogDescription,
189
+ Handle: DrawerDescription.DialogHandle,
190
+ Popup: DrawerDescription.DialogPopup,
191
+ Portal: ScrollAreaViewport.DialogPortal,
192
+ Root: ScrollAreaViewport.DialogRoot,
193
+ Title: DrawerTitle.DialogTitle,
194
+ Trigger: ScrollAreaViewport.DialogTrigger,
195
+ Viewport: DrawerDescription.DialogViewport,
196
+ createHandle: DrawerDescription.createDialogHandle
201
197
  });
202
- if (process.env.NODE_ENV !== "production") DialogDescription.displayName = "DialogDescription";
203
-
204
- /**
205
- * A paragraph with additional information about the drawer.
206
- * Renders a `<p>` element.
207
- *
208
- * Documentation: [Base UI Drawer](https://base-ui.com/react/components/drawer)
209
- */
210
- const DrawerDescription = DialogDescription;
211
198
 
212
199
  const stateAttributesMapping$5 = {
213
200
  active(value) {
@@ -406,160 +393,6 @@ function createVisualStateStore() {
406
393
  };
407
394
  }
408
395
 
409
- let DialogViewportDataAttributes = function (DialogViewportDataAttributes) {
410
- /**
411
- * Present when the dialog is open.
412
- */
413
- DialogViewportDataAttributes[DialogViewportDataAttributes["open"] = InternalBackdrop.CommonPopupDataAttributes.open] = "open";
414
- /**
415
- * Present when the dialog is closed.
416
- */
417
- DialogViewportDataAttributes[DialogViewportDataAttributes["closed"] = InternalBackdrop.CommonPopupDataAttributes.closed] = "closed";
418
- /**
419
- * Present when the dialog is animating in.
420
- */
421
- DialogViewportDataAttributes[DialogViewportDataAttributes["startingStyle"] = InternalBackdrop.CommonPopupDataAttributes.startingStyle] = "startingStyle";
422
- /**
423
- * Present when the dialog is animating out.
424
- */
425
- DialogViewportDataAttributes[DialogViewportDataAttributes["endingStyle"] = InternalBackdrop.CommonPopupDataAttributes.endingStyle] = "endingStyle";
426
- /**
427
- * Present when the dialog is nested within another dialog.
428
- */
429
- DialogViewportDataAttributes["nested"] = "data-nested";
430
- /**
431
- * Present when the dialog has other open dialogs nested within it.
432
- */
433
- DialogViewportDataAttributes["nestedDialogOpen"] = "data-nested-dialog-open";
434
- return DialogViewportDataAttributes;
435
- }({});
436
-
437
- const stateAttributesMapping$3 = {
438
- ...InternalBackdrop.popupStateMapping,
439
- ...useButton.transitionStatusMapping,
440
- nested(value) {
441
- return value ? {
442
- [DialogViewportDataAttributes.nested]: ''
443
- } : null;
444
- },
445
- nestedDialogOpen(value) {
446
- return value ? {
447
- [DialogViewportDataAttributes.nestedDialogOpen]: ''
448
- } : null;
449
- }
450
- };
451
-
452
- /**
453
- * A positioning container for the dialog popup that can be made scrollable.
454
- * Renders a `<div>` element.
455
- *
456
- * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)
457
- */
458
- const DialogViewport = /*#__PURE__*/React__namespace.forwardRef(function DialogViewport(componentProps, forwardedRef) {
459
- const {
460
- className,
461
- render,
462
- children,
463
- ...elementProps
464
- } = componentProps;
465
- const keepMounted = ScrollAreaViewport.useDialogPortalContext();
466
- const {
467
- store
468
- } = ScrollAreaViewport.useDialogRootContext();
469
- const open = store.useState('open');
470
- const nested = store.useState('nested');
471
- const transitionStatus = store.useState('transitionStatus');
472
- const nestedOpenDialogCount = store.useState('nestedOpenDialogCount');
473
- const mounted = store.useState('mounted');
474
- const nestedDialogOpen = nestedOpenDialogCount > 0;
475
- const state = {
476
- open,
477
- nested,
478
- transitionStatus,
479
- nestedDialogOpen
480
- };
481
- const shouldRender = keepMounted || mounted;
482
- return useRenderElement.useRenderElement('div', componentProps, {
483
- enabled: shouldRender,
484
- state,
485
- ref: [forwardedRef, store.useStateSetter('viewportElement')],
486
- stateAttributesMapping: stateAttributesMapping$3,
487
- props: [{
488
- role: 'presentation',
489
- hidden: !mounted,
490
- style: {
491
- pointerEvents: !open ? 'none' : undefined
492
- },
493
- children
494
- }, elementProps]
495
- });
496
- });
497
- if (process.env.NODE_ENV !== "production") DialogViewport.displayName = "DialogViewport";
498
-
499
- /**
500
- * A handle to control a Dialog imperatively and to associate detached triggers with it.
501
- */
502
- class DialogHandle {
503
- /**
504
- * Internal store holding the dialog state.
505
- * @internal
506
- */
507
-
508
- constructor(store) {
509
- this.store = store ?? new ScrollAreaViewport.DialogStore();
510
- }
511
-
512
- /**
513
- * Opens the dialog and associates it with the trigger with the given id.
514
- * The trigger, if provided, must be a Dialog.Trigger component with this handle passed as a prop.
515
- *
516
- * This method should only be called in an event handler or an effect (not during rendering).
517
- *
518
- * @param triggerId ID of the trigger to associate with the dialog. If null, the dialog will open without a trigger association.
519
- */
520
- open(triggerId) {
521
- const triggerElement = triggerId ? this.store.context.triggerElements.getById(triggerId) : undefined;
522
- if (process.env.NODE_ENV !== 'production') {
523
- if (triggerId && !triggerElement) {
524
- console.warn(`Base UI: DialogHandle.open: No trigger found with id "${triggerId}". The dialog will open, but the trigger will not be associated with the dialog.`);
525
- }
526
- }
527
- this.store.setOpen(true, useButton.createChangeEventDetails(useButton.imperativeAction, undefined, triggerElement));
528
- }
529
-
530
- /**
531
- * Opens the dialog and sets the payload.
532
- * Does not associate the dialog with any trigger.
533
- *
534
- * @param payload Payload to set when opening the dialog.
535
- */
536
- openWithPayload(payload) {
537
- this.store.set('payload', payload);
538
- this.store.setOpen(true, useButton.createChangeEventDetails(useButton.imperativeAction, undefined, undefined));
539
- }
540
-
541
- /**
542
- * Closes the dialog.
543
- */
544
- close() {
545
- this.store.setOpen(false, useButton.createChangeEventDetails(useButton.imperativeAction, undefined, undefined));
546
- }
547
-
548
- /**
549
- * Indicates whether the dialog is currently open.
550
- */
551
- get isOpen() {
552
- return this.store.state.open;
553
- }
554
- }
555
-
556
- /**
557
- * Creates a new handle to connect a Dialog.Root with detached Dialog.Trigger components.
558
- */
559
- function createDialogHandle() {
560
- return new DialogHandle();
561
- }
562
-
563
396
  function isScrollable(element, axis) {
564
397
  const style = floatingUi_utils_dom.getComputedStyle(element);
565
398
  if (axis === 'vertical') {
@@ -1572,7 +1405,7 @@ const SWIPE_AREA_SWIPING_HOOK = {
1572
1405
  const SWIPE_AREA_DISABLED_HOOK = {
1573
1406
  [DrawerSwipeAreaDataAttributes.disabled]: ''
1574
1407
  };
1575
- const stateAttributesMapping$2 = {
1408
+ const stateAttributesMapping$3 = {
1576
1409
  open(value) {
1577
1410
  return value ? SWIPE_AREA_OPEN_HOOK : SWIPE_AREA_CLOSED_HOOK;
1578
1411
  },
@@ -1877,7 +1710,7 @@ const DrawerSwipeArea = /*#__PURE__*/React__namespace.forwardRef(function Drawer
1877
1710
  return useRenderElement.useRenderElement('div', componentProps, {
1878
1711
  state,
1879
1712
  ref: [forwardedRef, swipeAreaRef, registerTrigger],
1880
- stateAttributesMapping: stateAttributesMapping$2,
1713
+ stateAttributesMapping: stateAttributesMapping$3,
1881
1714
  props: [{
1882
1715
  role: 'presentation',
1883
1716
  'aria-hidden': true,
@@ -2593,7 +2426,7 @@ const DrawerViewport = /*#__PURE__*/React__namespace.forwardRef(function DrawerV
2593
2426
  lastPointerTypeRef.current = '';
2594
2427
  ignoreNextTouchStartFromPenRef.current = false;
2595
2428
  }
2596
- return /*#__PURE__*/jsxRuntime.jsx(DialogViewport, {
2429
+ return /*#__PURE__*/jsxRuntime.jsx(DrawerDescription.DialogViewport, {
2597
2430
  ref: forwardedRef,
2598
2431
  className: className,
2599
2432
  render: render,
@@ -2881,13 +2714,13 @@ function shouldDismissFromStartEdge(direction, axis) {
2881
2714
  return null;
2882
2715
  }
2883
2716
 
2884
- var index_parts$4 = /*#__PURE__*/Object.freeze({
2717
+ var index_parts$5 = /*#__PURE__*/Object.freeze({
2885
2718
  __proto__: null,
2886
2719
  Backdrop: ScrollAreaViewport.DrawerBackdrop,
2887
- Close: MenuSubmenuTrigger.DrawerClose,
2720
+ Close: DrawerTitle.DrawerClose,
2888
2721
  Content: ScrollAreaViewport.DrawerContent,
2889
- Description: DrawerDescription,
2890
- Handle: DialogHandle,
2722
+ Description: DrawerDescription.DrawerDescription,
2723
+ Handle: DrawerDescription.DialogHandle,
2891
2724
  Indent: DrawerIndent,
2892
2725
  IndentBackground: DrawerIndentBackground,
2893
2726
  Popup: ScrollAreaViewport.DrawerPopup,
@@ -2895,10 +2728,10 @@ var index_parts$4 = /*#__PURE__*/Object.freeze({
2895
2728
  Provider: DrawerProvider,
2896
2729
  Root: ScrollAreaViewport.DrawerRoot,
2897
2730
  SwipeArea: DrawerSwipeArea,
2898
- Title: MenuSubmenuTrigger.DrawerTitle,
2731
+ Title: DrawerTitle.DrawerTitle,
2899
2732
  Trigger: ScrollAreaViewport.DrawerTrigger,
2900
2733
  Viewport: DrawerViewport,
2901
- createHandle: createDialogHandle
2734
+ createHandle: DrawerDescription.createDialogHandle
2902
2735
  });
2903
2736
 
2904
2737
  /**
@@ -2943,52 +2776,6 @@ const MenuArrow = /*#__PURE__*/React__namespace.forwardRef(function MenuArrow(co
2943
2776
  });
2944
2777
  if (process.env.NODE_ENV !== "production") MenuArrow.displayName = "MenuArrow";
2945
2778
 
2946
- const stateAttributesMapping$1 = {
2947
- ...InternalBackdrop.popupStateMapping,
2948
- ...useButton.transitionStatusMapping
2949
- };
2950
-
2951
- /**
2952
- * An overlay displayed beneath the menu popup.
2953
- * Renders a `<div>` element.
2954
- *
2955
- * Documentation: [Base UI Menu](https://base-ui.com/react/components/menu)
2956
- */
2957
- const MenuBackdrop = /*#__PURE__*/React__namespace.forwardRef(function MenuBackdrop(componentProps, forwardedRef) {
2958
- const {
2959
- className,
2960
- render,
2961
- ...elementProps
2962
- } = componentProps;
2963
- const {
2964
- store
2965
- } = MenuSubmenuTrigger.useMenuRootContext();
2966
- const open = store.useState('open');
2967
- const mounted = store.useState('mounted');
2968
- const transitionStatus = store.useState('transitionStatus');
2969
- const lastOpenChangeReason = store.useState('lastOpenChangeReason');
2970
- const contextMenuContext = MenuSubmenuTrigger.useContextMenuRootContext();
2971
- const state = {
2972
- open,
2973
- transitionStatus
2974
- };
2975
- return useRenderElement.useRenderElement('div', componentProps, {
2976
- ref: contextMenuContext?.backdropRef ? [forwardedRef, contextMenuContext.backdropRef] : forwardedRef,
2977
- state,
2978
- stateAttributesMapping: stateAttributesMapping$1,
2979
- props: [{
2980
- role: 'presentation',
2981
- hidden: !mounted,
2982
- style: {
2983
- pointerEvents: lastOpenChangeReason === useButton.triggerHover ? 'none' : undefined,
2984
- userSelect: 'none',
2985
- WebkitUserSelect: 'none'
2986
- }
2987
- }, elementProps]
2988
- });
2989
- });
2990
- if (process.env.NODE_ENV !== "production") MenuBackdrop.displayName = "MenuBackdrop";
2991
-
2992
2779
  const MenuCheckboxItemContext = /*#__PURE__*/React__namespace.createContext(undefined);
2993
2780
  if (process.env.NODE_ENV !== "production") MenuCheckboxItemContext.displayName = "MenuCheckboxItemContext";
2994
2781
  function useMenuCheckboxItemContext() {
@@ -3594,7 +3381,7 @@ let MenuViewportCssVars = /*#__PURE__*/function (MenuViewportCssVars) {
3594
3381
  return MenuViewportCssVars;
3595
3382
  }({});
3596
3383
 
3597
- const stateAttributesMapping = {
3384
+ const stateAttributesMapping$2 = {
3598
3385
  activationDirection: value => value ? {
3599
3386
  'data-activation-direction': value
3600
3387
  } : null
@@ -3642,7 +3429,7 @@ const MenuViewport = /*#__PURE__*/React__namespace.forwardRef(function MenuViewp
3642
3429
  props: [elementProps, {
3643
3430
  children: childrenToRender
3644
3431
  }],
3645
- stateAttributesMapping
3432
+ stateAttributesMapping: stateAttributesMapping$2
3646
3433
  });
3647
3434
  });
3648
3435
  if (process.env.NODE_ENV !== "production") MenuViewport.displayName = "MenuViewport";
@@ -3693,10 +3480,10 @@ function createMenuHandle() {
3693
3480
  return new MenuHandle();
3694
3481
  }
3695
3482
 
3696
- var index_parts$3 = /*#__PURE__*/Object.freeze({
3483
+ var index_parts$4 = /*#__PURE__*/Object.freeze({
3697
3484
  __proto__: null,
3698
3485
  Arrow: MenuArrow,
3699
- Backdrop: MenuBackdrop,
3486
+ Backdrop: MenuSubmenuTrigger.MenuBackdrop,
3700
3487
  CheckboxItem: MenuCheckboxItem,
3701
3488
  CheckboxItemIndicator: MenuCheckboxItemIndicator,
3702
3489
  Group: MenuSubmenuTrigger.MenuGroup,
@@ -4077,7 +3864,7 @@ const ScrollAreaCorner = /*#__PURE__*/React__namespace.forwardRef(function Scrol
4077
3864
  });
4078
3865
  if (process.env.NODE_ENV !== "production") ScrollAreaCorner.displayName = "ScrollAreaCorner";
4079
3866
 
4080
- var index_parts$2 = /*#__PURE__*/Object.freeze({
3867
+ var index_parts$3 = /*#__PURE__*/Object.freeze({
4081
3868
  __proto__: null,
4082
3869
  Content: ScrollAreaContent,
4083
3870
  Corner: ScrollAreaCorner,
@@ -4087,7 +3874,7 @@ var index_parts$2 = /*#__PURE__*/Object.freeze({
4087
3874
  Viewport: ScrollAreaViewport.ScrollAreaViewport
4088
3875
  });
4089
3876
 
4090
- var index_parts$1 = /*#__PURE__*/Object.freeze({
3877
+ var index_parts$2 = /*#__PURE__*/Object.freeze({
4091
3878
  __proto__: null,
4092
3879
  Arrow: ComboboxChipRemove.ComboboxArrow,
4093
3880
  Backdrop: ComboboxChipRemove.ComboboxBackdrop,
@@ -4474,7 +4261,7 @@ const NumberFieldScrubAreaCursor = /*#__PURE__*/React__namespace.forwardRef(func
4474
4261
  });
4475
4262
  if (process.env.NODE_ENV !== "production") NumberFieldScrubAreaCursor.displayName = "NumberFieldScrubAreaCursor";
4476
4263
 
4477
- var index_parts = /*#__PURE__*/Object.freeze({
4264
+ var index_parts$1 = /*#__PURE__*/Object.freeze({
4478
4265
  __proto__: null,
4479
4266
  Decrement: NumberFieldInput.NumberFieldDecrement,
4480
4267
  Group: NumberFieldInput.NumberFieldGroup,
@@ -4485,6 +4272,392 @@ var index_parts = /*#__PURE__*/Object.freeze({
4485
4272
  ScrubAreaCursor: NumberFieldScrubAreaCursor
4486
4273
  });
4487
4274
 
4275
+ /**
4276
+ * An accessible label that is automatically associated with the select trigger.
4277
+ * Renders a `<div>` element.
4278
+ *
4279
+ * Documentation: [Base UI Select](https://base-ui.com/react/components/select)
4280
+ */
4281
+ const SelectLabel = /*#__PURE__*/React__namespace.forwardRef(function SelectLabel(componentProps, forwardedRef) {
4282
+ const {
4283
+ render,
4284
+ className,
4285
+ ...elementProps
4286
+ } = componentProps;
4287
+ // Keep label id derived from the root and ignore runtime `id` overrides from untyped consumers.
4288
+ const elementPropsWithoutId = elementProps;
4289
+ delete elementPropsWithoutId.id;
4290
+ const fieldRootContext = useLabelableId.useFieldRootContext();
4291
+ const {
4292
+ store
4293
+ } = SelectGroupLabel.useSelectRootContext();
4294
+ const triggerElement = InternalBackdrop.useStore(store, SelectGroupLabel.selectors.triggerElement);
4295
+ const rootId = InternalBackdrop.useStore(store, SelectGroupLabel.selectors.id);
4296
+ const defaultLabelId = resolveAriaLabelledBy.getDefaultLabelId(rootId);
4297
+ const labelProps = useLabel.useLabel({
4298
+ id: defaultLabelId,
4299
+ fallbackControlId: triggerElement?.id ?? rootId,
4300
+ setLabelId(nextLabelId) {
4301
+ store.set('labelId', nextLabelId);
4302
+ }
4303
+ });
4304
+ return useRenderElement.useRenderElement('div', componentProps, {
4305
+ ref: forwardedRef,
4306
+ state: fieldRootContext.state,
4307
+ props: [labelProps, elementProps],
4308
+ stateAttributesMapping: useLabelableId.fieldValidityMapping
4309
+ });
4310
+ });
4311
+ if (process.env.NODE_ENV !== "production") SelectLabel.displayName = "SelectLabel";
4312
+
4313
+ /**
4314
+ * An icon that indicates that the trigger button opens a select popup.
4315
+ * Renders a `<span>` element.
4316
+ *
4317
+ * Documentation: [Base UI Select](https://base-ui.com/react/components/select)
4318
+ */
4319
+ const SelectIcon = /*#__PURE__*/React__namespace.forwardRef(function SelectIcon(componentProps, forwardedRef) {
4320
+ const {
4321
+ className,
4322
+ render,
4323
+ ...elementProps
4324
+ } = componentProps;
4325
+ const {
4326
+ store
4327
+ } = SelectGroupLabel.useSelectRootContext();
4328
+ const open = InternalBackdrop.useStore(store, SelectGroupLabel.selectors.open);
4329
+ const state = {
4330
+ open
4331
+ };
4332
+ const element = useRenderElement.useRenderElement('span', componentProps, {
4333
+ state,
4334
+ ref: forwardedRef,
4335
+ props: [{
4336
+ 'aria-hidden': true,
4337
+ children: '▼'
4338
+ }, elementProps],
4339
+ stateAttributesMapping: InternalBackdrop.triggerOpenStateMapping
4340
+ });
4341
+ return element;
4342
+ });
4343
+ if (process.env.NODE_ENV !== "production") SelectIcon.displayName = "SelectIcon";
4344
+
4345
+ const stateAttributesMapping$1 = {
4346
+ ...InternalBackdrop.popupStateMapping,
4347
+ ...useButton.transitionStatusMapping
4348
+ };
4349
+
4350
+ /**
4351
+ * An overlay displayed beneath the menu popup.
4352
+ * Renders a `<div>` element.
4353
+ *
4354
+ * Documentation: [Base UI Select](https://base-ui.com/react/components/select)
4355
+ */
4356
+ const SelectBackdrop = /*#__PURE__*/React__namespace.forwardRef(function SelectBackdrop(componentProps, forwardedRef) {
4357
+ const {
4358
+ className,
4359
+ render,
4360
+ ...elementProps
4361
+ } = componentProps;
4362
+ const {
4363
+ store
4364
+ } = SelectGroupLabel.useSelectRootContext();
4365
+ const open = InternalBackdrop.useStore(store, SelectGroupLabel.selectors.open);
4366
+ const mounted = InternalBackdrop.useStore(store, SelectGroupLabel.selectors.mounted);
4367
+ const transitionStatus = InternalBackdrop.useStore(store, SelectGroupLabel.selectors.transitionStatus);
4368
+ const state = {
4369
+ open,
4370
+ transitionStatus
4371
+ };
4372
+ const element = useRenderElement.useRenderElement('div', componentProps, {
4373
+ state,
4374
+ ref: forwardedRef,
4375
+ props: [{
4376
+ role: 'presentation',
4377
+ hidden: !mounted,
4378
+ style: {
4379
+ userSelect: 'none',
4380
+ WebkitUserSelect: 'none'
4381
+ }
4382
+ }, elementProps],
4383
+ stateAttributesMapping: stateAttributesMapping$1
4384
+ });
4385
+ return element;
4386
+ });
4387
+ if (process.env.NODE_ENV !== "production") SelectBackdrop.displayName = "SelectBackdrop";
4388
+
4389
+ const stateAttributesMapping = {
4390
+ ...InternalBackdrop.popupStateMapping,
4391
+ ...useButton.transitionStatusMapping
4392
+ };
4393
+
4394
+ /**
4395
+ * Displays an element positioned against the select popup anchor.
4396
+ * Renders a `<div>` element.
4397
+ *
4398
+ * Documentation: [Base UI Select](https://base-ui.com/react/components/select)
4399
+ */
4400
+ const SelectArrow = /*#__PURE__*/React__namespace.forwardRef(function SelectArrow(componentProps, forwardedRef) {
4401
+ const {
4402
+ className,
4403
+ render,
4404
+ ...elementProps
4405
+ } = componentProps;
4406
+ const {
4407
+ store
4408
+ } = SelectGroupLabel.useSelectRootContext();
4409
+ const {
4410
+ side,
4411
+ align,
4412
+ arrowRef,
4413
+ arrowStyles,
4414
+ arrowUncentered,
4415
+ alignItemWithTriggerActive
4416
+ } = SelectGroupLabel.useSelectPositionerContext();
4417
+ const open = InternalBackdrop.useStore(store, SelectGroupLabel.selectors.open, true);
4418
+ const state = {
4419
+ open,
4420
+ side,
4421
+ align,
4422
+ uncentered: arrowUncentered
4423
+ };
4424
+ const element = useRenderElement.useRenderElement('div', componentProps, {
4425
+ state,
4426
+ ref: [arrowRef, forwardedRef],
4427
+ props: [{
4428
+ style: arrowStyles,
4429
+ 'aria-hidden': true
4430
+ }, elementProps],
4431
+ stateAttributesMapping
4432
+ });
4433
+ if (alignItemWithTriggerActive) {
4434
+ return null;
4435
+ }
4436
+ return element;
4437
+ });
4438
+ if (process.env.NODE_ENV !== "production") SelectArrow.displayName = "SelectArrow";
4439
+
4440
+ /**
4441
+ * @internal
4442
+ */
4443
+ const SelectScrollArrow = /*#__PURE__*/React__namespace.forwardRef(function SelectScrollArrow(componentProps, forwardedRef) {
4444
+ const {
4445
+ render,
4446
+ className,
4447
+ direction,
4448
+ keepMounted = false,
4449
+ ...elementProps
4450
+ } = componentProps;
4451
+ const {
4452
+ store,
4453
+ popupRef,
4454
+ listRef,
4455
+ handleScrollArrowVisibility,
4456
+ scrollArrowsMountedCountRef
4457
+ } = SelectGroupLabel.useSelectRootContext();
4458
+ const {
4459
+ side,
4460
+ scrollDownArrowRef,
4461
+ scrollUpArrowRef
4462
+ } = SelectGroupLabel.useSelectPositionerContext();
4463
+ const visibleSelector = direction === 'up' ? SelectGroupLabel.selectors.scrollUpArrowVisible : SelectGroupLabel.selectors.scrollDownArrowVisible;
4464
+ const stateVisible = InternalBackdrop.useStore(store, visibleSelector);
4465
+ const openMethod = InternalBackdrop.useStore(store, SelectGroupLabel.selectors.openMethod);
4466
+
4467
+ // Scroll arrows are disabled for touch modality as they are a hover-only element.
4468
+ const visible = stateVisible && openMethod !== 'touch';
4469
+ const timeout = useButton.useTimeout();
4470
+ const scrollArrowRef = direction === 'up' ? scrollUpArrowRef : scrollDownArrowRef;
4471
+ const {
4472
+ transitionStatus,
4473
+ setMounted
4474
+ } = useButton.useTransitionStatus(visible);
4475
+ useButton.useIsoLayoutEffect(() => {
4476
+ scrollArrowsMountedCountRef.current += 1;
4477
+ if (!store.state.hasScrollArrows) {
4478
+ store.set('hasScrollArrows', true);
4479
+ }
4480
+ return () => {
4481
+ scrollArrowsMountedCountRef.current = Math.max(0, scrollArrowsMountedCountRef.current - 1);
4482
+ if (scrollArrowsMountedCountRef.current === 0 && store.state.hasScrollArrows) {
4483
+ store.set('hasScrollArrows', false);
4484
+ }
4485
+ };
4486
+ }, [store, scrollArrowsMountedCountRef]);
4487
+ useButton.useOpenChangeComplete({
4488
+ open: visible,
4489
+ ref: scrollArrowRef,
4490
+ onComplete() {
4491
+ if (!visible) {
4492
+ setMounted(false);
4493
+ }
4494
+ }
4495
+ });
4496
+ const state = {
4497
+ direction,
4498
+ visible,
4499
+ side,
4500
+ transitionStatus
4501
+ };
4502
+ const defaultProps = {
4503
+ 'aria-hidden': true,
4504
+ children: direction === 'up' ? '▲' : '▼',
4505
+ style: {
4506
+ position: 'absolute'
4507
+ },
4508
+ onMouseMove(event) {
4509
+ if (event.movementX === 0 && event.movementY === 0 || timeout.isStarted()) {
4510
+ return;
4511
+ }
4512
+ store.set('activeIndex', null);
4513
+ function scrollNextItem() {
4514
+ const scroller = store.state.listElement ?? popupRef.current;
4515
+ if (!scroller) {
4516
+ return;
4517
+ }
4518
+ store.set('activeIndex', null);
4519
+ handleScrollArrowVisibility();
4520
+ const isScrolledToTop = scroller.scrollTop === 0;
4521
+ const isScrolledToBottom = Math.round(scroller.scrollTop + scroller.clientHeight) >= scroller.scrollHeight;
4522
+ const list = listRef.current;
4523
+
4524
+ // Fallback when there are no items registered yet.
4525
+ if (list.length === 0) {
4526
+ if (direction === 'up') {
4527
+ store.set('scrollUpArrowVisible', !isScrolledToTop);
4528
+ } else {
4529
+ store.set('scrollDownArrowVisible', !isScrolledToBottom);
4530
+ }
4531
+ }
4532
+ if (direction === 'up' && isScrolledToTop || direction === 'down' && isScrolledToBottom) {
4533
+ timeout.clear();
4534
+ return;
4535
+ }
4536
+ if ((store.state.listElement || popupRef.current) && listRef.current && listRef.current.length > 0) {
4537
+ const items = listRef.current;
4538
+ const scrollArrowHeight = scrollArrowRef.current?.offsetHeight || 0;
4539
+ if (direction === 'up') {
4540
+ let firstVisibleIndex = 0;
4541
+ const scrollTop = scroller.scrollTop + scrollArrowHeight;
4542
+ for (let i = 0; i < items.length; i += 1) {
4543
+ const item = items[i];
4544
+ if (item) {
4545
+ const itemTop = item.offsetTop;
4546
+ if (itemTop >= scrollTop) {
4547
+ firstVisibleIndex = i;
4548
+ break;
4549
+ }
4550
+ }
4551
+ }
4552
+ const targetIndex = Math.max(0, firstVisibleIndex - 1);
4553
+ if (targetIndex < firstVisibleIndex) {
4554
+ const targetItem = items[targetIndex];
4555
+ if (targetItem) {
4556
+ scroller.scrollTop = Math.max(0, targetItem.offsetTop - scrollArrowHeight);
4557
+ }
4558
+ } else {
4559
+ // Already at the first item; ensure we reach the absolute top to account for group labels.
4560
+ scroller.scrollTop = 0;
4561
+ }
4562
+ } else {
4563
+ let lastVisibleIndex = items.length - 1;
4564
+ const scrollBottom = scroller.scrollTop + scroller.clientHeight - scrollArrowHeight;
4565
+ for (let i = 0; i < items.length; i += 1) {
4566
+ const item = items[i];
4567
+ if (item) {
4568
+ const itemBottom = item.offsetTop + item.offsetHeight;
4569
+ if (itemBottom > scrollBottom) {
4570
+ lastVisibleIndex = Math.max(0, i - 1);
4571
+ break;
4572
+ }
4573
+ }
4574
+ }
4575
+ const targetIndex = Math.min(items.length - 1, lastVisibleIndex + 1);
4576
+ if (targetIndex > lastVisibleIndex) {
4577
+ const targetItem = items[targetIndex];
4578
+ if (targetItem) {
4579
+ scroller.scrollTop = targetItem.offsetTop + targetItem.offsetHeight - scroller.clientHeight + scrollArrowHeight;
4580
+ }
4581
+ } else {
4582
+ // Already at the last item; ensure we reach the true bottom.
4583
+ scroller.scrollTop = scroller.scrollHeight - scroller.clientHeight;
4584
+ }
4585
+ }
4586
+ }
4587
+ timeout.start(40, scrollNextItem);
4588
+ }
4589
+ timeout.start(40, scrollNextItem);
4590
+ },
4591
+ onMouseLeave() {
4592
+ timeout.clear();
4593
+ }
4594
+ };
4595
+ const element = useRenderElement.useRenderElement('div', componentProps, {
4596
+ ref: [forwardedRef, scrollArrowRef],
4597
+ state,
4598
+ props: [defaultProps, elementProps]
4599
+ });
4600
+ const shouldRender = visible || keepMounted;
4601
+ if (!shouldRender) {
4602
+ return null;
4603
+ }
4604
+ return element;
4605
+ });
4606
+ if (process.env.NODE_ENV !== "production") SelectScrollArrow.displayName = "SelectScrollArrow";
4607
+
4608
+ /**
4609
+ * An element that scrolls the select popup down when hovered. Does not render when using touch input.
4610
+ * Renders a `<div>` element.
4611
+ *
4612
+ * Documentation: [Base UI Select](https://base-ui.com/react/components/select)
4613
+ */
4614
+ const SelectScrollDownArrow = /*#__PURE__*/React__namespace.forwardRef(function SelectScrollDownArrow(props, forwardedRef) {
4615
+ return /*#__PURE__*/jsxRuntime.jsx(SelectScrollArrow, {
4616
+ ...props,
4617
+ ref: forwardedRef,
4618
+ direction: "down"
4619
+ });
4620
+ });
4621
+ if (process.env.NODE_ENV !== "production") SelectScrollDownArrow.displayName = "SelectScrollDownArrow";
4622
+
4623
+ /**
4624
+ * An element that scrolls the select popup up when hovered. Does not render when using touch input.
4625
+ * Renders a `<div>` element.
4626
+ *
4627
+ * Documentation: [Base UI Select](https://base-ui.com/react/components/select)
4628
+ */
4629
+ const SelectScrollUpArrow = /*#__PURE__*/React__namespace.forwardRef(function SelectScrollUpArrow(props, forwardedRef) {
4630
+ return /*#__PURE__*/jsxRuntime.jsx(SelectScrollArrow, {
4631
+ ...props,
4632
+ ref: forwardedRef,
4633
+ direction: "up"
4634
+ });
4635
+ });
4636
+ if (process.env.NODE_ENV !== "production") SelectScrollUpArrow.displayName = "SelectScrollUpArrow";
4637
+
4638
+ var index_parts = /*#__PURE__*/Object.freeze({
4639
+ __proto__: null,
4640
+ Arrow: SelectArrow,
4641
+ Backdrop: SelectBackdrop,
4642
+ Group: SelectGroupLabel.SelectGroup,
4643
+ GroupLabel: SelectGroupLabel.SelectGroupLabel,
4644
+ Icon: SelectIcon,
4645
+ Item: SelectGroupLabel.SelectItem,
4646
+ ItemIndicator: SelectGroupLabel.SelectItemIndicator,
4647
+ ItemText: SelectGroupLabel.SelectItemText,
4648
+ Label: SelectLabel,
4649
+ List: SelectGroupLabel.SelectList,
4650
+ Popup: SelectGroupLabel.SelectPopup,
4651
+ Portal: SelectGroupLabel.SelectPortal,
4652
+ Positioner: SelectGroupLabel.SelectPositioner,
4653
+ Root: SelectGroupLabel.SelectRoot,
4654
+ ScrollDownArrow: SelectScrollDownArrow,
4655
+ ScrollUpArrow: SelectScrollUpArrow,
4656
+ Separator: Separator.Separator,
4657
+ Trigger: SelectGroupLabel.SelectTrigger,
4658
+ Value: SelectGroupLabel.SelectValue
4659
+ });
4660
+
4488
4661
  /**
4489
4662
  * Renders a Base UI element.
4490
4663
  *
@@ -4495,10 +4668,12 @@ function useRender(params) {
4495
4668
  }
4496
4669
 
4497
4670
  exports.Separator = Separator.Separator;
4498
- exports.Autocomplete = index_parts$5;
4499
- exports.Combobox = index_parts$1;
4500
- exports.Drawer = index_parts$4;
4501
- exports.Menu = index_parts$3;
4502
- exports.NumberField = index_parts;
4503
- exports.ScrollArea = index_parts$2;
4671
+ exports.Autocomplete = index_parts$7;
4672
+ exports.Combobox = index_parts$2;
4673
+ exports.Dialog = index_parts$6;
4674
+ exports.Drawer = index_parts$5;
4675
+ exports.Menu = index_parts$4;
4676
+ exports.NumberField = index_parts$1;
4677
+ exports.ScrollArea = index_parts$3;
4678
+ exports.Select = index_parts;
4504
4679
  exports.useRender = useRender;