@almadar/ui 6.53.1 → 6.55.0

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.
Files changed (120) hide show
  1. package/dist/{AwaitingSkeletonContext-Bh399p1x.d.ts → AwaitingSkeletonContext-DPgW__WV.d.ts} +3 -1
  2. package/dist/{Canvas3DHost-B-y2TNij.d.ts → Canvas3DHost-DfAhg6EH.d.ts} +2 -0
  3. package/dist/Typography-7PDT62PG.js +5 -0
  4. package/dist/{UISlotRenderer-P7A4SZSK.js → UISlotRenderer-QTHFT6Z4.js} +8 -8
  5. package/dist/avl/index.cjs +3031 -1790
  6. package/dist/avl/index.js +57 -745
  7. package/dist/{avl-3d-context-MAt_NuU9.d.ts → avl-3d-context-BpBKZIbc.d.ts} +1 -0
  8. package/dist/{chunk-ERXIHZW3.js → chunk-D2E44ODB.js} +29 -15
  9. package/dist/{chunk-UOTYAPV5.js → chunk-F4ZTPKZL.js} +3 -3
  10. package/dist/{chunk-53VTY5CC.js → chunk-FQM37C56.js} +352 -162
  11. package/dist/{chunk-HB4C27KU.js → chunk-HCSJHRC4.js} +1 -1
  12. package/dist/{chunk-7KSLPY56.js → chunk-HRCR53OW.js} +11 -1
  13. package/dist/{chunk-O7OLVVBR.js → chunk-Q47ZN2DW.js} +24 -22
  14. package/dist/{chunk-DQTV6QVS.js → chunk-QGH4NAQO.js} +53 -2
  15. package/dist/{chunk-QVXLKFUQ.js → chunk-RNY5LJXJ.js} +1 -1
  16. package/dist/{chunk-FUQASYEW.js → chunk-SGJHVPHC.js} +2 -2
  17. package/dist/{chunk-6O37FCX4.js → chunk-V3FGTQUE.js} +37 -2
  18. package/dist/{chunk-HUG25TT3.js → chunk-XZKGRSIO.js} +2745 -1644
  19. package/dist/{chunk-7LM6I3NA.js → chunk-Y53Q55H5.js} +522 -24
  20. package/dist/components/index.cjs +4614 -2858
  21. package/dist/components/index.d.ts +122 -53
  22. package/dist/components/index.js +16 -17
  23. package/dist/context/index.cjs +38 -1
  24. package/dist/context/index.d.ts +1 -1
  25. package/dist/context/index.js +3 -1
  26. package/dist/design-classes/index.cjs +29 -15
  27. package/dist/design-classes/index.d.cts +1 -0
  28. package/dist/design-classes/index.d.ts +1 -0
  29. package/dist/design-classes/index.js +29 -15
  30. package/dist/hooks/index.cjs +16 -1
  31. package/dist/hooks/index.d.ts +10 -1
  32. package/dist/hooks/index.js +3 -4
  33. package/dist/lib/drawable/three/index.cjs +444 -82
  34. package/dist/lib/drawable/three/index.d.ts +4 -4
  35. package/dist/lib/drawable/three/index.js +28 -24
  36. package/dist/lib/index.cjs +53 -3
  37. package/dist/lib/index.d.ts +1 -1
  38. package/dist/lib/index.js +4 -4
  39. package/dist/locales/index.cjs +33 -3
  40. package/dist/locales/index.js +23 -3
  41. package/dist/providers/index.cjs +4987 -3183
  42. package/dist/providers/index.d.ts +2 -2
  43. package/dist/providers/index.js +14 -11
  44. package/dist/runtime/index.cjs +8973 -7000
  45. package/dist/runtime/index.d.ts +28 -6
  46. package/dist/runtime/index.js +16 -13
  47. package/dist/ssr/index.cjs +26 -9
  48. package/dist/ssr/index.js +26 -9
  49. package/dist/{themeTokens-Ccu7EmGY.d.ts → themeTokens-D6MFwKrC.d.ts} +6 -2
  50. package/locales/ar.json +11 -1
  51. package/locales/en.json +11 -1
  52. package/locales/sl.json +11 -1
  53. package/package.json +8 -7
  54. package/scripts/audit-tailwind-safelist.ts +21 -1
  55. package/scripts/theme-contrast-audit.mjs +20 -1
  56. package/tailwind-preset.cjs +5 -6
  57. package/themes/_base.css +61 -0
  58. package/themes/_contract.md +37 -0
  59. package/themes/_fonts.css +6 -4
  60. package/themes/_presets.css +2 -0
  61. package/themes/almadar-heritage.css +455 -0
  62. package/themes/almadar-website.css +82 -0
  63. package/themes/almadar.css +82 -0
  64. package/themes/aqua.css +82 -0
  65. package/themes/arabesque.css +82 -0
  66. package/themes/art-deco.css +82 -0
  67. package/themes/art-nouveau.css +82 -0
  68. package/themes/atelier.css +82 -0
  69. package/themes/bauhaus.css +82 -0
  70. package/themes/bloomberg-dense.css +83 -1
  71. package/themes/blueprint.css +84 -0
  72. package/themes/clay.css +82 -0
  73. package/themes/comic.css +82 -0
  74. package/themes/constructivist.css +82 -0
  75. package/themes/corporate.css +82 -0
  76. package/themes/cyberpunk.css +82 -0
  77. package/themes/frutiger-aero.css +83 -0
  78. package/themes/game-adventure.css +15 -0
  79. package/themes/game-rpg.css +16 -0
  80. package/themes/game-sci-fi.css +15 -0
  81. package/themes/game-ui-pack.css +15 -0
  82. package/themes/gazette.css +82 -0
  83. package/themes/glass.css +82 -0
  84. package/themes/gothic.css +82 -0
  85. package/themes/ink-wash.css +82 -0
  86. package/themes/kawaii.css +82 -0
  87. package/themes/kiosk.css +82 -0
  88. package/themes/linear-clean.css +82 -0
  89. package/themes/luxury.css +82 -0
  90. package/themes/mac-classic.css +90 -8
  91. package/themes/material.css +82 -0
  92. package/themes/memphis.css +82 -0
  93. package/themes/mid-century.css +82 -0
  94. package/themes/minimalist.css +82 -0
  95. package/themes/mudcloth.css +82 -0
  96. package/themes/neon.css +83 -0
  97. package/themes/neumorphic.css +82 -0
  98. package/themes/newsprint.css +82 -0
  99. package/themes/notion-editorial.css +82 -0
  100. package/themes/orb.css +455 -0
  101. package/themes/pixel.css +82 -0
  102. package/themes/prism.css +82 -0
  103. package/themes/retro.css +83 -0
  104. package/themes/risograph.css +82 -0
  105. package/themes/scandi.css +82 -0
  106. package/themes/sketch.css +82 -0
  107. package/themes/solarpunk.css +82 -0
  108. package/themes/steampunk.css +82 -0
  109. package/themes/swiss.css +82 -0
  110. package/themes/terminal.css +84 -1
  111. package/themes/trait-wars.css +82 -0
  112. package/themes/ukiyo-e.css +82 -0
  113. package/themes/vaporwave.css +82 -0
  114. package/themes/victorian.css +82 -0
  115. package/themes/wabi-sabi.css +82 -0
  116. package/themes/win95.css +84 -0
  117. package/themes/wireframe.css +82 -0
  118. package/themes/zine.css +82 -0
  119. package/dist/Typography-7QEWUTW3.js +0 -5
  120. package/dist/chunk-E37BYSXY.js +0 -51
