@olundot/ui 0.20.0-next.0 → 0.20.0-next.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/dist/index.js CHANGED
@@ -5026,6 +5026,7 @@ var chipVariants = cva10(
5026
5026
  choice: "cursor-pointer",
5027
5027
  removable: "cursor-pointer",
5028
5028
  // status-filter — 정적 표시 chip (display only, 클릭 affordance 없음).
5029
+ /** @deprecated A read-only label is a Badge: neutral·muted → `neutral`, accent → `brand`, success → `success`, warning → `warning`, danger → `error`. */
5029
5030
  "status-filter": "cursor-default"
5030
5031
  },
5031
5032
  tone: {
@@ -7867,41 +7868,30 @@ function ActionSheet({
7867
7868
 
7868
7869
  // src/components/ui/badge.tsx
7869
7870
  import * as React34 from "react";
7870
- import { jsx as jsx44, jsxs as jsxs36 } from "react/jsx-runtime";
7871
- var DOT = {
7872
- error: "var(--semantic-error-fg)",
7873
- warning: "var(--semantic-warning-fg)",
7874
- info: "var(--semantic-info-fg)",
7875
- success: "var(--semantic-success-fg)",
7876
- neutral: "var(--text-tertiary)",
7877
- brand: "var(--accent-pop)"
7871
+ import { jsx as jsx44 } from "react/jsx-runtime";
7872
+ var TONE = {
7873
+ neutral: "bg-[var(--semantic-neutral-bg)] text-[var(--semantic-neutral-fg)]",
7874
+ info: "bg-[var(--semantic-info-bg)] text-[var(--semantic-info-fg)]",
7875
+ success: "bg-[var(--semantic-success-bg)] text-[var(--semantic-success-fg)]",
7876
+ warning: "bg-[var(--semantic-warning-bg)] text-[var(--semantic-warning-fg)]",
7877
+ error: "bg-[var(--semantic-error-bg)] text-[var(--semantic-error-fg)]",
7878
+ brand: "bg-[var(--accent-bg-strong)] text-[var(--accent)]"
7878
7879
  };
7879
7880
  var Badge = React34.forwardRef(
7880
- ({ tone = "neutral", className, children, ...props }, ref) => /* @__PURE__ */ jsxs36(
7881
+ ({ tone = "neutral", className, children, ...props }, ref) => /* @__PURE__ */ jsx44(
7881
7882
  "span",
7882
7883
  {
7883
7884
  ref,
7884
7885
  "data-slot": "badge",
7885
7886
  "data-tone": tone,
7886
7887
  className: cn(
7887
- "inline-flex h-[24px] items-center gap-[var(--space-2)] rounded-[var(--radius-sm)] px-[var(--space-3)]",
7888
- "bg-[var(--bg-surface)] border border-[var(--border-subtle)] text-[var(--text-secondary)]",
7888
+ "inline-flex h-[20px] w-fit shrink-0 items-center whitespace-nowrap rounded-[var(--radius-sm)] px-[var(--space-2)]",
7889
7889
  "text-[12px] font-medium",
7890
+ TONE[tone],
7890
7891
  className
7891
7892
  ),
7892
7893
  ...props,
7893
- children: [
7894
- /* @__PURE__ */ jsx44(
7895
- "span",
7896
- {
7897
- "aria-hidden": "true",
7898
- "data-slot": "badge-dot",
7899
- className: "size-[6px] shrink-0 rounded-full",
7900
- style: { background: DOT[tone] }
7901
- }
7902
- ),
7903
- children
7904
- ]
7894
+ children
7905
7895
  }
7906
7896
  )
7907
7897
  );
@@ -7909,7 +7899,7 @@ Badge.displayName = "Badge";
7909
7899
 
7910
7900
  // src/components/ui/two-tier-badge.tsx
7911
7901
  import * as React35 from "react";
7912
- import { jsx as jsx45, jsxs as jsxs37 } from "react/jsx-runtime";
7902
+ import { jsx as jsx45, jsxs as jsxs36 } from "react/jsx-runtime";
7913
7903
  var FG = {
7914
7904
  neutral: "var(--text-secondary)",
7915
7905
  info: "var(--semantic-info-fg)",
@@ -7929,7 +7919,7 @@ var SEGMENT = {
7929
7919
  sm: "gap-[6px] py-[var(--space-1)] px-[var(--space-2)] text-[12px]",
7930
7920
  md: "gap-[7px] py-[var(--space-1)] px-[var(--space-3)] text-[14px]"
7931
7921
  };
7932
- var DOT2 = { xs: 5, sm: 6, md: 7 };
7922
+ var DOT = { xs: 5, sm: 6, md: 7 };
7933
7923
  var TwoTierBadge = React35.forwardRef(
7934
7924
  ({ primary, secondary, tone = "neutral", emphasis = "subtle", size = "sm", showDot = false, className, style, ...props }, ref) => {
7935
7925
  const strong = emphasis === "strong";
@@ -7938,8 +7928,8 @@ var TwoTierBadge = React35.forwardRef(
7938
7928
  const tinted = tone === "neutral" ? "var(--border)" : `color-mix(in srgb, ${fg} 26%, transparent)`;
7939
7929
  const frame = strong ? tinted : "var(--border-subtle)";
7940
7930
  const divider = strong ? tinted : "var(--border)";
7941
- const dotSize = DOT2[size];
7942
- return /* @__PURE__ */ jsxs37(
7931
+ const dotSize = DOT[size];
7932
+ return /* @__PURE__ */ jsxs36(
7943
7933
  "span",
7944
7934
  {
7945
7935
  ref,
@@ -7953,7 +7943,7 @@ var TwoTierBadge = React35.forwardRef(
7953
7943
  style: { fontFamily: "var(--font-sans)", borderColor: frame, background: "transparent", ...style },
7954
7944
  ...props,
7955
7945
  children: [
7956
- /* @__PURE__ */ jsxs37(
7946
+ /* @__PURE__ */ jsxs36(
7957
7947
  "span",
7958
7948
  {
7959
7949
  "data-slot": "two-tier-badge-primary",
@@ -8001,7 +7991,7 @@ TwoTierBadge.displayName = "TwoTierBadge";
8001
7991
 
8002
7992
  // src/components/ui/status-badge.tsx
8003
7993
  import * as React36 from "react";
8004
- import { jsx as jsx46, jsxs as jsxs38 } from "react/jsx-runtime";
7994
+ import { jsx as jsx46 } from "react/jsx-runtime";
8005
7995
  var ROLE = {
8006
7996
  error: "error",
8007
7997
  warning: "warning",
@@ -8011,79 +8001,58 @@ var ROLE = {
8011
8001
  success: "success",
8012
8002
  archived: "neutral"
8013
8003
  };
8014
- var FG2 = {
8015
- error: "var(--semantic-error-fg)",
8016
- warning: "var(--semantic-warning-fg)",
8017
- info: "var(--semantic-info-fg)",
8018
- success: "var(--semantic-success-fg)",
8019
- neutral: "var(--semantic-neutral-fg)"
8020
- };
8021
- var BG2 = {
8022
- error: "var(--semantic-error-bg)",
8023
- warning: "var(--semantic-warning-bg)",
8024
- info: "var(--semantic-info-bg)",
8025
- success: "var(--semantic-success-bg)",
8026
- neutral: "var(--semantic-neutral-bg)"
8027
- };
8028
- var SIZE = {
8029
- xs: { cls: "gap-[5px] py-[2px] px-[var(--space-2)] text-[12px]", dot: 5 },
8030
- sm: { cls: "gap-[6px] py-[var(--space-1)] px-[var(--space-2)] text-[12px]", dot: 6 },
8031
- md: { cls: "gap-[var(--space-2)] py-[var(--space-1)] px-[14px] text-[14px]", dot: 7 }
8032
- };
8033
8004
  var StatusBadge = React36.forwardRef(
8034
- ({ status = "active", emphasis = "subtle", size = "sm", showDot = true, pulse = true, className, children, style, ...props }, ref) => {
8035
- const role = ROLE[status];
8036
- const fg = FG2[role];
8037
- const strong = emphasis === "strong";
8038
- const ringDot = role === "neutral";
8039
- return /* @__PURE__ */ jsxs38(
8040
- "span",
8041
- {
8042
- ref,
8043
- "data-slot": "status-badge",
8044
- "data-status": status,
8045
- "data-role": role,
8046
- "data-emphasis": emphasis,
8047
- className: cn("inline-flex w-fit shrink-0 items-center whitespace-nowrap rounded-full border font-medium leading-none", SIZE[size].cls, className),
8048
- style: {
8049
- fontFamily: "var(--font-sans)",
8050
- background: strong ? BG2[role] : "transparent",
8051
- borderColor: strong ? `color-mix(in srgb, ${fg} 26%, transparent)` : "var(--border-subtle)",
8052
- color: fg,
8053
- ...style
8054
- },
8055
- ...props,
8056
- children: [
8057
- showDot ? /* @__PURE__ */ jsx46(
8058
- "span",
8059
- {
8060
- "aria-hidden": "true",
8061
- "data-slot": "status-badge-dot",
8062
- "data-ring-dot": ringDot ? "true" : "false",
8063
- "data-pulse": pulse ? "true" : "false",
8064
- className: "shrink-0 rounded-full box-border",
8065
- style: {
8066
- width: SIZE[size].dot,
8067
- height: SIZE[size].dot,
8068
- background: ringDot ? "transparent" : "currentColor",
8069
- border: ringDot ? "1.5px solid currentColor" : "none",
8070
- animation: pulse && !ringDot ? "olun-status-pulse 1.8s var(--ease-standard) infinite" : "none"
8071
- }
8072
- }
8073
- ) : null,
8074
- children,
8075
- /* @__PURE__ */ jsx46("style", { children: "@keyframes olun-status-pulse{0%,100%{opacity:1}50%{opacity:.4}}@media (prefers-reduced-motion: reduce){[data-slot=status-badge-dot]{animation:none!important}}" })
8076
- ]
8077
- }
8078
- );
8079
- }
8005
+ ({ status = "active", emphasis: _emphasis, size: _size, showDot: _showDot, pulse: _pulse, ...props }, ref) => /* @__PURE__ */ jsx46(Badge, { ref, tone: ROLE[status], ...props })
8080
8006
  );
8081
8007
  StatusBadge.displayName = "StatusBadge";
8082
8008
 
8083
- // src/components/ui/notification-badge.tsx
8009
+ // src/components/ui/status-dot.tsx
8084
8010
  import * as React37 from "react";
8011
+ import { jsx as jsx47, jsxs as jsxs37 } from "react/jsx-runtime";
8012
+ var DOT2 = {
8013
+ neutral: "bg-[var(--semantic-neutral-fg)]",
8014
+ info: "bg-[var(--semantic-info-fg)]",
8015
+ success: "bg-[var(--semantic-success-fg)]",
8016
+ warning: "bg-[var(--semantic-warning-fg)]",
8017
+ error: "bg-[var(--semantic-error-fg)]"
8018
+ };
8019
+ var StatusDot = React37.forwardRef(
8020
+ ({ tone, label, pulse = false, className, ...props }, ref) => /* @__PURE__ */ jsxs37(
8021
+ "span",
8022
+ {
8023
+ ref,
8024
+ "data-slot": "status-dot",
8025
+ "data-tone": tone,
8026
+ className: cn(
8027
+ "inline-flex items-center gap-[6px] whitespace-nowrap text-[12px] font-medium text-foreground",
8028
+ className
8029
+ ),
8030
+ ...props,
8031
+ children: [
8032
+ /* @__PURE__ */ jsx47(
8033
+ "span",
8034
+ {
8035
+ "aria-hidden": "true",
8036
+ "data-slot": "status-dot-indicator",
8037
+ "data-pulse": pulse ? "true" : void 0,
8038
+ className: cn(
8039
+ "size-[6px] shrink-0 rounded-full",
8040
+ DOT2[tone],
8041
+ pulse && "motion-safe:animate-[olun-status-dot-pulse_1.6s_var(--ease-standard)_infinite]"
8042
+ )
8043
+ }
8044
+ ),
8045
+ label
8046
+ ]
8047
+ }
8048
+ )
8049
+ );
8050
+ StatusDot.displayName = "StatusDot";
8051
+
8052
+ // src/components/ui/notification-badge.tsx
8053
+ import * as React38 from "react";
8085
8054
  import { cva as cva13 } from "class-variance-authority";
8086
- import { jsx as jsx47 } from "react/jsx-runtime";
8055
+ import { jsx as jsx48 } from "react/jsx-runtime";
8087
8056
  var notificationBadgeVariants = cva13(
8088
8057
  [
8089
8058
  "inline-flex shrink-0 items-center justify-center rounded-[var(--radius-full)]",
@@ -8114,7 +8083,7 @@ function formatNotificationCount(count, max) {
8114
8083
  }
8115
8084
  return String(count);
8116
8085
  }
8117
- var NotificationBadge = React37.forwardRef(
8086
+ var NotificationBadge = React38.forwardRef(
8118
8087
  ({
8119
8088
  className,
8120
8089
  count,
@@ -8129,7 +8098,7 @@ var NotificationBadge = React37.forwardRef(
8129
8098
  }
8130
8099
  const normalizedMax = Math.max(1, Math.floor(max));
8131
8100
  const label = ariaLabel ?? (count > normalizedMax ? `\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC ${normalizedMax}\uAC1C \uC774\uC0C1` : `\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC ${count}\uAC1C`);
8132
- return /* @__PURE__ */ jsx47(
8101
+ return /* @__PURE__ */ jsx48(
8133
8102
  "span",
8134
8103
  {
8135
8104
  ref,
@@ -8147,9 +8116,9 @@ var NotificationBadge = React37.forwardRef(
8147
8116
  NotificationBadge.displayName = "NotificationBadge";
8148
8117
 
8149
8118
  // src/components/ui/empty-state.tsx
8150
- import * as React38 from "react";
8119
+ import * as React39 from "react";
8151
8120
  import { cva as cva14 } from "class-variance-authority";
8152
- import { jsx as jsx48, jsxs as jsxs39 } from "react/jsx-runtime";
8121
+ import { jsx as jsx49, jsxs as jsxs38 } from "react/jsx-runtime";
8153
8122
  var emptyStateBaseVariants = cva14(
8154
8123
  [
8155
8124
  "flex flex-col items-center justify-center text-center",
@@ -8221,7 +8190,7 @@ var iconSize3 = {
8221
8190
  md: 20,
8222
8191
  lg: 24
8223
8192
  };
8224
- var EmptyState = React38.forwardRef(
8193
+ var EmptyState = React39.forwardRef(
8225
8194
  ({
8226
8195
  className,
8227
8196
  size = "md",
@@ -8236,7 +8205,7 @@ var EmptyState = React38.forwardRef(
8236
8205
  ...props
8237
8206
  }, ref) => {
8238
8207
  const resolvedSize = size ?? "md";
8239
- return /* @__PURE__ */ jsxs39(
8208
+ return /* @__PURE__ */ jsxs38(
8240
8209
  "div",
8241
8210
  {
8242
8211
  ref,
@@ -8245,17 +8214,17 @@ var EmptyState = React38.forwardRef(
8245
8214
  className: cn(emptyStateVariants({ size, tone, surface, bordered, className })),
8246
8215
  ...props,
8247
8216
  children: [
8248
- Icon ? /* @__PURE__ */ jsx48(
8217
+ Icon ? /* @__PURE__ */ jsx49(
8249
8218
  "span",
8250
8219
  {
8251
8220
  "aria-hidden": "true",
8252
8221
  "data-slot": "empty-state-icon",
8253
8222
  className: emptyStateIconVariants({ size: resolvedSize }),
8254
- children: /* @__PURE__ */ jsx48(Icon, { size: iconSize3[resolvedSize], strokeWidth: 1.75 })
8223
+ children: /* @__PURE__ */ jsx49(Icon, { size: iconSize3[resolvedSize], strokeWidth: 1.75 })
8255
8224
  }
8256
8225
  ) : null,
8257
- /* @__PURE__ */ jsxs39("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-2)]", children: [
8258
- /* @__PURE__ */ jsx48(
8226
+ /* @__PURE__ */ jsxs38("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-2)]", children: [
8227
+ /* @__PURE__ */ jsx49(
8259
8228
  "h2",
8260
8229
  {
8261
8230
  "data-slot": "empty-state-title",
@@ -8263,7 +8232,7 @@ var EmptyState = React38.forwardRef(
8263
8232
  children: title
8264
8233
  }
8265
8234
  ),
8266
- description ? /* @__PURE__ */ jsx48(
8235
+ description ? /* @__PURE__ */ jsx49(
8267
8236
  "p",
8268
8237
  {
8269
8238
  "data-slot": "empty-state-description",
@@ -8271,7 +8240,7 @@ var EmptyState = React38.forwardRef(
8271
8240
  children: description
8272
8241
  }
8273
8242
  ) : null,
8274
- hint ? /* @__PURE__ */ jsx48(
8243
+ hint ? /* @__PURE__ */ jsx49(
8275
8244
  "p",
8276
8245
  {
8277
8246
  "data-slot": "empty-state-hint",
@@ -8280,7 +8249,7 @@ var EmptyState = React38.forwardRef(
8280
8249
  }
8281
8250
  ) : null
8282
8251
  ] }),
8283
- action ? /* @__PURE__ */ jsx48("div", { "data-slot": "empty-state-action", className: "mt-[var(--space-2)]", children: action }) : null
8252
+ action ? /* @__PURE__ */ jsx49("div", { "data-slot": "empty-state-action", className: "mt-[var(--space-2)]", children: action }) : null
8284
8253
  ]
8285
8254
  }
8286
8255
  );
@@ -8289,10 +8258,10 @@ var EmptyState = React38.forwardRef(
8289
8258
  EmptyState.displayName = "EmptyState";
8290
8259
 
8291
8260
  // src/components/ui/error-state.tsx
8292
- import * as React39 from "react";
8261
+ import * as React40 from "react";
8293
8262
  import { AlertTriangle } from "lucide-react";
8294
8263
  import { cva as cva15 } from "class-variance-authority";
8295
- import { jsx as jsx49, jsxs as jsxs40 } from "react/jsx-runtime";
8264
+ import { jsx as jsx50, jsxs as jsxs39 } from "react/jsx-runtime";
8296
8265
  var errorStateVariants = cva15(
8297
8266
  [
8298
8267
  "flex flex-col items-center justify-center text-center",
@@ -8314,7 +8283,7 @@ var errorStateVariants = cva15(
8314
8283
  }
8315
8284
  }
8316
8285
  );
8317
- var ErrorState = React39.forwardRef(
8286
+ var ErrorState = React40.forwardRef(
8318
8287
  ({
8319
8288
  className,
8320
8289
  size = "md",
@@ -8325,7 +8294,7 @@ var ErrorState = React39.forwardRef(
8325
8294
  onRetry,
8326
8295
  retryLabel = "\uB2E4\uC2DC \uC2DC\uB3C4",
8327
8296
  ...props
8328
- }, ref) => /* @__PURE__ */ jsxs40(
8297
+ }, ref) => /* @__PURE__ */ jsxs39(
8329
8298
  "div",
8330
8299
  {
8331
8300
  ref,
@@ -8334,17 +8303,17 @@ var ErrorState = React39.forwardRef(
8334
8303
  className: cn(errorStateVariants({ size, surface, className })),
8335
8304
  ...props,
8336
8305
  children: [
8337
- /* @__PURE__ */ jsx49(
8306
+ /* @__PURE__ */ jsx50(
8338
8307
  "span",
8339
8308
  {
8340
8309
  "aria-hidden": "true",
8341
8310
  "data-slot": "error-state-icon",
8342
8311
  className: "inline-flex size-[48px] items-center justify-center rounded-[var(--radius-full)] bg-[var(--error-bg)] text-[var(--error)]",
8343
- children: /* @__PURE__ */ jsx49(AlertTriangle, { size: 24, strokeWidth: 1.75 })
8312
+ children: /* @__PURE__ */ jsx50(AlertTriangle, { size: 24, strokeWidth: 1.75 })
8344
8313
  }
8345
8314
  ),
8346
- /* @__PURE__ */ jsxs40("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-2)]", children: [
8347
- /* @__PURE__ */ jsx49(
8315
+ /* @__PURE__ */ jsxs39("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-2)]", children: [
8316
+ /* @__PURE__ */ jsx50(
8348
8317
  "h2",
8349
8318
  {
8350
8319
  "data-slot": "error-state-title",
@@ -8352,7 +8321,7 @@ var ErrorState = React39.forwardRef(
8352
8321
  children: title
8353
8322
  }
8354
8323
  ),
8355
- /* @__PURE__ */ jsx49(
8324
+ /* @__PURE__ */ jsx50(
8356
8325
  "p",
8357
8326
  {
8358
8327
  "data-slot": "error-state-message",
@@ -8360,7 +8329,7 @@ var ErrorState = React39.forwardRef(
8360
8329
  children: message
8361
8330
  }
8362
8331
  ),
8363
- errorCode ? /* @__PURE__ */ jsx49(
8332
+ errorCode ? /* @__PURE__ */ jsx50(
8364
8333
  "p",
8365
8334
  {
8366
8335
  "data-slot": "error-state-code",
@@ -8369,7 +8338,7 @@ var ErrorState = React39.forwardRef(
8369
8338
  }
8370
8339
  ) : null
8371
8340
  ] }),
8372
- onRetry ? /* @__PURE__ */ jsx49(Button, { size: "sm", variant: "secondary", onClick: onRetry, children: retryLabel }) : null
8341
+ onRetry ? /* @__PURE__ */ jsx50(Button, { size: "sm", variant: "secondary", onClick: onRetry, children: retryLabel }) : null
8373
8342
  ]
8374
8343
  }
8375
8344
  )
@@ -8377,9 +8346,9 @@ var ErrorState = React39.forwardRef(
8377
8346
  ErrorState.displayName = "ErrorState";
8378
8347
 
8379
8348
  // src/components/ui/skeleton.tsx
8380
- import * as React40 from "react";
8349
+ import * as React41 from "react";
8381
8350
  import { cva as cva16 } from "class-variance-authority";
8382
- import { jsx as jsx50 } from "react/jsx-runtime";
8351
+ import { jsx as jsx51 } from "react/jsx-runtime";
8383
8352
  var skeletonVariants = cva16(
8384
8353
  [
8385
8354
  // bg-inset: light #F1F2F4 reads on white surfaces (bg-raised was white = invisible);
@@ -8423,8 +8392,8 @@ var spinnerVariants = cva16(
8423
8392
  }
8424
8393
  }
8425
8394
  );
8426
- var Skeleton = React40.forwardRef(
8427
- ({ className, shape, style, ...props }, ref) => /* @__PURE__ */ jsx50(
8395
+ var Skeleton = React41.forwardRef(
8396
+ ({ className, shape, style, ...props }, ref) => /* @__PURE__ */ jsx51(
8428
8397
  "div",
8429
8398
  {
8430
8399
  ref,
@@ -8437,15 +8406,15 @@ var Skeleton = React40.forwardRef(
8437
8406
  );
8438
8407
  Skeleton.displayName = "Skeleton";
8439
8408
  var defaultTextWidths = ["92%", "84%", "68%", "76%"];
8440
- var SkeletonText = React40.forwardRef(
8441
- ({ className, lines = 3, widths = defaultTextWidths, ...props }, ref) => /* @__PURE__ */ jsx50(
8409
+ var SkeletonText = React41.forwardRef(
8410
+ ({ className, lines = 3, widths = defaultTextWidths, ...props }, ref) => /* @__PURE__ */ jsx51(
8442
8411
  "div",
8443
8412
  {
8444
8413
  ref,
8445
8414
  "data-slot": "skeleton-text",
8446
8415
  className: cn("flex flex-col gap-[var(--space-2)]", className),
8447
8416
  ...props,
8448
- children: Array.from({ length: lines }, (_, index) => /* @__PURE__ */ jsx50(
8417
+ children: Array.from({ length: lines }, (_, index) => /* @__PURE__ */ jsx51(
8449
8418
  Skeleton,
8450
8419
  {
8451
8420
  shape: "text",
@@ -8457,7 +8426,7 @@ var SkeletonText = React40.forwardRef(
8457
8426
  )
8458
8427
  );
8459
8428
  SkeletonText.displayName = "SkeletonText";
8460
- var SkeletonRow = React40.forwardRef(
8429
+ var SkeletonRow = React41.forwardRef(
8461
8430
  ({
8462
8431
  className,
8463
8432
  columns,
@@ -8468,7 +8437,7 @@ var SkeletonRow = React40.forwardRef(
8468
8437
  }, ref) => {
8469
8438
  const rowCount = Math.max(5, count);
8470
8439
  const gridTemplateColumns = columns.map((column) => column.width ?? "1fr").join(" ");
8471
- return /* @__PURE__ */ jsx50(
8440
+ return /* @__PURE__ */ jsx51(
8472
8441
  "div",
8473
8442
  {
8474
8443
  ref,
@@ -8482,7 +8451,7 @@ var SkeletonRow = React40.forwardRef(
8482
8451
  className
8483
8452
  ),
8484
8453
  ...props,
8485
- children: Array.from({ length: rowCount }, (_, rowIndex) => /* @__PURE__ */ jsx50(
8454
+ children: Array.from({ length: rowCount }, (_, rowIndex) => /* @__PURE__ */ jsx51(
8486
8455
  "div",
8487
8456
  {
8488
8457
  "data-slot": "skeleton-row",
@@ -8490,11 +8459,11 @@ var SkeletonRow = React40.forwardRef(
8490
8459
  "grid min-h-[48px] items-center border-t border-[var(--border-subtle)] first:border-t-0"
8491
8460
  ),
8492
8461
  style: { gridTemplateColumns },
8493
- children: columns.map((column, columnIndex) => /* @__PURE__ */ jsx50(
8462
+ children: columns.map((column, columnIndex) => /* @__PURE__ */ jsx51(
8494
8463
  "div",
8495
8464
  {
8496
8465
  className: "px-[var(--space-4)] py-[var(--space-2)]",
8497
- children: /* @__PURE__ */ jsx50(
8466
+ children: /* @__PURE__ */ jsx51(
8498
8467
  Skeleton,
8499
8468
  {
8500
8469
  shape: "text",
@@ -8514,8 +8483,8 @@ var SkeletonRow = React40.forwardRef(
8514
8483
  }
8515
8484
  );
8516
8485
  SkeletonRow.displayName = "SkeletonRow";
8517
- var Spinner = React40.forwardRef(
8518
- ({ className, size, label = "\uB85C\uB529 \uC911", ...props }, ref) => /* @__PURE__ */ jsx50(
8486
+ var Spinner = React41.forwardRef(
8487
+ ({ className, size, label = "\uB85C\uB529 \uC911", ...props }, ref) => /* @__PURE__ */ jsx51(
8519
8488
  "span",
8520
8489
  {
8521
8490
  ref,
@@ -8530,12 +8499,12 @@ var Spinner = React40.forwardRef(
8530
8499
  Spinner.displayName = "Spinner";
8531
8500
 
8532
8501
  // src/components/ui/pagination.tsx
8533
- import * as React41 from "react";
8502
+ import * as React42 from "react";
8534
8503
  import { ChevronsLeft, ChevronLeft, ChevronRight as ChevronRight2, ChevronsRight } from "lucide-react";
8535
8504
  import { cva as cva17 } from "class-variance-authority";
8536
8505
 
8537
8506
  // src/components/ui/page-size-select.tsx
8538
- import { jsx as jsx51, jsxs as jsxs41 } from "react/jsx-runtime";
8507
+ import { jsx as jsx52, jsxs as jsxs40 } from "react/jsx-runtime";
8539
8508
  var DEFAULT_OPTIONS = [10, 20, 50, 100];
8540
8509
  function PageSizeSelect({
8541
8510
  value,
@@ -8554,7 +8523,7 @@ function PageSizeSelect({
8554
8523
  label: `${opt}${unit}`
8555
8524
  }));
8556
8525
  const selectSize = size === "compact" ? "sm" : "md";
8557
- return /* @__PURE__ */ jsxs41(
8526
+ return /* @__PURE__ */ jsxs40(
8558
8527
  "div",
8559
8528
  {
8560
8529
  "data-slot": "page-size-select",
@@ -8563,8 +8532,8 @@ function PageSizeSelect({
8563
8532
  className
8564
8533
  ),
8565
8534
  children: [
8566
- label != null ? /* @__PURE__ */ jsx51("span", { children: label }) : null,
8567
- /* @__PURE__ */ jsx51(
8535
+ label != null ? /* @__PURE__ */ jsx52("span", { children: label }) : null,
8536
+ /* @__PURE__ */ jsx52(
8568
8537
  Select,
8569
8538
  {
8570
8539
  id,
@@ -8586,7 +8555,7 @@ function PageSizeSelect({
8586
8555
  }
8587
8556
 
8588
8557
  // src/components/ui/pagination.tsx
8589
- import { jsx as jsx52, jsxs as jsxs42 } from "react/jsx-runtime";
8558
+ import { jsx as jsx53, jsxs as jsxs41 } from "react/jsx-runtime";
8590
8559
  var paginationVariants = cva17(
8591
8560
  [
8592
8561
  "flex w-full flex-col gap-[var(--space-3)]",
@@ -8659,7 +8628,7 @@ function NavigationButton({
8659
8628
  icon: Icon,
8660
8629
  onPageChange
8661
8630
  }) {
8662
- return /* @__PURE__ */ jsx52(
8631
+ return /* @__PURE__ */ jsx53(
8663
8632
  "button",
8664
8633
  {
8665
8634
  "aria-label": label,
@@ -8667,11 +8636,11 @@ function NavigationButton({
8667
8636
  className: paginationControlVariants({ size }),
8668
8637
  type: "button",
8669
8638
  onClick: () => onPageChange?.(page),
8670
- children: /* @__PURE__ */ jsx52(Icon, { "aria-hidden": "true", "data-slot": "pagination-icon" })
8639
+ children: /* @__PURE__ */ jsx53(Icon, { "aria-hidden": "true", "data-slot": "pagination-icon" })
8671
8640
  }
8672
8641
  );
8673
8642
  }
8674
- var Pagination = React41.forwardRef(
8643
+ var Pagination = React42.forwardRef(
8675
8644
  ({
8676
8645
  className,
8677
8646
  size = "standard",
@@ -8696,7 +8665,7 @@ var Pagination = React41.forwardRef(
8696
8665
  const items = getPaginationItems(currentPage, pageCount);
8697
8666
  const isFirstPage = currentPage === 1;
8698
8667
  const isLastPage = currentPage === pageCount;
8699
- return /* @__PURE__ */ jsxs42(
8668
+ return /* @__PURE__ */ jsxs41(
8700
8669
  "nav",
8701
8670
  {
8702
8671
  ref,
@@ -8706,9 +8675,9 @@ var Pagination = React41.forwardRef(
8706
8675
  className: cn(paginationVariants({ size: resolvedSize, className })),
8707
8676
  ...props,
8708
8677
  children: [
8709
- /* @__PURE__ */ jsxs42("div", { className: "flex flex-wrap items-center gap-[var(--space-3)]", children: [
8710
- /* @__PURE__ */ jsx52("span", { "data-slot": "pagination-total", className: "font-medium text-text-secondary", children: totalLabel(total) }),
8711
- showPageSize ? /* @__PURE__ */ jsx52("div", { "data-slot": "pagination-size", children: /* @__PURE__ */ jsx52(
8678
+ /* @__PURE__ */ jsxs41("div", { className: "flex flex-wrap items-center gap-[var(--space-3)]", children: [
8679
+ /* @__PURE__ */ jsx53("span", { "data-slot": "pagination-total", className: "font-medium text-text-secondary", children: totalLabel(total) }),
8680
+ showPageSize ? /* @__PURE__ */ jsx53("div", { "data-slot": "pagination-size", children: /* @__PURE__ */ jsx53(
8712
8681
  PageSizeSelect,
8713
8682
  {
8714
8683
  label: pageSizeLabel,
@@ -8720,13 +8689,13 @@ var Pagination = React41.forwardRef(
8720
8689
  }
8721
8690
  ) }) : null
8722
8691
  ] }),
8723
- /* @__PURE__ */ jsxs42(
8692
+ /* @__PURE__ */ jsxs41(
8724
8693
  "div",
8725
8694
  {
8726
8695
  "data-slot": "pagination-list",
8727
8696
  className: "flex items-center justify-center gap-[var(--space-1)]",
8728
8697
  children: [
8729
- /* @__PURE__ */ jsx52(
8698
+ /* @__PURE__ */ jsx53(
8730
8699
  NavigationButton,
8731
8700
  {
8732
8701
  label: "\uCCAB \uD398\uC774\uC9C0",
@@ -8737,7 +8706,7 @@ var Pagination = React41.forwardRef(
8737
8706
  onPageChange
8738
8707
  }
8739
8708
  ),
8740
- /* @__PURE__ */ jsx52(
8709
+ /* @__PURE__ */ jsx53(
8741
8710
  NavigationButton,
8742
8711
  {
8743
8712
  label: "\uC774\uC804 \uD398\uC774\uC9C0",
@@ -8749,7 +8718,7 @@ var Pagination = React41.forwardRef(
8749
8718
  }
8750
8719
  ),
8751
8720
  items.map(
8752
- (item, index) => item === "ellipsis" ? /* @__PURE__ */ jsx52(
8721
+ (item, index) => item === "ellipsis" ? /* @__PURE__ */ jsx53(
8753
8722
  "span",
8754
8723
  {
8755
8724
  "data-slot": "pagination-ellipsis",
@@ -8761,7 +8730,7 @@ var Pagination = React41.forwardRef(
8761
8730
  children: "..."
8762
8731
  },
8763
8732
  `ellipsis-${index}`
8764
- ) : /* @__PURE__ */ jsx52(
8733
+ ) : /* @__PURE__ */ jsx53(
8765
8734
  "button",
8766
8735
  {
8767
8736
  "aria-label": `${item} \uD398\uC774\uC9C0`,
@@ -8775,7 +8744,7 @@ var Pagination = React41.forwardRef(
8775
8744
  item
8776
8745
  )
8777
8746
  ),
8778
- /* @__PURE__ */ jsx52(
8747
+ /* @__PURE__ */ jsx53(
8779
8748
  NavigationButton,
8780
8749
  {
8781
8750
  label: "\uB2E4\uC74C \uD398\uC774\uC9C0",
@@ -8786,7 +8755,7 @@ var Pagination = React41.forwardRef(
8786
8755
  onPageChange
8787
8756
  }
8788
8757
  ),
8789
- /* @__PURE__ */ jsx52(
8758
+ /* @__PURE__ */ jsx53(
8790
8759
  NavigationButton,
8791
8760
  {
8792
8761
  label: "\uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0",
@@ -8809,7 +8778,7 @@ Pagination.displayName = "Pagination";
8809
8778
 
8810
8779
  // src/components/ui/mode-toggle.tsx
8811
8780
  import { cva as cva18 } from "class-variance-authority";
8812
- import { jsx as jsx53, jsxs as jsxs43 } from "react/jsx-runtime";
8781
+ import { jsx as jsx54, jsxs as jsxs42 } from "react/jsx-runtime";
8813
8782
  var modeToggleVariants = cva18(
8814
8783
  [
8815
8784
  "inline-flex items-center rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
@@ -8839,7 +8808,7 @@ function ModeToggle({
8839
8808
  onChange,
8840
8809
  ...props
8841
8810
  }) {
8842
- return /* @__PURE__ */ jsx53(
8811
+ return /* @__PURE__ */ jsx54(
8843
8812
  "div",
8844
8813
  {
8845
8814
  role: "group",
@@ -8849,7 +8818,7 @@ function ModeToggle({
8849
8818
  children: options.map((option) => {
8850
8819
  const Icon = option.icon;
8851
8820
  const isActive = option.value === value;
8852
- return /* @__PURE__ */ jsxs43(
8821
+ return /* @__PURE__ */ jsxs42(
8853
8822
  "button",
8854
8823
  {
8855
8824
  type: "button",
@@ -8865,8 +8834,8 @@ function ModeToggle({
8865
8834
  }
8866
8835
  },
8867
8836
  children: [
8868
- Icon ? /* @__PURE__ */ jsx53(Icon, { "aria-hidden": "true", "data-slot": "mode-toggle-icon" }) : null,
8869
- /* @__PURE__ */ jsx53("span", { children: option.label })
8837
+ Icon ? /* @__PURE__ */ jsx54(Icon, { "aria-hidden": "true", "data-slot": "mode-toggle-icon" }) : null,
8838
+ /* @__PURE__ */ jsx54("span", { children: option.label })
8870
8839
  ]
8871
8840
  },
8872
8841
  option.value
@@ -8877,9 +8846,9 @@ function ModeToggle({
8877
8846
  }
8878
8847
 
8879
8848
  // src/components/ui/action-footer.tsx
8880
- import * as React42 from "react";
8849
+ import * as React43 from "react";
8881
8850
  import { cva as cva19 } from "class-variance-authority";
8882
- import { jsx as jsx54, jsxs as jsxs44 } from "react/jsx-runtime";
8851
+ import { jsx as jsx55, jsxs as jsxs43 } from "react/jsx-runtime";
8883
8852
  var actionFooterVariants = cva19(
8884
8853
  [
8885
8854
  "flex flex-wrap items-center gap-[var(--space-4)] border-t border-[var(--border-subtle)]",
@@ -8950,7 +8919,7 @@ function getStatusLabel(status) {
8950
8919
  }
8951
8920
  }
8952
8921
  function renderAction(action) {
8953
- return /* @__PURE__ */ jsx54(
8922
+ return /* @__PURE__ */ jsx55(
8954
8923
  Button,
8955
8924
  {
8956
8925
  variant: action.variant,
@@ -8965,7 +8934,7 @@ function renderAction(action) {
8965
8934
  action.id ?? action.label
8966
8935
  );
8967
8936
  }
8968
- var ActionFooter = React42.forwardRef(
8937
+ var ActionFooter = React43.forwardRef(
8969
8938
  ({
8970
8939
  className,
8971
8940
  status,
@@ -8982,7 +8951,7 @@ var ActionFooter = React42.forwardRef(
8982
8951
  const mainActions = sortMainActions(
8983
8952
  visibleActions.filter((action) => !destructiveVariants.has(action.variant ?? "default"))
8984
8953
  );
8985
- return /* @__PURE__ */ jsxs44(
8954
+ return /* @__PURE__ */ jsxs43(
8986
8955
  "div",
8987
8956
  {
8988
8957
  ref,
@@ -8991,7 +8960,7 @@ var ActionFooter = React42.forwardRef(
8991
8960
  className: cn(actionFooterVariants({ position, surface, className })),
8992
8961
  ...props,
8993
8962
  children: [
8994
- destructiveActions.length > 0 ? /* @__PURE__ */ jsx54(
8963
+ destructiveActions.length > 0 ? /* @__PURE__ */ jsx55(
8995
8964
  "div",
8996
8965
  {
8997
8966
  "data-slot": "action-footer-destructive-actions",
@@ -8999,7 +8968,7 @@ var ActionFooter = React42.forwardRef(
8999
8968
  children: destructiveActions.map(renderAction)
9000
8969
  }
9001
8970
  ) : null,
9002
- status ? /* @__PURE__ */ jsxs44(
8971
+ status ? /* @__PURE__ */ jsxs43(
9003
8972
  "div",
9004
8973
  {
9005
8974
  "data-slot": "action-footer-status",
@@ -9007,7 +8976,7 @@ var ActionFooter = React42.forwardRef(
9007
8976
  "aria-live": "polite",
9008
8977
  className: cn(actionFooterStatusVariants({ kind: status.kind })),
9009
8978
  children: [
9010
- /* @__PURE__ */ jsx54(
8979
+ /* @__PURE__ */ jsx55(
9011
8980
  "span",
9012
8981
  {
9013
8982
  "aria-hidden": "true",
@@ -9015,11 +8984,11 @@ var ActionFooter = React42.forwardRef(
9015
8984
  className: "size-[6px] shrink-0 rounded-[var(--radius-full)]"
9016
8985
  }
9017
8986
  ),
9018
- /* @__PURE__ */ jsx54("span", { className: "truncate", children: getStatusLabel(status) })
8987
+ /* @__PURE__ */ jsx55("span", { className: "truncate", children: getStatusLabel(status) })
9019
8988
  ]
9020
8989
  }
9021
8990
  ) : null,
9022
- /* @__PURE__ */ jsx54(
8991
+ /* @__PURE__ */ jsx55(
9023
8992
  "div",
9024
8993
  {
9025
8994
  "data-slot": "action-footer-main-actions",
@@ -9035,9 +9004,9 @@ var ActionFooter = React42.forwardRef(
9035
9004
  ActionFooter.displayName = "ActionFooter";
9036
9005
 
9037
9006
  // src/components/ui/toast.tsx
9038
- import * as React43 from "react";
9007
+ import * as React44 from "react";
9039
9008
  import { cva as cva20 } from "class-variance-authority";
9040
- import { jsx as jsx55, jsxs as jsxs45 } from "react/jsx-runtime";
9009
+ import { jsx as jsx56, jsxs as jsxs44 } from "react/jsx-runtime";
9041
9010
  var DOT3 = {
9042
9011
  default: "var(--neutral)",
9043
9012
  success: "var(--success)",
@@ -9155,7 +9124,7 @@ var toast = {
9155
9124
  }
9156
9125
  };
9157
9126
  var Toast = toast;
9158
- var ToastRoot = React43.forwardRef(
9127
+ var ToastRoot = React44.forwardRef(
9159
9128
  ({
9160
9129
  className,
9161
9130
  id,
@@ -9172,10 +9141,10 @@ var ToastRoot = React43.forwardRef(
9172
9141
  ...props
9173
9142
  }, ref) => {
9174
9143
  const durationMs = getToastDuration({ message, variant, duration });
9175
- const onCloseRef = React43.useRef(onClose);
9144
+ const onCloseRef = React44.useRef(onClose);
9176
9145
  onCloseRef.current = onClose;
9177
- const timerRef = React43.useRef(null);
9178
- React43.useEffect(() => {
9146
+ const timerRef = React44.useRef(null);
9147
+ React44.useEffect(() => {
9179
9148
  if (!onCloseRef.current) return void 0;
9180
9149
  const timer = createToastTimer(durationMs, () => onCloseRef.current?.());
9181
9150
  timerRef.current = timer;
@@ -9184,7 +9153,7 @@ var ToastRoot = React43.forwardRef(
9184
9153
  timerRef.current = null;
9185
9154
  };
9186
9155
  }, [durationMs]);
9187
- return /* @__PURE__ */ jsxs45(
9156
+ return /* @__PURE__ */ jsxs44(
9188
9157
  "div",
9189
9158
  {
9190
9159
  ref,
@@ -9212,7 +9181,7 @@ var ToastRoot = React43.forwardRef(
9212
9181
  },
9213
9182
  ...props,
9214
9183
  children: [
9215
- /* @__PURE__ */ jsx55(
9184
+ /* @__PURE__ */ jsx56(
9216
9185
  "span",
9217
9186
  {
9218
9187
  "aria-hidden": "true",
@@ -9221,8 +9190,8 @@ var ToastRoot = React43.forwardRef(
9221
9190
  style: { background: DOT3[variant] ?? DOT3.default }
9222
9191
  }
9223
9192
  ),
9224
- /* @__PURE__ */ jsxs45("div", { "data-slot": "toast-body", className: "min-w-0 flex-1", children: [
9225
- /* @__PURE__ */ jsx55(
9193
+ /* @__PURE__ */ jsxs44("div", { "data-slot": "toast-body", className: "min-w-0 flex-1", children: [
9194
+ /* @__PURE__ */ jsx56(
9226
9195
  "div",
9227
9196
  {
9228
9197
  "data-slot": "toast-message",
@@ -9230,7 +9199,7 @@ var ToastRoot = React43.forwardRef(
9230
9199
  children: message
9231
9200
  }
9232
9201
  ),
9233
- description ? /* @__PURE__ */ jsx55(
9202
+ description ? /* @__PURE__ */ jsx56(
9234
9203
  "div",
9235
9204
  {
9236
9205
  "data-slot": "toast-description",
@@ -9239,8 +9208,8 @@ var ToastRoot = React43.forwardRef(
9239
9208
  }
9240
9209
  ) : null
9241
9210
  ] }),
9242
- /* @__PURE__ */ jsxs45("div", { "data-slot": "toast-actions", className: "flex shrink-0 items-center gap-[2px]", children: [
9243
- action ? /* @__PURE__ */ jsx55(
9211
+ /* @__PURE__ */ jsxs44("div", { "data-slot": "toast-actions", className: "flex shrink-0 items-center gap-[2px]", children: [
9212
+ action ? /* @__PURE__ */ jsx56(
9244
9213
  Button,
9245
9214
  {
9246
9215
  "data-slot": "toast-action",
@@ -9250,7 +9219,7 @@ var ToastRoot = React43.forwardRef(
9250
9219
  children: action.label
9251
9220
  }
9252
9221
  ) : null,
9253
- /* @__PURE__ */ jsx55(
9222
+ /* @__PURE__ */ jsx56(
9254
9223
  "button",
9255
9224
  {
9256
9225
  type: "button",
@@ -9272,7 +9241,7 @@ var ToastRoot = React43.forwardRef(
9272
9241
  }
9273
9242
  );
9274
9243
  ToastRoot.displayName = "ToastRoot";
9275
- var ToastViewport = React43.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx55(
9244
+ var ToastViewport = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx56(
9276
9245
  "ol",
9277
9246
  {
9278
9247
  ref,
@@ -9283,24 +9252,24 @@ var ToastViewport = React43.forwardRef(({ className, ...props }, ref) => /* @__P
9283
9252
  ));
9284
9253
  ToastViewport.displayName = "ToastViewport";
9285
9254
  function ToastProvider({ children, maxToasts = 3, className, ...props }) {
9286
- const [items, setItems] = React43.useState([]);
9287
- React43.useEffect(
9255
+ const [items, setItems] = React44.useState([]);
9256
+ React44.useEffect(
9288
9257
  () => toast.subscribe((nextItems) => {
9289
9258
  setItems(limitToasts(nextItems, maxToasts));
9290
9259
  }),
9291
9260
  [maxToasts]
9292
9261
  );
9293
- return /* @__PURE__ */ jsxs45("div", { "data-slot": "toast-provider", className, ...props, children: [
9262
+ return /* @__PURE__ */ jsxs44("div", { "data-slot": "toast-provider", className, ...props, children: [
9294
9263
  children,
9295
- /* @__PURE__ */ jsx55(ToastViewport, { children: items.map((item) => /* @__PURE__ */ jsx55("li", { children: /* @__PURE__ */ jsx55(ToastRoot, { ...item, onClose: () => toast.dismiss(item.id) }) }, item.id)) })
9264
+ /* @__PURE__ */ jsx56(ToastViewport, { children: items.map((item) => /* @__PURE__ */ jsx56("li", { children: /* @__PURE__ */ jsx56(ToastRoot, { ...item, onClose: () => toast.dismiss(item.id) }) }, item.id)) })
9296
9265
  ] });
9297
9266
  }
9298
9267
 
9299
9268
  // src/components/ui/otp-field.tsx
9300
- import * as React44 from "react";
9269
+ import * as React45 from "react";
9301
9270
  import { cva as cva21 } from "class-variance-authority";
9302
9271
  import { AlertCircle as AlertCircle4 } from "lucide-react";
9303
- import { Fragment as Fragment12, jsx as jsx56, jsxs as jsxs46 } from "react/jsx-runtime";
9272
+ import { Fragment as Fragment12, jsx as jsx57, jsxs as jsxs45 } from "react/jsx-runtime";
9304
9273
  var otpFieldVariants = cva21("flex w-full min-w-0 flex-col gap-[var(--space-3)]", {
9305
9274
  variants: {
9306
9275
  size: {
@@ -9427,7 +9396,7 @@ function fillDigitsFromIndex(slots, index, inserted, length) {
9427
9396
  focusIndex: Math.min(cursor, length - 1)
9428
9397
  };
9429
9398
  }
9430
- var OTPField = React44.forwardRef(
9399
+ var OTPField = React45.forwardRef(
9431
9400
  ({
9432
9401
  className,
9433
9402
  defaultValue,
@@ -9449,24 +9418,24 @@ var OTPField = React44.forwardRef(
9449
9418
  required,
9450
9419
  ...props
9451
9420
  }, ref) => {
9452
- const generatedId = React44.useId();
9421
+ const generatedId = React45.useId();
9453
9422
  const fieldId = id ?? generatedId;
9454
9423
  const labelId = `${fieldId}-label`;
9455
9424
  const helperId = helperText ? `${fieldId}-helper` : void 0;
9456
9425
  const errorId = errorText ? `${fieldId}-error` : void 0;
9457
9426
  const resolvedState = invalid || errorText ? "error" : "default";
9458
9427
  const isControlled = value !== void 0;
9459
- const [uncontrolledSlots, setUncontrolledSlots] = React44.useState(
9428
+ const [uncontrolledSlots, setUncontrolledSlots] = React45.useState(
9460
9429
  () => toDigitsArray(onlyDigits(defaultValue, length), length)
9461
9430
  );
9462
- const resolvedSlots = React44.useMemo(
9431
+ const resolvedSlots = React45.useMemo(
9463
9432
  () => isControlled ? toDigitsArray(onlyDigits(value, length), length) : uncontrolledSlots,
9464
9433
  [isControlled, length, uncontrolledSlots, value]
9465
9434
  );
9466
9435
  const resolvedValue = joinDigits(resolvedSlots).slice(0, length);
9467
- const cellsRef = React44.useRef([]);
9436
+ const cellsRef = React45.useRef([]);
9468
9437
  const groupDescribedBy = [helperId, errorId].filter(Boolean).join(" ") || void 0;
9469
- const setResolvedValue = React44.useCallback(
9438
+ const setResolvedValue = React45.useCallback(
9470
9439
  (nextSlots, focusIndex) => {
9471
9440
  const normalizedSlots = nextSlots.slice(0, length);
9472
9441
  const normalizedValue = joinDigits(normalizedSlots).slice(0, length);
@@ -9485,7 +9454,7 @@ var OTPField = React44.forwardRef(
9485
9454
  },
9486
9455
  [disabled, isControlled, length, onComplete, onValueChange]
9487
9456
  );
9488
- return /* @__PURE__ */ jsxs46(
9457
+ return /* @__PURE__ */ jsxs45(
9489
9458
  "fieldset",
9490
9459
  {
9491
9460
  ref,
@@ -9498,7 +9467,7 @@ var OTPField = React44.forwardRef(
9498
9467
  className: cn(otpFieldVariants({ size, className })),
9499
9468
  ...props,
9500
9469
  children: [
9501
- /* @__PURE__ */ jsxs46(
9470
+ /* @__PURE__ */ jsxs45(
9502
9471
  "legend",
9503
9472
  {
9504
9473
  id: labelId,
@@ -9506,11 +9475,11 @@ var OTPField = React44.forwardRef(
9506
9475
  className: "text-sm font-medium leading-snug text-foreground",
9507
9476
  children: [
9508
9477
  label,
9509
- required ? /* @__PURE__ */ jsx56("span", { "aria-hidden": "true", className: "ml-1 font-bold text-[var(--error)]", children: "*" }) : null
9478
+ required ? /* @__PURE__ */ jsx57("span", { "aria-hidden": "true", className: "ml-1 font-bold text-[var(--error)]", children: "*" }) : null
9510
9479
  ]
9511
9480
  }
9512
9481
  ),
9513
- /* @__PURE__ */ jsx56(
9482
+ /* @__PURE__ */ jsx57(
9514
9483
  "div",
9515
9484
  {
9516
9485
  "data-slot": "otp-field-group",
@@ -9520,7 +9489,7 @@ var OTPField = React44.forwardRef(
9520
9489
  children: Array.from({ length }, (_, index) => {
9521
9490
  const digit = resolvedSlots[index] ?? "";
9522
9491
  const inputId = `${fieldId}-cell-${index + 1}`;
9523
- return /* @__PURE__ */ jsx56(
9492
+ return /* @__PURE__ */ jsx57(
9524
9493
  "input",
9525
9494
  {
9526
9495
  ref: (node) => {
@@ -9615,15 +9584,15 @@ var OTPField = React44.forwardRef(
9615
9584
  })
9616
9585
  }
9617
9586
  ),
9618
- helperText || errorText ? /* @__PURE__ */ jsx56(
9587
+ helperText || errorText ? /* @__PURE__ */ jsx57(
9619
9588
  "p",
9620
9589
  {
9621
9590
  id: errorText ? errorId : helperId,
9622
9591
  "data-slot": "otp-field-message",
9623
9592
  "data-kind": errorText ? "error" : "helper",
9624
9593
  className: otpFieldMessageVariants({ state: resolvedState }),
9625
- children: errorText ? /* @__PURE__ */ jsxs46(Fragment12, { children: [
9626
- /* @__PURE__ */ jsx56(
9594
+ children: errorText ? /* @__PURE__ */ jsxs45(Fragment12, { children: [
9595
+ /* @__PURE__ */ jsx57(
9627
9596
  AlertCircle4,
9628
9597
  {
9629
9598
  "aria-hidden": "true",
@@ -9631,11 +9600,11 @@ var OTPField = React44.forwardRef(
9631
9600
  strokeWidth: 2
9632
9601
  }
9633
9602
  ),
9634
- /* @__PURE__ */ jsx56("span", { children: errorText })
9635
- ] }) : /* @__PURE__ */ jsx56("span", { children: helperText })
9603
+ /* @__PURE__ */ jsx57("span", { children: errorText })
9604
+ ] }) : /* @__PURE__ */ jsx57("span", { children: helperText })
9636
9605
  }
9637
9606
  ) : null,
9638
- name ? /* @__PURE__ */ jsx56(
9607
+ name ? /* @__PURE__ */ jsx57(
9639
9608
  "input",
9640
9609
  {
9641
9610
  "aria-hidden": "true",
@@ -9656,10 +9625,10 @@ var OTPField = React44.forwardRef(
9656
9625
  OTPField.displayName = "OTPField";
9657
9626
 
9658
9627
  // src/components/ui/search-field.tsx
9659
- import * as React45 from "react";
9628
+ import * as React46 from "react";
9660
9629
  import { Search, X as X4 } from "lucide-react";
9661
9630
  import { cva as cva22 } from "class-variance-authority";
9662
- import { jsx as jsx57, jsxs as jsxs47 } from "react/jsx-runtime";
9631
+ import { jsx as jsx58, jsxs as jsxs46 } from "react/jsx-runtime";
9663
9632
  var searchFieldVariants = cva22("relative flex w-full items-center", {
9664
9633
  variants: {
9665
9634
  size: {
@@ -9724,7 +9693,7 @@ var iconSize4 = {
9724
9693
  function hasVisibleValue(value) {
9725
9694
  return typeof value === "string" ? value.length > 0 : value !== void 0;
9726
9695
  }
9727
- var SearchField = React45.forwardRef(
9696
+ var SearchField = React46.forwardRef(
9728
9697
  ({
9729
9698
  className,
9730
9699
  inputMode = "search",
@@ -9740,12 +9709,12 @@ var SearchField = React45.forwardRef(
9740
9709
  ...props
9741
9710
  }, ref) => {
9742
9711
  const resolvedSize = size ?? "md";
9743
- const inputRef = React45.useRef(null);
9744
- const [hasText, setHasText] = React45.useState(
9712
+ const inputRef = React46.useRef(null);
9713
+ const [hasText, setHasText] = React46.useState(
9745
9714
  () => hasVisibleValue(value ?? defaultValue)
9746
9715
  );
9747
- React45.useImperativeHandle(ref, () => inputRef.current);
9748
- React45.useEffect(() => {
9716
+ React46.useImperativeHandle(ref, () => inputRef.current);
9717
+ React46.useEffect(() => {
9749
9718
  if (value !== void 0) {
9750
9719
  setHasText(hasVisibleValue(value));
9751
9720
  }
@@ -9758,14 +9727,14 @@ var SearchField = React45.forwardRef(
9758
9727
  }
9759
9728
  onClear?.();
9760
9729
  };
9761
- return /* @__PURE__ */ jsxs47(
9730
+ return /* @__PURE__ */ jsxs46(
9762
9731
  "div",
9763
9732
  {
9764
9733
  "data-slot": "search-field",
9765
9734
  "data-size": resolvedSize,
9766
9735
  className: cn(searchFieldVariants({ size, className })),
9767
9736
  children: [
9768
- /* @__PURE__ */ jsx57(
9737
+ /* @__PURE__ */ jsx58(
9769
9738
  Search,
9770
9739
  {
9771
9740
  "aria-hidden": "true",
@@ -9775,7 +9744,7 @@ var SearchField = React45.forwardRef(
9775
9744
  strokeWidth: resolvedSize === "sm" ? 2 : 1.75
9776
9745
  }
9777
9746
  ),
9778
- /* @__PURE__ */ jsx57(
9747
+ /* @__PURE__ */ jsx58(
9779
9748
  "input",
9780
9749
  {
9781
9750
  ref: inputRef,
@@ -9796,7 +9765,7 @@ var SearchField = React45.forwardRef(
9796
9765
  ...props
9797
9766
  }
9798
9767
  ),
9799
- showClear ? /* @__PURE__ */ jsx57(
9768
+ showClear ? /* @__PURE__ */ jsx58(
9800
9769
  "button",
9801
9770
  {
9802
9771
  type: "button",
@@ -9804,7 +9773,7 @@ var SearchField = React45.forwardRef(
9804
9773
  "data-slot": "search-field-clear",
9805
9774
  className: "absolute right-[8px] top-1/2 inline-flex size-[var(--space-4)] -translate-y-1/2 cursor-pointer items-center justify-center rounded-[var(--radius-full)] text-text-tertiary transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]",
9806
9775
  onClick: clearInput,
9807
- children: /* @__PURE__ */ jsx57(X4, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
9776
+ children: /* @__PURE__ */ jsx58(X4, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
9808
9777
  }
9809
9778
  ) : null
9810
9779
  ]
@@ -9815,9 +9784,9 @@ var SearchField = React45.forwardRef(
9815
9784
  SearchField.displayName = "SearchField";
9816
9785
 
9817
9786
  // src/components/ui/checkbox-group.tsx
9818
- import * as React46 from "react";
9787
+ import * as React47 from "react";
9819
9788
  import { cva as cva23 } from "class-variance-authority";
9820
- import { jsx as jsx58 } from "react/jsx-runtime";
9789
+ import { jsx as jsx59 } from "react/jsx-runtime";
9821
9790
  var checkboxGroupVariants = cva23("gap-[var(--space-2)]", {
9822
9791
  variants: {
9823
9792
  appearance: {
@@ -9843,7 +9812,7 @@ var checkboxGroupVariants = cva23("gap-[var(--space-2)]", {
9843
9812
  function toSelectionSet(value) {
9844
9813
  return new Set(value ?? []);
9845
9814
  }
9846
- var CheckboxGroup = React46.forwardRef(
9815
+ var CheckboxGroup = React47.forwardRef(
9847
9816
  ({
9848
9817
  className,
9849
9818
  children,
@@ -9859,14 +9828,14 @@ var CheckboxGroup = React46.forwardRef(
9859
9828
  ...props
9860
9829
  }, ref) => {
9861
9830
  const isControlled = value != null;
9862
- const [uncontrolledValue, setUncontrolledValue] = React46.useState(
9831
+ const [uncontrolledValue, setUncontrolledValue] = React47.useState(
9863
9832
  () => toSelectionSet(defaultValue)
9864
9833
  );
9865
- const selectedValues = React46.useMemo(
9834
+ const selectedValues = React47.useMemo(
9866
9835
  () => isControlled ? toSelectionSet(value) : uncontrolledValue,
9867
9836
  [isControlled, uncontrolledValue, value]
9868
9837
  );
9869
- const toggleValue = React46.useCallback(
9838
+ const toggleValue = React47.useCallback(
9870
9839
  (itemValue, checked) => {
9871
9840
  const nextValues = new Set(selectedValues);
9872
9841
  if (checked) {
@@ -9882,7 +9851,7 @@ var CheckboxGroup = React46.forwardRef(
9882
9851
  },
9883
9852
  [isControlled, onValueChange, selectedValues]
9884
9853
  );
9885
- const contextValue = React46.useMemo(
9854
+ const contextValue = React47.useMemo(
9886
9855
  () => ({
9887
9856
  appearance,
9888
9857
  density,
@@ -9893,7 +9862,7 @@ var CheckboxGroup = React46.forwardRef(
9893
9862
  }),
9894
9863
  [appearance, density, disabled, name, selectedValues, toggleValue]
9895
9864
  );
9896
- return /* @__PURE__ */ jsx58(CheckboxGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx58(
9865
+ return /* @__PURE__ */ jsx59(CheckboxGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx59(
9897
9866
  "div",
9898
9867
  {
9899
9868
  ref,
@@ -9917,11 +9886,11 @@ var CheckboxGroup = React46.forwardRef(
9917
9886
  CheckboxGroup.displayName = "CheckboxGroup";
9918
9887
 
9919
9888
  // src/components/ui/radio-group.tsx
9920
- import * as React47 from "react";
9889
+ import * as React48 from "react";
9921
9890
  import { cva as cva24 } from "class-variance-authority";
9922
9891
  import { Circle } from "lucide-react";
9923
9892
  import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
9924
- import { jsx as jsx59, jsxs as jsxs48 } from "react/jsx-runtime";
9893
+ import { jsx as jsx60, jsxs as jsxs47 } from "react/jsx-runtime";
9925
9894
  var radioGroupVariants = cva24("gap-[var(--space-2)]", {
9926
9895
  variants: {
9927
9896
  appearance: {
@@ -10010,11 +9979,11 @@ var radioControlVariants = cva24(
10010
9979
  }
10011
9980
  }
10012
9981
  );
10013
- var RadioGroupContext = React47.createContext({
9982
+ var RadioGroupContext = React48.createContext({
10014
9983
  appearance: "plain",
10015
9984
  density: "comfortable"
10016
9985
  });
10017
- var RadioGroup = React47.forwardRef(
9986
+ var RadioGroup = React48.forwardRef(
10018
9987
  ({
10019
9988
  className,
10020
9989
  children,
@@ -10025,11 +9994,11 @@ var RadioGroup = React47.forwardRef(
10025
9994
  required,
10026
9995
  ...props
10027
9996
  }, ref) => {
10028
- const contextValue = React47.useMemo(
9997
+ const contextValue = React48.useMemo(
10029
9998
  () => ({ appearance, density }),
10030
9999
  [appearance, density]
10031
10000
  );
10032
- return /* @__PURE__ */ jsx59(RadioGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx59(
10001
+ return /* @__PURE__ */ jsx60(RadioGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx60(
10033
10002
  RadioGroupPrimitive.Root,
10034
10003
  {
10035
10004
  ref,
@@ -10052,13 +10021,13 @@ var RadioGroup = React47.forwardRef(
10052
10021
  }
10053
10022
  );
10054
10023
  RadioGroup.displayName = "RadioGroup";
10055
- var Radio = React47.forwardRef(({ className, children, description, id, ...props }, ref) => {
10056
- const { appearance, density } = React47.useContext(RadioGroupContext);
10057
- const generatedId = React47.useId();
10024
+ var Radio = React48.forwardRef(({ className, children, description, id, ...props }, ref) => {
10025
+ const { appearance, density } = React48.useContext(RadioGroupContext);
10026
+ const generatedId = React48.useId();
10058
10027
  const radioId = id ?? generatedId;
10059
10028
  const labelId = `${radioId}-label`;
10060
10029
  const descriptionId = description ? `${radioId}-description` : void 0;
10061
- return /* @__PURE__ */ jsxs48(
10030
+ return /* @__PURE__ */ jsxs47(
10062
10031
  RadioGroupPrimitive.Item,
10063
10032
  {
10064
10033
  ref,
@@ -10069,24 +10038,24 @@ var Radio = React47.forwardRef(({ className, children, description, id, ...props
10069
10038
  className: cn(radioVariants({ appearance, density }), className),
10070
10039
  ...props,
10071
10040
  children: [
10072
- /* @__PURE__ */ jsx59(
10041
+ /* @__PURE__ */ jsx60(
10073
10042
  "span",
10074
10043
  {
10075
10044
  "aria-hidden": "true",
10076
10045
  "data-slot": "radio-control",
10077
10046
  className: radioControlVariants({ appearance }),
10078
- children: /* @__PURE__ */ jsx59(
10047
+ children: /* @__PURE__ */ jsx60(
10079
10048
  RadioGroupPrimitive.Indicator,
10080
10049
  {
10081
10050
  "data-slot": "radio-indicator",
10082
10051
  className: "flex items-center justify-center",
10083
- children: /* @__PURE__ */ jsx59(Circle, { "aria-hidden": "true", size: 8, fill: "currentColor" })
10052
+ children: /* @__PURE__ */ jsx60(Circle, { "aria-hidden": "true", size: 8, fill: "currentColor" })
10084
10053
  }
10085
10054
  )
10086
10055
  }
10087
10056
  ),
10088
- /* @__PURE__ */ jsxs48("span", { className: "flex min-w-0 flex-col gap-[var(--space-1)]", children: [
10089
- /* @__PURE__ */ jsx59(
10057
+ /* @__PURE__ */ jsxs47("span", { className: "flex min-w-0 flex-col gap-[var(--space-1)]", children: [
10058
+ /* @__PURE__ */ jsx60(
10090
10059
  "span",
10091
10060
  {
10092
10061
  id: labelId,
@@ -10098,7 +10067,7 @@ var Radio = React47.forwardRef(({ className, children, description, id, ...props
10098
10067
  children
10099
10068
  }
10100
10069
  ),
10101
- description ? /* @__PURE__ */ jsx59(
10070
+ description ? /* @__PURE__ */ jsx60(
10102
10071
  "span",
10103
10072
  {
10104
10073
  id: descriptionId,
@@ -10116,20 +10085,20 @@ Radio.displayName = "Radio";
10116
10085
 
10117
10086
  // src/components/ui/scroll-area.tsx
10118
10087
  import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
10119
- import { jsx as jsx60, jsxs as jsxs49 } from "react/jsx-runtime";
10088
+ import { jsx as jsx61, jsxs as jsxs48 } from "react/jsx-runtime";
10120
10089
  function ScrollArea({
10121
10090
  className,
10122
10091
  children,
10123
10092
  ...props
10124
10093
  }) {
10125
- return /* @__PURE__ */ jsxs49(
10094
+ return /* @__PURE__ */ jsxs48(
10126
10095
  ScrollAreaPrimitive.Root,
10127
10096
  {
10128
10097
  "data-slot": "scroll-area",
10129
10098
  className: cn("relative", className),
10130
10099
  ...props,
10131
10100
  children: [
10132
- /* @__PURE__ */ jsx60(
10101
+ /* @__PURE__ */ jsx61(
10133
10102
  ScrollAreaPrimitive.Viewport,
10134
10103
  {
10135
10104
  "data-slot": "scroll-area-viewport",
@@ -10137,8 +10106,8 @@ function ScrollArea({
10137
10106
  children
10138
10107
  }
10139
10108
  ),
10140
- /* @__PURE__ */ jsx60(ScrollBar, {}),
10141
- /* @__PURE__ */ jsx60(ScrollAreaPrimitive.Corner, {})
10109
+ /* @__PURE__ */ jsx61(ScrollBar, {}),
10110
+ /* @__PURE__ */ jsx61(ScrollAreaPrimitive.Corner, {})
10142
10111
  ]
10143
10112
  }
10144
10113
  );
@@ -10148,7 +10117,7 @@ function ScrollBar({
10148
10117
  orientation = "vertical",
10149
10118
  ...props
10150
10119
  }) {
10151
- return /* @__PURE__ */ jsx60(
10120
+ return /* @__PURE__ */ jsx61(
10152
10121
  ScrollAreaPrimitive.ScrollAreaScrollbar,
10153
10122
  {
10154
10123
  "data-slot": "scroll-area-scrollbar",
@@ -10160,7 +10129,7 @@ function ScrollBar({
10160
10129
  className
10161
10130
  ),
10162
10131
  ...props,
10163
- children: /* @__PURE__ */ jsx60(
10132
+ children: /* @__PURE__ */ jsx61(
10164
10133
  ScrollAreaPrimitive.ScrollAreaThumb,
10165
10134
  {
10166
10135
  "data-slot": "scroll-area-thumb",
@@ -10172,7 +10141,7 @@ function ScrollBar({
10172
10141
  }
10173
10142
 
10174
10143
  // src/components/ui/progress.tsx
10175
- import { jsx as jsx61 } from "react/jsx-runtime";
10144
+ import { jsx as jsx62 } from "react/jsx-runtime";
10176
10145
  var progressFillByStatus = {
10177
10146
  active: "bg-[var(--primary)]",
10178
10147
  success: "bg-[var(--success)]",
@@ -10193,7 +10162,7 @@ function Progress({
10193
10162
  const clamped = Math.max(0, Math.min(safeMax, value));
10194
10163
  const percent = clamped / safeMax * 100;
10195
10164
  const w = typeof width === "number" ? `${width}px` : width;
10196
- return /* @__PURE__ */ jsx61(
10165
+ return /* @__PURE__ */ jsx62(
10197
10166
  "div",
10198
10167
  {
10199
10168
  role: "progressbar",
@@ -10207,7 +10176,7 @@ function Progress({
10207
10176
  ),
10208
10177
  style: { width: w, height: `${height}px`, ...style },
10209
10178
  ...props,
10210
- children: /* @__PURE__ */ jsx61(
10179
+ children: /* @__PURE__ */ jsx62(
10211
10180
  "div",
10212
10181
  {
10213
10182
  className: cn(
@@ -10222,10 +10191,10 @@ function Progress({
10222
10191
  }
10223
10192
 
10224
10193
  // src/components/ui/tree-view.tsx
10225
- import * as React48 from "react";
10194
+ import * as React49 from "react";
10226
10195
  import { ChevronRight as ChevronRight3 } from "lucide-react";
10227
10196
  import { cva as cva25 } from "class-variance-authority";
10228
- import { jsx as jsx62, jsxs as jsxs50 } from "react/jsx-runtime";
10197
+ import { jsx as jsx63, jsxs as jsxs49 } from "react/jsx-runtime";
10229
10198
  var treeViewVariants = cva25(
10230
10199
  "m-0 list-none p-[var(--space-1)] text-body-sm text-foreground"
10231
10200
  );
@@ -10328,27 +10297,27 @@ function TreeView({
10328
10297
  ...rest
10329
10298
  }) {
10330
10299
  const isExpandedControlled = expandedIds !== void 0;
10331
- const [internalExpanded, setInternalExpanded] = React48.useState(
10300
+ const [internalExpanded, setInternalExpanded] = React49.useState(
10332
10301
  () => defaultExpandedIds ?? []
10333
10302
  );
10334
10303
  const expandedList = isExpandedControlled ? expandedIds : internalExpanded;
10335
- const expandedSet = React48.useMemo(() => new Set(expandedList), [expandedList]);
10336
- const items = React48.useMemo(
10304
+ const expandedSet = React49.useMemo(() => new Set(expandedList), [expandedList]);
10305
+ const items = React49.useMemo(
10337
10306
  () => flattenVisibleNodes(nodes, getChildren, expandedSet),
10338
10307
  [nodes, getChildren, expandedSet]
10339
10308
  );
10340
- const [focusedId, setFocusedId] = React48.useState(null);
10309
+ const [focusedId, setFocusedId] = React49.useState(null);
10341
10310
  const visibleIds = items.map((item) => item.id);
10342
10311
  const activeId = focusedId && visibleIds.includes(focusedId) ? focusedId : selectedId && visibleIds.includes(selectedId) ? selectedId : visibleIds[0] ?? null;
10343
- const itemRefs = React48.useRef(/* @__PURE__ */ new Map());
10344
- const commitExpanded = React48.useCallback(
10312
+ const itemRefs = React49.useRef(/* @__PURE__ */ new Map());
10313
+ const commitExpanded = React49.useCallback(
10345
10314
  (next) => {
10346
10315
  if (!isExpandedControlled) setInternalExpanded(next);
10347
10316
  onExpandedChange?.(next);
10348
10317
  },
10349
10318
  [isExpandedControlled, onExpandedChange]
10350
10319
  );
10351
- const setExpanded = React48.useCallback(
10320
+ const setExpanded = React49.useCallback(
10352
10321
  (id, expand) => {
10353
10322
  const has = expandedSet.has(id);
10354
10323
  if (expand && !has) {
@@ -10359,7 +10328,7 @@ function TreeView({
10359
10328
  },
10360
10329
  [commitExpanded, expandedList, expandedSet]
10361
10330
  );
10362
- const focusItem = React48.useCallback((id) => {
10331
+ const focusItem = React49.useCallback((id) => {
10363
10332
  setFocusedId(id);
10364
10333
  itemRefs.current.get(id)?.focus();
10365
10334
  }, []);
@@ -10395,7 +10364,7 @@ function TreeView({
10395
10364
  const selected = node.id === selectedId;
10396
10365
  const isActive = node.id === activeId;
10397
10366
  const itemState = { expanded, selected, depth, hasChildren };
10398
- return /* @__PURE__ */ jsxs50(
10367
+ return /* @__PURE__ */ jsxs49(
10399
10368
  "li",
10400
10369
  {
10401
10370
  ref: (element) => {
@@ -10420,7 +10389,7 @@ function TreeView({
10420
10389
  onSelect?.(node.id, node);
10421
10390
  },
10422
10391
  children: [
10423
- /* @__PURE__ */ jsxs50(
10392
+ /* @__PURE__ */ jsxs49(
10424
10393
  "span",
10425
10394
  {
10426
10395
  "data-slot": "treeitem-row",
@@ -10429,7 +10398,7 @@ function TreeView({
10429
10398
  },
10430
10399
  className: treeItemRowVariants({ selected }),
10431
10400
  children: [
10432
- hasChildren ? /* @__PURE__ */ jsx62(
10401
+ hasChildren ? /* @__PURE__ */ jsx63(
10433
10402
  "span",
10434
10403
  {
10435
10404
  "data-slot": "treeitem-toggle",
@@ -10439,7 +10408,7 @@ function TreeView({
10439
10408
  setExpanded(node.id, !expanded);
10440
10409
  },
10441
10410
  className: "flex size-[var(--space-4)] shrink-0 items-center justify-center text-text-tertiary",
10442
- children: /* @__PURE__ */ jsx62(
10411
+ children: /* @__PURE__ */ jsx63(
10443
10412
  ChevronRight3,
10444
10413
  {
10445
10414
  "aria-hidden": "true",
@@ -10452,7 +10421,7 @@ function TreeView({
10452
10421
  }
10453
10422
  )
10454
10423
  }
10455
- ) : /* @__PURE__ */ jsx62(
10424
+ ) : /* @__PURE__ */ jsx63(
10456
10425
  "span",
10457
10426
  {
10458
10427
  "data-slot": "treeitem-spacer",
@@ -10460,18 +10429,18 @@ function TreeView({
10460
10429
  className: "size-[var(--space-4)] shrink-0"
10461
10430
  }
10462
10431
  ),
10463
- /* @__PURE__ */ jsx62("span", { className: "flex min-w-0 flex-1 items-center gap-[var(--space-2)]", children: renderItem(node, itemState) })
10432
+ /* @__PURE__ */ jsx63("span", { className: "flex min-w-0 flex-1 items-center gap-[var(--space-2)]", children: renderItem(node, itemState) })
10464
10433
  ]
10465
10434
  }
10466
10435
  ),
10467
- hasChildren && expanded && children ? /* @__PURE__ */ jsx62("ul", { role: "group", "data-slot": "tree-group", className: "m-0 list-none p-0", children: renderLevel(children, depth + 1) }) : null
10436
+ hasChildren && expanded && children ? /* @__PURE__ */ jsx63("ul", { role: "group", "data-slot": "tree-group", className: "m-0 list-none p-0", children: renderLevel(children, depth + 1) }) : null
10468
10437
  ]
10469
10438
  },
10470
10439
  node.id
10471
10440
  );
10472
10441
  });
10473
10442
  }
10474
- return /* @__PURE__ */ jsx62(
10443
+ return /* @__PURE__ */ jsx63(
10475
10444
  "ul",
10476
10445
  {
10477
10446
  role: "tree",
@@ -10487,12 +10456,12 @@ function TreeView({
10487
10456
  }
10488
10457
 
10489
10458
  // src/components/branding/olun-logo.tsx
10490
- import { jsx as jsx63, jsxs as jsxs51 } from "react/jsx-runtime";
10459
+ import { jsx as jsx64, jsxs as jsxs50 } from "react/jsx-runtime";
10491
10460
  var SYMBOL_LARGE = { stroke: 24, dotX: 184, dotY: 180, dotR: 13 };
10492
10461
  var SYMBOL_SMALL = { stroke: 18, dotX: 185, dotY: 175, dotR: 22 };
10493
10462
  function OlunSymbol({ size = 28, className }) {
10494
10463
  const g = size > 32 ? SYMBOL_LARGE : SYMBOL_SMALL;
10495
- return /* @__PURE__ */ jsxs51(
10464
+ return /* @__PURE__ */ jsxs50(
10496
10465
  "svg",
10497
10466
  {
10498
10467
  width: size,
@@ -10503,7 +10472,7 @@ function OlunSymbol({ size = 28, className }) {
10503
10472
  className,
10504
10473
  "aria-hidden": "true",
10505
10474
  children: [
10506
- /* @__PURE__ */ jsx63(
10475
+ /* @__PURE__ */ jsx64(
10507
10476
  "circle",
10508
10477
  {
10509
10478
  cx: "108",
@@ -10515,7 +10484,7 @@ function OlunSymbol({ size = 28, className }) {
10515
10484
  style: { color: "var(--text-primary)" }
10516
10485
  }
10517
10486
  ),
10518
- /* @__PURE__ */ jsx63("circle", { cx: g.dotX, cy: g.dotY, r: g.dotR, fill: "var(--accent-pop)" })
10487
+ /* @__PURE__ */ jsx64("circle", { cx: g.dotX, cy: g.dotY, r: g.dotR, fill: "var(--accent-pop)" })
10519
10488
  ]
10520
10489
  }
10521
10490
  );
@@ -10526,7 +10495,7 @@ function OlunLogo({
10526
10495
  showSymbol = true,
10527
10496
  className
10528
10497
  }) {
10529
- return /* @__PURE__ */ jsxs51(
10498
+ return /* @__PURE__ */ jsxs50(
10530
10499
  "div",
10531
10500
  {
10532
10501
  className,
@@ -10536,8 +10505,8 @@ function OlunLogo({
10536
10505
  gap: "var(--space-3)"
10537
10506
  },
10538
10507
  children: [
10539
- showSymbol && /* @__PURE__ */ jsx63(OlunSymbol, { size: symbolSize }),
10540
- /* @__PURE__ */ jsxs51(
10508
+ showSymbol && /* @__PURE__ */ jsx64(OlunSymbol, { size: symbolSize }),
10509
+ /* @__PURE__ */ jsxs50(
10541
10510
  "span",
10542
10511
  {
10543
10512
  style: {
@@ -10549,7 +10518,7 @@ function OlunLogo({
10549
10518
  },
10550
10519
  children: [
10551
10520
  "OLUN",
10552
- !showSymbol && /* @__PURE__ */ jsx63("span", { style: { color: "var(--accent)" }, children: "." })
10521
+ !showSymbol && /* @__PURE__ */ jsx64("span", { style: { color: "var(--accent)" }, children: "." })
10553
10522
  ]
10554
10523
  }
10555
10524
  )
@@ -10560,11 +10529,11 @@ function OlunLogo({
10560
10529
 
10561
10530
  // src/components/branding/theme-toggle.tsx
10562
10531
  import { Sun, Moon } from "lucide-react";
10563
- import { jsx as jsx64 } from "react/jsx-runtime";
10532
+ import { jsx as jsx65 } from "react/jsx-runtime";
10564
10533
  function ThemeToggle({ className }) {
10565
10534
  const { resolvedTheme, toggleTheme } = useOlunTheme();
10566
10535
  const Icon = resolvedTheme === "dark" ? Moon : Sun;
10567
- return /* @__PURE__ */ jsx64(
10536
+ return /* @__PURE__ */ jsx65(
10568
10537
  "button",
10569
10538
  {
10570
10539
  onClick: () => toggleTheme(),
@@ -10576,14 +10545,14 @@ function ThemeToggle({ className }) {
10576
10545
  ),
10577
10546
  "aria-label": "\uD14C\uB9C8 \uC804\uD658",
10578
10547
  title: resolvedTheme === "dark" ? "\uB77C\uC774\uD2B8 \uBAA8\uB4DC\uB85C" : "\uB2E4\uD06C \uBAA8\uB4DC\uB85C",
10579
- children: /* @__PURE__ */ jsx64(Icon, { className: "size-[18px]", strokeWidth: 1.75 })
10548
+ children: /* @__PURE__ */ jsx65(Icon, { className: "size-[18px]", strokeWidth: 1.75 })
10580
10549
  }
10581
10550
  );
10582
10551
  }
10583
10552
 
10584
10553
  // src/components/branding/theme-fab.tsx
10585
10554
  import { Sun as Sun2, Moon as Moon2 } from "lucide-react";
10586
- import { jsx as jsx65 } from "react/jsx-runtime";
10555
+ import { jsx as jsx66 } from "react/jsx-runtime";
10587
10556
  function ThemeFab({ variant = "square" } = {}) {
10588
10557
  const { mounted, resolvedTheme, toggleTheme } = useOlunTheme();
10589
10558
  if (!mounted) {
@@ -10623,7 +10592,7 @@ function ThemeFab({ variant = "square" } = {}) {
10623
10592
  WebkitBackdropFilter: "blur(16px)",
10624
10593
  zIndex: 9999
10625
10594
  };
10626
- return /* @__PURE__ */ jsx65(
10595
+ return /* @__PURE__ */ jsx66(
10627
10596
  "button",
10628
10597
  {
10629
10598
  onClick: () => toggleTheme(),
@@ -10648,7 +10617,7 @@ function ThemeFab({ variant = "square" } = {}) {
10648
10617
  e.currentTarget.style.color = "var(--text-secondary)";
10649
10618
  }
10650
10619
  },
10651
- children: /* @__PURE__ */ jsx65(
10620
+ children: /* @__PURE__ */ jsx66(
10652
10621
  Icon,
10653
10622
  {
10654
10623
  size: isCircle ? 22 : 16,
@@ -10660,7 +10629,7 @@ function ThemeFab({ variant = "square" } = {}) {
10660
10629
  }
10661
10630
 
10662
10631
  // src/components/logos/organization-logo.tsx
10663
- import { jsx as jsx66 } from "react/jsx-runtime";
10632
+ import { jsx as jsx67 } from "react/jsx-runtime";
10664
10633
  var organizationLogoRegistry = {
10665
10634
  jbnu: {
10666
10635
  label: "\uC804\uBD81\uB300\uD559\uAD50 \uC5E0\uBE14\uB7FC",
@@ -10689,7 +10658,7 @@ function OrganizationLogo({
10689
10658
  }) {
10690
10659
  const asset = organizationLogoRegistry[organization];
10691
10660
  const isDecorative = ariaHidden === true || ariaHidden === "true";
10692
- return /* @__PURE__ */ jsx66(
10661
+ return /* @__PURE__ */ jsx67(
10693
10662
  "svg",
10694
10663
  {
10695
10664
  viewBox: asset.viewBox,
@@ -10707,7 +10676,7 @@ function OrganizationLogo({
10707
10676
  ...style
10708
10677
  },
10709
10678
  ...props,
10710
- children: asset.paths.map((path) => /* @__PURE__ */ jsx66("path", { d: path }, path))
10679
+ children: asset.paths.map((path) => /* @__PURE__ */ jsx67("path", { d: path }, path))
10711
10680
  }
10712
10681
  );
10713
10682
  }
@@ -10821,6 +10790,7 @@ export {
10821
10790
  SkeletonText,
10822
10791
  Spinner,
10823
10792
  StatusBadge,
10793
+ StatusDot,
10824
10794
  Switch,
10825
10795
  Tabs,
10826
10796
  TabsContent,