@olundot/ui 0.1.0 → 0.2.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,107 @@
1
1
  # @olundot/ui
2
2
 
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 8e1b7bf: Form API 통합 (0.2.0) — Phase B 11 tasks.
8
+
9
+ **신규 컴포넌트 (additive):**
10
+
11
+ - `<Label>` primitive (Radix `react-label` 기반, `required` prop으로 `*` marker 자동, `formFieldLabelClassName` deprecated alias 1 cycle)
12
+ - `<Switch>` primitive (Radix `react-switch` 기반, `loading` state 포함 — spinner + aria-busy + 클릭 차단)
13
+ - `<RadioGroup>` 단순형 (Radix `react-radio-group` 기반, `RadioCardGroup` 카드형은 별도 유지)
14
+
15
+ **3 컴포넌트 API 확장 (additive — Input/Textarea/Select):**
16
+
17
+ - `size: "sm" | "md" | "lg"` 통일 prop (기존 `inputSize`/`textareaSize`/`selectSize`는 1 cycle deprecated alias)
18
+ - `fullWidth: boolean` (default `true` = 현행 동작 유지)
19
+ - `description?: ReactNode` 신규 슬롯 — 입력 전 hint (default state 시 노출, error/success 시 `message`로 swap)
20
+ - Select `appearance: "field" | "inline"` 별도 축 (selectVariant alias 1 cycle 유지 — `selectVariant="inline"` = `fullWidth={false} + appearance="inline"`)
21
+ - Select `clearable: boolean` + `clearLabel?: ReactNode` (내부 sentinel 처리, 사용처는 `value=""` 표준)
22
+
23
+ **Checkbox 확장 (additive):**
24
+
25
+ - `required: boolean` → label `*` marker 자동
26
+ - `error?: ReactNode` → description 자동 hide + role=alert + aria-invalid + aria-describedby
27
+
28
+ **FormField 책임 재정의 (visual change, API additive):**
29
+
30
+ - Function children (delegated mode): `controlProps`에 `description` + `message` + `state` forward. Input/Select/Textarea가 자체 slot 책임. FormField 자체 description/error 슬롯 미렌더.
31
+ - ReactNode children (raw legacy mode): FormField가 description/error 직접 렌더 (단순 native input fallback).
32
+
33
+ **Input/Textarea/Select 추가 fix (B1-B2 부수):**
34
+
35
+ - Input `disabled + state` 시각 우선순위 가드 추가 (textarea 정합)
36
+ - Input `readOnly + focus` ring 가드 추가 (textarea 정합)
37
+
38
+ **Migration:** `docs/migration/0.2.0-form-api.md` (deprecation timeline, grep checklist, visual regression checklist, before/after 코드 예제 포함).
39
+
40
+ **Caveat:**
41
+
42
+ - Input legacy `inputSize="sm"` (34px) → 신규 `size="md"` (38px, 보수 매핑 — 시각 회귀 방지)
43
+ - `selectVariant="inline"`은 `fullWidth={false}` 단독으로 완전 대체 불가 — `appearance="inline"` 별도 축 도입 (font-medium + min-w-[112px] + max-w-full 보존)
44
+ - FormField description 위치는 OLUN 단일 stack 패턴 (control 아래) — Input message slot과 일관 (GOV.UK 패턴 검토 후 거부)
45
+
46
+ **Visual/Layout changes (consumer 영향):**
47
+
48
+ - Checkbox 구조 재편 (option B): Root=box만, label 외부 sibling htmlFor (touch hit area 확장)
49
+ - Switch sizing arbitrary px (`h-[24px] w-[44px]`) — OLUN `--space-5/6` (40/48px) footgun 회피
50
+ - FormField label-group wrapper 추가 후 단일 stack 패턴으로 복귀 (description = control 아래, error 시 description 자동 hide)
51
+
52
+ - be77d2e: Popover primitive 신설 + Dialog/Tabs/Tooltip 시각 보정 (0.3.0)
53
+
54
+ **신규 컴포넌트:**
55
+
56
+ - `<Popover>` primitive — Radix Popover wrap. 6 export (Root/Trigger/Anchor/Content/Arrow/Close). Modal=false 기본, Tooltip과 달리 interactive content 허용.
57
+
58
+ **Chip cursor affordance fix (R13-1):**
59
+
60
+ - `variant=filter|choice|removable` → `cursor-pointer` (interactive 3종 명시)
61
+ - `variant=status-filter` → `cursor-default` (정적 표시 chip — 클릭 affordance 없음)
62
+ - 배경: Tailwind v4 preflight + site reset이 `<button>` cursor를 보장하지 않아 사용자 라이브 검증에서 filter toolbar cursor 누락 발견. variant level에서 강제.
63
+
64
+ **Visual fix:**
65
+
66
+ - Dialog: DialogHeader `space-y-1.5 → space-y-[var(--space-1)]` (6→8px), DialogTitle `leading-none → leading-[1.35]` (font-base 정합)
67
+ - **DialogContent default padding 48 → 32px** (`p-6` → `p-[var(--space-4)]`) — PR3 Round 5. cbt-lms FormModal/InfoModal/InviteResultDialog 모두 자체 `className` override 사용으로 영향 0.
68
+ - Tabs: tabsTriggerVariants active `font-semibold → font-bold` (위계 강화), TabsContent에 `flex flex-col items-stretch justify-start gap-4 min-h-8` 기본 (16px gap + 32px min-h, 부모 가운데 정렬 차단). site fixture에서 보정하던 className이 package default로 흡수됨.
69
+ - **Tabs Badge active wash 제거 (R14 active-state doctrine)** — 활성 marker는 trigger의 underline + bold + `text-accent-fg`로 단일화. Badge는 metadata 역할로 환원 (`text-inherit`만 유지해 활성 시 부모 text-accent-fg 자동 적용). 이유: 동일 selected state에 underline + wash 둘 다 적용하면 (1) 시각 noise 증가 (2) light에서 wash hue family가 opaque accent와 갈라져 부조화 (R14 회귀, snapshot 검증). doctrine = 컴포넌트당 selected marker 하나 + 모드별 단일 hue family. `docs/components/Authoring-Guide.md#active-state-시각-언어-single-marker-single-hue-family` 참조.
70
+
71
+ **Card (R14):**
72
+
73
+ - **`CardProse` composition helper 신설** — `CardContent` 안에 다중 `<p>`/`<ul>`/`<ol>`을 둘 때 sibling 간 spacing(`var(--space-2)`)과 body typography(`text-sm leading-relaxed text-foreground`)를 자동 적용. import 추가 (`@olundot/ui`에서 `CardProse` 새 export).
74
+ - **`CardDescription` semantic 명시화** — JSDoc으로 "single semantic paragraph 한정" 명시. multi-paragraph/list body는 `CardContent > CardProse`가 정본. 이유: `<p>` 안에 nested `<p>`/`<ul>`은 HTML invalid이며, fixture에서 multi-line copy가 description에 박혀 spread되던 ambiguity 차단.
75
+ - **Tooltip default mobile click 지원 (uncontrolled 한정)** — `enableTouch` prop (default `true`). 내부 uncontrolled state + `TooltipTrigger`의 `onClick` 가로채 toggle하는 방식으로 Radix native touch gap 보완. **`open` prop 전달(controlled) 시 click toggle은 자동 비활성화** — 외부 `onOpenChange`와의 이중 toggle 방지가 의도된 계약. controlled에서 mobile click이 필요하면 consumer가 trigger의 `onClick`에서 `onOpenChange(!open)` 직접 호출. `enableTouch={false}` opt-out으로 uncontrolled에서도 desktop hover-only 강제 가능.
76
+
77
+ **Consumer impact:**
78
+
79
+ > **Context**: cbt-lms 모노레포는 olun-app으로 재구성 예정이므로 본 PR의 visible change는 사용처 측 직접 마이그레이션 부담 없음. 이하 영향은 향후 외부 consumer(또는 새 olun-app)가 본 0.3.0을 채택할 때 알아야 할 사항.
80
+
81
+ - **Dialog Title** 시각 위계 회복 (의도하지 않은 줄간격 축소가 본 버전부터 정상화)
82
+ - **DialogContent padding 32px로 축소** — `<DialogContent>` 사용처에서 자체 `className`/`p-*` override 중이면 영향 없음. 순수 `<DialogContent>` 직접 사용처만 padding이 32px로 변경됨. (cbt-lms는 FormModal/InfoModal/InviteResultDialog 모두 override 확인됨)
83
+ - **Tabs label** active `font-bold` 위계 강화 — `font-semibold` 기대하던 사용처는 시각 미세 변화 발생
84
+ - **TabsContent default class 추가** — `flex flex-col items-stretch justify-start gap-4 min-h-8` 자동 적용. cbt-lms `InvitePageTabs` 등 className 없이 쓰던 사용처도 동일 기본 적용 (의도된 visual consistency). 짧은 content 부모 가운데 정렬 차단. 자체 override가 필요하면 className으로 후속 merge 가능.
85
+ - **Tabs Badge active wash 제거** — 기존 active wash(bg/border/text)에 의존한 사용처는 시각 변화 발생 (badge는 항상 neutral pill, 활성 시 text-accent-fg만 inherit). filled badge 강조가 필요했다면 별도 컴포넌트로 분리 권장.
86
+ - **Badge brand variant** — `--accent-bg-strong`이 R14에서 olive alpha 14%로 muted됨. light에서 vivid olive 대신 **subtle olive wash**로 보임 (cbt-lms `OrgBrandingPanel`/`HeroSection` 등 사용처에서 visible change — 강조도 ↓).
87
+ - **Card `CardProse` 신규 export + `CardDescription` semantic 명시** — multi-paragraph body 표현이 `CardContent > CardProse`로 일원화. 기존에 multi-line/multi-paragraph copy를 `CardDescription`에 박았던 사용처는 마이그레이션 필요 (예: cbt-lms는 차후 olun-app 재구성 시 일괄).
88
+ - **Tooltip**: 기존 hover/focus 동작 보존. uncontrolled + `enableTouch=true`(default)에서 click 이벤트가 추가로 toggle. controlled로 쓰던 기존 consumer는 영향 없음 (click 동작 자체가 추가되지 않음 — `onOpenChange`만 그대로 호출). controlled+mobile click 조합이 필요했다면 consumer trigger에 `onClick={() => onOpenChange(!open)}` 추가 필요.
89
+
90
+ > 새 olun-app 도입 시점에서 위 항목을 visual smoke check 대상으로 사용.
91
+
92
+ ### Patch Changes
93
+
94
+ - 8e1b7bf: Input: textarea와 정합되도록 두 가드 추가.
95
+
96
+ - **readOnly + focus 가드**: `read-only:focus:border-[var(--border-subtle)] read-only:focus:shadow-none` — readOnly Input이 focus될 때 olive ring이 들어와 편집 가능으로 오해되는 시각 회귀 차단. textarea.tsx:18에는 이미 적용된 가드.
97
+ - **disabled + state 시각 우선순위**: `disabled:data-[state=error/success]:border-subtle disabled:bg-disabled` 두 줄 — disabled가 error/success border/bg를 시각적으로 이김 (Authoring Guide의 상태 우선순위 정합). textarea.tsx:22-23, select.tsx:26-27에 이미 적용된 가드.
98
+
99
+ SSR markup 기반 회귀 테스트 7건 동반 추가 (input.test.tsx). API 변경 없음.
100
+
101
+ - Updated dependencies [d5116ea]
102
+ - Updated dependencies [be77d2e]
103
+ - @olundot/tokens@0.7.0
104
+
3
105
  ## 0.1.0
