@seed-design/react 2.3.0 → 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 (177) 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/ToggleButton/ToggleButton.cjs +5 -2
  97. package/lib/components/ToggleButton/ToggleButton.d.ts.map +1 -1
  98. package/lib/components/ToggleButton/ToggleButton.js +5 -2
  99. package/lib/components/WheelPicker/WheelPicker.cjs +94 -0
  100. package/lib/components/WheelPicker/WheelPicker.d.ts +56 -0
  101. package/lib/components/WheelPicker/WheelPicker.d.ts.map +1 -0
  102. package/lib/components/WheelPicker/WheelPicker.js +89 -0
  103. package/lib/components/WheelPicker/WheelPicker.namespace.cjs +15 -0
  104. package/lib/components/WheelPicker/WheelPicker.namespace.d.ts +2 -0
  105. package/lib/components/WheelPicker/WheelPicker.namespace.d.ts.map +1 -0
  106. package/lib/components/WheelPicker/WheelPicker.namespace.js +10 -0
  107. package/lib/components/WheelPicker/WheelPicker.test.d.ts +2 -0
  108. package/lib/components/WheelPicker/WheelPicker.test.d.ts.map +1 -0
  109. package/lib/components/WheelPicker/index.cjs +12 -0
  110. package/lib/components/WheelPicker/index.d.ts +3 -0
  111. package/lib/components/WheelPicker/index.d.ts.map +1 -0
  112. package/lib/components/WheelPicker/index.js +3 -0
  113. package/lib/components/index.cjs +11 -0
  114. package/lib/components/index.d.ts +1 -0
  115. package/lib/components/index.d.ts.map +1 -1
  116. package/lib/components/index.js +3 -1
  117. package/lib/components/private/WheelPicker.cjs +2 -3
  118. package/lib/components/private/WheelPicker.d.ts +3 -3
  119. package/lib/components/private/WheelPicker.d.ts.map +1 -1
  120. package/lib/components/private/WheelPicker.js +3 -3
  121. package/lib/components/private/useDismissible.d.ts +123 -123
  122. package/lib/index.cjs +14 -0
  123. package/lib/index.d.ts +2 -0
  124. package/lib/index.d.ts.map +1 -1
  125. package/lib/index.js +4 -1
  126. package/lib/utils/elementSizeVars.cjs +76 -0
  127. package/lib/utils/elementSizeVars.d.ts +15 -0
  128. package/lib/utils/elementSizeVars.d.ts.map +1 -0
  129. package/lib/utils/elementSizeVars.js +74 -0
  130. package/lib/utils/scaleFeedback.cjs +99 -0
  131. package/lib/utils/scaleFeedback.d.ts +58 -0
  132. package/lib/utils/scaleFeedback.d.ts.map +1 -0
  133. package/lib/utils/scaleFeedback.js +94 -0
  134. package/package.json +4 -4
  135. package/src/components/ActionButton/ActionButton.tsx +5 -2
  136. package/src/components/AttachmentDisplay/AttachmentDisplayItem.tsx +14 -9
  137. package/src/components/AttachmentDisplay/AttachmentDisplayTrigger.tsx +7 -4
  138. package/src/components/AttachmentInput/AttachmentInputItem.tsx +14 -9
  139. package/src/components/AttachmentInput/AttachmentInputTrigger.tsx +3 -3
  140. package/src/components/BottomSheet/BottomSheet.tsx +5 -3
  141. package/src/components/Callout/Callout.tsx +9 -4
  142. package/src/components/Checkbox/Checkbox.tsx +3 -3
  143. package/src/components/Chip/Chip.tsx +2 -1
  144. package/src/components/ChipTabs/ChipTabs.tsx +3 -3
  145. package/src/components/ContentDialog/ContentDialog.tsx +5 -3
  146. package/src/components/ContextualFloatingButton/ContextualFloatingButton.tsx +5 -2
  147. package/src/components/DatePicker/DatePicker.test.tsx +20 -0
  148. package/src/components/DatePicker/DatePicker.tsx +14 -2
  149. package/src/components/DatePicker/index.ts +2 -0
  150. package/src/components/FieldButton/FieldButton.tsx +6 -3
  151. package/src/components/FloatingActionButton/FloatingActionButton.tsx +4 -4
  152. package/src/components/HelpBubble/HelpBubble.tsx +7 -4
  153. package/src/components/HelpBubbleTooltip/HelpBubbleTooltip.tsx +1 -1
  154. package/src/components/ImageFrame/ImageFrame.tsx +8 -1
  155. package/src/components/MenuSheet/MenuSheet.tsx +6 -3
  156. package/src/components/PageBanner/PageBanner.tsx +5 -6
  157. package/src/components/QuantityPicker/QuantityPicker.tsx +8 -4
  158. package/src/components/RadioGroup/RadioGroup.tsx +7 -4
  159. package/src/components/ReactionButton/ReactionButton.tsx +5 -2
  160. package/src/components/ScrollFog/ScrollFog.test.tsx +13 -0
  161. package/src/components/ScrollFog/ScrollFog.tsx +5 -7
  162. package/src/components/SidePanel/SidePanel.tsx +5 -3
  163. package/src/components/Snackbar/Snackbar.tsx +6 -3
  164. package/src/components/SwipeableMenuSheet/SwipeableMenuSheet.tsx +7 -4
  165. package/src/components/Switch/Switch.tsx +3 -3
  166. package/src/components/Tabs/Tabs.tsx +3 -3
  167. package/src/components/ToggleButton/ToggleButton.tsx +5 -2
  168. package/src/components/WheelPicker/WheelPicker.namespace.ts +9 -0
  169. package/src/components/WheelPicker/WheelPicker.test.tsx +270 -0
  170. package/src/components/WheelPicker/WheelPicker.tsx +210 -0
  171. package/src/components/WheelPicker/index.ts +11 -0
  172. package/src/components/index.ts +1 -0
  173. package/src/components/private/WheelPicker.test.tsx +1 -0
  174. package/src/components/private/WheelPicker.tsx +6 -6
  175. package/src/index.ts +2 -0
  176. package/src/utils/elementSizeVars.tsx +112 -0
  177. package/src/utils/scaleFeedback.tsx +128 -0
