@seed-design/lynx-react 0.7.0 → 0.8.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 (245) hide show
  1. package/lib/components/Accordion/Accordion.jsx +2 -2
  2. package/lib/components/ActionButton/ActionButton.jsx +1 -1
  3. package/lib/components/AlertDialog/AlertDialog.d.ts +64 -0
  4. package/lib/components/AlertDialog/AlertDialog.d.ts.map +1 -0
  5. package/lib/components/AlertDialog/AlertDialog.jsx +138 -0
  6. package/lib/components/AlertDialog/AlertDialog.namespace.d.ts +2 -0
  7. package/lib/components/AlertDialog/AlertDialog.namespace.d.ts.map +1 -0
  8. package/lib/components/AlertDialog/AlertDialog.namespace.js +17 -0
  9. package/lib/components/AlertDialog/index.d.ts +3 -0
  10. package/lib/components/AlertDialog/index.d.ts.map +1 -0
  11. package/lib/components/AppBar/AppBar.d.ts +14 -1
  12. package/lib/components/AppBar/AppBar.d.ts.map +1 -1
  13. package/lib/components/AppBar/AppBar.jsx +46 -10
  14. package/lib/components/AppBar/AppBar.namespace.d.ts +1 -1
  15. package/lib/components/AppBar/AppBar.namespace.d.ts.map +1 -1
  16. package/lib/components/AppBar/index.d.ts +1 -1
  17. package/lib/components/AppBar/index.d.ts.map +1 -1
  18. package/lib/components/AttachmentDisplay/AttachmentDisplay.d.ts +182 -0
  19. package/lib/components/AttachmentDisplay/AttachmentDisplay.d.ts.map +1 -0
  20. package/lib/components/AttachmentDisplay/AttachmentDisplay.jsx +444 -0
  21. package/lib/components/AttachmentDisplay/index.d.ts +2 -0
  22. package/lib/components/AttachmentDisplay/index.d.ts.map +1 -0
  23. package/lib/components/AttachmentInput/AttachmentInput.d.ts +179 -0
  24. package/lib/components/AttachmentInput/AttachmentInput.d.ts.map +1 -0
  25. package/lib/components/AttachmentInput/AttachmentInput.jsx +520 -0
  26. package/lib/components/AttachmentInput/index.d.ts +2 -0
  27. package/lib/components/AttachmentInput/index.d.ts.map +1 -0
  28. package/lib/components/BottomSheet/BottomSheet.d.ts +1 -1
  29. package/lib/components/BottomSheet/BottomSheet.d.ts.map +1 -1
  30. package/lib/components/BottomSheet/BottomSheet.jsx +1 -7
  31. package/lib/components/Callout/Callout.jsx +2 -2
  32. package/lib/components/Checkbox/Checkbox.jsx +2 -2
  33. package/lib/components/Chip/Chip.jsx +2 -2
  34. package/lib/components/ChipTabs/ChipTabs.d.ts +41 -0
  35. package/lib/components/ChipTabs/ChipTabs.d.ts.map +1 -0
  36. package/lib/components/ChipTabs/ChipTabs.jsx +39 -0
  37. package/lib/components/ChipTabs/ChipTabs.namespace.d.ts +2 -0
  38. package/lib/components/ChipTabs/ChipTabs.namespace.d.ts.map +1 -0
  39. package/lib/components/ChipTabs/ChipTabs.namespace.js +13 -0
  40. package/lib/components/ChipTabs/index.d.ts +3 -0
  41. package/lib/components/ChipTabs/index.d.ts.map +1 -0
  42. package/lib/components/ContextualFloatingButton/ContextualFloatingButton.d.ts +18 -0
  43. package/lib/components/ContextualFloatingButton/ContextualFloatingButton.d.ts.map +1 -0
  44. package/lib/components/ContextualFloatingButton/ContextualFloatingButton.jsx +113 -0
  45. package/lib/components/ContextualFloatingButton/index.d.ts +2 -0
  46. package/lib/components/ContextualFloatingButton/index.d.ts.map +1 -0
  47. package/lib/components/Dialog/Dialog.d.ts +87 -0
  48. package/lib/components/Dialog/Dialog.d.ts.map +1 -0
  49. package/lib/components/Dialog/Dialog.jsx +147 -0
  50. package/lib/components/Dialog/Dialog.namespace.d.ts +2 -0
  51. package/lib/components/Dialog/Dialog.namespace.d.ts.map +1 -0
  52. package/lib/components/Dialog/Dialog.namespace.js +18 -0
  53. package/lib/components/Dialog/index.d.ts +3 -0
  54. package/lib/components/Dialog/index.d.ts.map +1 -0
  55. package/lib/components/FloatingActionButton/FloatingActionButton.d.ts +23 -0
  56. package/lib/components/FloatingActionButton/FloatingActionButton.d.ts.map +1 -0
  57. package/lib/components/FloatingActionButton/FloatingActionButton.jsx +76 -0
  58. package/lib/components/FloatingActionButton/FloatingActionButton.namespace.d.ts +2 -0
  59. package/lib/components/FloatingActionButton/FloatingActionButton.namespace.d.ts.map +1 -0
  60. package/lib/components/FloatingActionButton/FloatingActionButton.namespace.js +10 -0
  61. package/lib/components/FloatingActionButton/index.d.ts +3 -0
  62. package/lib/components/FloatingActionButton/index.d.ts.map +1 -0
  63. package/lib/components/HelpBubble/HelpBubble.d.ts +67 -0
  64. package/lib/components/HelpBubble/HelpBubble.d.ts.map +1 -0
  65. package/lib/components/HelpBubble/HelpBubble.jsx +600 -0
  66. package/lib/components/HelpBubble/HelpBubble.namespace.d.ts +2 -0
  67. package/lib/components/HelpBubble/HelpBubble.namespace.d.ts.map +1 -0
  68. package/lib/components/HelpBubble/HelpBubble.namespace.js +18 -0
  69. package/lib/components/HelpBubble/index.d.ts +3 -0
  70. package/lib/components/HelpBubble/index.d.ts.map +1 -0
  71. package/lib/components/Icon/Icon.d.ts +1 -0
  72. package/lib/components/Icon/Icon.d.ts.map +1 -1
  73. package/lib/components/Icon/Icon.jsx +3 -2
  74. package/lib/components/IdentityPlaceholder/IdentityPlaceholder.d.ts +28 -0
  75. package/lib/components/IdentityPlaceholder/IdentityPlaceholder.d.ts.map +1 -0
  76. package/lib/components/IdentityPlaceholder/IdentityPlaceholder.jsx +37 -0
  77. package/lib/components/IdentityPlaceholder/IdentityPlaceholder.namespace.d.ts +2 -0
  78. package/lib/components/IdentityPlaceholder/IdentityPlaceholder.namespace.d.ts.map +1 -0
  79. package/lib/components/IdentityPlaceholder/IdentityPlaceholder.namespace.js +9 -0
  80. package/lib/components/IdentityPlaceholder/identity-placeholder-business.js +4 -0
  81. package/lib/components/IdentityPlaceholder/identity-placeholder-person.js +4 -0
  82. package/lib/components/IdentityPlaceholder/index.d.ts +3 -0
  83. package/lib/components/IdentityPlaceholder/index.d.ts.map +1 -0
  84. package/lib/components/InputButton/InputButton.d.ts +2 -0
  85. package/lib/components/InputButton/InputButton.d.ts.map +1 -1
  86. package/lib/components/InputButton/InputButton.jsx +40 -8
  87. package/lib/components/List/List.d.ts +1 -1
  88. package/lib/components/List/List.d.ts.map +1 -1
  89. package/lib/components/List/List.jsx +26 -12
  90. package/lib/components/Menu/Menu.d.ts.map +1 -1
  91. package/lib/components/Menu/Menu.jsx +15 -5
  92. package/lib/components/PageBanner/PageBanner.d.ts +3 -0
  93. package/lib/components/PageBanner/PageBanner.d.ts.map +1 -1
  94. package/lib/components/PageBanner/PageBanner.jsx +49 -11
  95. package/lib/components/QuantityPicker/QuantityPicker.d.ts +53 -0
  96. package/lib/components/QuantityPicker/QuantityPicker.d.ts.map +1 -0
  97. package/lib/components/QuantityPicker/QuantityPicker.jsx +282 -0
  98. package/lib/components/QuantityPicker/QuantityPicker.namespace.d.ts +2 -0
  99. package/lib/components/QuantityPicker/QuantityPicker.namespace.d.ts.map +1 -0
  100. package/lib/components/QuantityPicker/QuantityPicker.namespace.js +11 -0
  101. package/lib/components/QuantityPicker/index.d.ts +3 -0
  102. package/lib/components/QuantityPicker/index.d.ts.map +1 -0
  103. package/lib/components/RadioGroup/RadioGroup.jsx +2 -2
  104. package/lib/components/ReactionButton/ReactionButton.d.ts +1 -1
  105. package/lib/components/ReactionButton/ReactionButton.d.ts.map +1 -1
  106. package/lib/components/ReactionButton/ReactionButton.jsx +22 -13
  107. package/lib/components/ScrollFog/ScrollFog.d.ts +41 -0
  108. package/lib/components/ScrollFog/ScrollFog.d.ts.map +1 -0
  109. package/lib/components/ScrollFog/ScrollFog.jsx +65 -0
  110. package/lib/components/ScrollFog/index.d.ts +2 -0
  111. package/lib/components/ScrollFog/index.d.ts.map +1 -0
  112. package/lib/components/SegmentedControl/SegmentedControl.jsx +2 -2
  113. package/lib/components/Select/Select.d.ts +112 -0
  114. package/lib/components/Select/Select.d.ts.map +1 -0
  115. package/lib/components/Select/Select.jsx +885 -0
  116. package/lib/components/Select/Select.namespace.d.ts +2 -0
  117. package/lib/components/Select/Select.namespace.d.ts.map +1 -0
  118. package/lib/components/Select/Select.namespace.js +23 -0
  119. package/lib/components/Select/index.d.ts +3 -0
  120. package/lib/components/Select/index.d.ts.map +1 -0
  121. package/lib/components/Skeleton/Skeleton.d.ts +15 -0
  122. package/lib/components/Skeleton/Skeleton.d.ts.map +1 -0
  123. package/lib/components/Skeleton/Skeleton.jsx +18 -0
  124. package/lib/components/Skeleton/index.d.ts +2 -0
  125. package/lib/components/Skeleton/index.d.ts.map +1 -0
  126. package/lib/components/Slider/Slider.d.ts +101 -0
  127. package/lib/components/Slider/Slider.d.ts.map +1 -0
  128. package/lib/components/Slider/Slider.jsx +573 -0
  129. package/lib/components/Slider/Slider.namespace.d.ts +2 -0
  130. package/lib/components/Slider/Slider.namespace.d.ts.map +1 -0
  131. package/lib/components/Slider/Slider.namespace.js +19 -0
  132. package/lib/components/Slider/Slider.utils.d.ts +19 -0
  133. package/lib/components/Slider/Slider.utils.d.ts.map +1 -0
  134. package/lib/components/Slider/Slider.utils.js +106 -0
  135. package/lib/components/Slider/index.d.ts +3 -0
  136. package/lib/components/Slider/index.d.ts.map +1 -0
  137. package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.d.ts.map +1 -1
  138. package/lib/components/SwipeableMenuSheet/SwipeableMenuSheet.jsx +22 -8
  139. package/lib/components/Switch/Switch.d.ts.map +1 -1
  140. package/lib/components/Switch/Switch.jsx +5 -3
  141. package/lib/components/Tabs/Tabs.d.ts +34 -2
  142. package/lib/components/Tabs/Tabs.d.ts.map +1 -1
  143. package/lib/components/Tabs/Tabs.jsx +186 -56
  144. package/lib/components/Tabs/Tabs.utils.d.ts +14 -1
  145. package/lib/components/Tabs/Tabs.utils.d.ts.map +1 -1
  146. package/lib/components/Tabs/Tabs.utils.js +24 -3
  147. package/lib/components/Tabs/index.d.ts +1 -1
  148. package/lib/components/Tabs/index.d.ts.map +1 -1
  149. package/lib/components/index.d.ts +14 -0
  150. package/lib/components/index.d.ts.map +1 -1
  151. package/lib/hooks/useControllableState.d.ts +1 -14
  152. package/lib/hooks/useControllableState.d.ts.map +1 -1
  153. package/lib/hooks/usePressTap.d.ts +1 -27
  154. package/lib/hooks/usePressTap.d.ts.map +1 -1
  155. package/lib/hooks/useScaleFeedback.d.ts +1 -1
  156. package/lib/hooks/useScaleFeedback.js +1 -1
  157. package/lib/index.js +29 -6
  158. package/lib/{hooks/useControllableState.js → packages/lynx-react-headless/use-controllable-state/lib/index.js} +2 -3
  159. package/lib/{hooks/usePressTap.js → packages/lynx-react-headless/use-press-tap/lib/index.js} +13 -10
  160. package/lib/types.d.ts +1 -0
  161. package/lib/types.d.ts.map +1 -1
  162. package/package.json +9 -5
  163. package/src/components/ActionButton/ActionButton.test.tsx +7 -7
  164. package/src/components/AlertDialog/AlertDialog.namespace.ts +22 -0
  165. package/src/components/AlertDialog/AlertDialog.test.tsx +226 -0
  166. package/src/components/AlertDialog/AlertDialog.tsx +374 -0
  167. package/src/components/AlertDialog/index.ts +24 -0
  168. package/src/components/AppBar/AppBar.namespace.ts +1 -0
  169. package/src/components/AppBar/AppBar.test.tsx +257 -0
  170. package/src/components/AppBar/AppBar.tsx +109 -14
  171. package/src/components/AppBar/index.ts +1 -0
  172. package/src/components/AttachmentDisplay/AttachmentDisplay.tsx +886 -0
  173. package/src/components/AttachmentDisplay/index.ts +48 -0
  174. package/src/components/AttachmentInput/AttachmentInput.tsx +1001 -0
  175. package/src/components/AttachmentInput/index.ts +49 -0
  176. package/src/components/BottomSheet/BottomSheet.test.tsx +22 -7
  177. package/src/components/BottomSheet/BottomSheet.tsx +1 -19
  178. package/src/components/ChipTabs/ChipTabs.namespace.ts +14 -0
  179. package/src/components/ChipTabs/ChipTabs.tsx +119 -0
  180. package/src/components/ChipTabs/index.ts +16 -0
  181. package/src/components/ContextualFloatingButton/ContextualFloatingButton.test.tsx +63 -0
  182. package/src/components/ContextualFloatingButton/ContextualFloatingButton.tsx +232 -0
  183. package/src/components/ContextualFloatingButton/index.ts +4 -0
  184. package/src/components/Dialog/Dialog.namespace.ts +24 -0
  185. package/src/components/Dialog/Dialog.test.tsx +172 -0
  186. package/src/components/Dialog/Dialog.tsx +373 -0
  187. package/src/components/Dialog/index.ts +26 -0
  188. package/src/components/FloatingActionButton/FloatingActionButton.namespace.ts +8 -0
  189. package/src/components/FloatingActionButton/FloatingActionButton.test.tsx +59 -0
  190. package/src/components/FloatingActionButton/FloatingActionButton.tsx +207 -0
  191. package/src/components/FloatingActionButton/index.ts +10 -0
  192. package/src/components/HelpBubble/HelpBubble.namespace.ts +24 -0
  193. package/src/components/HelpBubble/HelpBubble.tsx +998 -0
  194. package/src/components/HelpBubble/index.ts +26 -0
  195. package/src/components/Icon/Icon.test.tsx +57 -5
  196. package/src/components/Icon/Icon.tsx +16 -2
  197. package/src/components/IdentityPlaceholder/IdentityPlaceholder.namespace.ts +6 -0
  198. package/src/components/IdentityPlaceholder/IdentityPlaceholder.tsx +103 -0
  199. package/src/components/IdentityPlaceholder/assets.d.ts +4 -0
  200. package/src/components/IdentityPlaceholder/identity-placeholder-business.webp +0 -0
  201. package/src/components/IdentityPlaceholder/identity-placeholder-person.webp +0 -0
  202. package/src/components/IdentityPlaceholder/index.ts +8 -0
  203. package/src/components/InputButton/InputButton.test.tsx +128 -1
  204. package/src/components/InputButton/InputButton.tsx +60 -9
  205. package/src/components/List/List.test.tsx +54 -2
  206. package/src/components/List/List.tsx +43 -10
  207. package/src/components/Menu/Menu.tsx +14 -4
  208. package/src/components/Menu/__tests__/Menu.test.tsx +34 -0
  209. package/src/components/PageBanner/PageBanner.test.tsx +110 -3
  210. package/src/components/PageBanner/PageBanner.tsx +83 -19
  211. package/src/components/QuantityPicker/QuantityPicker.namespace.ts +10 -0
  212. package/src/components/QuantityPicker/QuantityPicker.test.tsx +235 -0
  213. package/src/components/QuantityPicker/QuantityPicker.tsx +605 -0
  214. package/src/components/QuantityPicker/index.ts +14 -0
  215. package/src/components/ReactionButton/ReactionButton.feedback.test.tsx +50 -0
  216. package/src/components/ReactionButton/ReactionButton.test.tsx +6 -4
  217. package/src/components/ReactionButton/ReactionButton.tsx +20 -12
  218. package/src/components/ScrollFog/ScrollFog.test.tsx +222 -0
  219. package/src/components/ScrollFog/ScrollFog.tsx +172 -0
  220. package/src/components/ScrollFog/index.ts +1 -0
  221. package/src/components/Select/Select.namespace.ts +34 -0
  222. package/src/components/Select/Select.test.tsx +297 -0
  223. package/src/components/Select/Select.tsx +1483 -0
  224. package/src/components/Select/index.ts +39 -0
  225. package/src/components/Skeleton/Skeleton.test.tsx +64 -0
  226. package/src/components/Skeleton/Skeleton.tsx +45 -0
  227. package/src/components/Skeleton/index.ts +1 -0
  228. package/src/components/Slider/Slider.namespace.ts +26 -0
  229. package/src/components/Slider/Slider.test.tsx +260 -0
  230. package/src/components/Slider/Slider.tsx +897 -0
  231. package/src/components/Slider/Slider.utils.ts +167 -0
  232. package/src/components/Slider/index.ts +30 -0
  233. package/src/components/SwipeableMenuSheet/SwipeableMenuSheet.test.tsx +21 -1
  234. package/src/components/SwipeableMenuSheet/SwipeableMenuSheet.tsx +30 -7
  235. package/src/components/Switch/Switch.tsx +14 -13
  236. package/src/components/Tabs/Tabs.test.tsx +218 -1
  237. package/src/components/Tabs/Tabs.tsx +346 -75
  238. package/src/components/Tabs/Tabs.utils.ts +51 -1
  239. package/src/components/Tabs/index.ts +17 -1
  240. package/src/components/index.ts +14 -0
  241. package/src/hooks/useControllableState.ts +1 -43
  242. package/src/hooks/usePressTap.test.ts +23 -11
  243. package/src/hooks/usePressTap.ts +1 -60
  244. package/src/hooks/useScaleFeedback.ts +1 -1
  245. package/src/types.ts +1 -0
