@jobber/components 8.20.1 → 8.21.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 (84) hide show
  1. package/LegacySelect.d.ts +1 -0
  2. package/{Select.js → LegacySelect.js} +3 -3
  3. package/dist/BottomSheet-cjs.js +9 -58
  4. package/dist/BottomSheet-es.js +2 -47
  5. package/dist/Card/index.cjs +4 -0
  6. package/dist/Card/index.mjs +4 -0
  7. package/dist/ComboboxChipRemove-cjs.js +3418 -0
  8. package/dist/ComboboxChipRemove-es.js +3366 -0
  9. package/dist/ComboboxPrimitive-cjs.js +170 -0
  10. package/dist/ComboboxPrimitive-es.js +168 -0
  11. package/dist/DataDump/index.cjs +4 -0
  12. package/dist/DataDump/index.mjs +4 -0
  13. package/dist/DataTable/index.cjs +1 -1
  14. package/dist/DataTable/index.mjs +1 -1
  15. package/dist/DataTable-cjs.js +3 -3
  16. package/dist/DataTable-es.js +2 -2
  17. package/dist/InputNumberExperimental-cjs.js +45 -44
  18. package/dist/InputNumberExperimental-es.js +3 -2
  19. package/dist/InternalBackdrop-cjs.js +4278 -0
  20. package/dist/InternalBackdrop-es.js +4204 -0
  21. package/dist/LegacySelect/LegacySelect.d.ts +7 -0
  22. package/dist/{Select/Select.types.d.ts → LegacySelect/LegacySelect.types.d.ts} +1 -1
  23. package/dist/{Select → LegacySelect}/index.cjs +3 -3
  24. package/dist/LegacySelect/index.d.ts +3 -0
  25. package/dist/{Select → LegacySelect}/index.mjs +1 -1
  26. package/dist/{Select-cjs.js → LegacySelect-cjs.js} +5 -5
  27. package/dist/{Select-es.js → LegacySelect-es.js} +5 -5
  28. package/dist/Menu/index.cjs +4 -0
  29. package/dist/Menu/index.mjs +4 -0
  30. package/dist/Menu-cjs.js +9 -8
  31. package/dist/Menu-es.js +2 -1
  32. package/dist/MenuSubmenuTrigger-cjs.js +208 -1969
  33. package/dist/MenuSubmenuTrigger-es.js +7 -1759
  34. package/dist/NumberFieldInput-cjs.js +56 -439
  35. package/dist/NumberFieldInput-es.js +6 -376
  36. package/dist/Page/index.cjs +4 -0
  37. package/dist/Page/index.mjs +4 -0
  38. package/dist/ScrollAreaViewport-cjs.js +108 -4356
  39. package/dist/ScrollAreaViewport-es.js +6 -4201
  40. package/dist/buttonRenderAdapter-cjs.js +56 -0
  41. package/dist/buttonRenderAdapter-es.js +51 -0
  42. package/dist/clamp-cjs.js +0 -1194
  43. package/dist/clamp-es.js +1 -1091
  44. package/dist/docs/Autocomplete/Autocomplete.md +1 -1
  45. package/dist/docs/Chip/Chip.md +2 -2
  46. package/dist/docs/{Select/Select.md → LegacySelect/LegacySelect.md} +67 -62
  47. package/dist/docs/Menu/Menu.md +1 -1
  48. package/dist/docs/MultiSelect/MultiSelect.md +1 -1
  49. package/dist/docs/Tabs/Tabs.md +2 -1
  50. package/dist/docs/empty-states/empty-states.md +29 -0
  51. package/dist/docs/index.md +1 -1
  52. package/dist/index.cjs +7 -3
  53. package/dist/index.d.mts +1 -1
  54. package/dist/index.d.ts +1 -1
  55. package/dist/index.mjs +5 -1
  56. package/dist/primitives/BottomSheet/index.cjs +5 -2
  57. package/dist/primitives/BottomSheet/index.mjs +5 -2
  58. package/dist/primitives/ComboboxPrimitive/ComboboxPrimitive.d.ts +32 -0
  59. package/dist/primitives/ComboboxPrimitive/ComboboxPrimitive.types.d.ts +30 -0
  60. package/dist/primitives/ComboboxPrimitive/index.cjs +28 -0
  61. package/dist/primitives/ComboboxPrimitive/index.d.ts +2 -0
  62. package/dist/primitives/ComboboxPrimitive/index.mjs +22 -0
  63. package/dist/primitives/InputNumberExperimental/index.cjs +4 -2
  64. package/dist/primitives/InputNumberExperimental/index.mjs +4 -2
  65. package/dist/primitives/index.cjs +11 -2
  66. package/dist/primitives/index.d.ts +1 -0
  67. package/dist/primitives/index.mjs +10 -2
  68. package/dist/styles.css +793 -26
  69. package/dist/unstyledPrimitives/index.cjs +237 -3588
  70. package/dist/unstyledPrimitives/index.mjs +96 -3447
  71. package/dist/useButton-cjs.js +1196 -0
  72. package/dist/useButton-es.js +1091 -0
  73. package/dist/useCompositeListItem-cjs.js +1792 -0
  74. package/dist/useCompositeListItem-es.js +1762 -0
  75. package/dist/useLabel-cjs.js +411 -0
  76. package/dist/useLabel-es.js +378 -0
  77. package/dist/utils/meta/meta.json +3 -3
  78. package/package.json +7 -7
  79. package/Select.d.ts +0 -1
  80. package/dist/Select/Select.d.ts +0 -7
  81. package/dist/Select/index.d.ts +0 -3
  82. /package/dist/{Select → LegacySelect}/Option.d.ts +0 -0
  83. /package/dist/{Select → LegacySelect}/OptionGroup.d.ts +0 -0
  84. /package/dist/{Select → LegacySelect}/hooks/useSelectActions.d.ts +0 -0
