@olundot/ui 0.20.0-next.5 → 0.20.0-next.7

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
@@ -187,19 +187,38 @@ import { cva } from "class-variance-authority";
187
187
  import { ChevronDown, Loader2 } from "lucide-react";
188
188
  import { Slot } from "radix-ui";
189
189
 
190
+ // src/components/ui/surface.ts
191
+ var insetMarkerContext = "[--fill-on-bg:var(--fill-on-inset)]";
192
+ var surfaceMarkerContext = "[--fill-on-bg:initial]";
193
+ var surfaceClassNames = {
194
+ surface: `bg-[var(--bg-surface)] ${surfaceMarkerContext}`,
195
+ canvas: `bg-[var(--bg-canvas)] ${surfaceMarkerContext}`,
196
+ raised: `bg-[var(--bg-raised)] ${surfaceMarkerContext}`
197
+ };
198
+ var fieldSurfaceClassNames = {
199
+ surface: "bg-[var(--bg-surface)]",
200
+ canvas: "bg-[var(--bg-canvas)]",
201
+ raised: "bg-[var(--bg-raised)]"
202
+ };
203
+ var selectSurfaceClassNames = {
204
+ surface: "bg-[var(--bg-surface)] [background-color:var(--bg-surface)]",
205
+ canvas: "bg-[var(--bg-canvas)] [background-color:var(--bg-canvas)]",
206
+ raised: "bg-[var(--bg-raised)] [background-color:var(--bg-raised)]"
207
+ };
208
+
190
209
  // src/components/ui/action-variants.ts