@@ -17,9 +17,11 @@ import type {
17
17
  } from "../../types";
18
18
  import { createSlotRecipeContext } from "../../utils/create-slot-recipe-context";
19
19
  import { Icon } from "../Icon";
20
+ import { IconSlotProvider } from "../Icon/Icon";
20
21
  import { AppBarProvider, useAppBarContext } from "./context";
21
22
  import { getLayoutWidth, getMainLayoutStyle, useAppBar } from "./useAppBar";
22
23
  import { mergeProps } from "../../utils/merge-props";
24
+ import { useScaleFeedback } from "../../hooks/useScaleFeedback";
23
25
 
24
26
  type AppBarClassNames = ReturnType<typeof appBar>;
25
27
  type AppBarMainClassNames = ReturnType<typeof appBarMain>;
@@ -48,6 +50,66 @@ function useAppBarMainClassNames(consumer: string): AppBarMainClassNames {
48
50
  }
49
51
  }
50
52
 
53
+ /**
54
+ * 아이콘 버튼의 bleed 보정 방향. `leading`은 왼쪽, `trailing`은 오른쪽, `both`는 양쪽.
55
+ */
56
+ export type AppBarEdge = "leading" | "trailing" | "both";
57
+
58
+ const AppBarEdgeContext = React.createContext<AppBarEdge | undefined>(undefined);
59
+
60
+ /** Fragments and arrays do not create layout boxes; retain their keys and nesting. */
61
+ function countEdgeChildren(children: React.ReactNode): number {
62
+ if (children == null || children === "" || typeof children === "boolean") return 0;
63
+ if (Array.isArray(children))
64
+ return children.reduce((count, child) => count + countEdgeChildren(child), 0);
65
+ if (
66
+ React.isValidElement<{ children?: React.ReactNode }>(children) &&
67
+ children.type === React.Fragment
68
+ ) {
69
+ return countEdgeChildren(children.props.children);
70
+ }
71
+ return 1;
72
+ }
73
+
74
+ // Lynx lacks :first-child/:last-child; pass both slot edges through Context to match
75
+ // web spacing without shrinking the icon button's touch target.
76
+ function provideEdgeToChildren(children: React.ReactNode): React.ReactNode {
77
+ const lastIndex = countEdgeChildren(children) - 1;
78
+ let index = 0;
79
+
80
+ function visit(child: React.ReactNode): React.ReactNode {
81
+ if (child == null || child === "" || typeof child === "boolean") return child;
82
+ if (Array.isArray(child)) return child.map(visit);
83
+ if (
84
+ React.isValidElement<{ children?: React.ReactNode }>(child) &&
85
+ child.type === React.Fragment
86
+ ) {
87
+ return React.cloneElement(child, { children: visit(child.props.children) });
88
+ }
89
+
90
+ const childIndex = index++;
91
+ const edge =
92
+ childIndex === 0
93
+ ? childIndex === lastIndex
94
+ ? "both"
95
+ : "leading"
96
+ : childIndex === lastIndex
97
+ ? "trailing"
98
+ : undefined;
99
+ if (!React.isValidElement(child)) return child;
100
+ // Native boxes and custom slots own their layout; do not pass an automatic edge into them.
101
+ const automaticEdge =
102
+ typeof child.type !== "string" && child.type !== AppBarSlot ? edge : undefined;
103
+ return (
104
+ <AppBarEdgeContext.Provider key={child.key} value={automaticEdge}>
105
+ {child}
106
+ </AppBarEdgeContext.Provider>
107
+ );
108
+ }
109
+
110
+ return visit(children);
111
+ }
112
+
51
113
  ////////////////////////////////////////////////////////////////////////////////////