@@ -7,9 +7,10 @@ var ActivityIndicator = require('./ActivityIndicator-cjs.js');
7
7
  var Button = require('./Button-cjs.js');
8
8
  var Icon = require('./Icon-cjs.js');
9
9
  var useRenderElement = require('./useRenderElement-cjs.js');
10
- var clamp = require('./clamp-cjs.js');
11
- var NumberFieldInput = require('./NumberFieldInput-cjs.js');
10
+ var useButton = require('./useButton-cjs.js');
11
+ var useLabel = require('./useLabel-cjs.js');
12
12
  var jsxRuntime = require('react/jsx-runtime');
13
+ var NumberFieldInput = require('./NumberFieldInput-cjs.js');
13
14
 
14
15
  function _interopNamespaceDefault(e) {
15
16
  var n = Object.create(null);
@@ -45,7 +46,7 @@ function useFieldsetRootContext(optional = false) {
45
46
  }
46
47
 
47
48
  const LabelableProvider = function LabelableProvider(props) {
48
- const defaultId = clamp.useBaseUiId();
49
+ const defaultId = useButton.useBaseUiId();
49
50
  const initialControlId = props.controlId === undefined ? defaultId : props.controlId;
50
51
  const [controlId, setControlIdState] = React__namespace.useState(initialControlId);
51
52
  const [labelId, setLabelId] = React__namespace.useState(props.labelId);
@@ -53,8 +54,8 @@ const LabelableProvider = function LabelableProvider(props) {
53
54
  const registrationsRef = useRenderElement.useRefWithInit(() => new Map());
54
55
  const {
55
56
  messageIds: parentMessageIds
56
- } = NumberFieldInput.useLabelableContext();
57
- const registerControlId = clamp.useStableCallback((source, nextId) => {
57
+ } = useLabel.useLabelableContext();
58
+ const registerControlId = useButton.useStableCallback((source, nextId) => {
58
59
  const registrations = registrationsRef.current;
59
60
  if (nextId === undefined) {
60
61
  registrations.delete(source);
@@ -95,14 +96,14 @@ const LabelableProvider = function LabelableProvider(props) {
95
96
  setMessageIds,
96
97
  getDescriptionProps
97
98
  }), [controlId, registerControlId, labelId, setLabelId, messageIds, setMessageIds, getDescriptionProps]);
98
- return /*#__PURE__*/jsxRuntime.jsx(NumberFieldInput.LabelableContext.Provider, {
99
+ return /*#__PURE__*/jsxRuntime.jsx(useLabel.LabelableContext.Provider, {
99
100
  value: contextValue,
100
101
  children: props.children
101
102
  });
102
103
  };
103
104
  if (process.env.NODE_ENV !== "production") LabelableProvider.displayName = "LabelableProvider";
104
105
 
105
- const validityKeys = Object.keys(NumberFieldInput.DEFAULT_VALIDITY_STATE);
106
+ const validityKeys = Object.keys(useLabel.DEFAULT_VALIDITY_STATE);
106
107
  function isOnlyValueMissing(state) {
107
108
  if (!state || state.valid || !state.valueMissing) {
108
109
  return false;
@@ -125,7 +126,7 @@ function useFieldValidation(params) {
125
126
  const {
126
127
  formRef,
127
128
  clearErrors
128
- } = NumberFieldInput.useFormContext();
129
+ } = useLabel.useFormContext();
129
130
  const {
130
131
  setValidityData,
131
132
  validate,
@@ -140,10 +141,10 @@ function useFieldValidation(params) {
140
141
  const {
141
142
  controlId,
142
143
  getDescriptionProps
143
- } = NumberFieldInput.useLabelableContext();
144
- const timeout = clamp.useTimeout();
144
+ } = useLabel.useLabelableContext();
145
+ const timeout = useButton.useTimeout();
145
146
  const inputRef = React__namespace.useRef(null);
146
- const commit = clamp.useStableCallback(async (value, revalidate = false) => {
147
+ const commit = useButton.useStableCallback(async (value, revalidate = false) => {
147
148
  const element = inputRef.current;
148
149
  if (!element) {
149
150
  return;
@@ -160,7 +161,7 @@ function useFieldValidation(params) {
160
161
  const nextValidityData = {
161
162
  value,
162
163
  state: {
163
- ...NumberFieldInput.DEFAULT_VALIDITY_STATE,
164
+ ...useLabel.DEFAULT_VALIDITY_STATE,
164
165
  valid: true
165
166
  },
166
167
  error: '',
@@ -173,7 +174,7 @@ function useFieldValidation(params) {
173
174
  if (currentFieldData) {
174
175
  formRef.current.fields.set(controlId, {
175
176
  ...currentFieldData,
176
- ...NumberFieldInput.getCombinedFieldValidityData(nextValidityData, false) // invalid = false
177
+ ...useLabel.getCombinedFieldValidityData(nextValidityData, false) // invalid = false
177
178
  });
178
179
  }
179
180
  }
@@ -285,7 +286,7 @@ function useFieldValidation(params) {
285
286
  formRef.current.fields.set(controlId, {
286
287
  ...currentFieldData,
287
288
  // Keep Form-level errors part of overall field validity for submit blocking/focus logic.
288
- ...NumberFieldInput.getCombinedFieldValidityData(nextValidityData, invalid)
289
+ ...useLabel.getCombinedFieldValidityData(nextValidityData, invalid)
289
290
  });
290
291
  }
291
292
  }
@@ -337,7 +338,7 @@ const FieldRootInner = /*#__PURE__*/React__namespace.forwardRef(function FieldRo
337
338
  errors,
338
339
  validationMode: formValidationMode,
339
340
  submitAttemptedRef
340
- } = NumberFieldInput.useFormContext();
341
+ } = useLabel.useFormContext();
341
342
  const {
342
343
  render,
343
344
  className,
@@ -355,7 +356,7 @@ const FieldRootInner = /*#__PURE__*/React__namespace.forwardRef(function FieldRo
355
356
  const {
356
357
  disabled: disabledFieldset
357
358
  } = useFieldsetRootContext();
358
- const validate = clamp.useStableCallback(validateProp || (() => null));
359
+ const validate = useButton.useStableCallback(validateProp || (() => null));
359
360
  const disabled = disabledFieldset || disabledProp;
360
361
  const [touchedState, setTouchedUnwrapped] = React__namespace.useState(false);
361
362
  const [dirtyState, setDirtyUnwrapped] = React__namespace.useState(false);
@@ -364,7 +365,7 @@ const FieldRootInner = /*#__PURE__*/React__namespace.forwardRef(function FieldRo
364
365
  const dirty = dirtyProp ?? dirtyState;
365
366
  const touched = touchedProp ?? touchedState;
366
367
  const markedDirtyRef = React__namespace.useRef(false);
367
- const setDirty = clamp.useStableCallback(value => {
368
+ const setDirty = useButton.useStableCallback(value => {
368
369
  if (dirtyProp !== undefined) {
369
370
  return;
370
371
  }
@@ -373,17 +374,17 @@ const FieldRootInner = /*#__PURE__*/React__namespace.forwardRef(function FieldRo
373
374
  }
374
375
  setDirtyUnwrapped(value);
375
376
  });
376
- const setTouched = clamp.useStableCallback(value => {
377
+ const setTouched = useButton.useStableCallback(value => {
377
378
  if (touchedProp !== undefined) {
378
379
  return;
379
380
  }
380
381
  setTouchedUnwrapped(value);
381
382
  });
382
- const shouldValidateOnChange = clamp.useStableCallback(() => validationMode === 'onChange' || validationMode === 'onSubmit' && submitAttemptedRef.current);
383
+ const shouldValidateOnChange = useButton.useStableCallback(() => validationMode === 'onChange' || validationMode === 'onSubmit' && submitAttemptedRef.current);
383
384
  const hasFormError = !!name && Object.hasOwn(errors, name) && errors[name] !== undefined;
384
385
  const invalid = invalidProp === true || hasFormError;
385
386
  const [validityData, setValidityData] = React__namespace.useState({
386
- state: NumberFieldInput.DEFAULT_VALIDITY_STATE,
387
+ state: useLabel.DEFAULT_VALIDITY_STATE,
387
388
  error: '',
388
389
  errors: [],
389
390
  value: null,
@@ -442,9 +443,9 @@ const FieldRootInner = /*#__PURE__*/React__namespace.forwardRef(function FieldRo
442
443
  ref: forwardedRef,
443
444
  state,
444
445
  props: elementProps,
445
- stateAttributesMapping: NumberFieldInput.fieldValidityMapping
446
+ stateAttributesMapping: useLabel.fieldValidityMapping
446
447
  });
447
- return /*#__PURE__*/jsxRuntime.jsx(NumberFieldInput.FieldRootContext.Provider, {
448
+ return /*#__PURE__*/jsxRuntime.jsx(useLabel.FieldRootContext.Provider, {
448
449
  value: contextValue,
449
450
  children: element
450
451
  });
@@ -481,12 +482,12 @@ const FieldLabel = /*#__PURE__*/React__namespace.forwardRef(function FieldLabel(
481
482
  nativeLabel = true,
482
483
  ...elementProps
483
484
  } = componentProps;
484
- const fieldRootContext = NumberFieldInput.useFieldRootContext(false);
485
+ const fieldRootContext = useLabel.useFieldRootContext(false);
485
486
  const {
486
487
  labelId
487
- } = NumberFieldInput.useLabelableContext();
488
+ } = useLabel.useLabelableContext();
488
489
  const labelRef = React__namespace.useRef(null);
489
- const labelProps = NumberFieldInput.useLabel({
490
+ const labelProps = useLabel.useLabel({
490
491
  id: labelId ?? idProp,
491
492
  native: nativeLabel
492
493
  });
@@ -499,14 +500,14 @@ const FieldLabel = /*#__PURE__*/React__namespace.forwardRef(function FieldLabel(
499
500
  const isLabelTag = labelRef.current.tagName === 'LABEL';
500
501
  if (nativeLabel) {
501
502
  if (!isLabelTag) {
502
- const ownerStackMessage = clamp.SafeReact.captureOwnerStack?.() || '';
503
+ const ownerStackMessage = useButton.SafeReact.captureOwnerStack?.() || '';
503
504
  const message = '<Field.Label> expected a <label> element because the `nativeLabel` prop is true. ' + 'Rendering a non-<label> disables native label association, so `htmlFor` will not ' + 'work. Use a real <label> in the `render` prop, or set `nativeLabel` to `false`.';
504
- clamp.error(`${message}${ownerStackMessage}`);
505
+ useButton.error(`${message}${ownerStackMessage}`);
505
506
  }
506
507
  } else if (isLabelTag) {
507
- const ownerStackMessage = clamp.SafeReact.captureOwnerStack?.() || '';
508
+ const ownerStackMessage = useButton.SafeReact.captureOwnerStack?.() || '';
508
509
  const message = '<Field.Label> expected a non-<label> element because the `nativeLabel` prop is false. ' + 'Rendering a <label> assumes native label behavior while Base UI treats it as ' + 'non-native, which can cause unexpected pointer behavior. Use a non-<label> in the ' + '`render` prop, or set `nativeLabel` to `true`.';
509
- clamp.error(`${message}${ownerStackMessage}`);
510
+ useButton.error(`${message}${ownerStackMessage}`);
510
511
  }
511
512
  }, [nativeLabel]);
512
513
  }
@@ -514,15 +515,15 @@ const FieldLabel = /*#__PURE__*/React__namespace.forwardRef(function FieldLabel(
514
515
  ref: [forwardedRef, labelRef],
515
516
  state: fieldRootContext.state,
516
517
  props: [labelProps, elementProps],
517
- stateAttributesMapping: NumberFieldInput.fieldValidityMapping
518
+ stateAttributesMapping: useLabel.fieldValidityMapping
518
519
  });
519
520
  return element;
520
521
  });
521
522
  if (process.env.NODE_ENV !== "production") FieldLabel.displayName = "FieldLabel";
522
523
 
523
524
  const stateAttributesMapping = {
524
- ...NumberFieldInput.fieldValidityMapping,
525
- ...clamp.transitionStatusMapping
525
+ ...useLabel.fieldValidityMapping,
526
+ ...useButton.transitionStatusMapping
526
527
  };
527
528
 
528
529
  /**
@@ -539,18 +540,18 @@ const FieldError = /*#__PURE__*/React__namespace.forwardRef(function FieldError(
539
540
  match,
540
541
  ...elementProps
541
542
  } = componentProps;
542
- const id = clamp.useBaseUiId(idProp);
543
+ const id = useButton.useBaseUiId(idProp);
543
544
  const {
544
545
  validityData,
545
546
  state: fieldState,
546
547
  name
547
- } = NumberFieldInput.useFieldRootContext(false);
548
+ } = useLabel.useFieldRootContext(false);
548
549
  const {
549
550
  setMessageIds
550
- } = NumberFieldInput.useLabelableContext();
551
+ } = useLabel.useLabelableContext();
551
552
  const {
552
553
  errors
553
- } = NumberFieldInput.useFormContext();
554
+ } = useLabel.useFormContext();
554
555
  const formError = name ? errors[name] : null;
555
556
  let rendered = false;
556
557
  if (formError || match === true) {
@@ -564,8 +565,8 @@ const FieldError = /*#__PURE__*/React__namespace.forwardRef(function FieldError(
564
565
  mounted,
565
566
  transitionStatus,
566
567
  setMounted
567
- } = clamp.useTransitionStatus(rendered);
568
- clamp.useIsoLayoutEffect(() => {
568
+ } = useButton.useTransitionStatus(rendered);
569
+ useButton.useIsoLayoutEffect(() => {
569
570
  if (!rendered || !id) {
570
571
  return undefined;
571
572
  }
@@ -592,7 +593,7 @@ const FieldError = /*#__PURE__*/React__namespace.forwardRef(function FieldError(
592
593
  setLastRenderedMessageKey(errorKey);
593
594
  setLastRenderedMessage(errorMessage);
594
595
  }
595
- clamp.useOpenChangeComplete({
596
+ useButton.useOpenChangeComplete({
596
597
  open: rendered,
597
598
  ref: errorRef,
598
599
  onComplete() {
@@ -635,12 +636,12 @@ const FieldDescription = /*#__PURE__*/React__namespace.forwardRef(function Field
635
636
  className,
636
637
  ...elementProps
637
638
  } = componentProps;
638
- const id = clamp.useBaseUiId(idProp);
639
- const fieldRootContext = NumberFieldInput.useFieldRootContext(false);
639
+ const id = useButton.useBaseUiId(idProp);
640
+ const fieldRootContext = useLabel.useFieldRootContext(false);
640
641
  const {
641
642
  setMessageIds
642
- } = NumberFieldInput.useLabelableContext();
643
- clamp.useIsoLayoutEffect(() => {
643
+ } = useLabel.useLabelableContext();
644
+ useButton.useIsoLayoutEffect(() => {
644
645
  if (!id) {
645
646
  return undefined;
646
647
  }
@@ -655,7 +656,7 @@ const FieldDescription = /*#__PURE__*/React__namespace.forwardRef(function Field
655
656
  props: [{
656
657
  id
657
658
  }, elementProps],
658
- stateAttributesMapping: NumberFieldInput.fieldValidityMapping
659
+ stateAttributesMapping: useLabel.fieldValidityMapping
659
660
  });
660
661
  return element;
661
662
  });
@@ -6,9 +6,10 @@ import { A as ActivityIndicator } from './ActivityIndicator-es.js';
6
6
  import { B as Button } from './Button-es.js';
7
7
  import { I as Icon } from './Icon-es.js';
8
8
  import { f as formatErrorMessage, a as useRefWithInit, m as mergeProps, E as EMPTY_OBJECT, u as useRenderElement } from './useRenderElement-es.js';
9
- import { u as useBaseUiId, a as useStableCallback, b as useTimeout, S as SafeReact, e as error, t as transitionStatusMapping, c as useTransitionStatus, d as useIsoLayoutEffect, f as useOpenChangeComplete } from './clamp-es.js';
10
- import { u as useLabelableContext, L as LabelableContext, a as useFormContext, D as DEFAULT_VALIDITY_STATE, g as getCombinedFieldValidityData, f as fieldValidityMapping, F as FieldRootContext, b as useFieldRootContext, c as useLabel, N as NumberFieldRoot, d as NumberFieldGroup, e as NumberFieldInput, h as NumberFieldIncrement, i as NumberFieldDecrement } from './NumberFieldInput-es.js';
9
+ import { u as useBaseUiId, a as useStableCallback, b as useTimeout, S as SafeReact, e as error, t as transitionStatusMapping, c as useTransitionStatus, d as useIsoLayoutEffect, f as useOpenChangeComplete } from './useButton-es.js';
10
+ import { u as useLabelableContext, L as LabelableContext, a as useFormContext, D as DEFAULT_VALIDITY_STATE, g as getCombinedFieldValidityData, f as fieldValidityMapping, F as FieldRootContext, b as useFieldRootContext, c as useLabel } from './useLabel-es.js';
11
11
  import { jsx } from 'react/jsx-runtime';
12
+ import { N as NumberFieldRoot, a as NumberFieldGroup, b as NumberFieldInput, c as NumberFieldIncrement, d as NumberFieldDecrement } from './NumberFieldInput-es.js';
12
13
 
13
14
  const FieldsetRootContext = /*#__PURE__*/React.createContext({
14
15
  legendId: undefined,