@@ -12,13 +12,13 @@ var jsxRuntime = require('react/jsx-runtime');
12
12
  var postprocessing = require('@react-three/postprocessing');
13
13
  var GLTFLoader_js = require('three/examples/jsm/loaders/GLTFLoader.js');
14
14
  var SkeletonUtils_js = require('three/examples/jsm/utils/SkeletonUtils.js');
15
+ var context = require('@almadar/ui/context');
16
+ var core = require('@almadar/core');
15
17
  var clsx = require('clsx');
16
18
  var tailwindMerge = require('tailwind-merge');
17
19
  var OrbitControls_js = require('three/examples/jsm/controls/OrbitControls.js');
18
20
  var OBJLoader_js = require('three/examples/jsm/loaders/OBJLoader.js');
19
- var context = require('@almadar/ui/context');
20
21
  require('@almadar/core/patterns');
21
- var core = require('@almadar/core');
22
22
  var runtime = require('@almadar/runtime');
23
23
  var registry = require('@almadar/std/registry');
24
24
 
@@ -2046,13 +2046,392 @@ function FxLayer3D({
2046
2046
  const children = expandFxLayer(node, epochNow, "3d");
2047
2047
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: children.map((c, i) => /* @__PURE__ */ jsxRuntime.jsx(Drawable3D, { node: c, projector, groupOpacity }, i)) });
2048
2048
  }
2049
+ var log4 = logger.createLogger("almadar:ui:theme-color");
2050
+ function channel(value, unitScale) {
2051
+ return Math.round(Math.min(255, Math.max(0, Number(value) * unitScale)));
2052
+ }
2053
+ function make(r, g, b, a) {
2054
+ return { r, g, b, a, css: `rgb(${r}, ${g}, ${b})` };
2055
+ }
2056
+ function gamma(linear) {
2057
+ const c = Math.min(1, Math.max(0, linear));
2058
+ return Math.round(255 * (c <= 31308e-7 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055));
2059
+ }
2060
+ function fromOklab(L, a, b, alpha) {
2061
+ const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3;
2062
+ const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3;
2063
+ const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3;
2064
+ return make(
2065
+ gamma(4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),
2066
+ gamma(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),
2067
+ gamma(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s),
2068
+ alpha
2069
+ );
2070
+ }
2071
+ function component(raw, percentOf) {
2072
+ if (raw === "none") return 0;
2073
+ return raw.endsWith("%") ? Number(raw.slice(0, -1)) / 100 * percentOf : Number(raw);
2074
+ }
2075
+ var NUM = "(none|-?[\\d.]+(?:e-?\\d+)?%?)";
2076
+ var OKLCH = new RegExp(`^oklch\\(\\s*${NUM}\\s+${NUM}\\s+${NUM}(?:deg)?\\s*(?:\\/\\s*${NUM}\\s*)?\\)$`, "i");
2077
+ var OKLAB = new RegExp(`^oklab\\(\\s*${NUM}\\s+${NUM}\\s+${NUM}\\s*(?:\\/\\s*${NUM}\\s*)?\\)$`, "i");
2078
+ function parseComputedColor(value) {
2079
+ const v = value.trim();
2080
+ const lch = OKLCH.exec(v);
2081
+ if (lch) {
2082
+ const hue = component(lch[3], 360) * Math.PI / 180;
2083
+ const chroma = component(lch[2], 0.4);
2084
+ return fromOklab(component(lch[1], 1), chroma * Math.cos(hue), chroma * Math.sin(hue), lch[4] === void 0 ? 1 : component(lch[4], 1));
2085
+ }
2086
+ const lab = OKLAB.exec(v);
2087
+ if (lab) {
2088
+ return fromOklab(component(lab[1], 1), component(lab[2], 0.4), component(lab[3], 0.4), lab[4] === void 0 ? 1 : component(lab[4], 1));
2089
+ }
2090
+ const hex = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(v);
2091
+ if (hex) {
2092
+ const h = hex[1].length === 3 ? hex[1].split("").map((c) => c + c).join("") : hex[1];
2093
+ return make(parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16), 1);
2094
+ }
2095
+ const rgb = /^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)\s*(?:[,/]\s*([\d.]+)\s*)?\)$/i.exec(v);
2096
+ if (rgb) {
2097
+ return make(channel(rgb[1], 1), channel(rgb[2], 1), channel(rgb[3], 1), rgb[4] === void 0 ? 1 : Number(rgb[4]));
2098
+ }
2099
+ const srgb = /^color\(srgb\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)\s*(?:\/\s*([\d.]+)\s*)?\)$/i.exec(v);
2100
+ if (srgb) {
2101
+ return make(channel(srgb[1], 255), channel(srgb[2], 255), channel(srgb[3], 255), srgb[4] === void 0 ? 1 : Number(srgb[4]));
2102
+ }
2103
+ return null;
2104
+ }
2105
+ var SENTINEL = "rgb(1, 2, 3)";
2106
+ function getComputedSentinel(doc) {
2107
+ const s = doc.createElement("span");
2108
+ s.style.display = "none";
2109
+ s.style.color = SENTINEL;
2110
+ doc.body.appendChild(s);
2111
+ const c = getComputedStyle(s).color;
2112
+ doc.body.removeChild(s);
2113
+ return c;
2114
+ }
2115
+ function resolveThemeColor(value, scope) {
2116
+ const doc = scope.ownerDocument;
2117
+ const wrapper = doc.createElement("span");
2118
+ wrapper.style.display = "none";
2119
+ wrapper.style.color = SENTINEL;
2120
+ const probe = doc.createElement("span");
2121
+ probe.style.color = value;
2122
+ wrapper.appendChild(probe);
2123
+ scope.appendChild(wrapper);
2124
+ const computed = probe.style.color === "" ? "" : getComputedStyle(probe).color;
2125
+ scope.removeChild(wrapper);
2126
+ const parsed = computed === getComputedSentinel(doc) ? null : parseComputedColor(computed);
2127
+ if (!parsed) log4.error("unresolvable-theme-color", { value, computed });
2128
+ return parsed;
2129
+ }
2049
2130
 
