my-you-eye 0.3.1 → 0.3.2
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/COMPONENTS.md +1 -1
- package/components.json +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +66 -22
- package/package.json +1 -1
package/COMPONENTS.md
CHANGED
|
@@ -38,7 +38,7 @@ import "my-you-eye/styles.css";
|
|
|
38
38
|
| `Avatar` | size: lg / md / sm | Sizes, Fallback variants, With image, With ring, With status dot |
|
|
39
39
|
| `Badge` | variant: danger / neutral / primary / success / warning<br>style: soft | Variants (solid), Variants (soft) |
|
|
40
40
|
| `Card` | variant: danger / default / elevated / ghost / outlined<br>size: sm | Variants, With footer actions |
|
|
41
|
-
| `CodeBlock` | variant: elevated | Bare (no header, no language), Language-only (badge overlay, no header bar), With header + language, Elevated, Line numbers, No wrap (horizontal scroll), Syntax highlighting (TS), Line highlights, Line highlights (implicit gutter), Multi-color highlights, Syntax highlighting (CSS / HTML / SQL / YAML / Python) |
|
|
41
|
+
| `CodeBlock` | variant: elevated | Bare (no header, no language), Language-only (badge overlay, no header bar), With header + language, Elevated, Line numbers, No wrap (horizontal scroll), Syntax highlighting (TS), Line highlights, Line highlights (implicit gutter), Multi-color highlights, Substring highlights, Syntax highlighting (CSS / HTML / SQL / YAML / Python) |
|
|
42
42
|
| `EmptyState` | variant: secondary | Default, With icon and action |
|
|
43
43
|
| `Image` | — | Fit modes, Border radius, Aspect ratio, Styles, With caption |
|
|
44
44
|
| `Kbd` | — | Default, Combinations |
|
package/components.json
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -476,6 +476,12 @@ interface CodeBlockHighlightGroup {
|
|
|
476
476
|
lines: number[];
|
|
477
477
|
color?: "primary" | "warning" | "success" | "danger";
|
|
478
478
|
}
|
|
479
|
+
interface HighlightRangeDef {
|
|
480
|
+
line: number;
|
|
481
|
+
start: number;
|
|
482
|
+
end: number;
|
|
483
|
+
color?: "primary" | "warning" | "success" | "danger";
|
|
484
|
+
}
|
|
479
485
|
interface CodeBlockProps extends HTMLAttributes<HTMLPreElement>, VariantProps<typeof codeBlockVariants> {
|
|
480
486
|
code: string;
|
|
481
487
|
language?: string;
|
|
@@ -490,6 +496,8 @@ interface CodeBlockProps extends HTMLAttributes<HTMLPreElement>, VariantProps<ty
|
|
|
490
496
|
highlightColor?: CodeBlockHighlightGroup["color"];
|
|
491
497
|
/** Multi-color highlight groups. When provided, takes precedence over highlightLines. */
|
|
492
498
|
highlightGroups?: CodeBlockHighlightGroup[];
|
|
499
|
+
/** Substring-level highlight ranges (0-indexed char positions within each line). */
|
|
500
|
+
highlightRanges?: HighlightRangeDef[];
|
|
493
501
|
}
|
|
494
502
|
declare const CodeBlock: react.ForwardRefExoticComponent<CodeBlockProps & react.RefAttributes<HTMLPreElement>>;
|
|
495
503
|
|
package/dist/index.js
CHANGED
|
@@ -2385,7 +2385,7 @@ function renderHighlightedLine(tokens) {
|
|
|
2385
2385
|
}
|
|
2386
2386
|
|
|
2387
2387
|
// src/ui/code-block/CodeBlock.tsx
|
|
2388
|
-
import { jsx as jsx46, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
2388
|
+
import { Fragment as Fragment2, jsx as jsx46, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
2389
2389
|
var codeBlockVariants = cva25(
|
|
2390
2390
|
"group relative overflow-clip rounded-ui border border-border bg-code-bg text-sm flex flex-col",
|
|
2391
2391
|
{
|
|
@@ -2431,7 +2431,7 @@ function CopyButton({ copied, onCopy }) {
|
|
|
2431
2431
|
);
|
|
2432
2432
|
}
|
|
2433
2433
|
var CodeBlock = forwardRef42(
|
|
2434
|
-
({ className, variant, code, language, header, wrap = true, showLineNumbers = false, highlight = false, highlightLines, highlightColor = "primary", highlightGroups, ...props }, ref) => {
|
|
2434
|
+
({ className, variant, code, language, header, wrap = true, showLineNumbers = false, highlight = false, highlightLines, highlightColor = "primary", highlightGroups, highlightRanges, ...props }, ref) => {
|
|
2435
2435
|
const [copied, setCopied] = useState2(false);
|
|
2436
2436
|
const copy = useCallback3(() => {
|
|
2437
2437
|
navigator.clipboard.writeText(code).then(() => {
|
|
@@ -2441,7 +2441,7 @@ var CodeBlock = forwardRef42(
|
|
|
2441
2441
|
}, [code]);
|
|
2442
2442
|
const lines = useMemo(() => code.split("\n"), [code]);
|
|
2443
2443
|
const hasHeader = Boolean(header || language);
|
|
2444
|
-
const showGutter = showLineNumbers || highlightLines != null && highlightLines.length > 0 || highlightGroups != null && highlightGroups.length > 0;
|
|
2444
|
+
const showGutter = showLineNumbers || highlightLines != null && highlightLines.length > 0 || highlightGroups != null && highlightGroups.length > 0 || highlightRanges != null && highlightRanges.length > 0;
|
|
2445
2445
|
const highlighted = useMemo(() => {
|
|
2446
2446
|
if (!highlight) return null;
|
|
2447
2447
|
return tokenize(code, language);
|
|
@@ -2469,6 +2469,44 @@ var CodeBlock = forwardRef42(
|
|
|
2469
2469
|
if (!highlighted) return null;
|
|
2470
2470
|
return splitTokensByLine(highlighted);
|
|
2471
2471
|
}, [highlighted]);
|
|
2472
|
+
const SUBSTR_BG = {
|
|
2473
|
+
primary: "bg-primary/15",
|
|
2474
|
+
warning: "bg-warning/20",
|
|
2475
|
+
success: "bg-success/15",
|
|
2476
|
+
danger: "bg-danger/15"
|
|
2477
|
+
};
|
|
2478
|
+
const lineRanges = useMemo(() => {
|
|
2479
|
+
const map = /* @__PURE__ */ new Map();
|
|
2480
|
+
if (!highlightRanges) return map;
|
|
2481
|
+
for (const r of highlightRanges) {
|
|
2482
|
+
const line = r.line;
|
|
2483
|
+
if (!map.has(line)) map.set(line, []);
|
|
2484
|
+
map.get(line).push({ start: r.start, end: r.end, color: r.color ?? "primary" });
|
|
2485
|
+
}
|
|
2486
|
+
return map;
|
|
2487
|
+
}, [highlightRanges]);
|
|
2488
|
+
function segmentedLine(line, ranges) {
|
|
2489
|
+
const sorted = [...ranges].sort((a, b) => a.start - b.start);
|
|
2490
|
+
const parts = [];
|
|
2491
|
+
let pos = 0;
|
|
2492
|
+
for (let i = 0; i < sorted.length; i++) {
|
|
2493
|
+
const r = sorted[i];
|
|
2494
|
+
const s = Math.max(r.start, 0);
|
|
2495
|
+
const e = Math.min(r.end, line.length);
|
|
2496
|
+
if (s > pos) parts.push(/* @__PURE__ */ jsx46("span", { children: line.slice(pos, s) }, `t${i}`));
|
|
2497
|
+
if (e > s) {
|
|
2498
|
+
const bg = SUBSTR_BG[r.color] ?? SUBSTR_BG.primary;
|
|
2499
|
+
parts.push(
|
|
2500
|
+
/* @__PURE__ */ jsx46("span", { className: cn(bg, "rounded-sm px-0.5 -mx-0.5"), children: line.slice(s, e) }, `h${i}`)
|
|
2501
|
+
);
|
|
2502
|
+
pos = e;
|
|
2503
|
+
}
|
|
2504
|
+
while (i + 1 < sorted.length && sorted[i + 1].start < pos) i++;
|
|
2505
|
+
}
|
|
2506
|
+
if (pos < line.length) parts.push(/* @__PURE__ */ jsx46("span", { children: line.slice(pos) }, "end"));
|
|
2507
|
+
if (parts.length === 0) parts.push(/* @__PURE__ */ jsx46("span", { children: "\xA0" }, "e"));
|
|
2508
|
+
return /* @__PURE__ */ jsx46(Fragment2, { children: parts });
|
|
2509
|
+
}
|
|
2472
2510
|
return /* @__PURE__ */ jsxs19("div", { className: cn(codeBlockVariants({ variant }), className), children: [
|
|
2473
2511
|
hasHeader && /* @__PURE__ */ jsxs19("div", { className: "flex items-center justify-between gap-2 h-9 pl-panel pr-1.5 border-b border-border", children: [
|
|
2474
2512
|
/* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-2 min-w-0", children: [
|
|
@@ -2500,7 +2538,10 @@ var CodeBlock = forwardRef42(
|
|
|
2500
2538
|
wrap && "whitespace-pre-wrap break-words"
|
|
2501
2539
|
),
|
|
2502
2540
|
...props,
|
|
2503
|
-
children: /* @__PURE__ */ jsx46("code", { children: perLineTokens.map((lineTokens, i) =>
|
|
2541
|
+
children: /* @__PURE__ */ jsx46("code", { children: perLineTokens.map((lineTokens, i) => {
|
|
2542
|
+
const r = lineRanges.get(i + 1);
|
|
2543
|
+
return /* @__PURE__ */ jsx46("div", { className: cn("px-panel", lineColor.get(i + 1)), children: r ? segmentedLine(lines[i], r) : lineTokens.length > 0 ? renderHighlightedLine(lineTokens) : " " }, i);
|
|
2544
|
+
}) })
|
|
2504
2545
|
}
|
|
2505
2546
|
) : /* @__PURE__ */ jsx46(
|
|
2506
2547
|
"pre",
|
|
@@ -2511,7 +2552,10 @@ var CodeBlock = forwardRef42(
|
|
|
2511
2552
|
wrap && "whitespace-pre-wrap break-words"
|
|
2512
2553
|
),
|
|
2513
2554
|
...props,
|
|
2514
|
-
children: /* @__PURE__ */ jsx46("code", { children: lines.map((line, i) =>
|
|
2555
|
+
children: /* @__PURE__ */ jsx46("code", { children: lines.map((line, i) => {
|
|
2556
|
+
const r = lineRanges.get(i + 1);
|
|
2557
|
+
return /* @__PURE__ */ jsx46("div", { className: cn("px-panel", lineColor.get(i + 1)), children: r ? segmentedLine(line, r) : line || " " }, i);
|
|
2558
|
+
}) })
|
|
2515
2559
|
}
|
|
2516
2560
|
)
|
|
2517
2561
|
] })
|
|
@@ -2790,7 +2834,7 @@ function TreeView({
|
|
|
2790
2834
|
}
|
|
2791
2835
|
|
|
2792
2836
|
// src/ui/cell-type/CellType.complex-displays.tsx
|
|
2793
|
-
import { Fragment as
|
|
2837
|
+
import { Fragment as Fragment3, jsx as jsx50, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
2794
2838
|
function safeStringify(value) {
|
|
2795
2839
|
const seen = /* @__PURE__ */ new WeakSet();
|
|
2796
2840
|
return JSON.stringify(value, (_, val) => {
|
|
@@ -2863,7 +2907,7 @@ function JsonDisplay({ value }) {
|
|
|
2863
2907
|
const preview = jsonPreview(value);
|
|
2864
2908
|
if (!preview) return /* @__PURE__ */ jsx50("span", { className: "text-muted", children: "\u2014" });
|
|
2865
2909
|
return /* @__PURE__ */ jsxs21(Root9, { children: [
|
|
2866
|
-
/* @__PURE__ */ jsx50(Trigger5, { className: "font-mono text-xs cursor-pointer hover:text-primary transition-colors flex w-full max-w-full min-w-0 items-center gap-1.5", children: count === 0 ? /* @__PURE__ */ jsx50("span", { className: "text-muted italic", children: "empty" }) : /* @__PURE__ */ jsxs21(
|
|
2910
|
+
/* @__PURE__ */ jsx50(Trigger5, { className: "font-mono text-xs cursor-pointer hover:text-primary transition-colors flex w-full max-w-full min-w-0 items-center gap-1.5", children: count === 0 ? /* @__PURE__ */ jsx50("span", { className: "text-muted italic", children: "empty" }) : /* @__PURE__ */ jsxs21(Fragment3, { children: [
|
|
2867
2911
|
/* @__PURE__ */ jsxs21(Badge, { variant: "neutral", style: "soft", className: "text-xs px-1 py-0 leading-none shrink-0", children: [
|
|
2868
2912
|
count,
|
|
2869
2913
|
" ",
|
|
@@ -2928,7 +2972,7 @@ function TreeDisplay({ value, replacements }) {
|
|
|
2928
2972
|
return () => ro.disconnect();
|
|
2929
2973
|
}, [value]);
|
|
2930
2974
|
return /* @__PURE__ */ jsxs21(Root9, { children: [
|
|
2931
|
-
/* @__PURE__ */ jsx50(Trigger5, { className: "font-mono text-xs cursor-pointer hover:text-primary transition-colors flex w-full max-w-full min-w-0 items-center gap-1.5", children: count === 0 ? /* @__PURE__ */ jsx50("span", { className: "text-muted italic", children: "empty" }) : /* @__PURE__ */ jsxs21(
|
|
2975
|
+
/* @__PURE__ */ jsx50(Trigger5, { className: "font-mono text-xs cursor-pointer hover:text-primary transition-colors flex w-full max-w-full min-w-0 items-center gap-1.5", children: count === 0 ? /* @__PURE__ */ jsx50("span", { className: "text-muted italic", children: "empty" }) : /* @__PURE__ */ jsxs21(Fragment3, { children: [
|
|
2932
2976
|
/* @__PURE__ */ jsxs21(Badge, { variant: "neutral", style: "soft", className: "text-xs px-1 py-0 leading-none shrink-0", children: [
|
|
2933
2977
|
count,
|
|
2934
2978
|
" ",
|
|
@@ -2968,7 +3012,7 @@ function ArrayDisplay({ value }) {
|
|
|
2968
3012
|
return () => ro.disconnect();
|
|
2969
3013
|
}, [value]);
|
|
2970
3014
|
return /* @__PURE__ */ jsxs21(Root9, { children: [
|
|
2971
|
-
/* @__PURE__ */ jsx50(Trigger5, { className: "font-mono text-xs cursor-pointer hover:text-primary transition-colors flex w-full max-w-full min-w-0 items-center gap-1.5", children: count === 0 ? /* @__PURE__ */ jsx50("span", { className: "text-muted italic", children: "empty" }) : /* @__PURE__ */ jsxs21(
|
|
3015
|
+
/* @__PURE__ */ jsx50(Trigger5, { className: "font-mono text-xs cursor-pointer hover:text-primary transition-colors flex w-full max-w-full min-w-0 items-center gap-1.5", children: count === 0 ? /* @__PURE__ */ jsx50("span", { className: "text-muted italic", children: "empty" }) : /* @__PURE__ */ jsxs21(Fragment3, { children: [
|
|
2972
3016
|
/* @__PURE__ */ jsxs21(Badge, { variant: "neutral", style: "soft", className: "text-xs px-1 py-0 leading-none shrink-0", children: [
|
|
2973
3017
|
count,
|
|
2974
3018
|
" items"
|
|
@@ -2998,7 +3042,7 @@ function ArrayDisplay({ value }) {
|
|
|
2998
3042
|
}
|
|
2999
3043
|
|
|
3000
3044
|
// src/ui/cell-type/CellType.tsx
|
|
3001
|
-
import { Fragment as
|
|
3045
|
+
import { Fragment as Fragment4, jsx as jsx51, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
3002
3046
|
function BooleanDisplay({ value }) {
|
|
3003
3047
|
const t = Boolean(value);
|
|
3004
3048
|
return /* @__PURE__ */ jsx51("span", { className: cn("inline-flex items-center", t ? "text-success" : "text-muted"), children: /* @__PURE__ */ jsx51("svg", { viewBox: "0 0 12 12", className: "size-icon fill-current", children: t ? /* @__PURE__ */ jsx51("path", { d: "M2 6l3 3 5-5", stroke: "currentColor", strokeWidth: "1.5", fill: "none" }) : /* @__PURE__ */ jsx51("path", { d: "M2 2l8 8M10 2L2 10", stroke: "currentColor", strokeWidth: "1.5", fill: "none" }) }) });
|
|
@@ -3012,7 +3056,7 @@ function applyReplacements(str, replacements) {
|
|
|
3012
3056
|
function ImageDisplay({ value }) {
|
|
3013
3057
|
const src = String(value);
|
|
3014
3058
|
const [open, setOpen] = useState5(false);
|
|
3015
|
-
return /* @__PURE__ */ jsxs22(
|
|
3059
|
+
return /* @__PURE__ */ jsxs22(Fragment4, { children: [
|
|
3016
3060
|
/* @__PURE__ */ jsx51("img", { src, alt: "", className: "size-8 rounded-ui-sm object-cover border border-border cursor-pointer hover:opacity-80 transition-opacity", onClick: () => setOpen(true) }),
|
|
3017
3061
|
/* @__PURE__ */ jsx51(Root6, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxs22(DialogContent, { className: "p-0 overflow-hidden max-w-[90vw] w-auto", children: [
|
|
3018
3062
|
/* @__PURE__ */ jsx51(DialogTitle, { className: "sr-only", children: "Image preview" }),
|
|
@@ -3204,7 +3248,7 @@ function snap(v) {
|
|
|
3204
3248
|
}
|
|
3205
3249
|
|
|
3206
3250
|
// src/ui/canvas/Canvas.tsx
|
|
3207
|
-
import { Fragment as
|
|
3251
|
+
import { Fragment as Fragment5, jsx as jsx52, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
3208
3252
|
var btn = "inline-flex items-center justify-center size-7 rounded-ui-sm border border-border bg-bg text-xs text-fg hover:bg-secondary cursor-pointer";
|
|
3209
3253
|
var Canvas = forwardRef45(
|
|
3210
3254
|
({ className, gridSize = GRID, initialZoom = 1, minZoom = 0.25, maxZoom = 3, zoomStep = 0.1, controls, children, style, onBackgroundClick, offset: controlledOffset, zoom: controlledZoom, onOffsetChange, onZoomChange, ...props }, ref) => {
|
|
@@ -3357,7 +3401,7 @@ var Canvas = forwardRef45(
|
|
|
3357
3401
|
"%"
|
|
3358
3402
|
] }),
|
|
3359
3403
|
/* @__PURE__ */ jsx52("button", { type: "button", className: btn, onClick: zoomIn, title: "Zoom in", children: "+" }),
|
|
3360
|
-
controls && /* @__PURE__ */ jsxs23(
|
|
3404
|
+
controls && /* @__PURE__ */ jsxs23(Fragment5, { children: [
|
|
3361
3405
|
/* @__PURE__ */ jsx52("div", { className: "w-px h-4 bg-border mx-0.5" }),
|
|
3362
3406
|
controls
|
|
3363
3407
|
] })
|
|
@@ -3760,7 +3804,7 @@ Combobox.displayName = "Combobox";
|
|
|
3760
3804
|
|
|
3761
3805
|
// src/ui/multi-select/MultiSelect.tsx
|
|
3762
3806
|
import { forwardRef as forwardRef51, useState as useState8, useMemo as useMemo6, useRef as useRef7 } from "react";
|
|
3763
|
-
import { Fragment as
|
|
3807
|
+
import { Fragment as Fragment6, jsx as jsx59, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
3764
3808
|
var MultiSelect = forwardRef51(
|
|
3765
3809
|
function MultiSelect2({ options, value = [], onChange, placeholder = "Select...", emptyText = "No results found", className, disabled }, ref) {
|
|
3766
3810
|
const [open, setOpen] = useState8(false);
|
|
@@ -3792,7 +3836,7 @@ var MultiSelect = forwardRef51(
|
|
|
3792
3836
|
selectedLabels.length === 0 && "text-muted",
|
|
3793
3837
|
className
|
|
3794
3838
|
),
|
|
3795
|
-
children: selectedLabels.length === 0 ? placeholder : selectedLabels.length <= 3 ? selectedLabels.map((opt) => /* @__PURE__ */ jsx59(Badge, { variant: "neutral", style: "soft", children: opt.label }, opt.value)) : /* @__PURE__ */ jsxs29(
|
|
3839
|
+
children: selectedLabels.length === 0 ? placeholder : selectedLabels.length <= 3 ? selectedLabels.map((opt) => /* @__PURE__ */ jsx59(Badge, { variant: "neutral", style: "soft", children: opt.label }, opt.value)) : /* @__PURE__ */ jsxs29(Fragment6, { children: [
|
|
3796
3840
|
selectedLabels.slice(0, 2).map((opt) => /* @__PURE__ */ jsx59(Badge, { variant: "neutral", style: "soft", children: opt.label }, opt.value)),
|
|
3797
3841
|
/* @__PURE__ */ jsxs29(Badge, { variant: "neutral", style: "soft", children: [
|
|
3798
3842
|
"+",
|
|
@@ -4165,7 +4209,7 @@ Slider.displayName = "Slider";
|
|
|
4165
4209
|
|
|
4166
4210
|
// src/ui/markdown/Markdown.tsx
|
|
4167
4211
|
import { useMemo as useMemo8 } from "react";
|
|
4168
|
-
import { Fragment as
|
|
4212
|
+
import { Fragment as Fragment7, jsx as jsx65, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
4169
4213
|
function escapeHtml(text) {
|
|
4170
4214
|
return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
4171
4215
|
}
|
|
@@ -4192,7 +4236,7 @@ function renderInline(text) {
|
|
|
4192
4236
|
if (lastIndex < text.length) {
|
|
4193
4237
|
parts.push(escapeHtml(text.slice(lastIndex)));
|
|
4194
4238
|
}
|
|
4195
|
-
return parts.length === 1 ? parts[0] : parts.length > 1 ? /* @__PURE__ */ jsx65(
|
|
4239
|
+
return parts.length === 1 ? parts[0] : parts.length > 1 ? /* @__PURE__ */ jsx65(Fragment7, { children: parts }) : "";
|
|
4196
4240
|
}
|
|
4197
4241
|
function parseBlocks(content) {
|
|
4198
4242
|
const lines = content.split("\n");
|
|
@@ -4290,7 +4334,7 @@ function Markdown({ content, className, ...props }) {
|
|
|
4290
4334
|
// src/ui/file-drop/FileDrop.tsx
|
|
4291
4335
|
import { forwardRef as forwardRef57, useState as useState10, useRef as useRef9, useCallback as useCallback9 } from "react";
|
|
4292
4336
|
import { cva as cva34 } from "class-variance-authority";
|
|
4293
|
-
import { Fragment as
|
|
4337
|
+
import { Fragment as Fragment8, jsx as jsx66, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
4294
4338
|
var fileDropVariants = cva34(
|
|
4295
4339
|
"relative flex flex-col items-center justify-center gap-2 rounded-ui border-2 border-dashed p-8 text-center transition-colors cursor-pointer",
|
|
4296
4340
|
{
|
|
@@ -4374,10 +4418,10 @@ var FileDrop = forwardRef57(
|
|
|
4374
4418
|
...props,
|
|
4375
4419
|
children: [
|
|
4376
4420
|
/* @__PURE__ */ jsx66("input", { ref: inputRef, type: "file", accept, multiple, className: "hidden", onChange: handleFileChange }),
|
|
4377
|
-
dragOver ? /* @__PURE__ */ jsxs36(
|
|
4421
|
+
dragOver ? /* @__PURE__ */ jsxs36(Fragment8, { children: [
|
|
4378
4422
|
/* @__PURE__ */ jsx66("svg", { viewBox: "0 0 24 24", className: "size-8 text-primary fill-none stroke-current stroke-[1.5]", children: /* @__PURE__ */ jsx66("path", { d: "M12 4v12m0 0l-3-3m3 3l3-3M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2" }) }),
|
|
4379
4423
|
/* @__PURE__ */ jsx66("p", { className: "font-medium text-primary", children: "Drop files here" })
|
|
4380
|
-
] }) : /* @__PURE__ */ jsxs36(
|
|
4424
|
+
] }) : /* @__PURE__ */ jsxs36(Fragment8, { children: [
|
|
4381
4425
|
/* @__PURE__ */ jsx66("svg", { viewBox: "0 0 24 24", className: "size-8 text-muted fill-none stroke-current stroke-[1.5]", children: /* @__PURE__ */ jsx66("path", { d: "M7 16a4 4 0 010-8 5 5 0 0110 0 4 4 0 010 8h-1M12 4v12m0 0l-3-3m3 3l3-3" }) }),
|
|
4382
4426
|
/* @__PURE__ */ jsx66("p", { className: "font-medium text-fg", children: error || success ? "" : "Drop files here or click to browse" }),
|
|
4383
4427
|
error && /* @__PURE__ */ jsx66("p", { className: "text-xs text-danger", children: error }),
|
|
@@ -5056,7 +5100,7 @@ var TexturedSurface = forwardRef59(
|
|
|
5056
5100
|
TexturedSurface.displayName = "TexturedSurface";
|
|
5057
5101
|
|
|
5058
5102
|
// src/ui/patterns/textured-surface/ParamTable.tsx
|
|
5059
|
-
import { Fragment as
|
|
5103
|
+
import { Fragment as Fragment9 } from "react";
|
|
5060
5104
|
import { jsx as jsx72, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
5061
5105
|
var LAYERS = ["page", "surface", "foreground"];
|
|
5062
5106
|
var STRENGTHS = ["subtle", "medium", "strong"];
|
|
@@ -5069,7 +5113,7 @@ function ParamTable({ texture = "paper-grain" }) {
|
|
|
5069
5113
|
return /* @__PURE__ */ jsxs41("div", { className: "w-full grid grid-cols-[4rem_repeat(3,1fr)] gap-1 items-center", children: [
|
|
5070
5114
|
/* @__PURE__ */ jsx72("div", {}),
|
|
5071
5115
|
STRENGTHS.map((s) => /* @__PURE__ */ jsx72("div", { className: "text-center text-xs font-medium text-muted", children: s }, s)),
|
|
5072
|
-
LAYERS.map((layer) => /* @__PURE__ */ jsxs41(
|
|
5116
|
+
LAYERS.map((layer) => /* @__PURE__ */ jsxs41(Fragment9, { children: [
|
|
5073
5117
|
/* @__PURE__ */ jsx72("div", { className: "text-xs font-medium text-muted self-center", children: LAYER_LABELS[layer] }),
|
|
5074
5118
|
STRENGTHS.map((strength) => /* @__PURE__ */ jsx72(
|
|
5075
5119
|
TexturedSurface,
|