@jobber/components 8.15.0 → 8.17.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 (34) hide show
  1. package/dist/Card/index.cjs +1 -1
  2. package/dist/Card/index.mjs +1 -1
  3. package/dist/DataDump/index.cjs +1 -1
  4. package/dist/DataDump/index.mjs +1 -1
  5. package/dist/InputNumberExperimental-cjs.js +27 -23
  6. package/dist/InputNumberExperimental-es.js +12 -8
  7. package/dist/Menu/index.cjs +1 -1
  8. package/dist/Menu/index.mjs +1 -1
  9. package/dist/MenuSubmenuTrigger-cjs.js +1060 -1060
  10. package/dist/MenuSubmenuTrigger-es.js +928 -928
  11. package/dist/NumberFieldInput-cjs.js +53 -53
  12. package/dist/NumberFieldInput-es.js +1 -1
  13. package/dist/Page/index.cjs +1 -1
  14. package/dist/Page/index.mjs +1 -1
  15. package/dist/ScrollAreaViewport-cjs.js +4436 -4436
  16. package/dist/ScrollAreaViewport-es.js +4372 -4372
  17. package/dist/{useValueChanged-cjs.js → clamp-cjs.js} +594 -592
  18. package/dist/{useValueChanged-es.js → clamp-es.js} +595 -594
  19. package/dist/index.cjs +1 -1
  20. package/dist/index.mjs +1 -1
  21. package/dist/primitives/BottomSheet/index.cjs +2 -2
  22. package/dist/primitives/BottomSheet/index.mjs +2 -2
  23. package/dist/primitives/InputNumberExperimental/index.cjs +2 -2
  24. package/dist/primitives/InputNumberExperimental/index.mjs +2 -2
  25. package/dist/primitives/InputNumberExperimental/types.d.ts +5 -0
  26. package/dist/primitives/index.cjs +2 -2
  27. package/dist/primitives/index.mjs +2 -2
  28. package/dist/styles.css +1 -2
  29. package/dist/unstyledPrimitives/index.cjs +6271 -6134
  30. package/dist/unstyledPrimitives/index.d.ts +1 -0
  31. package/dist/unstyledPrimitives/index.mjs +6318 -6182
  32. package/dist/useRenderElement-cjs.js +30 -30
  33. package/dist/useRenderElement-es.js +30 -30
  34. package/package.json +2 -2
@@ -24,7 +24,7 @@ require('../maxHeight-cjs.js');
24
24
  require('../useRenderElement-cjs.js');
25
25
  require('../BottomSheet-cjs.js');
26
26
  require('../ScrollAreaViewport-cjs.js');
27
- require('../useValueChanged-cjs.js');
27
+ require('../clamp-cjs.js');
28
28
  require('../OverlaySeparator-cjs.js');
29
29
  require('../Separator-cjs.js');
30
30
  require('../MenuSubmenuTrigger-cjs.js');
@@ -22,7 +22,7 @@ import '../maxHeight-es.js';
22
22
  import '../useRenderElement-es.js';
23
23
  import '../BottomSheet-es.js';
24
24
  import '../ScrollAreaViewport-es.js';
25
- import '../useValueChanged-es.js';
25
+ import '../clamp-es.js';
26
26
  import '../OverlaySeparator-es.js';
27
27
  import '../Separator-es.js';
28
28
  import '../MenuSubmenuTrigger-es.js';
@@ -25,7 +25,7 @@ require('../maxHeight-cjs.js');
25
25
  require('../useRenderElement-cjs.js');
26
26
  require('../BottomSheet-cjs.js');
27
27
  require('../ScrollAreaViewport-cjs.js');
28
- require('../useValueChanged-cjs.js');
28
+ require('../clamp-cjs.js');
29
29
  require('../OverlaySeparator-cjs.js');
30
30
  require('../Separator-cjs.js');
31
31
  require('../MenuSubmenuTrigger-cjs.js');
@@ -23,7 +23,7 @@ import '../maxHeight-es.js';
23
23
  import '../useRenderElement-es.js';