52
114
 
53
115
  export interface AppBarRootProps extends AppBarVariantProps, LynxStyledElementProps {}
@@ -113,7 +175,7 @@ export const AppBarLeft = React.forwardRef<unknown, AppBarLeftProps>((props, ref
113
175
  )}
114
176
  className={clsx(classNames.left, className)}
115
177
  >
116
- {children}
178
+ {provideEdgeToChildren(children)}
117
179
  </view>
118
180
  );
119
181
  });
@@ -148,7 +210,7 @@ export const AppBarRight = React.forwardRef<unknown, AppBarRightProps>((props, r
148
210
  )}
149
211
  className={clsx(classNames.right, className)}
150
212
  >
151
- {children}
213
+ {provideEdgeToChildren(children)}
152
214
  </view>
153
215
  );
154
216
  });
@@ -232,11 +294,18 @@ AppBarSubtitle.displayName = "AppBarSubtitle";
232
294
 
233
295
  ////////////////////////////////////////////////////////////////////////////////////
234
296
 
235
- export interface AppBarIconButtonProps extends LynxElementProps, LynxPressableProps {
297
+ export interface AppBarIconButtonProps
298
+ extends Omit<LynxElementProps, "flatten">,
299
+ LynxPressableProps {
236
300
  icon?: React.ReactElement<LynxIconElementProps>;
237
301
  "accessibility-label"?: LynxViewProps["accessibility-label"];
238
302
  "accessibility-element"?: LynxViewProps["accessibility-element"];
239
303
  "accessibility-traits"?: LynxViewProps["accessibility-traits"];
304
+ /**
305
+ * 슬롯의 첫·마지막 자식이 아이콘 버튼이면 해당 방향을, 유일한 자식이면 양쪽을 자동 보정한다.
306
+ * 명시하면 `AppBarLeft` / `AppBarRight`에서 감지한 자동 보정 방향을 덮어쓴다.
307
+ */
308
+ edge?: AppBarEdge;
240
309
  }
241
310
 
242
311
  export const AppBarIconButton = React.forwardRef<unknown, AppBarIconButtonProps>((props, ref) => {
@@ -244,12 +313,16 @@ export const AppBarIconButton = React.forwardRef<unknown, AppBarIconButtonProps>
244
313
  children,
245
314
  className,
246
315
  icon,
316
+ edge,
247
317
  "accessibility-element": accessibilityElement = true,
248
318
  "accessibility-label": accessibilityLabel,
249
319
  "accessibility-traits": accessibilityTraits = "button",
250
320
  ...nativeProps
251
321
  } = props;
252
322
  const classNames = useAppBarClassNames("AppBarIconButton");
323
+ const { scaleFeedbackTriggerProps, scaleFeedbackTargetProps } = useScaleFeedback();
324
+ const automaticEdge = React.useContext(AppBarEdgeContext);
325
+ const resolvedEdge = edge ?? automaticEdge;
253
326
 
254
327
  if (process.env.NODE_ENV !== "production" && accessibilityElement && !accessibilityLabel) {
255
328
  console.warn("AppBarIconButton requires `accessibility-label` for accessibility.");
@@ -257,31 +330,53 @@ export const AppBarIconButton = React.forwardRef<unknown, AppBarIconButtonProps>
257
330
 
258
331
  return (
259
332
  <view
260
- {...mergeProps(ref ? { ref: ref as LynxViewRef } : {}, nativeProps)}
333
+ {...mergeProps(
334
+ ref ? { ref: ref as LynxViewRef } : {},
335
+ scaleFeedbackTriggerProps,
336
+ scaleFeedbackTargetProps,
337
+ nativeProps,
338
+ )}
339
+ flatten={false}
261
340
  accessibility-element={accessibilityElement}
262
341
  accessibility-label={accessibilityLabel}
263
342
  accessibility-traits={accessibilityTraits}
264
- className={clsx(classNames.iconButton, className)}
343
+ className={clsx(
344
+ classNames.iconButton,
345
+ (resolvedEdge === "leading" || resolvedEdge === "both") &&
346
+ "seed-app-bar__icon-button-edge-leading",
347
+ (resolvedEdge === "trailing" || resolvedEdge === "both") &&
348
+ "seed-app-bar__icon-button-edge-trailing",
349
+ className,
350
+ )}
265
351
  >
266
- {icon ? <Icon className={classNames.icon} icon={icon} /> : children}
352
+ <IconSlotProvider value={{ classNames: { icon: classNames.icon }, deps: [classNames.icon] }}>
353
+ {icon ? <Icon icon={icon} /> : children}
354
+ </IconSlotProvider>
267
355
  </view>
268
356
  );
269
357
  });
270
358
  AppBarIconButton.displayName = "AppBarIconButton";
271
359
 
272
- export interface AppBarSlotProps extends LynxStyledElementProps {}
360
+ export interface AppBarSlotProps extends LynxStyledElementProps {
361
+ /**
362
+ * @internal 커스텀 슬롯에서는 bleed 보정을 적용하지 않는다. 전달된 값은 native 속성에서 제외한다.
363
+ */
364
+ edge?: AppBarEdge;
365
+ }
273
366
 
274
367
  export const AppBarSlot = React.forwardRef<unknown, AppBarSlotProps>((props, ref) => {
275
- const { children, className, ...nativeProps } = props;
368
+ const { children, className, edge: _edge, ...nativeProps } = props;
276
369
  const classNames = useAppBarClassNames("AppBarSlot");
277
370
 
278
371
  return (
279
- <view
280
- {...mergeProps(ref ? { ref: ref as LynxViewRef } : {}, nativeProps)}
281
- className={clsx(classNames.custom, className)}
282
- >
283
- {children}
284
- </view>
372
+ <AppBarEdgeContext.Provider value={undefined}>
373
+ <view
374
+ {...mergeProps(ref ? { ref: ref as LynxViewRef } : {}, nativeProps)}
375
+ className={clsx(classNames.custom, className)}
376
+ >
377
+ {children}
378
+ </view>
379
+ </AppBarEdgeContext.Provider>
285
380
  );
286
381
  });
287
382
  AppBarSlot.displayName = "AppBarSlot";
@@ -7,6 +7,7 @@ export {
7
7
  AppBarSlot,
8
8
  AppBarSubtitle,
9
9
  AppBarTitle,
10
+ type AppBarEdge,
10
11
  type AppBarIconButtonProps,
11
12
  type AppBarLeftProps,
12
13
  type AppBarMainProps,