@seed-design/react 2.2.2 → 2.4.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 (186) hide show
  1. package/lib/components/ActionButton/ActionButton.cjs +5 -2
  2. package/lib/components/ActionButton/ActionButton.d.ts.map +1 -1
  3. package/lib/components/ActionButton/ActionButton.js +5 -2
  4. package/lib/components/AttachmentDisplay/AttachmentDisplayItem.cjs +9 -6
  5. package/lib/components/AttachmentDisplay/AttachmentDisplayItem.d.ts.map +1 -1
  6. package/lib/components/AttachmentDisplay/AttachmentDisplayItem.js +9 -6
  7. package/lib/components/AttachmentDisplay/AttachmentDisplayTrigger.cjs +2 -1
  8. package/lib/components/AttachmentDisplay/AttachmentDisplayTrigger.d.ts.map +1 -1
  9. package/lib/components/AttachmentDisplay/AttachmentDisplayTrigger.js +2 -1
  10. package/lib/components/AttachmentInput/AttachmentInputItem.cjs +9 -6
  11. package/lib/components/AttachmentInput/AttachmentInputItem.d.ts.map +1 -1
  12. package/lib/components/AttachmentInput/AttachmentInputItem.js +9 -6
  13. package/lib/components/AttachmentInput/AttachmentInputTrigger.cjs +2 -1
  14. package/lib/components/AttachmentInput/AttachmentInputTrigger.d.ts.map +1 -1
  15. package/lib/components/AttachmentInput/AttachmentInputTrigger.js +2 -1
  16. package/lib/components/BottomSheet/BottomSheet.cjs +5 -3
  17. package/lib/components/BottomSheet/BottomSheet.d.ts.map +1 -1
  18. package/lib/components/BottomSheet/BottomSheet.js +5 -3
  19. package/lib/components/Callout/Callout.cjs +3 -2
  20. package/lib/components/Callout/Callout.d.ts.map +1 -1
  21. package/lib/components/Callout/Callout.js +3 -2
  22. package/lib/components/Checkbox/Checkbox.cjs +2 -1
  23. package/lib/components/Checkbox/Checkbox.d.ts.map +1 -1
  24. package/lib/components/Checkbox/Checkbox.js +2 -1
  25. package/lib/components/Chip/Chip.cjs +2 -1
  26. package/lib/components/Chip/Chip.d.ts.map +1 -1
  27. package/lib/components/Chip/Chip.js +2 -1
  28. package/lib/components/ChipTabs/ChipTabs.cjs +2 -1
  29. package/lib/components/ChipTabs/ChipTabs.d.ts.map +1 -1
  30. package/lib/components/ChipTabs/ChipTabs.js +2 -1
  31. package/lib/components/ContentDialog/ContentDialog.cjs +5 -3
  32. package/lib/components/ContentDialog/ContentDialog.d.ts.map +1 -1
  33. package/lib/components/ContentDialog/ContentDialog.js +5 -3
  34. package/lib/components/ContextualFloatingButton/ContextualFloatingButton.cjs +5 -2
  35. package/lib/components/ContextualFloatingButton/ContextualFloatingButton.d.ts.map +1 -1
  36. package/lib/components/ContextualFloatingButton/ContextualFloatingButton.js +5 -2
  37. package/lib/components/DatePicker/DatePicker.cjs +2 -2
  38. package/lib/components/DatePicker/DatePicker.d.ts +10 -4
  39. package/lib/components/DatePicker/DatePicker.d.ts.map +1 -1
  40. package/lib/components/DatePicker/DatePicker.js +2 -2
  41. package/lib/components/DatePicker/index.d.ts +1 -1
  42. package/lib/components/DatePicker/index.d.ts.map +1 -1
  43. package/lib/components/FieldButton/FieldButton.cjs +2 -1
  44. package/lib/components/FieldButton/FieldButton.d.ts.map +1 -1
  45. package/lib/components/FieldButton/FieldButton.js +2 -1
  46. package/lib/components/FloatingActionButton/FloatingActionButton.cjs +2 -1
  47. package/lib/components/FloatingActionButton/FloatingActionButton.d.ts.map +1 -1
  48. package/lib/components/FloatingActionButton/FloatingActionButton.js +2 -1
  49. package/lib/components/HelpBubble/HelpBubble.cjs +2 -1
  50. package/lib/components/HelpBubble/HelpBubble.d.ts.map +1 -1
  51. package/lib/components/HelpBubble/HelpBubble.js +2 -1
  52. package/lib/components/ImageFrame/ImageFrame.cjs +5 -2
  53. package/lib/components/ImageFrame/ImageFrame.d.ts.map +1 -1
  54. package/lib/components/ImageFrame/ImageFrame.js +5 -2
  55. package/lib/components/LoadingIndicator/usePendingButton.d.ts +57 -57
  56. package/lib/components/MenuSheet/MenuSheet.cjs +2 -1
  57. package/lib/components/MenuSheet/MenuSheet.d.ts.map +1 -1
  58. package/lib/components/MenuSheet/MenuSheet.js +2 -1
  59. package/lib/components/PageBanner/PageBanner.cjs +3 -2
  60. package/lib/components/PageBanner/PageBanner.d.ts.map +1 -1
  61. package/lib/components/PageBanner/PageBanner.js +3 -2
  62. package/lib/components/QuantityPicker/QuantityPicker.cjs +8 -4
  63. package/lib/components/QuantityPicker/QuantityPicker.d.ts.map +1 -1
  64. package/lib/components/QuantityPicker/QuantityPicker.js +8 -4
  65. package/lib/components/RadioGroup/RadioGroup.cjs +2 -1
  66. package/lib/components/RadioGroup/RadioGroup.d.ts.map +1 -1
  67. package/lib/components/RadioGroup/RadioGroup.js +2 -1
  68. package/lib/components/ReactionButton/ReactionButton.cjs +5 -2
  69. package/lib/components/ReactionButton/ReactionButton.d.ts.map +1 -1
  70. package/lib/components/ReactionButton/ReactionButton.js +5 -2
  71. package/lib/components/ScrollFog/ScrollFog.d.ts +4 -6
  72. package/lib/components/ScrollFog/ScrollFog.d.ts.map +1 -1
  73. package/lib/components/ScrollFog/ScrollFog.test.d.ts +2 -0
  74. package/lib/components/ScrollFog/ScrollFog.test.d.ts.map +1 -0
  75. package/lib/components/SideNavigation/SideNavigation.cjs +1 -1
  76. package/lib/components/SideNavigation/SideNavigation.js +1 -1
  77. package/lib/components/SidePanel/SidePanel.cjs +5 -3
  78. package/lib/components/SidePanel/SidePanel.d.ts.map +1 -1
  79. package/lib/components/SidePanel/SidePanel.js +5 -3
  80. package/lib/components/Slider/Slider.cjs +1 -1
  81. package/lib/components/Slider/Slider.js +1 -1
  82. package/lib/components/Snackbar/Snackbar.cjs +2 -1
  83. package/lib/components/Snackbar/Snackbar.d.ts.map +1 -1
  84. package/lib/components/Snackbar/Snackbar.js +2 -1
  85. package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.cjs +2 -1
  86. package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.d.ts.map +1 -1
  87. package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.js +2 -1
  88. package/lib/components/Switch/Switch.cjs +2 -1
  89. package/lib/components/Switch/Switch.d.ts.map +1 -1
  90. package/lib/components/Switch/Switch.js +2 -1
  91. package/lib/components/Tabs/Tabs.cjs +2 -1
  92. package/lib/components/Tabs/Tabs.d.ts.map +1 -1
  93. package/lib/components/Tabs/Tabs.js +2 -1
  94. package/lib/components/TextField/TextField.cjs +1 -1
  95. package/lib/components/TextField/TextField.js +1 -1
  96. package/lib/components/TextField/useTextFieldWithGraphemes.cjs +2 -5
  97. package/lib/components/TextField/useTextFieldWithGraphemes.d.ts.map +1 -1
  98. package/lib/components/TextField/useTextFieldWithGraphemes.js +3 -6
  99. package/lib/components/ToggleButton/ToggleButton.cjs +5 -2
  100. package/lib/components/ToggleButton/ToggleButton.d.ts.map +1 -1
  101. package/lib/components/ToggleButton/ToggleButton.js +5 -2
  102. package/lib/components/WheelPicker/WheelPicker.cjs +94 -0
  103. package/lib/components/WheelPicker/WheelPicker.d.ts +56 -0
  104. package/lib/components/WheelPicker/WheelPicker.d.ts.map +1 -0
  105. package/lib/components/WheelPicker/WheelPicker.js +89 -0
  106. package/lib/components/WheelPicker/WheelPicker.namespace.cjs +15 -0
  107. package/lib/components/WheelPicker/WheelPicker.namespace.d.ts +2 -0
  108. package/lib/components/WheelPicker/WheelPicker.namespace.d.ts.map +1 -0
  109. package/lib/components/WheelPicker/WheelPicker.namespace.js +10 -0
  110. package/lib/components/WheelPicker/WheelPicker.test.d.ts +2 -0
  111. package/lib/components/WheelPicker/WheelPicker.test.d.ts.map +1 -0
  112. package/lib/components/WheelPicker/index.cjs +12 -0
  113. package/lib/components/WheelPicker/index.d.ts +3 -0
  114. package/lib/components/WheelPicker/index.d.ts.map +1 -0
  115. package/lib/components/WheelPicker/index.js +3 -0
  116. package/lib/components/index.cjs +11 -0
  117. package/lib/components/index.d.ts +1 -0
  118. package/lib/components/index.d.ts.map +1 -1
  119. package/lib/components/index.js +3 -1
  120. package/lib/components/private/WheelPicker.cjs +2 -3
  121. package/lib/components/private/WheelPicker.d.ts +3 -3
  122. package/lib/components/private/WheelPicker.d.ts.map +1 -1
  123. package/lib/components/private/WheelPicker.js +3 -3
  124. package/lib/components/private/useDismissible.d.ts +123 -123
  125. package/lib/index.cjs +14 -0
  126. package/lib/index.d.ts +2 -0
  127. package/lib/index.d.ts.map +1 -1
  128. package/lib/index.js +4 -1
  129. package/lib/utils/elementSizeVars.cjs +76 -0
  130. package/lib/utils/elementSizeVars.d.ts +15 -0
  131. package/lib/utils/elementSizeVars.d.ts.map +1 -0
  132. package/lib/utils/elementSizeVars.js +74 -0
  133. package/lib/utils/scaleFeedback.cjs +99 -0
  134. package/lib/utils/scaleFeedback.d.ts +58 -0
  135. package/lib/utils/scaleFeedback.d.ts.map +1 -0
  136. package/lib/utils/scaleFeedback.js +94 -0
  137. package/package.json +7 -7
  138. package/src/components/ActionButton/ActionButton.tsx +5 -2
  139. package/src/components/AttachmentDisplay/AttachmentDisplayItem.tsx +14 -9
  140. package/src/components/AttachmentDisplay/AttachmentDisplayTrigger.tsx +7 -4
  141. package/src/components/AttachmentInput/AttachmentInputItem.tsx +14 -9
  142. package/src/components/AttachmentInput/AttachmentInputTrigger.tsx +3 -3
  143. package/src/components/BottomSheet/BottomSheet.tsx +5 -3
  144. package/src/components/Callout/Callout.tsx +9 -4
  145. package/src/components/Checkbox/Checkbox.tsx +3 -3
  146. package/src/components/Chip/Chip.tsx +2 -1
  147. package/src/components/ChipTabs/ChipTabs.tsx +3 -3
  148. package/src/components/ContentDialog/ContentDialog.tsx +5 -3
  149. package/src/components/ContextualFloatingButton/ContextualFloatingButton.tsx +5 -2
  150. package/src/components/DatePicker/DatePicker.test.tsx +70 -0
  151. package/src/components/DatePicker/DatePicker.tsx +17 -16
  152. package/src/components/DatePicker/index.ts +2 -0
  153. package/src/components/FieldButton/FieldButton.tsx +6 -3
  154. package/src/components/FloatingActionButton/FloatingActionButton.tsx +4 -4
  155. package/src/components/HelpBubble/HelpBubble.tsx +7 -4
  156. package/src/components/HelpBubbleTooltip/HelpBubbleTooltip.tsx +1 -1
  157. package/src/components/ImageFrame/ImageFrame.tsx +8 -1
  158. package/src/components/MenuSheet/MenuSheet.tsx +6 -3
  159. package/src/components/PageBanner/PageBanner.tsx +5 -6
  160. package/src/components/QuantityPicker/QuantityPicker.tsx +8 -4
  161. package/src/components/RadioGroup/RadioGroup.tsx +7 -4
  162. package/src/components/ReactionButton/ReactionButton.tsx +5 -2
  163. package/src/components/ScrollFog/ScrollFog.test.tsx +13 -0
  164. package/src/components/ScrollFog/ScrollFog.tsx +5 -7
  165. package/src/components/SidePanel/SidePanel.tsx +5 -3
  166. package/src/components/Snackbar/Snackbar.tsx +6 -3
  167. package/src/components/SwipeableMenuSheet/SwipeableMenuSheet.tsx +7 -4
  168. package/src/components/Switch/Switch.tsx +3 -3
  169. package/src/components/Tabs/Tabs.tsx +3 -3
  170. package/src/components/TextField/useTextFieldWithGraphemes.ts +3 -7
  171. package/src/components/ToggleButton/ToggleButton.tsx +5 -2
  172. package/src/components/WheelPicker/WheelPicker.namespace.ts +9 -0
  173. package/src/components/WheelPicker/WheelPicker.test.tsx +270 -0
  174. package/src/components/WheelPicker/WheelPicker.tsx +210 -0
  175. package/src/components/WheelPicker/index.ts +11 -0
  176. package/src/components/index.ts +1 -0
  177. package/src/components/private/WheelPicker.test.tsx +1 -0
  178. package/src/components/private/WheelPicker.tsx +6 -6
  179. package/src/index.ts +2 -0
  180. package/src/utils/elementSizeVars.tsx +112 -0
  181. package/src/utils/scaleFeedback.tsx +128 -0
  182. package/lib/components/TextField/memoize.cjs +0 -13
  183. package/lib/components/TextField/memoize.d.ts +0 -2
  184. package/lib/components/TextField/memoize.d.ts.map +0 -1
  185. package/lib/components/TextField/memoize.js +0 -13
  186. package/src/components/TextField/memoize.ts +0 -14
