@jobber/components 8.23.0 → 8.23.1

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 (134) hide show
  1. package/dist/Autocomplete/index.cjs +1 -1
  2. package/dist/Autocomplete/index.mjs +1 -1
  3. package/dist/Card/index.cjs +4 -4
  4. package/dist/Card/index.mjs +4 -4
  5. package/dist/Chip/index.cjs +1 -1
  6. package/dist/Chip/index.mjs +1 -1
  7. package/dist/Chips/InternalChipDismissible/hooks/index.cjs +1 -1
  8. package/dist/Chips/InternalChipDismissible/hooks/index.mjs +1 -1
  9. package/dist/Chips/InternalChipDismissible/index.cjs +1 -1
  10. package/dist/Chips/InternalChipDismissible/index.mjs +1 -1
  11. package/dist/Chips/index.cjs +1 -1
  12. package/dist/Chips/index.mjs +1 -1
  13. package/dist/ComboboxChipRemove-cjs.js +668 -379
  14. package/dist/ComboboxChipRemove-es.js +508 -219
  15. package/dist/ConfirmationModal/index.cjs +1 -1
  16. package/dist/ConfirmationModal/index.mjs +1 -1
  17. package/dist/DataDump/index.cjs +4 -4
  18. package/dist/DataDump/index.mjs +4 -4
  19. package/dist/DataList/components/DataListActions/index.cjs +1 -1
  20. package/dist/DataList/components/DataListActions/index.mjs +1 -1
  21. package/dist/DataList/components/DataListBulkActions/index.cjs +1 -1
  22. package/dist/DataList/components/DataListBulkActions/index.mjs +1 -1
  23. package/dist/DataList/components/DataListFilters/components/DataListSort/index.cjs +1 -1
  24. package/dist/DataList/components/DataListFilters/components/DataListSort/index.mjs +1 -1
  25. package/dist/DataList/components/DataListFilters/index.cjs +1 -1
  26. package/dist/DataList/components/DataListFilters/index.mjs +1 -1
  27. package/dist/DataList/components/DataListHeader/index.cjs +1 -1
  28. package/dist/DataList/components/DataListHeader/index.mjs +1 -1
  29. package/dist/DataList/components/DataListItem/index.cjs +1 -1
  30. package/dist/DataList/components/DataListItem/index.mjs +1 -1
  31. package/dist/DataList/components/DataListItemActions/index.cjs +1 -1
  32. package/dist/DataList/components/DataListItemActions/index.mjs +1 -1
  33. package/dist/DataList/components/DataListItemActionsOverflow/index.cjs +1 -1
  34. package/dist/DataList/components/DataListItemActionsOverflow/index.mjs +1 -1
  35. package/dist/DataList/components/DataListItems/index.cjs +1 -1
  36. package/dist/DataList/components/DataListItems/index.mjs +1 -1
  37. package/dist/DataList/components/DataListLayout/index.cjs +1 -1
  38. package/dist/DataList/components/DataListLayout/index.mjs +1 -1
  39. package/dist/DataList/components/DataListLayoutActions/index.cjs +1 -1
  40. package/dist/DataList/components/DataListLayoutActions/index.mjs +1 -1
  41. package/dist/DataList/index.cjs +1 -1
  42. package/dist/DataList/index.mjs +1 -1
  43. package/dist/DatePicker/index.cjs +1 -1
  44. package/dist/DatePicker/index.mjs +1 -1
  45. package/dist/Dialog/index.cjs +3 -3
  46. package/dist/Dialog/index.mjs +3 -3
  47. package/dist/DrawerDescription-cjs.js +32 -33
  48. package/dist/DrawerDescription-es.js +19 -20
  49. package/dist/DrawerTitle-cjs.js +7 -5
  50. package/dist/DrawerTitle-es.js +7 -5
  51. package/dist/FilterPicker/components/FilterPickerActivator/index.cjs +1 -1
  52. package/dist/FilterPicker/components/FilterPickerActivator/index.mjs +1 -1
  53. package/dist/FilterPicker/components/FilterPickerContent/index.cjs +1 -1
  54. package/dist/FilterPicker/components/FilterPickerContent/index.mjs +1 -1
  55. package/dist/FilterPicker/components/FilterPickerTrigger/index.cjs +1 -1
  56. package/dist/FilterPicker/components/FilterPickerTrigger/index.mjs +1 -1
  57. package/dist/FilterPicker/index.cjs +1 -1
  58. package/dist/FilterPicker/index.mjs +1 -1
  59. package/dist/FormFieldWrapper-cjs.js +2 -2
  60. package/dist/FormFieldWrapper-es.js +2 -2
  61. package/dist/FormatFile/index.cjs +1 -1
  62. package/dist/FormatFile/index.mjs +1 -1
  63. package/dist/Gallery/index.cjs +1 -1
  64. package/dist/Gallery/index.mjs +1 -1
  65. package/dist/InputDate/index.cjs +1 -1
  66. package/dist/InputDate/index.mjs +1 -1
  67. package/dist/InputNumberExperimental-cjs.js +319 -102
  68. package/dist/InputNumberExperimental-es.js +321 -104
  69. package/dist/LightBox/index.cjs +1 -1
  70. package/dist/LightBox/index.mjs +1 -1
  71. package/dist/Menu/index.cjs +4 -4
  72. package/dist/Menu/index.mjs +4 -4
  73. package/dist/MenuSubmenuTrigger-cjs.js +545 -498
  74. package/dist/MenuSubmenuTrigger-es.js +490 -443
  75. package/dist/Modal/index.cjs +1 -1
  76. package/dist/Modal/index.mjs +1 -1
  77. package/dist/NumberFieldInput-cjs.js +609 -496
  78. package/dist/NumberFieldInput-es.js +612 -498
  79. package/dist/Page/index.cjs +4 -4
  80. package/dist/Page/index.mjs +4 -4
  81. package/dist/Popover/index.cjs +1 -1
  82. package/dist/Popover/index.mjs +1 -1
  83. package/dist/ScrollAreaViewport-cjs.js +326 -601
  84. package/dist/ScrollAreaViewport-es.js +278 -548
  85. package/dist/SelectGroupLabel-cjs.js +494 -528
  86. package/dist/SelectGroupLabel-es.js +411 -445
  87. package/dist/Separator-cjs.js +1 -0
  88. package/dist/Separator-es.js +1 -0
  89. package/dist/Tooltip/index.cjs +1 -1
  90. package/dist/Tooltip/index.mjs +1 -1
  91. package/dist/docs/InputTime/InputTime.md +8 -0
  92. package/dist/docs/SelectPrimitive/SelectPrimitive.md +38 -25
  93. package/dist/floating-ui.react-cjs.js +586 -10
  94. package/dist/floating-ui.react-dom-cjs.js +92 -92
  95. package/dist/floating-ui.react-dom-es.js +1 -1
  96. package/dist/floating-ui.react-es.js +580 -4
  97. package/dist/floating-ui.utils-cjs.js +159 -0
  98. package/dist/floating-ui.utils-es.js +136 -0
  99. package/dist/index.cjs +4 -4
  100. package/dist/index.mjs +4 -4
  101. package/dist/{ToolbarRootContext-cjs.js → isElementDisabled-cjs.js} +5 -0
  102. package/dist/{ToolbarRootContext-es.js → isElementDisabled-es.js} +5 -1
  103. package/dist/primitives/BottomSheet/index.cjs +3 -3
  104. package/dist/primitives/BottomSheet/index.mjs +3 -3
  105. package/dist/primitives/ComboboxPrimitive/index.cjs +2 -2
  106. package/dist/primitives/ComboboxPrimitive/index.mjs +2 -2
  107. package/dist/primitives/InputNumberExperimental/index.cjs +1 -1
  108. package/dist/primitives/InputNumberExperimental/index.mjs +1 -1
  109. package/dist/primitives/SelectPrimitive/index.cjs +5 -5
  110. package/dist/primitives/SelectPrimitive/index.mjs +5 -5
  111. package/dist/primitives/index.cjs +4 -4
  112. package/dist/primitives/index.mjs +4 -4
  113. package/dist/resolveAriaLabelledBy-cjs.js +5 -0
  114. package/dist/resolveAriaLabelledBy-es.js +5 -1
  115. package/dist/{CSPContext-cjs.js → scrollEdges-cjs.js} +30 -2
  116. package/dist/{CSPContext-es.js → scrollEdges-es.js} +28 -3
  117. package/dist/styles.css +9 -3
  118. package/dist/unstyledPrimitives/index.cjs +1217 -639
  119. package/dist/unstyledPrimitives/index.mjs +1163 -585
  120. package/dist/useButton-cjs.js +283 -317
  121. package/dist/useButton-es.js +277 -298
  122. package/dist/useCompositeListItem-cjs.js +328 -279
  123. package/dist/useCompositeListItem-es.js +293 -246
  124. package/dist/useLabel-cjs.js +11 -1
  125. package/dist/useLabel-es.js +11 -2
  126. package/dist/useLabelableId-cjs.js +37 -91
  127. package/dist/useLabelableId-es.js +37 -90
  128. package/dist/useRenderElement-cjs.js +81 -26
  129. package/dist/useRenderElement-es.js +81 -27
  130. package/dist/{InternalBackdrop-cjs.js → useScrollLock-cjs.js} +1286 -1220
  131. package/dist/{InternalBackdrop-es.js → useScrollLock-es.js} +1250 -1207
  132. package/package.json +3 -3
  133. package/dist/index.esm-cjs.js +0 -738
  134. package/dist/index.esm-es.js +0 -712