4
106
 
5
107
  ### Minor Changes
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@ import * as React from 'react';
4
4
  import { SVGProps } from 'react';
5
5
  import { VariantProps } from 'class-variance-authority';
6
6
  import { LucideIcon } from 'lucide-react';
7
- import { Select as Select$1, Tabs as Tabs$1, Dialog as Dialog$1, Separator as Separator$1, Avatar as Avatar$1, DropdownMenu as DropdownMenu$1, Tooltip as Tooltip$1, Checkbox as Checkbox$1, RadioGroup, ScrollArea as ScrollArea$1 } from 'radix-ui';
7
+ import { Select as Select$1, Label as Label$1, Switch as Switch$1, Tabs as Tabs$1, Dialog as Dialog$1, Separator as Separator$1, Avatar as Avatar$1, DropdownMenu as DropdownMenu$1, Tooltip as Tooltip$1, Popover as Popover$1, Checkbox as Checkbox$1, RadioGroup as RadioGroup$1, ScrollArea as ScrollArea$1 } from 'radix-ui';
8
8
  import * as react_jsx_runtime from 'react/jsx-runtime';
9
9
 
10
10
  declare function cn(...inputs: ClassValue[]): string;
@@ -43,16 +43,48 @@ declare const CopyButton: React.ForwardRefExoticComponent<Omit<ButtonProps, "var
43
43
  } & React.RefAttributes<HTMLButtonElement>>;
