@olundot/ui 0.18.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,46 @@
1
1
  # @olundot/ui
2
2
 
3
+ ## 0.19.1
4
+
5
+ ### Patch Changes
6
+
7
+ - a1c795c: 오버레이 7종(Dialog·ConfirmDialog·FormModal·InfoModal·Sheet·SheetDrawer·ActionSheet)의 중복 코드를 내부 모듈로 모았습니다. 공개 API와 기본값은 그대로이고, 화면에 보이는 변화는 아래뿐입니다.
8
+
9
+ - **닫기 버튼 통일** — Dialog·Sheet의 `showCloseButton`, SheetDrawer, ActionSheet의 닫기 버튼이 모두 `IconButton` ghost md(32px, 터치 영역 44px)입니다. hover는 `--action-hover`이고, 접근 가능한 이름은 '닫기'(SheetDrawer·ActionSheet는 `closeLabel`)입니다. Sheet 닫기 버튼의 이름이 영어 'Close'에서 '닫기'로 바뀌었습니다. ActionSheet는 버튼이 28px에서 32px로 커져 설명이 없는 헤더가 4px 높아집니다. SheetDrawer 닫기 버튼의 `data-slot="sheet-drawer-close"`는 `data-slot="icon-button"`이 됩니다.
10
+ - **SheetDescription** 글자색이 `text-text-secondary`입니다.
11
+ - **Dialog 포커스 복귀** — `DialogTrigger` 없이 `open`만으로 연 `DialogContent`도 닫으면 연 요소로 포커스를 돌려줍니다. 닫을 때 포커스를 직접 옮기는 화면은 `onCloseAutoFocus`에서 `preventDefault()`를 부르면 지금처럼 동작합니다.
12
+ - **Sheet 쌓임** — Sheet 계열의 오버레이가 `z-modal` 층에 그려집니다. 다른 오버레이 위에서 연 Sheet가 그 오버레이를 어둡게 덮습니다.
13
+
14
+ ## 0.19.0
15
+
16
+ ### Minor Changes
17
+
18
+ - 42d2650: `Button`·`IconButton`에 새 축 `appearance`(`filled`·`outline`·`ghost`) × `tone`(`primary`·`neutral`·`danger`)을 추가했습니다. 옛 `variant`는 0.18과 똑같이 그려지고, 사용 중단 예정으로 표시됩니다. 0.20에서 삭제합니다.
19
+
20
+ - **쓸 수 있는 조합 다섯 개** — `filled` × `primary`·`neutral`·`danger`, `outline` × `neutral`, `ghost` × `neutral`. 나머지 네 조합은 타입 오류입니다. 새 축과 `variant`를 함께 줘도 타입 오류입니다.
21
+ - **두 컴포넌트가 같은 모양** — 같은 조합이면 `Button`과 `IconButton`의 색·테두리·hover가 같습니다. 크기는 아래 "크기 단계 하나"를 따릅니다.
22
+ - **기본값** — 아무것도 주지 않으면 지금과 같습니다(`Button` = `filled` + `primary`, `IconButton` = `ghost` + `neutral`). 한쪽만 주면 나머지를 채웁니다. `tone`이 없으면 `filled`는 `primary`, `outline`·`ghost`는 `neutral`입니다.
23
+ - **`IconButton` 글자** — `label="추가"` 또는 children으로 글자를 넣습니다. 둘을 함께 주면 타입 오류입니다. 글자가 있으면 `aria-label`은 필수가 아니고, 폭은 글자에 맞춥니다. 아이콘 위치는 `iconPosition="start" | "end"`(기본 `start`)입니다. 아이콘만일 때는 지금처럼 정사각형이고 누르는 영역은 44px입니다.
24
+ - **크기 단계 하나** — `appearance`나 `tone`을 준 `IconButton`은 `size`를 `Button`과 같은 5단계로 읽습니다: `xs` 28 · `sm` 30 · `md` 32 · `lg` 36 · `xl` 40(기본 `md`). 같은 `size`면 `Button`·글자 포함 `IconButton`·아이콘만 `IconButton`의 높이와 아이콘 크기·선 굵기가 같습니다(`xs` 14/1.75, `sm`·`md` 16/2, `lg`·`xl` 18/2). 아이콘만은 정사각형이고 누르는 영역은 사방 44px입니다.
25
+ - **옛 크기** — 축을 주지 않은 `IconButton`은 지금처럼 3단계 `sm` 28 · `md` 32 · `lg` 40으로 읽고 출력도 0.18과 같습니다. 새 축으로 옮길 때 `sm` → `xs`, `lg` → `xl`로 바꿉니다(`md`는 그대로). 축 없이 `xs`·`xl`을 주면 타입 오류입니다. 축 없이 글자를 넣으면 높이는 같은 높이의 `Button`(`xs`·`md`·`xl`)을 따릅니다.
26
+ - **옛 값 → 새 값**
27
+ - `Button` `variant`: `primary`·`default` → `filled` + `primary` / `secondary`·`outline`·`subtle` → `outline` + `neutral` / `ghost` → `ghost` + `neutral` / `danger`·`destructive`·`emergency` → `filled` + `danger` / `link` → 대체 없음(링크 컴포넌트 예정)
28
+ - `Button` `size="icon"`·`"icon-xs"` → 새 축 `IconButton` `lg`·`md`(36·32, 높이 그대로), `leadingIcon`·`trailingIcon` → 글자 포함 `IconButton`
29
+ - `IconButton` `variant`: `ghost` → `ghost` + `neutral` / `outline` → `outline` + `neutral` / `subtle` → `filled` + `neutral` / `danger` → `filled` + `danger`. `size`는 `sm` → `xs`, `lg` → `xl`
30
+ - **옮길 때 모양이 바뀌는 곳** — `IconButton` `variant="danger"`(연한 빨강)는 `filled` + `danger`(진한 빨강 채움)로 바뀝니다. `IconButton` `variant="outline"`은 `outline` + `neutral`로 옮기면 아이콘 색이 `text-secondary`에서 `foreground`로, hover 테두리가 `--border-strong`에서 `--border`로 바뀝니다(`Button` `secondary`와 같은 모양). 옛 값을 그대로 쓰는 동안에는 바뀌지 않습니다.
31
+ - `ButtonProps`는 interface에서 type(union)으로 바뀌었습니다. `interface X extends ButtonProps`로 확장하던 곳은 `type X = ButtonProps & { … }`로 바꿔야 합니다.
32
+
33
+ ### Patch Changes
34
+
35
+ - 2e965c7: OlunSymbol now has two optical sizes. Above 32px it follows the brand concept sheet (thicker ring, smaller dot clearly apart from the ring); at 32px and below it keeps the current icon geometry.
36
+
37
+ OlunLogo drops the wordmark period when the symbol is shown, so the lime orbit dot is not repeated. The wordmark alone still reads `OLUN.`.
38
+
39
+ - 11d8450: Tabs: 세로 탭 활성 표시가 구분선 위에 겹치도록 수정하고, `sm` 미만에서는 가로 탭 규칙으로 표시합니다. line 탭의 focus-visible ring이 목록 overflow에 잘리지 않도록 ring을 안쪽으로 그립니다.
40
+ - Updated dependencies [89a385a]
41
+ - Updated dependencies [2fa68e9]
42
+ - @olundot/tokens@0.17.0
43
+
3
44
  ## 0.18.0