@@ -4,7 +4,7 @@ import {
4
4
  attachmentInputItem,
5
5
  type AttachmentInputItemVariantProps,
6
6
  } from "@seed-design/css/recipes/attachment-input-item";
7
- import { composeRefs } from "@radix-ui/react-compose-refs";
7
+ import { composeRefs, useComposedRefs } from "@radix-ui/react-compose-refs";
8
8
  import { dataAttr } from "@seed-design/dom-utils";
9
9
  import {
10
10
  AttachmentDisplay as AttachmentDisplayPrimitive,
@@ -18,6 +18,7 @@ import clsx from "clsx";
18
18
  import * as React from "react";
19
19
  import { createRenderTrackingContext } from "../../utils/createRenderTrackingContext";
20
20
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
21
+ import { useScaleFeedback, withScaleFeedback } from "../../utils/scaleFeedback";
21
22
 
22
23
  const { useClassNames, ClassNamesProvider, withContext } =
23
24
  createSlotRecipeContext(attachmentInputItem);
@@ -44,14 +45,15 @@ export const AttachmentDisplayItem = React.forwardRef<HTMLLIElement, AttachmentD
44
45
  });
45
46
 
46
47
  const classNames = attachmentInputItem(variantProps);
48
+ const { scaleFeedbackRef, scaleFeedbackClassName } = useScaleFeedback();
47
49
 