@@ -35,7 +35,7 @@ const EMPTY_PROPS = {};
35
35
  * Props can either be provided as objects or as functions that take the previous props as an argument.
36
36
  * The function will receive the merged props up to that point (going from left to right):
37
37
  * so in the case of `(obj1, obj2, fn, obj3)`, `fn` will receive the merged props of `obj1` and `obj2`.
38
- * The function is responsible for chaining event handlers if needed (i.e. we don't run the merge logic).
38
+ * The function is responsible for chaining event handlers if needed (that is, we don't run the merge logic).
39
39
  *
40
40
  * Event handlers returned by the functions are not automatically prevented when `preventBaseUIHandler` is called.
41
41
  * They must check `event.baseUIHandlerPrevented` themselves and bail out if it's true.
@@ -51,21 +51,23 @@ const EMPTY_PROPS = {};
51
51
  */
52
52
 
53
53
  function mergeProps(a, b, c, d, e) {
54
- // We need to mutably own `merged`
55
- let merged = {
56
- ...resolvePropsGetter(a, EMPTY_PROPS)
57
- };
54
+ if (!c && !d && !e && !a) {
55
+ return createInitialMergedProps(b);
56
+ }
57
+
58
+ // We need to mutably own `merged`.
59
+ let merged = createInitialMergedProps(a);
58
60
  if (b) {
59
- merged = mergeOne(merged, b);
61
+ merged = mergeInto(merged, b);
60
62
  }
61
63
  if (c) {
62
- merged = mergeOne(merged, c);
64
+ merged = mergeInto(merged, c);
63
65
  }
64
66
  if (d) {
65
- merged = mergeOne(merged, d);
67
+ merged = mergeInto(merged, d);
66
68
  }
67
69
  if (e) {
68
- merged = mergeOne(merged, e);
70
+ merged = mergeInto(merged, e);
69
71
  }
70
72
  return merged;
71
73
  }
@@ -89,24 +91,46 @@ function mergePropsN(props) {
89
91
  return EMPTY_PROPS;
90
92
  }
91
93
  if (props.length === 1) {
92
- return resolvePropsGetter(props[0], EMPTY_PROPS);
94
+ return createInitialMergedProps(props[0]);
93
95
  }
94
96
 
95
- // We need to mutably own `merged`
96
- let merged = {
97
- ...resolvePropsGetter(props[0], EMPTY_PROPS)
98
- };
97
+ // We need to mutably own `merged`.
98
+ let merged = createInitialMergedProps(props[0]);
99
99
  for (let i = 1; i < props.length; i += 1) {
100
- merged = mergeOne(merged, props[i]);
100
+ merged = mergeInto(merged, props[i]);
101
101
  }
102
102
  return merged;
103
103
  }
104
- function mergeOne(merged, inputProps) {
104
+ function createInitialMergedProps(inputProps) {
105
105
  if (isPropsGetter(inputProps)) {
106
- return inputProps(merged);
106
+ // Getter-returned handlers intentionally keep their existing semantics.
107
+ return {
108
+ ...resolvePropsGetter(inputProps, EMPTY_PROPS)
109
+ };
110
+ }
111
+ return copyInitialProps(inputProps);
112
+ }
113
+ function mergeInto(merged, inputProps) {
114
+ if (isPropsGetter(inputProps)) {
115
+ return resolvePropsGetter(inputProps, merged);
107
116
  }
108
117
  return mutablyMergeInto(merged, inputProps);
109
118
  }
119
+ function copyInitialProps(inputProps) {
120
+ const copiedProps = {
121
+ ...inputProps
122
+ };
123
+
124
+ // `copiedProps` is our fresh own-object copy, so iterating with `for...in` is safe here.
125
+ // eslint-disable-next-line guard-for-in
126
+ for (const propName in copiedProps) {
127
+ const propValue = copiedProps[propName];
128
+ if (isEventHandler(propName, propValue)) {
129
+ copiedProps[propName] = wrapEventHandler(propValue);
130
+ }
131
+ }
132
+ return copiedProps;
133
+ }
110
134
 
111
135
  /**
112
136
  * Merges two sets of props. In case of conflicts, the external props take precedence.
@@ -163,23 +187,36 @@ function mergeEventHandlers(ourHandler, theirHandler) {
163
187
  return ourHandler;
164
188
  }
165
189
  if (!ourHandler) {
166
- return theirHandler;
190
+ return wrapEventHandler(theirHandler);
167
191
  }
168
- return event => {
192
+ return (...args) => {
193
+ const event = args[0];
169
194
  if (isSyntheticEvent(event)) {
170
195
  const baseUIEvent = event;
171
196
  makeEventPreventable(baseUIEvent);
172
- const result = theirHandler(baseUIEvent);
197
+ const result = theirHandler(...args);
173
198
  if (!baseUIEvent.baseUIHandlerPrevented) {
174
- ourHandler?.(baseUIEvent);
199
+ ourHandler?.(...args);
175
200
  }
176
201
  return result;
177
202
  }
178
- const result = theirHandler(event);
179
- ourHandler?.(event);
203
+ const result = theirHandler(...args);
204
+ ourHandler?.(...args);
180
205
  return result;
181
206
  };
182
207
  }
208
+ function wrapEventHandler(handler) {
209
+ if (!handler) {
210
+ return handler;
211
+ }
212
+ return (...args) => {
213
+ const event = args[0];
214
+ if (isSyntheticEvent(event)) {
215
+ makeEventPreventable(event);
216
+ }
217
+ return handler(...args);
218
+ };
219
+ }
183
220
  function makeEventPreventable(event) {
184
221
  event.preventBaseUIHandler = () => {
185
222
  event.baseUIHandlerPrevented = true;
@@ -464,7 +501,12 @@ function useRenderElementProps(componentProps, params = {}) {
464
501
  const className = enabled ? resolveClassName(classNameProp, state) : undefined;
465
502
  const style = enabled ? resolveStyle(styleProp, state) : undefined;
466
503
  const stateProps = enabled ? getStateAttributesProps(state, stateAttributesMapping) : EMPTY_OBJECT;
467
- const outProps = enabled ? mergeObjects(stateProps, Array.isArray(props) ? mergePropsN(props) : props) ?? EMPTY_OBJECT : EMPTY_OBJECT;
504
+ const resolvedProps = enabled && props ? resolveRenderFunctionProps(props) : undefined;
505
+
506
+ // Ensure outProps is always a new mutable object when enabled, never EMPTY_OBJECT.
507
+ // This prevents potential TypeError when setting ref, className, or style properties,
508
+ // since EMPTY_OBJECT is frozen and mutations would fail in strict mode.
509
+ const outProps = enabled ? mergeObjects(stateProps, resolvedProps) ?? {} : EMPTY_OBJECT;
468
510
 
469
511
  // SAFETY: The `useMergedRefs` functions use a single hook to store the same value,
470
512
  // switching between them at runtime is safe. If this assertion fails, React will
@@ -492,12 +534,20 @@ function useRenderElementProps(componentProps, params = {}) {
492
534
  }
493
535
  return outProps;
494
536
  }
537
+ function resolveRenderFunctionProps(props) {
538
+ if (Array.isArray(props)) {
539
+ return mergePropsN(props);
540
+ }
541
+ return mergeProps(undefined, props);
542
+ }
495
543
 
496
544
  // The symbol React uses internally for lazy components
497
545
  // https://github.com/facebook/react/blob/a0566250b210499b4c5677f5ac2eedbd71d51a1b/packages/shared/ReactSymbols.js#L31
498
546
  //
499
547
  // TODO delete once https://github.com/facebook/react/issues/32392 is fixed
500
548
  const REACT_LAZY_TYPE = Symbol.for('react.lazy');
549
+ const COMPONENT_IDENTIFIER_PATTERN = /^[A-Z][A-Za-z0-9$]*$/;
550
+ const LOWERCASE_CHARACTER_PATTERN = /[a-z]/;
501
551
  function evaluateRenderProp(element, render, props, state) {
502
552
  if (render) {
503
553
  if (typeof render === 'function') {
@@ -526,6 +576,8 @@ function evaluateRenderProp(element, render, props, state) {
526
576
  // so we can throw before with custom message.
527
577
  if (process.env.NODE_ENV !== 'production') {
528
578
  if (! /*#__PURE__*/React.isValidElement(newElement)) {
579
+ // TODO: fix mui/no-guarded-throw
580
+ // eslint-disable-next-line mui/no-guarded-throw
529
581
  throw new Error(['Base UI: The `render` prop was provided an invalid React element as `React.isValidElement(render)` is `false`.', 'A valid React element must be provided to the `render` prop because it is cloned with props to replace the default element.', 'https://base-ui.com/r/invalid-render-prop'].join('\n'));
530
582
  }
531
583
  }
