@elaraai/e3-ui 1.0.83 → 1.0.84

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 (69) hide show
  1. package/dist/src/bind/record.d.ts +229 -4
  2. package/dist/src/bind/record.d.ts.map +1 -1
  3. package/dist/src/bind/record.js +245 -5
  4. package/dist/src/bind/record.js.map +1 -1
  5. package/dist/src/index.d.ts +2 -1
  6. package/dist/src/index.d.ts.map +1 -1
  7. package/dist/src/index.js +4 -1
  8. package/dist/src/index.js.map +1 -1
  9. package/dist/src/internal.d.ts +2 -1
  10. package/dist/src/internal.d.ts.map +1 -1
  11. package/dist/src/internal.js +5 -1
  12. package/dist/src/internal.js.map +1 -1
  13. package/dist/src/studio/builder.d.ts +3123 -0
  14. package/dist/src/studio/builder.d.ts.map +1 -0
  15. package/dist/src/studio/builder.js +115 -0
  16. package/dist/src/studio/builder.js.map +1 -0
  17. package/dist/src/studio/canvas.d.ts +83 -0
  18. package/dist/src/studio/canvas.d.ts.map +1 -0
  19. package/dist/src/studio/canvas.js +71 -0
  20. package/dist/src/studio/canvas.js.map +1 -0
  21. package/dist/src/studio/component.d.ts +178 -0
  22. package/dist/src/studio/component.d.ts.map +1 -0
  23. package/dist/src/studio/component.js +189 -0
  24. package/dist/src/studio/component.js.map +1 -0
  25. package/dist/src/studio/index.d.ts +104 -0
  26. package/dist/src/studio/index.d.ts.map +1 -0
  27. package/dist/src/studio/index.js +75 -0
  28. package/dist/src/studio/index.js.map +1 -0
  29. package/dist/src/studio/inspector.d.ts +208 -0
  30. package/dist/src/studio/inspector.d.ts.map +1 -0
  31. package/dist/src/studio/inspector.js +155 -0
  32. package/dist/src/studio/inspector.js.map +1 -0
  33. package/dist/src/studio/library.d.ts +3506 -0
  34. package/dist/src/studio/library.d.ts.map +1 -0
  35. package/dist/src/studio/library.js +245 -0
  36. package/dist/src/studio/library.js.map +1 -0
  37. package/dist/src/studio/page.d.ts +305 -0
  38. package/dist/src/studio/page.d.ts.map +1 -0
  39. package/dist/src/studio/page.js +105 -0
  40. package/dist/src/studio/page.js.map +1 -0
  41. package/dist/src/studio/pages.d.ts +10929 -0
  42. package/dist/src/studio/pages.d.ts.map +1 -0
  43. package/dist/src/studio/pages.js +502 -0
  44. package/dist/src/studio/pages.js.map +1 -0
  45. package/dist/src/studio/palette.d.ts +179 -0
  46. package/dist/src/studio/palette.d.ts.map +1 -0
  47. package/dist/src/studio/palette.js +120 -0
  48. package/dist/src/studio/palette.js.map +1 -0
  49. package/dist/src/studio/publish.d.ts +397 -0
  50. package/dist/src/studio/publish.d.ts.map +1 -0
  51. package/dist/src/studio/publish.js +198 -0
  52. package/dist/src/studio/publish.js.map +1 -0
  53. package/dist/test/bind/record/record.examples.d.ts +65 -1
  54. package/dist/test/bind/record/record.examples.d.ts.map +1 -1
  55. package/dist/test/bind/record/record.examples.js +21 -3
  56. package/dist/test/bind/record/record.examples.js.map +1 -1
  57. package/dist/test/studio/component.examples.d.ts +7 -0
  58. package/dist/test/studio/component.examples.d.ts.map +1 -0
  59. package/dist/test/studio/component.examples.js +46 -0
  60. package/dist/test/studio/component.examples.js.map +1 -0
  61. package/dist/test/studio/page.examples.d.ts +7 -0
  62. package/dist/test/studio/page.examples.d.ts.map +1 -0
  63. package/dist/test/studio/page.examples.js +64 -0
  64. package/dist/test/studio/page.examples.js.map +1 -0
  65. package/dist/test/studio/studio.examples.d.ts +1766 -0
  66. package/dist/test/studio/studio.examples.d.ts.map +1 -0
  67. package/dist/test/studio/studio.examples.js +354 -0
  68. package/dist/test/studio/studio.examples.js.map +1 -0
  69. package/package.json +9 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/studio/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * `<Studio.Builder>` (#1000) — the builder as one component: the open page's
7
+ * canvas under its one toolbar, the palette before it and the inspector after
8
+ * it, and the publish preview, which Preview and Publish open in the canvas's
9
+ * place.
10
+ *
11
+ * The builder is an interface — the pages record bound with its patch, the
12
+ * listed components, the project, and the preview's words — which the
13
+ * `StudioBuilder` renderer draws. Its parts are the renderer's: the palette
14
+ * (#994), the canvas (#995), the inspector (#996) and the publish preview
15
+ * (#998), each computed in East by this package and drawn in the browser.
16
+ * `<Studio.Library>` opens pages in it, shared by `id`.
17
+ *
18
+ * @packageDocumentation
19
+ */
20
+ import { ArrayType, OptionType, StringType, StructType, none, some, } from "@elaraai/east";
21
+ import { EastUI, optionsTag, } from "@elaraai/east-ui/internal";
22
+ import { StudioComponentType } from "./component.js";
23
+ import { StudioPagesHandleType } from "./pages.js";
24
+ // ============================================================================
25
+ // The renderer's payload
26
+ // ============================================================================
27
+ /**
28
+ * The `StudioBuilder` renderer's payload — the builder's interface.
29
+ *
30
+ * @property pages - The pages record, bound with its patch — what the builder reads, and saves and publishes through
31
+ * @property components - The components the surface lists, in palette order
32
+ * @property project - The project whose pages the builder opens
33
+ * @property env - Where the publish preview publishes to — its Env pill, and "Publish vN to <env>"
34
+ * @property audience - Who sees a published page — the preview's Audience row
35
+ * @property rollout - When they see it — the preview's Rollout row
36
+ * @property id - Names the builder, when a surface holds two — and the page library that opens its pages
37
+ */
38
+ export const StudioBuilderPayloadType = StructType({
39
+ pages: StudioPagesHandleType,
40
+ components: ArrayType(StudioComponentType),
41
+ project: StringType,
42
+ env: OptionType(StringType),
43
+ audience: OptionType(StringType),
44
+ rollout: OptionType(StringType),
45
+ id: OptionType(StringType),
46
+ });
47
+ /**
48
+ * Internal {@link EastUI.component} carrier. The React renderer registers
49
+ * against this in `@elaraai/e3-ui-components` via `implementUIComponent`.
50
+ */
51
+ export const StudioBuilderComponent = EastUI.component("StudioBuilder", StudioBuilderPayloadType, { optional: true });
52
+ /**
53
+ * The builder: the open page's canvas, with the palette and the inspector
54
+ * beside it, and the publish preview.
55
+ *
56
+ * @remarks
57
+ * - **The canvas** is the open page's grid under the builder's one toolbar —
58
+ * the page's status, the grid chip, the zoom, the history item, Desktop ·
59
+ * Tablet, Save as template, Preview and Publish. Every gesture is a draft
60
+ * the history item undoes, and Apply saves the page as one patch commit.
61
+ * - **The palette**, before the canvas, is its component library: the listed
62
+ * components by category, each naming what it reads, dragged onto the grid;
63
+ * and the project's pages, a click opening one.
64
+ * - **The inspector**, after it, is the selected placement: its component,
65
+ * what it reads, its description, and its span, row, height and alignment.
66
+ * - **Preview** and **Publish** open the publish preview in the canvas's
67
+ * place, full-bleed — the open page as it will publish, what changed since
68
+ * its live version, and Save as draft and Publish; **Exit** returns to the
69
+ * canvas, its drafts as they were.
70
+ *
71
+ * The builder fills its parent's height and draws no border around itself.
72
+ * The page open in it is shared by `id` with a `<Studio.Library>`, which
73
+ * opens pages in it.
74
+ *
75
+ * @param options - The bound record, the listed components, the project and the preview's words ({@link StudioBuilderOptions})
76
+ * @returns An East expression of type `UIComponentType`
77
+ *
78
+ * @example
79
+ * ```tsx
80
+ * import { East } from "@elaraai/east";
81
+ * import { Reactive, UIComponentType } from "@elaraai/east-ui";
82
+ * import { Record, Studio, ui } from "@elaraai/e3-ui";
83
+ *
84
+ * // The builder, for operators: it reads the pages and writes their patch.
85
+ * export const builder = ui("builder", [], East.function([], UIComponentType, _$ => (
86
+ * <Reactive>{$ => {
87
+ * const components = $.let([kpiRail, revenueTrend, breakdownBars]);
88
+ * const pages = $.let(Record.bind(d.pages, [d.pagesPatch]));
89
+ * return <Studio.Builder pages={pages} components={components} project="Ops console"
90
+ * env="Staging" audience="Field ops · 24 users" rollout="Immediate" />;
91
+ * }}</Reactive>
92
+ * )));
93
+ * ```
94
+ */
95
+ function createBuilder(options) {
96
+ return StudioBuilderComponent.Root({
97
+ pages: { read: options.pages.read, history: options.pages.history, commit: { patch: options.pages.commit.patch } },
98
+ components: options.components,
99
+ project: options.project,
100
+ env: options.env === undefined ? none : some(options.env),
101
+ audience: options.audience === undefined ? none : some(options.audience),
102
+ rollout: options.rollout === undefined ? none : some(options.rollout),
103
+ id: options.id === undefined ? none : some(options.id),
104
+ });
105
+ }
106
+ // ============================================================================
107
+ // Tag
108
+ // ============================================================================
109
+ /**
110
+ * `<Studio.Builder>` — the builder as one component: the open page's canvas,
111
+ * the palette and the inspector beside it, and the publish preview. See
112
+ * {@link createBuilder}.
113
+ */
114
+ export const StudioBuilder = optionsTag(createBuilder);
115
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/studio/builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACH,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,EACV,IAAI,EACJ,IAAI,GAGP,MAAM,eAAe,CAAC;AACvB,OAAO,EACH,MAAM,EACN,UAAU,GAIb,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAA0B,MAAM,YAAY,CAAC;AAE3E,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,UAAU,CAAC;IAC/C,KAAK,EAAE,qBAAqB;IAC5B,UAAU,EAAE,SAAS,CAAC,mBAAmB,CAAC;IAC1C,OAAO,EAAE,UAAU;IACnB,GAAG,EAAE,UAAU,CAAC,UAAU,CAAC;IAC3B,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC;IAChC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC;IAC/B,EAAE,EAAE,UAAU,CAAC,UAAU,CAAC;CAC7B,CAAC,CAAC;AAKH;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,wBAAwB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAkCtH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,SAAS,aAAa,CAAC,OAA6B;IAChD,OAAO,sBAAsB,CAAC,IAAI,CAAC;QAC/B,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE;QAClH,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,EAAE,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QACzD,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxE,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QACrE,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;KACzD,CAAC,CAAC;AACP,CAAC;AAED,+EAA+E;AAC/E,MAAM;AACN,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAA+C,UAAU,CAAC,aAAa,CAAC,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * The builder's canvas (#995) — what its tiles and its toolbar's Save as
7
+ * template show, for the `StudioBuilder` renderer, which draws the canvas: the
8
+ * open page's grid under the builder's one toolbar, every gesture a draft of
9
+ * the page's editing session and Apply one patch commit on the page.
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ import { ArrayType, AsyncFunctionType, BooleanType, DictType, OptionType, SetType, StringType, StructType } from "@elaraai/east";
14
+ /**
15
+ * A listed component, as its placements' tiles show it on the canvas.
16
+ *
17
+ * @property frame - Drawn in a tile frame, or bare
18
+ * @property name - Its name — a placement's label when it has no title of its own
19
+ * @property icon - Its icon, in the selection bar
20
+ * @property meta - Its key and the datasets it reads, in the selection bar
21
+ */
22
+ export declare const CanvasTileType: StructType<{
23
+ readonly frame: BooleanType;
24
+ readonly name: StringType;
25
+ readonly icon: StringType;
26
+ readonly meta: StringType;
27
+ }>;
28
+ /**
29
+ * Each listed component's tile, by key: framed or bare, its name and icon,
30
+ * and its meta line — its key and the datasets and records its code reads,
31
+ * joined with ` · ` ("revenue_trend · sales_daily"). A key two components
32
+ * share keeps the first one's tile.
33
+ */
34
+ export declare const canvasTiles: import("@elaraai/east").CallableFunctionExpr<[ArrayType<StructType<{
35
+ readonly key: StringType;
36
+ readonly name: StringType;
37
+ readonly category: StringType;
38
+ readonly icon: StringType;
39
+ readonly span: import("@elaraai/east").IntegerType;
40
+ readonly description: OptionType<StringType>;
41
+ readonly frame: import("@elaraai/east").VariantType<{
42
+ readonly card: import("@elaraai/east").NullType;
43
+ readonly none: import("@elaraai/east").NullType;
44
+ }>;
45
+ readonly tags: ArrayType<StringType>;
46
+ readonly collections: ArrayType<StringType>;
47
+ readonly deprecated: BooleanType;
48
+ readonly reads: StructType<{
49
+ readonly paths: ArrayType<ArrayType<import("@elaraai/east").VariantType<{
50
+ readonly field: StringType;
51
+ }>>>;
52
+ readonly functions: ArrayType<StringType>;
53
+ readonly records: ArrayType<StringType>;
54
+ readonly pages: ArrayType<ArrayType<import("@elaraai/east").VariantType<{
55
+ readonly field: StringType;
56
+ }>>>;
57
+ }>;
58
+ readonly fingerprint: StringType;
59
+ readonly render: import("@elaraai/east").FunctionType<[], import("@elaraai/east").RecursiveType<import("@elaraai/east-ui").UIComponentNode>>;
60
+ }>>], DictType<StringType, StructType<{
61
+ readonly frame: BooleanType;
62
+ readonly name: StringType;
63
+ readonly icon: StringType;
64
+ readonly meta: StringType;
65
+ }>>>;
66
+ /**
67
+ * The builder toolbar's Save as template, as the `StudioBuilder` renderer
68
+ * draws it: its button, and the popover beside it that names the template.
69
+ *
70
+ * @property title - The open page's title — the popover's head names it, and offers a name from it
71
+ * @property enabled - Whether the open entry is a page, which it saves; a template is not saved again
72
+ * @property taken - The names the project holds, pages and templates — the template's must be none of them
73
+ * @property onSave - Saves the open page, as last saved, as a template under a name — one commit; `none` when it was saved, else what refused it
74
+ */
75
+ export declare const StudioSaveTemplatePayloadType: StructType<{
76
+ readonly title: StringType;
77
+ readonly enabled: BooleanType;
78
+ readonly taken: SetType<StringType>;
79
+ readonly onSave: AsyncFunctionType<[StringType], OptionType<StringType>>;
80
+ }>;
81
+ /** Type representing the builder toolbar's Save as template. */
82
+ export type StudioSaveTemplatePayloadType = typeof StudioSaveTemplatePayloadType;
83
+ //# sourceMappingURL=canvas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../../src/studio/canvas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,EACH,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,QAAQ,EAER,UAAU,EACV,OAAO,EACP,UAAU,EACV,UAAU,EACb,MAAM,eAAe,CAAC;AAOvB;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc;;;;;EAKzB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqBvB,CAAC;AAMF;;;;;;;;GAQG;AACH,eAAO,MAAM,6BAA6B;;;;;EAKxC,CAAC;AAEH,gEAAgE;AAChE,MAAM,MAAM,6BAA6B,GAAG,OAAO,6BAA6B,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * The builder's canvas (#995) — what its tiles and its toolbar's Save as
7
+ * template show, for the `StudioBuilder` renderer, which draws the canvas: the
8
+ * open page's grid under the builder's one toolbar, every gesture a draft of
9
+ * the page's editing session and Apply one patch commit on the page.
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ import { ArrayType, AsyncFunctionType, BooleanType, DictType, East, OptionType, SetType, StringType, StructType, } from "@elaraai/east";
14
+ import { StudioComponentType } from "./component.js";
15
+ // ============================================================================
16
+ // What a placement's tile shows
17
+ // ============================================================================
18
+ /**
19
+ * A listed component, as its placements' tiles show it on the canvas.
20
+ *
21
+ * @property frame - Drawn in a tile frame, or bare
22
+ * @property name - Its name — a placement's label when it has no title of its own
23
+ * @property icon - Its icon, in the selection bar
24
+ * @property meta - Its key and the datasets it reads, in the selection bar
25
+ */
26
+ export const CanvasTileType = StructType({
27
+ frame: BooleanType,
28
+ name: StringType,
29
+ icon: StringType,
30
+ meta: StringType,
31
+ });
32
+ /**
33
+ * Each listed component's tile, by key: framed or bare, its name and icon,
34
+ * and its meta line — its key and the datasets and records its code reads,
35
+ * joined with ` · ` ("revenue_trend · sales_daily"). A key two components
36
+ * share keeps the first one's tile.
37
+ */
38
+ export const canvasTiles = East.function([ArrayType(StudioComponentType)], DictType(StringType, CanvasTileType), ($, components) => {
39
+ const tiles = $.let(new Map(), DictType(StringType, CanvasTileType));
40
+ $.for(components, ($2, component) => {
41
+ const reads = $2.let(component.reads.paths.concat(component.reads.pages)
42
+ .map((_$3, path) => path.get(path.size().subtract(1n)).unwrap("field")));
43
+ const meta = $2.let(reads.size().equal(0n).ifElse(() => component.key, () => East.str `${component.key} · ${reads.stringJoin(" · ")}`));
44
+ $2(tiles.insertOrUpdate(component.key, {
45
+ frame: component.frame.hasTag("card"),
46
+ name: component.name,
47
+ icon: component.icon,
48
+ meta,
49
+ }, (_$3, existing) => existing));
50
+ });
51
+ return tiles;
52
+ });
53
+ // ============================================================================
54
+ // Save as template — the toolbar's item
55
+ // ============================================================================
56
+ /**
57
+ * The builder toolbar's Save as template, as the `StudioBuilder` renderer
58
+ * draws it: its button, and the popover beside it that names the template.
59
+ *
60
+ * @property title - The open page's title — the popover's head names it, and offers a name from it
61
+ * @property enabled - Whether the open entry is a page, which it saves; a template is not saved again
62
+ * @property taken - The names the project holds, pages and templates — the template's must be none of them
63
+ * @property onSave - Saves the open page, as last saved, as a template under a name — one commit; `none` when it was saved, else what refused it
64
+ */
65
+ export const StudioSaveTemplatePayloadType = StructType({
66
+ title: StringType,
67
+ enabled: BooleanType,
68
+ taken: SetType(StringType),
69
+ onSave: AsyncFunctionType([StringType], OptionType(StringType)),
70
+ });
71
+ //# sourceMappingURL=canvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../../src/studio/canvas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,EACH,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,UAAU,EACV,OAAO,EACP,UAAU,EACV,UAAU,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACrC,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;CACnB,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CACpC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,EAChC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,EACpC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE;IACd,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;aACnE,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAC7C,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,EACnB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAA,GAAG,SAAS,CAAC,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAChE,CAAC,CAAC;QACH,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,EAAE;YACnC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YACrC,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,IAAI;SACP,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACjB,CAAC,CACJ,CAAC;AAEF,+EAA+E;AAC/E,wCAAwC;AACxC,+EAA+E;AAE/E;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,UAAU,CAAC;IACpD,KAAK,EAAE,UAAU;IACjB,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC;IAC1B,MAAM,EAAE,iBAAiB,CAAC,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;CAClE,CAAC,CAAC"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Studio components (#991) — a component is self-contained: an East UI
7
+ * function written exactly like a `ui()` body, which binds its own data, sets
8
+ * up its own slices and returns its UI. Different data is a different
9
+ * component.
10
+ *
11
+ * `Studio.component(key, meta, fn)` returns it as a `Studio.Types.Component`
12
+ * struct, the way `Slice.config` returns a slice config: what the palette
13
+ * shows, what the function reads, the fingerprint of its code, and the
14
+ * function itself. A surface lists the components it offers, and the Studio's
15
+ * renderers draw a placement by calling its component's function, so a
16
+ * surface's `ui()` task holds every listed component's function and its
17
+ * manifest is the union of theirs.
18
+ *
19
+ * @packageDocumentation
20
+ */
21
+ import { ArrayType, BooleanType, FunctionType, IntegerType, NullType, OptionType, StringType, StructType, VariantType, type CallableFunctionExpr, type ExprType, type IR } from "@elaraai/east";
22
+ import { UIComponentType } from "@elaraai/east-ui/internal";
23
+ /**
24
+ * How a component's placements are drawn.
25
+ *
26
+ * @property card - In a tile frame (the default)
27
+ * @property none - Bare, on the canvas and published alike
28
+ */
29
+ export declare const StudioFrameType: VariantType<{
30
+ readonly card: NullType;
31
+ readonly none: NullType;
32
+ }>;
33
+ /** Type representing how a component's placements are drawn. */
34
+ export type StudioFrameType = typeof StudioFrameType;
35
+ /** Literal shorthand for {@link StudioFrameType}. */
36
+ export type StudioFrameLiteral = "card" | "none";
37
+ /**
38
+ * A Studio component — what the palette shows, what the component reads, the
39
+ * fingerprint of its code, and the East UI function that renders it.
40
+ *
41
+ * @property key - The component's identity; a cell stores it
42
+ * @property name - Its name, in the palette and the inspector
43
+ * @property category - The palette group it sits in
44
+ * @property icon - A Font Awesome solid icon name
45
+ * @property span - The span a new placement takes, in columns of 12
46
+ * @property description - What it shows — the inspector's "fixed by developer" block
47
+ * @property frame - Drawn in a tile frame, or bare
48
+ * @property tags - Its tags, which the palette's Filter menu offers
49
+ * @property collections - Its collections, which the palette's Filter menu offers
50
+ * @property deprecated - Hidden from the palette; placements keep rendering
51
+ * @property reads - The datasets, functions and records its function binds, derived from its code
52
+ * @property fingerprint - A hash of its code; a cell stores it when placed and when its page publishes, so a code change since shows
53
+ * @property render - The East UI function that renders it
54
+ */
55
+ export declare const StudioComponentType: StructType<{
56
+ readonly key: StringType;
57
+ readonly name: StringType;
58
+ readonly category: StringType;
59
+ readonly icon: StringType;
60
+ readonly span: IntegerType;
61
+ readonly description: OptionType<StringType>;
62
+ readonly frame: VariantType<{
63
+ readonly card: NullType;
64
+ readonly none: NullType;
65
+ }>;
66
+ readonly tags: ArrayType<StringType>;
67
+ readonly collections: ArrayType<StringType>;
68
+ readonly deprecated: BooleanType;
69
+ readonly reads: StructType<{
70
+ readonly paths: ArrayType<ArrayType<VariantType<{
71
+ readonly field: StringType;
72
+ }>>>;
73
+ readonly functions: ArrayType<StringType>;
74
+ readonly records: ArrayType<StringType>;
75
+ readonly pages: ArrayType<ArrayType<VariantType<{
76
+ readonly field: StringType;
77
+ }>>>;
78
+ }>;
79
+ readonly fingerprint: StringType;
80
+ readonly render: FunctionType<[], import("@elaraai/east").RecursiveType<import("@elaraai/east-ui").UIComponentNode>>;
81
+ }>;
82
+ /** Type representing a Studio component. */
83
+ export type StudioComponentType = typeof StudioComponentType;
84
+ /**
85
+ * What the palette shows of a component — its `meta`. Only `name`,
86
+ * `category` and `icon` are required.
87
+ *
88
+ * @property name - Its name, in the palette and the inspector
89
+ * @property category - The palette group it sits in
90
+ * @property icon - A Font Awesome solid icon name
91
+ * @property span - The span a new placement takes; `12n` when omitted
92
+ * @property description - What it shows — the inspector's "fixed by developer" block
93
+ * @property frame - `"card"` (the default) or `"none"`, which renders bare
94
+ * @property tags - Its tags, which the palette's Filter menu offers
95
+ * @property collections - Its collections, which the palette's Filter menu offers
96
+ * @property deprecated - Hidden from the palette; placements keep rendering
97
+ */
98
+ export interface StudioComponentMeta {
99
+ /** Its name, in the palette and the inspector. */
100
+ name: string;
101
+ /** The palette group it sits in. */
102
+ category: string;
103
+ /** A Font Awesome solid icon name. */
104
+ icon: string;
105
+ /** The span a new placement takes, in columns of 12; `12n` when omitted. */
106
+ span?: bigint;
107
+ /** What it shows — the inspector's "fixed by developer" block. */
108
+ description?: string;
109
+ /** `"card"` (the default) or `"none"`, which renders bare, on the canvas and published. */
110
+ frame?: StudioFrameLiteral;
111
+ /** Its tags, which the palette's Filter menu offers. */
112
+ tags?: string[];
113
+ /** Its collections, which the palette's Filter menu offers. */
114
+ collections?: string[];
115
+ /** Hidden from the palette; placements keep rendering. */
116
+ deprecated?: boolean;
117
+ }
118
+ /**
119
+ * A function's fingerprint: the SHA-256 of its IR in canonical form. The same
120
+ * code fingerprints the same; a change to it changes the fingerprint.
121
+ *
122
+ * @param fn - The function
123
+ * @returns The fingerprint, hex
124
+ */
125
+ export declare function fingerprintOf(fn: {
126
+ toIR(): {
127
+ ir: IR;
128
+ };
129
+ }): string;
130
+ /**
131
+ * Declares a Studio component — a self-contained East UI function, and what
132
+ * the palette shows of it.
133
+ *
134
+ * @remarks
135
+ * `fn` is exactly what `ui()` takes, so a component written for a `ui()` body
136
+ * moves into `Studio.component` unchanged. Its `reads` come from its code
137
+ * (`deriveManifest`), and its `fingerprint` from its IR — neither is written.
138
+ * Call it at module scope or inside an East function, as `Slice.config` is.
139
+ *
140
+ * @param key - The component's identity; a cell stores it
141
+ * @param meta - What the palette shows ({@link StudioComponentMeta})
142
+ * @param fn - The East UI function that renders it
143
+ * @returns The component, a {@link StudioComponentType} value
144
+ *
145
+ * @example
146
+ * ```tsx
147
+ * import { East, IntegerType, NullType } from "@elaraai/east";
148
+ * import { Button, HStack, Reactive, State, Text, UIComponentType } from "@elaraai/east-ui";
149
+ * import { Studio } from "@elaraai/e3-ui";
150
+ *
151
+ * // A counter: its own state, shared by every placement of it.
152
+ * export const counter = Studio.component("counter", {
153
+ * name: "Counter", category: "Display", icon: "gauge-high", span: 4n,
154
+ * description: "Clicks so far",
155
+ * }, East.function([], UIComponentType, _$ => (
156
+ * <Reactive>{$ => {
157
+ * const clicks = $.let(State.bind([IntegerType], "counter.clicks", 0n));
158
+ * const add = $.const(East.function([], NullType, $2 => { $2(clicks.write(clicks.read().add(1n))); }));
159
+ * return (
160
+ * <HStack gap="3" align="center">
161
+ * <Text>{East.str`${East.print(clicks.read())} clicks`}</Text>
162
+ * <Button size="xs" onClick={add}>Add</Button>
163
+ * </HStack>
164
+ * );
165
+ * }}</Reactive>
166
+ * )));
167
+ * ```
168
+ */
169
+ declare function createComponent(key: string, meta: StudioComponentMeta, fn: CallableFunctionExpr<[], typeof UIComponentType>): ExprType<StudioComponentType>;
170
+ /** What {@link createComponent} is, on the `Studio` namespace. */
171
+ export interface StudioComponentNamespace {
172
+ /** Declares a component ({@link createComponent}). */
173
+ component: typeof createComponent;
174
+ }
175
+ /** The component half of the `Studio` namespace. */
176
+ export declare const StudioComponents: StudioComponentNamespace;
177
+ export {};
178
+ //# sourceMappingURL=component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../../src/studio/component.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACH,SAAS,EACT,WAAW,EAEX,YAAY,EAEZ,WAAW,EACX,QAAQ,EACR,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EAMX,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EACb,KAAK,EAAE,EACV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAQ5D;;;;;GAKG;AACH,eAAO,MAAM,eAAe;;;EAG1B,CAAC;AAEH,gEAAgE;AAChE,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC;AAErD,qDAAqD;AACrD,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;EAc9B,CAAC;AAEH,4CAA4C;AAC5C,MAAM,MAAM,mBAAmB,GAAG,OAAO,mBAAmB,CAAC;AAE7D;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,mBAAmB;IAChC,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2FAA2F;IAC3F,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AA8CD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE;IAAE,IAAI,IAAI;QAAE,EAAE,EAAE,EAAE,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,CAEhE;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,iBAAS,eAAe,CACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,mBAAmB,EACzB,EAAE,EAAE,oBAAoB,CAAC,EAAE,EAAE,OAAO,eAAe,CAAC,GACrD,QAAQ,CAAC,mBAAmB,CAAC,CAiB/B;AAED,kEAAkE;AAClE,MAAM,WAAW,wBAAwB;IACrC,sDAAsD;IACtD,SAAS,EAAE,OAAO,eAAe,CAAC;CACrC;AAED,oDAAoD;AACpD,eAAO,MAAM,gBAAgB,EAAE,wBAE9B,CAAC"}