@jobber/components 8.22.0 → 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 (72) hide show
  1. package/dist/CSPContext-cjs.js +69 -0
  2. package/dist/CSPContext-es.js +46 -0
  3. package/dist/Card/index.cjs +2 -0
  4. package/dist/Card/index.mjs +2 -0
  5. package/dist/ComboboxChipRemove-cjs.js +54 -211
  6. package/dist/ComboboxChipRemove-es.js +8 -164
  7. package/dist/DataDump/index.cjs +2 -0
  8. package/dist/DataDump/index.mjs +2 -0
  9. package/dist/Dialog/index.cjs +1 -0
  10. package/dist/Dialog/index.mjs +1 -0
  11. package/dist/DrawerDescription-cjs.js +2 -1
  12. package/dist/DrawerDescription-es.js +3 -2
  13. package/dist/DrawerTitle-es.js +1 -1
  14. package/dist/InputNumberExperimental-cjs.js +24 -23
  15. package/dist/InputNumberExperimental-es.js +3 -2
  16. package/dist/InternalBackdrop-es.js +3 -3
  17. package/dist/Menu/index.cjs +2 -0
  18. package/dist/Menu/index.mjs +2 -0
  19. package/dist/Menu-cjs.js +1 -1
  20. package/dist/Menu-es.js +1 -1
  21. package/dist/MenuSubmenuTrigger-cjs.js +5 -13
  22. package/dist/MenuSubmenuTrigger-es.js +8 -16
  23. package/dist/NumberFieldInput-cjs.js +9 -9
  24. package/dist/NumberFieldInput-es.js +3 -3
  25. package/dist/Page/index.cjs +2 -0
  26. package/dist/Page/index.mjs +2 -0
  27. package/dist/ScrollAreaViewport-cjs.js +5 -47
  28. package/dist/ScrollAreaViewport-es.js +5 -46
  29. package/dist/SelectGroupLabel-cjs.js +1924 -0
  30. package/dist/SelectGroupLabel-es.js +1888 -0
  31. package/dist/SelectPrimitive-cjs.js +112 -0
  32. package/dist/SelectPrimitive-es.js +110 -0
  33. package/dist/ToolbarRootContext-cjs.js +35 -0
  34. package/dist/ToolbarRootContext-es.js +14 -0
  35. package/dist/docs/SelectPrimitive/SelectPrimitive.md +326 -0
  36. package/dist/docs/index.md +1 -0
  37. package/dist/floating-ui.react-dom-cjs.js +1 -0
  38. package/dist/floating-ui.react-dom-es.js +2 -2
  39. package/dist/floating-ui.utils.dom-es.js +1 -1
  40. package/dist/index.cjs +2 -0
  41. package/dist/index.mjs +2 -0
  42. package/dist/primitives/BottomSheet/index.cjs +1 -0
  43. package/dist/primitives/BottomSheet/index.mjs +1 -0
  44. package/dist/primitives/ComboboxPrimitive/index.cjs +3 -1
  45. package/dist/primitives/ComboboxPrimitive/index.mjs +3 -1
  46. package/dist/primitives/InputNumberExperimental/index.cjs +2 -1
  47. package/dist/primitives/InputNumberExperimental/index.mjs +2 -1
  48. package/dist/primitives/SelectPrimitive/SelectPrimitive.d.ts +63 -0
  49. package/dist/primitives/SelectPrimitive/index.cjs +29 -0
  50. package/dist/primitives/SelectPrimitive/index.d.ts +2 -0
  51. package/dist/primitives/SelectPrimitive/index.mjs +23 -0
  52. package/dist/primitives/SelectPrimitive/types.d.ts +16 -0
  53. package/dist/primitives/index.cjs +8 -1
  54. package/dist/primitives/index.d.ts +1 -0
  55. package/dist/primitives/index.mjs +7 -1
  56. package/dist/primitives/mergeClassName.d.ts +12 -0
  57. package/dist/resolveAriaLabelledBy-cjs.js +195 -0
  58. package/dist/resolveAriaLabelledBy-es.js +162 -0
  59. package/dist/styles.css +325 -0
  60. package/dist/unstyledPrimitives/index.cjs +416 -24
  61. package/dist/unstyledPrimitives/index.d.ts +1 -0
  62. package/dist/unstyledPrimitives/index.mjs +417 -26
  63. package/dist/useButton-cjs.js +2 -0
  64. package/dist/useButton-es.js +3 -2
  65. package/dist/useCompositeListItem-es.js +3 -3
  66. package/dist/useLabel-cjs.js +3 -329
  67. package/dist/useLabel-es.js +4 -299
  68. package/dist/useLabelableId-cjs.js +332 -0
  69. package/dist/useLabelableId-es.js +300 -0
  70. package/dist/useRenderElement-cjs.js +3 -0
  71. package/dist/useRenderElement-es.js +4 -1
  72. package/package.json +2 -2
@@ -3,6 +3,7 @@
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');
8
9
  var DrawerDescription = require('../DrawerDescription-cjs.js');