4
45
 
5
46
  ### Minor Changes
package/dist/index.d.ts CHANGED
@@ -31,26 +31,60 @@ declare function useOlunTheme(): UseOlunThemeValue;
31
31
 
32
32
  type SurfaceLevel = "surface" | "canvas" | "raised";
33
33
 
34
- declare const buttonVariants: (props?: ({
35
- variant?: "default" | "primary" | "outline" | "ghost" | "danger" | "emergency" | "subtle" | "destructive" | "secondary" | "link" | null | undefined;
36
- size?: "default" | "xs" | "sm" | "md" | "lg" | "xl" | "icon" | "icon-xs" | null | undefined;
34
+ type ActionAppearance = 'filled' | 'outline' | 'ghost';
35
+ type ActionTone = 'primary' | 'neutral' | 'danger';
36
+ type FilledDefaultActionStyle = {
37
+ appearance?: 'filled';
38
+ tone?: ActionTone;
39
+ } | {
40
+ appearance: 'outline' | 'ghost';
41
+ tone?: 'neutral';
42
+ };
43
+ type GhostDefaultActionStyle = {
44
+ appearance: 'filled';
45
+ tone?: ActionTone;
46
+ } | {
47
+ appearance: 'outline' | 'ghost';
48
+ tone?: 'neutral';
49
+ } | {
50
+ appearance?: never;
51
+ tone: 'neutral';
52
+ };
53
+
54
+ declare const buttonCva: (props?: ({
55
+ size?: "default" | "md" | "xs" | "sm" | "lg" | "xl" | "icon" | "icon-xs" | null | undefined;
56
+ appearance?: "filled" | "outline" | "ghost" | null | undefined;
57
+ tone?: "primary" | "neutral" | "danger" | null | undefined;
58
+ variant?: "default" | "outline" | "ghost" | "primary" | "danger" | "emergency" | "subtle" | "destructive" | "secondary" | "link" | null | undefined;
37
59
  } & class_variance_authority_types.ClassProp) | undefined) => string;
60
+ type ButtonVariantsOptions = Parameters<typeof buttonCva>[0];
61
+ declare function buttonVariants(options?: ButtonVariantsOptions): string;
38
62
  type ButtonVariant = NonNullable<VariantProps<typeof buttonVariants>['variant']>;
39
63
  type ButtonSize = NonNullable<VariantProps<typeof buttonVariants>['size']>;
40
- interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
64
+ type ButtonStyleProps = (FilledDefaultActionStyle & {
41
65
  /**
42
- * Action hierarchy: `primary` (the one main decision) · `secondary` (every supporting
43
- * action) · `ghost` (icon-only chrome — prefer IconButton) · `danger` (destructive).
44
- *
45
- * `outline` and `subtle` are deprecated — use `secondary`. They will be removed in the
46
- * next breaking release.
66
+ * @deprecated Use `appearance` × `tone` instead. Removed in 0.20.
67
+ */
68
+ variant?: never;
69
+ }) | {
70
+ /**
71
+ * @deprecated Use `appearance` × `tone`: `primary`/`default` → filled + primary ·
72
+ * `secondary`/`outline`/`subtle` → outline + neutral · `ghost` → ghost + neutral ·
73
+ * `danger`/`destructive`/`emergency` → filled + danger · `link` → no Button replacement
74
+ * (a link component is planned). Removed in 0.20.
47
75
  */
48
- variant?: VariantProps<typeof buttonVariants>['variant'];
76
+ variant?: ButtonVariant | null;
77
+ };
78
+ type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & ButtonStyleProps & {
79
+ /** `icon`·`icon-xs` are deprecated — use IconButton (`lg`·`md`). */
80
+ size?: ButtonSize | null;
49
81
  asChild?: boolean;
82
+ /** @deprecated Use IconButton with `label` (or children). Removed in 0.20. */
50
83
  leadingIcon?: LucideIcon;
84
+ /** @deprecated Use IconButton with `label` and `iconPosition="end"`. Removed in 0.20. */
51
85
  trailingIcon?: LucideIcon;
52
86
  loading?: boolean;
53
- }
87
+ };
54
88
  declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
55
89
 
56
90
  type CopyButtonProps = Omit<ButtonProps, 'children' | 'leadingIcon' | 'loading' | 'size' | 'trailingIcon' | 'variant'> & {
@@ -62,7 +96,7 @@ type CopyButtonProps = Omit<ButtonProps, 'children' | 'leadingIcon' | 'loading'
62
96
  variant?: ButtonVariant;
63
97
  duration?: number;
64
98
  };
65
- declare const CopyButton: React.ForwardRefExoticComponent<Omit<ButtonProps, "size" | "variant" | "leadingIcon" | "trailingIcon" | "loading" | "children"> & {
99
+ declare const CopyButton: React.ForwardRefExoticComponent<Omit<ButtonProps, "size" | "variant" | "children" | "leadingIcon" | "trailingIcon" | "loading"> & {
66
100
  value: string;
67
101
  label?: React.ReactNode;
68
102
  copiedLabel?: React.ReactNode;
@@ -73,13 +107,13 @@ declare const CopyButton: React.ForwardRefExoticComponent<Omit<ButtonProps, "siz
73
107
  } & React.RefAttributes<HTMLButtonElement>>;
74
108
 
75
109
  declare const inputVariants: (props?: ({
76
- size?: "sm" | "md" | "lg" | null | undefined;
110
+ size?: "md" | "sm" | "lg" | null | undefined;
77
111
  fullWidth?: boolean | null | undefined;
78
112
  surface?: SurfaceLevel | null | undefined;
79
113
  } & class_variance_authority_types.ClassProp) | undefined) => string;
80
114
  declare const inputMessageVariants: (props?: ({
81
115
  state?: "default" | "error" | "success" | null | undefined;
82
- size?: "sm" | "md" | "lg" | null | undefined;
116
+ size?: "md" | "sm" | "lg" | null | undefined;
83
117
  } & class_variance_authority_types.ClassProp) | undefined) => string;
84
118
  type InputState = NonNullable<VariantProps<typeof inputMessageVariants>["state"]>;
85
119
  /** Canonical size type (0.2.0+). Use `size` prop with these values. */
@@ -169,7 +203,7 @@ interface InlineAlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'childre
169
203
  declare const InlineAlert: React.ForwardRefExoticComponent<InlineAlertProps & React.RefAttributes<HTMLDivElement>>;
170
204
 
171
205
  declare const textareaVariants: (props?: ({
172
- size?: "sm" | "md" | "lg" | null | undefined;
206
+ size?: "md" | "sm" | "lg" | null | undefined;
173
207
  fullWidth?: boolean | null | undefined;
174
208
  surface?: SurfaceLevel | null | undefined;
175
209
  } & class_variance_authority_types.ClassProp) | undefined) => string;
@@ -223,14 +257,14 @@ interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaEl
223
257
  declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
224
258
 
225
259
  declare const selectVariants: (props?: ({
226
- size?: "sm" | "md" | "lg" | null | undefined;
260
+ size?: "md" | "sm" | "lg" | null | undefined;
227
261
  fullWidth?: boolean | null | undefined;
228
262
  appearance?: "inline" | "field" | null | undefined;
229
263
  surface?: SurfaceLevel | null | undefined;
230
264
  } & class_variance_authority_types.ClassProp) | undefined) => string;
231
265
  declare const selectMessageVariants: (props?: ({
232
266
  state?: "default" | "error" | "success" | null | undefined;
233
- size?: "sm" | "md" | "lg" | null | undefined;
267
+ size?: "md" | "sm" | "lg" | null | undefined;
234
268
  } & class_variance_authority_types.ClassProp) | undefined) => string;
235
269
  type SelectState = NonNullable<VariantProps<typeof selectMessageVariants>["state"]>;
236
270
  /** Canonical size type (0.2.0+). Use `size` prop with these values. */
@@ -657,7 +691,7 @@ declare const FormLayout: React.ForwardRefExoticComponent<FormLayoutProps & Reac
657
691
  * Pure CSS, so SSR and hydration render the same tree at every width (no matchMedia swap).
658
692
  */
659
693
  type DialogMobilePresentation = "center" | "sheet";
660
- declare const Dialog: React.FC<Dialog$1.DialogProps>;
694
+ declare function Dialog({ modal, ...props }: React.ComponentProps<typeof Dialog$1.Root>): react_jsx_runtime.JSX.Element;
661
695
  declare const DialogTrigger: React.ForwardRefExoticComponent<Dialog$1.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
662
696
  declare const DialogPortal: React.FC<Dialog$1.DialogPortalProps>;
663
697
  declare const DialogClose: React.ForwardRefExoticComponent<Dialog$1.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
@@ -1168,7 +1202,7 @@ interface StatusBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
1168
1202
  declare const StatusBadge: React.ForwardRefExoticComponent<StatusBadgeProps & React.RefAttributes<HTMLSpanElement>>;
1169
1203
 
1170
1204
  declare const notificationBadgeVariants: (props?: ({
1171
- size?: "sm" | "md" | null | undefined;
1205
+ size?: "md" | "sm" | null | undefined;
1172
1206
  placement?: "none" | "inline" | "corner" | null | undefined;
1173
1207
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1174
1208
  type NotificationBadgeSize = NonNullable<VariantProps<typeof notificationBadgeVariants>['size']>;
@@ -1181,13 +1215,13 @@ declare const NotificationBadge: React.ForwardRefExoticComponent<NotificationBad
1181
1215
 
1182
1216
  declare const chipVariants: (props?: ({
1183
1217
  variant?: "filter" | "choice" | "removable" | "status-filter" | null | undefined;
1184
- tone?: "accent" | "danger" | "success" | "warning" | "neutral" | "muted" | null | undefined;
1185
- size?: "sm" | "md" | "lg" | null | undefined;
1218
+ tone?: "accent" | "neutral" | "danger" | "success" | "warning" | "muted" | null | undefined;
1219
+ size?: "md" | "sm" | "lg" | null | undefined;
1186
1220
  pressed?: boolean | null | undefined;
1187
1221
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1188
1222
  declare const chipCountVariants: (props?: ({
1189
- tone?: "accent" | "danger" | "success" | "warning" | "neutral" | "muted" | null | undefined;
1190
- size?: "sm" | "md" | "lg" | null | undefined;
1223
+ tone?: "accent" | "neutral" | "danger" | "success" | "warning" | "muted" | null | undefined;
1224
+ size?: "md" | "sm" | "lg" | null | undefined;
1191
1225
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1192
1226
  type ChipVariant = NonNullable<VariantProps<typeof chipVariants>["variant"]>;
1193
1227
  type ChipTone = NonNullable<VariantProps<typeof chipVariants>["tone"]>;
@@ -1201,7 +1235,7 @@ interface ChipProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>,
1201
1235
  declare const Chip: React.ForwardRefExoticComponent<ChipProps & React.RefAttributes<HTMLButtonElement>>;
1202
1236
 
1203
1237
  declare const emptyStateBaseVariants: (props?: ({
1204
- size?: "sm" | "md" | "lg" | null | undefined;
1238
+ size?: "md" | "sm" | "lg" | null | undefined;
1205
1239
  bordered?: boolean | null | undefined;
1206
1240
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1207
1241
  type EmptyStateTone = "neutral" | "muted" | "raised";
@@ -1212,7 +1246,7 @@ interface EmptyStateVariantOptions extends VariantProps<typeof emptyStateBaseVar
1212
1246
  }
1213
1247
  declare function emptyStateVariants({ size, tone, surface, bordered, className, }?: EmptyStateVariantOptions): string;
1214
1248
  declare const emptyStateIconVariants: (props?: ({
1215
- size?: "sm" | "md" | "lg" | null | undefined;
1249
+ size?: "md" | "sm" | "lg" | null | undefined;
1216
1250
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1217
1251
  type EmptyStateSize = NonNullable<VariantProps<typeof emptyStateBaseVariants>["size"]>;
1218
1252
  interface EmptyStateProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title">, VariantProps<typeof emptyStateBaseVariants> {
@@ -1231,7 +1265,7 @@ interface EmptyStateProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "ti
1231
1265
  declare const EmptyState: React.ForwardRefExoticComponent<EmptyStateProps & React.RefAttributes<HTMLDivElement>>;
1232
1266
 
1233
1267
  declare const errorStateVariants: (props?: ({
1234
- size?: "sm" | "md" | "lg" | null | undefined;
1268
+ size?: "md" | "sm" | "lg" | null | undefined;
1235
1269
  surface?: SurfaceLevel | null | undefined;
1236
1270
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1237
1271
  interface ErrorStateProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title">, VariantProps<typeof errorStateVariants> {
@@ -1251,7 +1285,7 @@ declare const skeletonVariants: (props?: ({
1251
1285
  shape?: "text" | "block" | "circle" | null | undefined;
1252
1286
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1253
1287
  declare const spinnerVariants: (props?: ({
1254
- size?: "sm" | "md" | "lg" | 16 | 24 | 32 | null | undefined;
1288
+ size?: "md" | "sm" | "lg" | 16 | 24 | 32 | null | undefined;
1255
1289
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1256
1290
  interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof skeletonVariants> {
1257
1291
  }
@@ -1283,16 +1317,29 @@ interface SpinnerProps extends React.HTMLAttributes<HTMLSpanElement> {
1283
1317
  }
1284
1318
  declare const Spinner: React.ForwardRefExoticComponent<SpinnerProps & React.RefAttributes<HTMLSpanElement>>;
1285
1319
 
1286
- declare const iconButtonVariants: (props?: ({
1287
- variant?: "outline" | "ghost" | "danger" | "subtle" | null | undefined;
1288
- size?: "sm" | "md" | "lg" | null | undefined;
1320
+ declare const iconButtonCva: (props?: ({
1321
+ size?: "md" | "sm" | "lg" | null | undefined;
1289
1322
  pressed?: boolean | null | undefined;
1323
+ appearance?: "filled" | "outline" | "ghost" | null | undefined;
1324
+ tone?: "primary" | "neutral" | "danger" | null | undefined;
1325
+ variant?: "outline" | "ghost" | "danger" | "subtle" | null | undefined;
1290
1326
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1327
+ type IconButtonAxisSize = "xs" | "sm" | "md" | "lg" | "xl";
1328
+ type IconButtonCvaOptions = NonNullable<Parameters<typeof iconButtonCva>[0]>;
1329
+ type IconButtonVariantsOptions = (IconButtonCvaOptions & {
1330
+ appearance?: null;
1331
+ tone?: null;
1332
+ }) | (Omit<IconButtonCvaOptions, "size"> & {
1333
+ appearance?: ActionAppearance | null;
1334
+ tone?: ActionTone | null;
1335
+ size?: IconButtonAxisSize | null;
1336
+ });
1337
+ declare function iconButtonVariants(options?: IconButtonVariantsOptions): string;
1291
1338
  declare const iconButtonBadgeVariants: (props?: ({
1292
1339
  tone?: "error" | "info" | null | undefined;
1293
1340
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1294
- type IconButtonVariant = NonNullable<VariantProps<typeof iconButtonVariants>["variant"]>;
1295
- type IconButtonSize = NonNullable<VariantProps<typeof iconButtonVariants>["size"]>;
1341
+ type IconButtonVariant = NonNullable<VariantProps<typeof iconButtonCva>["variant"]>;
1342
+ type IconButtonSize = NonNullable<VariantProps<typeof iconButtonCva>["size"]>;
1296
1343
  type IconButtonBadgeTone = NonNullable<VariantProps<typeof iconButtonBadgeVariants>["tone"]>;
1297
1344
  type IconButtonIcon = React.ComponentType<React.SVGProps<SVGSVGElement> & {
1298
1345
  size?: number | string;
@@ -1305,11 +1352,47 @@ type IconButtonAccessibleName = {
1305
1352
  "aria-label"?: string;
1306
1353
  "aria-labelledby": string;
1307
1354
  };
1308
- type IconButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "aria-label" | "aria-labelledby" | "children" | "color"> & Omit<VariantProps<typeof iconButtonVariants>, "pressed"> & IconButtonAccessibleName & {
1355
+ type IconButtonOptionalName = {
1356
+ "aria-label"?: string;
1357
+ "aria-labelledby"?: string;
1358
+ };
1359
+ type IconButtonContent = (IconButtonAccessibleName & {
1360
+ label?: never;
1361
+ children?: never;
1362
+ }) | (IconButtonOptionalName & {
1363
+ label: React.ReactNode;
1364
+ children?: never;
1365
+ }) | (IconButtonOptionalName & {
1366
+ children: React.ReactNode;
1367
+ label?: never;
1368
+ });
1369
+ type IconButtonStyleProps = (GhostDefaultActionStyle & {
1370
+ /**
1371
+ * @deprecated Use `appearance` × `tone` instead. Removed in 0.20.
1372
+ */
1373
+ variant?: never;
1374
+ /** Button's scale: `xs` 28 · `sm` 30 · `md` 32 · `lg` 36 · `xl` 40. */
1375
+ size?: IconButtonAxisSize | null;
1376
+ }) | {
1377
+ /**
1378
+ * @deprecated Use `appearance` × `tone`: `ghost` → ghost + neutral · `outline` →
1379
+ * outline + neutral · `subtle` → filled + neutral · `danger` → filled + danger
1380
+ * (solid red; `danger` keeps its light red until removal). When moving to the new axes,
1381
+ * `size` follows Button's scale: `sm` → `xs`, `lg` → `xl` (`md` stays). Removed in 0.20.
1382
+ */
1383
+ variant?: IconButtonVariant | null;
1384
+ appearance?: never;
1385
+ tone?: never;
1386
+ /** Legacy scale without `appearance`/`tone`: `sm` 28 · `md` 32 · `lg` 40. */
1387
+ size?: IconButtonSize | null;
1388
+ };
1389
+ type IconButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "aria-label" | "aria-labelledby" | "children" | "color"> & IconButtonStyleProps & IconButtonContent & {
1309
1390
  icon: IconButtonIcon;
1310
1391
  pressed?: boolean;
1311
1392
  badge?: React.ReactNode;
1312
1393
  badgeTone?: IconButtonBadgeTone;
1394
+ /** Icon side when the button has text. */
1395
+ iconPosition?: "start" | "end";
1313
1396
  };
1314
1397
  declare const IconButton: React.ForwardRefExoticComponent<IconButtonProps & React.RefAttributes<HTMLButtonElement>>;
1315
1398
 
@@ -1518,10 +1601,10 @@ interface OTPFieldProps extends Omit<React.FieldsetHTMLAttributes<HTMLFieldSetEl
1518
1601
  declare const OTPField: React.ForwardRefExoticComponent<OTPFieldProps & React.RefAttributes<HTMLFieldSetElement>>;
1519
1602
 
1520
1603
  declare const searchFieldVariants: (props?: ({
1521
- size?: "sm" | "md" | "lg" | null | undefined;
1604
+ size?: "md" | "sm" | "lg" | null | undefined;
1522
1605
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1523
1606
  declare const searchFieldInputVariants: (props?: ({
1524
- size?: "sm" | "md" | "lg" | null | undefined;
1607
+ size?: "md" | "sm" | "lg" | null | undefined;
1525
1608
  hasClear?: boolean | null | undefined;
1526
1609
  surface?: SurfaceLevel | null | undefined;
1527
1610
  } & class_variance_authority_types.ClassProp) | undefined) => string;
@@ -1545,7 +1628,7 @@ declare const checkboxVariants: (props?: ({
1545
1628
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1546
1629
  declare const checkboxRootVariants: (props?: class_variance_authority_types.ClassProp | undefined) => string;
1547
1630
  declare const checkboxBoxVariants: (props?: ({
1548
- size?: "sm" | "md" | null | undefined;
1631
+ size?: "md" | "sm" | null | undefined;
1549
1632
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1550
1633
  declare const checkboxGroupItemVariants: (props?: ({
1551
1634
  appearance?: "plain" | "card" | null | undefined;
@@ -1699,8 +1782,9 @@ declare function TreeView<T extends TreeNode>({ nodes, selectedId, selectionAria
1699
1782
  /**
1700
1783
  * OLUN 브랜드 로고.
1701
1784
  *
1702
- * - symbol: O 원형 테두리 + 우하단 accent-pop 작은 circle
1785
+ * - symbol: O 원형 테두리 + 우하단 accent-pop 작은 circle (32px 초과/이하 두 비율)
1703
1786
  * - wordmark: "OLUN" + 마지막 "." 은 accent 색상
1787
+ * - 조합: symbol과 함께 쓰면 wordmark의 "."를 뺀다. 궤도 점은 symbol이 맡는다(점 두 개 경쟁 방지).
1704
1788
  *
1705
1789
  * 레퍼런스: apps/web/docs/wireframes/ref/shell-wireframe.html Topbar 브랜드 영역.
1706
1790
  */