@almadar/shell-web 1.2.1 → 1.3.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 (77) hide show
  1. package/dist/AvlGlyph-N2MSWT7H.js +5 -0
  2. package/dist/{AvlStateMachine-KVZMFHFU.js → AvlStateMachine-HDWKFV7C.js} +3 -3
  3. package/dist/AvlTransitionDetail-CRMZLMFV.js +10 -0
  4. package/dist/AvlTransitionExplainer-NJLDP7X5.js +11 -0
  5. package/dist/BehaviorView-EFKTS3KZ.js +10 -0
  6. package/dist/{FileTree-B3GDAjaQ.d.ts → FileTree-CSdbAdcJ.d.ts} +8 -0
  7. package/dist/FlowCanvas-S3ODHQXS.js +23 -0
  8. package/dist/{GameAudioProvider-BgWOOYT3.d.ts → GameAudioProvider-B8FBcGVE.d.ts} +1 -1
  9. package/dist/{KernelEngineContext-BPx-q0iw.d.ts → KernelEngineContext-6l6vkc50.d.ts} +1 -1
  10. package/dist/{LayersPanel-PSXI4EHG.js → LayersPanel-YHXNS36U.js} +4 -4
  11. package/dist/ModuleCard-6UW7YBAH.js +6 -0
  12. package/dist/OrbInspector-RQU5P2T6.js +23 -0
  13. package/dist/OrbPreview-V4VLWNMT.css +1754 -0
  14. package/dist/OrbPreview-WKC3ORIK.js +23 -0
  15. package/dist/{Select-BJ8Fgc8A.d.ts → Select-DuX0Gvwo.d.ts} +14 -8
  16. package/dist/UISlotRenderer-7IGRYWII.js +23 -0
  17. package/dist/auth/react/index.js +4 -0
  18. package/dist/avl/index.d.ts +2 -2
  19. package/dist/avl/index.js +25 -25
  20. package/dist/{chunk-LKL5RULQ.js → chunk-3OF2X6GG.js} +2 -2
  21. package/dist/{chunk-V5SVGUYN.js → chunk-3WSTUUJ7.js} +1 -1
  22. package/dist/{chunk-B23EZH2P.js → chunk-4IFO6QJL.js} +3 -3
  23. package/dist/{chunk-RDPELAFQ.js → chunk-4UAAP6ZN.js} +2 -2
  24. package/dist/{chunk-LINJRTNB.js → chunk-6MZ224GN.js} +2 -2
  25. package/dist/{chunk-3YUMGEEW.js → chunk-AYQKZFUH.js} +1 -1
  26. package/dist/{chunk-3DA36FOA.js → chunk-BY2UJWVR.js} +1 -1
  27. package/dist/{chunk-S3LS3B7N.js → chunk-CB4POLGP.js} +1 -1
  28. package/dist/{chunk-2LNXLMK3.js → chunk-FZOX7XTU.js} +41 -41
  29. package/dist/{chunk-ZDRDJKYB.js → chunk-MXN32OVV.js} +212 -20
  30. package/dist/{chunk-TAEOMNDK.js → chunk-NIOQT2IE.js} +44914 -44206
  31. package/dist/{chunk-CCO2ZH7F.js → chunk-NVSUTIJ2.js} +2 -2
  32. package/dist/{chunk-DPDKBY6Z.js → chunk-OEWVBYW5.js} +1 -0
  33. package/dist/{chunk-UFQLHCFJ.js → chunk-OHWEWQL3.js} +1 -1
  34. package/dist/{chunk-D5FJU4XC.js → chunk-OOG33EGF.js} +46 -14
  35. package/dist/{chunk-AU7O65OX.js → chunk-OXHXISFA.js} +1 -1
  36. package/dist/{chunk-PWXZN5G5.js → chunk-PD5QUVRE.js} +2 -2
  37. package/dist/{chunk-6RXP5ZXE.js → chunk-PHIQOASV.js} +5 -5
  38. package/dist/{chunk-GHAF7QUD.js → chunk-QZ6TDP6I.js} +1 -1
  39. package/dist/{chunk-JEN4EIUF.js → chunk-RCB4CKRK.js} +1 -1
  40. package/dist/{chunk-AL2XXMYR.js → chunk-RQH6O76X.js} +20 -6
  41. package/dist/{chunk-7UCL26QB.js → chunk-TJEB4PII.js} +3 -3
  42. package/dist/{chunk-KTYOYEVA.js → chunk-YU2ZNLGI.js} +1 -1
  43. package/dist/components/index.d.ts +295 -22
  44. package/dist/components/index.js +27 -22
  45. package/dist/context/index.js +3 -3
  46. package/dist/core.d.ts +23 -6
  47. package/dist/core.js +1 -1
  48. package/dist/{fx-Bx5RqplG.d.ts → fx-Bc3yEVED.d.ts} +2 -2
  49. package/dist/hooks/index.js +4 -4
  50. package/dist/index.d.ts +18 -5
  51. package/dist/index.js +4 -4
  52. package/dist/{kernel-client-NMZ56JVU.js → kernel-client-NM6S72DO.js} +74 -33
  53. package/dist/{kernel-wire-CRsHtLsf.d.ts → kernel-wire-Ds7xSZzx.d.ts} +6 -0
  54. package/dist/lib/index.d.ts +2 -2
  55. package/dist/lib/index.js +3 -3
  56. package/dist/providers/index.d.ts +5 -5
  57. package/dist/providers/index.js +15 -15
  58. package/dist/runtime/index.d.ts +6 -2
  59. package/dist/runtime/index.js +14 -14
  60. package/dist/ssr/index.cjs +27 -4
  61. package/dist/ssr/index.d.cts +6 -0
  62. package/dist/ssr/index.d.ts +6 -0
  63. package/dist/ssr/index.js +27 -4
  64. package/dist/test-support.js +2 -2
  65. package/dist/{verificationRegistry-BLuQU1JV.d.ts → verificationRegistry-Dz5N0oxx.d.ts} +199 -8
  66. package/package.json +9 -9
  67. package/src/core/locales/ar.json +8 -1
  68. package/src/core/locales/en.json +8 -1
  69. package/src/core/locales/sl.json +8 -1
  70. package/dist/AvlGlyph-KZMJDBEB.js +0 -5
  71. package/dist/AvlTransitionDetail-7DVGV27I.js +0 -10
  72. package/dist/AvlTransitionExplainer-RMJ5LQLK.js +0 -11
  73. package/dist/BehaviorView-EYRPME67.js +0 -10
  74. package/dist/FlowCanvas-J54627TC.js +0 -23
  75. package/dist/ModuleCard-TNRLL45H.js +0 -6
  76. package/dist/OrbInspector-UBEQWWZ2.js +0 -23
  77. package/dist/UISlotRenderer-5OURMAP2.js +0 -23
