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 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
@@ -257,6 +257,7 @@
257
257
  "Line highlights",
258
258
  "Line highlights (implicit gutter)",
259
259
  "Multi-color highlights",
260
+ "Substring highlights",
260
261
  "Syntax highlighting (CSS / HTML / SQL / YAML / Python)"
261
262
  ]
262
263
  },
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) => /* @__PURE__ */ jsx46("div", { className: cn("px-panel", lineColor.get(i + 1)), children: lineTokens.length > 0 ? renderHighlightedLine(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) => /* @__PURE__ */ jsx46("div", { className: cn("px-panel", lineColor.get(i + 1)), children: 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 Fragment2, jsx as jsx50, jsxs as jsxs21 } from "react/jsx-runtime";
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(Fragment2, { children: [
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(Fragment2, { children: [
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(Fragment2, { children: [
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 Fragment3, jsx as jsx51, jsxs as jsxs22 } from "react/jsx-runtime";
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(Fragment3, { children: [
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 Fragment4, jsx as jsx52, jsxs as jsxs23 } from "react/jsx-runtime";
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(Fragment4, { children: [
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 Fragment5, jsx as jsx59, jsxs as jsxs29 } from "react/jsx-runtime";
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(Fragment5, { children: [
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 Fragment6, jsx as jsx65, jsxs as jsxs35 } from "react/jsx-runtime";
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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
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(Fragment6, { children: parts }) : "";
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 Fragment7, jsx as jsx66, jsxs as jsxs36 } from "react/jsx-runtime";
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(Fragment7, { children: [
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(Fragment7, { children: [
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 Fragment8 } from "react";
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(Fragment8, { children: [
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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "my-you-eye",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/sadigaxund/my-you-eye"