@almadar/ui 6.54.0 → 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 (113) 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-QUEG6WFM.js → UISlotRenderer-QTHFT6Z4.js} +6 -6
  5. package/dist/avl/index.cjs +3385 -1883
  6. package/dist/avl/index.js +45 -737
  7. package/dist/{chunk-ERXIHZW3.js → chunk-D2E44ODB.js} +29 -15
  8. package/dist/{chunk-FJDS4SVD.js → chunk-F4ZTPKZL.js} +3 -3
  9. package/dist/{chunk-U3CGKPOK.js → chunk-FQM37C56.js} +136 -107
  10. package/dist/{chunk-4UP6BZ4R.js → chunk-HCSJHRC4.js} +1 -1
  11. package/dist/{chunk-N2V4LHFQ.js → chunk-HRCR53OW.js} +10 -1
  12. package/dist/{chunk-O7OLVVBR.js → chunk-Q47ZN2DW.js} +24 -22
  13. package/dist/{chunk-4HC5HRHB.js → chunk-QGH4NAQO.js} +2 -2
  14. package/dist/{chunk-MCKFWPT2.js → chunk-RNY5LJXJ.js} +1 -1
  15. package/dist/{chunk-Z7JWXIRE.js → chunk-SGJHVPHC.js} +2 -2
  16. package/dist/{chunk-6O37FCX4.js → chunk-V3FGTQUE.js} +37 -2
  17. package/dist/{chunk-U2FGMHQP.js → chunk-XZKGRSIO.js} +3334 -1796
  18. package/dist/{chunk-Z5IYJU44.js → chunk-Y53Q55H5.js} +521 -24
  19. package/dist/components/index.cjs +5194 -3008
  20. package/dist/components/index.d.ts +117 -52
  21. package/dist/components/index.js +12 -12
  22. package/dist/context/index.cjs +36 -1
  23. package/dist/context/index.d.ts +1 -1
  24. package/dist/context/index.js +1 -1
  25. package/dist/design-classes/index.cjs +29 -15
  26. package/dist/design-classes/index.d.cts +1 -0
  27. package/dist/design-classes/index.d.ts +1 -0
  28. package/dist/design-classes/index.js +29 -15
  29. package/dist/hooks/index.cjs +10 -1
  30. package/dist/hooks/index.js +3 -3
  31. package/dist/lib/drawable/three/index.cjs +442 -82
  32. package/dist/lib/drawable/three/index.d.ts +2 -2
  33. package/dist/lib/drawable/three/index.js +28 -24
  34. package/dist/lib/index.cjs +52 -3
  35. package/dist/lib/index.d.ts +1 -1
  36. package/dist/lib/index.js +4 -4
  37. package/dist/locales/index.cjs +30 -3
  38. package/dist/locales/index.js +21 -3
  39. package/dist/providers/index.cjs +5330 -3091
  40. package/dist/providers/index.d.ts +1 -1
  41. package/dist/providers/index.js +12 -9
  42. package/dist/runtime/index.cjs +5400 -3182
  43. package/dist/runtime/index.d.ts +7 -3
  44. package/dist/runtime/index.js +8 -8
  45. package/dist/ssr/index.cjs +24 -8
  46. package/dist/ssr/index.js +24 -8
  47. package/dist/{themeTokens-Ccu7EmGY.d.ts → themeTokens-D6MFwKrC.d.ts} +6 -2
  48. package/locales/ar.json +10 -1
  49. package/locales/en.json +10 -1
  50. package/locales/sl.json +10 -1
  51. package/package.json +6 -6
  52. package/scripts/theme-contrast-audit.mjs +20 -1
  53. package/themes/_base.css +61 -0
  54. package/themes/_contract.md +37 -0
  55. package/themes/almadar-heritage.css +82 -0
  56. package/themes/almadar-website.css +82 -0
  57. package/themes/almadar.css +82 -0
  58. package/themes/aqua.css +82 -0
  59. package/themes/arabesque.css +82 -0
  60. package/themes/art-deco.css +82 -0
  61. package/themes/art-nouveau.css +82 -0
  62. package/themes/atelier.css +82 -0
  63. package/themes/bauhaus.css +82 -0
  64. package/themes/bloomberg-dense.css +83 -1
  65. package/themes/blueprint.css +84 -0
  66. package/themes/clay.css +82 -0
  67. package/themes/comic.css +82 -0
  68. package/themes/constructivist.css +82 -0
  69. package/themes/corporate.css +82 -0
  70. package/themes/cyberpunk.css +82 -0
  71. package/themes/frutiger-aero.css +83 -0
  72. package/themes/game-adventure.css +15 -0
  73. package/themes/game-rpg.css +16 -0
  74. package/themes/game-sci-fi.css +15 -0
  75. package/themes/game-ui-pack.css +15 -0
  76. package/themes/gazette.css +82 -0
  77. package/themes/glass.css +82 -0
  78. package/themes/gothic.css +82 -0
  79. package/themes/ink-wash.css +82 -0
  80. package/themes/kawaii.css +82 -0
  81. package/themes/kiosk.css +82 -0
  82. package/themes/linear-clean.css +82 -0
  83. package/themes/luxury.css +82 -0
  84. package/themes/mac-classic.css +90 -8
  85. package/themes/material.css +82 -0
  86. package/themes/memphis.css +82 -0
  87. package/themes/mid-century.css +82 -0
  88. package/themes/minimalist.css +82 -0
  89. package/themes/mudcloth.css +82 -0
  90. package/themes/neon.css +83 -0
  91. package/themes/neumorphic.css +82 -0
  92. package/themes/newsprint.css +82 -0
  93. package/themes/notion-editorial.css +82 -0
  94. package/themes/orb.css +82 -0
  95. package/themes/pixel.css +82 -0
  96. package/themes/prism.css +82 -0
  97. package/themes/retro.css +83 -0
  98. package/themes/risograph.css +82 -0
  99. package/themes/scandi.css +82 -0
  100. package/themes/sketch.css +82 -0
  101. package/themes/solarpunk.css +82 -0
  102. package/themes/steampunk.css +82 -0
  103. package/themes/swiss.css +82 -0
  104. package/themes/terminal.css +84 -1
  105. package/themes/trait-wars.css +82 -0
  106. package/themes/ukiyo-e.css +82 -0
  107. package/themes/vaporwave.css +82 -0
  108. package/themes/victorian.css +82 -0
  109. package/themes/wabi-sabi.css +82 -0
  110. package/themes/win95.css +84 -0
  111. package/themes/wireframe.css +82 -0
  112. package/themes/zine.css +82 -0
  113. package/dist/Typography-CFI7JUVE.js +0 -5