@@ -1,6 +1,6 @@
1
1
  import React__default from 'react';
2
2
  import { ScenePos, Asset, OrbitalVerificationAPI, TraitStateSnapshot, EventPayload, BusEvent, VerificationCheck, BridgeHealth, VerificationSnapshot, VerificationSummary, TransitionTrace, EventRequest, EventResponse, ServerResponseTrace, EffectTrace, CheckStatus, ServerEffectResult, AssetLoadStatus } from '@almadar/core';
3
- import { P as Point, R as Rect, F as FxItem, a as FxPreset } from './fx-Bx5RqplG.js';
3
+ import { P as Point, R as Rect, F as FxItem, a as FxPreset } from './fx-Bc3yEVED.js';
4
4
  import './EventBusProvider-BFFHfN4O.js';
5
5
  import { EventTransport } from '@almadar/shell-runtime/client/EventTransport';
6
6
  import './verification-C5pTeMJv.js';
@@ -62,6 +62,43 @@ interface Projector {
62
62
  /** True for world-pixel-direct layouts (`free`/`side`); false for tile grids (`flat`/`iso`/`hex`). */
63
63
  readonly worldPixelDirect: boolean;
64
64
  }
65
+ /** Accessibility node a drawable carries; the orbital painter holds it for the accessibility export. */
66
+ interface DrawableSemantic {
67
+ /** Accessibility role (`button`, `switch`, `slider`, ...). */
68
+ role: string;
69
+ /** Accessible name, as text. A node takes its name from `name` or from `labelledBy`, never both. */
70
+ name?: string;
71
+ /** The id of a `draw-text` whose painted text is this node's accessible name (as ARIA `aria-labelledby`), so a name translated where it is painted reads the same to assistive technology. */
72
+ labelledBy?: string;
73
+ /** Current value, as text. A node takes its value from `value` or from `valueFrom`, never both. */
74
+ value?: string;
75
+ /** The id of a `draw-text` whose painted text is this node's value (a combobox's shown choice), so a value translated where it is painted reads the same to assistive technology. */
76
+ valueFrom?: string;
77
+ /** Checked state for toggles. */
78
+ checked?: boolean;
79
+ /** The control is disabled. */
80
+ disabled?: boolean;
81
+ /** Reading and tab order in the semantic tree; ties keep paint order. */
82
+ order?: number;
83
+ /** This node holds the program's focus; the host mirrors it to the platform (accessibility focus, input-method session for a `textbox`). */
84
+ focused?: boolean;
85
+ /** `textbox` only: caret index in characters (Unicode scalar values) into `value`. */
86
+ caret?: number;
87
+ /** `textbox` only: start of the selected range, in characters. */
88
+ selectionStart?: number;
89
+ /** `textbox` only: end of the selected range, in characters. */
90
+ selectionEnd?: number;
91
+ /** `textbox` only: multi-line input. */
92
+ multiline?: boolean;
93
+ }
94
+ /** Spring a drawable follows when a repaint changes its animatable fields (orbital painter). */
95
+ interface DrawableSpring {
96
+ /** Spring stiffness. */
97
+ stiffness: number;
98
+ /** Spring damping. */
99
+ damping: number;
100
+ }
101
+ /** The orbital painter's layering props live on `draw-shape` (`backdrop`, `material.targets`), `draw-group` (`target`) and `draw-sprite` (`texture: "target:<id>"`); the TypeScript painter paints none of them. */
65
102
  /** Common shape of every drawable descriptor. `type` keys the host's paint dispatch. */