44
44
 
45
45
  declare const inputVariants: (props?: ({
46
- inputSize?: "xs" | "sm" | "md" | "lg" | "default" | null | undefined;
46
+ size?: "sm" | "md" | "lg" | null | undefined;
47
+ fullWidth?: boolean | null | undefined;
47
48
  } & class_variance_authority_types.ClassProp) | undefined) => string;
48
49
  declare const inputMessageVariants: (props?: ({
49
50
  state?: "error" | "success" | "default" | null | undefined;
50
- inputSize?: "xs" | "sm" | "md" | "lg" | "default" | null | undefined;
51
+ size?: "sm" | "md" | "lg" | null | undefined;
51
52
  } & class_variance_authority_types.ClassProp) | undefined) => string;
52
53
  type InputState = NonNullable<VariantProps<typeof inputMessageVariants>["state"]>;
54
+ /** Canonical size type (0.2.0+). Use `size` prop with these values. */
55
+ type InputSize = "sm" | "md" | "lg";
56
+ /**
57
+ * @deprecated Use `InputSize` instead.
58
+ * Legacy values: xs→sm, default→md, sm (was 34px — now maps to md for safety), md→md, lg→lg.
59
+ */
60
+ type InputSizeLegacy = "xs" | "sm" | "md" | "lg" | "default";
53
61
  interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size">, VariantProps<typeof inputVariants> {
62
+ /**
63
+ * Field height preset. Replaces `inputSize` (deprecated).
64
+ * - sm: 32px (compact toolbar/search)
65
+ * - md: 38px (default form field)
66
+ * - lg: 44px (prominent / WCAG 2.5.5 touch target)
67
+ */
68
+ size?: InputSize;
69
+ /**
70
+ * @deprecated Use `size` instead.
71
+ * xs → sm, default → md, sm → md, md → md, lg → lg.
72
+ * Will be removed in the next major version.
73
+ */
74
+ inputSize?: InputSizeLegacy;
75
+ /**
76
+ * Whether the field stretches to fill its container.
77
+ * - `true` (default): `w-full` — fills the container width (existing behavior).
78
+ * - `false`: `w-fit` — shrinks to the intrinsic content width.
79
+ */
80
+ fullWidth?: boolean;
54
81
  invalid?: boolean;
55
82
  label?: React.ReactNode;
83
+ /**
84
+ * Pre-input hint text (always visible in default state). Hidden when
85
+ * `state` is "error" or "success" — `message` takes over.
86
+ */
87
+ description?: React.ReactNode;
56
88
  message?: React.ReactNode;
57
89
  state?: InputState;
58
90
  }
@@ -104,16 +136,47 @@ declare const Alert: React.ForwardRefExoticComponent<AlertProps & React.RefAttri
104
136
  declare const InlineAlert: React.ForwardRefExoticComponent<InlineAlertProps & React.RefAttributes<HTMLDivElement>>;
105
137
 
106
138
  declare const textareaVariants: (props?: ({
107
- textareaSize?: "default" | "compact" | "large" | null | undefined;
139
+ size?: "sm" | "md" | "lg" | null | undefined;
140
+ fullWidth?: boolean | null | undefined;
108
141
  } & class_variance_authority_types.ClassProp) | undefined) => string;
109
142
  declare const textareaMessageVariants: (props?: ({
110
143
  state?: "error" | "success" | "default" | null | undefined;
111
144
  } & class_variance_authority_types.ClassProp) | undefined) => string;
112
145
  type TextareaState = NonNullable<VariantProps<typeof textareaMessageVariants>["state"]>;