@@ -2,8 +2,8 @@ import { EventPayload, OrbitalDefinition, ServiceParams, TraitConfig, UserContex
2
2
  export { ResolvedEntity, ResolvedIR, ResolvedPage, ResolvedTrait, ResolvedTraitBinding } from '@almadar/core';
3
3
  import { TraitState, EventTransport, PersistenceAdapter, AccessTokenProvider, SchemaLoader } from '@almadar/runtime';
4
4
  export { AccessTokenProvider, ClientEventBus, CreateClientEffectHandlersOptions, SlotSetter, createClientEffectHandlers } from '@almadar/runtime';
5
- import { E as EntityBindingSource, A as AwaitingSkeletonSource, S as ServerBridgeTransport } from '../AwaitingSkeletonContext-Bh399p1x.js';
6
- export { a as EntitySchemaContextValue, b as EntitySchemaProvider, c as EntitySchemaProviderProps, d as ServerBridgeContextValue, e as ServerBridgeProvider, T as TraitContext, f as TraitContextValue, g as TraitInstance, h as TraitProvider, i as TraitProviderProps, u as useEntitySchema, j as useEntitySchemaOptional, k as useServerBridge, l as useTrait, m as useTraitContext } from '../AwaitingSkeletonContext-Bh399p1x.js';
5
+ import { E as EntityBindingSource, A as AwaitingSkeletonSource, S as ServerBridgeTransport } from '../AwaitingSkeletonContext-DPgW__WV.js';
6
+ export { a as EntitySchemaContextValue, b as EntitySchemaProvider, c as EntitySchemaProviderProps, d as ServerBridgeContextValue, e as ServerBridgeProvider, T as TraitContext, f as TraitContextValue, g as TraitInstance, h as TraitProvider, i as TraitProviderProps, u as useEntitySchema, j as useEntitySchemaOptional, k as useServerBridge, l as useTrait, m as useTraitContext } from '../AwaitingSkeletonContext-DPgW__WV.js';
7
7
  import { c as useUISlots } from '../UISlotContext-CS487Uoc.js';
8
8
  export { PERF_NAMESPACE, PerfEntry, PreparedPreviewSchema, adjustSchemaForMockData, buildMockData, clearPerf, perfEnd, perfStart, perfTime, prepareSchemaForPreview, wrapCallbackForEvent } from '@almadar/runtime/ui';
9
9
  import React__default, { ReactNode } from 'react';
@@ -308,8 +308,12 @@ interface BrowserPlaygroundProps {
308
308
  messages?: MessageCatalogs;
309
309
  /** The viewer's locale. Default: the schema's first declared locale. */
310
310
  locale?: string;
311
+ /** Loads each `lazyPages` behavior (`uses lazy`): the in-browser runtime runs them with the program, as a server does. */
312
+ lazyLoader?: SchemaLoader;
313
+ /** Where `schema` was loaded from — a lazy page's `orbRef` resolves against it. */
314
+ schemaPath?: string;
311
315
  }
312
- declare function BrowserPlayground({ schema, mode, initialPagePath, height, className, paused, fit, onPageChange, viewer, messages, locale, }: BrowserPlaygroundProps): React__default.ReactElement;
316
+ declare function BrowserPlayground({ schema, mode, initialPagePath, height, className, paused, fit, onPageChange, viewer, messages, locale, lazyLoader, schemaPath, }: BrowserPlaygroundProps): React__default.ReactElement;
313
317
 
314
318
  /**
315
319
  * OrbitalPluginHost — runs an ordinary behavior headless against the
@@ -1,18 +1,18 @@
1
- export { BrowserPlayground, OrbPreview, adjustSchemaForMockData, buildMockData, clearSchemaCache, prepareSchemaForPreview, useResolvedSchema, useTraitStateMachine } from '../chunk-U3CGKPOK.js';
1
+ export { BrowserPlayground, OrbPreview, adjustSchemaForMockData, buildMockData, clearSchemaCache, prepareSchemaForPreview, useResolvedSchema, useTraitStateMachine } from '../chunk-FQM37C56.js';
2
2
  export { assertUniqueSlotsPerHost } from '../chunk-O2EIWXWE.js';
3
- import '../chunk-4HC5HRHB.js';
3
+ import '../chunk-QGH4NAQO.js';
4
4
  import '../chunk-VHTJRS2N.js';
5
- export { wrapCallbackForEvent } from '../chunk-U2FGMHQP.js';
6
- import '../chunk-Z5IYJU44.js';
7
- import '../chunk-4UP6BZ4R.js';
5
+ export { wrapCallbackForEvent } from '../chunk-XZKGRSIO.js';
6
+ import '../chunk-Y53Q55H5.js';
7
+ import '../chunk-HCSJHRC4.js';
8
8
  import '../chunk-JRW33U35.js';
9
9
  import '../chunk-XJTHMW4G.js';
10
10
  import { useEventBus } from '../chunk-6EV3OEBQ.js';
11
11
  export { PERF_NAMESPACE, clearPerf, perfEnd, perfStart, perfTime, profilerOnRender, usePerfBuffer } from '../chunk-KQXXO42S.js';
12
- import '../chunk-O7OLVVBR.js';
12
+ import '../chunk-Q47ZN2DW.js';
13
13
  import '../chunk-64WACXM7.js';
14
- import '../chunk-MCKFWPT2.js';
15
- import '../chunk-N2V4LHFQ.js';
14
+ import '../chunk-RNY5LJXJ.js';
15
+ import '../chunk-HRCR53OW.js';
16
16
  import '../chunk-PQKU62LK.js';
17
17
  import '../chunk-PEST66PN.js';
18
18
  import '../chunk-QPXIAUJD.js';
@@ -3273,6 +3273,7 @@ var en_default = {
3273
3273
  "template.ourTeam": "Our Team",
3274
3274
  "template.caseStudies": "Case Studies",
3275
3275
  "versionDiff.compare": "Compare",
3276
+ "versionDiff.changes": "Changes",
3276
3277
  "versionDiff.to": "to",
3277
3278
  "versionDiff.beforeRevision": "Before revision",
3278
3279
  "versionDiff.afterRevision": "After revision",
@@ -3999,6 +4000,7 @@ var en_default = {
3999
4000
  "gridPicker.moreRefine": "+{{count}} more \u2014 refine your search",
4000
4001
  "graphCanvas.noNodes": "No nodes to display.",
4001
4002
  "codeBlock.noCode": "No code to display.",
4003
+ "codeBlock.region": "Code",
4002
4004
  "fab.action": "Action",
4003
4005
  "fab.closeActions": "Close actions",
4004
4006
  "fab.openActions": "Open actions",
@@ -4315,7 +4317,14 @@ var en_default = {
4315
4317
  "agentActivity.earlierConversations": "Earlier conversations ({{count}})",
4316
4318
  "agentActivity.earlierActivity": "Earlier activity",
4317
4319
  "tabs.scrollStart": "Scroll tabs back",
4318
- "tabs.scrollEnd": "Scroll tabs forward"
4320
+ "tabs.scrollEnd": "Scroll tabs forward",
4321
+ "agentChat.workedThrough": "Worked through {{count}} steps",
4322
+ "agentChat.newMessages": "New messages",
4323
+ "agentChat.copy": "Copy reply",
4324
+ "agentChat.copied": "Copied",
4325
+ "agentChat.today": "Today",
4326
+ "agentChat.yesterday": "Yesterday",
4327
+ "agentChat.emptyDescription": "Ask in your own words \u2014 the assistant can look things up and make changes for you."
4319
4328
  };
4320
4329
 
4321
4330
  // lib/format.ts
@@ -4597,12 +4606,16 @@ function themeStrokeApplies() {
4597
4606
  return familyStrokeApplies(themeIconFamily());
4598
4607
  }
4599
4608
  function scopedIconFamily(el) {
4600
- for (let node = el; node; node = node.parentElement) {
4601
- const raw = getComputedStyle(node).getPropertyValue("--icon-family").trim().replace(/^["']|["']$/g, "");
4602
- if (raw !== "") return raw;
4603
- }
4604
- return "";
4609
+ const scope = el.closest("[data-theme]");
4610
+ if (!scope || scope === document.documentElement) return null;
4611
+ const known = scopedFamilies.get(scope);
4612
+ if (known && known.version === themeVersion) return known.family;
4613
+ const raw = getComputedStyle(scope).getPropertyValue("--icon-family").trim().replace(/^["']|["']$/g, "");
4614
+ const family = raw === "" ? null : raw;
4615
+ scopedFamilies.set(scope, { version: themeVersion, family });
4616
+ return family;
4605
4617
  }
4618
+ var scopedFamilies = /* @__PURE__ */ new WeakMap();
4606
4619
  var cachedFamily = null;
4607
4620
  var cachedStrokeApplies = null;
4608
4621
  var themeVersion = 0;
@@ -4666,7 +4679,9 @@ function useThemeIconStrokeApplies(ref) {
4666
4679
  const version = React17.useSyncExternalStore(subscribeIconFamily, getThemeVersionSnapshot, () => 0);
4667
4680
  const [scopedApplies, setScopedApplies] = React17.useState(null);
4668
4681
  React17.useLayoutEffect(() => {
4669
- if (ref.current) setScopedApplies(familyStrokeApplies(scopedIconFamily(ref.current)));
4682
+ if (!ref.current) return;
4683
+ const scoped = scopedIconFamily(ref.current);
4684
+ setScopedApplies(scoped === null ? null : familyStrokeApplies(scoped));
4670
4685
  }, [ref, version]);
4671
4686
  return scopedApplies ?? documentApplies;
4672
4687
  }
@@ -5045,7 +5060,8 @@ var variantStyles2 = {
5045
5060
  "active:scale-[var(--active-scale)] active:shadow-elevation-pressed"
5046
5061
  ].join(" "),
5047
5062
  secondary: [
5048
- "bg-transparent text-accent",
5063
+ // The accent is often a signature bright that fails as text on a light page.
5064
+ "bg-transparent text-foreground",
5049
5065
  "border border-accent",
5050
5066
  "hover:bg-accent hover:text-accent-foreground hover:border-accent",
5051
5067
  "active:scale-[var(--active-scale)]"
package/dist/ssr/index.js CHANGED
@@ -3252,6 +3252,7 @@ var en_default = {
3252
3252
  "template.ourTeam": "Our Team",
3253
3253
  "template.caseStudies": "Case Studies",
3254
3254
  "versionDiff.compare": "Compare",
3255
+ "versionDiff.changes": "Changes",
3255
3256
  "versionDiff.to": "to",
3256
3257
  "versionDiff.beforeRevision": "Before revision",
3257
3258
  "versionDiff.afterRevision": "After revision",
@@ -3978,6 +3979,7 @@ var en_default = {
3978
3979
  "gridPicker.moreRefine": "+{{count}} more \u2014 refine your search",
3979
3980
  "graphCanvas.noNodes": "No nodes to display.",
3980
3981
  "codeBlock.noCode": "No code to display.",
3982
+ "codeBlock.region": "Code",
3981
3983
  "fab.action": "Action",
3982
3984
  "fab.closeActions": "Close actions",
3983
3985
  "fab.openActions": "Open actions",
@@ -4294,7 +4296,14 @@ var en_default = {
4294
4296
  "agentActivity.earlierConversations": "Earlier conversations ({{count}})",
4295
4297
  "agentActivity.earlierActivity": "Earlier activity",
4296
4298
  "tabs.scrollStart": "Scroll tabs back",
4297
- "tabs.scrollEnd": "Scroll tabs forward"
4299
+ "tabs.scrollEnd": "Scroll tabs forward",
4300
+ "agentChat.workedThrough": "Worked through {{count}} steps",
4301
+ "agentChat.newMessages": "New messages",
4302
+ "agentChat.copy": "Copy reply",
4303
+ "agentChat.copied": "Copied",
4304
+ "agentChat.today": "Today",
4305
+ "agentChat.yesterday": "Yesterday",
4306
+ "agentChat.emptyDescription": "Ask in your own words \u2014 the assistant can look things up and make changes for you."
4298
4307
  };
4299
4308
 
4300
4309
  // lib/format.ts
@@ -4576,12 +4585,16 @@ function themeStrokeApplies() {
4576
4585
  return familyStrokeApplies(themeIconFamily());
4577
4586
  }
4578
4587
  function scopedIconFamily(el) {
4579
- for (let node = el; node; node = node.parentElement) {
4580
- const raw = getComputedStyle(node).getPropertyValue("--icon-family").trim().replace(/^["']|["']$/g, "");
4581
- if (raw !== "") return raw;
4582
- }
4583
- return "";
4588
+ const scope = el.closest("[data-theme]");
4589
+ if (!scope || scope === document.documentElement) return null;
4590
+ const known = scopedFamilies.get(scope);
4591
+ if (known && known.version === themeVersion) return known.family;
4592
+ const raw = getComputedStyle(scope).getPropertyValue("--icon-family").trim().replace(/^["']|["']$/g, "");
4593
+ const family = raw === "" ? null : raw;
4594
+ scopedFamilies.set(scope, { version: themeVersion, family });
4595
+ return family;
4584
4596
  }
4597
+ var scopedFamilies = /* @__PURE__ */ new WeakMap();
4585
4598
  var cachedFamily = null;
4586
4599
  var cachedStrokeApplies = null;
4587
4600
  var themeVersion = 0;
@@ -4645,7 +4658,9 @@ function useThemeIconStrokeApplies(ref) {
4645
4658
  const version = useSyncExternalStore(subscribeIconFamily, getThemeVersionSnapshot, () => 0);
4646
4659
  const [scopedApplies, setScopedApplies] = useState(null);
4647
4660
  useLayoutEffect(() => {
4648
- if (ref.current) setScopedApplies(familyStrokeApplies(scopedIconFamily(ref.current)));
4661
+ if (!ref.current) return;
4662
+ const scoped = scopedIconFamily(ref.current);
4663
+ setScopedApplies(scoped === null ? null : familyStrokeApplies(scoped));
4649
4664
  }, [ref, version]);
4650
4665
  return scopedApplies ?? documentApplies;
4651
4666
  }
@@ -5024,7 +5039,8 @@ var variantStyles2 = {
5024
5039
  "active:scale-[var(--active-scale)] active:shadow-elevation-pressed"
5025
5040
  ].join(" "),
5026
5041
  secondary: [
5027
- "bg-transparent text-accent",
5042
+ // The accent is often a signature bright that fails as text on a light page.
5043
+ "bg-transparent text-foreground",
5028
5044
  "border border-accent",
5029
5045
  "hover:bg-accent hover:text-accent-foreground hover:border-accent",
5030
5046
  "active:scale-[var(--active-scale)]"
@@ -1,4 +1,4 @@
1
- import { ThemeRef, ThemeDefinition, ThemeTokens, ThemeVariant, DensityTokens, ElevationTokens, GeometryTokens, IconographyTokens, MotionDurationKey, MotionEasingKey, MotionIntentMap, MotionShapeTokens, SurfaceTokens, TypeScaleTokens, TypeIntentMap, TypeSizeKey, EnterAnimation } from '@almadar/core';
1
+ import { ThemeRef, ThemeDefinition, ThemeTokens, ThemeVariant, DensityTokens, DiagramTokens, ElevationTokens, GeometryTokens, IconographyTokens, MotionDurationKey, MotionEasingKey, MotionIntentMap, MotionShapeTokens, SceneTokens, SurfaceTokens, TypeScaleTokens, TypeIntentMap, TypeSizeKey, EnterAnimation } from '@almadar/core';
2
2
 
3
3
  /**
4
4
  * themeTokens — runtime mirror of the orbital compiler's theme codegen.
@@ -81,6 +81,10 @@ declare const ELEVATION_VARS: ReadonlyArray<FlatVarEntry<ElevationTokens>>;
81
81
  declare const GEOMETRY_VARS: ReadonlyArray<FlatVarEntry<GeometryTokens>>;
82
82
  /** Surface axis — panel/page material. */
83
83
  declare const SURFACE_VARS: ReadonlyArray<FlatVarEntry<SurfaceTokens>>;
84
+ /** Diagram axis — how marks are drawn on every drawing surface. */
85
+ declare const DIAGRAM_VARS: ReadonlyArray<FlatVarEntry<DiagramTokens>>;
86
+ /** Scene axis — 3D material and lighting. */
87
+ declare const SCENE_VARS: ReadonlyArray<FlatVarEntry<SceneTokens>>;
84
88
  /** Legacy free-form map prefixes (`ThemeTokens.colors`/`radii`/`spacing`/`shadows`). `typography` has no prefix — see below. */
85
89
  declare const LEGACY_PREFIXES: {
86
90
  readonly colors: "--color-";
@@ -117,4 +121,4 @@ declare function enterKeyframe(enter: EnterAnimation): string;
117
121
  */
118
122
  declare function resolveThemeForRuntime(theme: ThemeRef | undefined): ThemeDefinition | undefined;
119
123
 
120
- export { DENSITY_ELEMENT_VARS as D, ELEVATION_VARS as E, type FlatVarEntry as F, GEOMETRY_VARS as G, ICONOGRAPHY_VARS as I, LEGACY_PREFIXES as L, MOTION_DURATION_KEYS as M, SURFACE_VARS as S, type ThemeMode as T, DENSITY_SPACING_VARS as a, MOTION_EASING_KEYS as b, MOTION_INTENT_VARS as c, MOTION_SHAPE_VARS as d, type StringValueKey as e, TYPE_FAMILY_VARS as f, TYPE_HEADING_VARS as g, TYPE_INTENT_VARS as h, TYPE_SIZE_KEYS as i, enterKeyframe as j, resolveThemeForRuntime as r, themeTokensToCssVars as t };
124
+ export { DENSITY_ELEMENT_VARS as D, ELEVATION_VARS as E, type FlatVarEntry as F, GEOMETRY_VARS as G, ICONOGRAPHY_VARS as I, LEGACY_PREFIXES as L, MOTION_DURATION_KEYS as M, SCENE_VARS as S, type ThemeMode as T, DENSITY_SPACING_VARS as a, DIAGRAM_VARS as b, MOTION_EASING_KEYS as c, MOTION_INTENT_VARS as d, MOTION_SHAPE_VARS as e, SURFACE_VARS as f, type StringValueKey as g, TYPE_FAMILY_VARS as h, TYPE_HEADING_VARS as i, TYPE_INTENT_VARS as j, TYPE_SIZE_KEYS as k, enterKeyframe as l, resolveThemeForRuntime as r, themeTokensToCssVars as t };
package/locales/ar.json CHANGED
@@ -183,6 +183,7 @@
183
183
  "template.ourTeam": "فريقنا",
184
184
  "template.caseStudies": "دراسات الحالة",
185
185
  "versionDiff.compare": "مقارنة",
186
+ "versionDiff.changes": "التغييرات",
186
187
  "versionDiff.to": "إلى",
187
188
  "versionDiff.beforeRevision": "المراجعة السابقة",
188
189
  "versionDiff.afterRevision": "المراجعة اللاحقة",
@@ -913,6 +914,7 @@
913
914
  "gridPicker.moreRefine": "+{{count}} أخرى — دقّق بحثك",
914
915
  "graphCanvas.noNodes": "لا توجد عقد لعرضها.",
915
916
  "codeBlock.noCode": "لا يوجد كود لعرضه.",
917
+ "codeBlock.region": "الشيفرة البرمجية",
916
918
  "fab.action": "إجراء",
917
919
  "fab.closeActions": "إغلاق الإجراءات",
918
920
  "fab.openActions": "فتح الإجراءات",
@@ -1229,5 +1231,12 @@
1229
1231
  "agentActivity.earlierConversations": "المحادثات السابقة ({{count}})",
1230
1232
  "agentActivity.earlierActivity": "نشاط سابق",
1231
1233
  "tabs.scrollStart": "مرّر علامات التبويب للخلف",
1232
- "tabs.scrollEnd": "مرّر علامات التبويب للأمام"
1234
+ "tabs.scrollEnd": "مرّر علامات التبويب للأمام",
1235
+ "agentChat.workedThrough": "أنجز {{count}} خطوات",
1236
+ "agentChat.newMessages": "رسائل جديدة",
1237
+ "agentChat.copy": "نسخ الرد",
1238
+ "agentChat.copied": "تم النسخ",
1239
+ "agentChat.today": "اليوم",
1240
+ "agentChat.yesterday": "أمس",
1241
+ "agentChat.emptyDescription": "اسأل بكلماتك — يستطيع المساعد البحث عن المعلومات وإجراء التغييرات نيابةً عنك."
1233
1242
  }
package/locales/en.json CHANGED
@@ -187,6 +187,7 @@
187
187
  "template.ourTeam": "Our Team",
188
188
  "template.caseStudies": "Case Studies",
189
189
  "versionDiff.compare": "Compare",
190
+ "versionDiff.changes": "Changes",
190
191
  "versionDiff.to": "to",
191
192
  "versionDiff.beforeRevision": "Before revision",
192
193
  "versionDiff.afterRevision": "After revision",
@@ -913,6 +914,7 @@
913
914
  "gridPicker.moreRefine": "+{{count}} more — refine your search",
914
915
  "graphCanvas.noNodes": "No nodes to display.",
915
916
  "codeBlock.noCode": "No code to display.",
917
+ "codeBlock.region": "Code",
916
918
  "fab.action": "Action",
917
919
  "fab.closeActions": "Close actions",
918
920
  "fab.openActions": "Open actions",
@@ -1229,5 +1231,12 @@
1229
1231
  "agentActivity.earlierConversations": "Earlier conversations ({{count}})",
1230
1232
  "agentActivity.earlierActivity": "Earlier activity",
1231
1233
  "tabs.scrollStart": "Scroll tabs back",
1232
- "tabs.scrollEnd": "Scroll tabs forward"
1234
+ "tabs.scrollEnd": "Scroll tabs forward",
1235
+ "agentChat.workedThrough": "Worked through {{count}} steps",
1236
+ "agentChat.newMessages": "New messages",
1237
+ "agentChat.copy": "Copy reply",
1238
+ "agentChat.copied": "Copied",
1239
+ "agentChat.today": "Today",
1240
+ "agentChat.yesterday": "Yesterday",
1241
+ "agentChat.emptyDescription": "Ask in your own words — the assistant can look things up and make changes for you."
1233
1242
  }
package/locales/sl.json CHANGED
@@ -183,6 +183,7 @@
183
183
  "template.ourTeam": "Naša ekipa",
184
184
  "template.caseStudies": "Primeri uporabe",
185
185
  "versionDiff.compare": "Primerjaj",
186
+ "versionDiff.changes": "Spremembe",
186
187
  "versionDiff.to": "z",
187
188
  "versionDiff.beforeRevision": "Prejšnja revizija",
188
189
  "versionDiff.afterRevision": "Naslednja revizija",
@@ -913,6 +914,7 @@
913
914
  "gridPicker.moreRefine": "+še {{count}} — zožite iskanje",
914
915
  "graphCanvas.noNodes": "Ni vozlišč za prikaz.",
915
916
  "codeBlock.noCode": "Ni kode za prikaz.",
917
+ "codeBlock.region": "Koda",
916
918
  "fab.action": "Dejanje",
917
919
  "fab.closeActions": "Zapri dejanja",
918
920
  "fab.openActions": "Odpri dejanja",
@@ -1229,5 +1231,12 @@
1229
1231
  "agentActivity.earlierConversations": "Prejšnji pogovori ({{count}})",
1230
1232
  "agentActivity.earlierActivity": "Prejšnja dejavnost",
1231
1233
  "tabs.scrollStart": "Pomakni zavihke nazaj",
1232
- "tabs.scrollEnd": "Pomakni zavihke naprej"
1234
+ "tabs.scrollEnd": "Pomakni zavihke naprej",
1235
+ "agentChat.workedThrough": "Opravil {{count}} korakov",
1236
+ "agentChat.newMessages": "Nova sporočila",
1237
+ "agentChat.copy": "Kopiraj odgovor",
1238
+ "agentChat.copied": "Kopirano",
1239
+ "agentChat.today": "Danes",
1240
+ "agentChat.yesterday": "Včeraj",
1241
+ "agentChat.emptyDescription": "Vprašajte s svojimi besedami — pomočnik lahko poišče podatke in namesto vas naredi spremembe."
1233
1242
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "6.54.0",
3
+ "version": "6.55.0",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -126,11 +126,11 @@
126
126
  "access": "public"
127
127
  },
128
128
  "dependencies": {
129
- "@almadar/core": "^10.116.0",
129
+ "@almadar/core": "^10.117.0",
130
130
  "@almadar/evaluator": "^2.54.0",
131
- "@almadar/logger": "^1.15.0",
132
- "@almadar/runtime": "^6.102.0",
133
- "@almadar/std": "^16.241.0",
131
+ "@almadar/logger": "^1.16.0",
132
+ "@almadar/runtime": "^6.103.0",
133
+ "@almadar/std": "^16.242.0",
134
134
  "@almadar/syntax": "^1.19.0",
135
135
  "@dnd-kit/core": "^6.3.1",
136
136
  "@dnd-kit/sortable": "^10.0.0",
@@ -191,7 +191,7 @@
191
191
  }
192
192
  },
193
193
  "devDependencies": {
194
- "@almadar-io/behaviors": "^0.16.187",
194
+ "@almadar-io/behaviors": "^0.16.189",
195
195
  "@almadar/eslint-plugin": "^2.21.0",
196
196
  "@react-three/drei": "^10.7.7",
197
197
  "@react-three/fiber": "^9.6.0",
@@ -47,6 +47,16 @@ const PAIRS = [
47
47
  ['--color-foreground', '--color-surface'],
48
48
  ];
49
49
 
50
+ // Drawing surfaces: labels are text (4.5:1); marks are graphics (WCAG 1.4.11, 3:1). Measured
51
+ // against the drawing ground, which falls back to the card when a theme sets none.
52
+ const DIAGRAM_TEXT = ['--color-diagram-label'];
53
+ const DIAGRAM_GRAPHICS = [
54
+ '--color-diagram-ink',
55
+ '--color-diagram-axis',
56
+ '--color-diagram-highlight',
57
+ ...Array.from({ length: 8 }, (_, i) => `--color-series-${i + 1}`),
58
+ ];
59
+
50
60
  let violations = 0;
51
61
  for (const mode of loadThemeModes(themesDir, filter)) {
52
62
  const results = [];
@@ -57,11 +67,20 @@ for (const mode of loadThemeModes(themesDir, filter)) {
57
67
  results.push({ pair: `${fgName} on ${bgName}`, ratio: ratio.toFixed(2), fg: mode.raw(fgName), bg: mode.raw(bgName) });
58
68
  }
59
69
  }
70
+ const groundName = mode.color('--surface-diagram') ? '--surface-diagram' : '--color-card';
71
+ for (const [names, min] of [[DIAGRAM_TEXT, 4.5], [DIAGRAM_GRAPHICS, 3]]) {
72
+ for (const fgName of names) {
73
+ const ratio = pairContrast(mode, mode.color(fgName), mode.color(groundName));
74
+ if (ratio !== null && ratio < min) {
75
+ results.push({ pair: `${fgName} on ${groundName} (needs ${min}:1)`, ratio: ratio.toFixed(2), fg: mode.raw(fgName), bg: mode.raw(groundName) });
76
+ }
77
+ }
78
+ }
60
79
  if (results.length) {
61
80
  violations += results.length;
62
81
  console.log(`\n${mode.name} (${mode.file})`);
63
82
  for (const r of results) console.log(` FAIL ${r.ratio}:1 ${r.pair} fg=${r.fg} bg=${r.bg}`);
64
83
  }
65
84
  }
66
- console.log(violations === 0 ? '\nAll theme pairs pass WCAG AA (4.5:1).' : `\n${violations} violation(s).`);
85
+ console.log(violations === 0 ? '\nAll theme pairs pass WCAG AA (text 4.5:1, drawing marks 3:1).' : `\n${violations} violation(s).`);
67
86
  process.exit(violations === 0 ? 0 : 1);
package/themes/_base.css CHANGED
@@ -361,3 +361,64 @@ body {
361
361
  .ui-slot-renderer {
362
362
  padding-inline-end: var(--almadar-dock-contained-inset, 0px);
363
363
  }
364
+
365
+ /* --------------------------------------------------------------------
366
+ * Drawing surfaces — canvas, chart, diagram, game board, 3D scene.
367
+ * Defaults derived from each theme's own tokens, so a theme that sets no
368
+ * `diagram`/`scene` axis still draws in its own palette, border weight,
369
+ * faces and corners. Declared on every theme scope (not only :root): a
370
+ * var() alias resolves where it is declared, so a :root-only default would
371
+ * freeze the root theme's colors inside a [data-theme] subtree.
372
+ * -------------------------------------------------------------------- */
373
+ :root,
374
+ [data-theme],
375
+ [data-orbital-theme] {
376
+ --surface-diagram: var(--color-card);
377
+
378
+ --color-diagram-ink: var(--color-foreground);
379
+ --color-diagram-label: var(--color-muted-foreground);
380
+ --color-diagram-guide: var(--color-muted-foreground);
381
+ --color-diagram-axis: var(--color-foreground);
382
+ --color-diagram-grid: var(--color-border);
383
+ --color-diagram-highlight: var(--color-primary);
384
+ --color-diagram-fill: var(--color-muted);
385
+
386
+ /* A categorical palette carries no status meaning: the theme's primary
387
+ * turned around the hue wheel at its own lightness and chroma. */
388
+ --color-series-1: var(--color-primary);
389
+ --color-series-2: oklch(from var(--color-primary) clamp(0.45, l, 0.72) max(c, 0.12) calc(h + 45));
390
+ --color-series-3: oklch(from var(--color-primary) clamp(0.45, l, 0.72) max(c, 0.12) calc(h + 90));
391
+ --color-series-4: oklch(from var(--color-primary) clamp(0.45, l, 0.72) max(c, 0.12) calc(h + 135));
392
+ --color-series-5: oklch(from var(--color-primary) clamp(0.45, l, 0.72) max(c, 0.12) calc(h + 180));
393
+ --color-series-6: oklch(from var(--color-primary) clamp(0.45, l, 0.72) max(c, 0.12) calc(h + 225));
394
+ --color-series-7: oklch(from var(--color-primary) clamp(0.45, l, 0.72) max(c, 0.12) calc(h + 270));
395
+ --color-series-8: oklch(from var(--color-primary) clamp(0.45, l, 0.72) max(c, 0.12) calc(h + 315));
396
+
397
+ --diagram-stroke-thin: var(--border-hairline, var(--border-width-thin, 1px));
398
+ --diagram-stroke-normal: calc(var(--border-standard, var(--border-width, 1px)) * 1.5);
399
+ --diagram-stroke-bold: calc(var(--border-heavy, var(--border-width-thick, 2px)) * 1.5);
400
+ --diagram-line-cap: round;
401
+ --diagram-line-join: round;
402
+ --diagram-dash: 6 4;
403
+ --diagram-dot: 1 4;
404
+ --diagram-fill-style: tint;
405
+ --diagram-fill-opacity: 0.18;
406
+ --diagram-roughness: 0;
407
+ --diagram-glow: 0;
408
+ --diagram-shadow: none;
409
+ --diagram-marker: triangle;
410
+ --diagram-label-font: body;
411
+ --diagram-label-size: sm;
412
+ --diagram-label-weight: var(--font-weight-medium, 500);
413
+ --diagram-label-case: none;
414
+ --diagram-corner: var(--radius-sm, 4px);
415
+
416
+ --material-roughness: 0.6;
417
+ --material-metalness: 0;
418
+ --material-flat: 0;
419
+ --material-outline: 0;
420
+ --light-ambient: 0.55;
421
+ --light-key: 1;
422
+ --light-key-color: #ffffff;
423
+ --scene-fog: 0;
424
+ }
@@ -253,6 +253,37 @@ These separate artistic styles (Art Deco vs Win95 vs wabi-sabi) along dimensions
253
253
 
254
254
  ---
255
255
 
256
+ ### Drawing axes — `diagram`, `scene`, diagram colors, `--surface-diagram`
257
+
258
+ How every drawing surface (learning canvases, charts, graph canvases, game boards, AVL, 3D
259
+ scenes) draws its marks. Components never hardcode a drawing color, weight or face; they resolve
260
+ these through `useCanvasTheme` (`hooks/useCanvasTheme.ts`). Defaults in `_base.css` derive every
261
+ var from the theme's own tokens, so a preset that sets nothing still draws in its own palette,
262
+ border weight, faces and corners. A preset sets them to give its drawings a hand of their own
263
+ (sketch wobble, neon glow, blueprint dashes, Bauhaus square caps).
264
+
265
+ | Var | Source key | Meaning |
266
+ |---|---|---|
267
+ | `--surface-diagram` | `surface.diagram` | Ground a drawing sits on (default `--color-card`) |
268
+ | `--color-series-1…8` | `colors.series-N` | Categorical data palette with no status meaning (default: primary turned around the hue wheel) |
269
+ | `--color-diagram-ink` / `-label` / `-guide` / `-axis` / `-grid` / `-highlight` / `-fill` | `colors.diagram-*` | Mark roles: default stroke, label text, construction lines, axes, grid, the one emphasized mark, default fill |
270
+ | `--diagram-stroke-thin` / `-normal` / `-bold` | `diagram.strokeThin/Normal/Bold` | Stroke weights for guides / marks / emphasis (default from the border rhythm) |
271
+ | `--diagram-line-cap` / `-line-join` | `diagram.lineCap/lineJoin` | `butt\|round\|square` / `miter\|round\|bevel` |
272
+ | `--diagram-dash` / `-dot` | `diagram.dash/dot` | Dash patterns (space-separated lengths) of dashed / dotted marks |
273
+ | `--diagram-fill-style` / `-fill-opacity` | `diagram.fillStyle/fillOpacity` | `solid\|tint\|outline\|hatch`; tint strength |
274
+ | `--diagram-roughness` | `diagram.roughness` | Hand-drawn wobble in px (`0` = exact) |
275
+ | `--diagram-glow` | `diagram.glow` | Glow blur in px around strokes (`0` = none) |
276
+ | `--diagram-shadow` | `diagram.shadow` | Shadow recipe on filled marks |
277
+ | `--diagram-marker` | `diagram.marker` | Arrowhead: `triangle\|open\|line\|dot` |
278
+ | `--diagram-label-font` / `-size` / `-weight` / `-case` | `diagram.label*` | Label face (`body\|display\|mono`), type-scale step, weight, `none\|uppercase` |
279
+ | `--diagram-corner` | `diagram.corner` | Corner radius of rects and bars |
280
+ | `--material-roughness` / `-metalness` / `-flat` / `-outline` | `scene.material*` | 3D material response; `flat` `1` = flat shading; `outline` = toon outline px |
281
+ | `--light-ambient` / `-key` / `-key-color` | `scene.light*` | 3D lighting |
282
+ | `--scene-fog` | `scene.fog` | Depth haze 0–1 |
283
+
284
+ Motion has no drawing-specific vars: animated surfaces use `--duration-*` / `--easing-*` and stop
285
+ when `--motion-enable: off` or `prefers-reduced-motion` is set.
286
+
256
287
  ## Authoring rules
257
288
 
258
289
  1. **Backfill agents** (B1, B2, B3): copy the defaults above verbatim into each existing theme's light and dark blocks. Do not change any pre-existing variable. The migration must produce pixel-identical output to today for every pre-Layer-1 theme.
@@ -262,3 +293,9 @@ These separate artistic styles (Art Deco vs Win95 vs wabi-sabi) along dimensions
262
293
  5. **Wireframe and trait-wars exceptions**. Wireframe's `--easing-standard` is `linear` not the default cubic-bezier; trait-wars's iconography may remain `lucide` even if its visual personality diverges. Document any per-theme override at the top of the theme file.
263
294
  6. **Contrast is gated.** Every theme's canonical foreground/fill pairs must pass WCAG AA 4.5:1 — enforced by `scripts/theme-contrast-audit.mjs` (`pnpm verify:themes`), which runs in CI and before every npm publish and exits non-zero on any violation. A new or edited theme that fails the audit blocks the publish. The script also accepts `--dir <themes-dir>` (`scripts/` is published) so another package can audit its own theme dir with the same rules.
264
295
  7. **No hardcoded palette colors in components.** Components must consume these tokens only (no `text-white`, `bg-gray-800`, `border-indigo-300`, `text-[#hex]`). Enforced by the `almadar/no-hardcoded-colors` ESLint rule (`@almadar/eslint-plugin`, enabled in this package's `eslint.config.cjs`). The single sanctioned exception is media-overlay chrome (white text / dark scrims painted over images or video), which requires an inline `eslint-disable-next-line almadar/no-hardcoded-colors` comment stating the reason.
296
+
297
+ **Drawing roles stay apart.** In every theme mode the roles a canvas draws meaning with — `diagram-ink`,
298
+ `diagram-highlight`, `muted-foreground`, `success`, `warning`, `error`, `series-1`…`series-8` — are at least
299
+ ΔE 10 (CIEDE2000) from each other (`@almadar/core` `__tests__/theme-tone-colors.test.ts`; `INDISTINCT_DELTA_E`).
300
+ A monochrome theme keeps its UI monochrome and gives its drawings a small on-identity palette. In an `outline`
301
+ fill-style theme a mark's meaningful fill becomes its (bold) outline, so the outline look never erases a state.
@@ -36,6 +36,21 @@
36
36
  --color-info: #00767c;
37
37
  --color-info-foreground: #ffffff;
38
38
  --color-scrim: rgba(15, 23, 42, 0.55);
39
+ --color-series-1: #00767c;
40
+ --color-series-2: #7d7d12;
41
+ --color-series-3: #215eac;
42
+ --color-series-4: #a4444c;
43
+ --color-series-5: #536225;
44
+ --color-series-6: #7a4a8a;
45
+ --color-series-7: #875c27;
46
+ --color-series-8: #6b7689;
47
+ --color-diagram-ink: #1f2d3d;
48
+ --color-diagram-label: #334155;
49
+ --color-diagram-guide: #8a8f98;
50
+ --color-diagram-axis: #64748b;
51
+ --color-diagram-grid: #e4e0d8;
52
+ --color-diagram-highlight: #a07a10;
53
+ --color-diagram-fill: #00767c;
39
54
  --radius-none: 0px;
40
55
  --radius-sm: 4px;
41
56
  --radius-md: 6px;
@@ -186,6 +201,32 @@
186
201
  --surface-card-image: none;
187
202
  --surface-page-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 48 48'><g fill='none' stroke='%2300767c' stroke-opacity='0.07' stroke-width='1'><path d='M24 0V48M0 24H48'/><path d='M24 18L30 24L24 30L18 24Z'/></g></svg>");
188
203
  --surface-page-image-size: 48px 48px;
204
+ --diagram-stroke-thin: 1px;
205
+ --diagram-stroke-normal: 1.5px;
206
+ --diagram-stroke-bold: 2.5px;
207
+ --diagram-line-cap: round;
208
+ --diagram-line-join: round;
209
+ --diagram-dash: 6 4;
210
+ --diagram-dot: 1 4;
211
+ --diagram-fill-style: tint;
212
+ --diagram-fill-opacity: 0.16;
213
+ --diagram-roughness: 0;
214
+ --diagram-glow: 0;
215
+ --diagram-shadow: 0 2px 6px rgba(15, 23, 42, 0.12);
216
+ --diagram-marker: triangle;
217
+ --diagram-label-font: body;
218
+ --diagram-label-size: sm;
219
+ --diagram-label-weight: 600;
220
+ --diagram-label-case: none;
221
+ --diagram-corner: 6px;
222
+ --material-roughness: 0.55;
223
+ --material-metalness: 0.25;
224
+ --material-flat: 0;
225
+ --material-outline: 0;
226
+ --light-ambient: 0.55;
227
+ --light-key: 1;
228
+ --light-key-color: #fff4d6;
229
+ --scene-fog: 0.05;
189
230
  }
190
231
 
191
232
  [data-theme="almadar-heritage-dark"] {
@@ -220,6 +261,21 @@
220
261
  --color-info: #2cc7cd;
221
262
  --color-info-foreground: #000000;
222
263
  --color-scrim: rgba(0, 0, 0, 0.7);
264
+ --color-series-1: #0a98a0;
265
+ --color-series-2: #a9841b;
266
+ --color-series-3: #568acf;
267
+ --color-series-4: #b86a60;
268
+ --color-series-5: #7d9146;
269
+ --color-series-6: #a379b1;
270
+ --color-series-7: #b57b43;
271
+ --color-series-8: #758091;
272
+ --color-diagram-ink: #e6e1d4;
273
+ --color-diagram-label: #c9ced8;
274
+ --color-diagram-guide: #7f8aa0;
275
+ --color-diagram-axis: #98a2b6;
276
+ --color-diagram-grid: #2a3650;
277
+ --color-diagram-highlight: #c3ae41;
278
+ --color-diagram-fill: #00b1b8;
223
279
  --radius-none: 0px;
224
280
  --radius-sm: 6px;
225
281
  --radius-md: 10px;
@@ -370,4 +426,30 @@
370
426
  --surface-card-image: none;
371
427
  --surface-page-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 48 48'><g fill='none' stroke='%2300b1b8' stroke-opacity='0.06' stroke-width='1'><path d='M24 0V48M0 24H48'/><path d='M24 18L30 24L24 30L18 24Z'/></g></svg>");
372
428
  --surface-page-image-size: 72px 72px;
429
+ --diagram-stroke-thin: 1px;
430
+ --diagram-stroke-normal: 1.5px;
431
+ --diagram-stroke-bold: 2.5px;
432
+ --diagram-line-cap: round;
433
+ --diagram-line-join: round;
434
+ --diagram-dash: 6 4;
435
+ --diagram-dot: 1 4;
436
+ --diagram-fill-style: tint;
437
+ --diagram-fill-opacity: 0.16;
438
+ --diagram-roughness: 0;
439
+ --diagram-glow: 0;
440
+ --diagram-shadow: 0 2px 6px rgba(15, 23, 42, 0.12);
441
+ --diagram-marker: triangle;
442
+ --diagram-label-font: body;
443
+ --diagram-label-size: sm;
444
+ --diagram-label-weight: 600;
445
+ --diagram-label-case: none;
446
+ --diagram-corner: 6px;
447
+ --material-roughness: 0.55;
448
+ --material-metalness: 0.25;
449
+ --material-flat: 0;
450
+ --material-outline: 0;
451
+ --light-ambient: 0.55;
452
+ --light-key: 1;
453
+ --light-key-color: #fff4d6;
454
+ --scene-fog: 0.05;
373
455
  }