2050
- // lib/drawable/three/game3dTheme.ts
2051
- var GRID_COLORS_3D = {
2052
- cell: "#444444",
2053
- section: "#666666"
2131
+ // lib/canvasTheme.ts
2132
+ var log5 = logger.createLogger("almadar:ui:canvas-theme");
2133
+ var toneVar = (tone) => `--color-${core.DIAGRAM_TONE_COLOR_KEYS[tone]}`;
2134
+ var SERIES_TONES = ["series-1", "series-2", "series-3", "series-4", "series-5", "series-6", "series-7", "series-8"];
2135
+ var TONE_SET = new Set(core.DIAGRAM_TONES);
2136
+ function isDiagramTone(value) {
2137
+ return TONE_SET.has(value);
2138
+ }
2139
+ function colorCss(c) {
2140
+ return c.a >= 1 ? c.css : `rgba(${c.r}, ${c.g}, ${c.b}, ${c.a})`;
2141
+ }
2142
+ function oneOf(value, allowed, fallback, name) {
2143
+ const hit = allowed.find((a) => a === value);
2144
+ if (hit !== void 0) return hit;
2145
+ if (value !== "") log5.warn("invalid-theme-keyword", { var: name, value, allowed });
2146
+ return fallback;
2147
+ }
2148
+ var PLAIN_LENGTH = /^(-?[\d.]+)(px)?$/;
2149
+ var ScopeReader = class {
2150
+ constructor(scope) {
2151
+ __publicField(this, "scope", scope);
2152
+ __publicField(this, "style");
2153
+ __publicField(this, "probe");
2154
+ this.style = getComputedStyle(scope);
2155
+ const doc = scope.ownerDocument;
2156
+ this.probe = doc.createElement("span");
2157
+ this.probe.style.position = "absolute";
2158
+ this.probe.style.visibility = "hidden";
2159
+ this.probe.style.pointerEvents = "none";
2160
+ scope.appendChild(this.probe);
2161
+ }
2162
+ dispose() {
2163
+ this.probe.remove();
2164
+ }
2165
+ raw(name) {
2166
+ return this.style.getPropertyValue(name).trim();
2167
+ }
2168
+ /** A length var in px: a plain value parses directly, a derived one (`calc`, `var`) through the probe. */
2169
+ length(name, fallback) {
2170
+ const raw = this.raw(name);
2171
+ const plain = PLAIN_LENGTH.exec(raw);
2172
+ if (plain) return Number(plain[1]);
2173
+ if (raw === "") return fallback;
2174
+ this.probe.style.width = `var(${name})`;
2175
+ const computed = PLAIN_LENGTH.exec(getComputedStyle(this.probe).width.trim());
2176
+ this.probe.style.width = "";
2177
+ if (computed) return Number(computed[1]);
2178
+ log5.warn("unresolvable-theme-length", { var: name, raw });
2179
+ return fallback;
2180
+ }
2181
+ number(name, fallback) {
2182
+ const raw = this.raw(name);
2183
+ if (raw === "") return fallback;
2184
+ const n = Number(raw);
2185
+ if (Number.isFinite(n)) return n;
2186
+ log5.warn("unresolvable-theme-number", { var: name, raw });
2187
+ return fallback;
2188
+ }
2189
+ /** A duration var in ms (`250ms`, `0.25s`, or a `var()` alias resolved through the probe). */
2190
+ durationMs(name, fallback) {
2191
+ const parse = (v) => {
2192
+ const m = /^([\d.]+)(ms|s)$/.exec(v.trim());
2193
+ return m ? Number(m[1]) * (m[2] === "s" ? 1e3 : 1) : null;
2194
+ };
2195
+ const raw = this.raw(name);
2196
+ const direct = parse(raw);
2197
+ if (direct !== null) return direct;
2198
+ if (raw === "") return fallback;
2199
+ this.probe.style.transitionDuration = `var(${name})`;
2200
+ const computed = parse(getComputedStyle(this.probe).transitionDuration.split(",")[0] ?? "");
2201
+ this.probe.style.transitionDuration = "";
2202
+ return computed ?? fallback;
2203
+ }
2204
+ color(name) {
2205
+ const raw = this.raw(name);
2206
+ return parseComputedColor(raw) ?? resolveThemeColor(`var(${name})`, this.scope);
2207
+ }
2208
+ shadow(name) {
2209
+ const raw = this.raw(name);
2210
+ if (raw === "" || raw === "none") return null;
2211
+ this.probe.style.boxShadow = `var(${name})`;
2212
+ const computed = getComputedStyle(this.probe).boxShadow.trim() || raw;
2213
+ this.probe.style.boxShadow = "";
2214
+ const colorMatch = /(rgba?\([^)]*\)|#[0-9a-f]{3,8}|oklch\([^)]*\))/i.exec(computed);
2215
+ const lengths = computed.replace(colorMatch?.[0] ?? "", "").trim().split(/\s+/).map((t) => PLAIN_LENGTH.exec(t)).filter((m) => m !== null).map((m) => Number(m[1]));
2216
+ if (lengths.length < 2) return null;
2217
+ const color = colorMatch ? parseComputedColor(colorMatch[0]) : null;
2218
+ return { offsetX: lengths[0], offsetY: lengths[1], blur: lengths[2] ?? 0, color: color ? colorCss(color) : "rgba(0, 0, 0, 0.25)" };
2219
+ }
2220
+ family(name, fallback) {
2221
+ return this.raw(name) || fallback;
2222
+ }
2054
2223
  };
2055
- var DEFAULT_BACKGROUND_3D = "#1a1a2e";
2224
+ function dashList(raw, fallback) {
2225
+ if (raw === "") return fallback;
2226
+ const parts = raw.split(/[\s,]+/).map(Number);
2227
+ return parts.every((n) => Number.isFinite(n) && n >= 0) ? parts : fallback;
2228
+ }
2229
+ function prefersReducedMotion(scope) {
2230
+ const view = scope.ownerDocument.defaultView;
2231
+ return typeof view?.matchMedia === "function" && view.matchMedia("(prefers-reduced-motion: reduce)").matches;
2232
+ }
2233
+ function resolveCanvasTheme(scope) {
2234
+ const r = new ScopeReader(scope);
2235
+ try {
2236
+ const tones = {};
2237
+ for (const tone of core.DIAGRAM_TONES) {
2238
+ const c = r.color(toneVar(tone));
2239
+ tones[tone] = c ? colorCss(c) : "currentColor";
2240
+ }
2241
+ const ground = r.color("--surface-diagram");
2242
+ const text = {};
2243
+ const TEXT_FALLBACK = { xs: 12, sm: 14, base: 16, lg: 18, xl: 20, "2xl": 24 };
2244
+ for (const size of core.DIAGRAM_TEXT_SIZES) text[size] = r.length(`--text-${size}`, TEXT_FALLBACK[size]);
2245
+ const body = r.family("--font-family-body", r.family("--font-family", "system-ui, sans-serif"));
2246
+ return {
2247
+ ground: ground ? colorCss(ground) : "transparent",
2248
+ tones,
2249
+ series: SERIES_TONES.map((t) => tones[t]),
2250
+ strokes: {
2251
+ thin: r.length("--diagram-stroke-thin", 1),
2252
+ normal: r.length("--diagram-stroke-normal", 1.5),
2253
+ bold: r.length("--diagram-stroke-bold", 3)
2254
+ },
2255
+ lineCap: oneOf(r.raw("--diagram-line-cap"), ["butt", "round", "square"], "round", "--diagram-line-cap"),
2256
+ lineJoin: oneOf(r.raw("--diagram-line-join"), ["miter", "round", "bevel"], "round", "--diagram-line-join"),
2257
+ dash: dashList(r.raw("--diagram-dash"), [6, 4]),
2258
+ dot: dashList(r.raw("--diagram-dot"), [1, 4]),
2259
+ fillStyle: oneOf(r.raw("--diagram-fill-style"), ["solid", "tint", "outline", "hatch"], "tint", "--diagram-fill-style"),
2260
+ fillOpacity: r.number("--diagram-fill-opacity", 0.18),
2261
+ roughness: r.number("--diagram-roughness", 0),
2262
+ glow: r.number("--diagram-glow", 0),
2263
+ shadow: r.shadow("--diagram-shadow"),
2264
+ marker: oneOf(r.raw("--diagram-marker"), ["triangle", "open", "line", "dot"], "triangle", "--diagram-marker"),
2265
+ faces: {
2266
+ body,
2267
+ display: r.family("--font-family-display", body),
2268
+ mono: r.family("--font-family-mono", "ui-monospace, monospace")
2269
+ },
2270
+ label: {
2271
+ font: oneOf(r.raw("--diagram-label-font"), ["body", "display", "mono"], "body", "--diagram-label-font"),
2272
+ size: oneOf(r.raw("--diagram-label-size"), core.DIAGRAM_TEXT_SIZES, "sm", "--diagram-label-size"),
2273
+ weight: r.raw("--diagram-label-weight") || "500",
2274
+ uppercase: oneOf(r.raw("--diagram-label-case"), ["none", "uppercase"], "none", "--diagram-label-case") === "uppercase"
2275
+ },
2276
+ text,
2277
+ corner: r.length("--diagram-corner", 4),
2278
+ motion: {
2279
+ enabled: r.raw("--motion-enable") !== "off" && !prefersReducedMotion(scope),
2280
+ fastMs: r.durationMs("--duration-fast", 150),
2281
+ normalMs: r.durationMs("--duration-normal", 250),
2282
+ slowMs: r.durationMs("--duration-slow", 400),
2283
+ easing: r.raw("--easing-standard") || "ease"
2284
+ },
2285
+ scene: {
2286
+ roughness: r.number("--material-roughness", 0.6),
2287
+ metalness: r.number("--material-metalness", 0),
2288
+ flat: r.number("--material-flat", 0) >= 1,
2289
+ outline: r.number("--material-outline", 0),
2290
+ ambient: r.number("--light-ambient", 0.55),
2291
+ key: r.number("--light-key", 1),
2292
+ keyColor: (() => {
2293
+ const c = r.color("--light-key-color");
2294
+ return c ? colorCss(c) : "#ffffff";
2295
+ })(),
2296
+ fog: r.number("--scene-fog", 0)
2297
+ }
2298
+ };
2299
+ } finally {
2300
+ r.dispose();
2301
+ }
2302
+ }
2303
+ function withSeries(theme, series, scope) {
2304
+ if (!theme || !series || series.length === 0 || !scope) return theme;
2305
+ const colors = series.map((c, i) => markColor(theme, c, scope, SERIES_TONES[i % SERIES_TONES.length]));
2306
+ const tones = { ...theme.tones };
2307
+ SERIES_TONES.forEach((tone, i) => {
2308
+ tones[tone] = colors[i % colors.length];
2309
+ });
2310
+ return { ...theme, tones, series: SERIES_TONES.map((t) => tones[t]) };
2311
+ }
2312
+ function markColor(theme, value, scope, fallback) {
2313
+ if (value === void 0 || value === "") return theme.tones[fallback];
2314
+ if (isDiagramTone(value)) return theme.tones[value];
2315
+ if (value.startsWith("var(") || value.startsWith("color-mix(")) {
2316
+ const resolved = resolveThemeColor(value, scope);
2317
+ return resolved ? colorCss(resolved) : theme.tones[fallback];
2318
+ }
2319
+ return value;
2320
+ }
2321
+
2322
+ // hooks/useCanvasTheme.ts
2323
+ function useCanvasTheme(scopeRef) {
2324
+ const { appliedTheme } = context.useTheme();
2325
+ const scopeKey = JSON.stringify(context.useThemeScope());
2326
+ const [state, setState] = React3.useState({ theme: null, version: 0 });
2327
+ React3.useLayoutEffect(() => {
2328
+ const scope = scopeRef.current;
2329
+ if (!scope) return;
2330
+ const theme = resolveCanvasTheme(scope);
2331
+ setState((prev) => ({ theme, version: prev.version + 1 }));
2332
+ }, [appliedTheme, scopeKey, scopeRef]);
2333
+ return state;
2334
+ }
2335
+
2336
+ // lib/drawable/themeDrawables.ts
2337
+ function opt(value, resolve) {
2338
+ return value === void 0 ? void 0 : resolve(value);
2339
+ }
2340
+ function themeShape(node, resolve) {
2341
+ return {
2342
+ ...node,
2343
+ ...node.fill !== void 0 ? { fill: resolve(node.fill) } : {},
2344
+ ...node.stroke !== void 0 ? { stroke: resolve(node.stroke) } : {},
2345
+ ...node.gradient ? { gradient: { ...node.gradient, stops: node.gradient.stops.map((s) => ({ ...s, color: resolve(s.color) })) } } : {},
2346
+ ...node.fillPattern?.color !== void 0 ? { fillPattern: { ...node.fillPattern, color: resolve(node.fillPattern.color) } } : {},
2347
+ ...node.shadow ? { shadow: { ...node.shadow, color: resolve(node.shadow.color) } } : {},
2348
+ ...node.animation ? {
2349
+ animation: {
2350
+ ...node.animation,
2351
+ keyframes: node.animation.keyframes.map((k) => ({
2352
+ ...k,
2353
+ ...k.fill !== void 0 ? { fill: resolve(k.fill) } : {},
2354
+ ...k.stroke !== void 0 ? { stroke: resolve(k.stroke) } : {}
2355
+ }))
2356
+ }
2357
+ } : {}
2358
+ };
2359
+ }
2360
+ function themeText(node, resolve) {
2361
+ return { ...node, color: resolve(node.color) };
2362
+ }
2363
+ function themeMaterial(material, resolve) {
2364
+ if (!material) return material;
2365
+ return {
2366
+ ...material,
2367
+ ...material.color !== void 0 ? { color: resolve(material.color) } : {},
2368
+ ...material.emissive !== void 0 ? { emissive: resolve(material.emissive) } : {}
2369
+ };
2370
+ }
2371
+ function resolveDrawableColors(nodes, resolve) {
2372
+ return nodes.map((node) => {
2373
+ switch (node.type) {
2374
+ case "draw-shape":
2375
+ return themeShape(node, resolve);
2376
+ case "draw-text":
2377
+ return themeText(node, resolve);
2378
+ case "draw-group":
2379
+ return { ...node, items: resolveDrawableColors(node.items, resolve) };
2380
+ case "draw-shape-layer":
2381
+ return { ...node, items: node.items.map((item) => themeShape(item, resolve)) };
2382
+ case "draw-text-layer":
2383
+ return { ...node, items: node.items.map((item) => themeText(item, resolve)) };
2384
+ case "draw-fx-layer":
2385
+ return {
2386
+ ...node,
2387
+ ...node.textColor !== void 0 ? { textColor: resolve(node.textColor) } : {},
2388
+ ...node.presets ? {
2389
+ presets: node.presets.map((p) => ({
2390
+ ...p,
2391
+ ...p.color !== void 0 ? { color: resolve(p.color) } : {},
2392
+ ...p.color2 !== void 0 ? { color2: resolve(p.color2) } : {}
2393
+ }))
2394
+ } : {}
2395
+ };
2396
+ case "draw-mesh":
2397
+ return {
2398
+ ...node,
2399
+ material: themeMaterial(node.material, resolve),
2400
+ ...node.outline ? { outline: { ...node.outline, ...node.outline.color !== void 0 ? { color: resolve(node.outline.color) } : {} } } : {},
2401
+ ...node.animation ? {
2402
+ animation: {
2403
+ ...node.animation,
2404
+ keyframes: node.animation.keyframes.map((k) => ({
2405
+ ...k,
2406
+ ...k.color !== void 0 ? { color: resolve(k.color) } : {},
2407
+ ...k.emissive !== void 0 ? { emissive: opt(k.emissive, resolve) } : {}
2408
+ }))
2409
+ }
2410
+ } : {}
2411
+ };
2412
+ default:
2413
+ return node;
2414
+ }
2415
+ });
2416
+ }
2417
+ function applySceneMaterials(nodes, theme) {
2418
+ return nodes.map((node) => {
2419
+ if (node.type === "draw-group") return { ...node, items: applySceneMaterials(node.items, theme) };
2420
+ if (node.type !== "draw-mesh") return node;
2421
+ const m = node.material ?? {};
2422
+ const pbr = (m.kind ?? "standard") === "standard" || m.kind === "physical";
2423
+ return {
2424
+ ...node,
2425
+ material: {
2426
+ ...m,
2427
+ ...pbr && m.roughness === void 0 ? { roughness: theme.scene.roughness } : {},
2428
+ ...pbr && m.metalness === void 0 ? { metalness: theme.scene.metalness } : {},
2429
+ ...m.flatShading === void 0 && theme.scene.flat ? { flatShading: true } : {}
2430
+ },
2431
+ ...node.outline === void 0 && theme.scene.outline > 0 ? { outline: { color: theme.tones.ink, width: theme.scene.outline * 0.02 } } : {}
2432
+ };
2433
+ });
2434
+ }
2056
2435
 
2057
2436
  // lib/theme-scale.ts
2058
2437
  var THEME_SCALE_KEYS = {
@@ -2087,7 +2466,6 @@ function cn(...inputs) {
2087
2466
  }
2088
2467
  var DEFAULT_GRID_CONFIG = {
2089
2468
  cellSize: 1};
2090
- var EDIT_SELECTION_COLOR = "#3b82f6";
2091
2469
  var EDIT_SELECTION_RADIUS = 0.6;
2092
2470
  function CameraPose({
2093
2471
  position,
@@ -2128,7 +2506,8 @@ var Canvas3DHost = React3.forwardRef(
2128
2506
  orientation = "standard",
2129
2507
  overlay = "default",
2130
2508
  shadows = true,
2131
- backgroundColor = DEFAULT_BACKGROUND_3D,
2509
+ backgroundColor,
2510
+ series,
2132
2511
  className,
2133
2512
  isLoading: externalLoading,
2134
2513
  error: externalError,
@@ -2167,7 +2546,18 @@ var Canvas3DHost = React3.forwardRef(
2167
2546
  const { t } = hooks.useTranslate();
2168
2547
  const loadingMessage = loadingMessageProp ?? t("canvas3d.loadingScene");
2169
2548
  const keysRef = React3.useRef(/* @__PURE__ */ new Set());
2170
- const allDrawables = React3.useMemo(() => drawables ?? [], [drawables]);
2549
+ const { theme: baseCanvasTheme } = useCanvasTheme(containerRef);
2550
+ const seriesKey = series ? series.join("|") : "";
2551
+ const canvasTheme = React3.useMemo(() => withSeries(baseCanvasTheme, series, containerRef.current), [baseCanvasTheme, seriesKey]);
2552
+ const allDrawables = React3.useMemo(() => {
2553
+ const raw = drawables ?? [];
2554
+ const scope = containerRef.current;
2555
+ if (!canvasTheme || !scope) return raw;
2556
+ const resolved = resolveDrawableColors(raw, (c) => markColor(canvasTheme, c, scope, "ink"));
2557
+ return applySceneMaterials(resolved, canvasTheme);
2558
+ }, [drawables, canvasTheme]);
2559
+ const ground = backgroundColor ?? canvasTheme?.ground ?? "transparent";
2560
+ const selectionColor = canvasTheme?.tones.highlight ?? "currentColor";
2171
2561
  React3.useEffect(() => {
2172
2562
  if (!keyMap && !keyUpMap) return;
2173
2563
  const down = (e) => {
@@ -2464,7 +2854,7 @@ var Canvas3DHost = React3.forwardRef(
2464
2854
  near: 0.1,
2465
2855
  far: 1e3
2466
2856
  },
2467
- style: { background: backgroundColor, position: "absolute", inset: 0 },
2857
+ style: { background: ground, position: "absolute", inset: 0 },
2468
2858
  onClick: (e) => {
2469
2859
  if (e.target === e.currentTarget) {
2470
2860
  eventHandlers.handleCanvasClick(e);
@@ -2484,10 +2874,10 @@ var Canvas3DHost = React3.forwardRef(
2484
2874
  shadowCameraSize: 5,
2485
2875
  shadowCameraNear: 0.5,
2486
2876
  shadowCameraFar: 500,
2487
- ambientIntensity: lighting?.ambient?.intensity,
2877
+ ambientIntensity: lighting?.ambient?.intensity ?? canvasTheme?.scene.ambient,
2488
2878
  ambientColor: lighting?.ambient?.color,
2489
- directionalIntensity: lighting?.directional?.intensity,
2490
- directionalColor: lighting?.directional?.color,
2879
+ directionalIntensity: lighting?.directional?.intensity ?? canvasTheme?.scene.key,
2880
+ directionalColor: lighting?.directional?.color ?? canvasTheme?.scene.keyColor,
2491
2881
  directionalPosition: lighting?.directional?.position,
2492
2882
  hemisphereIntensity: lighting?.hemisphere?.intensity,
2493
2883
  hemisphereColor: lighting?.hemisphere?.color,
@@ -2510,10 +2900,10 @@ var Canvas3DHost = React3.forwardRef(
2510
2900
  ],
2511
2901
  cellSize: 1,
2512
2902
  cellThickness: 1,
2513
- cellColor: GRID_COLORS_3D.cell,
2903
+ cellColor: canvasTheme?.tones.grid ?? "currentColor",
2514
2904
  sectionSize: 5,
2515
2905
  sectionThickness: 1.5,
2516
- sectionColor: GRID_COLORS_3D.section,
2906
+ sectionColor: canvasTheme?.tones.axis ?? "currentColor",
2517
2907
  fadeDistance: 50,
2518
2908
  fadeStrength: 1
2519
2909
  }
@@ -2534,7 +2924,7 @@ var Canvas3DHost = React3.forwardRef(
2534
2924
  shape: "ellipse",
2535
2925
  position: selectionPos,
2536
2926
  radiusX: EDIT_SELECTION_RADIUS,
2537
- stroke: EDIT_SELECTION_COLOR
2927
+ stroke: selectionColor
2538
2928
  },
2539
2929
  projector: drawableProjector
2540
2930
  }
@@ -4126,6 +4516,7 @@ var en_default = {
4126
4516
  "status.draft": "Draft",
4127
4517
  "status.archived": "Archived",
4128
4518
  "error.generic": "Something went wrong",
4519
+ "error.traitMountFailed": "{{trait}} failed to start",
4129
4520
  "error.retry": "Try again",
4130
4521
  "error.notFound": "Not found",
4131
4522
  "error.loadFailed": "Failed to load: {{message}}",
@@ -4254,6 +4645,7 @@ var en_default = {
4254
4645
  "template.ourTeam": "Our Team",
4255
4646
  "template.caseStudies": "Case Studies",
4256
4647
  "versionDiff.compare": "Compare",
4648
+ "versionDiff.changes": "Changes",
4257
4649
  "versionDiff.to": "to",
4258
4650
  "versionDiff.beforeRevision": "Before revision",
4259
4651
  "versionDiff.afterRevision": "After revision",
@@ -4980,6 +5372,7 @@ var en_default = {
4980
5372
  "gridPicker.moreRefine": "+{{count}} more \u2014 refine your search",
4981
5373
  "graphCanvas.noNodes": "No nodes to display.",
4982
5374
  "codeBlock.noCode": "No code to display.",
5375
+ "codeBlock.region": "Code",
4983
5376
  "fab.action": "Action",
4984
5377
  "fab.closeActions": "Close actions",
4985
5378
  "fab.openActions": "Open actions",
@@ -5296,7 +5689,14 @@ var en_default = {
5296
5689
  "agentActivity.earlierConversations": "Earlier conversations ({{count}})",
5297
5690
  "agentActivity.earlierActivity": "Earlier activity",
5298
5691
  "tabs.scrollStart": "Scroll tabs back",
5299
- "tabs.scrollEnd": "Scroll tabs forward"
5692
+ "tabs.scrollEnd": "Scroll tabs forward",
5693
+ "agentChat.workedThrough": "Worked through {{count}} steps",
5694
+ "agentChat.newMessages": "New messages",
5695
+ "agentChat.copy": "Copy reply",
5696
+ "agentChat.copied": "Copied",
5697
+ "agentChat.today": "Today",
5698
+ "agentChat.yesterday": "Yesterday",
5699
+ "agentChat.emptyDescription": "Ask in your own words \u2014 the assistant can look things up and make changes for you."
5300
5700
  };
5301
5701
 
5302
5702
  // lib/format.ts
@@ -5588,30 +5988,40 @@ function instanceOf(orbital, orbitalId, ref) {
5588
5988
  if (typeof ref === "object" && ref._resolved) return { ...at, name: ref.name ?? ref._resolved.name, trait: ref._resolved };
5589
5989
  return null;
5590
5990
  }
5991
+ var wiresBySchema = /* @__PURE__ */ new WeakMap();
5591
5992
  function traitEventWires(schema) {
5993
+ const cached = wiresBySchema.get(schema);
5994
+ if (cached) return cached;
5592
5995
  const instances = (schema.orbitals ?? []).flatMap(
5593
5996
  (o) => (o.traits ?? []).map((ref) => instanceOf(o.name, o.id, ref)).filter((i) => i !== null)
5594
5997
  );
5998
+ const listensByEvent = /* @__PURE__ */ new Map();
5999
+ for (const listener of instances) {
6000
+ for (const listen of listener.trait.listens ?? []) {
6001
+ const { bareEvent, matcher } = runtime.parseListenSource(listen, listener.orbital);
6002
+ const bucket = listensByEvent.get(bareEvent);
6003
+ if (bucket) bucket.push({ listener, matcher });
6004
+ else listensByEvent.set(bareEvent, [{ listener, matcher }]);
6005
+ }
6006
+ }
5595
6007
  const wires = [];
5596
6008
  for (const emitter of instances) {
6009
+ const source = { orbital: emitter.orbital, trait: emitter.name, ...emitter.orbitalId ? { orbitalId: emitter.orbitalId } : {}, ...emitter.trait.id ? { traitId: emitter.trait.id } : {} };
5597
6010
  for (const emit of emitter.trait.emits ?? []) {
5598
- for (const listener of instances) {
6011
+ for (const { listener, matcher } of listensByEvent.get(emit.event) ?? []) {
5599
6012
  if (listener.orbital === emitter.orbital && listener.name === emitter.name) continue;
5600
- for (const listen of listener.trait.listens ?? []) {
5601
- const { bareEvent, matcher } = runtime.parseListenSource(listen, listener.orbital);
5602
- const source = { orbital: emitter.orbital, trait: emitter.name, ...emitter.orbitalId ? { orbitalId: emitter.orbitalId } : {}, ...emitter.trait.id ? { traitId: emitter.trait.id } : {} };
5603
- if (bareEvent !== emit.event || !matcher(source)) continue;
5604
- wires.push({
5605
- emitterOrbital: emitter.orbital,
5606
- emitterTrait: emitter.name,
5607
- listenerOrbital: listener.orbital,
5608
- listenerTrait: listener.name,
5609
- event: emit.event
5610
- });
5611
- }
6013
+ if (!matcher(source)) continue;
6014
+ wires.push({
6015
+ emitterOrbital: emitter.orbital,
6016
+ emitterTrait: emitter.name,
6017
+ listenerOrbital: listener.orbital,
6018
+ listenerTrait: listener.name,
6019
+ event: emit.event
6020
+ });
5612
6021
  }
5613
6022
  }
5614
6023
  }
6024
+ wiresBySchema.set(schema, wires);
5615
6025
  return wires;
5616
6026
  }
5617
6027
 
@@ -5993,55 +6403,6 @@ function getBreadcrumbs(state) {
5993
6403
  }
5994
6404
  return crumbs;
5995
6405
  }
5996
- var log4 = logger.createLogger("almadar:ui:theme-color");
5997
- function channel(value, unitScale) {
5998
- return Math.round(Math.min(255, Math.max(0, Number(value) * unitScale)));
5999
- }
6000
- function make(r, g, b, a) {
6001
- return { r, g, b, a, css: `rgb(${r}, ${g}, ${b})` };
6002
- }
6003
- function parseComputedColor(value) {
6004
- const v = value.trim();
6005
- const hex = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(v);
6006
- if (hex) {
6007
- const h = hex[1].length === 3 ? hex[1].split("").map((c) => c + c).join("") : hex[1];
6008
- return make(parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16), 1);
6009
- }
6010
- const rgb = /^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)\s*(?:[,/]\s*([\d.]+)\s*)?\)$/i.exec(v);
6011
- if (rgb) {
6012
- return make(channel(rgb[1], 1), channel(rgb[2], 1), channel(rgb[3], 1), rgb[4] === void 0 ? 1 : Number(rgb[4]));
6013
- }
6014
- const srgb = /^color\(srgb\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)\s*(?:\/\s*([\d.]+)\s*)?\)$/i.exec(v);
6015
- if (srgb) {
6016
- return make(channel(srgb[1], 255), channel(srgb[2], 255), channel(srgb[3], 255), srgb[4] === void 0 ? 1 : Number(srgb[4]));
6017
- }
6018
- return null;
6019
- }
6020
- var SENTINEL = "rgb(1, 2, 3)";
6021
- function getComputedSentinel(doc) {
6022
- const s = doc.createElement("span");
6023
- s.style.display = "none";
6024
- s.style.color = SENTINEL;
6025
- doc.body.appendChild(s);
6026
- const c = getComputedStyle(s).color;
6027
- doc.body.removeChild(s);
6028
- return c;
6029
- }
6030
- function resolveThemeColor(value, scope) {
6031
- const doc = scope.ownerDocument;
6032
- const wrapper = doc.createElement("span");
6033
- wrapper.style.display = "none";
6034
- wrapper.style.color = SENTINEL;
6035
- const probe = doc.createElement("span");
6036
- probe.style.color = value;
6037
- wrapper.appendChild(probe);
6038
- scope.appendChild(wrapper);
6039
- const computed = probe.style.color === "" ? "" : getComputedStyle(probe).color;
6040
- scope.removeChild(wrapper);
6041
- const parsed = computed === getComputedSentinel(doc) ? null : parseComputedColor(computed);
6042
- if (!parsed) log4.error("unresolvable-theme-color", { value, computed });
6043
- return parsed;
6044
- }
6045
6406
 
6046
6407
  // lib/avl-theme.ts
6047
6408
  function avlTint(token, percent) {
@@ -6170,6 +6531,7 @@ var OPERATOR_CATEGORY_COLORS = {
6170
6531
  "std-json": avlBlend("var(--color-success)", 60, "var(--color-foreground)"),
6171
6532
  "std-time": avlBlend("var(--color-info)", 50, "var(--color-success)"),
6172
6533
  "std-format": avlBlend("var(--color-success)", 60, "var(--color-background)"),
6534
+ "std-i18n": avlBlend("var(--color-info)", 60, "var(--color-background)"),
6173
6535
  "std-async": avlBlend("var(--color-accent)", 50, "var(--color-error)"),
6174
6536
  "std-nn": avlBlend("var(--color-primary)", 60, "var(--color-accent)"),
6175
6537
  "std-tensor": avlBlend("var(--color-primary)", 60, "var(--color-info)"),
@@ -7976,7 +8338,7 @@ function useThemeColors(values, scopeRef) {
7976
8338
  }, [appliedTheme, scopeKey, valuesKey, scopeRef]);
7977
8339
  return resolved;
7978
8340
  }
7979
- var log5 = logger.createLogger("almadar:ui:avl-3d-viewer");
8341
+ var log6 = logger.createLogger("almadar:ui:avl-3d-viewer");
7980
8342
  function CameraController({ targetPosition, targetLookAt, animated }) {
7981
8343
  const { camera } = fiber.useThree();
7982
8344
  const targetPosVec = React3.useRef(new THREE5__namespace.Vector3(...targetPosition));
@@ -8044,7 +8406,7 @@ var Avl3DViewer = ({
8044
8406
  for (const key of Object.keys(AVL_3D_COLORS)) {
8045
8407
  const resolved = resolvedColors[key];
8046
8408
  if (!resolved) {
8047
- log5.error("avl-3d-palette-key-unresolved", { key, value: AVL_3D_COLORS[key] });
8409
+ log6.error("avl-3d-palette-key-unresolved", { key, value: AVL_3D_COLORS[key] });
8048
8410
  return null;
8049
8411
  }
8050
8412
  out[key] = resolved.css;