48
50
  return (
49
51
  <ClassNamesProvider value={classNames}>
50
52
  <AttachmentDisplayItemProvider value={api}>
51
53
  <overlayTracker.Provider>
52
54
  <Primitive.li
53
- ref={ref}
54
- className={clsx(classNames.root, className)}
55
+ ref={useComposedRefs(scaleFeedbackRef, ref)}
56
+ className={clsx(classNames.root, scaleFeedbackClassName, className)}
55
57
  {...stateProps}
56
58
  {...otherProps}
57
59
  />
@@ -181,12 +183,13 @@ export const AttachmentDisplayItemActionButton = React.forwardRef<
181
183
  AttachmentDisplayItemActionButtonProps
182
184
  >(({ className, ...props }, ref) => {
183
185
  const classNames = useClassNames();
186
+ const { scaleFeedbackRef, scaleFeedbackClassName } = useScaleFeedback();
184
187
 
185
188
  return (
186
189
  <Primitive.button
187
190
  type="button"
188
- ref={ref}
189
- className={clsx(classNames.actionButton, className)}
191
+ ref={useComposedRefs(scaleFeedbackRef, ref)}
192
+ className={clsx(classNames.actionButton, scaleFeedbackClassName, className)}
190
193
  {...props}
191
194
  />
192
195
  );
@@ -198,7 +201,9 @@ AttachmentDisplayItemActionButton.displayName = "AttachmentDisplayItemActionButt
198
201
  export interface AttachmentDisplayItemRemoveButtonProps
199
202
  extends AttachmentDisplayPrimitive.ItemRemoveButtonProps {}
200
203
 
201
- export const AttachmentDisplayItemRemoveButton = withContext<
202
- HTMLButtonElement,
203
- AttachmentDisplayItemRemoveButtonProps
204
- >(AttachmentDisplayPrimitive.ItemRemoveButton, "removeButton");
204
+ export const AttachmentDisplayItemRemoveButton = withScaleFeedback(
205
+ withContext<HTMLButtonElement, AttachmentDisplayItemRemoveButtonProps>(
206
+ AttachmentDisplayPrimitive.ItemRemoveButton,
207
+ "removeButton",
208
+ ),
209
+ );
@@ -14,6 +14,7 @@ import clsx from "clsx";
14
14
  import * as React from "react";
15
15
  import { InternalIcon } from "../private/Icon";
16
16
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
17
+ import { withScaleFeedback } from "../../utils/scaleFeedback";
17
18
 
18
19
  const { withProvider, useClassNames } = createSlotRecipeContext(attachmentInputTrigger);
19
20
 
@@ -22,10 +23,12 @@ export interface AttachmentDisplayTriggerProps
22
23
  PrimitiveProps,
23
24
  React.ButtonHTMLAttributes<HTMLButtonElement> {}
24
25
 
25
- export const AttachmentDisplayTrigger = withProvider<
26
- HTMLButtonElement,
27
- AttachmentDisplayTriggerProps
28
- >(AttachmentDisplayPrimitive.Trigger, "root");
26
+ export const AttachmentDisplayTrigger = withScaleFeedback(
27
+ withProvider<HTMLButtonElement, AttachmentDisplayTriggerProps>(
28
+ AttachmentDisplayPrimitive.Trigger,
29
+ "root",
30
+ ),
31
+ );
29
32
 
30
33
  // Display currently only supports image content. The parametric form mirrors
31
34
  // AttachmentInput.TriggerIcon so future expansion (e.g., "general") can be added
@@ -5,7 +5,7 @@ import {
5
5
  attachmentInputItem,
6
6
  type AttachmentInputItemVariantProps,
7
7
  } from "@seed-design/css/recipes/attachment-input-item";
8
- import { composeRefs } from "@radix-ui/react-compose-refs";
8
+ import { composeRefs, useComposedRefs } from "@radix-ui/react-compose-refs";
9
9
  import { dataAttr } from "@seed-design/dom-utils";
10
10
  import {
11
11
  FileUpload as FileUploadPrimitive,
@@ -21,6 +21,7 @@ import { Primitive, type PrimitiveProps } from "@seed-design/react-primitive";
21
21
  import clsx from "clsx";
22
22
  import { createRenderTrackingContext } from "../../utils/createRenderTrackingContext";
23
23
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
24
+ import { useScaleFeedback, withScaleFeedback } from "../../utils/scaleFeedback";
24
25
 
25
26
  const { useClassNames, ClassNamesProvider, withContext } =
26
27
  createSlotRecipeContext(attachmentInputItem);
@@ -45,14 +46,15 @@ export const AttachmentInputItem = React.forwardRef<HTMLLIElement, AttachmentInp
45
46
  });
46
47
 
47
48
  const classNames = attachmentInputItem(variantProps);
49
+ const { scaleFeedbackRef, scaleFeedbackClassName } = useScaleFeedback();
48
50
 
49
51
  return (
50
52
  <ClassNamesProvider value={classNames}>
51
53
  <FileUploadItemProvider value={api}>
52
54
  <overlayTracker.Provider>
53
55
  <Primitive.li
54
- ref={ref}
55
- className={clsx(classNames.root, className)}
56
+ ref={useComposedRefs(scaleFeedbackRef, ref)}
57
+ className={clsx(classNames.root, scaleFeedbackClassName, className)}
56
58
  {...stateProps}
57
59
  {...otherProps}
58
60
  />
@@ -115,10 +117,12 @@ AttachmentInputItemSize.displayName = "AttachmentInputItemSize";
115
117
  export interface AttachmentInputItemRemoveButtonProps
116
118
  extends FileUploadPrimitive.ItemRemoveButtonProps {}
117
119
 
118
- export const AttachmentInputItemRemoveButton = withContext<
119
- HTMLButtonElement,
120
- AttachmentInputItemRemoveButtonProps
121
- >(FileUploadPrimitive.ItemRemoveButton, "removeButton");
120
+ export const AttachmentInputItemRemoveButton = withScaleFeedback(
121
+ withContext<HTMLButtonElement, AttachmentInputItemRemoveButtonProps>(
122
+ FileUploadPrimitive.ItemRemoveButton,
123
+ "removeButton",
124
+ ),
125
+ );
122
126
 
123
127
  export interface AttachmentInputItemImageProps extends FileUploadPrimitive.ItemImageProps {}
124
128
 
@@ -184,12 +188,13 @@ export const AttachmentInputItemActionButton = React.forwardRef<
184
188
  AttachmentInputItemActionButtonProps
185
189
  >(({ className, ...props }, ref) => {
186
190
  const classNames = useClassNames();
191
+ const { scaleFeedbackRef, scaleFeedbackClassName } = useScaleFeedback();
187
192
 
188
193
  return (
189
194
  <Primitive.button
190
195
  type="button"
191
- ref={ref}
192
- className={clsx(classNames.actionButton, className)}
196
+ ref={useComposedRefs(scaleFeedbackRef, ref)}
197
+ className={clsx(classNames.actionButton, scaleFeedbackClassName, className)}
193
198
  {...props}
194
199
  />
195
200
  );
@@ -16,6 +16,7 @@ import { mergeProps } from "@seed-design/dom-utils";
16
16
  import clsx from "clsx";
17
17
  import { InternalIcon } from "../private/Icon";
18
18
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
19
+ import { withScaleFeedback } from "../../utils/scaleFeedback";
19
20
 
20
21
  const { withProvider, useClassNames } = createSlotRecipeContext(attachmentInputTrigger);
21
22
 
@@ -24,9 +25,8 @@ export interface AttachmentInputTriggerProps
24
25
  PrimitiveProps,
25
26
  React.ButtonHTMLAttributes<HTMLButtonElement> {}
26
27
 
27
- export const AttachmentInputTrigger = withProvider<HTMLButtonElement, AttachmentInputTriggerProps>(
28
- FileUploadPrimitive.Trigger,
29
- "root",
28
+ export const AttachmentInputTrigger = withScaleFeedback(
29
+ withProvider<HTMLButtonElement, AttachmentInputTriggerProps>(FileUploadPrimitive.Trigger, "root"),
30
30
  );
31
31
 
32
32
  export type AttachmentInputTriggerIconProps = React.SVGAttributes<SVGElement> & {
@@ -1,10 +1,11 @@
1
1
  import { bottomSheet, type BottomSheetVariantProps } from "@seed-design/css/recipes/bottom-sheet";
2
- import { composeRefs } from "@radix-ui/react-compose-refs";
2
+ import { useComposedRefs } from "@radix-ui/react-compose-refs";
3
3
  import { dataAttr } from "@seed-design/dom-utils";
4
4
  import { Drawer } from "@seed-design/react-drawer";
5
5
  import { Primitive, type PrimitiveProps } from "@seed-design/react-primitive";
6
6
  import clsx from "clsx";
7
7
  import { forwardRef } from "react";
8
+ import { useScaleFeedback } from "../../utils/scaleFeedback";
8
9
  import { createRenderTrackingContext } from "../../utils/createRenderTrackingContext";
9
10
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
10
11
  import { withStyleProps, type StyleProps } from "../../utils/styled";
@@ -144,11 +145,12 @@ export const BottomSheetCloseButton = forwardRef<HTMLButtonElement, BottomSheetC
144
145
  ({ className, ...props }, ref) => {
145
146
  const classNames = useClassNames();
146
147
  const { trackRef } = closeButtonTracker.useRenderTracking();
148
+ const { scaleFeedbackRef, scaleFeedbackClassName } = useScaleFeedback();
147
149
 
148
150
  return (
149
151
  <Drawer.CloseButton
150
- ref={composeRefs(ref, trackRef)}
151
- className={clsx(classNames.closeButton, className)}
152
+ ref={useComposedRefs(scaleFeedbackRef, ref, trackRef)}
153
+ className={clsx(classNames.closeButton, scaleFeedbackClassName, className)}
152
154
  {...props}
153
155
  />
154
156
  );
@@ -3,6 +3,7 @@ import type * as React from "react";
3
3
  import { Primitive, type PrimitiveProps } from "@seed-design/react-primitive";
4
4
  import { callout, type CalloutVariantProps } from "@seed-design/css/recipes/callout";
5
5
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
6
+ import { withScaleFeedback } from "../../utils/scaleFeedback";
6
7
  import {
7
8
  DismissibleCloseButton,
8
9
  DismissibleRoot,
@@ -13,7 +14,12 @@ const { withContext, withProvider } = createSlotRecipeContext(callout);
13
14
 
14
15
  export interface CalloutRootProps extends CalloutVariantProps, DismissibleRootProps {}
15
16
 
16
- export const CalloutRoot = withProvider<HTMLDivElement, CalloutRootProps>(DismissibleRoot, "root");
17
+ // The root only scales when the consumer makes it actionable (`asChild` with a
18
+ // button or anchor) — the recipe gates the scale on `:is(button, a)`. Publishing
19
+ // the size vars unconditionally costs a plain callout nothing.
20
+ export const CalloutRoot = withScaleFeedback(
21
+ withProvider<HTMLDivElement, CalloutRootProps>(DismissibleRoot, "root"),
22
+ );
17
23
 
18
24
  export interface CalloutContentProps extends PrimitiveProps, React.HTMLAttributes<HTMLDivElement> {}
19
25
 
@@ -51,7 +57,6 @@ export interface CalloutCloseButtonProps
51
57
  extends PrimitiveProps,
52
58
  React.ButtonHTMLAttributes<HTMLButtonElement> {}
53
59
 
54
- export const CalloutCloseButton = withContext<HTMLButtonElement, CalloutCloseButtonProps>(
55
- DismissibleCloseButton,
56
- "closeButton",
60
+ export const CalloutCloseButton = withScaleFeedback(
61
+ withContext<HTMLButtonElement, CalloutCloseButtonProps>(DismissibleCloseButton, "closeButton"),
57
62
  );
@@ -8,6 +8,7 @@ import clsx from "clsx";
8
8
  import { forwardRef } from "react";
9
9
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
10
10
  import { createWithStateProps } from "../../utils/createWithStateProps";
11
+ import { withScaleFeedback } from "../../utils/scaleFeedback";
11
12
  import { InternalIcon } from "../private/Icon";
12
13
  import { createRecipeContext } from "../../utils/createRecipeContext";
13
14
  import {
@@ -75,9 +76,8 @@ export interface CheckboxControlProps
75
76
  extends CheckmarkVariantProps,
76
77
  CheckboxPrimitive.ControlProps {}
77
78
 
78
- export const CheckboxControl = withCheckmarkProvider<HTMLDivElement, CheckboxControlProps>(
79
- CheckboxPrimitive.Control,
80
- "root",
79
+ export const CheckboxControl = withScaleFeedback(
80
+ withCheckmarkProvider<HTMLDivElement, CheckboxControlProps>(CheckboxPrimitive.Control, "root"),
81
81
  );
82
82
 
83
83
  ////////////////////////////////////////////////////////////////////////////////////
@@ -2,6 +2,7 @@ import { chip, type ChipVariantProps } from "@seed-design/css/recipes/chip";
2
2
  import { Primitive, type PrimitiveProps } from "@seed-design/react-primitive";
3
3
  import type * as React from "react";
4
4
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
5
+ import { withScaleFeedback } from "../../utils/scaleFeedback";
5
6
  import { withIconRequired } from "../Icon/Icon";
6
7
  import { createWithStateProps } from "../../utils/createWithStateProps";
7
8
  import { useCheckboxContext } from "@seed-design/react-checkbox";
@@ -21,7 +22,7 @@ export interface ChipRootProps
21
22
  React.ButtonHTMLAttributes<HTMLButtonElement> {}
22
23
 
23
24
  export const ChipRoot = withIconRequired(
24
- withProvider<HTMLButtonElement, ChipRootProps>(Primitive.button, "root"),
25
+ withScaleFeedback(withProvider<HTMLButtonElement, ChipRootProps>(Primitive.button, "root")),
25
26
  (props: ChipRootProps) => props.layout === "iconOnly",
26
27
  );
27
28
  ChipRoot.displayName = "Chip.Root";
@@ -1,6 +1,7 @@
1
1
  import { chipTabs, type ChipTabsVariantProps } from "@seed-design/css/recipes/chip-tabs";
2
2
  import { Tabs as TabsPrimitive } from "@seed-design/react-tabs";
3
3
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
4
+ import { withScaleFeedback } from "../../utils/scaleFeedback";
4
5
  import { forwardRef } from "react";
5
6
  import clsx from "clsx";
6
7
 
@@ -41,9 +42,8 @@ export const ChipTabsList = withContext<HTMLDivElement, ChipTabsListProps>(
41
42
 
42
43
  export interface ChipTabsTriggerProps extends TabsPrimitive.TriggerProps {}
43
44
 
44
- export const ChipTabsTrigger = withContext<HTMLButtonElement, ChipTabsTriggerProps>(
45
- TabsPrimitive.Trigger,
46
- "trigger",
45
+ export const ChipTabsTrigger = withScaleFeedback(
46
+ withContext<HTMLButtonElement, ChipTabsTriggerProps>(TabsPrimitive.Trigger, "trigger"),
47
47
  );
48
48
 
49
49
  ////////////////////////////////////////////////////////////////////////////////////
@@ -1,4 +1,4 @@
1
- import { composeRefs } from "@radix-ui/react-compose-refs";
1
+ import { composeRefs, useComposedRefs } from "@radix-ui/react-compose-refs";
2
2
  import {
3
3
  contentDialog,
4
4
  type ContentDialogVariantProps,
@@ -10,6 +10,7 @@ import clsx from "clsx";
10
10
  import * as React from "react";
11
11
  import { createRenderTrackingContext } from "../../utils/createRenderTrackingContext";
12
12
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
13
+ import { useScaleFeedback } from "../../utils/scaleFeedback";
13
14
  import { useStyleProps, withStyleProps, type StyleProps } from "../../utils/styled";
14
15
 
15
16
  const { withContext, useClassNames, ClassNamesProvider } = createSlotRecipeContext(contentDialog);
@@ -209,11 +210,12 @@ export const ContentDialogCloseButton = React.forwardRef<
209
210
  >(({ className, ...props }, ref) => {
210
211
  const classNames = useClassNames();
211
212
  const { trackRef } = closeButtonTracker.useRenderTracking();
213
+ const { scaleFeedbackRef, scaleFeedbackClassName } = useScaleFeedback();
212
214
 
213
215
  return (
214
216
  <DialogPrimitive.CloseButton
215
- ref={composeRefs(ref, trackRef)}
216
- className={clsx(classNames.closeButton, className)}
217
+ ref={useComposedRefs(scaleFeedbackRef, ref, trackRef)}
218
+ className={clsx(classNames.closeButton, scaleFeedbackClassName, className)}
217
219
  {...props}
218
220
  />
219
221
  );
@@ -2,9 +2,11 @@ import {
2
2
  contextualFloatingButton,
3
3
  type ContextualFloatingButtonVariantProps,
4
4
  } from "@seed-design/css/recipes/contextual-floating-button";
5
+ import { useComposedRefs } from "@radix-ui/react-compose-refs";
5
6
  import { Primitive, type PrimitiveProps } from "@seed-design/react-primitive";
6
7
  import clsx from "clsx";
7
8
  import * as React from "react";
9
+ import { useScaleFeedback } from "../../utils/scaleFeedback";
8
10
  import { IconRequired } from "../Icon/Icon";
9
11
  import {
10
12
  PendingButtonProvider,
@@ -24,6 +26,7 @@ export const ContextualFloatingButton = React.forwardRef<
24
26
  >(({ variant, loading = false, layout = "withText", className, children, ...otherProps }, ref) => {
25
27
  const recipeClassName = contextualFloatingButton({ variant, layout });
26
28
  const api = usePendingButton({ loading, disabled: otherProps.disabled });
29
+ const { scaleFeedbackRef, scaleFeedbackClassName } = useScaleFeedback();
27
30
 
28
31
  if (layout === "iconOnly" && !(otherProps["aria-label"] || otherProps["aria-labelledby"])) {
29
32
  console.warn(
@@ -35,8 +38,8 @@ export const ContextualFloatingButton = React.forwardRef<
35
38
  <PendingButtonProvider value={api}>
36
39
  <IconRequired enabled={layout === "iconOnly"}>
37
40
  <Primitive.button
38
- ref={ref}
39
- className={clsx(recipeClassName, className)}
41
+ ref={useComposedRefs(scaleFeedbackRef, ref)}
42
+ className={clsx(recipeClassName, scaleFeedbackClassName, className)}
40
43
  {...api.stateProps}
41
44
  {...otherProps}
42
45
  >
@@ -102,6 +102,56 @@ describe("DatePicker", () => {
102
102
  expect(onValueChange).not.toHaveBeenCalled();
103
103
  });
104
104
 
105
+ it("읽기 전용 Range 시작일의 상태와 접근성 이름을 노출하고 값 변경을 막는다", () => {
106
+ const onValueChange = mock(() => {});
107
+ const { getByRole } = render(
108
+ <DatePicker
109
+ {...commonProps}
110
+ selectionMode="range"
111
+ rangeStartReadOnly
112
+ defaultValue={{
113
+ start: { year: 2026, month: 7, day: 7 },
114
+ end: { year: 2026, month: 7, day: 9 },
115
+ }}
116
+ onValueChange={onValueChange}
117
+ />,
118
+ );
119
+ const start = getByRole("button", { name: /2026년 7월 7일.*읽기 전용 시작일/ });
120
+
121
+ expect(start).toHaveAttribute("data-range-start-readonly");
122
+ expect(start.closest('[role="gridcell"]')).toHaveAttribute("data-range-start-readonly");
123
+ expect(start).toHaveAttribute("aria-disabled", "true");
124
+ expect(start).not.toBeDisabled();
125
+
126
+ fireEvent.click(start);
127
+ expect(onValueChange).not.toHaveBeenCalled();
128
+
129
+ fireEvent.click(getByRole("button", { name: /2026년 7월 12일/ }));
130
+ expect(onValueChange).toHaveBeenCalledWith({
131
+ start: { year: 2026, month: 7, day: 7 },
132
+ end: { year: 2026, month: 7, day: 12 },
133
+ });
134
+ });
135
+
136
+ it("날짜 셀 render prop에 읽기 전용 Range 시작일 상태를 전달한다", () => {
137
+ const { getByRole } = render(
138
+ <DatePicker
139
+ {...commonProps}
140
+ selectionMode="range"
141
+ rangeStartReadOnly
142
+ defaultValue={{ start: { year: 2026, month: 7, day: 7 } }}
143
+ renderDateCellSupplement={({ isRangeStartReadOnly }) => (
144
+ <span>{isRangeStartReadOnly ? "고정" : "변경 가능"}</span>
145
+ )}
146
+ />,
147
+ );
148
+
149
+ expect(getByRole("button", { name: /2026년 7월 7일.*읽기 전용 시작일/ })).toHaveTextContent(
150
+ "고정",
151
+ );
152
+ expect(getByRole("button", { name: /2026년 7월 8일/ })).toHaveTextContent("변경 가능");
153
+ });
154
+
105
155
  it("월·연도 제목을 누르면 Wheel Picker로 전환한다", () => {
106
156
  const { getByRole, getAllByRole, queryByRole } = render(<DatePicker {...commonProps} />);
107
157
 
@@ -166,6 +216,26 @@ describe("DatePicker", () => {
166
216
  }
167
217
  });
168
218
 
219
+ it("ContinuousDatePicker는 monthRange에 포함된 월만 노출한다", () => {
220
+ const { getAllByRole, queryByRole } = render(
221
+ <ContinuousDatePicker
222
+ {...commonProps}
223
+ defaultViewDate={{ year: 2026, month: 12, day: 1 }}
224
+ monthRange={{
225
+ start: { year: 2026, month: 12 },
226
+ end: { year: 2027, month: 1 },
227
+ }}
228
+ height="400px"
229
+ />,
230
+ );
231
+
232
+ expect(getAllByRole("grid")).toHaveLength(2);
233
+ expect(queryByRole("grid", { name: "2026년 11월" })).not.toBeInTheDocument();
234
+ expect(queryByRole("grid", { name: "2026년 12월" })).toBeInTheDocument();
235
+ expect(queryByRole("grid", { name: "2027년 1월" })).toBeInTheDocument();
236
+ expect(queryByRole("grid", { name: "2027년 2월" })).not.toBeInTheDocument();
237
+ });
238
+
169
239
  it("navigateToDate는 외부 포커스를 유지하고 오늘을 다음 tab 진입점으로 지정한다", () => {
170
240
  const actionsRef = React.createRef<DatePickerActions>();
171
241
  const { getByRole } = render(
@@ -9,6 +9,7 @@ import {
9
9
  type DatePickerCell,
10
10
  type DatePickerCellState,
11
11
  type DatePickerMonth,
12
+ type DatePickerMonthRange,
12
13
  type DatePickerVisibleRange,
13
14
  type UseDatePickerProps,
14
15
  } from "@seed-design/react-date-picker";
@@ -43,7 +44,7 @@ export interface DatePickerCellContentRenderProps extends DatePickerCellState {}
43
44
 
44
45
  type DatePickerBehaviorProps = UseDatePickerProps extends infer Props
45
46
  ? Props extends UseDatePickerProps
46
- ? Omit<Props, "visibleRange">
47
+ ? Omit<Props, "visibleRange" | "monthRange">
47
48
  : never
48
49
  : never;
49
50
 
@@ -82,10 +83,18 @@ export type WeekDatePickerProps = DatePickerSharedProps;
82
83
  type DatePickerPropsWithoutSize<Props = DatePickerSharedProps> = Props extends DatePickerSharedProps
83
84
  ? Omit<Props, "height" | "minHeight" | "maxHeight">
84
85
  : never;
85
- export type ContinuousDatePickerProps = DatePickerPropsWithoutSize & ContinuousSizeConstraint;
86
+ export type ContinuousDatePickerProps = DatePickerPropsWithoutSize &
87
+ ContinuousSizeConstraint & {
88
+ /**
89
+ * 노출하고 이동할 수 있는 월 범위입니다. 양끝 월을 포함합니다.
90
+ * 생략하면 `yearRange.start`의 1월부터 `yearRange.end`의 12월까지 노출합니다.
91
+ */
92
+ monthRange?: DatePickerMonthRange;
93
+ };
86
94
 
87
95
  type DatePickerImplementationProps = DatePickerSharedProps & {
88
96
  visibleRange: DatePickerVisibleRange;
97
+ monthRange?: DatePickerMonthRange;
89
98
  };
90
99
 
91
100
  type NavigationChevronIconProps = React.SVGProps<SVGSVGElement> & {
@@ -100,13 +109,7 @@ const NavigationChevronIcon = React.forwardRef<SVGSVGElement, NavigationChevronI
100
109
  : "M17.2069 13.0704C16.9212 13.3703 16.9328 13.8451 17.2327 14.1307L23.4125 20.0166L17.2328 25.9017C16.9328 26.1873 16.9212 26.6621 17.2069 26.962C17.4925 27.262 17.9673 27.2736 18.2672 26.9879L25.0172 20.5598C25.1659 20.4182 25.25 20.2219 25.25 20.0167C25.25 19.8114 25.1659 19.6151 25.0173 19.4736L18.2673 13.0446C17.9673 12.7589 17.4926 12.7704 17.2069 13.0704Z";
101
110
 
102
111
  return (
103
- <svg
104
- ref={ref}
105
- {...props}
106
- viewBox="8 8 24 24"
107
- fill="none"
108
- xmlns="http://www.w3.org/2000/svg"
109
- >
112
+ <svg ref={ref} {...props} viewBox="8 8 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
110
113
  <path fillRule="evenodd" clipRule="evenodd" d={path} fill="currentColor" />
111
114
  </svg>
112
115
  );
@@ -120,13 +123,7 @@ type HeaderChevronIconProps = React.SVGProps<SVGSVGElement> & {
120
123
 
121
124
  const HeaderChevronIcon = React.forwardRef<SVGSVGElement, HeaderChevronIconProps>(
122
125
  ({ expanded, ...props }, ref) => (
123
- <svg
124
- ref={ref}
125
- {...props}
126
- viewBox="0 0 20 20"
127
- fill="none"
128
- xmlns="http://www.w3.org/2000/svg"
129
- >
126
+ <svg ref={ref} {...props} viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
130
127
  <path
131
128
  fillRule="evenodd"
132
129
  clipRule="evenodd"
@@ -421,9 +418,11 @@ const DatePickerImplementation = React.forwardRef<HTMLDivElement, DatePickerImpl
421
418
  locale: _locale,
422
419
  weekStartsOn: _weekStartsOn,
423
420
  yearRange: _yearRange,
421
+ monthRange: _monthRange,
424
422
  constraints: _constraints,
425
423
  disabled: _disabled,
426
424
  readOnly: _readOnly,
425
+ rangeStartReadOnly: _rangeStartReadOnly,
427
426
  ariaLabels: _ariaLabels,
428
427
  className,
429
428
  "aria-label": ariaLabel,
@@ -565,10 +564,12 @@ export type {
565
564
  DatePickerConstraint,
566
565
  DatePickerConstraintContext,
567
566
  DatePickerDate,
567
+ DatePickerMonthRange,
568
568
  DatePickerMultipleProps,
569
569
  DatePickerRangeProps,
570
570
  DatePickerRangeValue,
571
571
  DatePickerSelectionMode,
572
572
  DatePickerSingleProps,
573
573
  DatePickerValue,
574
+ DatePickerYearMonth,
574
575
  } from "@seed-design/react-date-picker";
@@ -10,6 +10,7 @@ export {
10
10
  type DatePickerConstraint,
11
11
  type DatePickerConstraintContext,
12
12
  type DatePickerDate,
13
+ type DatePickerMonthRange,
13
14
  type DatePickerMultipleProps,
14
15
  type DatePickerProps,
15
16
  type DatePickerRangeProps,
@@ -17,6 +18,7 @@ export {
17
18
  type DatePickerSelectionMode,
18
19
  type DatePickerSingleProps,
19
20
  type DatePickerValue,
21
+ type DatePickerYearMonth,
20
22
  type TwoMonthDatePickerProps,
21
23
  type WeekDatePickerProps,
22
24
  } from "./DatePicker";
@@ -4,6 +4,7 @@ import * as React from "react";
4
4
  import { forwardRef } from "react";
5
5
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
6
6
  import { createWithStateProps } from "../../utils/createWithStateProps";
7
+ import { withScaleFeedback } from "../../utils/scaleFeedback";
7
8
  import { splitMultipleVariantsProps } from "../../utils/splitMultipleVariantsProps";
8
9
  import { field, type FieldVariantProps } from "@seed-design/css/recipes/field";
9
10
  import { fieldLabel, type FieldLabelVariantProps } from "@seed-design/css/recipes/field-label";
@@ -227,9 +228,11 @@ export const FieldButtonControl = withProvider<HTMLDivElement, FieldButtonContro
227
228
 
228
229
  export interface FieldButtonClearButtonProps extends FieldButton.ClearButtonProps {}
229
230
 
230
- export const FieldButtonClearButton = withContext<HTMLButtonElement, FieldButtonClearButtonProps>(
231
- FieldButton.ClearButton,
232
- "clearButton",
231
+ export const FieldButtonClearButton = withScaleFeedback(
232
+ withContext<HTMLButtonElement, FieldButtonClearButtonProps>(
233
+ FieldButton.ClearButton,
234
+ "clearButton",
235
+ ),
233
236
  );
234
237
 
235
238
  export interface FieldButtonValueProps
@@ -5,6 +5,7 @@ import {
5
5
  import { Primitive, type PrimitiveProps } from "@seed-design/react-primitive";
6
6
  import type * as React from "react";
7
7
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
8
+ import { withScaleFeedback } from "../../utils/scaleFeedback";
8
9
  import { InternalIcon, type InternalIconProps } from "../private/Icon";
9
10
 
10
11
  const { withProvider, withContext } = createSlotRecipeContext(floatingActionButton);
@@ -16,10 +17,9 @@ export interface FloatingActionButtonRootProps
16
17
  PrimitiveProps,
17
18
  React.ButtonHTMLAttributes<HTMLButtonElement> {}
18
19
 
19
- export const FloatingActionButtonRoot = withProvider<
20
- HTMLButtonElement,
21
- FloatingActionButtonRootProps
22
- >(Primitive.button, "root");
20
+ export const FloatingActionButtonRoot = withScaleFeedback(
21
+ withProvider<HTMLButtonElement, FloatingActionButtonRootProps>(Primitive.button, "root"),
22
+ );
23
23
 
24
24
  export interface FloatingActionButtonIconProps extends InternalIconProps {}
25
25
 
@@ -3,6 +3,7 @@ import { Primitive, type PrimitiveProps } from "@seed-design/react-primitive";
3
3
  import { helpBubble, type HelpBubbleVariantProps } from "@seed-design/css/recipes/help-bubble";
4
4
  import { forwardRef } from "react";
5
5
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
6
+ import { withScaleFeedback } from "../../utils/scaleFeedback";
6
7
  import { createWithStateProps } from "../../utils/createWithStateProps";
7
8
  import { withStyleProps, type StyleProps } from "../../utils/styled";
8
9
  import { getHelpBubbleArrowTipPath } from "../../utils/getHelpBubbleArrowTipPath";
@@ -37,7 +38,7 @@ export const HelpBubbleRoot = withRootProvider<HelpBubbleRootProps>(PopoverPrimi
37
38
  defaultProps: {
38
39
  placement: "top",
39
40
  gutter: 4, // TODO: get value from rootage spec
40
- overflowPadding: 16,
41
+ overflowPadding: 16, // TODO: get value from rootage spec
41
42
  arrowPadding: 14,
42
43
  },
43
44
  });
@@ -137,9 +138,11 @@ HelpBubbleArrowTip.displayName = "HelpBubbleArrowTip";
137
138
 
138
139
  export interface HelpBubbleCloseButtonProps extends PopoverPrimitive.CloseButtonProps {}
139
140
 
140
- export const HelpBubbleCloseButton = withContext<HTMLButtonElement, HelpBubbleCloseButtonProps>(
141
- PopoverPrimitive.CloseButton,
142
- "closeButton",
141
+ export const HelpBubbleCloseButton = withScaleFeedback(
142
+ withContext<HTMLButtonElement, HelpBubbleCloseButtonProps>(
143
+ PopoverPrimitive.CloseButton,
144
+ "closeButton",
145
+ ),
143
146
  );
144
147
 
145
148
  ////////////////////////////////////////////////////////////////////////////////////
@@ -41,7 +41,7 @@ export const HelpBubbleTooltipRoot = withRootProvider<HelpBubbleTooltipRootProps
41
41
  defaultProps: {
42
42
  placement: "top",
43
43
  gutter: 4, // TODO: get value from rootage spec
44
- overflowPadding: 16,
44
+ overflowPadding: 16, // TODO: get value from rootage spec
45
45
  arrowPadding: 14,
46
46
  },
47
47
  },