24
24
  import '../BottomSheet-es.js';
25
25
  import '../ScrollAreaViewport-es.js';
26
- import '../useValueChanged-es.js';
26
+ import '../clamp-es.js';
27
27
  import '../OverlaySeparator-es.js';
28
28
  import '../Separator-es.js';
29
29
  import '../MenuSubmenuTrigger-es.js';
@@ -5,7 +5,7 @@ var classnames = require('classnames');
5
5
  var ActivityIndicator = require('./ActivityIndicator-cjs.js');
6
6
  var Button = require('./Button-cjs.js');
7
7
  var Icon = require('./Icon-cjs.js');
8
- var useValueChanged = require('./useValueChanged-cjs.js');
8
+ var clamp = require('./clamp-cjs.js');
9
9
  var NumberFieldInput = require('./NumberFieldInput-cjs.js');
10
10
  var useRenderElement = require('./useRenderElement-cjs.js');
11
11
  var jsxRuntime = require('react/jsx-runtime');
@@ -44,7 +44,7 @@ function useFieldsetRootContext(optional = false) {
44
44
  }
45
45
 
46
46
  const LabelableProvider = function LabelableProvider(props) {
47
- const defaultId = useValueChanged.useBaseUiId();
47
+ const defaultId = clamp.useBaseUiId();
48
48
  const initialControlId = props.controlId === undefined ? defaultId : props.controlId;
49
49
  const [controlId, setControlIdState] = React__namespace.useState(initialControlId);
50
50
  const [labelId, setLabelId] = React__namespace.useState(props.labelId);
@@ -53,7 +53,7 @@ const LabelableProvider = function LabelableProvider(props) {
53
53
  const {
54
54
  messageIds: parentMessageIds
55
55
  } = NumberFieldInput.useLabelableContext();
56
- const registerControlId = useValueChanged.useStableCallback((source, nextId) => {
56
+ const registerControlId = clamp.useStableCallback((source, nextId) => {
57
57
  const registrations = registrationsRef.current;
58
58
  if (nextId === undefined) {
59
59
  registrations.delete(source);
@@ -140,9 +140,9 @@ function useFieldValidation(params) {
140
140
  controlId,
141
141
  getDescriptionProps
142
142
  } = NumberFieldInput.useLabelableContext();
143
- const timeout = useValueChanged.useTimeout();
143
+ const timeout = clamp.useTimeout();
144
144
  const inputRef = React__namespace.useRef(null);
145
- const commit = useValueChanged.useStableCallback(async (value, revalidate = false) => {
145
+ const commit = clamp.useStableCallback(async (value, revalidate = false) => {
146
146
  const element = inputRef.current;
147
147
  if (!element) {
148
148
  return;
@@ -354,7 +354,7 @@ const FieldRootInner = /*#__PURE__*/React__namespace.forwardRef(function FieldRo
354
354
  const {
355
355
  disabled: disabledFieldset
356
356
  } = useFieldsetRootContext();
357
- const validate = useValueChanged.useStableCallback(validateProp || (() => null));
357
+ const validate = clamp.useStableCallback(validateProp || (() => null));
358
358
  const disabled = disabledFieldset || disabledProp;
359
359
  const [touchedState, setTouchedUnwrapped] = React__namespace.useState(false);
360
360
  const [dirtyState, setDirtyUnwrapped] = React__namespace.useState(false);
@@ -363,7 +363,7 @@ const FieldRootInner = /*#__PURE__*/React__namespace.forwardRef(function FieldRo
363
363
  const dirty = dirtyProp ?? dirtyState;
364
364
  const touched = touchedProp ?? touchedState;
365
365
  const markedDirtyRef = React__namespace.useRef(false);
366
- const setDirty = useValueChanged.useStableCallback(value => {
366
+ const setDirty = clamp.useStableCallback(value => {
367
367
  if (dirtyProp !== undefined) {
368
368
  return;
369
369
  }
@@ -372,13 +372,13 @@ const FieldRootInner = /*#__PURE__*/React__namespace.forwardRef(function FieldRo
372
372
  }
373
373
  setDirtyUnwrapped(value);
374
374
  });
375
- const setTouched = useValueChanged.useStableCallback(value => {
375
+ const setTouched = clamp.useStableCallback(value => {
376
376
  if (touchedProp !== undefined) {
377
377
  return;
378
378
  }
379
379
  setTouchedUnwrapped(value);
380
380
  });
381
- const shouldValidateOnChange = useValueChanged.useStableCallback(() => validationMode === 'onChange' || validationMode === 'onSubmit' && submitAttemptedRef.current);
381
+ const shouldValidateOnChange = clamp.useStableCallback(() => validationMode === 'onChange' || validationMode === 'onSubmit' && submitAttemptedRef.current);
382
382
  const hasFormError = !!name && Object.hasOwn(errors, name) && errors[name] !== undefined;
383
383
  const invalid = invalidProp === true || hasFormError;
384
384
  const [validityData, setValidityData] = React__namespace.useState({
@@ -468,7 +468,7 @@ if (process.env.NODE_ENV !== "production") FieldRoot.displayName = "FieldRoot";
468
468
 
469
469
  const stateAttributesMapping = {
470
470
  ...NumberFieldInput.fieldValidityMapping,
471
- ...useValueChanged.transitionStatusMapping
471
+ ...clamp.transitionStatusMapping
472
472
  };
473
473
 
474
474
  /**
@@ -485,7 +485,7 @@ const FieldError = /*#__PURE__*/React__namespace.forwardRef(function FieldError(
485
485
  match,
486
486
  ...elementProps
487
487
  } = componentProps;
488
- const id = useValueChanged.useBaseUiId(idProp);
488
+ const id = clamp.useBaseUiId(idProp);
489
489
  const {
490
490
  validityData,
491
491
  state: fieldState,
@@ -510,8 +510,8 @@ const FieldError = /*#__PURE__*/React__namespace.forwardRef(function FieldError(
510
510
  mounted,
511
511
  transitionStatus,
512
512
  setMounted
513
- } = useValueChanged.useTransitionStatus(rendered);
514
- useValueChanged.useIsoLayoutEffect(() => {
513
+ } = clamp.useTransitionStatus(rendered);
514
+ clamp.useIsoLayoutEffect(() => {
515
515
  if (!rendered || !id) {
516
516
  return undefined;
517
517
  }
@@ -538,7 +538,7 @@ const FieldError = /*#__PURE__*/React__namespace.forwardRef(function FieldError(
538
538
  setLastRenderedMessageKey(errorKey);
539
539
  setLastRenderedMessage(errorMessage);
540
540
  }
541
- useValueChanged.useOpenChangeComplete({
541
+ clamp.useOpenChangeComplete({
542
542
  open: rendered,
543
543
  ref: errorRef,
544
544
  onComplete() {
@@ -581,12 +581,12 @@ const FieldDescription = /*#__PURE__*/React__namespace.forwardRef(function Field
581
581
  className,
582
582
  ...elementProps
583
583
  } = componentProps;
584
- const id = useValueChanged.useBaseUiId(idProp);
584
+ const id = clamp.useBaseUiId(idProp);
585
585
  const fieldRootContext = NumberFieldInput.useFieldRootContext(false);
586
586
  const {
587
587
  setMessageIds
588
588
  } = NumberFieldInput.useLabelableContext();
589
- useValueChanged.useIsoLayoutEffect(() => {
589
+ clamp.useIsoLayoutEffect(() => {
590
590
  if (!id) {
591
591
  return undefined;
592
592
  }
@@ -611,12 +611,14 @@ var styles = {"container":"_6HZLFIOZh4s-","inline":"_-6ndFYNKKaM-","wrapper":"c2
611
611
 
612
612
  /**
613
613
  * Default formatting used only when the consumer does not pass `format`.
614
- * Preserves user-typed decimals on blur: without `maximumFractionDigits: 20`,
615
- * `Intl.NumberFormat` rounds to 3 digits and silently truncates input.
614
+ * Base UI rounds committed values to `maximumFractionDigits`, so this cap also
615
+ * scrubs IEEE-754 step drift (keeps `3.14 + 1` from committing
616
+ * `4.140000000000001`). 12 sits below that noise floor while keeping more
617
+ * precision than a numeric field needs.
616
618
  */
617
619
  const DEFAULT_FORMAT = {
618
620
  useGrouping: false,
619
- maximumFractionDigits: 20,
621
+ maximumFractionDigits: 12,
620
622
  };
621
623
  const InputNumberExperimentalContext = React.createContext(null);
622
624
  function useInputNumberExperimentalContext(consumer) {
@@ -628,7 +630,7 @@ function useInputNumberExperimentalContext(consumer) {
628
630
  }
629
631
  // eslint-disable-next-line max-statements
630
632
  function InputNumberExperimentalInternal(props, ref) {
631
- const { align, autocomplete, children, description, disabled, error, format, id: idProp, inline, invalid, keyboard, loading, max, maxLength, min, name, onBlur, onChange, onEnter, onFocus, onKeyDown, onKeyUp, onValueChange, placeholder, prefix, readonly, showMiniLabel = true, size = "default", suffix, value, } = props;
633
+ const { align, autocomplete, children, description, disabled, error, format, id: idProp, inline, invalid, keyboard, loading, max, maxLength, min, name, onBlur, onChange, onEnter, onFocus, onKeyDown, onKeyUp, onValueChange, placeholder, prefix, readonly, showMiniLabel = true, size = "default", step = 1, suffix, value, } = props;
632
634
  const generatedId = React.useId();
633
635
  const id = idProp !== null && idProp !== void 0 ? idProp : generatedId;
634
636
  const innerInputRef = React.useRef(null);
@@ -705,7 +707,7 @@ function InputNumberExperimentalInternal(props, ref) {
705
707
  const fieldInvalid = invalid || Boolean(error);
706
708
  return (React.createElement(FieldRoot, { className: classnames(styles.container, inline && styles.inline), disabled: disabled, invalid: fieldInvalid, name: name },
707
709
  React.createElement(InputNumberExperimentalContext.Provider, { value: contextValue },
708
- React.createElement(NumberFieldInput.NumberFieldRoot, { allowOutOfRange: true, format: format !== null && format !== void 0 ? format : DEFAULT_FORMAT, id: id, max: max, min: min, onValueChange: handleValueChange, onValueCommitted: handleValueCommitted, readOnly: readonly, value: value !== null && value !== void 0 ? value : null },
710
+ React.createElement(NumberFieldInput.NumberFieldRoot, { allowOutOfRange: true, format: format !== null && format !== void 0 ? format : DEFAULT_FORMAT, id: id, max: max, min: min, onValueChange: handleValueChange, onValueCommitted: handleValueCommitted, readOnly: readonly, step: step, value: value !== null && value !== void 0 ? value : null },
709
711
  React.createElement(NumberFieldInput.NumberFieldGroup, { className: classnames(styles.wrapper, align && styles[align], disabled && styles.disabled, size !== "default" && styles[size]) }, isUsingCompoundPattern
710
712
  ? children
711
713
  : renderDefaultComposition({ prefix, suffix, size })))),
@@ -760,8 +762,10 @@ function InputNumberExperimentalStepperCompound({ incrementLabel, decrementLabel
760
762
  const resolvedDecrementLabel = decrementLabel !== null && decrementLabel !== void 0 ? decrementLabel : `Decrease ${labelTarget}`;
761
763
  const rootProps = useRenderElement.mergeProps({ className: styles.stepper }, { className, style });
762
764
  return (React.createElement("div", Object.assign({}, rootProps),
763
- React.createElement(NumberFieldInput.NumberFieldIncrement, { "aria-label": resolvedIncrementLabel, className: styles.stepperButton }, "\u25B2"),
764
- React.createElement(NumberFieldInput.NumberFieldDecrement, { "aria-label": resolvedDecrementLabel, className: styles.stepperButton }, "\u25BC")));
765
+ React.createElement(NumberFieldInput.NumberFieldIncrement, { "aria-label": resolvedIncrementLabel, className: styles.stepperButton },
766
+ React.createElement(Icon.Icon, { name: "arrowUp", size: "small", customColor: "currentColor" })),
767
+ React.createElement(NumberFieldInput.NumberFieldDecrement, { "aria-label": resolvedDecrementLabel, className: styles.stepperButton },
768
+ React.createElement(Icon.Icon, { name: "arrowDown", size: "small", customColor: "currentColor" }))));
765
769
  }
766
770
  function AffixIconSlot({ variation, icon, size, onClick, ariaLabel, }) {
767
771
  return (React.createElement("div", { className: classnames(styles.affixIcon, variation === "suffix" && styles.suffix) },
@@ -4,7 +4,7 @@ import classnames from 'classnames';
4
4
  import { A as ActivityIndicator } from './ActivityIndicator-es.js';
5
5
  import { B as Button } from './Button-es.js';
6
6
  import { I as Icon } from './Icon-es.js';
7
- import { u as useBaseUiId, a as useStableCallback, b as useTimeout, t as transitionStatusMapping, c as useTransitionStatus, d as useIsoLayoutEffect, e as useOpenChangeComplete } from './useValueChanged-es.js';
7
+ import { u as useBaseUiId, a as useStableCallback, b as useTimeout, t as transitionStatusMapping, c as useTransitionStatus, d as useIsoLayoutEffect, e as useOpenChangeComplete } from './clamp-es.js';
8
8
  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, N as NumberFieldRoot, c as NumberFieldGroup, d as NumberFieldInput, e as NumberFieldIncrement, h as NumberFieldDecrement } from './NumberFieldInput-es.js';
9
9
  import { f as formatErrorMessage, a as useRefWithInit, m as mergeProps, E as EMPTY_OBJECT, u as useRenderElement } from './useRenderElement-es.js';
10
10
  import { jsx } from 'react/jsx-runtime';
@@ -591,12 +591,14 @@ var styles = {"container":"_6HZLFIOZh4s-","inline":"_-6ndFYNKKaM-","wrapper":"c2
591
591
 
592
592
  /**
593
593
  * Default formatting used only when the consumer does not pass `format`.
594
- * Preserves user-typed decimals on blur: without `maximumFractionDigits: 20`,
595
- * `Intl.NumberFormat` rounds to 3 digits and silently truncates input.
594
+ * Base UI rounds committed values to `maximumFractionDigits`, so this cap also
595
+ * scrubs IEEE-754 step drift (keeps `3.14 + 1` from committing
596
+ * `4.140000000000001`). 12 sits below that noise floor while keeping more
597
+ * precision than a numeric field needs.
596
598
  */
597
599
  const DEFAULT_FORMAT = {
598
600
  useGrouping: false,
599
- maximumFractionDigits: 20,
601
+ maximumFractionDigits: 12,
600
602
  };
601
603
  const InputNumberExperimentalContext = createContext(null);
602
604
  function useInputNumberExperimentalContext(consumer) {
@@ -608,7 +610,7 @@ function useInputNumberExperimentalContext(consumer) {
608
610
  }
609
611
  // eslint-disable-next-line max-statements
610
612
  function InputNumberExperimentalInternal(props, ref) {
611
- const { align, autocomplete, children, description, disabled, error, format, id: idProp, inline, invalid, keyboard, loading, max, maxLength, min, name, onBlur, onChange, onEnter, onFocus, onKeyDown, onKeyUp, onValueChange, placeholder, prefix, readonly, showMiniLabel = true, size = "default", suffix, value, } = props;
613
+ const { align, autocomplete, children, description, disabled, error, format, id: idProp, inline, invalid, keyboard, loading, max, maxLength, min, name, onBlur, onChange, onEnter, onFocus, onKeyDown, onKeyUp, onValueChange, placeholder, prefix, readonly, showMiniLabel = true, size = "default", step = 1, suffix, value, } = props;
612
614
  const generatedId = useId();
613
615
  const id = idProp !== null && idProp !== void 0 ? idProp : generatedId;
614
616
  const innerInputRef = useRef(null);
@@ -685,7 +687,7 @@ function InputNumberExperimentalInternal(props, ref) {
685
687
  const fieldInvalid = invalid || Boolean(error);
686
688
  return (React__default.createElement(FieldRoot, { className: classnames(styles.container, inline && styles.inline), disabled: disabled, invalid: fieldInvalid, name: name },
687
689
  React__default.createElement(InputNumberExperimentalContext.Provider, { value: contextValue },
688
- React__default.createElement(NumberFieldRoot, { allowOutOfRange: true, format: format !== null && format !== void 0 ? format : DEFAULT_FORMAT, id: id, max: max, min: min, onValueChange: handleValueChange, onValueCommitted: handleValueCommitted, readOnly: readonly, value: value !== null && value !== void 0 ? value : null },
690
+ React__default.createElement(NumberFieldRoot, { allowOutOfRange: true, format: format !== null && format !== void 0 ? format : DEFAULT_FORMAT, id: id, max: max, min: min, onValueChange: handleValueChange, onValueCommitted: handleValueCommitted, readOnly: readonly, step: step, value: value !== null && value !== void 0 ? value : null },
689
691
  React__default.createElement(NumberFieldGroup, { className: classnames(styles.wrapper, align && styles[align], disabled && styles.disabled, size !== "default" && styles[size]) }, isUsingCompoundPattern
690
692
  ? children
691
693
  : renderDefaultComposition({ prefix, suffix, size })))),
@@ -740,8 +742,10 @@ function InputNumberExperimentalStepperCompound({ incrementLabel, decrementLabel
740
742
  const resolvedDecrementLabel = decrementLabel !== null && decrementLabel !== void 0 ? decrementLabel : `Decrease ${labelTarget}`;
741
743
  const rootProps = mergeProps({ className: styles.stepper }, { className, style });
742
744
  return (React__default.createElement("div", Object.assign({}, rootProps),
743
- React__default.createElement(NumberFieldIncrement, { "aria-label": resolvedIncrementLabel, className: styles.stepperButton }, "\u25B2"),
744
- React__default.createElement(NumberFieldDecrement, { "aria-label": resolvedDecrementLabel, className: styles.stepperButton }, "\u25BC")));
745
+ React__default.createElement(NumberFieldIncrement, { "aria-label": resolvedIncrementLabel, className: styles.stepperButton },
746
+ React__default.createElement(Icon, { name: "arrowUp", size: "small", customColor: "currentColor" })),
747
+ React__default.createElement(NumberFieldDecrement, { "aria-label": resolvedDecrementLabel, className: styles.stepperButton },
748
+ React__default.createElement(Icon, { name: "arrowDown", size: "small", customColor: "currentColor" }))));
745
749
  }
746
750
  function AffixIconSlot({ variation, icon, size, onClick, ariaLabel, }) {
747
751
  return (React__default.createElement("div", { className: classnames(styles.affixIcon, variation === "suffix" && styles.suffix) },
@@ -22,7 +22,7 @@ require('../maxHeight-cjs.js');
22
22
  require('../useRenderElement-cjs.js');
23
23
  require('../BottomSheet-cjs.js');
24
24
  require('../ScrollAreaViewport-cjs.js');
25
- require('../useValueChanged-cjs.js');
25
+ require('../clamp-cjs.js');
26
26
  require('../OverlaySeparator-cjs.js');
27
27
  require('../Separator-cjs.js');
28
28
  require('../MenuSubmenuTrigger-cjs.js');
@@ -20,7 +20,7 @@ import '../maxHeight-es.js';
20
20
  import '../useRenderElement-es.js';
21
21
  import '../BottomSheet-es.js';
22
22
  import '../ScrollAreaViewport-es.js';
23
- import '../useValueChanged-es.js';
23
+ import '../clamp-es.js';
24
24
  import '../OverlaySeparator-es.js';
25
25
  import '../Separator-es.js';
26
26
  import '../MenuSubmenuTrigger-es.js';