113
- type TextareaSize = NonNullable<VariantProps<typeof textareaVariants>["textareaSize"]>;
146
+ /** Canonical size type (0.2.0+). Use `size` prop with these values. */
147
+ type TextareaSize = "sm" | "md" | "lg";
148
+ /**
149
+ * @deprecated Use `TextareaSize` instead.
150
+ * Legacy values: compact→sm, default→md, large→lg.
151
+ */
152
+ type TextareaSizeLegacy = "compact" | "default" | "large";
114
153
  interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, "children">, VariantProps<typeof textareaVariants> {
154
+ /**
155
+ * Min-height preset. Replaces `textareaSize` (deprecated). Font size is unchanged across all sizes.
156
+ * - sm: 72px (compact admin reason field)
157
+ * - md: 88px (default note / explanation field)
158
+ * - lg: 120px (long response, audit comment)
159
+ */
160
+ size?: TextareaSize;
161
+ /**
162
+ * @deprecated Use `size` instead.
163
+ * compact → sm, default → md, large → lg (height only, font unchanged).
164
+ * Will be removed in the next major version.
165
+ */
166
+ textareaSize?: TextareaSizeLegacy;
167
+ /**
168
+ * Whether the field stretches to fill its container.
169
+ * - `true` (default): `w-full` — fills the container width (existing behavior).
170
+ * - `false`: `w-fit` — shrinks to the intrinsic content width.
171
+ */
172
+ fullWidth?: boolean;
115
173
  invalid?: boolean;
116
174
  label?: React.ReactNode;
175
+ /**
176
+ * Pre-input hint text (always visible in default state). Hidden when
177
+ * `state` is "error" or "success" — `message` takes over.
178
+ */
179
+ description?: React.ReactNode;
117
180
  message?: React.ReactNode;
118
181
  state?: TextareaState;
119
182
  valueLength?: number;
@@ -121,24 +184,38 @@ interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaEl
121
184
  declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
122
185
 
123
186
  declare const selectVariants: (props?: ({
124
- selectVariant?: "inline" | "field" | null | undefined;
125
- selectSize?: "sm" | "md" | "lg" | null | undefined;
187
+ size?: "sm" | "md" | "lg" | null | undefined;
188
+ fullWidth?: boolean | null | undefined;
189
+ appearance?: "inline" | "field" | null | undefined;
126
190
  } & class_variance_authority_types.ClassProp) | undefined) => string;
127
191
  declare const selectMessageVariants: (props?: ({
128
192
  state?: "error" | "success" | "default" | null | undefined;
129
- selectSize?: "sm" | "md" | "lg" | null | undefined;
193
+ size?: "sm" | "md" | "lg" | null | undefined;
130
194
  } & class_variance_authority_types.ClassProp) | undefined) => string;
131
195
  type SelectState = NonNullable<VariantProps<typeof selectMessageVariants>["state"]>;
132
- type SelectSize = NonNullable<VariantProps<typeof selectVariants>["selectSize"]>;
196
+ /** Canonical size type (0.2.0+). Use `size` prop with these values. */
197
+ type SelectSize = "sm" | "md" | "lg";
198
+ /** Appearance axis for Select trigger (0.2.0+). */
199
+ type SelectAppearance = "field" | "inline";
200
+ /**
201
+ * @deprecated Use `fullWidth` + `appearance` props instead.
202
+ * Legacy variant alias: "field" = `fullWidth=true, appearance="field"`, "inline" = `fullWidth=false, appearance="inline"`.
203
+ */
204
+ type SelectVariant = "field" | "inline";
133
205
  interface SelectOption {
134
206
  value: string;
135
207
  label: React.ReactNode;
136
208
  disabled?: boolean;
137
209
  }
138
- interface SelectProps extends Omit<React.ComponentPropsWithoutRef<typeof Select$1.Root>, "children" | "dir">, VariantProps<typeof selectVariants> {
210
+ interface SelectProps extends Omit<React.ComponentPropsWithoutRef<typeof Select$1.Root>, "children" | "dir"> {
139
211
  className?: string;
140
212
  id?: string;
141
213
  label?: React.ReactNode;
214
+ /**
215
+ * Pre-input hint text (always visible in default state). Hidden when
216
+ * `state` is "error" or "success" — `message` takes over.
217
+ */
218
+ description?: React.ReactNode;
142
219
  message?: React.ReactNode;
143
220
  invalid?: boolean;
144
221
  state?: SelectState;
@@ -147,16 +224,65 @@ interface SelectProps extends Omit<React.ComponentPropsWithoutRef<typeof Select$
147
224
  "aria-label"?: React.AriaAttributes["aria-label"];
148
225
  "aria-describedby"?: string;
149
226
  "aria-invalid"?: React.AriaAttributes["aria-invalid"];
227
+ /**
228
+ * Field height preset.
229
+ * - sm: 32px (compact toolbar/filter)
230
+ * - md: 34px (default, matches Input density)
231
+ * - lg: 38px (prominent)
232
+ */
233
+ size?: SelectSize;
234
+ /**
235
+ * @deprecated Use `size` instead. Values are identical: sm→sm, md→md, lg→lg.
236
+ * Will be removed in the next major version.
237
+ */
238
+ selectSize?: SelectSize;
239
+ /**
240
+ * Whether the trigger stretches to fill its container.
241
+ * - `true` (default): `w-full` — fills the container width (existing behavior).
242
+ * - `false`: `w-fit` — shrinks to intrinsic content width.
243
+ */
244
+ fullWidth?: boolean;
245
+ /**
246
+ * Visual style axis for the select trigger.
247
+ * - `"field"` (default): standard form field look with no extra styles.
248
+ * - `"inline"`: compact contextual look — `min-w-[112px] max-w-full font-medium`.
249
+ * Combine with `fullWidth={false}` to replicate the legacy `selectVariant="inline"` behavior.
250
+ */
251
+ appearance?: SelectAppearance;
252
+ /**
253
+ * @deprecated Use `fullWidth={false} + appearance="inline"` instead.
254
+ * - `"inline"` → resolves to `fullWidth=false, appearance="inline"`.
255
+ * - `"field"` → resolves to `fullWidth=true, appearance="field"`.
256
+ * Will be removed in the next major version.
257
+ */
258
+ selectVariant?: SelectVariant;
259
+ /**
260
+ * When `true`, prepends a reset option to the dropdown. Selecting it fires
261
+ * `onValueChange("")` and restores the trigger placeholder. Default `false`.
262
+ *
263
+ * Eliminates the need for callers to manage a sentinel value themselves —
264
+ * use `value=""` + `onValueChange` with `clearable` for the standard pattern.
265
+ */
266
+ clearable?: boolean;
267
+ /**
268
+ * Custom label for the clear/reset option.
269
+ * Defaults to `placeholder` (so reset option text matches trigger placeholder — visual unity).
270
+ */
271
+ clearLabel?: React.ReactNode;
150
272
  }
151
273
  declare const Select: React.ForwardRefExoticComponent<SelectProps & React.RefAttributes<HTMLButtonElement>>;
152
274
 
153
275
  declare const formFieldVariants: (props?: ({
154
276
  layout?: "horizontal" | "vertical" | null | undefined;
155
277
  } & class_variance_authority_types.ClassProp) | undefined) => string;
278
+ /**
279
+ * @deprecated Use `<Label>` primitive instead. This className alias is kept for
280
+ * 1 cycle (0.2.0 → 0.3.0 removal) for raw label patterns.
281
+ */
156
282
  declare const formFieldLabelClassName = "text-[13px] font-medium leading-[1.35] text-[var(--text-secondary)]";
157
283
  declare const formFieldRequiredClassName = "ml-[2px] text-[var(--semantic-error,var(--error))]";
158
- declare const formFieldDescriptionClassName = "ml-[var(--space-1-5)] text-[12px] leading-[1.4] text-[var(--text-tertiary)]";
159
- declare const formFieldErrorClassName = "ml-[var(--space-1-5)] text-[12px] leading-[1.4] text-[var(--semantic-error,var(--error))]";
284
+ declare const formFieldDescriptionClassName = "text-[12px] leading-[1.4] text-[var(--text-tertiary)]";
285
+ declare const formFieldErrorClassName = "text-[12px] leading-[1.4] text-[var(--semantic-error,var(--error))]";
160
286
  declare const formFieldControlStackClassName = "flex min-w-0 flex-col gap-[var(--space-0-5)]";
161
287
  interface FormFieldProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
162
288
  label: React.ReactNode;
@@ -172,6 +298,14 @@ interface FormFieldRenderProps {
172
298
  id?: string;
173
299
  "aria-describedby"?: string;
174
300
  "aria-invalid"?: true;
301
+ /** Forwarded in delegated mode: required semantic (control's required attribute + aria-required). */
302
+ required?: boolean;
303
+ /** Forwarded in delegated mode: pre-input hint (visible when no error). */
304
+ description?: React.ReactNode;
305
+ /** Forwarded in delegated mode: error message (error takes priority over description). */
306
+ message?: React.ReactNode;
307
+ /** Forwarded in delegated mode: "error" when error is set, "default" otherwise. */
308
+ state?: "default" | "success" | "error";
175
309
  };
176
310
  descriptionId?: string;
177
311
  errorId?: string;
@@ -179,6 +313,38 @@ interface FormFieldRenderProps {
179
313
  }
180
314
  declare function FormField({ label, required, description, error, children, layout, id, className, ...props }: FormFieldProps): react_jsx_runtime.JSX.Element;
181
315
 
316
+ interface LabelProps extends React.ComponentPropsWithoutRef<typeof Label$1.Root> {
317
+ htmlFor?: string;
318
+ required?: boolean;
319
+ children: React.ReactNode;
320
+ className?: string;
321
+ }
322
+ /**
323
+ * Label primitive — wraps Radix UI Label for consistent typography and
324
+ * required-marker behaviour across form fields.
325
+ *
326
+ * Matches the visual spec of `formFieldLabelClassName` in form-field.tsx:
327
+ * 13 px / medium / 1.35 leading / --text-secondary.
328
+ *
329
+ * @example
330
+ * <Label htmlFor="email">이메일</Label>
331
+ * <Label htmlFor="sn" required>학번</Label>
332
+ */
333
+ declare const Label: React.ForwardRefExoticComponent<LabelProps & React.RefAttributes<HTMLLabelElement>>;
334
+
335
+ interface SwitchProps extends Omit<React.ComponentPropsWithoutRef<typeof Switch$1.Root>, "children"> {
336
+ label: React.ReactNode;
337
+ description?: React.ReactNode;
338
+ /** Marks the switch as required (passes aria-required). */
339
+ required?: boolean;
340
+ /**
341
+ * Loading state — shows spinner, disables interaction, sets aria-busy.
342
+ * Use for pending async preference changes (e.g., saving remote setting).
343
+ */
344
+ loading?: boolean;
345
+ }
346
+ declare const Switch: React.ForwardRefExoticComponent<SwitchProps & React.RefAttributes<HTMLButtonElement>>;
347
+
182
348
  type PermissionFallback = "hide" | "disabled" | React.ReactNode;
183
349
  interface PermissionScope {
184
350
  resourceId?: string;
@@ -270,8 +436,47 @@ interface CardProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<t
270
436
  declare const Card: React.ForwardRefExoticComponent<CardProps & React.RefAttributes<HTMLDivElement>>;
271
437
  declare const CardHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
272
438
  declare const CardTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLHeadingElement>>;
439
+ /**
440
+ * Card 제목 아래 한 줄 helper text (subtitle).
441
+ *
442
+ * Semantic: **single semantic paragraph만 허용**. 시각적으로 2-3줄 wrap은 OK이지만,
443
+ * 여러 단락/리스트/구조화 body는 `CardContent` + `CardProse`로 분리한다.
444
+ * 중첩 paragraph/list를 박으면 `<p>` 안에 `<p>`가 nest되어 HTML invalid.
445
+ *
446
+ * @example
447
+ * ```tsx
448
+ * <CardHeader>
449
+ * <CardTitle>강의 1주차</CardTitle>
450
+ * <CardDescription>32문항 · 45분</CardDescription>
451
+ * </CardHeader>
452
+ * ```
453
+ *
454
+ * @see CardProse — multi-paragraph body 전용 composition helper
455
+ */
273
456
  declare const CardDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
274
457
  declare const CardContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
458
+ /**
459
+ * Card body multi-paragraph 전용 composition helper.
460
+ *
461
+ * `CardContent` 안에 다중 `<p>` / `<ul>` / `<ol>`을 넣을 때 sibling 간 spacing과
462
+ * body typography를 자동 적용. `CardDescription`은 single semantic paragraph 한정,
463
+ * 그 외 body 구조는 `CardContent > CardProse` 패턴이 정본.
464
+ *
465
+ * @example
466
+ * ```tsx
467
+ * <CardContent>
468
+ * <CardProse>
469
+ * <p>첫 단락. 시험 응시 안내.</p>
470
+ * <p>둘째 단락. 점수 산정 기준.</p>
471
+ * <ul>
472
+ * <li>총 32문항</li>
473
+ * <li>제한 시간 45분</li>
474
+ * </ul>
475
+ * </CardProse>
476
+ * </CardContent>
477
+ * ```
478
+ */
479
+ declare const CardProse: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
275
480
  declare const CardFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
276
481
 
277
482
  interface PageHeaderProps extends Omit<React.HTMLAttributes<HTMLElement>, "title"> {
@@ -553,12 +758,51 @@ interface SheetDrawerProps {
553
758
  declare function SheetDrawer({ open, onOpenChange, title, description, children, expandHref, onExpand, expandLabel, footer, width, closeLabel, }: SheetDrawerProps): react_jsx_runtime.JSX.Element;
554
759
 
555
760
  declare function TooltipProvider({ delayDuration, ...props }: React.ComponentProps<typeof Tooltip$1.Provider>): react_jsx_runtime.JSX.Element;
556
- declare function Tooltip({ ...props }: React.ComponentProps<typeof Tooltip$1.Root>): react_jsx_runtime.JSX.Element;
557
- declare function TooltipTrigger({ ...props }: React.ComponentProps<typeof Tooltip$1.Trigger>): react_jsx_runtime.JSX.Element;
761
+ interface TooltipProps extends React.ComponentProps<typeof Tooltip$1.Root> {
762
+ /**
763
+ * Enable mobile click/touch trigger via internal state + onClick toggle on TooltipTrigger.
764
+ * Default `true` — hover/focus + click 모두 동작 (**uncontrolled에서만**).
765
+ *
766
+ * **Controlled (`open` prop 전달) 시 이 prop은 무시되어 click toggle이 비활성화된다.**
767
+ * 외부 state와의 이중 toggle/conflict 방지가 목적이다. controlled mobile click은
768
+ * consumer가 trigger의 `onClick`에서 `onOpenChange(!open)`을 직접 호출해야 한다.
769
+ *
770
+ * `false` — uncontrolled에서도 click toggle 끄고 desktop hover-only 강제.
771
+ */
772
+ enableTouch?: boolean;
773
+ }
774
+ declare function Tooltip({ open: controlledOpen, defaultOpen, onOpenChange: userOnOpenChange, enableTouch, children, ...props }: TooltipProps): react_jsx_runtime.JSX.Element;
775
+ declare function TooltipTrigger({ onClick: userOnClick, ...props }: React.ComponentProps<typeof Tooltip$1.Trigger>): react_jsx_runtime.JSX.Element;
558
776
  declare function TooltipContent({ className, sideOffset, children, ...props }: React.ComponentProps<typeof Tooltip$1.Content>): react_jsx_runtime.JSX.Element;
559
777
 
778
+ interface PopoverProps extends React.ComponentPropsWithoutRef<typeof Popover$1.Root> {
779
+ /**
780
+ * Whether the popover blocks background interaction.
781
+ * Default `false` — interactive content with non-blocking dismiss.
782
+ * Set `true` only for full focus trap (consider `<Dialog>` instead).
783
+ */
784
+ modal?: boolean;
785
+ }
786
+ declare function Popover({ modal, ...props }: PopoverProps): react_jsx_runtime.JSX.Element;
787
+ declare const PopoverTrigger: React.ForwardRefExoticComponent<Popover$1.PopoverTriggerProps & React.RefAttributes<HTMLButtonElement>>;
788
+ declare const PopoverAnchor: React.ForwardRefExoticComponent<Popover$1.PopoverAnchorProps & React.RefAttributes<HTMLDivElement>>;
789
+ declare const PopoverClose: React.ForwardRefExoticComponent<Popover$1.PopoverCloseProps & React.RefAttributes<HTMLButtonElement>>;
790
+ interface PopoverContentProps extends React.ComponentPropsWithoutRef<typeof Popover$1.Content> {
791
+ /**
792
+ * Whether to render the arrow pointing to the trigger.
793
+ * Default `false` — set to `true` for visual anchor cue.
794
+ */
795
+ showArrow?: boolean;
796
+ }
797
+ declare const PopoverContent: React.ForwardRefExoticComponent<PopoverContentProps & React.RefAttributes<HTMLDivElement>>;
798
+ /**
799
+ * Standalone Arrow export — for advanced anchor patterns that need
800
+ * arrow positioning outside of Content (rare). Prefer `<PopoverContent showArrow>`.
801
+ */
802
+ declare const PopoverArrow: React.ForwardRefExoticComponent<Omit<Popover$1.PopoverArrowProps & React.RefAttributes<SVGSVGElement>, "ref"> & React.RefAttributes<SVGSVGElement>>;
803
+
560
804
  declare const badgeVariants: (props?: ({
561
- variant?: "brand" | "neutral" | "status" | "semantic" | "pill" | null | undefined;
805
+ variant?: "brand" | "neutral" | "status" | "semantic" | "pill" | "vibrant" | null | undefined;
562
806
  tone?: "accent" | "warning" | "info" | "success" | "neutral" | "danger" | null | undefined;
563
807
  size?: "xs" | "sm" | "md" | null | undefined;
564
808
  } & class_variance_authority_types.ClassProp) | undefined) => string;
@@ -598,6 +842,12 @@ declare const statusBadgeDotVariants: (props?: class_variance_authority_types.Cl
598
842
  type StatusBadgeStatus = NonNullable<VariantProps<typeof statusBadgeVariants>["status"]>;
599
843
  interface StatusBadgeProps extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof statusBadgeVariants> {
600
844
  showDot?: boolean;
845
+ /**
846
+ * Dot pulse animation — default `true` (status indicator는 "살아있음" 시각 cue 필수,
847
+ * 플랫 dot는 AI slop 느낌). `motion-reduce` 환경에서는 자동 비활성.
848
+ * Opt-out 시 `pulse={false}`.
849
+ */
850
+ pulse?: boolean;
601
851
  }
602
852
  declare const StatusBadge: React.ForwardRefExoticComponent<StatusBadgeProps & React.RefAttributes<HTMLSpanElement>>;
603
853
 
@@ -614,7 +864,7 @@ interface NotificationBadgeProps extends Omit<React.HTMLAttributes<HTMLSpanEleme
614
864
  declare const NotificationBadge: React.ForwardRefExoticComponent<NotificationBadgeProps & React.RefAttributes<HTMLSpanElement>>;
615
865
 
616
866
  declare const chipVariants: (props?: ({
617
- variant?: "filter" | "choice" | "status-filter" | "removable" | null | undefined;
867
+ variant?: "filter" | "choice" | "removable" | "status-filter" | null | undefined;
618
868
  tone?: "muted" | "accent" | "warning" | "success" | "neutral" | "danger" | null | undefined;
619
869
  size?: "sm" | "md" | "lg" | null | undefined;
620
870
  pressed?: boolean | null | undefined;
@@ -668,7 +918,7 @@ declare const skeletonVariants: (props?: ({
668
918
  shape?: "text" | "block" | "circle" | null | undefined;
669
919
  } & class_variance_authority_types.ClassProp) | undefined) => string;
670
920
  declare const spinnerVariants: (props?: ({
671
- size?: 16 | 24 | 32 | null | undefined;
921
+ size?: "sm" | "md" | "lg" | 16 | 24 | 32 | null | undefined;
672
922
  } & class_variance_authority_types.ClassProp) | undefined) => string;
673
923
  interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof skeletonVariants> {
674
924
  }
@@ -687,8 +937,12 @@ interface SkeletonRowProps extends React.HTMLAttributes<HTMLDivElement> {
687
937
  count?: number;
688
938
  }
689
939
  declare const SkeletonRow: React.ForwardRefExoticComponent<SkeletonRowProps & React.RefAttributes<HTMLDivElement>>;
690
- interface SpinnerProps extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof spinnerVariants> {
940
+ interface SpinnerProps extends React.HTMLAttributes<HTMLSpanElement> {
941
+ /** Semantic sizes: sm (16px) · md (24px, default) · lg (32px).
942
+ * @deprecated number values 16/24/32 — use "sm"/"md"/"lg" instead (remove after 1 release cycle). */
943
+ size?: 'sm' | 'md' | 'lg' | 16 | 24 | 32;
691
944
  label?: string;
945
+ className?: string;
692
946
  }
693
947
  declare const Spinner: React.ForwardRefExoticComponent<SpinnerProps & React.RefAttributes<HTMLSpanElement>>;
694
948
 
@@ -882,6 +1136,10 @@ type CheckboxCheckedState = React.ComponentProps<typeof Checkbox$1.Root>["checke
882
1136
  interface CheckboxProps extends Omit<React.ComponentPropsWithoutRef<typeof Checkbox$1.Root>, "children" | "color">, VariantProps<typeof checkboxVariants> {
883
1137
  label: React.ReactNode;
884
1138
  description?: React.ReactNode;
1139
+ /** Marks the field as required and appends `*` to label. */
1140
+ required?: boolean;
1141
+ /** Validation error message. Replaces description when present. */
1142
+ error?: React.ReactNode;
885
1143
  }
886
1144
  declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLButtonElement>>;
887
1145
 
@@ -907,13 +1165,28 @@ type AccessibleGroupName = {
907
1165
  "aria-label"?: never;
908
1166
  "aria-labelledby": string;
909
1167
  };
910
- type RadioCardGroupRootProps = Omit<React.ComponentPropsWithoutRef<typeof RadioGroup.Root>, "children" | "orientation" | "aria-label" | "aria-labelledby">;
1168
+ type RadioCardGroupRootProps = Omit<React.ComponentPropsWithoutRef<typeof RadioGroup$1.Root>, "children" | "orientation" | "aria-label" | "aria-labelledby">;
911
1169
  type RadioCardGroupProps = RadioCardGroupRootProps & AccessibleGroupName & VariantProps<typeof radioCardGroupVariants> & {
912
1170
  options: readonly RadioCardOption[];
913
1171
  density?: RadioCardDensity;
914
1172
  };
915
1173
  declare const RadioCardGroup: React.ForwardRefExoticComponent<RadioCardGroupProps & React.RefAttributes<HTMLDivElement>>;
916
1174
 
1175
+ interface RadioOption {
1176
+ value: string;
1177
+ label: React.ReactNode;
1178
+ description?: React.ReactNode;
1179
+ disabled?: boolean;
1180
+ }
1181
+ interface RadioGroupProps extends Omit<React.ComponentPropsWithoutRef<typeof RadioGroup$1.Root>, "children"> {
1182
+ options: readonly RadioOption[];
1183
+ orientation?: "vertical" | "horizontal";
1184
+ "aria-label"?: string;
1185
+ "aria-labelledby"?: string;
1186
+ required?: boolean;
1187
+ }
1188
+ declare const RadioGroup: React.ForwardRefExoticComponent<RadioGroupProps & React.RefAttributes<HTMLDivElement>>;
1189
+
917
1190
  declare function ScrollArea({ className, children, ...props }: React.ComponentProps<typeof ScrollArea$1.Root>): react_jsx_runtime.JSX.Element;
918
1191
  declare function ScrollBar({ className, orientation, ...props }: React.ComponentProps<typeof ScrollArea$1.ScrollAreaScrollbar>): react_jsx_runtime.JSX.Element;
919
1192
 
@@ -973,4 +1246,4 @@ interface JbnuEmblemProps extends SVGProps<SVGSVGElement> {
973
1246
  }
974
1247
  declare function JbnuEmblem({ size, className, style, ...props }: JbnuEmblemProps): react_jsx_runtime.JSX.Element;
975
1248
 
976
- export { ActionFooter, type ActionFooterAction, type ActionFooterProps, type ActionFooterStatus, Alert, type AlertProps, type AlertVariant, Avatar, AvatarFallback, AvatarImage, Badge, type BadgeProps, type BadgeSize, type BadgeTone, type BadgeVariant, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Card, CardContent, CardDescription, CardFooter, CardHeader, type CardProps, CardTitle, type CardVariant, Checkbox, type CheckboxCheckedState, type CheckboxProps, type CheckboxSize, Chip, type ChipProps, type ChipSize, type ChipTone, type ChipVariant, ChoiceGroup, type ChoiceGroupOption, type ChoiceGroupProps, type ChoiceGroupType, type ChoiceGroupVariant, ConfirmDialog, type ConfirmDialogProps, CopyButton, type CopyButtonProps, DataTable, type DataTableBulkAction, type DataTableColumn, type DataTableProps, type DataTableSort, DetailLayout, type DetailLayoutProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogRawContent, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EmptyStateProps, type EmptyStateSize, type EmptyStateTone, ErrorState, type ErrorStateProps, FileUploadZone, type FileUploadZoneProps, FilterToolbar, type FilterToolbarProps, FormField, type FormFieldProps, type FormFieldRenderProps, FormLayout, type FormLayoutProps, type FormLayoutSection, FormModal, type FormModalProps, IconButton, type IconButtonBadgeTone, type IconButtonProps, type IconButtonSize, type IconButtonVariant, InfoModal, type InfoModalProps, InlineAlert, type InlineAlertProps, Input, type InputProps, type InputState, JbnuEmblem, type JbnuEmblemProps, ModeToggle, type ModeToggleOption, type ModeToggleProps, NotificationBadge, type NotificationBadgePlacement, type NotificationBadgeProps, type NotificationBadgeSize, OTPField, type OTPFieldProps, type OTPFieldSize, OlunLogo, OlunSymbol, PageHeader, type PageHeaderProps, Pagination, type PaginationProps, type PaginationSize, PermissionContext, type PermissionEvaluator, type PermissionFallback, PermissionGuard, type PermissionGuardProps, PermissionProvider, type PermissionProviderProps, type PermissionScope, type PermissionState, Progress, type RadioCardColumns, type RadioCardDensity, RadioCardGroup, type RadioCardGroupProps, type RadioCardOption, ScrollArea, ScrollBar, SearchField, type SearchFieldProps, type SearchFieldSize, Select, type SelectOption, type SelectProps, type SelectSize, type SelectState, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetDrawer, type SheetDrawerProps, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Skeleton, type SkeletonProps, SkeletonRow, type SkeletonRowColumn, type SkeletonRowProps, SkeletonText, type SkeletonTextProps, Spinner, type SpinnerProps, StatusBadge, type StatusBadgeProps, type StatusBadgeStatus, type TabItem, Tabs, TabsContent, type TabsProps, Textarea, type TextareaProps, type TextareaSize, type TextareaState, ThemeFab, type ThemeFabProps, ThemeToggle, type ToastAction, type ToastItem, type ToastOptions, ToastProvider, ToastRoot, type ToastVariant, ToastViewport, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TwoTierBadge, type TwoTierBadgeIntent, type TwoTierBadgeProps, WizardLayout, type WizardLayoutProps, type WizardStep, type WizardStepState, actionFooterStatusVariants, actionFooterVariants, alertVariants, badgeDotVariants, badgeVariants, buttonVariants, cardVariants, checkboxBoxVariants, checkboxVariants, chipCountVariants, chipVariants, choiceBodyVariants, choiceGroupVariants, choiceMarkerVariants, choiceRowVariants, cn, dataTableRowVariants, dataTableVariants, emptyStateIconVariants, emptyStateVariants, errorStateVariants, evaluatePermission, fileUploadIconVariants, fileUploadZoneVariants, formFieldControlStackClassName, formFieldDescriptionClassName, formFieldErrorClassName, formFieldLabelClassName, formFieldRequiredClassName, formFieldVariants, getToastDuration, iconButtonBadgeVariants, iconButtonVariants, inlineAlertVariants, inputMessageVariants, inputVariants, limitToasts, modeToggleItemVariants, modeToggleVariants, notificationBadgeVariants, otpCellVariants, otpFieldGroupVariants, otpFieldMessageVariants, otpFieldVariants, paginationControlVariants, paginationVariants, radioCardControlVariants, radioCardGroupVariants, radioCardItemVariants, searchFieldInputVariants, searchFieldVariants, selectMessageVariants, selectVariants, skeletonVariants, spinnerVariants, statusBadgeDotVariants, statusBadgeVariants, tabsBadgeVariants, tabsListVariants, tabsTriggerVariants, textareaMessageVariants, textareaVariants, toast, toastVariants, toastViewportVariants, twoTierBadgeLineVariants, twoTierBadgeVariants, usePermission };
1249
+ export { ActionFooter, type ActionFooterAction, type ActionFooterProps, type ActionFooterStatus, Alert, type AlertProps, type AlertVariant, Avatar, AvatarFallback, AvatarImage, Badge, type BadgeProps, type BadgeSize, type BadgeTone, type BadgeVariant, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Card, CardContent, CardDescription, CardFooter, CardHeader, type CardProps, CardProse, CardTitle, type CardVariant, Checkbox, type CheckboxCheckedState, type CheckboxProps, type CheckboxSize, Chip, type ChipProps, type ChipSize, type ChipTone, type ChipVariant, ChoiceGroup, type ChoiceGroupOption, type ChoiceGroupProps, type ChoiceGroupType, type ChoiceGroupVariant, ConfirmDialog, type ConfirmDialogProps, CopyButton, type CopyButtonProps, DataTable, type DataTableBulkAction, type DataTableColumn, type DataTableProps, type DataTableSort, DetailLayout, type DetailLayoutProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogRawContent, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EmptyStateProps, type EmptyStateSize, type EmptyStateTone, ErrorState, type ErrorStateProps, FileUploadZone, type FileUploadZoneProps, FilterToolbar, type FilterToolbarProps, FormField, type FormFieldProps, type FormFieldRenderProps, FormLayout, type FormLayoutProps, type FormLayoutSection, FormModal, type FormModalProps, IconButton, type IconButtonBadgeTone, type IconButtonProps, type IconButtonSize, type IconButtonVariant, InfoModal, type InfoModalProps, InlineAlert, type InlineAlertProps, Input, type InputProps, type InputSize, type InputSizeLegacy, type InputState, JbnuEmblem, type JbnuEmblemProps, Label, type LabelProps, ModeToggle, type ModeToggleOption, type ModeToggleProps, NotificationBadge, type NotificationBadgePlacement, type NotificationBadgeProps, type NotificationBadgeSize, OTPField, type OTPFieldProps, type OTPFieldSize, OlunLogo, OlunSymbol, PageHeader, type PageHeaderProps, Pagination, type PaginationProps, type PaginationSize, PermissionContext, type PermissionEvaluator, type PermissionFallback, PermissionGuard, type PermissionGuardProps, PermissionProvider, type PermissionProviderProps, type PermissionScope, type PermissionState, Popover, PopoverAnchor, PopoverArrow, PopoverClose, PopoverContent, type PopoverContentProps, type PopoverProps, PopoverTrigger, Progress, type RadioCardColumns, type RadioCardDensity, RadioCardGroup, type RadioCardGroupProps, type RadioCardOption, RadioGroup, type RadioGroupProps, type RadioOption, ScrollArea, ScrollBar, SearchField, type SearchFieldProps, type SearchFieldSize, Select, type SelectAppearance, type SelectOption, type SelectProps, type SelectSize, type SelectState, type SelectVariant, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetDrawer, type SheetDrawerProps, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Skeleton, type SkeletonProps, SkeletonRow, type SkeletonRowColumn, type SkeletonRowProps, SkeletonText, type SkeletonTextProps, Spinner, type SpinnerProps, StatusBadge, type StatusBadgeProps, type StatusBadgeStatus, Switch, type SwitchProps, type TabItem, Tabs, TabsContent, type TabsProps, Textarea, type TextareaProps, type TextareaSize, type TextareaSizeLegacy, type TextareaState, ThemeFab, type ThemeFabProps, ThemeToggle, type ToastAction, type ToastItem, type ToastOptions, ToastProvider, ToastRoot, type ToastVariant, ToastViewport, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TwoTierBadge, type TwoTierBadgeIntent, type TwoTierBadgeProps, WizardLayout, type WizardLayoutProps, type WizardStep, type WizardStepState, actionFooterStatusVariants, actionFooterVariants, alertVariants, badgeDotVariants, badgeVariants, buttonVariants, cardVariants, checkboxBoxVariants, checkboxVariants, chipCountVariants, chipVariants, choiceBodyVariants, choiceGroupVariants, choiceMarkerVariants, choiceRowVariants, cn, dataTableRowVariants, dataTableVariants, emptyStateIconVariants, emptyStateVariants, errorStateVariants, evaluatePermission, fileUploadIconVariants, fileUploadZoneVariants, formFieldControlStackClassName, formFieldDescriptionClassName, formFieldErrorClassName, formFieldLabelClassName, formFieldRequiredClassName, formFieldVariants, getToastDuration, iconButtonBadgeVariants, iconButtonVariants, inlineAlertVariants, inputMessageVariants, inputVariants, limitToasts, modeToggleItemVariants, modeToggleVariants, notificationBadgeVariants, otpCellVariants, otpFieldGroupVariants, otpFieldMessageVariants, otpFieldVariants, paginationControlVariants, paginationVariants, radioCardControlVariants, radioCardGroupVariants, radioCardItemVariants, searchFieldInputVariants, searchFieldVariants, selectMessageVariants, selectVariants, skeletonVariants, spinnerVariants, statusBadgeDotVariants, statusBadgeVariants, tabsBadgeVariants, tabsListVariants, tabsTriggerVariants, textareaMessageVariants, textareaVariants, toast, toastVariants, toastViewportVariants, twoTierBadgeLineVariants, twoTierBadgeVariants, usePermission };