@mosaic-media/sdui-react 0.1.0 → 0.1.5

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 (52) hide show
  1. package/README.md +75 -1
  2. package/dist/components/controls.d.ts +13 -0
  3. package/dist/components/controls.d.ts.map +1 -1
  4. package/dist/components/controls.js +73 -4
  5. package/dist/components/controls.js.map +1 -1
  6. package/dist/components/definitions.d.ts.map +1 -1
  7. package/dist/components/definitions.js +60 -18
  8. package/dist/components/definitions.js.map +1 -1
  9. package/dist/components/definitions.layout.d.ts.map +1 -1
  10. package/dist/components/definitions.layout.js +8 -6
  11. package/dist/components/definitions.layout.js.map +1 -1
  12. package/dist/components/index.d.ts.map +1 -1
  13. package/dist/components/index.js +7 -1
  14. package/dist/components/index.js.map +1 -1
  15. package/dist/components/media.d.ts.map +1 -1
  16. package/dist/components/media.js +3 -1
  17. package/dist/components/media.js.map +1 -1
  18. package/dist/components/primitives.d.ts +7 -1
  19. package/dist/components/primitives.d.ts.map +1 -1
  20. package/dist/components/primitives.js +98 -4
  21. package/dist/components/primitives.js.map +1 -1
  22. package/dist/components/shared.d.ts +1 -1
  23. package/dist/components/shared.d.ts.map +1 -1
  24. package/dist/components/shared.js +5 -0
  25. package/dist/components/shared.js.map +1 -1
  26. package/dist/components/shell.d.ts +12 -0
  27. package/dist/components/shell.d.ts.map +1 -0
  28. package/dist/components/shell.js +34 -0
  29. package/dist/components/shell.js.map +1 -0
  30. package/dist/index.d.ts +2 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +3 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/sdui/ShellProvider.d.ts +6 -1
  35. package/dist/sdui/ShellProvider.d.ts.map +1 -1
  36. package/dist/sdui/ShellProvider.js +24 -9
  37. package/dist/sdui/ShellProvider.js.map +1 -1
  38. package/dist/sdui/artlight.d.ts +18 -0
  39. package/dist/sdui/artlight.d.ts.map +1 -0
  40. package/dist/sdui/artlight.js +196 -0
  41. package/dist/sdui/artlight.js.map +1 -0
  42. package/dist/sdui/context.d.ts +4 -0
  43. package/dist/sdui/context.d.ts.map +1 -1
  44. package/dist/sdui/context.js.map +1 -1
  45. package/dist/sdui/style.d.ts +3 -0
  46. package/dist/sdui/style.d.ts.map +1 -1
  47. package/dist/sdui/style.js +4 -0
  48. package/dist/sdui/style.js.map +1 -1
  49. package/dist/styles/components.css +168 -30
  50. package/dist/styles/global.css +7 -1
  51. package/dist/styles/tokens.css +135 -45
  52. package/package.json +7 -3
@@ -18,8 +18,9 @@
18
18
  import { registerAll } from "../sdui/registry";
19
19
  import { defineComponents } from "../sdui/template";
20
20
  import { Box, Text, Image, IconPrimitive, Pressable, Spacer, Fragment, Outlet } from "./primitives";
21
+ import { AppShell, NavItem } from "./shell";
21
22
  import { Tabs } from "./layout";
22
- import { TextInput, Switch, SelectInput, Menu, SearchBar, Slider, RatingControl, ProgressBar } from "./controls";
23
+ import { TextInput, Switch, SelectInput, Menu, SearchBar, SubmitField, Slider, RatingControl, ProgressBar, ProgressRing } from "./controls";
23
24
  import { SeasonSelector } from "./media";
24
25
  import { Skeleton } from "./feedback";
25
26
  import { PLATFORM_DEFINITIONS } from "./definitions";
@@ -40,10 +41,14 @@ export function installComponents() {
40
41
  Spacer,
41
42
  Fragment,
42
43
  Outlet,
44
+ // 1. primitives — the server-emitted app frame (ADR 0031)
45
+ AppShell,
46
+ NavItem,
43
47
  // 1. primitives — interactive / stateful (own their state)
44
48
  Tabs,
45
49
  Menu,
46
50
  SearchBar,
51
+ SubmitField,
47
52
  TextInput,
48
53
  Switch,
49
54
  SelectInput,
@@ -52,6 +57,7 @@ export function installComponents() {
52
57
  SeasonSelector,
53
58
  // 1. primitives — computed / animated
54
59
  ProgressBar,
60
+ ProgressRing,
55
61
  Skeleton,
56
62
  });