@@ -17,7 +18,11 @@ var MenuSubmenuTrigger = require('../MenuSubmenuTrigger-cjs.js');
17
18
  var useCompositeListItem = require('../useCompositeListItem-cjs.js');
18
19
  var index_esm = require('../index.esm-cjs.js');
19
20
  var NumberFieldInput = require('../NumberFieldInput-cjs.js');
20
- 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');
21
26
  require('../floating-ui.react-dom-cjs.js');
22
27
 
23
28
  function _interopNamespaceDefault(e) {
@@ -110,7 +115,7 @@ function AutocompleteRoot(props) {
110
115
  if (highlightedValue == null) {
111
116
  setInlineInputValue('');
112
117
  } else {
113
- setInlineInputValue(ComboboxChipRemove.stringifyAsLabel(highlightedValue, itemToStringValue));
118
+ setInlineInputValue(resolveAriaLabelledBy.stringifyAsLabel(highlightedValue, itemToStringValue));
114
119
  }
115
120
  } else {
116
121
  setInlineInputValue('');
@@ -149,7 +154,7 @@ function AutocompleteValue(props) {
149
154
  });
150
155
  }
151
156
 
152
- var index_parts$6 = /*#__PURE__*/Object.freeze({
157
+ var index_parts$7 = /*#__PURE__*/Object.freeze({
153
158
  __proto__: null,
154
159
  Arrow: ComboboxChipRemove.ComboboxArrow,
155
160
  Backdrop: ComboboxChipRemove.ComboboxBackdrop,
@@ -176,7 +181,7 @@ var index_parts$6 = /*#__PURE__*/Object.freeze({
176
181
  useFilteredItems: ComboboxChipRemove.useFilteredItems
177
182
  });
178
183
 
179
- var index_parts$5 = /*#__PURE__*/Object.freeze({
184
+ var index_parts$6 = /*#__PURE__*/Object.freeze({
180
185
  __proto__: null,
181
186
  Backdrop: DrawerDescription.DialogBackdrop,
182
187
  Close: DrawerTitle.DialogClose,
@@ -191,7 +196,7 @@ var index_parts$5 = /*#__PURE__*/Object.freeze({
191
196
  createHandle: DrawerDescription.createDialogHandle
192
197
  });
193
198
 
194
- const stateAttributesMapping$3 = {
199
+ const stateAttributesMapping$5 = {
195
200
  active(value) {
196
201
  if (value) {
197
202
  return {
@@ -261,12 +266,12 @@ const DrawerIndent = /*#__PURE__*/React__namespace.forwardRef(function DrawerInd
261
266
  [ScrollAreaViewport.DrawerBackdropCssVars.swipeProgress]: '0'
262
267
  }
263
268
  }, elementProps],
264
- stateAttributesMapping: stateAttributesMapping$3
269
+ stateAttributesMapping: stateAttributesMapping$5
265
270
  });
266
271
  });
267
272
  if (process.env.NODE_ENV !== "production") DrawerIndent.displayName = "DrawerIndent";
268
273
 
269
- const stateAttributesMapping$2 = {
274
+ const stateAttributesMapping$4 = {
270
275
  active(value) {
271
276
  if (value) {
272
277
  return {
@@ -300,7 +305,7 @@ const DrawerIndentBackground = /*#__PURE__*/React__namespace.forwardRef(function
300
305
  ref: forwardedRef,
301
306
  state,
302
307
  props: elementProps,
303
- stateAttributesMapping: stateAttributesMapping$2
308
+ stateAttributesMapping: stateAttributesMapping$4
304
309
  });
305
310
  });
306
311
  if (process.env.NODE_ENV !== "production") DrawerIndentBackground.displayName = "DrawerIndentBackground";
@@ -1400,7 +1405,7 @@ const SWIPE_AREA_SWIPING_HOOK = {
1400
1405
  const SWIPE_AREA_DISABLED_HOOK = {
1401
1406
  [DrawerSwipeAreaDataAttributes.disabled]: ''
1402
1407
  };
1403
- const stateAttributesMapping$1 = {
1408
+ const stateAttributesMapping$3 = {
1404
1409
  open(value) {
1405
1410
  return value ? SWIPE_AREA_OPEN_HOOK : SWIPE_AREA_CLOSED_HOOK;
1406
1411
  },
@@ -1705,7 +1710,7 @@ const DrawerSwipeArea = /*#__PURE__*/React__namespace.forwardRef(function Drawer
1705
1710
  return useRenderElement.useRenderElement('div', componentProps, {
1706
1711
  state,
1707
1712
  ref: [forwardedRef, swipeAreaRef, registerTrigger],
1708
- stateAttributesMapping: stateAttributesMapping$1,
1713
+ stateAttributesMapping: stateAttributesMapping$3,
1709
1714
  props: [{
1710
1715
  role: 'presentation',
1711
1716
  'aria-hidden': true,
@@ -2709,7 +2714,7 @@ function shouldDismissFromStartEdge(direction, axis) {
2709
2714
  return null;
2710
2715
  }
2711
2716
 
2712
- var index_parts$4 = /*#__PURE__*/Object.freeze({
2717
+ var index_parts$5 = /*#__PURE__*/Object.freeze({
2713
2718
  __proto__: null,
2714
2719
  Backdrop: ScrollAreaViewport.DrawerBackdrop,
2715
2720
  Close: DrawerTitle.DrawerClose,
@@ -3376,7 +3381,7 @@ let MenuViewportCssVars = /*#__PURE__*/function (MenuViewportCssVars) {
3376
3381
  return MenuViewportCssVars;
3377
3382
  }({});
3378
3383
 
3379
- const stateAttributesMapping = {
3384
+ const stateAttributesMapping$2 = {
3380
3385
  activationDirection: value => value ? {
3381
3386
  'data-activation-direction': value
3382
3387
  } : null
@@ -3424,7 +3429,7 @@ const MenuViewport = /*#__PURE__*/React__namespace.forwardRef(function MenuViewp
3424
3429
  props: [elementProps, {
3425
3430
  children: childrenToRender
3426
3431
  }],
3427
- stateAttributesMapping
3432
+ stateAttributesMapping: stateAttributesMapping$2
3428
3433
  });
3429
3434
  });
3430
3435
  if (process.env.NODE_ENV !== "production") MenuViewport.displayName = "MenuViewport";
@@ -3475,7 +3480,7 @@ function createMenuHandle() {
3475
3480
  return new MenuHandle();
3476
3481
  }
3477
3482
 
3478
- var index_parts$3 = /*#__PURE__*/Object.freeze({
3483
+ var index_parts$4 = /*#__PURE__*/Object.freeze({
3479
3484
  __proto__: null,
3480
3485
  Arrow: MenuArrow,
3481
3486
  Backdrop: MenuSubmenuTrigger.MenuBackdrop,
@@ -3859,7 +3864,7 @@ const ScrollAreaCorner = /*#__PURE__*/React__namespace.forwardRef(function Scrol
3859
3864
  });
3860
3865
  if (process.env.NODE_ENV !== "production") ScrollAreaCorner.displayName = "ScrollAreaCorner";
3861
3866
 
3862
- var index_parts$2 = /*#__PURE__*/Object.freeze({
3867
+ var index_parts$3 = /*#__PURE__*/Object.freeze({
3863
3868
  __proto__: null,
3864
3869
  Content: ScrollAreaContent,
3865
3870
  Corner: ScrollAreaCorner,
@@ -3869,7 +3874,7 @@ var index_parts$2 = /*#__PURE__*/Object.freeze({
3869
3874
  Viewport: ScrollAreaViewport.ScrollAreaViewport
3870
3875
  });
3871
3876
 
3872
- var index_parts$1 = /*#__PURE__*/Object.freeze({
3877
+ var index_parts$2 = /*#__PURE__*/Object.freeze({
3873
3878
  __proto__: null,
3874
3879
  Arrow: ComboboxChipRemove.ComboboxArrow,
3875
3880
  Backdrop: ComboboxChipRemove.ComboboxBackdrop,
@@ -4256,7 +4261,7 @@ const NumberFieldScrubAreaCursor = /*#__PURE__*/React__namespace.forwardRef(func
4256
4261
  });
4257
4262
  if (process.env.NODE_ENV !== "production") NumberFieldScrubAreaCursor.displayName = "NumberFieldScrubAreaCursor";
4258
4263
 
4259
- var index_parts = /*#__PURE__*/Object.freeze({
4264
+ var index_parts$1 = /*#__PURE__*/Object.freeze({
4260
4265
  __proto__: null,
4261
4266
  Decrement: NumberFieldInput.NumberFieldDecrement,
4262
4267
  Group: NumberFieldInput.NumberFieldGroup,
@@ -4267,6 +4272,392 @@ var index_parts = /*#__PURE__*/Object.freeze({
4267
4272
  ScrubAreaCursor: NumberFieldScrubAreaCursor
4268
4273
  });
4269
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
+
4270
4661
  /**
4271
4662
  * Renders a Base UI element.
4272
4663
  *
@@ -4277,11 +4668,12 @@ function useRender(params) {
4277
4668
  }
4278
4669
 
4279
4670
  exports.Separator = Separator.Separator;
4280
- exports.Autocomplete = index_parts$6;
4281
- exports.Combobox = index_parts$1;
4282
- exports.Dialog = index_parts$5;
4283
- exports.Drawer = index_parts$4;
4284
- exports.Menu = index_parts$3;
4285
- exports.NumberField = index_parts;
4286
- 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;
4287
4679
  exports.useRender = useRender;
@@ -17,5 +17,6 @@ export { Menu } from "@base-ui/react/menu";
17
17
  export { ScrollArea } from "@base-ui/react/scroll-area";
18
18
  export { Combobox } from "@base-ui/react";
19
19
  export { NumberField } from "@base-ui/react/number-field";
20
+ export { Select } from "@base-ui/react/select";
20
21
  export { Separator } from "@base-ui/react/separator";
21
22
  export { useRender } from "@base-ui/react/use-render";