@@ -545,8 +597,10 @@ function warnIfRenderPropLooksLikeComponent(renderFn) {
545
597
  if (functionName.length === 0) {
546
598
  return;
547
599
  }
548
- const firstCharacterCode = functionName.charCodeAt(0);
549
- if (firstCharacterCode < 65 || firstCharacterCode > 90) {
600
+ if (!COMPONENT_IDENTIFIER_PATTERN.test(functionName)) {
601
+ return;
602
+ }
603
+ if (!LOWERCASE_CHARACTER_PATTERN.test(functionName)) {
550
604
  return;
551
605
  }
552
606
  warn(`The \`render\` prop received a function named \`${functionName}\` that starts with an uppercase letter.`, 'This usually means a React component was passed directly as `render={Component}`.', 'Base UI calls `render` as a plain function, which can break the Rules of Hooks during reconciliation.', 'If this is an intentional render callback, rename it to start with a lowercase letter.', 'Use `render={<Component />}` or `render={(props) => <Component {...props} />}` instead.', 'https://base-ui.com/r/invalid-render-prop');
@@ -569,4 +623,4 @@ function renderTag(Tag, props) {
569
623
  return /*#__PURE__*/React.createElement(Tag, props);
570
624
  }
571
625
 
572
- export { EMPTY_OBJECT as E, NOOP as N, useRefWithInit as a, useMergedRefs as b, EMPTY_ARRAY as c, makeEventPreventable as d, formatErrorMessage as f, isReactVersionAtLeast as i, mergeProps as m, useRenderElement as u };
626
+ export { EMPTY_OBJECT as E, NOOP as N, useRefWithInit as a, EMPTY_ARRAY as b, useMergedRefs as c, makeEventPreventable as d, formatErrorMessage as f, isReactVersionAtLeast as i, mergeProps as m, useRenderElement as u, warn as w };