57
63
  // 2. definitions — every composition, as data.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,kDAAkD;AAElD;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACpG,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACjH,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,iFAAiF;AACjF,MAAM,UAAU,iBAAiB;IAC/B,IAAI,SAAS;QAAE,OAAO;IACtB,SAAS,GAAG,IAAI,CAAC;IAEjB,WAAW,CAAC;QACV,iCAAiC;QACjC,GAAG;QACH,IAAI;QACJ,KAAK;QACL,IAAI,EAAE,aAAa;QACnB,SAAS;QACT,MAAM;QACN,QAAQ;QACR,MAAM;QAEN,2DAA2D;QAC3D,IAAI;QACJ,IAAI;QACJ,SAAS;QACT,SAAS;QACT,MAAM;QACN,WAAW;QACX,MAAM;QACN,aAAa;QACb,cAAc;QAEd,sCAAsC;QACtC,WAAW;QACX,QAAQ;KACT,CAAC,CAAC;IAEH,+CAA+C;IAC/C,gBAAgB,CAAC,CAAC,GAAG,oBAAoB,EAAE,GAAG,kBAAkB,CAAC,CAAC,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,kDAAkD;AAElD;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACpG,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5I,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,iFAAiF;AACjF,MAAM,UAAU,iBAAiB;IAC/B,IAAI,SAAS;QAAE,OAAO;IACtB,SAAS,GAAG,IAAI,CAAC;IAEjB,WAAW,CAAC;QACV,iCAAiC;QACjC,GAAG;QACH,IAAI;QACJ,KAAK;QACL,IAAI,EAAE,aAAa;QACnB,SAAS;QACT,MAAM;QACN,QAAQ;QACR,MAAM;QAEN,0DAA0D;QAC1D,QAAQ;QACR,OAAO;QAEP,2DAA2D;QAC3D,IAAI;QACJ,IAAI;QACJ,SAAS;QACT,WAAW;QACX,SAAS;QACT,MAAM;QACN,WAAW;QACX,MAAM;QACN,aAAa;QACb,cAAc;QAEd,sCAAsC;QACtC,WAAW;QACX,YAAY;QACZ,QAAQ;KACT,CAAC,CAAC;IAEH,+CAA+C;IAC/C,gBAAgB,CAAC,CAAC,GAAG,oBAAoB,EAAE,GAAG,kBAAkB,CAAC,CAAC,CAAC;AACrE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/components/media.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAMpD,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAsBxD"}
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/components/media.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAMpD,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAwBxD"}
@@ -6,7 +6,9 @@ import { cx } from "./shared";
6
6
  export function SeasonSelector({ node }) {
7
7
  const { emit } = useRuntime();
8
8
  const seasons = prop(node, "seasons", []);
9
- const [active, setActive] = useState(seasons[0]?.id);
9
+ // `selected` lets the server keep the highlight in step with the season it
10
+ // rendered (a season switch re-navigates); absent, it defaults to the first.
11
+ const [active, setActive] = useState(prop(node, "selected", undefined) ?? seasons[0]?.id);
10
12
  return (_jsx("div", { className: "msc-seasons", role: "tablist", children: seasons.map((s) => (_jsx("button", { role: "tab", "aria-selected": active === s.id, className: cx("msc-seasons__pill", active === s.id && "is-active"), onClick: () => {
11
13
  setActive(s.id);
12
14
  emit(s.action);
@@ -1 +1 @@
1
- {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/components/media.tsx"],"names":[],"mappings":";AAUA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAE9B,MAAM,UAAU,cAAc,CAAC,EAAE,IAAI,EAAoB;IACvD,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAwD,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IACjG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrD,OAAO,CACL,cAAK,SAAS,EAAC,aAAa,EAAC,IAAI,EAAC,SAAS,YACxC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,iBAEE,IAAI,EAAC,KAAK,mBACK,MAAM,KAAK,CAAC,CAAC,EAAE,EAC9B,SAAS,EAAE,EAAE,CAAC,mBAAmB,EAAE,MAAM,KAAK,CAAC,CAAC,EAAE,IAAI,WAAW,CAAC,EAClE,OAAO,EAAE,GAAG,EAAE;gBACZ,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAChB,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACjB,CAAC,YAEA,CAAC,CAAC,KAAK,IATH,CAAC,CAAC,EAAE,CAUF,CACV,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/components/media.tsx"],"names":[],"mappings":";AAUA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAE9B,MAAM,UAAU,cAAc,CAAC,EAAE,IAAI,EAAoB;IACvD,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAwD,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IACjG,2EAA2E;IAC3E,6EAA6E;IAC7E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAqB,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9G,OAAO,CACL,cAAK,SAAS,EAAC,aAAa,EAAC,IAAI,EAAC,SAAS,YACxC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,iBAEE,IAAI,EAAC,KAAK,mBACK,MAAM,KAAK,CAAC,CAAC,EAAE,EAC9B,SAAS,EAAE,EAAE,CAAC,mBAAmB,EAAE,MAAM,KAAK,CAAC,CAAC,EAAE,IAAI,WAAW,CAAC,EAClE,OAAO,EAAE,GAAG,EAAE;gBACZ,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAChB,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACjB,CAAC,YAEA,CAAC,CAAC,KAAK,IATH,CAAC,CAAC,EAAE,CAUF,CACV,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -7,7 +7,13 @@ export declare function Box({ node }: {
7
7
  export declare function Text({ node }: {
8
8
  node: UINode;
9
9
  }): import("react").JSX.Element;
10
- /** Image — falls back to a typed placeholder when `src` is absent. */
10
+ /** Image — falls back to a typed placeholder when `src` is absent.
11
+ *
12
+ * Opt-in `artLight` makes the image a source for the ambient "refraction"
13
+ * wash (sdui/artlight.ts): "ambient" installs its palette as the screen's
14
+ * standing light (the hero backdrop); "focus" lends its palette while hovered
15
+ * (a poster), reverting on leave. Sampling is web-only and best-effort — if the
16
+ * canvas is unreadable it does nothing and the fallback duo stays. */
11
17
  export declare function Image({ node }: {
12
18
  node: UINode;
13
19
  }): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/components/primitives.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAOpD,sEAAsE;AACtE,wBAAgB,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAO7C;AAED,iFAAiF;AACjF,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAS9C;AAED,sEAAsE;AACtE,wBAAgB,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAe/C;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAMvD;AAED,8EAA8E;AAC9E,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAmBnD;AAED,8CAA8C;AAC9C,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAUhD;AAED,2DAA2D;AAC3D,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAElD;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAEhD"}
1
+ {"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/components/primitives.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAQpD,sEAAsE;AACtE,wBAAgB,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAO7C;AAED,iFAAiF;AACjF,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAS9C;AAED;;;;;;uEAMuE;AACvE,wBAAgB,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAoG/C;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAMvD;AAED,8EAA8E;AAC9E,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAmBnD;AAED,8CAA8C;AAC9C,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAUhD;AAED,2DAA2D;AAC3D,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAElD;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAEhD"}
@@ -1,8 +1,23 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ // SPDX-FileCopyrightText: 2026 the Mosaic authors
4
+ /*
5
+ * The primitive layer — the irreducible building blocks from which every
6
+ * presentational component (and every module-defined component) is composed.
7
+ * They take the token-based style vocabulary from sdui/style.ts and nothing
8
+ * else, so the same node tree renders on any client.
9
+ *
10
+ * Box / Text / Image / Icon / Spacer are pure presentation. Pressable is the
11
+ * one interactive primitive here: it carries an Action and a built-in hover
12
+ * affordance, because interaction feedback (not arbitrary :hover styling) is a
13
+ * primitive's job. Fragment / Outlet exist for the template mechanism.
14
+ */
15
+ import { useEffect, useRef, useState } from "react";
2
16
  import { prop } from "../sdui/registry";
3
17
  import { Children } from "../sdui/Renderer";
4
18
  import { useRuntime } from "../sdui/context";
5
19
  import { boxToCss, textToCss } from "../sdui/style";
20
+ import { sampleArtColors, setAmbientArt, focusArt, releaseArt, clearAmbientArt } from "../sdui/artlight";
6
21
  import { cx, Icon } from "./shared";
7
22
  /** Box — the workhorse container: flex layout + token box styling. */
8
23
  export function Box({ node }) {
@@ -15,18 +30,97 @@ export function Text({ node }) {
15
30
  const style = prop(node, "style", {});
16
31
  return (_jsxs("span", { style: textToCss(style), children: [value, node.children ? _jsx(Children, { nodes: node.children }) : null] }));
17
32
  }
18
- /** Image — falls back to a typed placeholder when `src` is absent. */
33
+ /** Image — falls back to a typed placeholder when `src` is absent.
34
+ *
35
+ * Opt-in `artLight` makes the image a source for the ambient "refraction"
36
+ * wash (sdui/artlight.ts): "ambient" installs its palette as the screen's
37
+ * standing light (the hero backdrop); "focus" lends its palette while hovered
38
+ * (a poster), reverting on leave. Sampling is web-only and best-effort — if the
39
+ * canvas is unreadable it does nothing and the fallback duo stays. */
19
40
  export function Image({ node }) {
20
41
  const src = prop(node, "src", undefined);
21
42
  const alt = prop(node, "alt", "");
22
43
  const fit = prop(node, "fit", "cover");
23
44
  const placeholder = prop(node, "placeholder", undefined);
45
+ const placeholderMode = prop(node, "placeholderMode", "label");
46
+ const artLight = prop(node, "artLight", undefined);
24
47
  const style = prop(node, "style", {});
25
48
  const css = boxToCss(style);
26
- if (!src) {
27
- return (_jsx("div", { className: "msc-prim-placeholder", style: { ...css, alignItems: "center", justifyContent: "center" }, children: placeholder && _jsx("span", { children: placeholder.slice(0, 14) }) }));
49
+ const imgRef = useRef(null);
50
+ const palette = useRef(null);
51
+ // artLight needs a CORS-anonymous request so the canvas is readable, but a CDN
52
+ // that sends no CORS headers then fails the request and the image never shows.
53
+ // On such a failure we retry once without crossOrigin: the image displays, and
54
+ // only its ambient sampling is lost.
55
+ const [corsBlocked, setCorsBlocked] = useState(false);
56
+ // A src that fails even without crossOrigin (a genuine 404 / missing art)
57
+ // falls through to the typed placeholder rather than a broken-image icon.
58
+ const [failed, setFailed] = useState(false);
59
+ const sample = () => {
60
+ const el = imgRef.current;
61
+ if (!el || !el.complete || el.naturalWidth === 0)
62
+ return null;
63
+ if (!palette.current)
64
+ palette.current = sampleArtColors(el);
65
+ return palette.current;
66
+ };
67
+ // The ambient source owns the standing light for as long as it's mounted.
68
+ useEffect(() => {
69
+ if (artLight !== "ambient")
70
+ return;
71
+ const el = imgRef.current;
72
+ if (el?.complete)
73
+ setAmbientArt(sample());
74
+ return () => clearAmbientArt();
75
+ // eslint-disable-next-line react-hooks/exhaustive-deps
76
+ }, [artLight, src]);
77
+ if (!src || failed) {
78
+ // "label" shows a truncated type label (poster placeholders); "initials"
79
+ // condenses a name to 1–2 letters (avatar-sized placeholders).
80
+ const text = placeholder === undefined
81
+ ? undefined
82
+ : placeholderMode === "initials"
83
+ ? placeholder
84
+ .split(/\s+/)
85
+ .filter(Boolean)
86
+ .slice(0, 2)
87
+ .map((w) => w[0])
88
+ .join("")
89
+ .toUpperCase()
90
+ : placeholder.slice(0, 14);
91
+ return (_jsx("div", { className: "msc-prim-placeholder", style: { ...css, alignItems: "center", justifyContent: "center" }, children: text && _jsx("span", { children: text }) }));
28
92
  }
29
- return _jsx("img", { src: src, alt: alt, loading: "lazy", style: { ...css, display: "block", objectFit: fit } });
93
+ const useCors = artLight !== undefined && !corsBlocked;
94
+ const artProps = artLight
95
+ ? {
96
+ ...(useCors ? { crossOrigin: "anonymous" } : {}),
97
+ onLoad: () => {
98
+ palette.current = null;
99
+ if (artLight === "ambient")
100
+ setAmbientArt(sample());
101
+ },
102
+ ...(artLight === "focus"
103
+ ? {
104
+ onMouseEnter: () => {
105
+ const c = sample();
106
+ if (c)
107
+ focusArt(c);
108
+ },
109
+ onMouseLeave: () => releaseArt(),
110
+ }
111
+ : {}),
112
+ }
113
+ : {};
114
+ // On load failure: first drop crossOrigin (a CORS-less CDN blocks the
115
+ // anonymous request — the image is fine, the request isn't), then, if a plain
116
+ // load still fails, give up to the placeholder.
117
+ const onError = () => {
118
+ if (useCors)
119
+ setCorsBlocked(true);
120
+ else
121
+ setFailed(true);
122
+ };
123
+ return (_jsx("img", { ref: imgRef, src: src, alt: alt, loading: artLight === "ambient" ? "eager" : "lazy", style: { ...css, display: "block", objectFit: fit }, onError: onError, ...artProps }, useCors ? "cors" : "plain"));
30
124
  }
31
125
  /** Icon — a glyph from the built-in set, tokenised colour + size. */
32
126
  export function IconPrimitive({ node }) {
@@ -1 +1 @@
1
- {"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/components/primitives.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/components/primitives.tsx"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import type { UINode } from "../sdui/types";
3
3
  export declare function cx(...parts: Array<string | false | null | undefined>): string;
4
4
  /** Read an optional `action` prop off a node and return a click handler. */
5
5
  export declare function useNodeAction(node: UINode): () => void;
6
- export type IconName = "play" | "search" | "chevron-right" | "chevron-down" | "star" | "plus" | "check" | "close" | "dots" | "info" | "warning" | "error" | "success" | "external" | "grid" | "list";
6
+ export type IconName = "play" | "search" | "chevron-right" | "chevron-left" | "chevron-down" | "star" | "plus" | "check" | "close" | "dots" | "info" | "warning" | "error" | "success" | "external" | "grid" | "list" | "home" | "settings" | "sun" | "moon";
7
7
  export declare function Icon({ name, size, style, className, }: {
8
8
  name: IconName;
9
9
  size?: number | string;
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/components/shared.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,wBAAgB,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,CAE7E;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAItD;AAED,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,QAAQ,GACR,eAAe,GACf,cAAc,GACd,MAAM,GACN,MAAM,GACN,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,SAAS,GACT,OAAO,GACP,SAAS,GACT,UAAU,GACV,MAAM,GACN,MAAM,CAAC;AAuBX,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,IAAY,EACZ,KAAK,EACL,SAAS,GACV,EAAE;IACD,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAoBA"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/components/shared.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,wBAAgB,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,CAE7E;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAItD;AAED,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,QAAQ,GACR,eAAe,GACf,cAAc,GACd,cAAc,GACd,MAAM,GACN,MAAM,GACN,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,SAAS,GACT,OAAO,GACP,SAAS,GACT,UAAU,GACV,MAAM,GACN,MAAM,GACN,MAAM,GACN,UAAU,GACV,KAAK,GACL,MAAM,CAAC;AA4BX,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,IAAY,EACZ,KAAK,EACL,SAAS,GACV,EAAE;IACD,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAoBA"}
@@ -14,6 +14,7 @@ const PATHS = {
14
14
  play: "M8 5v14l11-7z",
15
15
  search: "M10 4a6 6 0 104.9 9.5l4.3 4.3 1.4-1.4-4.3-4.3A6 6 0 0010 4zm0 2a4 4 0 110 8 4 4 0 010-8z",
16
16
  "chevron-right": "M9 6l6 6-6 6",
17
+ "chevron-left": "M15 6l-6 6 6 6",
17
18
  "chevron-down": "M6 9l6 6 6-6",
18
19
  star: "M12 3.5l2.6 5.3 5.9.9-4.3 4.1 1 5.8-5.2-2.7-5.2 2.7 1-5.8L3.5 9.7l5.9-.9z",
19
20
  plus: "M12 5v14M5 12h14",
@@ -27,6 +28,10 @@ const PATHS = {
27
28
  external: "M14 5h5v5M19 5l-8 8M12 5H6a1 1 0 00-1 1v12a1 1 0 001 1h12a1 1 0 001-1v-6",
28
29
  grid: "M4 4h7v7H4zM13 4h7v7h-7zM4 13h7v7H4zM13 13h7v7h-7z",
29
30
  list: "M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01",
31
+ home: "M3 11l9-8 9 8M5 10v10h5v-6h4v6h5V10",
32
+ settings: "M3 6h11M18 6h3M16.5 4.5v3M3 12h5M12 12h9M9.5 10.5v3M3 18h11M18 18h3M16.5 16.5v3",
33
+ sun: "M12 8a4 4 0 100 8 4 4 0 000-8zM12 2v2M12 20v2M2 12h2M20 12h2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M19.1 4.9l-1.4 1.4M6.3 17.7l-1.4 1.4",
34
+ moon: "M20 14.5A8 8 0 019.5 4 8 8 0 1020 14.5z",
30
35
  };
31
36
  const FILLED = { play: true, star: true };
32
37
  export function Icon({ name, size = "1em", style, className, }) {
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/components/shared.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,MAAM,UAAU,EAAE,CAAC,GAAG,KAA+C;IACnE,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAqB,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACnE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAoBD,MAAM,KAAK,GAA6B;IACtC,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,0FAA0F;IAClG,eAAe,EAAE,cAAc;IAC/B,cAAc,EAAE,cAAc;IAC9B,IAAI,EAAE,2EAA2E;IACjF,IAAI,EAAE,kBAAkB;IACxB,KAAK,EAAE,gBAAgB;IACvB,KAAK,EAAE,sBAAsB;IAC7B,IAAI,EAAE,+BAA+B;IACrC,IAAI,EAAE,uDAAuD;IAC7D,OAAO,EAAE,iCAAiC;IAC1C,KAAK,EAAE,oDAAoD;IAC3D,OAAO,EAAE,+CAA+C;IACxD,QAAQ,EAAE,0EAA0E;IACpF,IAAI,EAAE,oDAAoD;IAC1D,IAAI,EAAE,mDAAmD;CAC1D,CAAC;AAEF,MAAM,MAAM,GAAuC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAE9E,MAAM,UAAU,IAAI,CAAC,EACnB,IAAI,EACJ,IAAI,GAAG,KAAK,EACZ,KAAK,EACL,SAAS,GAMV;IACC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,EACpC,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,OAAO,EAAC,WAAW,EACnB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,EACtC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,EACxC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAC7B,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,KAAK,EAAE,KAAK,iBACA,MAAM,EAClB,SAAS,EAAC,OAAO,YAEjB,eAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAI,GACpB,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/components/shared.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,MAAM,UAAU,EAAE,CAAC,GAAG,KAA+C;IACnE,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAqB,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACnE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAyBD,MAAM,KAAK,GAA6B;IACtC,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,0FAA0F;IAClG,eAAe,EAAE,cAAc;IAC/B,cAAc,EAAE,gBAAgB;IAChC,cAAc,EAAE,cAAc;IAC9B,IAAI,EAAE,2EAA2E;IACjF,IAAI,EAAE,kBAAkB;IACxB,KAAK,EAAE,gBAAgB;IACvB,KAAK,EAAE,sBAAsB;IAC7B,IAAI,EAAE,+BAA+B;IACrC,IAAI,EAAE,uDAAuD;IAC7D,OAAO,EAAE,iCAAiC;IAC1C,KAAK,EAAE,oDAAoD;IAC3D,OAAO,EAAE,+CAA+C;IACxD,QAAQ,EAAE,0EAA0E;IACpF,IAAI,EAAE,oDAAoD;IAC1D,IAAI,EAAE,mDAAmD;IACzD,IAAI,EAAE,qCAAqC;IAC3C,QAAQ,EAAE,iFAAiF;IAC3F,GAAG,EAAE,oIAAoI;IACzI,IAAI,EAAE,yCAAyC;CAChD,CAAC;AAEF,MAAM,MAAM,GAAuC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAE9E,MAAM,UAAU,IAAI,CAAC,EACnB,IAAI,EACJ,IAAI,GAAG,KAAK,EACZ,KAAK,EACL,SAAS,GAMV;IACC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,EACpC,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,OAAO,EAAC,WAAW,EACnB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,EACtC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,EACxC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAC7B,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,KAAK,EAAE,KAAK,iBACA,MAAM,EAClB,SAAS,EAAC,OAAO,YAEjB,eAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAI,GACpB,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { UINode } from "../sdui/types";
2
+ /** AppShell — the frame: a sidebar (brand, a "nav" slot, an optional "foot"
3
+ * slot), a "topbar" slot, and a "content" region the current screen fills. */
4
+ export declare function AppShell({ node }: {
5
+ node: UINode;
6
+ }): import("react").JSX.Element;
7
+ /** NavItem — a sidebar navigation button. It emits its action and highlights
8
+ * when the runtime's current screen matches its target. */
9
+ export declare function NavItem({ node }: {
10
+ node: UINode;
11
+ }): import("react").JSX.Element;
12
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/components/shell.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAKpD;+EAC+E;AAC/E,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BA2BlD;AAED;4DAC4D;AAC5D,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAkBjD"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ // SPDX-FileCopyrightText: 2026 the Mosaic authors
4
+ /*
5
+ * The application frame, server-emitted (ADR 0031). The Shell app owns no
6
+ * layout — it renders whatever AppShell the Platform pushes. These are
7
+ * structural primitives (like Box/Outlet): a named-slot frame the token style
8
+ * system does not express, reusing the chrome CSS in styles/components.css.
9
+ */
10
+ import { prop } from "../sdui/registry";
11
+ import { Slot, hasSlot } from "../sdui/Renderer";
12
+ import { useRuntime } from "../sdui/context";
13
+ import { Icon } from "./shared";
14
+ /** AppShell — the frame: a sidebar (brand, a "nav" slot, an optional "foot"
15
+ * slot), a "topbar" slot, and a "content" region the current screen fills. */
16
+ export function AppShell({ node }) {
17
+ const title = prop(node, "title", "Mosaic");
18
+ return (_jsxs("div", { className: "msc-app", children: [_jsxs("aside", { className: "msc-sidebar", children: [_jsx("div", { className: "msc-sidebar__brand", children: _jsx("span", { className: "msc-sidebar__name", children: title }) }), _jsx("nav", { className: "msc-sidebar__nav", children: _jsx(Slot, { node: node, name: "nav" }) }), hasSlot(node, "foot") && (_jsx("div", { className: "msc-sidebar__foot", children: _jsx(Slot, { node: node, name: "foot" }) }))] }), _jsxs("div", { className: "msc-main", children: [_jsx("header", { className: "msc-topbar", children: _jsx(Slot, { node: node, name: "topbar" }) }), _jsx("main", { className: "msc-content", children: _jsx(Slot, { node: node, name: "content" }) })] })] }));
19
+ }
20
+ /** NavItem — a sidebar navigation button. It emits its action and highlights
21
+ * when the runtime's current screen matches its target. */
22
+ export function NavItem({ node }) {
23
+ const label = prop(node, "label", "");
24
+ const icon = prop(node, "icon", "info");
25
+ const target = prop(node, "screen", undefined);
26
+ const action = prop(node, "action", undefined);
27
+ const { emit, screen } = useRuntime();
28
+ const active = target !== undefined && screen === target;
29
+ return (_jsxs("button", { className: `msc-navitem${active ? " is-active" : ""}`, onClick: () => {
30
+ if (action)
31
+ emit(action);
32
+ }, children: [_jsx(Icon, { name: icon }), _jsx("span", { children: label })] }));
33
+ }
34
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/components/shell.tsx"],"names":[],"mappings":";AAAA,yCAAyC;AACzC,kDAAkD;AAElD;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAiB,MAAM,UAAU,CAAC;AAE/C;+EAC+E;AAC/E,MAAM,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAoB;IACjD,MAAM,KAAK,GAAG,IAAI,CAAS,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACpD,OAAO,CACL,eAAK,SAAS,EAAC,SAAS,aACtB,iBAAO,SAAS,EAAC,aAAa,aAC5B,cAAK,SAAS,EAAC,oBAAoB,YACjC,eAAM,SAAS,EAAC,mBAAmB,YAAE,KAAK,GAAQ,GAC9C,EACN,cAAK,SAAS,EAAC,kBAAkB,YAC/B,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,KAAK,GAAG,GAC3B,EACL,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CACxB,cAAK,SAAS,EAAC,mBAAmB,YAChC,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,MAAM,GAAG,GAC5B,CACP,IACK,EACR,eAAK,SAAS,EAAC,UAAU,aACvB,iBAAQ,SAAS,EAAC,YAAY,YAC5B,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,QAAQ,GAAG,GAC3B,EACT,eAAM,SAAS,EAAC,aAAa,YAC3B,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,SAAS,GAAG,GAC9B,IACH,IACF,CACP,CAAC;AACJ,CAAC;AAED;4DAC4D;AAC5D,MAAM,UAAU,OAAO,CAAC,EAAE,IAAI,EAAoB;IAChD,MAAM,KAAK,GAAG,IAAI,CAAS,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAW,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAqB,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,IAAI,CAAqB,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACnE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,MAAM,CAAC;IACzD,OAAO,CACL,kBACE,SAAS,EAAE,cAAc,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,EACrD,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,MAAM;gBAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC,aAED,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,GAAI,EACpB,yBAAO,KAAK,GAAQ,IACb,CACV,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -10,6 +10,8 @@ export { useRuntime, ShellRuntimeContext } from "./sdui/context";
10
10
  export type { ShellRuntime, OverlayHandle } from "./sdui/context";
11
11
  export { boxToCss, textToCss } from "./sdui/style";
12
12
  export type { BoxStyle, TextStyle, ColorToken, SpaceToken, RadiusToken } from "./sdui/style";
13
+ export { sampleArtColors, setAmbientArt, focusArt, releaseArt, clearAmbientArt, refreshArtLight } from "./sdui/artlight";
14
+ export type { Rgb } from "./sdui/artlight";
13
15
  export { installComponents } from "./components";
14
16
  export { OverlayHost, ToastHost } from "./components/host";
15
17
  export { Icon, cx } from "./components/shared";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAG9F,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACxF,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGzE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAGtE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACpE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACjE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGlE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAC/C,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAClE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAG9F,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACxF,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGzE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAGtE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACpE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACjE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGlE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAI7F,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACzH,YAAY,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAG3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAC/C,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAClE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -17,6 +17,9 @@ export { ShellProvider } from "./sdui/ShellProvider";
17
17
  export { useRuntime, ShellRuntimeContext } from "./sdui/context";
18
18
  // Token-based style vocabulary.
19
19
  export { boxToCss, textToCss } from "./sdui/style";
20
+ // Art-light: the artwork-driven ambient "refraction" wash. The Image primitive
21
+ // drives it via `artLight`; consumers only need refreshArtLight() on theme change.
22
+ export { sampleArtColors, setAmbientArt, focusArt, releaseArt, clearAmbientArt, refreshArtLight } from "./sdui/artlight";
20
23
  // The built-in component vocabulary (primitives + definitions).
21
24
  export { installComponents } from "./components";
22
25
  export { OverlayHost, ToastHost } from "./components/host";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,yEAAyE;AACzE,gFAAgF;AAChF,sEAAsE;AACtE,8EAA8E;AAC9E,+DAA+D;AAC/D,EAAE;AACF,wEAAwE;AAKxE,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGxF,sBAAsB;AACtB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEtE,6CAA6C;AAC7C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGpE,8BAA8B;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGjE,gCAAgC;AAChC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGnD,gEAAgE;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAG/C,oEAAoE;AACpE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,yEAAyE;AACzE,gFAAgF;AAChF,sEAAsE;AACtE,8EAA8E;AAC9E,+DAA+D;AAC/D,EAAE;AACF,wEAAwE;AAKxE,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGxF,sBAAsB;AACtB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEtE,6CAA6C;AAC7C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGpE,8BAA8B;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGjE,gCAAgC;AAChC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGnD,+EAA+E;AAC/E,mFAAmF;AACnF,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGzH,gEAAgE;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAG/C,oEAAoE;AACpE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -18,7 +18,12 @@ interface ShellProviderProps {
18
18
  dismissOverlay: () => void;
19
19
  dismissToast: (id: string) => void;
20
20
  }) => ReactNode;
21
+ /** Live session (ADR 0032): when present, an Invoke action is sent up the
22
+ * socket instead of run as a one-shot GraphQL mutation, and onInput streams a
23
+ * field value for search-as-you-type. Absent → the request/response path. */
24
+ onInvoke?: (mutation: string, input?: Record<string, unknown>) => void;
25
+ onInput?: (value: string) => void;
21
26
  }
22
- export declare function ShellProvider({ screen, onNavigate, onBack, children, render }: ShellProviderProps): import("react").JSX.Element;
27
+ export declare function ShellProvider({ screen, onNavigate, onBack, children, render, onInvoke, onInput }: ShellProviderProps): import("react").JSX.Element;
23
28
  export {};
24
29
  //# sourceMappingURL=ShellProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ShellProvider.d.ts","sourceRoot":"","sources":["../../src/sdui/ShellProvider.tsx"],"names":[],"mappings":"AASA,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACvE,OAAO,KAAK,EAAwB,IAAI,EAAU,MAAM,SAAS,CAAC;AAClE,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAGpE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACvE,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,6EAA6E;IAC7E,MAAM,EAAE,CAAC,EAAE,EAAE;QAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QAAC,MAAM,EAAE,SAAS,EAAE,CAAC;QAAC,cAAc,EAAE,MAAM,IAAI,CAAC;QAAC,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,KAAK,SAAS,CAAC;CAC/I;AAKD,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,kBAAkB,+BAwHjG"}
1
+ {"version":3,"file":"ShellProvider.d.ts","sourceRoot":"","sources":["../../src/sdui/ShellProvider.tsx"],"names":[],"mappings":"AASA,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACvE,OAAO,KAAK,EAAwB,IAAI,EAAU,MAAM,SAAS,CAAC;AAClE,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAGpE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACvE,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,6EAA6E;IAC7E,MAAM,EAAE,CAAC,EAAE,EAAE;QAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QAAC,MAAM,EAAE,SAAS,EAAE,CAAC;QAAC,cAAc,EAAE,MAAM,IAAI,CAAC;QAAC,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,KAAK,SAAS,CAAC;IAC9I;;kFAE8E;IAC9E,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACvE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAKD,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,kBAAkB,+BAuIpH"}
@@ -11,7 +11,7 @@ import { ShellRuntimeContext } from "./context";
11
11
  import { gql, PlatformError } from "../lib/platform";
12
12
  let seq = 0;
13
13
  const nextId = (p) => `${p}-${++seq}`;
14
- export function ShellProvider({ screen, onNavigate, onBack, children, render }) {
14
+ export function ShellProvider({ screen, onNavigate, onBack, children, render, onInvoke, onInput }) {
15
15
  const [overlays, setOverlays] = useState([]);
16
16
  const [toasts, setToasts] = useState([]);
17
17
  const pushToast = useCallback((message, tone = "neutral") => {
@@ -69,14 +69,29 @@ export function ShellProvider({ screen, onNavigate, onBack, children, render })
69
69
  // skeleton we acknowledge the intent.
70
70
  pushToast(`Play requested for part ${action.partId}`, "accent");
71
71
  return { ok: true };
72
- case "invoke":
72
+ case "invoke": {
73
+ // In a live session, hand the mutation to the socket; the server runs
74
+ // it and pushes the result (a toast, a re-render).
75
+ if (onInvoke) {
76
+ onInvoke(action.mutation, action.input);
77
+ return { ok: true };
78
+ }
79
+ const document = `mutation Shell($input: JSON) { ${action.mutation}(input: $input) }`;
80
+ try {
81
+ const data = await gql(document, { input: action.input });
82
+ return { ok: true, data };
83
+ }
84
+ catch (e) {
85
+ const err = e instanceof PlatformError
86
+ ? { category: e.category, message: e.message }
87
+ : { category: "Internal", message: "Unexpected error" };
88
+ pushToast(err.message, "danger");
89
+ return { ok: false, error: err };
90
+ }
91
+ }
73
92
  case "query": {
74
- const document = action.kind === "invoke"
75
- ? `mutation Shell($input: JSON) { ${action.mutation}(input: $input) }`
76
- : action.query;
77
- const variables = action.kind === "invoke" ? { input: action.input } : action.variables;
78
93
  try {
79
- const data = await gql(document, variables);
94
+ const data = await gql(action.query, action.variables);
80
95
  return { ok: true, data };
81
96
  }
82
97
  catch (e) {
@@ -99,12 +114,12 @@ export function ShellProvider({ screen, onNavigate, onBack, children, render })
99
114
  default:
100
115
  return { ok: false, error: { category: "InvalidArgument", message: "Unknown action" } };
101
116
  }
102
- }, [onNavigate, onBack, dismissOverlay, pushToast]);
117
+ }, [onNavigate, onBack, dismissOverlay, pushToast, onInvoke]);
103
118
  const emit = useCallback((action) => {
104
119
  if (action)
105
120
  void dispatch(action);
106
121
  }, [dispatch]);
107
- const runtime = useMemo(() => ({ dispatch, emit, screen }), [dispatch, emit, screen]);
122
+ const runtime = useMemo(() => ({ dispatch, emit, screen, input: onInput }), [dispatch, emit, screen, onInput]);
108
123
  return (_jsxs(ShellRuntimeContext.Provider, { value: runtime, children: [children, render({ overlays, toasts, dismissOverlay, dismissToast })] }));
109
124
  }
110
125
  //# sourceMappingURL=ShellProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ShellProvider.js","sourceRoot":"","sources":["../../src/sdui/ShellProvider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ShellProvider.js","sourceRoot":"","sources":["../../src/sdui/ShellProvider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export type Rgb = [number, number, number];
2
+ /**
3
+ * Sample up to `max` vibrant, hue-distinct colours from a loaded, origin-clean
4
+ * image. Returns null if the canvas is unreadable (tainted / not ready) or the
5
+ * image has no colour worth reflecting — the caller then keeps the duo.
6
+ */
7
+ export declare function sampleArtColors(img: HTMLImageElement, max?: number): Rgb[] | null;
8
+ /** Make `colors` the standing ambient light (the screen's focused artwork). */
9
+ export declare function setAmbientArt(colors: Rgb[] | null): void;
10
+ /** Temporarily override the wash — e.g. while a poster is hovered. */
11
+ export declare function focusArt(colors: Rgb[]): void;
12
+ /** Release a transient focus, falling back to the standing ambient (or duo). */
13
+ export declare function releaseArt(): void;
14
+ /** Drop the standing ambient entirely (e.g. leaving a screen) → back to the duo. */
15
+ export declare function clearAmbientArt(): void;
16
+ /** Repaint the standing ambient — call after a theme change so alpha follows. */
17
+ export declare function refreshArtLight(): void;
18
+ //# sourceMappingURL=artlight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artlight.d.ts","sourceRoot":"","sources":["../../src/sdui/artlight.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAgH3C;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,SAAI,GAAG,GAAG,EAAE,GAAG,IAAI,CAuC5E;AAeD,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAGxD;AAED,sEAAsE;AACtE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAE5C;AAED,gFAAgF;AAChF,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,oFAAoF;AACpF,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAED,iFAAiF;AACjF,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}