@echothink-ui/templates 0.2.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.
- package/dist/index.cjs +429 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +395 -0
- package/dist/index.js.map +1 -0
- package/dist/templates/bright-events.d.ts +2 -0
- package/dist/templates/glass-flowchart.d.ts +2 -0
- package/dist/templates/soft-card-campaign.d.ts +2 -0
- package/dist/templates/studio-dark-check-box.d.ts +2 -0
- package/dist/types.d.ts +36 -0
- package/package.json +43 -0
- package/src/__tests__/templates.test.tsx +74 -0
- package/src/index.ts +38 -0
- package/src/templates/bright-events.ts +64 -0
- package/src/templates/glass-flowchart.ts +84 -0
- package/src/templates/soft-card-campaign.ts +135 -0
- package/src/templates/studio-dark-check-box.ts +68 -0
- package/src/types.ts +84 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
TemplateRegistry: () => TemplateRegistry,
|
|
24
|
+
brightEventsTemplate: () => brightEventsTemplate,
|
|
25
|
+
collectComponentNames: () => collectComponentNames,
|
|
26
|
+
createTemplateRegistry: () => createTemplateRegistry,
|
|
27
|
+
glassFlowchartTemplate: () => glassFlowchartTemplate,
|
|
28
|
+
softCardCampaignTemplate: () => softCardCampaignTemplate,
|
|
29
|
+
studioDarkCheckBoxTemplate: () => studioDarkCheckBoxTemplate,
|
|
30
|
+
templateCatalog: () => templateCatalog
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(index_exports);
|
|
33
|
+
|
|
34
|
+
// src/templates/soft-card-campaign.ts
|
|
35
|
+
var import_layout = require("@echothink-ui/layout");
|
|
36
|
+
var campaignColumns = [
|
|
37
|
+
{ key: "name", header: "Campaign" },
|
|
38
|
+
{ key: "channel", header: "Channel" },
|
|
39
|
+
{ key: "statusLabel", header: "Status" },
|
|
40
|
+
{ key: "audience", header: "Audience", align: "end" },
|
|
41
|
+
{ key: "updated", header: "Updated" }
|
|
42
|
+
];
|
|
43
|
+
var campaignRows = [
|
|
44
|
+
{ id: "c1", name: "Taste the Future", channel: "Instagram + Ads", statusLabel: "Running", audience: "10,000", updated: "24 Sep" },
|
|
45
|
+
{ id: "c2", name: "Cybersecurity Week", channel: "Facebook", statusLabel: "In Progress", audience: "6,420", updated: "22 Sep" },
|
|
46
|
+
{ id: "c3", name: "E-learning Essentials", channel: "Email", statusLabel: "Approval", audience: "3,890", updated: "21 Sep" }
|
|
47
|
+
];
|
|
48
|
+
var channelChart = [
|
|
49
|
+
{ label: "Mon", sent: 32, opened: 19 },
|
|
50
|
+
{ label: "Tue", sent: 46, opened: 22 },
|
|
51
|
+
{ label: "Wed", sent: 38, opened: 27 },
|
|
52
|
+
{ label: "Thu", sent: 54, opened: 31 },
|
|
53
|
+
{ label: "Fri", sent: 49, opened: 36 }
|
|
54
|
+
];
|
|
55
|
+
var softCardCampaignTemplate = {
|
|
56
|
+
id: "soft-card-campaign",
|
|
57
|
+
name: "Soft card campaign",
|
|
58
|
+
description: "Campaign dashboard with a master/detail configuration panel.",
|
|
59
|
+
stylePreset: "soft-card",
|
|
60
|
+
tags: ["dashboard", "marketing", "crud", "soft-card"],
|
|
61
|
+
layout: (0, import_layout.layout)({
|
|
62
|
+
id: "soft-card-campaign",
|
|
63
|
+
type: "PageLayout.AdminShell",
|
|
64
|
+
styleIntent: { preset: "soft-card", taskMode: "crud" },
|
|
65
|
+
slots: {
|
|
66
|
+
topbar: (0, import_layout.fragmentSlot)(
|
|
67
|
+
[
|
|
68
|
+
(0, import_layout.componentSlot)("CarbonSectionHeader", { title: "Metricmap" }),
|
|
69
|
+
(0, import_layout.componentSlot)("CarbonSearchInput", { placeholder: "Search campaigns" }),
|
|
70
|
+
(0, import_layout.componentSlot)("CarbonButton", { label: "New campaign", intent: "primary" })
|
|
71
|
+
],
|
|
72
|
+
{ op: "stack", direction: "horizontal", slots: [] }
|
|
73
|
+
),
|
|
74
|
+
navigation: (0, import_layout.componentSlot)("CarbonSideNav", {
|
|
75
|
+
items: [
|
|
76
|
+
{ label: "Summary of Key Metrics", href: "#summary" },
|
|
77
|
+
{ label: "Recent Campaigns", href: "#recent", current: true },
|
|
78
|
+
{ label: "Performance Snapshot", href: "#performance" },
|
|
79
|
+
{ label: "Integrations", href: "#integrations" },
|
|
80
|
+
{ label: "Social Media Metrics", href: "#social" }
|
|
81
|
+
]
|
|
82
|
+
}),
|
|
83
|
+
content: (0, import_layout.layoutSlot)(
|
|
84
|
+
(0, import_layout.layout)({
|
|
85
|
+
id: "campaign-split",
|
|
86
|
+
type: "Primitive.SplitPane",
|
|
87
|
+
variant: "horizontal",
|
|
88
|
+
composition: {
|
|
89
|
+
op: "parallel",
|
|
90
|
+
axis: "x",
|
|
91
|
+
slots: ["primary", "secondary"],
|
|
92
|
+
sizing: { primary: { basis: "1.7fr" }, secondary: { basis: "1fr" } }
|
|
93
|
+
},
|
|
94
|
+
slots: {
|
|
95
|
+
primary: (0, import_layout.fragmentSlot)(
|
|
96
|
+
[
|
|
97
|
+
(0, import_layout.componentSlot)("CarbonPageHeader", {
|
|
98
|
+
title: "Recent Campaign",
|
|
99
|
+
description: "Campaign configuration, audience rules, and channel performance in one workspace."
|
|
100
|
+
}),
|
|
101
|
+
(0, import_layout.fragmentSlot)(
|
|
102
|
+
[
|
|
103
|
+
(0, import_layout.componentSlot)("CarbonKPIBlock", { title: "Sent", value: "203 Mail", description: "+6% from last week" }),
|
|
104
|
+
(0, import_layout.componentSlot)("CarbonKPIBlock", { title: "Opened", value: "18%", description: "+3% from last week" }),
|
|
105
|
+
(0, import_layout.componentSlot)("CarbonKPIBlock", { title: "Conversions", value: "42", description: "12 awaiting review" })
|
|
106
|
+
],
|
|
107
|
+
{ op: "stack", direction: "horizontal", slots: [] }
|
|
108
|
+
),
|
|
109
|
+
(0, import_layout.componentSlot)("CarbonChartBlock", {
|
|
110
|
+
title: "Channel performance",
|
|
111
|
+
subtitle: "Chosen period versus last period",
|
|
112
|
+
chartType: "bar",
|
|
113
|
+
data: channelChart,
|
|
114
|
+
series: [
|
|
115
|
+
{ key: "sent", label: "Chosen period" },
|
|
116
|
+
{ key: "opened", label: "Last period" }
|
|
117
|
+
]
|
|
118
|
+
}),
|
|
119
|
+
(0, import_layout.componentSlot)("CarbonDataTable", { rows: campaignRows, columns: campaignColumns, rowKey: "id" })
|
|
120
|
+
],
|
|
121
|
+
{ op: "stack", direction: "vertical", slots: [] }
|
|
122
|
+
),
|
|
123
|
+
secondary: (0, import_layout.layoutSlot)(
|
|
124
|
+
(0, import_layout.layout)({
|
|
125
|
+
id: "campaign-form",
|
|
126
|
+
type: "Primitive.Panel",
|
|
127
|
+
styleIntent: { surface: "card" },
|
|
128
|
+
slots: {
|
|
129
|
+
header: (0, import_layout.componentSlot)("CarbonSectionHeader", { title: "Campaign Info" }),
|
|
130
|
+
body: (0, import_layout.fragmentSlot)(
|
|
131
|
+
[
|
|
132
|
+
(0, import_layout.componentSlot)("CarbonTextInput", { labelText: "Campaign name", defaultValue: "Taste the Future" }),
|
|
133
|
+
(0, import_layout.componentSlot)("CarbonTextInput", { labelText: "Brand", defaultValue: "Damory Food Indonesia" }),
|
|
134
|
+
(0, import_layout.componentSlot)("CarbonSelect", {
|
|
135
|
+
labelText: "Channel",
|
|
136
|
+
defaultValue: "instagram",
|
|
137
|
+
options: [
|
|
138
|
+
{ value: "instagram", label: "Instagram + Google Ads" },
|
|
139
|
+
{ value: "email", label: "Email only" },
|
|
140
|
+
{ value: "social", label: "Social media" }
|
|
141
|
+
]
|
|
142
|
+
}),
|
|
143
|
+
(0, import_layout.componentSlot)("CarbonTextarea", {
|
|
144
|
+
labelText: "Description",
|
|
145
|
+
rows: 4,
|
|
146
|
+
defaultValue: "A social media and Google Ads campaign showcasing convenience and taste."
|
|
147
|
+
})
|
|
148
|
+
],
|
|
149
|
+
{ op: "stack", direction: "vertical", slots: [] }
|
|
150
|
+
)
|
|
151
|
+
}
|
|
152
|
+
})
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
})
|
|
156
|
+
)
|
|
157
|
+
}
|
|
158
|
+
})
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
// src/templates/bright-events.ts
|
|
162
|
+
var import_layout2 = require("@echothink-ui/layout");
|
|
163
|
+
var taskColumns = [
|
|
164
|
+
{ key: "task", header: "Task" },
|
|
165
|
+
{ key: "statusLabel", header: "Status" },
|
|
166
|
+
{ key: "due", header: "Due" },
|
|
167
|
+
{ key: "comments", header: "Comments", align: "end" }
|
|
168
|
+
];
|
|
169
|
+
var taskRows = [
|
|
170
|
+
{ id: "t1", task: "Schedule endocrinologist appointment", statusLabel: "At risk", due: "15d", comments: 6 },
|
|
171
|
+
{ id: "t2", task: "Help DStudio get more customers", statusLabel: "In progress", due: "15d", comments: 23 },
|
|
172
|
+
{ id: "t3", task: "Plan an event", statusLabel: "Running", due: "15d", comments: 7 },
|
|
173
|
+
{ id: "t4", task: "Return a package", statusLabel: "Completed", due: "15d", comments: 34 }
|
|
174
|
+
];
|
|
175
|
+
var brightEventsTemplate = {
|
|
176
|
+
id: "bright-events",
|
|
177
|
+
name: "Bright event workspace",
|
|
178
|
+
description: "Task list with toolbar filters and a task-detail inspector.",
|
|
179
|
+
stylePreset: "bright",
|
|
180
|
+
tags: ["tasks", "events", "list-detail", "bright"],
|
|
181
|
+
layout: (0, import_layout2.layout)({
|
|
182
|
+
id: "bright-events",
|
|
183
|
+
type: "PageLayout.DataGridInspector",
|
|
184
|
+
styleIntent: { preset: "bright", taskMode: "crud" },
|
|
185
|
+
slots: {
|
|
186
|
+
toolbar: (0, import_layout2.fragmentSlot)(
|
|
187
|
+
[
|
|
188
|
+
(0, import_layout2.componentSlot)("CarbonSearchInput", { placeholder: "Search tasks" }),
|
|
189
|
+
(0, import_layout2.componentSlot)("CarbonButton", { label: "Filter", intent: "tertiary" }),
|
|
190
|
+
(0, import_layout2.componentSlot)("CarbonButton", { label: "New task", intent: "primary" })
|
|
191
|
+
],
|
|
192
|
+
{ op: "stack", direction: "horizontal", slots: [] }
|
|
193
|
+
),
|
|
194
|
+
grid: (0, import_layout2.componentSlot)("CarbonDataTable", { rows: taskRows, columns: taskColumns, rowKey: "id" }),
|
|
195
|
+
inspector: (0, import_layout2.layoutSlot)(
|
|
196
|
+
(0, import_layout2.layout)({
|
|
197
|
+
id: "task-detail",
|
|
198
|
+
type: "Primitive.Panel",
|
|
199
|
+
styleIntent: { surface: "panel" },
|
|
200
|
+
slots: {
|
|
201
|
+
header: (0, import_layout2.componentSlot)("CarbonSectionHeader", { title: "Task detail" }),
|
|
202
|
+
body: (0, import_layout2.fragmentSlot)(
|
|
203
|
+
[
|
|
204
|
+
(0, import_layout2.componentSlot)("CarbonStatusDot", { status: "in-progress", label: "15d left" }),
|
|
205
|
+
(0, import_layout2.componentSlot)("CarbonBadge", { severity: "info", children: "Medium priority" }),
|
|
206
|
+
(0, import_layout2.componentSlot)("CarbonTextInput", { labelText: "Owner", defaultValue: "Alex Rivera" }),
|
|
207
|
+
(0, import_layout2.componentSlot)("CarbonTextarea", { labelText: "Notes", rows: 5, defaultValue: "" }),
|
|
208
|
+
(0, import_layout2.componentSlot)("CarbonButton", { label: "Mark complete", intent: "primary" })
|
|
209
|
+
],
|
|
210
|
+
{ op: "stack", direction: "vertical", slots: [] }
|
|
211
|
+
)
|
|
212
|
+
}
|
|
213
|
+
})
|
|
214
|
+
)
|
|
215
|
+
}
|
|
216
|
+
})
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
// src/templates/glass-flowchart.ts
|
|
220
|
+
var import_layout3 = require("@echothink-ui/layout");
|
|
221
|
+
var throughput = [
|
|
222
|
+
{ label: "00:00", value: 120 },
|
|
223
|
+
{ label: "04:00", value: 98 },
|
|
224
|
+
{ label: "08:00", value: 187 },
|
|
225
|
+
{ label: "12:00", value: 240 },
|
|
226
|
+
{ label: "16:00", value: 210 },
|
|
227
|
+
{ label: "20:00", value: 168 }
|
|
228
|
+
];
|
|
229
|
+
var glassFlowchartTemplate = {
|
|
230
|
+
id: "glass-flowchart",
|
|
231
|
+
name: "Liquid glass flowchart",
|
|
232
|
+
description: "Visualization canvas with KPI overlays and a node-config inspector.",
|
|
233
|
+
stylePreset: "glass",
|
|
234
|
+
tags: ["canvas", "flow", "analytics", "glass"],
|
|
235
|
+
layout: (0, import_layout3.layout)({
|
|
236
|
+
id: "glass-flowchart",
|
|
237
|
+
type: "PageLayout.CanvasInspector",
|
|
238
|
+
styleIntent: { preset: "glass", taskMode: "authoring", visualEmphasis: "immersive" },
|
|
239
|
+
slots: {
|
|
240
|
+
toolbar: (0, import_layout3.fragmentSlot)(
|
|
241
|
+
[
|
|
242
|
+
(0, import_layout3.componentSlot)("CarbonSectionHeader", { title: "Flow studio" }),
|
|
243
|
+
(0, import_layout3.componentSlot)("CarbonButton", { label: "Run", intent: "primary" }),
|
|
244
|
+
(0, import_layout3.componentSlot)("CarbonButton", { label: "Snapshot", intent: "tertiary" })
|
|
245
|
+
],
|
|
246
|
+
{ op: "stack", direction: "horizontal", slots: [] }
|
|
247
|
+
),
|
|
248
|
+
canvas: (0, import_layout3.fragmentSlot)(
|
|
249
|
+
[
|
|
250
|
+
(0, import_layout3.fragmentSlot)(
|
|
251
|
+
[
|
|
252
|
+
(0, import_layout3.componentSlot)("CarbonKPIBlock", { title: "Throughput", value: "240/min", description: "peak 12:00" }),
|
|
253
|
+
(0, import_layout3.componentSlot)("CarbonKPIBlock", { title: "Errors", value: "0.4%", description: "-0.1% today" }),
|
|
254
|
+
(0, import_layout3.componentSlot)("CarbonKPIBlock", { title: "Latency p95", value: "182ms", description: "stable" })
|
|
255
|
+
],
|
|
256
|
+
{ op: "stack", direction: "horizontal", slots: [] }
|
|
257
|
+
),
|
|
258
|
+
(0, import_layout3.componentSlot)("CarbonAreaChart", {
|
|
259
|
+
title: "Pipeline throughput",
|
|
260
|
+
data: throughput,
|
|
261
|
+
valueKey: "value"
|
|
262
|
+
})
|
|
263
|
+
],
|
|
264
|
+
{ op: "stack", direction: "vertical", slots: [] }
|
|
265
|
+
),
|
|
266
|
+
inspector: (0, import_layout3.layoutSlot)(
|
|
267
|
+
(0, import_layout3.layout)({
|
|
268
|
+
id: "node-config",
|
|
269
|
+
type: "Primitive.Panel",
|
|
270
|
+
styleIntent: { surface: "panel" },
|
|
271
|
+
slots: {
|
|
272
|
+
header: (0, import_layout3.componentSlot)("CarbonSectionHeader", { title: "Node config" }),
|
|
273
|
+
body: (0, import_layout3.fragmentSlot)(
|
|
274
|
+
[
|
|
275
|
+
(0, import_layout3.componentSlot)("CarbonTextInput", { labelText: "Node name", defaultValue: "Transform" }),
|
|
276
|
+
(0, import_layout3.componentSlot)("CarbonSelect", {
|
|
277
|
+
labelText: "Kind",
|
|
278
|
+
defaultValue: "map",
|
|
279
|
+
options: [
|
|
280
|
+
{ value: "map", label: "Map" },
|
|
281
|
+
{ value: "filter", label: "Filter" },
|
|
282
|
+
{ value: "aggregate", label: "Aggregate" }
|
|
283
|
+
]
|
|
284
|
+
}),
|
|
285
|
+
(0, import_layout3.componentSlot)("CarbonToggle", { labelText: "Enabled", defaultToggled: true }),
|
|
286
|
+
(0, import_layout3.componentSlot)("CarbonTextarea", { labelText: "Expression", rows: 4, defaultValue: "" })
|
|
287
|
+
],
|
|
288
|
+
{ op: "stack", direction: "vertical", slots: [] }
|
|
289
|
+
)
|
|
290
|
+
}
|
|
291
|
+
})
|
|
292
|
+
)
|
|
293
|
+
}
|
|
294
|
+
})
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
// src/templates/studio-dark-check-box.ts
|
|
298
|
+
var import_layout4 = require("@echothink-ui/layout");
|
|
299
|
+
var monitorColumns = [
|
|
300
|
+
{ key: "check", header: "Check" },
|
|
301
|
+
{ key: "statusLabel", header: "Status" },
|
|
302
|
+
{ key: "latency", header: "Latency", align: "end" },
|
|
303
|
+
{ key: "updated", header: "Updated" }
|
|
304
|
+
];
|
|
305
|
+
var monitorRows = [
|
|
306
|
+
{ id: "m1", check: "Gateway /execute", statusLabel: "Healthy", latency: "42ms", updated: "now" },
|
|
307
|
+
{ id: "m2", check: "Worker queue lease", statusLabel: "Healthy", latency: "11ms", updated: "now" },
|
|
308
|
+
{ id: "m3", check: "Outcome committer", statusLabel: "Degraded", latency: "318ms", updated: "1m" },
|
|
309
|
+
{ id: "m4", check: "Artifact store", statusLabel: "Healthy", latency: "73ms", updated: "now" }
|
|
310
|
+
];
|
|
311
|
+
var trend = [
|
|
312
|
+
{ label: "T-5", value: 99.9 },
|
|
313
|
+
{ label: "T-4", value: 99.8 },
|
|
314
|
+
{ label: "T-3", value: 99.95 },
|
|
315
|
+
{ label: "T-2", value: 99.7 },
|
|
316
|
+
{ label: "T-1", value: 99.85 }
|
|
317
|
+
];
|
|
318
|
+
var studioDarkCheckBoxTemplate = {
|
|
319
|
+
id: "studio-dark-check-box",
|
|
320
|
+
name: "Studio dark monitoring",
|
|
321
|
+
description: "Realtime ops board with metric strip, health table, and activity console.",
|
|
322
|
+
stylePreset: "studio-dark",
|
|
323
|
+
tags: ["monitoring", "ops", "realtime", "studio-dark"],
|
|
324
|
+
layout: (0, import_layout4.layout)({
|
|
325
|
+
id: "studio-dark-check-box",
|
|
326
|
+
type: "PageLayout.MonitoringOps",
|
|
327
|
+
styleIntent: { preset: "studio-dark", taskMode: "monitoring", dataIntensity: "realtime" },
|
|
328
|
+
slots: {
|
|
329
|
+
toolbar: (0, import_layout4.fragmentSlot)(
|
|
330
|
+
[
|
|
331
|
+
(0, import_layout4.componentSlot)("CarbonSectionHeader", { title: "Runtime health" }),
|
|
332
|
+
(0, import_layout4.componentSlot)("CarbonButton", { label: "Acknowledge", intent: "tertiary" }),
|
|
333
|
+
(0, import_layout4.componentSlot)("CarbonButton", { label: "Snapshot", intent: "primary" })
|
|
334
|
+
],
|
|
335
|
+
{ op: "stack", direction: "horizontal", slots: [] }
|
|
336
|
+
),
|
|
337
|
+
metrics: (0, import_layout4.fragmentSlot)(
|
|
338
|
+
[
|
|
339
|
+
(0, import_layout4.componentSlot)("CarbonMetricTrend", { title: "Uptime", value: "99.85%", data: trend, valueKey: "value" }),
|
|
340
|
+
(0, import_layout4.componentSlot)("CarbonKPIBlock", { title: "Active jobs", value: "37", description: "4 retrying" }),
|
|
341
|
+
(0, import_layout4.componentSlot)("CarbonKPIBlock", { title: "Error rate", value: "0.6%", description: "+0.2%" })
|
|
342
|
+
],
|
|
343
|
+
{ op: "stack", direction: "horizontal", slots: [] }
|
|
344
|
+
),
|
|
345
|
+
primary: (0, import_layout4.componentSlot)("CarbonDataTable", { rows: monitorRows, columns: monitorColumns, rowKey: "id" }),
|
|
346
|
+
console: (0, import_layout4.componentSlot)("CarbonActivityList", {
|
|
347
|
+
items: [
|
|
348
|
+
{ id: "a1", title: "Outcome committer latency spike", time: "1m ago", severity: "warning" },
|
|
349
|
+
{ id: "a2", title: "Worker pool scaled to 8", time: "3m ago", severity: "info" },
|
|
350
|
+
{ id: "a3", title: "Snapshot snap-29 committed", time: "5m ago", severity: "success" }
|
|
351
|
+
]
|
|
352
|
+
})
|
|
353
|
+
}
|
|
354
|
+
})
|
|
355
|
+
};
|
|
356
|
+
|
|
357
|
+
// src/types.ts
|
|
358
|
+
function collectComponentNames(node) {
|
|
359
|
+
const names = /* @__PURE__ */ new Set();
|
|
360
|
+
const visitContent = (content) => {
|
|
361
|
+
switch (content.kind) {
|
|
362
|
+
case "component":
|
|
363
|
+
names.add(content.component);
|
|
364
|
+
break;
|
|
365
|
+
case "layout":
|
|
366
|
+
visitNode(content.layout);
|
|
367
|
+
break;
|
|
368
|
+
case "fragment":
|
|
369
|
+
content.items.forEach(visitContent);
|
|
370
|
+
break;
|
|
371
|
+
default:
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
const visitNode = (n) => {
|
|
376
|
+
for (const content of Object.values(n.slots)) visitContent(content);
|
|
377
|
+
const comp = n.composition;
|
|
378
|
+
if (comp?.op === "switch") comp.items.forEach((i) => visitContent(i.content));
|
|
379
|
+
if (comp?.op === "stepper") comp.steps.forEach((s) => visitContent(s.content));
|
|
380
|
+
};
|
|
381
|
+
visitNode(node);
|
|
382
|
+
return [...names].sort();
|
|
383
|
+
}
|
|
384
|
+
var TemplateRegistry = class {
|
|
385
|
+
items = /* @__PURE__ */ new Map();
|
|
386
|
+
register(def) {
|
|
387
|
+
this.items.set(def.id, def);
|
|
388
|
+
return this;
|
|
389
|
+
}
|
|
390
|
+
registerAll(defs) {
|
|
391
|
+
for (const def of defs) this.register(def);
|
|
392
|
+
return this;
|
|
393
|
+
}
|
|
394
|
+
get(id) {
|
|
395
|
+
return this.items.get(id);
|
|
396
|
+
}
|
|
397
|
+
has(id) {
|
|
398
|
+
return this.items.has(id);
|
|
399
|
+
}
|
|
400
|
+
list() {
|
|
401
|
+
return [...this.items.values()];
|
|
402
|
+
}
|
|
403
|
+
byPreset(preset) {
|
|
404
|
+
return this.list().filter((t) => t.stylePreset === preset);
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
|
|
408
|
+
// src/index.ts
|
|
409
|
+
var templateCatalog = [
|
|
410
|
+
softCardCampaignTemplate,
|
|
411
|
+
brightEventsTemplate,
|
|
412
|
+
glassFlowchartTemplate,
|
|
413
|
+
studioDarkCheckBoxTemplate
|
|
414
|
+
];
|
|
415
|
+
function createTemplateRegistry() {
|
|
416
|
+
return new TemplateRegistry().registerAll(templateCatalog);
|
|
417
|
+
}
|
|
418
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
419
|
+
0 && (module.exports = {
|
|
420
|
+
TemplateRegistry,
|
|
421
|
+
brightEventsTemplate,
|
|
422
|
+
collectComponentNames,
|
|
423
|
+
createTemplateRegistry,
|
|
424
|
+
glassFlowchartTemplate,
|
|
425
|
+
softCardCampaignTemplate,
|
|
426
|
+
studioDarkCheckBoxTemplate,
|
|
427
|
+
templateCatalog
|
|
428
|
+
});
|
|
429
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/templates/soft-card-campaign.ts","../src/templates/bright-events.ts","../src/templates/glass-flowchart.ts","../src/templates/studio-dark-check-box.ts","../src/types.ts"],"sourcesContent":["/**\n * `@echothink-ui/templates` — genuine templates built from the layout system.\n *\n * Each template is a declarative `LayoutNode` AST composed from\n * `@echothink-ui/layout` page-layouts and populated with `@echothink-ui`\n * components by name. Render via `LayoutRoot` (with a component resolver) or\n * flatten into Puck data for editing in the builder.\n */\nimport { softCardCampaignTemplate } from \"./templates/soft-card-campaign.js\";\nimport { brightEventsTemplate } from \"./templates/bright-events.js\";\nimport { glassFlowchartTemplate } from \"./templates/glass-flowchart.js\";\nimport { studioDarkCheckBoxTemplate } from \"./templates/studio-dark-check-box.js\";\nimport { TemplateRegistry, type TemplateDefinition } from \"./types.js\";\n\nexport type { TemplateDefinition } from \"./types.js\";\nexport { TemplateRegistry, collectComponentNames } from \"./types.js\";\n\nexport {\n softCardCampaignTemplate,\n brightEventsTemplate,\n glassFlowchartTemplate,\n studioDarkCheckBoxTemplate,\n};\n\n/** All builtin templates, in catalog order. */\nexport const templateCatalog: TemplateDefinition[] = [\n softCardCampaignTemplate,\n brightEventsTemplate,\n glassFlowchartTemplate,\n studioDarkCheckBoxTemplate,\n];\n\nexport type TemplateId = (typeof templateCatalog)[number][\"id\"];\n\n/** A registry preloaded with the builtin templates. */\nexport function createTemplateRegistry(): TemplateRegistry {\n return new TemplateRegistry().registerAll(templateCatalog);\n}\n","import { layout, componentSlot, layoutSlot, fragmentSlot } from \"@echothink-ui/layout\";\nimport type { TemplateDefinition } from \"../types.js\";\n\n/**\n * Soft-card campaign workspace — an `AdminShell` whose content is a master/detail\n * split: a campaign dashboard (KPIs + chart + table) beside a campaign-info form\n * panel. Replaces the former hard-coded `SoftCardCampaignTemplate`.\n */\nconst campaignColumns = [\n { key: \"name\", header: \"Campaign\" },\n { key: \"channel\", header: \"Channel\" },\n { key: \"statusLabel\", header: \"Status\" },\n { key: \"audience\", header: \"Audience\", align: \"end\" },\n { key: \"updated\", header: \"Updated\" },\n];\n\nconst campaignRows = [\n { id: \"c1\", name: \"Taste the Future\", channel: \"Instagram + Ads\", statusLabel: \"Running\", audience: \"10,000\", updated: \"24 Sep\" },\n { id: \"c2\", name: \"Cybersecurity Week\", channel: \"Facebook\", statusLabel: \"In Progress\", audience: \"6,420\", updated: \"22 Sep\" },\n { id: \"c3\", name: \"E-learning Essentials\", channel: \"Email\", statusLabel: \"Approval\", audience: \"3,890\", updated: \"21 Sep\" },\n];\n\nconst channelChart = [\n { label: \"Mon\", sent: 32, opened: 19 },\n { label: \"Tue\", sent: 46, opened: 22 },\n { label: \"Wed\", sent: 38, opened: 27 },\n { label: \"Thu\", sent: 54, opened: 31 },\n { label: \"Fri\", sent: 49, opened: 36 },\n];\n\nexport const softCardCampaignTemplate: TemplateDefinition = {\n id: \"soft-card-campaign\",\n name: \"Soft card campaign\",\n description: \"Campaign dashboard with a master/detail configuration panel.\",\n stylePreset: \"soft-card\",\n tags: [\"dashboard\", \"marketing\", \"crud\", \"soft-card\"],\n layout: layout({\n id: \"soft-card-campaign\",\n type: \"PageLayout.AdminShell\",\n styleIntent: { preset: \"soft-card\", taskMode: \"crud\" },\n slots: {\n topbar: fragmentSlot(\n [\n componentSlot(\"CarbonSectionHeader\", { title: \"Metricmap\" }),\n componentSlot(\"CarbonSearchInput\", { placeholder: \"Search campaigns\" }),\n componentSlot(\"CarbonButton\", { label: \"New campaign\", intent: \"primary\" }),\n ],\n { op: \"stack\", direction: \"horizontal\", slots: [] },\n ),\n navigation: componentSlot(\"CarbonSideNav\", {\n items: [\n { label: \"Summary of Key Metrics\", href: \"#summary\" },\n { label: \"Recent Campaigns\", href: \"#recent\", current: true },\n { label: \"Performance Snapshot\", href: \"#performance\" },\n { label: \"Integrations\", href: \"#integrations\" },\n { label: \"Social Media Metrics\", href: \"#social\" },\n ],\n }),\n content: layoutSlot(\n layout({\n id: \"campaign-split\",\n type: \"Primitive.SplitPane\",\n variant: \"horizontal\",\n composition: {\n op: \"parallel\",\n axis: \"x\",\n slots: [\"primary\", \"secondary\"],\n sizing: { primary: { basis: \"1.7fr\" }, secondary: { basis: \"1fr\" } },\n },\n slots: {\n primary: fragmentSlot(\n [\n componentSlot(\"CarbonPageHeader\", {\n title: \"Recent Campaign\",\n description: \"Campaign configuration, audience rules, and channel performance in one workspace.\",\n }),\n fragmentSlot(\n [\n componentSlot(\"CarbonKPIBlock\", { title: \"Sent\", value: \"203 Mail\", description: \"+6% from last week\" }),\n componentSlot(\"CarbonKPIBlock\", { title: \"Opened\", value: \"18%\", description: \"+3% from last week\" }),\n componentSlot(\"CarbonKPIBlock\", { title: \"Conversions\", value: \"42\", description: \"12 awaiting review\" }),\n ],\n { op: \"stack\", direction: \"horizontal\", slots: [] },\n ),\n componentSlot(\"CarbonChartBlock\", {\n title: \"Channel performance\",\n subtitle: \"Chosen period versus last period\",\n chartType: \"bar\",\n data: channelChart,\n series: [\n { key: \"sent\", label: \"Chosen period\" },\n { key: \"opened\", label: \"Last period\" },\n ],\n }),\n componentSlot(\"CarbonDataTable\", { rows: campaignRows, columns: campaignColumns, rowKey: \"id\" }),\n ],\n { op: \"stack\", direction: \"vertical\", slots: [] },\n ),\n secondary: layoutSlot(\n layout({\n id: \"campaign-form\",\n type: \"Primitive.Panel\",\n styleIntent: { surface: \"card\" },\n slots: {\n header: componentSlot(\"CarbonSectionHeader\", { title: \"Campaign Info\" }),\n body: fragmentSlot(\n [\n componentSlot(\"CarbonTextInput\", { labelText: \"Campaign name\", defaultValue: \"Taste the Future\" }),\n componentSlot(\"CarbonTextInput\", { labelText: \"Brand\", defaultValue: \"Damory Food Indonesia\" }),\n componentSlot(\"CarbonSelect\", {\n labelText: \"Channel\",\n defaultValue: \"instagram\",\n options: [\n { value: \"instagram\", label: \"Instagram + Google Ads\" },\n { value: \"email\", label: \"Email only\" },\n { value: \"social\", label: \"Social media\" },\n ],\n }),\n componentSlot(\"CarbonTextarea\", {\n labelText: \"Description\",\n rows: 4,\n defaultValue: \"A social media and Google Ads campaign showcasing convenience and taste.\",\n }),\n ],\n { op: \"stack\", direction: \"vertical\", slots: [] },\n ),\n },\n }),\n ),\n },\n }),\n ),\n },\n }),\n};\n","import { layout, componentSlot, layoutSlot, fragmentSlot } from \"@echothink-ui/layout\";\nimport type { TemplateDefinition } from \"../types.js\";\n\n/**\n * Bright event workspace — a `DataGridInspector`: a task list grid with a toolbar\n * and a task-detail inspector. Replaces the former `BrightEventWorkspaceTemplate`.\n */\nconst taskColumns = [\n { key: \"task\", header: \"Task\" },\n { key: \"statusLabel\", header: \"Status\" },\n { key: \"due\", header: \"Due\" },\n { key: \"comments\", header: \"Comments\", align: \"end\" },\n];\n\nconst taskRows = [\n { id: \"t1\", task: \"Schedule endocrinologist appointment\", statusLabel: \"At risk\", due: \"15d\", comments: 6 },\n { id: \"t2\", task: \"Help DStudio get more customers\", statusLabel: \"In progress\", due: \"15d\", comments: 23 },\n { id: \"t3\", task: \"Plan an event\", statusLabel: \"Running\", due: \"15d\", comments: 7 },\n { id: \"t4\", task: \"Return a package\", statusLabel: \"Completed\", due: \"15d\", comments: 34 },\n];\n\nexport const brightEventsTemplate: TemplateDefinition = {\n id: \"bright-events\",\n name: \"Bright event workspace\",\n description: \"Task list with toolbar filters and a task-detail inspector.\",\n stylePreset: \"bright\",\n tags: [\"tasks\", \"events\", \"list-detail\", \"bright\"],\n layout: layout({\n id: \"bright-events\",\n type: \"PageLayout.DataGridInspector\",\n styleIntent: { preset: \"bright\", taskMode: \"crud\" },\n slots: {\n toolbar: fragmentSlot(\n [\n componentSlot(\"CarbonSearchInput\", { placeholder: \"Search tasks\" }),\n componentSlot(\"CarbonButton\", { label: \"Filter\", intent: \"tertiary\" }),\n componentSlot(\"CarbonButton\", { label: \"New task\", intent: \"primary\" }),\n ],\n { op: \"stack\", direction: \"horizontal\", slots: [] },\n ),\n grid: componentSlot(\"CarbonDataTable\", { rows: taskRows, columns: taskColumns, rowKey: \"id\" }),\n inspector: layoutSlot(\n layout({\n id: \"task-detail\",\n type: \"Primitive.Panel\",\n styleIntent: { surface: \"panel\" },\n slots: {\n header: componentSlot(\"CarbonSectionHeader\", { title: \"Task detail\" }),\n body: fragmentSlot(\n [\n componentSlot(\"CarbonStatusDot\", { status: \"in-progress\", label: \"15d left\" }),\n componentSlot(\"CarbonBadge\", { severity: \"info\", children: \"Medium priority\" }),\n componentSlot(\"CarbonTextInput\", { labelText: \"Owner\", defaultValue: \"Alex Rivera\" }),\n componentSlot(\"CarbonTextarea\", { labelText: \"Notes\", rows: 5, defaultValue: \"\" }),\n componentSlot(\"CarbonButton\", { label: \"Mark complete\", intent: \"primary\" }),\n ],\n { op: \"stack\", direction: \"vertical\", slots: [] },\n ),\n },\n }),\n ),\n },\n }),\n};\n","import { layout, componentSlot, layoutSlot, fragmentSlot } from \"@echothink-ui/layout\";\nimport type { TemplateDefinition } from \"../types.js\";\n\n/**\n * Liquid-glass flowchart studio — a `CanvasInspector`: a full-bleed visualization\n * canvas with a floating toolbar and a node-config inspector. Replaces the former\n * `LiquidGlassFlowchartTemplate`.\n */\nconst throughput = [\n { label: \"00:00\", value: 120 },\n { label: \"04:00\", value: 98 },\n { label: \"08:00\", value: 187 },\n { label: \"12:00\", value: 240 },\n { label: \"16:00\", value: 210 },\n { label: \"20:00\", value: 168 },\n];\n\nexport const glassFlowchartTemplate: TemplateDefinition = {\n id: \"glass-flowchart\",\n name: \"Liquid glass flowchart\",\n description: \"Visualization canvas with KPI overlays and a node-config inspector.\",\n stylePreset: \"glass\",\n tags: [\"canvas\", \"flow\", \"analytics\", \"glass\"],\n layout: layout({\n id: \"glass-flowchart\",\n type: \"PageLayout.CanvasInspector\",\n styleIntent: { preset: \"glass\", taskMode: \"authoring\", visualEmphasis: \"immersive\" },\n slots: {\n toolbar: fragmentSlot(\n [\n componentSlot(\"CarbonSectionHeader\", { title: \"Flow studio\" }),\n componentSlot(\"CarbonButton\", { label: \"Run\", intent: \"primary\" }),\n componentSlot(\"CarbonButton\", { label: \"Snapshot\", intent: \"tertiary\" }),\n ],\n { op: \"stack\", direction: \"horizontal\", slots: [] },\n ),\n canvas: fragmentSlot(\n [\n fragmentSlot(\n [\n componentSlot(\"CarbonKPIBlock\", { title: \"Throughput\", value: \"240/min\", description: \"peak 12:00\" }),\n componentSlot(\"CarbonKPIBlock\", { title: \"Errors\", value: \"0.4%\", description: \"-0.1% today\" }),\n componentSlot(\"CarbonKPIBlock\", { title: \"Latency p95\", value: \"182ms\", description: \"stable\" }),\n ],\n { op: \"stack\", direction: \"horizontal\", slots: [] },\n ),\n componentSlot(\"CarbonAreaChart\", {\n title: \"Pipeline throughput\",\n data: throughput,\n valueKey: \"value\",\n }),\n ],\n { op: \"stack\", direction: \"vertical\", slots: [] },\n ),\n inspector: layoutSlot(\n layout({\n id: \"node-config\",\n type: \"Primitive.Panel\",\n styleIntent: { surface: \"panel\" },\n slots: {\n header: componentSlot(\"CarbonSectionHeader\", { title: \"Node config\" }),\n body: fragmentSlot(\n [\n componentSlot(\"CarbonTextInput\", { labelText: \"Node name\", defaultValue: \"Transform\" }),\n componentSlot(\"CarbonSelect\", {\n labelText: \"Kind\",\n defaultValue: \"map\",\n options: [\n { value: \"map\", label: \"Map\" },\n { value: \"filter\", label: \"Filter\" },\n { value: \"aggregate\", label: \"Aggregate\" },\n ],\n }),\n componentSlot(\"CarbonToggle\", { labelText: \"Enabled\", defaultToggled: true }),\n componentSlot(\"CarbonTextarea\", { labelText: \"Expression\", rows: 4, defaultValue: \"\" }),\n ],\n { op: \"stack\", direction: \"vertical\", slots: [] },\n ),\n },\n }),\n ),\n },\n }),\n};\n","import { layout, componentSlot, fragmentSlot } from \"@echothink-ui/layout\";\nimport type { TemplateDefinition } from \"../types.js\";\n\n/**\n * Studio-dark monitoring board — a `MonitoringOps` layout: toolbar + metric strip\n * + primary table + console activity feed. Replaces the former\n * `StudioDarkCheckBoxTemplate`.\n */\nconst monitorColumns = [\n { key: \"check\", header: \"Check\" },\n { key: \"statusLabel\", header: \"Status\" },\n { key: \"latency\", header: \"Latency\", align: \"end\" },\n { key: \"updated\", header: \"Updated\" },\n];\n\nconst monitorRows = [\n { id: \"m1\", check: \"Gateway /execute\", statusLabel: \"Healthy\", latency: \"42ms\", updated: \"now\" },\n { id: \"m2\", check: \"Worker queue lease\", statusLabel: \"Healthy\", latency: \"11ms\", updated: \"now\" },\n { id: \"m3\", check: \"Outcome committer\", statusLabel: \"Degraded\", latency: \"318ms\", updated: \"1m\" },\n { id: \"m4\", check: \"Artifact store\", statusLabel: \"Healthy\", latency: \"73ms\", updated: \"now\" },\n];\n\nconst trend = [\n { label: \"T-5\", value: 99.9 },\n { label: \"T-4\", value: 99.8 },\n { label: \"T-3\", value: 99.95 },\n { label: \"T-2\", value: 99.7 },\n { label: \"T-1\", value: 99.85 },\n];\n\nexport const studioDarkCheckBoxTemplate: TemplateDefinition = {\n id: \"studio-dark-check-box\",\n name: \"Studio dark monitoring\",\n description: \"Realtime ops board with metric strip, health table, and activity console.\",\n stylePreset: \"studio-dark\",\n tags: [\"monitoring\", \"ops\", \"realtime\", \"studio-dark\"],\n layout: layout({\n id: \"studio-dark-check-box\",\n type: \"PageLayout.MonitoringOps\",\n styleIntent: { preset: \"studio-dark\", taskMode: \"monitoring\", dataIntensity: \"realtime\" },\n slots: {\n toolbar: fragmentSlot(\n [\n componentSlot(\"CarbonSectionHeader\", { title: \"Runtime health\" }),\n componentSlot(\"CarbonButton\", { label: \"Acknowledge\", intent: \"tertiary\" }),\n componentSlot(\"CarbonButton\", { label: \"Snapshot\", intent: \"primary\" }),\n ],\n { op: \"stack\", direction: \"horizontal\", slots: [] },\n ),\n metrics: fragmentSlot(\n [\n componentSlot(\"CarbonMetricTrend\", { title: \"Uptime\", value: \"99.85%\", data: trend, valueKey: \"value\" }),\n componentSlot(\"CarbonKPIBlock\", { title: \"Active jobs\", value: \"37\", description: \"4 retrying\" }),\n componentSlot(\"CarbonKPIBlock\", { title: \"Error rate\", value: \"0.6%\", description: \"+0.2%\" }),\n ],\n { op: \"stack\", direction: \"horizontal\", slots: [] },\n ),\n primary: componentSlot(\"CarbonDataTable\", { rows: monitorRows, columns: monitorColumns, rowKey: \"id\" }),\n console: componentSlot(\"CarbonActivityList\", {\n items: [\n { id: \"a1\", title: \"Outcome committer latency spike\", time: \"1m ago\", severity: \"warning\" },\n { id: \"a2\", title: \"Worker pool scaled to 8\", time: \"3m ago\", severity: \"info\" },\n { id: \"a3\", title: \"Snapshot snap-29 committed\", time: \"5m ago\", severity: \"success\" },\n ],\n }),\n },\n }),\n};\n","/**\n * `@echothink-ui/templates` — template contract.\n *\n * A template is now a GENUINE template: a declarative `LayoutNode` AST built from\n * `@echothink-ui/layout` page-layouts and populated with `@echothink-ui`\n * components (referenced by name). It is rendered through the layout engine\n * (`LayoutRoot`) and can be flattened into Puck data for editing in the builder.\n */\nimport type { EthStylePreset } from \"@echothink-ui/style\";\nimport type { LayoutNode, SlotContent } from \"@echothink-ui/layout\";\n\nexport interface TemplateDefinition {\n /** Stable id. */\n id: string;\n /** Human label. */\n name: string;\n /** One-line description. */\n description: string;\n /** Preset this template was designed around (the engine still infers per-slot). */\n stylePreset: EthStylePreset;\n /** Discovery tags. */\n tags: string[];\n /** The root layout AST. */\n layout: LayoutNode;\n}\n\n/** Walk a layout AST and collect every referenced component name (deduped). */\nexport function collectComponentNames(node: LayoutNode): string[] {\n const names = new Set<string>();\n const visitContent = (content: SlotContent): void => {\n switch (content.kind) {\n case \"component\":\n names.add(content.component);\n break;\n case \"layout\":\n visitNode(content.layout);\n break;\n case \"fragment\":\n content.items.forEach(visitContent);\n break;\n default:\n break;\n }\n };\n const visitNode = (n: LayoutNode): void => {\n for (const content of Object.values(n.slots)) visitContent(content);\n const comp = n.composition;\n if (comp?.op === \"switch\") comp.items.forEach((i) => visitContent(i.content));\n if (comp?.op === \"stepper\") comp.steps.forEach((s) => visitContent(s.content));\n };\n visitNode(node);\n return [...names].sort();\n}\n\n/** A tiny registry over template definitions. */\nexport class TemplateRegistry {\n private readonly items = new Map<string, TemplateDefinition>();\n\n register(def: TemplateDefinition): this {\n this.items.set(def.id, def);\n return this;\n }\n\n registerAll(defs: readonly TemplateDefinition[]): this {\n for (const def of defs) this.register(def);\n return this;\n }\n\n get(id: string): TemplateDefinition | undefined {\n return this.items.get(id);\n }\n\n has(id: string): boolean {\n return this.items.has(id);\n }\n\n list(): TemplateDefinition[] {\n return [...this.items.values()];\n }\n\n byPreset(preset: EthStylePreset): TemplateDefinition[] {\n return this.list().filter((t) => t.stylePreset === preset);\n }\n}\n"],"mappings":"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","names":["import_layout","import_layout","import_layout"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@echothink-ui/templates` — genuine templates built from the layout system.
|
|
3
|
+
*
|
|
4
|
+
* Each template is a declarative `LayoutNode` AST composed from
|
|
5
|
+
* `@echothink-ui/layout` page-layouts and populated with `@echothink-ui`
|
|
6
|
+
* components by name. Render via `LayoutRoot` (with a component resolver) or
|
|
7
|
+
* flatten into Puck data for editing in the builder.
|
|
8
|
+
*/
|
|
9
|
+
import { softCardCampaignTemplate } from "./templates/soft-card-campaign.js";
|
|
10
|
+
import { brightEventsTemplate } from "./templates/bright-events.js";
|
|
11
|
+
import { glassFlowchartTemplate } from "./templates/glass-flowchart.js";
|
|
12
|
+
import { studioDarkCheckBoxTemplate } from "./templates/studio-dark-check-box.js";
|
|
13
|
+
import { TemplateRegistry, type TemplateDefinition } from "./types.js";
|
|
14
|
+
export type { TemplateDefinition } from "./types.js";
|
|
15
|
+
export { TemplateRegistry, collectComponentNames } from "./types.js";
|
|
16
|
+
export { softCardCampaignTemplate, brightEventsTemplate, glassFlowchartTemplate, studioDarkCheckBoxTemplate, };
|
|
17
|
+
/** All builtin templates, in catalog order. */
|
|
18
|
+
export declare const templateCatalog: TemplateDefinition[];
|
|
19
|
+
export type TemplateId = (typeof templateCatalog)[number]["id"];
|
|
20
|
+
/** A registry preloaded with the builtin templates. */
|
|
21
|
+
export declare function createTemplateRegistry(): TemplateRegistry;
|