@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/CHANGELOG.md +63 -0
- package/dist/index.d.ts +61 -13
- package/dist/index.js +549 -304
- package/package.json +2 -2
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:
|
|
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:
|
|
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:
|
|
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:
|
|
1019
|
-
borderRadius:
|
|
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: "
|
|
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-
|
|
1027
|
+
"data-slot": "alert-marker",
|
|
1034
1028
|
style: {
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
height: 7,
|
|
1029
|
+
display: "inline-flex",
|
|
1030
|
+
height: TITLE_LINE_HEIGHT,
|
|
1038
1031
|
flexShrink: 0,
|
|
1039
|
-
|
|
1040
|
-
|
|
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
|
-
|
|
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:
|
|
1052
|
-
fontWeight:
|
|
1053
|
-
lineHeight:
|
|
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
|
-
)
|
|
1059
|
+
),
|
|
1059
1060
|
/* @__PURE__ */ jsx5(
|
|
1060
1061
|
"div",
|
|
1061
1062
|
{
|
|
1062
1063
|
"data-slot": "alert-body",
|
|
1063
1064
|
style: {
|
|
1064
|
-
marginTop:
|
|
1065
|
+
marginTop: 2,
|
|
1065
1066
|
fontFamily: "var(--font-sans)",
|
|
1066
|
-
fontSize:
|
|
1067
|
-
lineHeight:
|
|
1068
|
-
color: strong ? "color-mix(in srgb, " + fg + " 88%, var(--text-primary))" : "var(--text-
|
|
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:
|
|
1103
|
-
height:
|
|
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:
|
|
1109
|
-
background: hover ? "var(--action-hover)" : "
|
|
1110
|
-
color: hover ? strong ? fg : "var(--text-primary)" : strong ? "color-mix(in srgb, " + fg + " 70%, transparent)" : "var(--text-
|
|
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(
|
|
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
|
-
|
|
1938
|
-
|
|
1956
|
+
const isStart = labelPlacement === "start";
|
|
1957
|
+
const track = /* @__PURE__ */ jsxs10(
|
|
1958
|
+
SwitchPrimitive.Root,
|
|
1939
1959
|
{
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
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__ */
|
|
1945
|
-
|
|
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
|
-
|
|
2015
|
-
"data-slot": "switch-description",
|
|
1980
|
+
"data-slot": "switch-thumb",
|
|
2016
1981
|
className: cn(
|
|
2017
|
-
"
|
|
2018
|
-
|
|
2019
|
-
)
|
|
2020
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
2269
|
+
import { cva as cva8 } from "class-variance-authority";
|
|
2238
2270
|
import { jsx as jsx13 } from "react/jsx-runtime";
|
|
2239
|
-
var cardBaseVariants =
|
|
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
|
|
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(
|
|
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
|
|
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 =
|
|
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 =
|
|
2997
|
-
|
|
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:
|
|
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 =
|
|
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 =
|
|
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 =
|
|
3153
|
+
var tabsBadgeVariants = cva9(
|
|
3121
3154
|
[
|
|
3122
|
-
"inline-flex h-[
|
|
3123
|
-
"rounded-[var(--radius-full)]
|
|
3124
|
-
"
|
|
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 >
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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 =
|
|
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 =
|
|
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:
|
|
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-
|
|
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
|
|
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(
|
|
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-
|
|
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
|
|
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(
|
|
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
|
|
5084
|
-
import { X as
|
|
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 =
|
|
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:
|
|
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:
|
|
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 =
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
6546
|
-
var dataTableVariants =
|
|
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 =
|
|
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(
|
|
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
|
-
|
|
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:
|
|
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 (
|
|
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__ */
|
|
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:
|
|
6945
|
-
|
|
6946
|
-
|
|
6947
|
-
|
|
6948
|
-
|
|
6949
|
-
|
|
6950
|
-
|
|
6951
|
-
|
|
6952
|
-
|
|
6953
|
-
|
|
6954
|
-
|
|
6955
|
-
|
|
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
|
|
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
|
|
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(
|
|
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
|
-
|
|
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 ?
|
|
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
|
|
8641
|
+
import { cva as cva14 } from "class-variance-authority";
|
|
8477
8642
|
import { jsx as jsx49 } from "react/jsx-runtime";
|
|
8478
|
-
var notificationBadgeVariants =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
|
9017
|
+
import { cva as cva17 } from "class-variance-authority";
|
|
8774
9018
|
import { jsx as jsx52 } from "react/jsx-runtime";
|
|
8775
|
-
var skeletonVariants =
|
|
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 =
|
|
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
|
|
8927
|
-
import { cva as
|
|
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 =
|
|
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 =
|
|
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:
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
9952
|
+
import { cva as cva22 } from "class-variance-authority";
|
|
9708
9953
|
import { AlertCircle as AlertCircle4 } from "lucide-react";
|
|
9709
|
-
import { Fragment as
|
|
9710
|
-
var otpFieldVariants =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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(
|
|
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
|
|
10067
|
-
import { cva as
|
|
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 =
|
|
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 =
|
|
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(
|
|
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
|
|
10470
|
+
import { cva as cva24 } from "class-variance-authority";
|
|
10226
10471
|
import { jsx as jsx60 } from "react/jsx-runtime";
|
|
10227
|
-
var checkboxGroupVariants =
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
10633
|
-
import { cva as
|
|
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 =
|
|
10880
|
+
var treeViewVariants = cva26(
|
|
10636
10881
|
"m-0 list-none p-[var(--space-1)] text-body-sm text-foreground"
|
|
10637
10882
|
);
|
|
10638
|
-
var treeItemRowVariants =
|
|
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
|
-
|
|
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
|
|
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(
|
|
11152
|
+
return /* @__PURE__ */ jsxs51(Fragment17, { children: [
|
|
10908
11153
|
/* @__PURE__ */ jsx65(
|
|
10909
11154
|
"circle",
|
|
10910
11155
|
{
|