191
210
  var actionPaint = {
192
211
  // = Button `primary`
193
212
  filledPrimary: "border-[var(--primary)] bg-[var(--primary)] text-[var(--primary-fg)] hover:bg-[var(--primary-hover)] hover:border-[var(--primary-hover)]",
194
213
  // = IconButton `subtle`; the transparent 1px border keeps Button's box model
195
- filledNeutral: "border-transparent bg-[var(--bg-inset)] text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
214
+ filledNeutral: `border-transparent bg-[var(--bg-inset)] text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground ${insetMarkerContext}`,
196
215
  // = Button `danger`
197
216
  filledDanger: "border-[var(--error)] bg-[var(--error)] text-[var(--error-contrast)] hover:bg-[var(--error-hover)] hover:border-[var(--error-hover)]",
198
217
  // = Button `secondary`
199
- outlineNeutral: "border-[var(--border-subtle)] bg-[var(--bg-surface)] text-foreground hover:border-[var(--border)] hover:bg-[var(--action-hover)]",
218
+ outlineNeutral: `border-[var(--border-subtle)] bg-[var(--bg-surface)] text-foreground hover:border-[var(--border)] hover:bg-[var(--action-hover)] ${surfaceMarkerContext}`,
200
219
  // Destructive action that is not the main one: outline neutral's surface, error border and
201
220
  // label, error wash on hover.
202
- outlineDanger: "border-[var(--error)] bg-[var(--bg-surface)] text-[var(--error)] hover:bg-[var(--error-bg)]",
221
+ outlineDanger: `border-[var(--error)] bg-[var(--bg-surface)] text-[var(--error)] hover:bg-[var(--error-bg)] ${surfaceMarkerContext}`,
203
222
  // = Button and IconButton `ghost`
204
223
  ghostNeutral: "border-transparent bg-transparent text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
205
224
  // Button `appearance="link"` only: the label color; the box and underline live in button.tsx.
@@ -440,25 +459,6 @@ CopyButton.displayName = "CopyButton";
440
459
  import * as React3 from "react";
441
460
  import { cva as cva2 } from "class-variance-authority";
442
461
  import { AlertCircle, CheckCircle2 } from "lucide-react";
443
-
444
- // src/components/ui/surface.ts
445
- var surfaceClassNames = {
446
- surface: "bg-[var(--bg-surface)]",
447
- canvas: "bg-[var(--bg-canvas)]",
448
- raised: "bg-[var(--bg-raised)]"
449
- };
450
- var fieldSurfaceClassNames = {
451
- surface: "bg-[var(--bg-surface)]",
452
- canvas: "bg-[var(--bg-canvas)]",
453
- raised: "bg-[var(--bg-raised)]"
454
- };
455
- var selectSurfaceClassNames = {
456
- surface: "bg-[var(--bg-surface)] [background-color:var(--bg-surface)]",
457
- canvas: "bg-[var(--bg-canvas)] [background-color:var(--bg-canvas)]",
458
- raised: "bg-[var(--bg-raised)] [background-color:var(--bg-raised)]"
459
- };
460
-
461
- // src/components/ui/input.tsx
462
462
  import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
463
463
  var inputVariants = cva2(
464
464
  [
@@ -657,6 +657,8 @@ var fileUploadZoneVariants = cva3(
657
657
  "hover:border-[var(--border-strong)] hover:bg-[var(--action-hover)]",
658
658
  "focus-within:border-[var(--focus-ring)] focus-within:shadow-[0_0_0_1px_var(--focus-ring)]",
659
659
  "data-[has-file=true]:border-solid data-[has-file=true]:border-[var(--border-strong)] data-[has-file=true]:bg-[var(--bg-inset)]",
660
+ // the filled zone is an inset well for neutral markers inside it (insetMarkerContext, surface.ts)
661
+ "data-[has-file=true]:[--fill-on-bg:var(--fill-on-inset)]",
660
662
  "data-[dragging=true]:border-[var(--border-strong)] data-[dragging=true]:bg-[var(--action-active)]",
661
663
  "data-[error=true]:border-[var(--error)]",
662
664
  "data-[disabled=true]:cursor-not-allowed data-[disabled=true]:border-[var(--border-subtle)] data-[disabled=true]:bg-[var(--action-disabled-bg)]",
@@ -967,6 +969,7 @@ FileUploadZone.displayName = "FileUploadZone";
967
969
 
968
970
  // src/components/ui/alert.tsx
969
971
  import * as React5 from "react";
972
+ import { CircleAlert, CircleCheck, Info, TriangleAlert, X } from "lucide-react";
970
973
  import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
971
974
  var SEM_FG = {
972
975
  info: "var(--semantic-info-fg)",
@@ -980,29 +983,20 @@ var SEM_BG = {
980
983
  warning: "var(--semantic-warning-bg)",
981
984
  error: "var(--semantic-error-bg)"
982
985
  };
986
+ var MARKER_ICON = {
987
+ info: Info,
988
+ success: CircleCheck,
989
+ warning: TriangleAlert,
990
+ error: CircleAlert
991
+ };
992
+ var TITLE_LINE_HEIGHT = 21;
983
993
  var defaultEmphasis = (v) => v === "error" ? "strong" : "subtle";
984
- function XIcon({ size }) {
985
- return /* @__PURE__ */ jsx5(
986
- "svg",
987
- {
988
- width: size,
989
- height: size,
990
- viewBox: "0 0 24 24",
991
- fill: "none",
992
- stroke: "currentColor",
993
- strokeWidth: 1.75,
994
- strokeLinecap: "round",
995
- strokeLinejoin: "round",
996
- "aria-hidden": "true",
997
- children: /* @__PURE__ */ jsx5("path", { d: "M18 6 6 18M6 6l12 12" })
998
- }
999
- );
1000
- }
1001
994
  var Alert = React5.forwardRef(
1002
- ({ variant = "info", emphasis, title, children, onDismiss, style, ...rest }, ref) => {
995
+ ({ variant = "info", emphasis, marker = "icon", title, children, onDismiss, style, ...rest }, ref) => {
1003
996
  const weight = emphasis ?? defaultEmphasis(variant);
1004
997
  const strong = weight === "strong";
1005
998
  const fg = SEM_FG[variant];
999
+ const MarkerIcon = MARKER_ICON[variant];
1006
1000
  return /* @__PURE__ */ jsxs5(
1007
1001
  "div",
1008
1002
  {
@@ -1012,16 +1006,16 @@ var Alert = React5.forwardRef(
1012
1006
  "data-slot": "alert",
1013
1007
  "data-variant": variant,
1014
1008
  "data-emphasis": weight,
1009
+ "data-marker": marker,
1015
1010
  style: {
1016
1011
  display: "flex",
1017
1012
  alignItems: "flex-start",
1018
- gap: 11,
1019
- borderRadius: 10,
1013
+ gap: "var(--space-2)",
1014
+ borderRadius: "var(--radius-md)",
1020
1015
  border: "1px solid " + (strong ? "color-mix(in srgb, " + fg + " 26%, transparent)" : "var(--border)"),
1021
1016
  background: strong ? SEM_BG[variant] : "var(--bg-surface)",
1022
1017
  color: "var(--text-primary)",
1023
- padding: "12px 14px",
1024
- paddingInlineEnd: onDismiss ? 10 : 14,
1018
+ padding: "var(--space-2) 10px",
1025
1019
  ...style
1026
1020
  },
1027
1021
  ...rest,
@@ -1030,42 +1024,49 @@ var Alert = React5.forwardRef(
1030
1024
  "span",
1031
1025
  {
1032
1026
  "aria-hidden": "true",
1033
- "data-slot": "alert-dot",
1027
+ "data-slot": "alert-marker",
1034
1028
  style: {
1035
- marginTop: title ? 5 : 4,
1036
- width: 7,
1037
- height: 7,
1029
+ display: "inline-flex",
1030
+ height: TITLE_LINE_HEIGHT,
1038
1031
  flexShrink: 0,
1039
- borderRadius: 9999,
1040
- background: fg
1041
- }
1032
+ alignItems: "center",
1033
+ justifyContent: "center",
1034
+ color: fg
1035
+ },
1036
+ children: marker === "dot" ? /* @__PURE__ */ jsx5(
1037
+ "span",
1038
+ {
1039
+ "data-slot": "alert-dot",
1040
+ style: { width: 7, height: 7, borderRadius: 9999, background: "currentColor" }
1041
+ }
1042
+ ) : /* @__PURE__ */ jsx5(MarkerIcon, { "data-slot": "alert-icon", size: 16, strokeWidth: 2.25 })
1042
1043
  }
1043
1044
  ),
1044
1045
  /* @__PURE__ */ jsxs5("div", { "data-slot": "alert-content", style: { flex: 1, minWidth: 0 }, children: [
1045
- title ? /* @__PURE__ */ jsx5(
1046
+ /* @__PURE__ */ jsx5(
1046
1047
  "div",
1047
1048
  {
1048
1049
  "data-slot": "alert-title",
1049
1050
  style: {
1050
1051
  fontFamily: "var(--font-sans)",
1051
- fontSize: 13,
1052
- fontWeight: 600,
1053
- lineHeight: 1.35,
1052
+ fontSize: 14,
1053
+ fontWeight: "var(--fw-medium)",
1054
+ lineHeight: TITLE_LINE_HEIGHT + "px",
1054
1055
  color: strong ? fg : "var(--text-primary)"
1055
1056
  },
1056
1057
  children: title
1057
1058
  }
1058
- ) : null,
1059
+ ),
1059
1060
  /* @__PURE__ */ jsx5(
1060
1061
  "div",
1061
1062
  {
1062
1063
  "data-slot": "alert-body",
1063
1064
  style: {
1064
- marginTop: title ? 2 : 0,
1065
+ marginTop: 2,
1065
1066
  fontFamily: "var(--font-sans)",
1066
- fontSize: 12.5,
1067
- lineHeight: 1.45,
1068
- color: strong ? "color-mix(in srgb, " + fg + " 88%, var(--text-primary))" : "var(--text-tertiary)"
1067
+ fontSize: "var(--fs-sm)",
1068
+ lineHeight: "var(--lh-normal)",
1069
+ color: strong ? "color-mix(in srgb, " + fg + " 88%, var(--text-primary))" : "var(--text-secondary)"
1069
1070
  },
1070
1071
  children
1071
1072
  }
@@ -1099,21 +1100,20 @@ function DismissButton({
1099
1100
  style: {
1100
1101
  flexShrink: 0,
1101
1102
  display: "inline-flex",
1102
- width: 24,
1103
- height: 24,
1104
- marginTop: -1,
1103
+ width: 28,
1104
+ height: 28,
1105
1105
  alignItems: "center",
1106
1106
  justifyContent: "center",
1107
1107
  borderRadius: "var(--radius-md)",
1108
- border: 0,
1109
- background: hover ? "var(--action-hover)" : "transparent",
1110
- color: hover ? strong ? fg : "var(--text-primary)" : strong ? "color-mix(in srgb, " + fg + " 70%, transparent)" : "var(--text-tertiary)",
1108
+ border: "1px solid var(--border)",
1109
+ background: hover ? "var(--action-hover)" : "var(--bg-surface)",
1110
+ color: hover ? strong ? fg : "var(--text-primary)" : strong ? "color-mix(in srgb, " + fg + " 70%, transparent)" : "var(--text-secondary)",
1111
1111
  cursor: "pointer",
1112
1112
  outline: "none",
1113
1113
  boxShadow: focus ? "0 0 0 2px var(--focus-ring)" : "none",
1114
1114
  transition: "background var(--dur-fast) var(--ease-standard), color var(--dur-fast) var(--ease-standard)"
1115
1115
  },
1116
- children: /* @__PURE__ */ jsx5(XIcon, { size: 15 })
1116
+ children: /* @__PURE__ */ jsx5(X, { "aria-hidden": "true", size: 15 })
1117
1117
  }
1118
1118
  );
1119
1119
  }
@@ -1915,9 +1915,26 @@ Label.displayName = "Label";
1915
1915
 
1916
1916
  // src/components/ui/switch.tsx
1917
1917
  import * as React9 from "react";
1918
+ import { cva as cva7 } from "class-variance-authority";
1918
1919
  import { Loader2 as Loader22 } from "lucide-react";
1919
1920
  import { Switch as SwitchPrimitive } from "radix-ui";
1920
- import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
1921
+ import { Fragment, jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
1922
+ var switchFieldVariants = cva7("", {
1923
+ variants: {
1924
+ labelPlacement: {
1925
+ end: "flex flex-col gap-[var(--space-1)]",
1926
+ start: "flex items-start gap-[var(--space-3)]"
1927
+ },
1928
+ fullWidth: {
1929
+ true: "w-full",
1930
+ false: "w-fit"
1931
+ }
1932
+ },
1933
+ defaultVariants: {
1934
+ labelPlacement: "end",
1935
+ fullWidth: false
1936
+ }
1937
+ });
1921
1938
  var Switch = React9.forwardRef(
1922
1939
  ({
1923
1940
  className,
@@ -1925,6 +1942,8 @@ var Switch = React9.forwardRef(
1925
1942
  description,
1926
1943
  required,
1927
1944
  loading,
1945
+ labelPlacement = "end",
1946
+ fullWidth = false,
1928
1947
  disabled,
1929
1948
  id,
1930
1949
  ...props
@@ -1934,95 +1953,108 @@ var Switch = React9.forwardRef(
1934
1953
  const labelId = id ? `${id}-label` : `${generatedId}-label`;
1935
1954
  const descriptionId = description ? id ? `${id}-description` : `${generatedId}-description` : void 0;
1936
1955
  const isDisabled = disabled || loading;
1937
- return /* @__PURE__ */ jsxs10(
1938
- "div",
1956
+ const isStart = labelPlacement === "start";
1957
+ const track = /* @__PURE__ */ jsxs10(
1958
+ SwitchPrimitive.Root,
1939
1959
  {
1940
- "data-slot": "switch-field",
1941
- "data-disabled": isDisabled ? "" : void 0,
1942
- className: "flex flex-col gap-[var(--space-1)] w-fit",
1960
+ ref,
1961
+ id: switchId,
1962
+ "data-slot": "switch",
1963
+ disabled: isDisabled,
1964
+ "aria-required": required || void 0,
1965
+ "aria-busy": loading || void 0,
1966
+ "aria-describedby": descriptionId,
1967
+ className: cn(
1968
+ "group relative inline-flex h-[24px] w-[44px] cursor-pointer items-center rounded-full transition-colors",
1969
+ "bg-[var(--border)] data-[state=checked]:bg-[var(--primary)]",
1970
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--bg-base)]",
1971
+ "disabled:cursor-not-allowed disabled:opacity-50",
1972
+ isStart && "shrink-0",
1973
+ className
1974
+ ),
1975
+ ...props,
1943
1976
  children: [
1944
- /* @__PURE__ */ jsxs10("div", { className: "inline-flex items-center gap-[var(--space-3)]", children: [
1945
- /* @__PURE__ */ jsxs10(
1946
- SwitchPrimitive.Root,
1947
- {
1948
- ref,
1949
- id: switchId,
1950
- "data-slot": "switch",
1951
- disabled: isDisabled,
1952
- "aria-required": required || void 0,
1953
- "aria-busy": loading || void 0,
1954
- "aria-describedby": descriptionId,
1955
- className: cn(
1956
- "group relative inline-flex h-[24px] w-[44px] cursor-pointer items-center rounded-full transition-colors",
1957
- "bg-[var(--border)] data-[state=checked]:bg-[var(--primary)]",
1958
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--bg-base)]",
1959
- "disabled:cursor-not-allowed disabled:opacity-50",
1960
- className
1961
- ),
1962
- ...props,
1963
- children: [
1964
- /* @__PURE__ */ jsx10(
1965
- SwitchPrimitive.Thumb,
1966
- {
1967
- "data-slot": "switch-thumb",
1968
- className: cn(
1969
- "pointer-events-none block h-[20px] w-[20px] rounded-full bg-[var(--bg-surface)] shadow",
1970
- "transition-transform translate-x-[2px] data-[state=checked]:translate-x-[22px]"
1971
- )
1972
- }
1973
- ),
1974
- loading ? /* @__PURE__ */ jsx10(
1975
- "span",
1976
- {
1977
- "aria-hidden": "true",
1978
- "data-slot": "switch-loading",
1979
- className: "absolute inset-0 flex items-center justify-center",
1980
- children: /* @__PURE__ */ jsx10(Loader22, { className: "size-[14px] animate-spin text-text-secondary" })
1981
- }
1982
- ) : null
1983
- ]
1984
- }
1985
- ),
1986
- /* @__PURE__ */ jsxs10(
1987
- "label",
1988
- {
1989
- htmlFor: switchId,
1990
- id: labelId,
1991
- "data-slot": "switch-label",
1992
- className: cn(
1993
- "cursor-pointer select-none text-sm font-medium text-foreground",
1994
- isDisabled && "cursor-not-allowed text-text-disabled"
1995
- ),
1996
- children: [
1997
- label,
1998
- required ? /* @__PURE__ */ jsx10(
1999
- "span",
2000
- {
2001
- "aria-hidden": "true",
2002
- "data-slot": "switch-required-marker",
2003
- className: "ml-[var(--space-1)] font-bold text-[var(--semantic-error,var(--error))]",
2004
- children: "*"
2005
- }
2006
- ) : null
2007
- ]
2008
- }
2009
- )
2010
- ] }),
2011
- description ? /* @__PURE__ */ jsx10(
2012
- "p",
1977
+ /* @__PURE__ */ jsx10(
1978
+ SwitchPrimitive.Thumb,
2013
1979
  {
2014
- id: descriptionId,
2015
- "data-slot": "switch-description",
1980
+ "data-slot": "switch-thumb",
2016
1981
  className: cn(
2017
- "ml-[var(--space-3)] text-xs font-normal leading-normal text-text-tertiary",
2018
- isDisabled && "text-text-disabled"
2019
- ),
2020
- children: description
1982
+ "pointer-events-none block h-[20px] w-[20px] rounded-full bg-[var(--bg-surface)] shadow",
1983
+ "transition-transform translate-x-[2px] data-[state=checked]:translate-x-[22px]"
1984
+ )
1985
+ }
1986
+ ),
1987
+ loading ? /* @__PURE__ */ jsx10(
1988
+ "span",
1989
+ {
1990
+ "aria-hidden": "true",
1991
+ "data-slot": "switch-loading",
1992
+ className: "absolute inset-0 flex items-center justify-center",
1993
+ children: /* @__PURE__ */ jsx10(Loader22, { className: "size-[14px] animate-spin text-text-secondary" })
1994
+ }
1995
+ ) : null
1996
+ ]
1997
+ }
1998
+ );
1999
+ const labelNode = /* @__PURE__ */ jsxs10(
2000
+ "label",
2001
+ {
2002
+ htmlFor: switchId,
2003
+ id: labelId,
2004
+ "data-slot": "switch-label",
2005
+ className: cn(
2006
+ "cursor-pointer select-none break-keep text-sm font-medium text-foreground [overflow-wrap:anywhere]",
2007
+ isStart && "leading-6",
2008
+ isDisabled && "cursor-not-allowed text-text-disabled"
2009
+ ),
2010
+ children: [
2011
+ label,
2012
+ required ? /* @__PURE__ */ jsx10(
2013
+ "span",
2014
+ {
2015
+ "aria-hidden": "true",
2016
+ "data-slot": "switch-required-marker",
2017
+ className: "ml-[var(--space-1)] font-bold text-[var(--semantic-error,var(--error))]",
2018
+ children: "*"
2021
2019
  }
2022
2020
  ) : null
2023
2021
  ]
2024
2022
  }
2025
2023
  );
2024
+ const descriptionNode = description ? /* @__PURE__ */ jsx10(
2025
+ "p",
2026
+ {
2027
+ id: descriptionId,
2028
+ "data-slot": "switch-description",
2029
+ className: cn(
2030
+ "break-keep text-xs font-normal leading-normal text-text-tertiary [overflow-wrap:anywhere]",
2031
+ !isStart && "ml-[var(--space-3)]",
2032
+ isDisabled && "text-text-disabled"
2033
+ ),
2034
+ children: description
2035
+ }
2036
+ ) : null;
2037
+ return /* @__PURE__ */ jsx10(
2038
+ "div",
2039
+ {
2040
+ "data-slot": "switch-field",
2041
+ "data-disabled": isDisabled ? "" : void 0,
2042
+ className: switchFieldVariants({ labelPlacement, fullWidth }),
2043
+ children: isStart ? /* @__PURE__ */ jsxs10(Fragment, { children: [
2044
+ /* @__PURE__ */ jsxs10("div", { className: "flex min-w-0 grow flex-col gap-[var(--space-1)]", children: [
2045
+ labelNode,
2046
+ descriptionNode
2047
+ ] }),
2048
+ track
2049
+ ] }) : /* @__PURE__ */ jsxs10(Fragment, { children: [
2050
+ /* @__PURE__ */ jsxs10("div", { className: "inline-flex items-center gap-[var(--space-3)]", children: [
2051
+ track,
2052
+ labelNode
2053
+ ] }),
2054
+ descriptionNode
2055
+ ] })
2056
+ }
2057
+ );
2026
2058
  }
2027
2059
  );
2028
2060
  Switch.displayName = "Switch";
@@ -2126,7 +2158,7 @@ function TooltipContent({
2126
2158
  }
2127
2159
 
2128
2160
  // src/components/ui/permission-guard.tsx
2129
- import { Fragment as Fragment2, jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
2161
+ import { Fragment as Fragment3, jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
2130
2162
  var defaultDisabledReason = "\uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4";
2131
2163
  var PermissionContext = React11.createContext(
2132
2164
  void 0
@@ -2173,7 +2205,7 @@ function PermissionGuard({
2173
2205
  const state = React11.useContext(PermissionContext);
2174
2206
  const allowed = evaluatePermission(permission, permissions ?? state, scope);
2175
2207
  if (allowed) {
2176
- return /* @__PURE__ */ jsx12(Fragment2, { children });
2208
+ return /* @__PURE__ */ jsx12(Fragment3, { children });
2177
2209
  }
2178
2210
  if (fallback === "hide" || fallback == null) {
2179
2211
  return null;
@@ -2181,7 +2213,7 @@ function PermissionGuard({
2181
2213
  if (fallback === "disabled") {
2182
2214
  return renderDisabledFallback(children, disabledReason);
2183
2215
  }
2184
- return /* @__PURE__ */ jsx12(Fragment2, { children: fallback });
2216
+ return /* @__PURE__ */ jsx12(Fragment3, { children: fallback });
2185
2217
  }
2186
2218
  function getPermissionCandidates(permission, scope) {
2187
2219
  const candidates = /* @__PURE__ */ new Set([permission]);
@@ -2234,9 +2266,9 @@ function isPermissionState(value) {
2234
2266
 
2235
2267
  // src/components/ui/card.tsx
2236
2268
  import * as React12 from "react";
2237
- import { cva as cva7 } from "class-variance-authority";
2269
+ import { cva as cva8 } from "class-variance-authority";
2238
2270
  import { jsx as jsx13 } from "react/jsx-runtime";
2239
- var cardBaseVariants = cva7(
2271
+ var cardBaseVariants = cva8(
2240
2272
  [
2241
2273
  "rounded-[var(--radius-lg)] border border-[var(--border)]",
2242
2274
  "px-[var(--space-6)] py-[var(--space-4)] text-foreground"
@@ -2621,7 +2653,7 @@ DataLayout.displayName = "DataLayout";
2621
2653
  // src/components/ui/wizard-layout.tsx
2622
2654
  import * as React16 from "react";
2623
2655
  import { Check as Check2 } from "lucide-react";
2624
- import { Fragment as Fragment5, jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
2656
+ import { Fragment as Fragment6, jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
2625
2657
  var circleBaseClassName = [
2626
2658
  "flex items-center justify-center rounded-[var(--radius-full)] border text-[12px] font-semibold leading-none",
2627
2659
  "transition-[background-color,border-color,color] motion-reduce:transition-none"
@@ -2912,7 +2944,7 @@ var WizardLayout = React16.forwardRef(
2912
2944
  ) : null
2913
2945
  ]
2914
2946
  }
2915
- ) : /* @__PURE__ */ jsxs16(Fragment5, { children: [
2947
+ ) : /* @__PURE__ */ jsxs16(Fragment6, { children: [
2916
2948
  /* @__PURE__ */ jsx17(
2917
2949
  "span",
2918
2950
  {
@@ -2979,10 +3011,10 @@ import * as React18 from "react";
2979
3011
  // src/components/ui/tabs.tsx
2980
3012
  import * as React17 from "react";
2981
3013
  import { Tabs as TabsPrimitive } from "radix-ui";
2982
- import { cva as cva8 } from "class-variance-authority";
3014
+ import { cva as cva9 } from "class-variance-authority";
2983
3015
  import { Lock } from "lucide-react";
2984
- import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
2985
- var tabsRootVariants = cva8("w-full", {
3016
+ import { Fragment as Fragment7, jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
3017
+ var tabsRootVariants = cva9("w-full", {
2986
3018
  variants: {
2987
3019
  orientation: {
2988
3020
  horizontal: "",
@@ -2993,13 +3025,14 @@ var tabsRootVariants = cva8("w-full", {
2993
3025
  orientation: "horizontal"
2994
3026
  }
2995
3027
  });
2996
- var tabsListVariants = cva8(
2997
- "flex",
3028
+ var tabsListVariants = cva9(
3029
+ // A list that overflows scrolls sideways without showing a scrollbar.
3030
+ "flex [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden",
2998
3031
  {
2999
3032
  variants: {
3000
3033
  variant: {
3001
3034
  line: "",
3002
- contained: "rounded-[var(--radius-md)] border border-[var(--border-subtle)] bg-[var(--bg-inset)] p-[var(--space-1)]"
3035
+ contained: `rounded-[var(--radius-md)] border border-[var(--border-subtle)] bg-[var(--bg-inset)] p-[var(--space-1)] ${insetMarkerContext}`
3003
3036
  },
3004
3037
  orientation: {
3005
3038
  horizontal: "",
@@ -3034,7 +3067,7 @@ var tabsListVariants = cva8(
3034
3067
  }
3035
3068
  }
3036
3069
  );
3037
- var tabsTriggerVariants = cva8(
3070
+ var tabsTriggerVariants = cva9(
3038
3071
  [
3039
3072
  "relative inline-flex shrink-0 cursor-pointer items-center gap-[var(--space-2)]",
3040
3073
  "px-0 py-[var(--space-2)] text-body-sm font-medium",
@@ -3088,7 +3121,7 @@ var tabsTriggerVariants = cva8(
3088
3121
  }
3089
3122
  }
3090
3123
  );
3091
- var tabsIndicatorVariants = cva8(
3124
+ var tabsIndicatorVariants = cva9(
3092
3125
  [
3093
3126
  "pointer-events-none absolute invisible bg-[var(--text-primary)]",
3094
3127
  // transition-property stays none (duration alone would animate every property, visibility included)
@@ -3117,18 +3150,11 @@ var tabsLabelReserveClassName = [
3117
3150
  "before:invisible before:h-0 before:overflow-hidden before:font-medium before:content-[attr(data-label)]",
3118
3151
  "after:invisible after:h-0 after:overflow-hidden after:font-bold after:content-[attr(data-label)]"
3119
3152
  ].join(" ");
3120
- var tabsBadgeVariants = cva8(
3153
+ var tabsBadgeVariants = cva9(
3121
3154
  [
3122
- "inline-flex h-[18px] min-w-[18px] items-center justify-center",
3123
- "rounded-[var(--radius-full)] border border-[var(--border-subtle)]",
3124
- "bg-[var(--bg-inset)] px-[var(--space-1)]",
3125
- "font-[family-name:var(--font-display)] text-xs font-semibold leading-none tabular-nums",
3126
- // R14 — Badge는 metadata, 추가 marker(filled wash)가 아니다. marker 종류는
3127
- // trigger underline 하나(active-state doctrine). single-hue-family: active 시 인접
3128
- // visible token(underline + badge text + badge border)을 같은 hue family로 — text는
3129
- // inherit, border는 active만 중립 --border-strong로 lift(accent rationing — selection은 brand 미사용). filled wash는 여전히 금지.
3130
- "text-inherit",
3131
- "group-data-[state=active]:border-[var(--border-strong)]"
3155
+ "inline-flex h-[var(--space-4)] min-w-[var(--space-4)] items-center justify-center",
3156
+ "rounded-[var(--radius-full)] px-[var(--space-1)] bg-[var(--action-selected)]",
3157
+ "font-[family-name:var(--font-display)] text-xs font-medium tabular-nums text-inherit"
3132
3158
  ].join(" ")
3133
3159
  );
3134
3160
  function useTabsIndicator(enabled, activeKey, tabsKey, listRef, indicatorRef) {
@@ -3188,7 +3214,15 @@ function useTabsIndicator(enabled, activeKey, tabsKey, listRef, indicatorRef) {
3188
3214
  }, [enabled, tabsKey, place, listRef]);
3189
3215
  }
3190
3216
  function formatTabBadge(value) {
3191
- return value > 99 ? "99+" : String(value);
3217
+ return value > 999 ? "999+" : String(value);
3218
+ }
3219
+ function isShownTabBadge(value) {
3220
+ if (value === void 0) return false;
3221
+ if (Number.isFinite(value) && value >= 0) return true;
3222
+ if (typeof process !== "undefined" && process.env.NODE_ENV !== "production") {
3223
+ console.warn(`Tabs: badge must be a number 0 or greater (got ${value}). The badge is not shown.`);
3224
+ }
3225
+ return false;
3192
3226
  }
3193
3227
  function getTabId(baseId, key) {
3194
3228
  return baseId ? `${baseId}-tab-${key}` : `tab-${key}`;
@@ -3246,7 +3280,10 @@ var Tabs = React17.forwardRef(
3246
3280
  className: cn("group", tabsTriggerVariants({ variant, orientation }), triggerClassName),
3247
3281
  children: [
3248
3282
  isLine ? /* @__PURE__ */ jsx18("span", { "data-label": tab.label, className: tabsLabelReserveClassName, children: tab.label }) : /* @__PURE__ */ jsx18("span", { children: tab.label }),
3249
- tab.badge !== void 0 && tab.badge > 0 ? /* @__PURE__ */ jsx18("span", { "aria-hidden": "true", "data-slot": "tabs-badge", className: tabsBadgeVariants(), children: formatTabBadge(tab.badge) }) : null,
3283
+ isShownTabBadge(tab.badge) ? /* @__PURE__ */ jsxs17(Fragment7, { children: [
3284
+ /* @__PURE__ */ jsx18("span", { "aria-hidden": "true", "data-slot": "tabs-badge", className: tabsBadgeVariants(), children: formatTabBadge(tab.badge) }),
3285
+ /* @__PURE__ */ jsx18("span", { className: "sr-only", children: ` ${tab.badge}` })
3286
+ ] }) : null,
3250
3287
  tab.disabled ? /* @__PURE__ */ jsx18(
3251
3288
  Lock,
3252
3289
  {
@@ -3302,7 +3339,7 @@ var TabsContent = React17.forwardRef(({ className, tabKey, baseId, ...props }, r
3302
3339
  TabsContent.displayName = TabsPrimitive.Content.displayName;
3303
3340
 
3304
3341
  // src/components/ui/detail-layout.tsx
3305
- import { Fragment as Fragment6, jsx as jsx19, jsxs as jsxs18 } from "react/jsx-runtime";
3342
+ import { Fragment as Fragment8, jsx as jsx19, jsxs as jsxs18 } from "react/jsx-runtime";
3306
3343
  function DetailLayoutBody({
3307
3344
  children,
3308
3345
  aside,
@@ -3355,7 +3392,7 @@ function appendFooterToActiveTabsContent(children, activeTab, footer) {
3355
3392
  return React18.cloneElement(
3356
3393
  child,
3357
3394
  void 0,
3358
- /* @__PURE__ */ jsxs18(Fragment6, { children: [
3395
+ /* @__PURE__ */ jsxs18(Fragment8, { children: [
3359
3396
  child.props.children,
3360
3397
  /* @__PURE__ */ jsx19("div", { "data-slot": "detail-layout-footer", className: "min-w-0", children: footer })
3361
3398
  ] })
@@ -3437,7 +3474,7 @@ var DetailLayout = React18.forwardRef(
3437
3474
  baseId,
3438
3475
  forceMount: true,
3439
3476
  hidden: tab.key !== activeTab,
3440
- children: tab.key === activeTab ? /* @__PURE__ */ jsxs18(Fragment6, { children: [
3477
+ children: tab.key === activeTab ? /* @__PURE__ */ jsxs18(Fragment8, { children: [
3441
3478
  body,
3442
3479
  footer ? /* @__PURE__ */ jsx19("div", { "data-slot": "detail-layout-footer", className: "min-w-0", children: footer }) : null
3443
3480
  ] }) : null
@@ -3445,7 +3482,7 @@ var DetailLayout = React18.forwardRef(
3445
3482
  tab.key
3446
3483
  ))
3447
3484
  }
3448
- ) : /* @__PURE__ */ jsxs18(Fragment6, { children: [
3485
+ ) : /* @__PURE__ */ jsxs18(Fragment8, { children: [
3449
3486
  body,
3450
3487
  footer ? /* @__PURE__ */ jsx19("div", { "data-slot": "detail-layout-footer", className: "min-w-0", children: footer }) : null
3451
3488
  ] })
@@ -3869,16 +3906,16 @@ function OverlayGrabber({
3869
3906
  }
3870
3907
 
3871
3908
  // src/components/ui/overlay-close-button.tsx
3872
- import { X } from "lucide-react";
3909
+ import { X as X2 } from "lucide-react";
3873
3910
  import { Dialog as DialogPrimitive } from "radix-ui";
3874
3911
 
3875
3912
  // src/components/ui/icon-button.tsx
3876
3913
  import * as React23 from "react";
3877
- import { cva as cva9 } from "class-variance-authority";
3914
+ import { cva as cva10 } from "class-variance-authority";
3878
3915
  import { ChevronDown as ChevronDown4, Loader2 as Loader23 } from "lucide-react";
3879
3916
  import { jsx as jsx22, jsxs as jsxs20 } from "react/jsx-runtime";
3880
3917
  var pressedNeutralClassName = "border-[var(--border-strong)] bg-[var(--action-selected)] text-foreground";
3881
- var iconButtonCva = cva9(
3918
+ var iconButtonCva = cva10(
3882
3919
  [
3883
3920
  "olun-icon-button relative inline-flex cursor-pointer shrink-0 items-center justify-center before:absolute before:content-['']",
3884
3921
  "rounded-[var(--radius-md)] border font-medium",
@@ -3932,7 +3969,7 @@ function iconButtonVariants(options) {
3932
3969
  ...resolveActionStyle(options?.appearance, options?.tone, "ghost")
3933
3970
  });
3934
3971
  }
3935
- var iconButtonBadgeVariants = cva9(
3972
+ var iconButtonBadgeVariants = cva10(
3936
3973
  [
3937
3974
  "pointer-events-none absolute right-0 top-0 inline-flex",
3938
3975
  "olun-icon-button__badge",
@@ -4067,7 +4104,7 @@ function OverlayCloseButton({
4067
4104
  label = "\uB2EB\uAE30",
4068
4105
  className
4069
4106
  }) {
4070
- return /* @__PURE__ */ jsx23(DialogPrimitive.Close, { asChild: true, children: /* @__PURE__ */ jsx23(IconButton, { appearance: "ghost", size: "md", icon: X, "aria-label": label, className }) });
4107
+ return /* @__PURE__ */ jsx23(DialogPrimitive.Close, { asChild: true, children: /* @__PURE__ */ jsx23(IconButton, { appearance: "ghost", size: "md", icon: X2, "aria-label": label, className }) });
4071
4108
  }
4072
4109
 
4073
4110
  // src/components/ui/overlay-anatomy.tsx
@@ -4194,7 +4231,7 @@ function focusBodyInput(event) {
4194
4231
  }
4195
4232
  }
4196
4233
  var headingClassName = {
4197
- title: "text-[18px] font-bold leading-snug text-foreground",
4234
+ title: "text-base font-semibold leading-normal text-foreground",
4198
4235
  menu: "text-[15px] font-semibold leading-snug text-foreground"
4199
4236
  };
4200
4237
  var descriptionClassName = {
@@ -4626,7 +4663,7 @@ function SheetTitle({
4626
4663
  SheetPrimitive.Title,
4627
4664
  {
4628
4665
  "data-slot": "sheet-title",
4629
- className: cn("font-semibold text-foreground", className),
4666
+ className: cn("text-base font-semibold leading-normal text-foreground", className),
4630
4667
  ...props
4631
4668
  }
4632
4669
  );
@@ -4646,7 +4683,7 @@ function SheetDescription({
4646
4683
  }
4647
4684
 
4648
4685
  // src/components/ui/dialog.tsx
4649
- import { Fragment as Fragment7, jsx as jsx26, jsxs as jsxs23 } from "react/jsx-runtime";
4686
+ import { Fragment as Fragment9, jsx as jsx26, jsxs as jsxs23 } from "react/jsx-runtime";
4650
4687
  function dialogMobileSheetStyle(style) {
4651
4688
  return getDefaultSheetMotionStyle(style);
4652
4689
  }
@@ -4740,7 +4777,7 @@ function StructuredDialog({
4740
4777
  footerRow
4741
4778
  ]
4742
4779
  }
4743
- ) : /* @__PURE__ */ jsxs23(Fragment7, { children: [
4780
+ ) : /* @__PURE__ */ jsxs23(Fragment9, { children: [
4744
4781
  body,
4745
4782
  footerRow
4746
4783
  ] })
@@ -4873,7 +4910,7 @@ var DialogTitle = React26.forwardRef(({ className, ...props }, ref) => /* @__PUR
4873
4910
  {
4874
4911
  ref,
4875
4912
  className: cn(
4876
- "text-xl font-bold leading-tight tracking-tight text-foreground",
4913
+ "text-base font-semibold leading-normal text-foreground",
4877
4914
  className
4878
4915
  ),
4879
4916
  ...props
@@ -4941,7 +4978,7 @@ function FormModal({
4941
4978
 
4942
4979
  // src/components/ui/alert-dialog.tsx
4943
4980
  import { AlertDialog as AlertDialogPrimitive2 } from "radix-ui";
4944
- import { Fragment as Fragment8, jsx as jsx28, jsxs as jsxs25 } from "react/jsx-runtime";
4981
+ import { Fragment as Fragment10, jsx as jsx28, jsxs as jsxs25 } from "react/jsx-runtime";
4945
4982
  function AlertDialogFrame({
4946
4983
  open,
4947
4984
  onOpenChange,
@@ -5005,7 +5042,7 @@ function AlertDialog({
5005
5042
  disabled: confirmDisabled,
5006
5043
  onError
5007
5044
  });
5008
- const footer = confirmLabel != null ? /* @__PURE__ */ jsxs25(Fragment8, { children: [
5045
+ const footer = confirmLabel != null ? /* @__PURE__ */ jsxs25(Fragment10, { children: [
5009
5046
  /* @__PURE__ */ jsx28(AlertDialogPrimitive2.Cancel, { asChild: true, children: /* @__PURE__ */ jsx28(Button, { appearance: "outline", tone: "neutral", size: "lg", className: footerButtonHitAreaClassName, disabled: isBusy, children: cancelLabel }) }),
5010
5047
  /* @__PURE__ */ jsx28(
5011
5048
  Button,
@@ -5080,11 +5117,11 @@ import { SlidersHorizontal } from "lucide-react";
5080
5117
 
5081
5118
  // src/components/ui/chip.tsx
5082
5119
  import * as React27 from "react";
5083
- import { cva as cva10 } from "class-variance-authority";
5084
- import { X as X2 } from "lucide-react";
5120
+ import { cva as cva11 } from "class-variance-authority";
5121
+ import { X as X3 } from "lucide-react";
5085
5122
  import { Slot as Slot2 } from "radix-ui";
5086
5123
  import { jsx as jsx30, jsxs as jsxs26 } from "react/jsx-runtime";
5087
- var chipVariants = cva10(
5124
+ var chipVariants = cva11(
5088
5125
  [
5089
5126
  "inline-flex w-fit shrink-0 items-center justify-center whitespace-nowrap",
5090
5127
  "rounded-[var(--radius-full)] border leading-none",
@@ -5105,7 +5142,7 @@ var chipVariants = cva10(
5105
5142
  "status-filter": "cursor-default"
5106
5143
  },
5107
5144
  tone: {
5108
- neutral: "border-[var(--border-subtle)] bg-[var(--bg-surface)] text-text-secondary hover:bg-[var(--action-hover)]",
5145
+ neutral: `border-[var(--border-subtle)] bg-[var(--bg-surface)] text-text-secondary hover:bg-[var(--action-hover)] ${surfaceMarkerContext}`,
5109
5146
  accent: "border-[var(--border-accent)] bg-transparent text-[var(--accent)] hover:bg-[var(--accent-bg-strong)]",
5110
5147
  success: "border-transparent bg-[var(--success-bg)] text-[var(--success)] hover:bg-[var(--action-hover)]",
5111
5148
  warning: "border-transparent bg-[var(--warning-bg)] text-[var(--warning)] hover:bg-[var(--action-hover)]",
@@ -5137,7 +5174,7 @@ var chipVariants = cva10(
5137
5174
  {
5138
5175
  pressed: true,
5139
5176
  tone: "muted",
5140
- className: "border-[var(--border-strong)] bg-[var(--bg-inset)] text-text-secondary"
5177
+ className: `border-[var(--border-strong)] bg-[var(--bg-inset)] text-text-secondary ${insetMarkerContext}`
5141
5178
  }
5142
5179
  ],
5143
5180
  defaultVariants: {
@@ -5148,7 +5185,7 @@ var chipVariants = cva10(
5148
5185
  }
5149
5186
  }
5150
5187
  );
5151
- var chipCountVariants = cva10(
5188
+ var chipCountVariants = cva11(
5152
5189
  [
5153
5190
  "inline-flex min-w-[var(--space-4)] items-center justify-center",
5154
5191
  "rounded-[var(--radius-full)] px-[var(--space-1)]",
@@ -5157,12 +5194,13 @@ var chipCountVariants = cva10(
5157
5194
  {
5158
5195
  variants: {
5159
5196
  tone: {
5160
- neutral: "bg-[var(--bg-inset)] text-text-tertiary",
5197
+ // neutral·muted take --fill-on-bg when an inset background sets it (see surface.ts).
5198
+ neutral: "bg-[var(--fill-on-bg,var(--bg-inset))] text-text-tertiary",
5161
5199
  accent: "bg-[var(--accent-pop)] text-[var(--accent-on-fill)]",
5162
5200
  success: "bg-[var(--success)] text-[var(--success-contrast)]",
5163
5201
  warning: "bg-[var(--warning)] text-[var(--warning-contrast)]",
5164
5202
  danger: "bg-[var(--error)] text-[var(--error-contrast)]",
5165
- muted: "bg-[var(--bg-inset)] text-text-tertiary"
5203
+ muted: "bg-[var(--fill-on-bg,var(--bg-inset))] text-text-tertiary"
5166
5204
  },
5167
5205
  size: {
5168
5206
  sm: "h-[var(--space-4)] text-xs",
@@ -5231,7 +5269,7 @@ var Chip = React27.forwardRef(
5231
5269
  disabled,
5232
5270
  onClick,
5233
5271
  className: "inline-flex size-[var(--space-4)] items-center justify-center rounded-[var(--radius-full)] text-text-tertiary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]",
5234
- children: /* @__PURE__ */ jsx30(X2, { "aria-hidden": "true", size: 14, strokeWidth: 2.25 })
5272
+ children: /* @__PURE__ */ jsx30(X3, { "aria-hidden": "true", size: 14, strokeWidth: 2.25 })
5235
5273
  }
5236
5274
  )
5237
5275
  ]
@@ -5333,7 +5371,7 @@ var PopoverArrow = React28.forwardRef(({ className, ...props }, ref) => /* @__PU
5333
5371
  PopoverArrow.displayName = PopoverPrimitive.Arrow.displayName;
5334
5372
 
5335
5373
  // src/components/ui/filter-toolbar.tsx
5336
- import { Fragment as Fragment9, jsx as jsx32, jsxs as jsxs28 } from "react/jsx-runtime";
5374
+ import { Fragment as Fragment11, jsx as jsx32, jsxs as jsxs28 } from "react/jsx-runtime";
5337
5375
  var collapsibleClassNames = {
5338
5376
  sm: {
5339
5377
  inline: "hidden @[640px]:flex",
@@ -5545,7 +5583,7 @@ var FilterToolbar = React29.forwardRef(
5545
5583
  activeFilterCount,
5546
5584
  "\uAC1C \uC801\uC6A9"
5547
5585
  ] }),
5548
- onClearFilters ? /* @__PURE__ */ jsxs28(Fragment9, { children: [
5586
+ onClearFilters ? /* @__PURE__ */ jsxs28(Fragment11, { children: [
5549
5587
  /* @__PURE__ */ jsx32("span", { "aria-hidden": "true", children: " \xB7 " }),
5550
5588
  /* @__PURE__ */ jsx32(
5551
5589
  "button",
@@ -5595,16 +5633,16 @@ FilterToolbar.displayName = "FilterToolbar";
5595
5633
 
5596
5634
  // src/components/ui/data-table.tsx
5597
5635
  import * as React33 from "react";
5598
- import { ChevronDown as ChevronDown5, ChevronUp as ChevronUp2, ChevronsUpDown } from "lucide-react";
5599
- import { cva as cva12 } from "class-variance-authority";
5636
+ import { ChevronDown as ChevronDown5, ChevronRight as ChevronRight3, ChevronUp as ChevronUp2, ChevronsUpDown } from "lucide-react";
5637
+ import { cva as cva13 } from "class-variance-authority";
5600
5638
 
5601
5639
  // src/components/ui/checkbox.tsx
5602
5640
  import * as React30 from "react";
5603
- import { cva as cva11 } from "class-variance-authority";
5641
+ import { cva as cva12 } from "class-variance-authority";
5604
5642
  import { Check as Check3, Minus } from "lucide-react";
5605
5643
  import { Checkbox as CheckboxPrimitive } from "radix-ui";
5606
5644
  import { jsx as jsx33, jsxs as jsxs29 } from "react/jsx-runtime";
5607
- var checkboxFieldVariants = cva11(
5645
+ var checkboxFieldVariants = cva12(
5608
5646
  "flex flex-col gap-[var(--space-1)]",
5609
5647
  {
5610
5648
  variants: {
@@ -5619,14 +5657,14 @@ var checkboxFieldVariants = cva11(
5619
5657
  }
5620
5658
  );
5621
5659
  var checkboxVariants = checkboxFieldVariants;
5622
- var checkboxRootVariants = cva11(
5660
+ var checkboxRootVariants = cva12(
5623
5661
  [
5624
5662
  "group shrink-0 cursor-pointer rounded-[var(--radius-xs)]",
5625
5663
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--bg-base)]",
5626
5664
  "disabled:cursor-not-allowed"
5627
5665
  ].join(" ")
5628
5666
  );
5629
- var checkboxBoxVariants = cva11(
5667
+ var checkboxBoxVariants = cva12(
5630
5668
  [
5631
5669
  "flex shrink-0 items-center justify-center rounded-[var(--radius-xs)] border",
5632
5670
  "border-[var(--border-strong)] bg-[var(--bg-surface)] text-transparent",
@@ -5650,7 +5688,7 @@ var checkboxBoxVariants = cva11(
5650
5688
  }
5651
5689
  }
5652
5690
  );
5653
- var checkboxGroupItemVariants = cva11(
5691
+ var checkboxGroupItemVariants = cva12(
5654
5692
  [
5655
5693
  "group w-full cursor-pointer text-left transition-colors motion-reduce:transition-none",
5656
5694
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--bg-base)]",
@@ -5692,7 +5730,7 @@ var checkboxGroupItemVariants = cva11(
5692
5730
  }
5693
5731
  }
5694
5732
  );
5695
- var checkboxGroupBoxVariants = cva11(
5733
+ var checkboxGroupBoxVariants = cva12(
5696
5734
  "mt-[2px]",
5697
5735
  {
5698
5736
  variants: {
@@ -6188,7 +6226,7 @@ import { ChevronRight as ChevronRight2, MoreVertical } from "lucide-react";
6188
6226
  // src/components/ui/action-menu.tsx
6189
6227
  import * as React31 from "react";
6190
6228
  import { Dialog as DialogPrimitive4, Slot as Slot3 } from "radix-ui";
6191
- import { Fragment as Fragment11, jsx as jsx35, jsxs as jsxs31 } from "react/jsx-runtime";
6229
+ import { Fragment as Fragment13, jsx as jsx35, jsxs as jsxs31 } from "react/jsx-runtime";
6192
6230
  var sheetRowClassName = cn(
6193
6231
  "group flex min-h-12 w-full cursor-pointer items-center gap-[var(--space-3)] px-[var(--space-4)] py-[var(--space-2)] text-left",
6194
6232
  "border-t border-[var(--border-subtle)] text-[13px] font-medium leading-normal text-text-primary",
@@ -6346,7 +6384,7 @@ function ActionMenu({
6346
6384
  triggerRef.current?.focus();
6347
6385
  };
6348
6386
  const triggerLabel = trigger.props["aria-label"];
6349
- return /* @__PURE__ */ jsxs31(Fragment11, { children: [
6387
+ return /* @__PURE__ */ jsxs31(Fragment13, { children: [
6350
6388
  /* @__PURE__ */ jsxs31(DropdownMenu, { open: open && presentation === "dropdown", onOpenChange: setOpen, children: [
6351
6389
  /* @__PURE__ */ jsx35(DropdownMenuTrigger, { asChild: true, "aria-expanded": open, children: /* @__PURE__ */ jsx35(Slot3.Root, { ref: triggerRef, children: trigger }) }),
6352
6390
  /* @__PURE__ */ jsx35(DropdownMenuContent, { align: "end", onCloseAutoFocus: handleDropdownCloseAutoFocus, children: menuGroups.map((group, index) => /* @__PURE__ */ jsxs31(React31.Fragment, { children: [
@@ -6390,7 +6428,7 @@ function ActionMenu({
6390
6428
  }
6391
6429
 
6392
6430
  // src/components/ui/list-card.tsx
6393
- import { Fragment as Fragment12, jsx as jsx36, jsxs as jsxs32 } from "react/jsx-runtime";
6431
+ import { Fragment as Fragment14, jsx as jsx36, jsxs as jsxs32 } from "react/jsx-runtime";
6394
6432
  function lineTokens(value) {
6395
6433
  return React32.Children.toArray(value).filter((token) => token !== "");
6396
6434
  }
@@ -6477,7 +6515,7 @@ function ListCard({
6477
6515
  children: overlay && href != null ? React32.createElement(linkComponent ?? "a", { ...linkProps, href, className: overlayClassName }, title) : title
6478
6516
  }
6479
6517
  );
6480
- const content = /* @__PURE__ */ jsxs32(Fragment12, { children: [
6518
+ const content = /* @__PURE__ */ jsxs32(Fragment14, { children: [
6481
6519
  leading != null ? /* @__PURE__ */ jsx36("span", { className: "flex min-h-[18px] items-center", children: leading }) : null,
6482
6520
  /* @__PURE__ */ jsxs32("span", { className: "min-w-0", children: [
6483
6521
  overlay && href == null ? (
@@ -6542,8 +6580,8 @@ function ListCard({
6542
6580
  }
6543
6581
 
6544
6582
  // src/components/ui/data-table.tsx
6545
- import { Fragment as Fragment13, jsx as jsx37, jsxs as jsxs33 } from "react/jsx-runtime";
6546
- var dataTableVariants = cva12(
6583
+ import { Fragment as Fragment15, jsx as jsx37, jsxs as jsxs33 } from "react/jsx-runtime";
6584
+ var dataTableVariants = cva13(
6547
6585
  [
6548
6586
  "relative overflow-hidden rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
6549
6587
  "text-foreground"
@@ -6562,7 +6600,7 @@ var dataTableVariants = cva12(
6562
6600
  }
6563
6601
  }
6564
6602
  );
6565
- var dataTableRowVariants = cva12(
6603
+ var dataTableRowVariants = cva13(
6566
6604
  [
6567
6605
  "grid min-h-[48px] items-center border-t border-[var(--border-subtle)]",
6568
6606
  "text-body-sm leading-compact text-foreground",
@@ -6593,9 +6631,9 @@ var alignmentClass = {
6593
6631
  function getRowId(row, keyField) {
6594
6632
  return String(row[keyField]);
6595
6633
  }
6596
- function getGridTemplate(columns, selectable) {
6634
+ function getGridTemplate(columns, selectable, expandable) {
6597
6635
  const columnWidths = columns.map((column) => column.width ?? "1fr");
6598
- return [selectable ? "44px" : null, ...columnWidths].filter(Boolean).join(" ");
6636
+ return [selectable ? "44px" : null, ...columnWidths, expandable ? "40px" : null].filter(Boolean).join(" ");
6599
6637
  }
6600
6638
  function getRenderedCell(row, column) {
6601
6639
  if (column.render) {
@@ -6665,7 +6703,7 @@ function MobileSortMenu({
6665
6703
  size: "sm",
6666
6704
  className: "ml-auto min-w-0",
6667
6705
  children: [
6668
- active && sortBy ? /* @__PURE__ */ jsxs33(Fragment13, { children: [
6706
+ active && sortBy ? /* @__PURE__ */ jsxs33(Fragment15, { children: [
6669
6707
  /* @__PURE__ */ jsx37("span", { className: "sr-only", children: "\uC815\uB82C " }),
6670
6708
  /* @__PURE__ */ jsx37("span", { className: "truncate", children: active.header }),
6671
6709
  /* @__PURE__ */ jsxs33("span", { className: "sr-only", children: [
@@ -6805,6 +6843,19 @@ var rowLinkClass = cn(
6805
6843
  "text-inherit no-underline outline-none after:absolute after:inset-0 after:content-['']",
6806
6844
  "focus-visible:after:ring-2 focus-visible:after:ring-inset focus-visible:after:ring-[var(--focus-ring)]"
6807
6845
  );
6846
+ var expandedPanelClass = cn(
6847
+ "grid grid-rows-[0fr] invisible data-[state=open]:grid-rows-[1fr] data-[state=open]:visible",
6848
+ "motion-safe:[transition:grid-template-rows_var(--dur-base)_var(--ease-standard),visibility_0s_linear_var(--dur-base)]",
6849
+ "motion-safe:data-[state=open]:[transition:grid-template-rows_var(--dur-base)_var(--ease-out),visibility_0s]"
6850
+ );
6851
+ var expandChevronClass = "motion-safe:transition-transform motion-safe:duration-[var(--dur-base)] motion-safe:ease-[var(--ease-standard)]";
6852
+ function useOpenedOnce(expanded) {
6853
+ const [opened, setOpened] = React33.useState(expanded);
6854
+ if (expanded && !opened) {
6855
+ setOpened(true);
6856
+ }
6857
+ return opened || expanded;
6858
+ }
6808
6859
  function useActivationHandlers({ row, href, activatable, onActivate }) {
6809
6860
  return {
6810
6861
  onClick: (event) => {
@@ -6837,12 +6888,14 @@ function DataTableRowView({
6837
6888
  onToggle,
6838
6889
  onActivate,
6839
6890
  onRowContextMenu,
6891
+ expand,
6840
6892
  gridTemplateColumns,
6841
6893
  ariaRowIndex
6842
6894
  }) {
6843
6895
  const linked = Boolean(LinkComponent && href);
6844
6896
  const handlers = useActivationHandlers({ row, href, activatable, onActivate });
6845
- return /* @__PURE__ */ jsxs33(
6897
+ const opened = useOpenedOnce(expand?.expanded ?? false);
6898
+ const dataRow = /* @__PURE__ */ jsxs33(
6846
6899
  "div",
6847
6900
  {
6848
6901
  "data-slot": "data-table-row",
@@ -6852,12 +6905,14 @@ function DataTableRowView({
6852
6905
  "aria-rowindex": ariaRowIndex,
6853
6906
  tabIndex: activatable ? 0 : void 0,
6854
6907
  className: cn(
6855
- dataTableRowVariants({ interactive: activatable || linked, selected: visuallySelected }),
6908
+ dataTableRowVariants({ interactive: activatable || linked || expand != null, selected: visuallySelected }),
6856
6909
  linked ? rowLinkHostClass : null
6857
6910
  ),
6858
6911
  style: { gridTemplateColumns },
6859
6912
  onContextMenu: (event) => onRowContextMenu?.(rowId, event),
6860
- onClick: handlers.onClick,
6913
+ onClick: expand ? (event) => {
6914
+ if (!isInteractiveTarget(event.target)) expand.onToggle(rowId);
6915
+ } : handlers.onClick,
6861
6916
  onKeyDown: handlers.onKeyDown,
6862
6917
  children: [
6863
6918
  selectable ? /* @__PURE__ */ jsx37("div", { role: "cell", className: "px-[var(--space-4)]", children: /* @__PURE__ */ jsx37(RowCheckbox, { row, rowId, columns, selected, onToggle }) }) : null,
@@ -6878,10 +6933,53 @@ function DataTableRowView({
6878
6933
  },
6879
6934
  column.key
6880
6935
  );
6881
- })
6936
+ }),
6937
+ expand ? /* @__PURE__ */ jsx37("div", { role: "cell", "data-slot": "data-table-expand-cell", className: "flex items-center justify-end pr-[var(--space-2)]", children: /* @__PURE__ */ jsx37(
6938
+ IconButton,
6939
+ {
6940
+ icon: ChevronRight3,
6941
+ "aria-label": expand.label,
6942
+ "aria-expanded": expand.expanded,
6943
+ "aria-controls": expand.panelId,
6944
+ appearance: "ghost",
6945
+ tone: "neutral",
6946
+ size: "md",
6947
+ className: cn(
6948
+ "aria-expanded:[&_svg]:rotate-90",
6949
+ "motion-safe:[&_svg]:transition-transform motion-safe:[&_svg]:duration-[var(--dur-base)] motion-safe:[&_svg]:ease-[var(--ease-standard)]"
6950
+ ),
6951
+ onClick: () => expand.onToggle(rowId)
6952
+ }
6953
+ ) }) : null
6882
6954
  ]
6883
6955
  }
6884
6956
  );
6957
+ if (!expand) {
6958
+ return dataRow;
6959
+ }
6960
+ return /* @__PURE__ */ jsxs33(Fragment15, { children: [
6961
+ dataRow,
6962
+ /* @__PURE__ */ jsx37(
6963
+ "div",
6964
+ {
6965
+ role: "row",
6966
+ "data-slot": "data-table-expanded-row",
6967
+ "data-row-id": rowId,
6968
+ "data-state": expand.expanded ? "open" : "closed",
6969
+ className: expandedPanelClass,
6970
+ children: /* @__PURE__ */ jsx37(
6971
+ "div",
6972
+ {
6973
+ role: "cell",
6974
+ id: expand.panelId,
6975
+ "aria-colspan": columns.length + (selectable ? 2 : 1),
6976
+ className: "min-h-0 min-w-0 overflow-hidden",
6977
+ children: opened ? expand.render(row) : null
6978
+ }
6979
+ )
6980
+ }
6981
+ )
6982
+ ] });
6885
6983
  }
6886
6984
  function DataTableMobileCardView({
6887
6985
  row,
@@ -6896,6 +6994,7 @@ function DataTableMobileCardView({
6896
6994
  onToggle,
6897
6995
  onActivate,
6898
6996
  onRowContextMenu,
6997
+ expand,
6899
6998
  getMobileCardContent,
6900
6999
  ariaPosInSet,
6901
7000
  ariaSetSize,
@@ -6904,12 +7003,27 @@ function DataTableMobileCardView({
6904
7003
  const linked = Boolean(LinkComponent && href);
6905
7004
  const content = getMobileCardContent(row);
6906
7005
  const navigable = linked || activatable;
7006
+ const opened = useOpenedOnce(expand?.expanded ?? false);
6907
7007
  const leading = selectable || content.leading != null ? /* @__PURE__ */ jsxs33("span", { className: "flex items-center gap-[var(--space-2)]", children: [
6908
7008
  selectable ? /* @__PURE__ */ jsx37(RowCheckbox, { row, rowId, columns, selected, onToggle }) : null,
6909
7009
  content.leading
6910
7010
  ] }) : void 0;
6911
7011
  let title = content.title;
6912
- if (linked && LinkComponent) {
7012
+ if (expand) {
7013
+ title = /* @__PURE__ */ jsx37(
7014
+ "button",
7015
+ {
7016
+ type: "button",
7017
+ "data-slot": "data-table-row-link",
7018
+ "aria-label": expand.label,
7019
+ "aria-expanded": expand.expanded,
7020
+ "aria-controls": expand.panelId,
7021
+ className: cn(rowLinkClass, "block w-full text-left"),
7022
+ onClick: () => expand.onToggle(rowId),
7023
+ children: /* @__PURE__ */ jsx37("span", { className: "line-clamp-2", children: content.title })
7024
+ }
7025
+ );
7026
+ } else if (linked && LinkComponent) {
6913
7027
  title = /* @__PURE__ */ jsx37(LinkComponent, { href, "data-slot": "data-table-row-link", className: rowLinkClass, children: content.title });
6914
7028
  } else if (activatable) {
6915
7029
  title = /* @__PURE__ */ jsx37(
@@ -6923,7 +7037,7 @@ function DataTableMobileCardView({
6923
7037
  }
6924
7038
  );
6925
7039
  }
6926
- return /* @__PURE__ */ jsx37(
7040
+ return /* @__PURE__ */ jsxs33(
6927
7041
  "div",
6928
7042
  {
6929
7043
  "data-slot": "data-table-mobile-card",
@@ -6941,20 +7055,42 @@ function DataTableMobileCardView({
6941
7055
  navigable ? rowLinkHostClass : null
6942
7056
  ),
6943
7057
  onContextMenu: (event) => onRowContextMenu?.(rowId, event),
6944
- children: /* @__PURE__ */ jsx37(
6945
- ListCard,
6946
- {
6947
- className: "px-[var(--space-4)] py-[var(--space-3)]",
6948
- title,
6949
- meta: content.meta ? [content.meta[0], content.meta[1]] : void 0,
6950
- status: content.status,
6951
- caption: content.date,
6952
- value: content.value,
6953
- leading,
6954
- trailing: navigable ? "chevron" : "none",
6955
- actions: content.actions
6956
- }
6957
- )
7058
+ children: [
7059
+ /* @__PURE__ */ jsx37(
7060
+ ListCard,
7061
+ {
7062
+ className: cn(
7063
+ "px-[var(--space-4)] py-[var(--space-3)]",
7064
+ expand ? ["cursor-pointer transition-colors hover:bg-[var(--action-hover)] motion-reduce:transition-none", rowLinkHostClass] : null
7065
+ ),
7066
+ title,
7067
+ meta: content.meta ? [content.meta[0], content.meta[1]] : void 0,
7068
+ status: content.status,
7069
+ caption: content.date,
7070
+ value: content.value,
7071
+ leading,
7072
+ trailing: expand ? /* @__PURE__ */ jsx37(
7073
+ ChevronRight3,
7074
+ {
7075
+ "aria-hidden": true,
7076
+ "data-state": expand.expanded ? "open" : "closed",
7077
+ className: cn("block size-[var(--space-4)] shrink-0 text-text-tertiary data-[state=open]:rotate-90", expandChevronClass)
7078
+ }
7079
+ ) : navigable ? "chevron" : "none",
7080
+ actions: content.actions
7081
+ }
7082
+ ),
7083
+ expand ? /* @__PURE__ */ jsx37(
7084
+ "div",
7085
+ {
7086
+ id: expand.panelId,
7087
+ "data-slot": "data-table-expanded",
7088
+ "data-state": expand.expanded ? "open" : "closed",
7089
+ className: expandedPanelClass,
7090
+ children: /* @__PURE__ */ jsx37("div", { className: "min-h-0 min-w-0 overflow-hidden", children: opened ? expand.render(row) : null })
7091
+ }
7092
+ ) : null
7093
+ ]
6958
7094
  }
6959
7095
  );
6960
7096
  }
@@ -7262,7 +7398,7 @@ function useLayoutFocusHandoff({
7262
7398
  const item = record.rowId ? Array.from(container.querySelectorAll("[data-row-id]")).find(
7263
7399
  (node) => node.getAttribute("data-row-id") === record.rowId
7264
7400
  ) : void 0;
7265
- const target = (item && (record.checkbox ? item.querySelector('[role="checkbox"]') : item.hasAttribute("tabindex") ? item : item.querySelector('[data-slot="data-table-row-link"]'))) ?? item ?? container;
7401
+ const target = (item && (record.checkbox ? item.querySelector('[role="checkbox"]') : item.hasAttribute("tabindex") ? item : item.querySelector('[data-slot="data-table-row-link"],[data-slot="data-table-expand-cell"] button'))) ?? item ?? container;
7266
7402
  if (target instanceof HTMLElement) {
7267
7403
  if (!target.hasAttribute("tabindex") && !target.matches("a[href],button,input")) {
7268
7404
  target.tabIndex = -1;
@@ -7294,6 +7430,10 @@ function DataTableInner({
7294
7430
  linkComponent,
7295
7431
  onRowClick,
7296
7432
  virtual,
7433
+ renderExpanded,
7434
+ getExpandLabel,
7435
+ expandedIds,
7436
+ onExpandedChange,
7297
7437
  skeletonRowCount = 8,
7298
7438
  "aria-label": ariaLabel = "\uB370\uC774\uD130 \uD14C\uC774\uBE14",
7299
7439
  ...props
@@ -7341,7 +7481,23 @@ function DataTableInner({
7341
7481
  const allVisibleRowsSelected = rowIds.length > 0 && selectedCount === rowIds.length;
7342
7482
  const partiallySelected = selectedCount > 0 && !allVisibleRowsSelected;
7343
7483
  const selectAllChecked = partiallySelected ? "indeterminate" : allVisibleRowsSelected;
7344
- const gridTemplateColumns = getGridTemplate(columns, selectable);
7484
+ const expandable = renderExpanded != null;
7485
+ const gridTemplateColumns = getGridTemplate(columns, selectable, expandable);
7486
+ const panelIdBase = React33.useId();
7487
+ const [ownExpandedIds, setOwnExpandedIds] = React33.useState(() => /* @__PURE__ */ new Set());
7488
+ const resolvedExpandedIds = expandedIds ?? ownExpandedIds;
7489
+ const toggleExpanded = (id) => {
7490
+ const nextIds = new Set(resolvedExpandedIds);
7491
+ if (nextIds.has(id)) {
7492
+ nextIds.delete(id);
7493
+ } else {
7494
+ nextIds.add(id);
7495
+ }
7496
+ if (expandedIds === void 0) {
7497
+ setOwnExpandedIds(nextIds);
7498
+ }
7499
+ onExpandedChange?.(nextIds);
7500
+ };
7345
7501
  const emitSelection = (nextIds) => {
7346
7502
  onSelectionChange?.(nextIds);
7347
7503
  };
@@ -7386,7 +7542,7 @@ function DataTableInner({
7386
7542
  (rowId, event) => latestHandlers.current.onRowContextMenu?.(rowId, event),
7387
7543
  []
7388
7544
  );
7389
- const getItemProps = (row) => {
7545
+ const getItemProps = (row, layout, index) => {
7390
7546
  const rowId = getRowId(row, keyField);
7391
7547
  const selected = resolvedSelectedIds.has(rowId);
7392
7548
  const href = rowHref?.(row);
@@ -7403,7 +7559,14 @@ function DataTableInner({
7403
7559
  LinkComponent: linkComponent,
7404
7560
  onToggle: isVirtual ? stableToggleRow : toggleRow,
7405
7561
  onActivate: isVirtual ? stableActivateRow : activateRow,
7406
- onRowContextMenu: isVirtual ? stableRowContextMenu : onRowContextMenu
7562
+ onRowContextMenu: isVirtual ? stableRowContextMenu : onRowContextMenu,
7563
+ expand: renderExpanded && getExpandLabel ? {
7564
+ expanded: resolvedExpandedIds.has(rowId),
7565
+ label: getExpandLabel(row),
7566
+ panelId: `${panelIdBase}-${layout}-${index}`,
7567
+ render: renderExpanded,
7568
+ onToggle: toggleExpanded
7569
+ } : void 0
7407
7570
  };
7408
7571
  };
7409
7572
  const sliceFor = (layout) => {
@@ -7521,7 +7684,8 @@ function DataTableInner({
7521
7684
  },
7522
7685
  column.key
7523
7686
  );
7524
- })
7687
+ }),
7688
+ expandable ? /* @__PURE__ */ jsx37("div", { role: "cell" }) : null
7525
7689
  ]
7526
7690
  }
7527
7691
  ),
@@ -7547,7 +7711,7 @@ function DataTableInner({
7547
7711
  }
7548
7712
  ) }) })
7549
7713
  ) : /* @__PURE__ */ jsx37("div", { ref: desktopListRef, role: "rowgroup", style: desktopSlice.style, children: desktopSlice.rows.map((row, index) => {
7550
- const itemProps = getItemProps(row);
7714
+ const itemProps = getItemProps(row, "desktop", desktopSlice.start + index);
7551
7715
  return /* @__PURE__ */ jsx37(
7552
7716
  RowComponent,
7553
7717
  {
@@ -7582,8 +7746,8 @@ function DataTableInner({
7582
7746
  "aria-label": `${ariaLabel} \uBAA8\uBC14\uC77C \uCE74\uB4DC \uBAA9\uB85D`,
7583
7747
  style: mobileSlice.style,
7584
7748
  children: mobileSlice.rows.map((row, index) => {
7585
- const itemProps = getItemProps(row);
7586
7749
  const rowIndex = mobileSlice.start + index;
7750
+ const itemProps = getItemProps(row, "mobile", rowIndex);
7587
7751
  return /* @__PURE__ */ jsx37(
7588
7752
  CardComponent,
7589
7753
  {
@@ -7639,7 +7803,7 @@ function ContextMenu({
7639
7803
 
7640
7804
  // src/components/ui/bulk-action-bar.tsx
7641
7805
  import * as React34 from "react";
7642
- import { X as X3 } from "lucide-react";
7806
+ import { X as X4 } from "lucide-react";
7643
7807
  import { jsx as jsx39, jsxs as jsxs35 } from "react/jsx-runtime";
7644
7808
  function ActionButton({ action }) {
7645
7809
  const danger = action.variant === "destructive";
@@ -7724,7 +7888,7 @@ function ClearButton({ onClear }) {
7724
7888
  justifyContent: "center",
7725
7889
  borderRadius: "var(--radius-md)"
7726
7890
  },
7727
- children: /* @__PURE__ */ jsx39(X3, { size: 16, strokeWidth: 1.75, "aria-hidden": "true" })
7891
+ children: /* @__PURE__ */ jsx39(X4, { size: 16, strokeWidth: 1.75, "aria-hidden": "true" })
7728
7892
  }
7729
7893
  );
7730
7894
  }
@@ -8292,7 +8456,7 @@ function ActionSheet({
8292
8456
  import * as React35 from "react";
8293
8457
  import { jsx as jsx45 } from "react/jsx-runtime";
8294
8458
  var TONE = {
8295
- neutral: "bg-[var(--semantic-neutral-bg)] text-[var(--semantic-neutral-fg)]",
8459
+ neutral: "bg-[var(--fill-on-bg,var(--semantic-neutral-bg))] text-[var(--semantic-neutral-fg)]",
8296
8460
  info: "bg-[var(--semantic-info-bg)] text-[var(--semantic-info-fg)]",
8297
8461
  success: "bg-[var(--semantic-success-bg)] text-[var(--semantic-success-fg)]",
8298
8462
  warning: "bg-[var(--semantic-warning-bg)] text-[var(--semantic-warning-fg)]",
@@ -8330,7 +8494,8 @@ var FG = {
8330
8494
  error: "var(--semantic-error-fg)"
8331
8495
  };
8332
8496
  var BG = {
8333
- neutral: "var(--bg-inset)",
8497
+ // takes --fill-on-bg when an inset background sets it (see surface.ts)
8498
+ neutral: "var(--fill-on-bg, var(--bg-inset))",
8334
8499
  info: "var(--semantic-info-bg)",
8335
8500
  success: "var(--semantic-success-bg)",
8336
8501
  warning: "var(--semantic-warning-bg)",
@@ -8399,7 +8564,7 @@ var TwoTierBadge = React36.forwardRef(
8399
8564
  style: {
8400
8565
  borderLeft: `1px solid ${divider}`,
8401
8566
  color: "var(--text-tertiary)",
8402
- background: strong ? "var(--bg-inset)" : "transparent"
8567
+ background: strong ? BG.neutral : "transparent"
8403
8568
  },
8404
8569
  children: secondary
8405
8570
  }
@@ -8473,9 +8638,9 @@ StatusDot.displayName = "StatusDot";
8473
8638
 
8474
8639
  // src/components/ui/notification-badge.tsx
8475
8640
  import * as React39 from "react";
8476
- import { cva as cva13 } from "class-variance-authority";
8641
+ import { cva as cva14 } from "class-variance-authority";
8477
8642
  import { jsx as jsx49 } from "react/jsx-runtime";
8478
- var notificationBadgeVariants = cva13(
8643
+ var notificationBadgeVariants = cva14(
8479
8644
  [
8480
8645
  "inline-flex shrink-0 items-center justify-center rounded-[var(--radius-full)]",
8481
8646
  "bg-[var(--semantic-error,var(--error))] text-[var(--error-contrast)]",
@@ -8539,9 +8704,9 @@ NotificationBadge.displayName = "NotificationBadge";
8539
8704
 
8540
8705
  // src/components/ui/empty-state.tsx
8541
8706
  import * as React40 from "react";
8542
- import { cva as cva14 } from "class-variance-authority";
8707
+ import { cva as cva15 } from "class-variance-authority";
8543
8708
  import { jsx as jsx50, jsxs as jsxs39 } from "react/jsx-runtime";
8544
- var emptyStateBaseVariants = cva14(
8709
+ var emptyStateBaseVariants = cva15(
8545
8710
  [
8546
8711
  "flex flex-col items-center justify-center text-center",
8547
8712
  "text-foreground"
@@ -8565,6 +8730,71 @@ var emptyStateBaseVariants = cva14(
8565
8730
  }
8566
8731
  }
8567
8732
  );
8733
+ var PAGE_FILL_QUERY = "(min-width: 768px)";
8734
+ var useIsomorphicLayoutEffect3 = typeof window === "undefined" ? React40.useEffect : React40.useLayoutEffect;
8735
+ function findScrollParent(node) {
8736
+ for (let el = node.parentElement; el && el !== document.body && el !== document.documentElement; el = el.parentElement) {
8737
+ const { overflowY } = getComputedStyle(el);
8738
+ if (overflowY === "auto" || overflowY === "scroll") return el;
8739
+ }
8740
+ return null;
8741
+ }
8742
+ function freeHeight(area) {
8743
+ const rect = area.getBoundingClientRect();
8744
+ const style = getComputedStyle(area);
8745
+ const start = area === document.documentElement ? rect.top : rect.top + area.clientTop - area.scrollTop;
8746
+ let end = start + parseFloat(style.paddingTop);
8747
+ for (const child of Array.from(area.children)) {
8748
+ const childStyle = getComputedStyle(child);
8749
+ if (childStyle.display === "none" || childStyle.position === "absolute" || childStyle.position === "fixed") continue;
8750
+ end = Math.max(end, child.getBoundingClientRect().bottom + parseFloat(childStyle.marginBottom));
8751
+ }
8752
+ return area.clientHeight - (end - start + parseFloat(style.paddingBottom));
8753
+ }
8754
+ function usePageFill(ref, enabled) {
8755
+ useIsomorphicLayoutEffect3(() => {
8756
+ const node = ref.current;
8757
+ if (!enabled || !node) return;
8758
+ const scroller = findScrollParent(node);
8759
+ const parent = node.parentElement;
8760
+ const media = typeof window.matchMedia === "function" ? window.matchMedia(PAGE_FILL_QUERY) : null;
8761
+ let observer = null;
8762
+ let frame = 0;
8763
+ const fit = () => {
8764
+ const previous = node.style.minHeight;
8765
+ let next = "";
8766
+ if (media?.matches ?? true) {
8767
+ node.style.minHeight = "";
8768
+ const free = freeHeight(scroller ?? document.scrollingElement ?? document.documentElement);
8769
+ if (free > 0) next = `${Math.floor(node.getBoundingClientRect().height + free)}px`;
8770
+ }
8771
+ node.style.minHeight = next;
8772
+ if (next !== previous && observer && parent && !frame) {
8773
+ observer.unobserve(parent);
8774
+ frame = requestAnimationFrame(() => {
8775
+ frame = 0;
8776
+ observer?.observe(parent);
8777
+ });
8778
+ }
8779
+ };
8780
+ fit();
8781
+ if (typeof ResizeObserver === "function") {
8782
+ observer = new ResizeObserver(fit);
8783
+ if (scroller) observer.observe(scroller);
8784
+ if (parent) observer.observe(parent);
8785
+ }
8786
+ if (!scroller) window.addEventListener("resize", fit);
8787
+ media?.addEventListener?.("change", fit);
8788
+ return () => {
8789
+ observer?.disconnect();
8790
+ observer = null;
8791
+ cancelAnimationFrame(frame);
8792
+ window.removeEventListener("resize", fit);
8793
+ media?.removeEventListener?.("change", fit);
8794
+ node.style.minHeight = "";
8795
+ };
8796
+ }, [enabled]);
8797
+ }
8568
8798
  function getEmptyStateToneSurface(tone) {
8569
8799
  switch (tone) {
8570
8800
  case "muted":
@@ -8590,7 +8820,7 @@ function emptyStateVariants({
8590
8820
  className
8591
8821
  );
8592
8822
  }
8593
- var emptyStateIconVariants = cva14(
8823
+ var emptyStateIconVariants = cva15(
8594
8824
  [
8595
8825
  "inline-flex items-center justify-center rounded-[var(--radius-full)]",
8596
8826
  "border border-[var(--border-subtle)] bg-[var(--bg-inset)] text-text-tertiary"
@@ -8625,10 +8855,13 @@ var EmptyState = React40.forwardRef(
8625
8855
  hint,
8626
8856
  action,
8627
8857
  bordered = false,
8858
+ layout = "inline",
8628
8859
  ...props
8629
8860
  }, ref) => {
8630
8861
  const resolvedSize = size ?? "md";
8631
- return /* @__PURE__ */ jsxs39(
8862
+ const pageRef = React40.useRef(null);
8863
+ usePageFill(pageRef, layout === "page");
8864
+ const box = /* @__PURE__ */ jsxs39(
8632
8865
  "div",
8633
8866
  {
8634
8867
  ref,
@@ -8676,6 +8909,17 @@ var EmptyState = React40.forwardRef(
8676
8909
  ]
8677
8910
  }
8678
8911
  );
8912
+ if (layout !== "page") return box;
8913
+ return /* @__PURE__ */ jsx50(
8914
+ "div",
8915
+ {
8916
+ ref: pageRef,
8917
+ "data-slot": "empty-state-page",
8918
+ "data-layout": "page",
8919
+ className: "flex w-full flex-col justify-start pt-[var(--space-12)] md:justify-center md:pt-0",
8920
+ children: box
8921
+ }
8922
+ );
8679
8923
  }
8680
8924
  );
8681
8925
  EmptyState.displayName = "EmptyState";
@@ -8683,9 +8927,9 @@ EmptyState.displayName = "EmptyState";
8683
8927
  // src/components/ui/error-state.tsx
8684
8928
  import * as React41 from "react";
8685
8929
  import { AlertTriangle } from "lucide-react";
8686
- import { cva as cva15 } from "class-variance-authority";
8930
+ import { cva as cva16 } from "class-variance-authority";
8687
8931
  import { jsx as jsx51, jsxs as jsxs40 } from "react/jsx-runtime";
8688
- var errorStateVariants = cva15(
8932
+ var errorStateVariants = cva16(
8689
8933
  [
8690
8934
  "flex flex-col items-center justify-center text-center",
8691
8935
  "rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
@@ -8770,9 +9014,9 @@ ErrorState.displayName = "ErrorState";
8770
9014
 
8771
9015
  // src/components/ui/skeleton.tsx
8772
9016
  import * as React42 from "react";
8773
- import { cva as cva16 } from "class-variance-authority";
9017
+ import { cva as cva17 } from "class-variance-authority";
8774
9018
  import { jsx as jsx52 } from "react/jsx-runtime";
8775
- var skeletonVariants = cva16(
9019
+ var skeletonVariants = cva17(
8776
9020
  [
8777
9021
  // bg-inset: light #F1F2F4 reads on white surfaces (bg-raised was white = invisible);
8778
9022
  // dark value equals the old bg-raised (#16181D), so dark mode is unchanged.
@@ -8792,7 +9036,7 @@ var skeletonVariants = cva16(
8792
9036
  }
8793
9037
  }
8794
9038
  );
8795
- var spinnerVariants = cva16(
9039
+ var spinnerVariants = cva17(
8796
9040
  [
8797
9041
  "inline-block shrink-0 animate-spin rounded-[var(--radius-full)] border-2",
8798
9042
  "border-[var(--border-subtle)] border-t-[var(--primary)]",
@@ -8923,8 +9167,8 @@ Spinner.displayName = "Spinner";
8923
9167
 
8924
9168
  // src/components/ui/pagination.tsx
8925
9169
  import * as React43 from "react";
8926
- import { ChevronsLeft, ChevronLeft, ChevronRight as ChevronRight3, ChevronsRight } from "lucide-react";
8927
- import { cva as cva17 } from "class-variance-authority";
9170
+ import { ChevronsLeft, ChevronLeft, ChevronRight as ChevronRight4, ChevronsRight } from "lucide-react";
9171
+ import { cva as cva18 } from "class-variance-authority";
8928
9172
 
8929
9173
  // src/components/ui/page-size-select.tsx
8930
9174
  import { jsx as jsx53, jsxs as jsxs41 } from "react/jsx-runtime";
@@ -8979,7 +9223,7 @@ function PageSizeSelect({
8979
9223
 
8980
9224
  // src/components/ui/pagination.tsx
8981
9225
  import { jsx as jsx54, jsxs as jsxs42 } from "react/jsx-runtime";
8982
- var paginationVariants = cva17(
9226
+ var paginationVariants = cva18(
8983
9227
  [
8984
9228
  "flex w-full flex-col gap-[var(--space-3)]",
8985
9229
  "text-sm text-text-secondary",
@@ -8997,7 +9241,7 @@ var paginationVariants = cva17(
8997
9241
  }
8998
9242
  }
8999
9243
  );
9000
- var paginationControlVariants = cva17(
9244
+ var paginationControlVariants = cva18(
9001
9245
  [
9002
9246
  "inline-flex shrink-0 items-center justify-center rounded-[var(--radius-md)] border",
9003
9247
  "border-transparent bg-transparent font-medium text-text-secondary",
@@ -9174,7 +9418,7 @@ var Pagination = React43.forwardRef(
9174
9418
  page: Math.min(pageCount, currentPage + 1),
9175
9419
  disabled: isLastPage,
9176
9420
  size: resolvedSize,
9177
- icon: ChevronRight3,
9421
+ icon: ChevronRight4,
9178
9422
  onPageChange
9179
9423
  }
9180
9424
  ),
@@ -9200,15 +9444,16 @@ var Pagination = React43.forwardRef(
9200
9444
  Pagination.displayName = "Pagination";
9201
9445
 
9202
9446
  // src/components/ui/mode-toggle.tsx
9203
- import { cva as cva18 } from "class-variance-authority";
9447
+ import { cva as cva19 } from "class-variance-authority";
9204
9448
  import { jsx as jsx55, jsxs as jsxs43 } from "react/jsx-runtime";
9205
- var modeToggleVariants = cva18(
9449
+ var modeToggleVariants = cva19(
9206
9450
  [
9207
9451
  "inline-flex items-center rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
9208
- "bg-[var(--bg-inset)] p-[2px]"
9452
+ "bg-[var(--bg-inset)] p-[2px]",
9453
+ insetMarkerContext
9209
9454
  ].join(" ")
9210
9455
  );
9211
- var modeToggleItemVariants = cva18(
9456
+ var modeToggleItemVariants = cva19(
9212
9457
  [
9213
9458
  "inline-flex min-h-[28px] cursor-pointer items-center justify-center gap-[var(--space-1)]",
9214
9459
  "rounded-[calc(var(--radius-md)_-_2px)] px-[var(--space-3)] py-[var(--space-1)]",
@@ -9270,9 +9515,9 @@ function ModeToggle({
9270
9515
 
9271
9516
  // src/components/ui/action-footer.tsx
9272
9517
  import * as React44 from "react";
9273
- import { cva as cva19 } from "class-variance-authority";
9518
+ import { cva as cva20 } from "class-variance-authority";
9274
9519
  import { jsx as jsx56, jsxs as jsxs44 } from "react/jsx-runtime";
9275
- var actionFooterVariants = cva19(
9520
+ var actionFooterVariants = cva20(
9276
9521
  [
9277
9522
  // Below sm: two fixed rows — destructive actions (start) and status (end) on top, the main
9278
9523
  // actions filling the bottom row. The top row is omitted when both are absent. From sm: one
@@ -9297,7 +9542,7 @@ var actionFooterVariants = cva19(
9297
9542
  }
9298
9543
  }
9299
9544
  );
9300
- var actionFooterStatusVariants = cva19(
9545
+ var actionFooterStatusVariants = cva20(
9301
9546
  [
9302
9547
  "col-start-2 flex min-w-0 items-center justify-self-end gap-[var(--space-2)]",
9303
9548
  "sm:ml-auto",
@@ -9441,7 +9686,7 @@ ActionFooter.displayName = "ActionFooter";
9441
9686
 
9442
9687
  // src/components/ui/toast.tsx
9443
9688
  import * as React45 from "react";
9444
- import { cva as cva20 } from "class-variance-authority";
9689
+ import { cva as cva21 } from "class-variance-authority";
9445
9690
  import { jsx as jsx57, jsxs as jsxs45 } from "react/jsx-runtime";
9446
9691
  var DOT3 = {
9447
9692
  default: "var(--neutral)",
@@ -9450,7 +9695,7 @@ var DOT3 = {
9450
9695
  info: "var(--info)",
9451
9696
  error: "var(--error)"
9452
9697
  };
9453
- var toastVariants = cva20(
9698
+ var toastVariants = cva21(
9454
9699
  [
9455
9700
  "flex min-w-[280px] max-w-[420px] items-center",
9456
9701
  "gap-[11px] rounded-[10px] border border-[var(--border)]",
@@ -9472,7 +9717,7 @@ var toastVariants = cva20(
9472
9717
  defaultVariants: { variant: "default" }
9473
9718
  }
9474
9719
  );
9475
- var toastViewportVariants = cva20(
9720
+ var toastViewportVariants = cva21(
9476
9721
  [
9477
9722
  "fixed bottom-[var(--space-6)] right-[var(--space-6)] z-[var(--z-toast,50)]",
9478
9723
  "flex w-[min(420px,calc(100vw-var(--space-12)))] list-none flex-col gap-[var(--space-2)]",
@@ -9704,10 +9949,10 @@ function ToastProvider({ children, maxToasts = 3, className, ...props }) {
9704
9949
 
9705
9950
  // src/components/ui/otp-field.tsx
9706
9951
  import * as React46 from "react";
9707
- import { cva as cva21 } from "class-variance-authority";
9952
+ import { cva as cva22 } from "class-variance-authority";
9708
9953
  import { AlertCircle as AlertCircle4 } from "lucide-react";
9709
- import { Fragment as Fragment14, jsx as jsx58, jsxs as jsxs46 } from "react/jsx-runtime";
9710
- var otpFieldVariants = cva21("flex w-full min-w-0 flex-col gap-[var(--space-3)]", {
9954
+ import { Fragment as Fragment16, jsx as jsx58, jsxs as jsxs46 } from "react/jsx-runtime";
9955
+ var otpFieldVariants = cva22("flex w-full min-w-0 flex-col gap-[var(--space-3)]", {
9711
9956
  variants: {
9712
9957
  size: {
9713
9958
  default: "",
@@ -9718,7 +9963,7 @@ var otpFieldVariants = cva21("flex w-full min-w-0 flex-col gap-[var(--space-3)]"
9718
9963
  size: "default"
9719
9964
  }
9720
9965
  });
9721
- var otpFieldGroupVariants = cva21("flex items-start gap-[var(--space-2)] pt-[var(--space-1)]", {
9966
+ var otpFieldGroupVariants = cva22("flex items-start gap-[var(--space-2)] pt-[var(--space-1)]", {
9722
9967
  variants: {
9723
9968
  size: {
9724
9969
  default: "",
@@ -9734,7 +9979,7 @@ var otpFieldGroupVariants = cva21("flex items-start gap-[var(--space-2)] pt-[var
9734
9979
  fluid: false
9735
9980
  }
9736
9981
  });
9737
- var otpCellVariants = cva21(
9982
+ var otpCellVariants = cva22(
9738
9983
  [
9739
9984
  "flex items-center justify-center rounded-[var(--radius-md)] border",
9740
9985
  "border-[var(--border)] text-foreground",
@@ -9789,7 +10034,7 @@ var otpCellVariants = cva21(
9789
10034
  }
9790
10035
  }
9791
10036
  );
9792
- var otpFieldMessageVariants = cva21("flex items-start gap-[var(--space-1)] text-xs leading-snug", {
10037
+ var otpFieldMessageVariants = cva22("flex items-start gap-[var(--space-1)] text-xs leading-snug", {
9793
10038
  variants: {
9794
10039
  state: {
9795
10040
  default: "text-text-tertiary",
@@ -10028,7 +10273,7 @@ var OTPField = React46.forwardRef(
10028
10273
  "data-slot": "otp-field-message",
10029
10274
  "data-kind": errorText ? "error" : "helper",
10030
10275
  className: otpFieldMessageVariants({ state: resolvedState }),
10031
- children: errorText ? /* @__PURE__ */ jsxs46(Fragment14, { children: [
10276
+ children: errorText ? /* @__PURE__ */ jsxs46(Fragment16, { children: [
10032
10277
  /* @__PURE__ */ jsx58(
10033
10278
  AlertCircle4,
10034
10279
  {
@@ -10063,10 +10308,10 @@ OTPField.displayName = "OTPField";
10063
10308
 
10064
10309
  // src/components/ui/search-field.tsx
10065
10310
  import * as React47 from "react";
10066
- import { Search, X as X4 } from "lucide-react";
10067
- import { cva as cva22 } from "class-variance-authority";
10311
+ import { Search, X as X5 } from "lucide-react";
10312
+ import { cva as cva23 } from "class-variance-authority";
10068
10313
  import { jsx as jsx59, jsxs as jsxs47 } from "react/jsx-runtime";
10069
- var searchFieldVariants = cva22("relative flex w-full items-center", {
10314
+ var searchFieldVariants = cva23("relative flex w-full items-center", {
10070
10315
  variants: {
10071
10316
  size: {
10072
10317
  // Field-control scale follows Select: sm/md/lg = 30/32/36px. Pair with Button sm/md/lg.
@@ -10079,7 +10324,7 @@ var searchFieldVariants = cva22("relative flex w-full items-center", {
10079
10324
  size: "md"
10080
10325
  }
10081
10326
  });
10082
- var searchFieldInputVariants = cva22(
10327
+ var searchFieldInputVariants = cva23(
10083
10328
  [
10084
10329
  "h-full w-full rounded-[var(--radius-md)] border",
10085
10330
  "border-[var(--border)]",
@@ -10210,7 +10455,7 @@ var SearchField = React47.forwardRef(
10210
10455
  "data-slot": "search-field-clear",
10211
10456
  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)]",
10212
10457
  onClick: clearInput,
10213
- children: /* @__PURE__ */ jsx59(X4, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
10458
+ children: /* @__PURE__ */ jsx59(X5, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
10214
10459
  }
10215
10460
  ) : null
10216
10461
  ]
@@ -10222,9 +10467,9 @@ SearchField.displayName = "SearchField";
10222
10467
 
10223
10468
  // src/components/ui/checkbox-group.tsx
10224
10469
  import * as React48 from "react";
10225
- import { cva as cva23 } from "class-variance-authority";
10470
+ import { cva as cva24 } from "class-variance-authority";
10226
10471
  import { jsx as jsx60 } from "react/jsx-runtime";
10227
- var checkboxGroupVariants = cva23("gap-[var(--space-2)]", {
10472
+ var checkboxGroupVariants = cva24("gap-[var(--space-2)]", {
10228
10473
  variants: {
10229
10474
  appearance: {
10230
10475
  plain: "flex",
@@ -10324,11 +10569,11 @@ CheckboxGroup.displayName = "CheckboxGroup";
10324
10569
 
10325
10570
  // src/components/ui/radio-group.tsx
10326
10571
  import * as React49 from "react";
10327
- import { cva as cva24 } from "class-variance-authority";
10572
+ import { cva as cva25 } from "class-variance-authority";
10328
10573
  import { Circle } from "lucide-react";
10329
10574
  import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
10330
10575
  import { jsx as jsx61, jsxs as jsxs48 } from "react/jsx-runtime";
10331
- var radioGroupVariants = cva24("gap-[var(--space-2)]", {
10576
+ var radioGroupVariants = cva25("gap-[var(--space-2)]", {
10332
10577
  variants: {
10333
10578
  appearance: {
10334
10579
  plain: "flex",
@@ -10353,7 +10598,7 @@ var radioGroupVariants = cva24("gap-[var(--space-2)]", {
10353
10598
  columns: "one"
10354
10599
  }
10355
10600
  });
10356
- var radioVariants = cva24(
10601
+ var radioVariants = cva25(
10357
10602
  [
10358
10603
  "group w-full cursor-pointer text-left transition-colors motion-reduce:transition-none",
10359
10604
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--bg-base)]",
@@ -10395,7 +10640,7 @@ var radioVariants = cva24(
10395
10640
  }
10396
10641
  }
10397
10642
  );
10398
- var radioControlVariants = cva24(
10643
+ var radioControlVariants = cva25(
10399
10644
  [
10400
10645
  "flex size-[calc(var(--space-4)+var(--space-1))] shrink-0 items-center justify-center",
10401
10646
  "rounded-[var(--radius-full)] border border-[var(--border-strong)] bg-[var(--bg-surface)] text-transparent",
@@ -10629,13 +10874,13 @@ function Progress({
10629
10874
 
10630
10875
  // src/components/ui/tree-view.tsx
10631
10876
  import * as React50 from "react";
10632
- import { ChevronRight as ChevronRight4 } from "lucide-react";
10633
- import { cva as cva25 } from "class-variance-authority";
10877
+ import { ChevronRight as ChevronRight5 } from "lucide-react";
10878
+ import { cva as cva26 } from "class-variance-authority";
10634
10879
  import { jsx as jsx64, jsxs as jsxs50 } from "react/jsx-runtime";
10635
- var treeViewVariants = cva25(
10880
+ var treeViewVariants = cva26(
10636
10881
  "m-0 list-none p-[var(--space-1)] text-body-sm text-foreground"
10637
10882
  );
10638
- var treeItemRowVariants = cva25(
10883
+ var treeItemRowVariants = cva26(
10639
10884
  [
10640
10885
  "flex min-h-[32px] w-full cursor-pointer select-none items-center gap-[var(--space-2)]",
10641
10886
  "rounded-[var(--radius-sm)] py-[var(--space-2)] pr-[var(--space-3)]",
@@ -10846,7 +11091,7 @@ function TreeView({
10846
11091
  },
10847
11092
  className: "flex size-[var(--space-4)] shrink-0 items-center justify-center text-text-tertiary",
10848
11093
  children: /* @__PURE__ */ jsx64(
10849
- ChevronRight4,
11094
+ ChevronRight5,
10850
11095
  {
10851
11096
  "aria-hidden": "true",
10852
11097
  "data-slot": "treeitem-chevron",
@@ -10894,7 +11139,7 @@ function TreeView({
10894
11139
 
10895
11140
  // src/components/branding/olun-logo.tsx
10896
11141
  import { OLUN_MASTER, OLUN_SYMBOL, OLUN_WORDMARK } from "@olundot/tokens/brand";
10897
- import { Fragment as Fragment15, jsx as jsx65, jsxs as jsxs51 } from "react/jsx-runtime";
11142
+ import { Fragment as Fragment17, jsx as jsx65, jsxs as jsxs51 } from "react/jsx-runtime";
10898
11143
  var ACCENT_FILL = "var(--accent-pop)";
10899
11144
  var INK = { color: "var(--text-primary)" };
10900
11145
  var INK_TIGHT = { ...INK, display: "block", overflow: "visible" };
@@ -10904,7 +11149,7 @@ function symbolGeometry(size) {
10904
11149
  function SymbolCircles({ size }) {
10905
11150
  const { ring } = OLUN_SYMBOL;
10906
11151
  const g = symbolGeometry(size);
10907
- return /* @__PURE__ */ jsxs51(Fragment15, { children: [
11152
+ return /* @__PURE__ */ jsxs51(Fragment17, { children: [
10908
11153
  /* @__PURE__ */ jsx65(
10909
11154
  "circle",
10910
11155
  {