66
103
  interface DrawableBase {
67
104
  type: string;
@@ -73,6 +110,14 @@ interface DrawableBase {
73
110
  * NOT a heuristic: no id → the host emits only the coordinate (tile click).
74
111
  */
75
112
  id?: string;
113
+ /** With an `id`, the drawable is a pointer region (its painted bounds, rotation applied); the orbital canvas emits the pointer events for it. */
114
+ hit?: boolean;
115
+ /** With `hit`, the region takes the wheel: the canvas sends `wheelEvent` for it and keeps the wheel from the page. Over anything else the page scrolls. */
116
+ wheel?: boolean;
117
+ /** Accessibility node for this drawable. */
118
+ semantic?: DrawableSemantic;
119
+ /** With an `id`: when a repaint changes this drawable's animatable fields, the canvas moves them to the new values by this spring. */
120
+ spring?: DrawableSpring;
76
121
  }
77
122
 
78
123
  /**
@@ -89,7 +134,7 @@ interface DrawableBase {
89
134
  * registers a `draw-shape` pattern and standalone pages stay inspectable.
90
135
  */
91
136
 
92
- type ShapeKind = 'cell' | 'rect' | 'ellipse' | 'poly' | 'path';
137
+ type ShapeKind = 'cell' | 'rect' | 'ellipse' | 'poly' | 'path' | 'capsule' | 'arc' | 'polygon';
93
138
  /** Composite modes a shape may blend with — the canvas `globalCompositeOperation` set, spelled out so the pattern schema carries a real enum. */
94
139
  type DrawShapeBlendMode = 'source-over' | 'lighter' | 'multiply' | 'screen' | 'overlay' | 'darken' | 'lighten' | 'color-dodge' | 'color-burn' | 'hard-light' | 'soft-light' | 'difference' | 'exclusion' | 'hue' | 'saturation' | 'color' | 'luminosity' | 'source-atop' | 'destination-over' | 'destination-out' | 'xor';
95
140
  /** One gradient color stop; `offset` is 0..1 along the gradient axis. */
@@ -165,11 +210,42 @@ interface DrawShapeKeyframe {
165
210
  interface DrawShapeAnimation {
166
211
  /** One cycle length in ms. */
167
212
  durationMs: number;
213
+ /** Epoch-ms instant on the paint clock the animation starts at (the clock of `draw-emitter`'s `startMs`); before it the first keyframe shows, and with no clock the end state. Absent: it runs from the scene clock. */
214
+ startMs?: number;
168
215
  /** Loop the cycle (default true); false plays once and holds the final keyframes. */
169
216
  loop?: boolean;
170
217
  /** Keyframes ordered by `at` (0..1). */
171
218
  keyframes: DrawShapeKeyframe[];
172
219
  }
220
+ /** Rounded-rect corner treatment: `round`, `bevel`, `notch` or `scoop`. */
221
+ type DrawShapeCornerKind = 'round' | 'bevel' | 'notch' | 'scoop';
222
+ /** Per-corner radii for a `rect` (top-left, top-right, bottom-right, bottom-left) and how each corner is cut. */
223
+ interface DrawShapeCorners {
224
+ /** Radii in px: top-left, top-right, bottom-right, bottom-left. */
225
+ radius: number[];
226
+ /** Corner treatment. */
227
+ kind?: DrawShapeCornerKind;
228
+ }
229
+ /** A shader fill (orbital painter): the program's WGSL declares `fn shade(px: Pixel) -> vec4<f32>`. */
230
+ interface DrawShapeMaterial {
231
+ /** WGSL source defining `shade`. */
232
+ wgsl: string;
233
+ /** Up to 8 numeric parameters the shader reads as `a` and `b`. */
234
+ params: number[];
235
+ /** True asks for a frame every tick (the shader reads `time`); otherwise it redraws on change and pointer movement. */
236
+ live: boolean;
237
+ /** Ids of render targets (a `draw-group` with `target`) the material samples; the first is `target_a` at `@group(1)` (premultiplied alpha). */
238
+ targets?: string[];
239
+ }
240
+ /** What a shape shows behind itself (orbital painter): the frame painted so far under the shape's rect, blurred by a separable Gaussian of sigma `blur / 2`, saturated and tinted, masked by the shape's coverage; the fill and stroke then paint over it. A material reads it as `Pixel.behind` (straight alpha, zero without a backdrop). SDF shape kinds only; a backdrop shape ends its SDF batch. */
241
+ interface DrawShapeBackdrop {
242
+ /** Blur radius in px (>= 0); the Gaussian's sigma is half of it. */
243
+ blur: number;
244
+ /** CSS colour composited over the blurred frame. */
245
+ tint?: string;
246
+ /** Colour saturation of the blurred frame (default 1, 0 is gray). */
247
+ saturate?: number;
248
+ }
173
249
  interface DrawShapeProps extends DrawableBase {
174
250
  type: 'draw-shape';
175
251
  shape: ShapeKind;
@@ -192,6 +268,8 @@ interface DrawShapeProps extends DrawableBase {
192
268
  points?: Point[];
193
269
  /** SVG path data in world units relative to the cell's projected top-left — same coordinate convention as `points`. */
194
270
  d?: string;
271
+ /** `path` only: multiplier on the path's coordinates before projection (default 1), so a 24-unit icon draws at any size. Orbital painter. */
272
+ scale?: number;
195
273
  fill?: string;
196
274
  /** Gradient fill in world units; overrides `fill` when present. */
197
275
  gradient?: DrawShapeGradient;
@@ -219,6 +297,22 @@ interface DrawShapeProps extends DrawableBase {
219
297
  animation?: DrawShapeAnimation;
220
298
  /** 0..1 opacity. */
221
299
  opacity?: number;
300
+ /** Per-corner radii and corner kind (`rect` only; orbital painter). */
301
+ corners?: DrawShapeCorners;
302
+ /** Arc start angle in radians (`arc`: centred in the box, radius = min(width, height)/2). */
303
+ startAngle?: number;
304
+ /** Arc sweep in radians. */
305
+ sweep?: number;
306
+ /** Arc thickness in px. */
307
+ thickness?: number;
308
+ /** Polygon side count, at least 3 (`polygon`: inscribed in the box). */
309
+ sides?: number;
310
+ /** Polygon inner-vertex ratio, 0..1; 1 is a regular polygon, below 1 alternates inner vertices (a star). */
311
+ starRatio?: number;
312
+ /** Shader fill (orbital painter). */
313
+ material?: DrawShapeMaterial;
314
+ /** Frame-so-far blur behind the shape (orbital painter). */
315
+ backdrop?: DrawShapeBackdrop;
222
316
  }
223
317
  /** Registry/standalone stub — the host paints this atom; the DOM renders nothing.
224
318
  * When composed as a React child of a draw-host (Canvas2D), registers its
@@ -243,8 +337,10 @@ interface DrawSpriteProps extends DrawableBase {
243
337
  type: 'draw-sprite';
244
338
  /** Logical scene position; the projector maps it to pixels / world. */
245
339
  position: ScenePos;
246
- /** The image / atlas reference to blit. */
247
- asset: Asset;
340
+ /** The image / atlas reference to blit. Exactly one of `asset` or `texture` declares the sprite's source. */
341
+ asset?: Asset;
342
+ /** Exactly one of `asset` or `texture`. Orbital painter: `"target:<id>"` paints the render target of that id (a `draw-group` with `target`) instead of an asset; `width` and `height` are then required and `frame` selects a sub-rect in target px. The TS Canvas2D painter paints asset sprites only and skips a texture sprite. */
343
+ texture?: string;
248
344
  /** How the sprite aligns to its projected position. Default `'top-left'`. */
249
345
  anchor?: DrawableAnchor;
250
346
  /** Draw width in world units (fractions of `projector.tileWidth`). Omitted → one cell on tile grids (`flat`/`iso`/`hex`); native source px on `free`/`side`. */
@@ -290,6 +386,44 @@ declare function DrawSprite(_props: DrawSpriteProps): React__default.JSX.Element
290
386
  type DrawTextAlign = 'center' | 'end' | 'left' | 'right' | 'start';
291
387
  /** Mirrors DOM `CanvasTextBaseline` by value — see {@link DrawTextAlign}. */
292
388
  type DrawTextBaseline = 'alphabetic' | 'bottom' | 'hanging' | 'ideographic' | 'middle' | 'top';
389
+ /** One keyframe of a {@link DrawTextAnimation}: the fields it names lerp; the others keep their base value. */
390
+ interface DrawTextKeyframe {
391
+ /** Position in the cycle, 0..1. */
392
+ at: number;
393
+ opacity?: number;
394
+ /** Offset in px, replacing `offsetX` while the animation plays. */
395
+ offsetX?: number;
396
+ /** Offset in px, replacing `offsetY` while the animation plays. */
397
+ offsetY?: number;
398
+ }
399
+ /**
400
+ * Keyframe animation over a text's `opacity`, `offsetX` and `offsetY`, the same contract as a shape's. Orbital
401
+ * painter only: the host runs a paint clock while one is present.
402
+ */
403
+ interface DrawTextAnimation {
404
+ /** One cycle length in ms. */
405
+ durationMs: number;
406
+ /** Epoch-ms instant on the paint clock the animation starts at (the clock of `draw-emitter`'s `startMs`); before it the first keyframe shows, and with no clock the end state. Absent: it runs from the scene clock. */
407
+ startMs?: number;
408
+ /** Loop the cycle (default true); false plays once and holds the final keyframe. */
409
+ loop?: boolean;
410
+ /** Keyframes ordered by `at` (0..1). */
411
+ keyframes: DrawTextKeyframe[];
412
+ }
413
+ /**
414
+ * Letter-by-letter reveal on the paint clock (orbital painter only): glyph i, in visual order across lines, starts at
415
+ * `startMs + i * perGlyphMs` and over `durationMs` rises from `offsetY` px lower and from opacity 0, eased out.
416
+ */
417
+ interface DrawTextReveal {
418
+ /** Epoch-ms instant on the paint clock the first glyph starts at (the clock of `draw-emitter`'s `startMs`). */
419
+ startMs: number;
420
+ /** Delay between one glyph's start and the next. */
421
+ perGlyphMs: number;
422
+ /** How long each glyph takes to arrive. */
423
+ durationMs: number;
424
+ /** Px a glyph starts below its place (default 6). */
425
+ offsetY?: number;
426
+ }
293
427
  interface DrawTextProps extends DrawableBase {
294
428
  type: 'draw-text';
295
429
  text: string;
@@ -303,6 +437,36 @@ interface DrawTextProps extends DrawableBase {
303
437
  align?: DrawTextAlign;
304
438
  baseline?: DrawTextBaseline;
305
439
  opacity?: number;
440
+ /** Line width in px; with it the text lays out as a paragraph from `position` (top-left anchor). Orbital painter. */
441
+ width?: number;
442
+ /** Break at line opportunities within `width` (default true when `width` is set). */
443
+ wrap?: boolean;
444
+ /** Maximum number of lines; the last kept line ends in an ellipsis when `truncate` is true. */
445
+ maxLines?: number;
446
+ /** Ellipsis instead of overflow. */
447
+ truncate?: boolean;
448
+ /** Line height as a multiple of the font size (default 1.3). */
449
+ lineHeight?: number;
450
+ /** Report this text's size in `measureEvent` (needs `id`). */
451
+ measure?: boolean;
452
+ /** Keyframe animation over `opacity`, `offsetX` and `offsetY` (orbital painter; the TS painter ignores it). */
453
+ animation?: DrawTextAnimation;
454
+ /** Reveal the text glyph by glyph on the paint clock (orbital painter; the TS painter ignores it). */
455
+ reveal?: DrawTextReveal;
456
+ /** One line at most this wide: wider text is drawn at a smaller size so it fits, like Canvas2D fillText's maxWidth (orbital painter; not with `width`). */
457
+ maxWidth?: number;
458
+ /** Draw a caret before this character index (-1 or absent: none), blinking on the renderer clock. */
459
+ caret?: number;
460
+ /** Caret colour (theme tone or colour). */
461
+ caretColor?: string;
462
+ /** Start of the selection band, in characters. */
463
+ selectionStart?: number;
464
+ /** End of the selection band, in characters. */
465
+ selectionEnd?: number;
466
+ /** Selection band colour. */
467
+ selectionColor?: string;
468
+ /** Input-method text shown at the caret, underlined, not part of `text`. */
469
+ preedit?: string;
306
470
  }
307
471
  /** Registry/standalone stub — the host paints this atom; the DOM renders nothing. */
308
472
  declare function DrawText(_props: DrawTextProps): React__default.JSX.Element | null;
@@ -325,12 +489,14 @@ declare function DrawText(_props: DrawTextProps): React__default.JSX.Element | n
325
489
  */
326
490
 
327
491
  type MeshShapeKind = 'box' | 'sphere' | 'capsule' | 'cylinder' | 'cone' | 'torus' | 'plane' | 'circle' | 'polyhedron';
328
- type MeshMaterialKind = 'standard' | 'physical' | 'toon' | 'basic';
492
+ type MeshMaterialKind = 'standard' | 'physical' | 'toon' | 'basic' | 'shader';
493
+ type MeshMaterialBlend = 'opaque' | 'alpha' | 'additive';
329
494
  type MeshMaterialSide = 'front' | 'back' | 'double';
330
495
  /**
331
496
  * Data-driven surface description — the 3D analog of the 2D fill/gradient knobs.
332
497
  * `standard`/`physical` are lit PBR (physical adds `transmission`/`ior` for glass
333
- * and crystal), `toon` is cel-banded, `basic` is unlit flat color.
498
+ * and crystal), `toon` is cel-banded, `basic` is unlit flat color, and `shader` is
499
+ * coloured by the program's own WGSL (`wgsl`).
334
500
  */
335
501
  interface MeshMaterial {
336
502
  kind?: MeshMaterialKind;
@@ -356,6 +522,16 @@ interface MeshMaterial {
356
522
  side?: MeshMaterialSide;
357
523
  /** Albedo texture: an image URL or `data:` URI, sampled through the polyhedron's `uvs`. Multiplied by `color` — keep `color` white (or unset) to show the texture unmodified. */
358
524
  map?: string;
525
+ /** `shader` only: WGSL that declares `fn shade(px: Pixel) -> vec4<f32>`, the pixel's linear colour (it may exceed 1 for bloom) and alpha. `px` carries `world`, `local` (the point in the mesh's own space), `normal`, `view` (unit vector to the camera), `uv`, `time` (seconds on the canvas clock), the material's `color` and `emissive`, and `a`/`b` from `uniforms`. The scene's `frame` uniform (camera, lights) is in scope. */
526
+ wgsl?: string;
527
+ /** `shader` only: two vectors of four numbers the WGSL reads as `px.a` and `px.b`. */
528
+ uniforms?: MeshShaderUniforms;
529
+ /** `shader` only: how the colour meets what is behind it (default `opaque`). */
530
+ blend?: MeshMaterialBlend;
531
+ }
532
+ interface MeshShaderUniforms {
533
+ a?: number[];
534
+ b?: number[];
359
535
  }
360
536
  /** Inverted-hull toon outline: a back-face shell of the same geometry, scaled out by `width`. */
361
537
  interface MeshOutline {
@@ -391,6 +567,8 @@ interface DrawMeshKeyframe {
391
567
  interface DrawMeshAnimation {
392
568
  /** One cycle length in ms. */
393
569
  durationMs: number;
570
+ /** Epoch-ms instant on the paint clock the animation starts at (the clock of `draw-emitter`'s `startMs`); before it the first keyframe shows, and with no clock the end state. Absent: it runs from the scene clock. 2D painter only: a 3D mesh rejects it. */
571
+ startMs?: number;
394
572
  /** Loop the cycle (default true); false plays once and holds the final keyframes. */
395
573
  loop?: boolean;
396
574
  /** Keyframes ordered by `at` (0..1). */
@@ -500,9 +678,22 @@ interface DrawGroupProps extends DrawableBase {
500
678
  opacity?: number;
501
679
  /** Clip the group's items to an SVG path (`d` syntax) in world units relative to the group origin — masked reveals, meters, portraits. */
502
680
  clip?: string;
681
+ /** Paint the items into an offscreen texture of this pixel size (group-local origin at its top-left) and nothing in the frame (orbital painter). A `draw-sprite` with `texture: "target:<id>"` paints it and an SDF `material.targets` samples it. A target paints where it stands in the draw order: a reader before it reads last frame's texture; targets that read each other in a cycle are a scene error. It repaints when its items change or `live` is set. */
682
+ target?: DrawGroupTarget;
503
683
  /** The grouped drawables, painted through the normal dispatch. */
504
684
  items: DrawableNode[];
505
685
  }
686
+ /** An offscreen render target a `draw-group` paints into (orbital painter). */
687
+ interface DrawGroupTarget {
688
+ /** Id a sprite's `texture: "target:<id>"` and a material's `targets` name. */
689
+ id: string;
690
+ /** Texture width in px (a whole number above zero). */
691
+ width: number;
692
+ /** Texture height in px (a whole number above zero). */
693
+ height: number;
694
+ /** Repaint every frame (the items read the clock) instead of only when they change. */
695
+ live?: boolean;
696
+ }
506
697
  /** Registry/standalone stub — the host paints this atom; the DOM renders nothing.
507
698
  * When composed as a React child of a draw-host (Canvas2D), registers its
508
699
  * descriptor via context so the host paints it — same path as DrawShape. */
@@ -796,5 +987,5 @@ declare function bindLastDrawables(getDrawables: () => DrawableNode[] | null): v
796
987
  declare function updateAssetStatus(url: string, status: AssetLoadStatus): void;
797
988
  declare function clearVerification(): void;
798
989
 
799
- export { DrawFxLayer as A, DrawGroup as B, DrawMesh as C, DrawShape as E, DrawShapeLayer as F, DrawSkinnedMesh as G, DrawSprite as H, DrawSpriteLayer as I, DrawText as J, DrawTextLayer as K, bindConfigApplier as a, bindCanvasCapture as b, bindEventBus as c, bindLastDrawables as d, bindTraitStateGetter as e, clearVerification as f, getAllChecks as g, getBridgeHealth as h, getSnapshot as i, getSummary as j, getTraitSnapshots as k, getTransitions as l, getTransitionsForTrait as m, recordServerResponse as n, recordTransition as o, recordingTransport as p, registerCheck as q, recordOrbitalResponse as r, registerTraitSnapshot as s, serverEffectTraces as t, subscribeToVerification as u, updateAssetStatus as v, updateBridgeHealth as w, updateCheck as x, verifierAttached as y, waitForTransition as z };
800
- export type { DrawableNode as D, MeshShapeKind as M, Projector as P, TraitSnapshotGetter as T };
990
+ export { DrawFxLayer as B, DrawGroup as C, DrawMesh as E, DrawShape as F, DrawShapeLayer as G, DrawSkinnedMesh as H, DrawSprite as I, DrawSpriteLayer as J, DrawText as K, DrawTextLayer as L, bindConfigApplier as a, bindCanvasCapture as b, bindEventBus as c, bindLastDrawables as d, bindTraitStateGetter as e, clearVerification as f, getAllChecks as g, getBridgeHealth as h, getSnapshot as i, getSummary as j, getTraitSnapshots as k, getTransitions as l, getTransitionsForTrait as m, recordServerResponse as n, recordTransition as o, recordingTransport as p, registerCheck as q, recordOrbitalResponse as r, registerTraitSnapshot as s, serverEffectTraces as t, subscribeToVerification as u, updateAssetStatus as v, updateBridgeHealth as w, updateCheck as x, verifierAttached as y, waitForTransition as z };
991
+ export type { DrawableBase as A, DrawableNode as D, MeshShapeKind as M, Projector as P, TraitSnapshotGetter as T };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/shell-web",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "orbRelease": {
5
5
  "severity": "normal"
6
6
  },
@@ -129,11 +129,11 @@
129
129
  "access": "public"
130
130
  },
131
131
  "dependencies": {
132
- "@almadar/core": "^11.4.0",
133
- "@almadar/kernel": "^19.2.0",
134
- "@almadar/logger": "^2.4.0",
135
- "@almadar/std": "^17.2.1",
136
- "@almadar/syntax": "^2.2.1",
132
+ "@almadar/core": "^11.5.0",
133
+ "@almadar/kernel": "^19.3.0",
134
+ "@almadar/logger": "^2.5.0",
135
+ "@almadar/std": "^17.3.0",
136
+ "@almadar/syntax": "^2.3.0",
137
137
  "@dnd-kit/core": "^6.3.1",
138
138
  "@dnd-kit/sortable": "^10.0.0",
139
139
  "@dnd-kit/utilities": "^3.2.2",
@@ -161,11 +161,11 @@
161
161
  "remark-math": "^6.0.0",
162
162
  "tailwind-merge": "^2.2.0",
163
163
  "zod": "^4.6.7",
164
- "@almadar/shell-browser": "^1.2.0",
165
- "@almadar/shell-runtime": "^1.2.1"
164
+ "@almadar/shell-browser": "^1.3.0",
165
+ "@almadar/shell-runtime": "^1.3.0"
166
166
  },
167
167
  "devDependencies": {
168
- "@almadar/eslint-plugin": "^3.1.0",
168
+ "@almadar/eslint-plugin": "^3.2.0",
169
169
  "@tanstack/react-query": "^5.0.0",
170
170
  "@testing-library/jest-dom": "^6.4.0",
171
171
  "@testing-library/react": "^14.2.0",
@@ -459,6 +459,10 @@
459
459
  "upload.error.maxFiles": "الحد الأقصى المسموح به {{count}} ملفات",
460
460
  "upload.error.invalidType": "نوع ملف غير صالح: {{name}}",
461
461
  "upload.error.tooLarge": "الملف كبير جدًا: {{name}} (الأقصى {{size}})",
462
+ "upload.error.partial": "تعذّرت إضافة بعض الملفات: {{details}}",
463
+ "upload.reason.invalidType": "نوع غير صالح",
464
+ "upload.reason.tooLarge": "كبير جدًا، الأقصى {{size}}",
465
+ "upload.reason.overLimit": "يتجاوز حد {{count}} ملفات",
462
466
  "optionConstraint.requiredOne": "مطلوب، اختر 1",
463
467
  "optionConstraint.optionalOne": "اختياري، اختر حتى 1",
464
468
  "optionConstraint.pickExactly": "اختر بالضبط {{count}}",
@@ -958,6 +962,7 @@
958
962
  "selection.note": "ملاحظة",
959
963
  "selection.toolbar": "إجراءات التحديد",
960
964
  "qrScanner.apiUnavailable": "واجهة الكاميرا غير متاحة في هذه البيئة",
965
+ "qrScanner.decoderUnavailable": "قارئ الرموز غير متاح في هذا المتصفح",
961
966
  "aria.videoEmbed": "مشغل الفيديو",
962
967
  "videoEmbed.apiUnavailable": "تعذر تحميل مشغل الفيديو",
963
968
  "videoEmbed.invalidVideo": "عنوان الفيديو غير صالح",
@@ -1281,5 +1286,7 @@
1281
1286
  "themeToggle.light": "فاتح",
1282
1287
  "themeToggle.dark": "داكن",
1283
1288
  "agentActivity.toolDone": "{{tool}} — تم",
1284
- "agentActivity.toolFailed": "{{tool}} — تعذّر"
1289
+ "agentActivity.toolFailed": "{{tool}} — تعذّر",
1290
+ "aria.annotatedMedia": "وسائط للمراجعة",
1291
+ "aria.annotatedTimeline": "الخط الزمني للتعليقات"
1285
1292
  }
@@ -463,6 +463,10 @@
463
463
  "upload.error.maxFiles": "Maximum {{count}} files allowed",
464
464
  "upload.error.invalidType": "Invalid file type: {{name}}",
465
465
  "upload.error.tooLarge": "File too large: {{name}} (max {{size}})",
466
+ "upload.error.partial": "Some files could not be added: {{details}}",
467
+ "upload.reason.invalidType": "invalid type",
468
+ "upload.reason.tooLarge": "too large, max {{size}}",
469
+ "upload.reason.overLimit": "over the {{count}} file limit",
466
470
  "optionConstraint.requiredOne": "Required, pick 1",
467
471
  "optionConstraint.optionalOne": "Optional, pick up to 1",
468
472
  "optionConstraint.pickExactly": "Pick exactly {{count}}",
@@ -958,6 +962,7 @@
958
962
  "selection.note": "Note",
959
963
  "selection.toolbar": "Selection actions",
960
964
  "qrScanner.apiUnavailable": "Camera API not available in this environment",
965
+ "qrScanner.decoderUnavailable": "No barcode reader is available in this browser",
961
966
  "aria.videoEmbed": "Video player",
962
967
  "videoEmbed.apiUnavailable": "The video player could not be loaded",
963
968
  "videoEmbed.invalidVideo": "The video address is not valid",
@@ -1281,5 +1286,7 @@
1281
1286
  "themeToggle.light": "Light",
1282
1287
  "themeToggle.dark": "Dark",
1283
1288
  "agentActivity.toolDone": "{{tool}} — done",
1284
- "agentActivity.toolFailed": "{{tool}} — failed"
1289
+ "agentActivity.toolFailed": "{{tool}} — failed",
1290
+ "aria.annotatedMedia": "Media to review",
1291
+ "aria.annotatedTimeline": "Comment timeline"
1285
1292
  }
@@ -459,6 +459,10 @@
459
459
  "upload.error.maxFiles": "Dovoljenih je največ {{count}} datotek",
460
460
  "upload.error.invalidType": "Neveljavna vrsta datoteke: {{name}}",
461
461
  "upload.error.tooLarge": "Datoteka prevelika: {{name}} (največ {{size}})",
462
+ "upload.error.partial": "Nekaterih datotek ni bilo mogoče dodati: {{details}}",
463
+ "upload.reason.invalidType": "neveljavna vrsta",
464
+ "upload.reason.tooLarge": "prevelika, največ {{size}}",
465
+ "upload.reason.overLimit": "presega omejitev {{count}} datotek",
462
466
  "optionConstraint.requiredOne": "Obvezno, izberite 1",
463
467
  "optionConstraint.optionalOne": "Neobvezno, izberite do 1",
464
468
  "optionConstraint.pickExactly": "Izberite natanko {{count}}",
@@ -958,6 +962,7 @@
958
962
  "selection.note": "Opomba",
959
963
  "selection.toolbar": "Dejanja izbora",
960
964
  "qrScanner.apiUnavailable": "API kamere v tem okolju ni na voljo",
965
+ "qrScanner.decoderUnavailable": "Bralnik kod v tem brskalniku ni na voljo",
961
966
  "aria.videoEmbed": "Video predvajalnik",
962
967
  "videoEmbed.apiUnavailable": "Video predvajalnika ni bilo mogoče naložiti",
963
968
  "videoEmbed.invalidVideo": "Naslov videa ni veljaven",
@@ -1281,5 +1286,7 @@
1281
1286
  "themeToggle.light": "Svetla",
1282
1287
  "themeToggle.dark": "Temna",
1283
1288
  "agentActivity.toolDone": "{{tool}} — končano",
1284
- "agentActivity.toolFailed": "{{tool}} — ni uspelo"
1289
+ "agentActivity.toolFailed": "{{tool}} — ni uspelo",
1290
+ "aria.annotatedMedia": "Gradivo za pregled",
1291
+ "aria.annotatedTimeline": "Časovnica komentarjev"
1285
1292
  }
@@ -1,5 +0,0 @@
1
- export { AVL_GLYPH_KINDS, AvlGlyph } from './chunk-CCO2ZH7F.js';
2
- import './chunk-DPDKBY6Z.js';
3
- import './chunk-3UQNFRYV.js';
4
- import './chunk-D5FJU4XC.js';
5
- import './chunk-G7DCAZ22.js';
@@ -1,10 +0,0 @@
1
- export { AvlTransitionDetail } from './chunk-6RXP5ZXE.js';
2
- import './chunk-JEN4EIUF.js';
3
- import './chunk-3DA36FOA.js';
4
- import './chunk-3YUMGEEW.js';
5
- import './chunk-HA2BYO5E.js';
6
- import './chunk-PCR37T3U.js';
7
- import './chunk-V5SVGUYN.js';
8
- import './chunk-3UQNFRYV.js';
9
- import './chunk-D5FJU4XC.js';
10
- import './chunk-G7DCAZ22.js';
@@ -1,11 +0,0 @@
1
- export { AvlTransitionExplainer } from './chunk-LINJRTNB.js';
2
- import './chunk-6RXP5ZXE.js';
3
- import './chunk-JEN4EIUF.js';
4
- import './chunk-3DA36FOA.js';
5
- import './chunk-3YUMGEEW.js';
6
- import './chunk-HA2BYO5E.js';
7
- import './chunk-PCR37T3U.js';
8
- import './chunk-V5SVGUYN.js';
9
- import './chunk-3UQNFRYV.js';
10
- import './chunk-D5FJU4XC.js';
11
- import './chunk-G7DCAZ22.js';
@@ -1,10 +0,0 @@
1
- export { BehaviorView } from './chunk-B23EZH2P.js';
2
- import './chunk-RDPELAFQ.js';
3
- import './chunk-3YUMGEEW.js';
4
- import './chunk-HA2BYO5E.js';
5
- import './chunk-PCR37T3U.js';
6
- import './chunk-V5SVGUYN.js';
7
- import './chunk-3UQNFRYV.js';
8
- import './chunk-TZZBINQY.js';
9
- import './chunk-D5FJU4XC.js';
10
- import './chunk-G7DCAZ22.js';
@@ -1,23 +0,0 @@
1
- export { FlowCanvas } from './chunk-TAEOMNDK.js';
2
- import './chunk-AL2XXMYR.js';
3
- import './chunk-RDPELAFQ.js';
4
- import './chunk-CCO2ZH7F.js';
5
- import './chunk-DPDKBY6Z.js';
6
- import './chunk-3DA36FOA.js';
7
- import './chunk-3YUMGEEW.js';
8
- import './chunk-HA2BYO5E.js';
9
- import './chunk-PCR37T3U.js';
10
- import './chunk-V5SVGUYN.js';
11
- import './chunk-3UQNFRYV.js';
12
- import './chunk-LKL5RULQ.js';
13
- import './chunk-TZZBINQY.js';
14
- import './chunk-ZDRDJKYB.js';
15
- import './chunk-S3LS3B7N.js';
16
- import './chunk-GHAF7QUD.js';
17
- import './chunk-2LNXLMK3.js';
18
- import './chunk-3BBUBJFF.js';
19
- import './chunk-ANTJUQRD.js';
20
- import './chunk-D5FJU4XC.js';
21
- import './chunk-ECC3WQIB.js';
22
- import './chunk-AZ74UPG6.js';
23
- import './chunk-G7DCAZ22.js';
@@ -1,6 +0,0 @@
1
- export { ModuleCard } from './chunk-7UCL26QB.js';
2
- import './chunk-DPDKBY6Z.js';
3
- import './chunk-V5SVGUYN.js';
4
- import './chunk-3UQNFRYV.js';
5
- import './chunk-D5FJU4XC.js';
6
- import './chunk-G7DCAZ22.js';
@@ -1,23 +0,0 @@
1
- export { OrbInspector } from './chunk-TAEOMNDK.js';
2
- import './chunk-AL2XXMYR.js';
3
- import './chunk-RDPELAFQ.js';
4
- import './chunk-CCO2ZH7F.js';
5
- import './chunk-DPDKBY6Z.js';
6
- import './chunk-3DA36FOA.js';
7
- import './chunk-3YUMGEEW.js';
8
- import './chunk-HA2BYO5E.js';
9
- import './chunk-PCR37T3U.js';
10
- import './chunk-V5SVGUYN.js';
11
- import './chunk-3UQNFRYV.js';
12
- import './chunk-LKL5RULQ.js';
13
- import './chunk-TZZBINQY.js';
14
- import './chunk-ZDRDJKYB.js';
15
- import './chunk-S3LS3B7N.js';
16
- import './chunk-GHAF7QUD.js';
17
- import './chunk-2LNXLMK3.js';
18
- import './chunk-3BBUBJFF.js';
19
- import './chunk-ANTJUQRD.js';
20
- import './chunk-D5FJU4XC.js';
21
- import './chunk-ECC3WQIB.js';
22
- import './chunk-AZ74UPG6.js';
23
- import './chunk-G7DCAZ22.js';
@@ -1,23 +0,0 @@
1
- export { SlotContainedContext, SlotContentRenderer, SuspenseConfigProvider, UISlotComponent, UISlotRenderer, renderPatternProps, renderPatternValue } from './chunk-TAEOMNDK.js';
2
- import './chunk-AL2XXMYR.js';
3
- import './chunk-RDPELAFQ.js';
4
- import './chunk-CCO2ZH7F.js';
5
- import './chunk-DPDKBY6Z.js';
6
- import './chunk-3DA36FOA.js';
7
- import './chunk-3YUMGEEW.js';
8
- import './chunk-HA2BYO5E.js';
9
- import './chunk-PCR37T3U.js';
10
- import './chunk-V5SVGUYN.js';
11
- import './chunk-3UQNFRYV.js';
12
- import './chunk-LKL5RULQ.js';
13
- import './chunk-TZZBINQY.js';
14
- import './chunk-ZDRDJKYB.js';
15
- import './chunk-S3LS3B7N.js';
16
- import './chunk-GHAF7QUD.js';
17
- import './chunk-2LNXLMK3.js';
18
- import './chunk-3BBUBJFF.js';
19
- import './chunk-ANTJUQRD.js';
20
- import './chunk-D5FJU4XC.js';
21
- import './chunk-ECC3WQIB.js';
22
- import './chunk-AZ74UPG6.js';
23
- import './chunk-G7DCAZ22.js';