@@ -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
  >
@@ -216,6 +216,26 @@ describe("DatePicker", () => {
216
216
  }
217
217
  });
218
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
+
219
239
  it("navigateToDate는 외부 포커스를 유지하고 오늘을 다음 tab 진입점으로 지정한다", () => {
220
240
  const actionsRef = React.createRef<DatePickerActions>();
221
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> & {
@@ -409,6 +418,7 @@ const DatePickerImplementation = React.forwardRef<HTMLDivElement, DatePickerImpl
409
418
  locale: _locale,
410
419
  weekStartsOn: _weekStartsOn,
411
420
  yearRange: _yearRange,
421
+ monthRange: _monthRange,
412
422
  constraints: _constraints,
413
423
  disabled: _disabled,
414
424
  readOnly: _readOnly,
@@ -554,10 +564,12 @@ export type {
554
564
  DatePickerConstraint,
555
565
  DatePickerConstraintContext,
556
566
  DatePickerDate,
567
+ DatePickerMonthRange,
557
568
  DatePickerMultipleProps,
558
569
  DatePickerRangeProps,
559
570
  DatePickerRangeValue,
560
571
  DatePickerSelectionMode,
561
572
  DatePickerSingleProps,
562
573
  DatePickerValue,
574
+ DatePickerYearMonth,
563
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
  },
@@ -14,8 +14,10 @@ import { imageFrameReactionButton } from "@seed-design/css/recipes/image-frame-r
14
14
  import { mergeProps } from "@seed-design/dom-utils";
15
15
  import { Image } from "@seed-design/react-image";
16
16
  import { Toggle as TogglePrimitive, useToggleContext } from "@seed-design/react-toggle";
17
+ import { useComposedRefs } from "@radix-ui/react-compose-refs";
17
18
  import clsx from "clsx";
18
19
  import * as React from "react";
20
+ import { useScaleFeedback } from "../../utils/scaleFeedback";
19
21
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
20
22
  import type { DistributiveOmit } from "../../utils/styled";
21
23
  import { AspectRatio, type AspectRatioProps } from "../AspectRatio/AspectRatio";
@@ -249,10 +251,15 @@ export const ImageFrameReactionButton = React.forwardRef<
249
251
  ImageFrameReactionButtonProps
250
252
  >(({ className, ...rest }, ref) => {
251
253
  const classNames = imageFrameReactionButton();
254
+ const { scaleFeedbackRef, scaleFeedbackClassName } = useScaleFeedback();
252
255
 
253
256
  return (
254
257
  <ImageFrameReactionButtonClassNamesProvider value={classNames}>
255
- <TogglePrimitive.Root ref={ref} className={clsx(classNames.root, className)} {...rest}>
258
+ <TogglePrimitive.Root
259
+ ref={useComposedRefs(scaleFeedbackRef, ref)}
260
+ className={clsx(classNames.root, scaleFeedbackClassName, className)}
261
+ {...rest}
262
+ >
256
263
  <ReactionButtonIcon />
257
264
  </TogglePrimitive.Root>
258
265
  </ImageFrameReactionButtonClassNamesProvider>
@@ -7,6 +7,7 @@ import {
7
7
  } from "@seed-design/css/recipes/menu-sheet-item";
8
8
  import * as React from "react";
9
9
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
10
+ import { withScaleFeedback } from "../../utils/scaleFeedback";
10
11
  import { createWithStateProps } from "../../utils/createWithStateProps";
11
12
  import clsx from "clsx";
12
13
 
@@ -319,7 +320,9 @@ export interface MenuSheetCloseButtonProps extends DialogPrimitive.CloseButtonPr
319
320
  /**
320
321
  * @deprecated Use `SwipeableMenuSheet` instead.
321
322
  */
322
- export const MenuSheetCloseButton = withContext<HTMLDivElement, MenuSheetCloseButtonProps>(
323
- DialogPrimitive.CloseButton,
324
- "closeButton",
323
+ export const MenuSheetCloseButton = withScaleFeedback(
324
+ withContext<HTMLDivElement, MenuSheetCloseButtonProps>(
325
+ DialogPrimitive.CloseButton,
326
+ "closeButton",
327
+ ),
325
328
  );
@@ -4,6 +4,7 @@ import { forwardRef } from "react";
4
4
  import { pageBanner, type PageBannerVariantProps } from "@seed-design/css/recipes/page-banner";
5
5
  import { Primitive, type PrimitiveProps } from "@seed-design/react-primitive";
6
6
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
7
+ import { withScaleFeedback } from "../../utils/scaleFeedback";
7
8
  import {
8
9
  DismissibleCloseButton,
9
10
  DismissibleRoot,
@@ -93,16 +94,14 @@ export interface PageBannerButtonProps
93
94
  extends PrimitiveProps,
94
95
  React.ButtonHTMLAttributes<HTMLButtonElement> {}
95
96
 
96
- export const PageBannerButton = withContext<HTMLButtonElement, PageBannerButtonProps>(
97
- Primitive.button,
98
- "button",
97
+ export const PageBannerButton = withScaleFeedback(
98
+ withContext<HTMLButtonElement, PageBannerButtonProps>(Primitive.button, "button"),
99
99
  );
100
100
 
101
101
  export interface PageBannerCloseButtonProps
102
102
  extends PrimitiveProps,
103
103
  React.ButtonHTMLAttributes<HTMLButtonElement> {}
104
104
 
105
- export const PageBannerCloseButton = withContext<HTMLButtonElement, PageBannerCloseButtonProps>(
106
- DismissibleCloseButton,
107
- "closeButton",
105
+ export const PageBannerCloseButton = withScaleFeedback(
106
+ withContext<HTMLButtonElement, PageBannerCloseButtonProps>(DismissibleCloseButton, "closeButton"),
108
107
  );