@kohaku-ui/renderer-wc 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +18 -0
  3. package/dist/dom.d.ts +23 -0
  4. package/dist/dom.d.ts.map +1 -0
  5. package/dist/dom.js +132 -0
  6. package/dist/dom.js.map +1 -0
  7. package/dist/index.d.ts +5 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +8 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/kohaku-surface.d.ts +42 -0
  12. package/dist/kohaku-surface.d.ts.map +1 -0
  13. package/dist/kohaku-surface.js +157 -0
  14. package/dist/kohaku-surface.js.map +1 -0
  15. package/dist/parts/action-button.d.ts +8 -0
  16. package/dist/parts/action-button.d.ts.map +1 -0
  17. package/dist/parts/action-button.js +38 -0
  18. package/dist/parts/action-button.js.map +1 -0
  19. package/dist/parts/chart-svg.d.ts +21 -0
  20. package/dist/parts/chart-svg.d.ts.map +1 -0
  21. package/dist/parts/chart-svg.js +181 -0
  22. package/dist/parts/chart-svg.js.map +1 -0
  23. package/dist/parts/chart.d.ts +9 -0
  24. package/dist/parts/chart.d.ts.map +1 -0
  25. package/dist/parts/chart.js +107 -0
  26. package/dist/parts/chart.js.map +1 -0
  27. package/dist/parts/control-select.d.ts +9 -0
  28. package/dist/parts/control-select.d.ts.map +1 -0
  29. package/dist/parts/control-select.js +56 -0
  30. package/dist/parts/control-select.js.map +1 -0
  31. package/dist/parts/form.d.ts +10 -0
  32. package/dist/parts/form.d.ts.map +1 -0
  33. package/dist/parts/form.js +346 -0
  34. package/dist/parts/form.js.map +1 -0
  35. package/dist/parts/kit.d.ts +25 -0
  36. package/dist/parts/kit.d.ts.map +1 -0
  37. package/dist/parts/kit.js +41 -0
  38. package/dist/parts/kit.js.map +1 -0
  39. package/dist/parts/layout.d.ts +6 -0
  40. package/dist/parts/layout.d.ts.map +1 -0
  41. package/dist/parts/layout.js +29 -0
  42. package/dist/parts/layout.js.map +1 -0
  43. package/dist/parts/list.d.ts +8 -0
  44. package/dist/parts/list.d.ts.map +1 -0
  45. package/dist/parts/list.js +60 -0
  46. package/dist/parts/list.js.map +1 -0
  47. package/dist/parts/loading.d.ts +7 -0
  48. package/dist/parts/loading.d.ts.map +1 -0
  49. package/dist/parts/loading.js +37 -0
  50. package/dist/parts/loading.js.map +1 -0
  51. package/dist/parts/metric.d.ts +11 -0
  52. package/dist/parts/metric.d.ts.map +1 -0
  53. package/dist/parts/metric.js +37 -0
  54. package/dist/parts/metric.js.map +1 -0
  55. package/dist/parts/overlay.d.ts +20 -0
  56. package/dist/parts/overlay.d.ts.map +1 -0
  57. package/dist/parts/overlay.js +131 -0
  58. package/dist/parts/overlay.js.map +1 -0
  59. package/dist/parts/spreadsheet.d.ts +11 -0
  60. package/dist/parts/spreadsheet.d.ts.map +1 -0
  61. package/dist/parts/spreadsheet.js +206 -0
  62. package/dist/parts/spreadsheet.js.map +1 -0
  63. package/dist/parts/tabs.d.ts +11 -0
  64. package/dist/parts/tabs.d.ts.map +1 -0
  65. package/dist/parts/tabs.js +109 -0
  66. package/dist/parts/tabs.js.map +1 -0
  67. package/dist/parts/text.d.ts +9 -0
  68. package/dist/parts/text.d.ts.map +1 -0
  69. package/dist/parts/text.js +72 -0
  70. package/dist/parts/text.js.map +1 -0
  71. package/dist/registry.d.ts +8 -0
  72. package/dist/registry.d.ts.map +1 -0
  73. package/dist/registry.js +38 -0
  74. package/dist/registry.js.map +1 -0
  75. package/dist/sandbox-mount.d.ts +10 -0
  76. package/dist/sandbox-mount.d.ts.map +1 -0
  77. package/dist/sandbox-mount.js +73 -0
  78. package/dist/sandbox-mount.js.map +1 -0
  79. package/dist/tree.d.ts +24 -0
  80. package/dist/tree.d.ts.map +1 -0
  81. package/dist/tree.js +156 -0
  82. package/dist/tree.js.map +1 -0
  83. package/dist/types.d.ts +87 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +2 -0
  86. package/dist/types.js.map +1 -0
  87. package/package.json +61 -0
@@ -0,0 +1,346 @@
1
+ import { asStringArray, buildDefaults, describeControl, describedByOf, describeFieldRow, FIELD_ROW_STYLE, FORM_ROOT_STYLE, focusFieldSelectors, formControlBaseStyle, formFillKey, formSubmitButtonStyle, mergeRow, normalizeOptions, planFormSubmit, } from "@kohaku-ui/renderer-core";
2
+ import { el, noop, setAttrs, setStyle, text } from "../dom.js";
3
+ import { dataStateNotice, tokenStr } from "./kit.js";
4
+ /**
5
+ * presentForm — an input form (same behavior as renderer-react's PresentForm). Wires submit directly to action.invoke
6
+ * (auto-falls back to onEvent forwarding if binding is unset). If node.data exists, initial values are filled from the first row.
7
+ *
8
+ * To preserve focus/caret, WC does not swap the whole element; it locally updates only value filling, busy, and submit result
9
+ * (the final submit payload matches React's controlled re-render).
10
+ */
11
+ export const presentForm = (rt, parent, node, row) => {
12
+ const accent = tokenStr(rt, "color.primary");
13
+ const border = tokenStr(rt, "color.border");
14
+ const onPrimary = tokenStr(rt, "color.on-primary");
15
+ const positiveText = tokenStr(rt, "color.positive.text");
16
+ const negativeText = tokenStr(rt, "color.negative.text");
17
+ const requiredColor = tokenStr(rt, "color.negative");
18
+ const muted = tokenStr(rt, "color.muted");
19
+ const fields = node.props["fields"] ?? [];
20
+ const defaults = buildDefaults(fields);
21
+ const values = { ...defaults };
22
+ const applyValue = new Map();
23
+ // Display of declarative-validation violations (locally updates aria-invalid + inline error per field).
24
+ const applyError = new Map();
25
+ const disablers = [];
26
+ const form = el("form", { "data-kohaku": node.id }, FORM_ROOT_STYLE);
27
+ // Aggregated error slot for validation violations (at the form's start; inserts a role="alert" div).
28
+ const summarySlot = document.createComment(`kohaku:form-summary:${node.id}`);
29
+ form.appendChild(summarySlot);
30
+ let summaryNode = summarySlot;
31
+ const setSummary = (next) => {
32
+ const replacement = next ?? document.createComment(`kohaku:form-summary:${node.id}`);
33
+ summaryNode.replaceWith(replacement);
34
+ summaryNode = replacement;
35
+ };
36
+ // Notification slot for the data-resolution state (stale/error) (right after the aggregated error).
37
+ const noticeSlot = document.createComment(`kohaku:form-notice:${node.id}`);
38
+ form.appendChild(noticeSlot);
39
+ let noticeNode = noticeSlot;
40
+ const setNotice = (next) => {
41
+ const replacement = next ?? document.createComment(`kohaku:form-notice:${node.id}`);
42
+ noticeNode.replaceWith(replacement);
43
+ noticeNode = replacement;
44
+ };
45
+ const fieldColors = { border, muted, requiredColor, errorColor: negativeText };
46
+ for (const field of fields) {
47
+ form.appendChild(buildFieldRow(rt, node, field, values, fieldColors, applyValue, applyError, disablers));
48
+ }
49
+ const submit = el("button", { type: "submit" });
50
+ submit.appendChild(text(String(node.props["submitLabel"] ?? rt.messages.formSubmit)));
51
+ form.appendChild(submit);
52
+ // Slot for the submit-result message.
53
+ const resultSlot = document.createComment(`kohaku:form-result:${node.id}`);
54
+ form.appendChild(resultSlot);
55
+ let resultNode = resultSlot;
56
+ const setResult = (next) => {
57
+ const replacement = next ?? document.createComment(`kohaku:form-result:${node.id}`);
58
+ resultNode.replaceWith(replacement);
59
+ resultNode = replacement;
60
+ };
61
+ // Reflect busy (data resolving or submitting). After a submit failure, resubmission is allowed, so it is not disabled.
62
+ let dataLoading = false;
63
+ let submitting = false;
64
+ const applyBusy = () => {
65
+ const busy = dataLoading || submitting;
66
+ for (const d of disablers)
67
+ d(busy);
68
+ submit.disabled = busy;
69
+ if (busy)
70
+ form.setAttribute("aria-busy", "true");
71
+ else
72
+ form.removeAttribute("aria-busy");
73
+ if (submitting)
74
+ submit.setAttribute("aria-busy", "true");
75
+ else
76
+ submit.removeAttribute("aria-busy");
77
+ setStyle(submit, formSubmitButtonStyle(accent, onPrimary, { busy }));
78
+ };
79
+ applyBusy();
80
+ const onPhase = (phase) => {
81
+ submitting = phase.phase === "pending";
82
+ applyBusy();
83
+ if (phase.phase === "succeeded") {
84
+ const msg = String(node.props["successMessage"] ?? rt.messages.formSubmitted);
85
+ const div = el("div", { role: "status" }, { color: positiveText, fontSize: 13 });
86
+ div.appendChild(text(msg));
87
+ setResult(div);
88
+ }
89
+ else if (phase.phase === "failed") {
90
+ const div = el("div", { role: "alert" }, { color: negativeText, fontSize: 13 });
91
+ div.appendChild(text(phase.message));
92
+ setResult(div);
93
+ }
94
+ };
95
+ // Move focus to the first violating field (radios have no id, so they are picked up by name).
96
+ const focusField = (name) => {
97
+ const [byId, byName] = focusFieldSelectors(node.id, name);
98
+ (form.querySelector(byId) ?? form.querySelector(byName))?.focus();
99
+ };
100
+ // Reflect the validation result in the DOM (each field's aria-invalid/inline + the aggregated error at the top).
101
+ const applyViolations = (found) => {
102
+ const byField = new Map(found.map((v) => [v.field, v]));
103
+ for (const field of fields)
104
+ applyError.get(field.name)?.(byField.get(field.name));
105
+ setSummary(found.length > 0 ? buildSummary(rt.messages.formErrorSummary(found.length), found, negativeText) : null);
106
+ };
107
+ form.addEventListener("submit", (e) => {
108
+ e.preventDefault();
109
+ if (dataLoading || submitting)
110
+ return;
111
+ const plan = planFormSubmit(fields, values, rt.messages);
112
+ applyViolations(plan.violations);
113
+ if (plan.payload == null) {
114
+ // If there are violations, do not submit and move focus to the first violating field.
115
+ focusField(plan.violations[0].field);
116
+ return;
117
+ }
118
+ void rt.invoke(node, "submit", plan.payload, row, onPhase);
119
+ });
120
+ // If node.data exists, fill initial values from the first row (once per ref + data version; does not overwrite while editing).
121
+ let detach = noop;
122
+ const hasData = node.data?.$ref != null;
123
+ if (hasData) {
124
+ let filledKey = null;
125
+ detach = rt.controller.attach(node, rt.spec, (state) => {
126
+ dataLoading = state.status === "loading";
127
+ applyBusy();
128
+ const problem = state.status === "stale" || state.status === "error";
129
+ setNotice(problem ? dataStateNotice(rt, state) : null);
130
+ if (state.status === "ready") {
131
+ const key = formFillKey(node, state.dataVersion);
132
+ if (filledKey !== key) {
133
+ filledKey = key;
134
+ const merged = mergeRow(defaults, fields, state.data.rows[0]);
135
+ for (const field of fields) {
136
+ values[field.name] = merged[field.name];
137
+ applyValue.get(field.name)?.(merged[field.name]);
138
+ }
139
+ }
140
+ }
141
+ });
142
+ }
143
+ parent.appendChild(form);
144
+ return () => {
145
+ detach();
146
+ form.remove();
147
+ };
148
+ };
149
+ /** A single field's row (label/group + control + help text + inline error). */
150
+ function buildFieldRow(rt, node, field, values, colors, applyValue, applyError, disablers) {
151
+ const { border, muted, requiredColor, errorColor } = colors;
152
+ // ids / label / grouping come from renderer-core's describeFieldRow (the shared id scheme with renderer-react).
153
+ const { fieldId, helpId, errorId, labelText, required, isGroup } = describeFieldRow(node.id, field);
154
+ const rowEl = el("div", {}, FIELD_ROW_STYLE);
155
+ if (isGroup)
156
+ setAttrs(rowEl, { role: "group", "aria-label": labelText });
157
+ const labelEl = el(isGroup ? "span" : "label", {}, { fontWeight: 600 });
158
+ if (!isGroup)
159
+ labelEl.setAttribute("for", fieldId);
160
+ labelEl.appendChild(text(labelText));
161
+ if (required) {
162
+ const star = el("span", { "aria-hidden": "true" }, { color: requiredColor });
163
+ star.appendChild(text(" *"));
164
+ labelEl.appendChild(star);
165
+ }
166
+ rowEl.appendChild(labelEl);
167
+ const controlEl = buildControl(rt, field, fieldId, helpId, values, border, applyValue, disablers);
168
+ rowEl.appendChild(controlEl);
169
+ if (field.helpText != null) {
170
+ const help = el("span", { id: helpId }, { color: muted, fontSize: 12 });
171
+ help.appendChild(text(field.helpText));
172
+ rowEl.appendChild(help);
173
+ }
174
+ // Inline error slot (inserts a span only on violation; equivalent to React's conditional render, emitting nothing to the DOM when there is no violation).
175
+ const errorSlot = document.createComment(`kohaku:form-error:${fieldId}`);
176
+ rowEl.appendChild(errorSlot);
177
+ let errorNode = errorSlot;
178
+ // The controls that carry aria-invalid / aria-describedby (radio is multiple inputs, otherwise a single element).
179
+ const controls = controlEl.matches("input,select,textarea")
180
+ ? [controlEl]
181
+ : [...controlEl.querySelectorAll("input,select,textarea")];
182
+ applyError.set(field.name, (violation) => {
183
+ if (violation != null) {
184
+ const span = el("span", { id: errorId }, { color: errorColor, fontSize: 12 });
185
+ span.appendChild(text(violation.message));
186
+ errorNode.replaceWith(span);
187
+ errorNode = span;
188
+ for (const c of controls) {
189
+ c.setAttribute("aria-invalid", "true");
190
+ c.setAttribute("aria-describedby", describedByOf(helpId, errorId));
191
+ }
192
+ }
193
+ else {
194
+ const comment = document.createComment(`kohaku:form-error:${fieldId}`);
195
+ errorNode.replaceWith(comment);
196
+ errorNode = comment;
197
+ for (const c of controls) {
198
+ c.removeAttribute("aria-invalid");
199
+ if (helpId != null)
200
+ c.setAttribute("aria-describedby", helpId);
201
+ else
202
+ c.removeAttribute("aria-describedby");
203
+ }
204
+ }
205
+ });
206
+ return rowEl;
207
+ }
208
+ /** Aggregated error for validation violations (role="alert"; a count heading + a mention of each field). Semantically equivalent to React's aggregated div. */
209
+ function buildSummary(heading, violations, errorColor) {
210
+ const div = el("div", { role: "alert" }, { color: errorColor, fontSize: 13 });
211
+ const head = el("span");
212
+ head.appendChild(text(heading));
213
+ div.appendChild(head);
214
+ const ul = el("ul", {}, { margin: "4px 0 0", paddingLeft: 18 });
215
+ for (const v of violations) {
216
+ const li = el("li");
217
+ li.appendChild(text(`${v.label}: ${v.message}`));
218
+ ul.appendChild(li);
219
+ }
220
+ div.appendChild(ul);
221
+ return div;
222
+ }
223
+ function buildControl(rt, field, fieldId, helpId, values, border, applyValue, disablers) {
224
+ const name = field.name;
225
+ // The per-type decisions (tag / input type / constraint attributes / inputmode / rows / minHeight)
226
+ // come from renderer-core's describeControl; only the element assembly and event wiring live here.
227
+ const desc = describeControl(field);
228
+ const baseStyle = formControlBaseStyle(border);
229
+ const common = (elm) => {
230
+ elm.id = fieldId;
231
+ if (field.required === true)
232
+ elm.setAttribute("aria-required", "true");
233
+ if (helpId != null)
234
+ elm.setAttribute("aria-describedby", helpId);
235
+ };
236
+ const registerDisable = (elm) => {
237
+ disablers.push((disabled) => {
238
+ elm.disabled = disabled;
239
+ });
240
+ };
241
+ switch (desc.kind) {
242
+ case "select": {
243
+ const select = el("select", {}, baseStyle);
244
+ common(select);
245
+ if (field.required === true)
246
+ select.required = true;
247
+ const placeholder = el("option", { value: "" });
248
+ placeholder.appendChild(text(rt.messages.formSelectPlaceholder));
249
+ select.appendChild(placeholder);
250
+ for (const opt of normalizeOptions(field.options)) {
251
+ const o = el("option", { value: opt.value });
252
+ o.appendChild(text(opt.label));
253
+ select.appendChild(o);
254
+ }
255
+ select.value = String(values[name] ?? "");
256
+ select.addEventListener("change", () => (values[name] = select.value));
257
+ applyValue.set(name, (v) => (select.value = String(v ?? "")));
258
+ registerDisable(select);
259
+ return select;
260
+ }
261
+ case "multiselect": {
262
+ const select = el("select", { multiple: true }, { ...baseStyle, minHeight: desc.minHeight });
263
+ common(select);
264
+ for (const opt of normalizeOptions(field.options)) {
265
+ const o = el("option", { value: opt.value });
266
+ o.appendChild(text(opt.label));
267
+ select.appendChild(o);
268
+ }
269
+ const applyMulti = (v) => {
270
+ const set = new Set(asStringArray(v));
271
+ for (const o of [...select.options])
272
+ o.selected = set.has(o.value);
273
+ };
274
+ applyMulti(values[name]);
275
+ select.addEventListener("change", () => {
276
+ values[name] = [...select.selectedOptions].map((o) => o.value);
277
+ });
278
+ applyValue.set(name, applyMulti);
279
+ registerDisable(select);
280
+ return select;
281
+ }
282
+ case "radio": {
283
+ const group = el("div", {}, { display: "flex", flexDirection: "column", gap: 4 });
284
+ const inputs = [];
285
+ for (const opt of normalizeOptions(field.options)) {
286
+ const lbl = el("label", {}, { display: "flex", alignItems: "center", gap: 6, fontWeight: 400 });
287
+ const input = el("input", { type: "radio", name: fieldId, value: opt.value });
288
+ if (helpId != null)
289
+ input.setAttribute("aria-describedby", helpId);
290
+ input.checked = String(values[name] ?? "") === opt.value;
291
+ input.addEventListener("change", () => (values[name] = opt.value));
292
+ inputs.push(input);
293
+ lbl.append(input, text(opt.label));
294
+ group.appendChild(lbl);
295
+ registerDisable(input);
296
+ }
297
+ applyValue.set(name, (v) => {
298
+ for (const input of inputs)
299
+ input.checked = String(v ?? "") === input.value;
300
+ });
301
+ return group;
302
+ }
303
+ case "checkbox": {
304
+ const input = el("input", { type: "checkbox" });
305
+ common(input);
306
+ input.checked = values[name] === true;
307
+ input.addEventListener("change", () => (values[name] = input.checked));
308
+ applyValue.set(name, (v) => (input.checked = v === true));
309
+ registerDisable(input);
310
+ return input;
311
+ }
312
+ case "textarea": {
313
+ const ta = el("textarea", {}, baseStyle);
314
+ common(ta);
315
+ setAttrs(ta, desc.constraints);
316
+ if (field.required === true)
317
+ ta.required = true;
318
+ if (desc.rows != null)
319
+ ta.rows = desc.rows;
320
+ ta.value = String(values[name] ?? "");
321
+ ta.addEventListener("input", () => (values[name] = ta.value));
322
+ applyValue.set(name, (v) => (ta.value = String(v ?? "")));
323
+ registerDisable(ta);
324
+ return ta;
325
+ }
326
+ case "input": {
327
+ // Covers text / number / date / email / url — number keeps the raw string while typing and coerces
328
+ // on submit (does not break intermediate input); the type/inputmode/pattern decisions are in describeControl.
329
+ const input = el("input", {
330
+ type: desc.inputType,
331
+ ...(desc.inputMode != null ? { inputmode: desc.inputMode } : {}),
332
+ ...(desc.pattern != null ? { pattern: desc.pattern } : {}),
333
+ }, baseStyle);
334
+ common(input);
335
+ setAttrs(input, desc.constraints);
336
+ if (field.required === true)
337
+ input.required = true;
338
+ input.value = String(values[name] ?? "");
339
+ input.addEventListener("input", () => (values[name] = input.value));
340
+ applyValue.set(name, (v) => (input.value = String(v ?? "")));
341
+ registerDisable(input);
342
+ return input;
343
+ }
344
+ }
345
+ }
346
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/parts/form.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAEb,aAAa,EACb,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,eAAe,EAGf,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,WAAW,EACX,qBAAqB,EACrB,QAAQ,EACR,gBAAgB,EAChB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,QAAQ,CAAC,EAAE,EAAE,qBAAqB,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,QAAQ,CAAC,EAAE,EAAE,qBAAqB,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,QAAQ,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAA2B,IAAI,EAAE,CAAC;IAErE,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAe,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAA8C,CAAC;IACzE,wGAAwG;IACxG,MAAM,UAAU,GAAG,IAAI,GAAG,EAAmD,CAAC;IAC9E,MAAM,SAAS,GAAoC,EAAE,CAAC;IAEtD,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,eAAe,CAAoB,CAAC;IAExF,qGAAqG;IACrG,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,uBAAuB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAC9B,IAAI,WAAW,GAAc,WAAW,CAAC;IACzC,MAAM,UAAU,GAAG,CAAC,IAAiB,EAAQ,EAAE;QAC7C,MAAM,WAAW,GAAG,IAAI,IAAI,QAAQ,CAAC,aAAa,CAAC,uBAAuB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACrF,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACrC,WAAW,GAAG,WAAwB,CAAC;IACzC,CAAC,CAAC;IAEF,oGAAoG;IACpG,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,sBAAsB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC7B,IAAI,UAAU,GAAc,UAAU,CAAC;IACvC,MAAM,SAAS,GAAG,CAAC,IAAiB,EAAQ,EAAE;QAC5C,MAAM,WAAW,GAAG,IAAI,IAAI,QAAQ,CAAC,aAAa,CAAC,sBAAsB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACpF,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACpC,UAAU,GAAG,WAAwB,CAAC;IACxC,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;IAC/E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAsB,CAAC;IACrE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAY,IAAI,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAClG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAEzB,sCAAsC;IACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,sBAAsB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC7B,IAAI,UAAU,GAAc,UAAU,CAAC;IACvC,MAAM,SAAS,GAAG,CAAC,IAAiB,EAAQ,EAAE;QAC5C,MAAM,WAAW,GAAG,IAAI,IAAI,QAAQ,CAAC,aAAa,CAAC,sBAAsB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACpF,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACpC,UAAU,GAAG,WAAwB,CAAC;IACxC,CAAC,CAAC;IAEF,uHAAuH;IACvH,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,SAAS,GAAG,GAAS,EAAE;QAC3B,MAAM,IAAI,GAAG,WAAW,IAAI,UAAU,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,IAAI,IAAI;YAAE,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;;YAC5C,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACvC,IAAI,UAAU;YAAE,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;;YACpD,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACzC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC;IACF,SAAS,EAAE,CAAC;IAEZ,MAAM,OAAO,GAAG,CAAC,KAAkB,EAAQ,EAAE;QAC3C,UAAU,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC;QACvC,SAAS,EAAE,CAAC;QACZ,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,MAAM,CAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAY,IAAI,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC1F,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YACjF,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,SAAS,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;aAAM,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YAChF,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACrC,SAAS,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,8FAA8F;IAC9F,MAAM,UAAU,GAAG,CAAC,IAAY,EAAQ,EAAE;QACxC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1D,CAAC,IAAI,CAAC,aAAa,CAAc,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,CAAc,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IAC9F,CAAC,CAAC;IAEF,iHAAiH;IACjH,MAAM,eAAe,GAAG,CAAC,KAAuB,EAAQ,EAAE;QACxD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAClF,UAAU,CACR,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CACxG,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;QACpC,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,IAAI,WAAW,IAAI,UAAU;YAAE,OAAO;QACtC,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;QACzD,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YACzB,sFAAsF;YACtF,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QACD,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,+HAA+H;IAC/H,IAAI,MAAM,GAAa,IAAI,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC;IACxC,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAgB,EAAE,EAAE;YAChE,WAAW,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC;YACzC,SAAS,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC;YACrE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;gBACjD,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;oBACtB,SAAS,GAAG,GAAG,CAAC;oBAChB,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC9D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;wBAC3B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;wBACrD,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,GAAG,EAAE;QACV,MAAM,EAAE,CAAC;QACT,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,+EAA+E;AAC/E,SAAS,aAAa,CACpB,EAAiB,EACjB,IAAoB,EACpB,KAAe,EACf,MAAkB,EAClB,MAAoF,EACpF,UAA2D,EAC3D,UAAgE,EAChE,SAA0C;IAE1C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAC5D,gHAAgH;IAChH,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAEpG,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;IAC7C,IAAI,OAAO;QAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;IAEzE,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACrC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7B,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAE3B,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAClG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAE7B,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,0JAA0J;IAC1J,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;IACzE,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC7B,IAAI,SAAS,GAAc,SAAS,CAAC;IACrC,kHAAkH;IAClH,MAAM,QAAQ,GAAc,SAAS,CAAC,OAAO,CAAC,uBAAuB,CAAC;QACpE,CAAC,CAAC,CAAC,SAAS,CAAC;QACb,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC7D,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,EAAE;QACvC,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1C,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC5B,SAAS,GAAG,IAAI,CAAC;YACjB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,CAAC,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;gBACvC,CAAC,CAAC,YAAY,CAAC,kBAAkB,EAAE,aAAa,CAAC,MAAM,EAAE,OAAO,CAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;YACvE,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC/B,SAAS,GAAG,OAAO,CAAC;YACpB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,CAAC,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;gBAClC,IAAI,MAAM,IAAI,IAAI;oBAAE,CAAC,CAAC,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;;oBAC1D,CAAC,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+JAA+J;AAC/J,SAAS,YAAY,CAAC,OAAe,EAAE,UAA4B,EAAE,UAAkB;IACrF,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAChC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IAChE,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACpB,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACjD,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACrB,CAAC;IACD,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACpB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CACnB,EAAiB,EACjB,KAAe,EACf,OAAe,EACf,MAA0B,EAC1B,MAAkB,EAClB,MAAc,EACd,UAA2D,EAC3D,SAA0C;IAE1C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,mGAAmG;IACnG,mGAAmG;IACnG,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,CAAC,GAAgB,EAAQ,EAAE;QACxC,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;QACjB,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;YAAE,GAAG,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACvE,IAAI,MAAM,IAAI,IAAI;YAAE,GAAG,CAAC,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IACnE,CAAC,CAAC;IACF,MAAM,eAAe,GAAG,CAAC,GAA+D,EAAQ,EAAE;QAChG,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC1B,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,CAAsB,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,CAAC;YACf,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;gBAAE,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;YACpD,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAsB,CAAC;YACrE,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACjE,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAChC,KAAK,MAAM,GAAG,IAAI,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClD,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAsB,CAAC;gBAClE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC/B,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACxB,CAAC;YACD,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACvE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9D,eAAe,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,aAAa,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,EAAE,CACf,QAAQ,EACR,EAAE,QAAQ,EAAE,IAAI,EAAE,EAClB,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CACvB,CAAC;YACvB,MAAM,CAAC,MAAM,CAAC,CAAC;YACf,KAAK,MAAM,GAAG,IAAI,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClD,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAsB,CAAC;gBAClE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC/B,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACxB,CAAC;YACD,MAAM,UAAU,GAAG,CAAC,CAAwB,EAAQ,EAAE;gBACpD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;oBAAE,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACrE,CAAC,CAAC;YACF,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACrC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;YACH,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACjC,eAAe,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,OAAO,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAClF,MAAM,MAAM,GAAuB,EAAE,CAAC;YACtC,KAAK,MAAM,GAAG,IAAI,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;gBAChG,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAqB,CAAC;gBAClG,IAAI,MAAM,IAAI,IAAI;oBAAE,KAAK,CAAC,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;gBACnE,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;gBACzD,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACvB,eAAe,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YACD,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE;gBACzB,KAAK,MAAM,KAAK,IAAI,MAAM;oBAAE,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC;YAC9E,CAAC,CAAC,CAAC;YACH,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,UAAU,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAqB,CAAC;YACpE,MAAM,CAAC,KAAK,CAAC,CAAC;YACd,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;YACtC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACvE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;YAC1D,eAAe,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,UAAU,EAAE,CAAC;YAChB,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,SAAS,CAAwB,CAAC;YAChE,MAAM,CAAC,EAAE,CAAC,CAAC;YACX,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/B,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;gBAAE,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC;YAChD,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI;gBAAE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YAC3C,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACtC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9D,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1D,eAAe,CAAC,EAAE,CAAC,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,OAAO,EAAE,CAAC;YACb,mGAAmG;YACnG,8GAA8G;YAC9G,MAAM,KAAK,GAAG,EAAE,CACd,OAAO,EACP;gBACE,IAAI,EAAE,IAAI,CAAC,SAAS;gBACpB,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3D,EACD,SAAS,CACU,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,CAAC;YACd,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAClC,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;gBAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;YACnD,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACzC,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACpE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7D,eAAe,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type BoundData } from "@kohaku-ui/renderer-core";
2
+ import type { ComponentNode, KnownThemeTokens } from "@kohaku-ui/spec-core";
3
+ import type { RenderRuntime, Teardown } from "../types.js";
4
+ /**
5
+ * Resolves a theme token as a string (equivalent to React's String(useToken(...))). Same shape as resolveToken:
6
+ * the 2-argument form takes a known token (`keyof KnownThemeTokens`; delegates to the default-theme set), and an
7
+ * arbitrary string token is only allowed via the 3-argument form, which requires a fallback.
8
+ */
9
+ export declare function tokenStr(rt: RenderRuntime, name: keyof KnownThemeTokens): string;
10
+ export declare function tokenStr(rt: RenderRuntime, name: string, fallback: string): string;
11
+ /**
12
+ * Common display for loading / stale / error (same markup as renderer-react's DataStateNotice).
13
+ * Returns null for ready / idle since there is no display element.
14
+ */
15
+ export declare function dataStateNotice(rt: RenderRuntime, state: BoundData): HTMLElement | null;
16
+ /**
17
+ * Common wiring for parts that carry reference-passed data. Places a swap anchor in parent, attaches a BoundDataController,
18
+ * and on every onChange swaps in the result of render(state) (last-write-wins, invalidation, and freshness matching are guaranteed by the controller).
19
+ * render conventionally returns dataStateNotice for non-ready states. childTeardown can return child cleanup for row templates, etc.
20
+ */
21
+ export declare function mountBoundPart(rt: RenderRuntime, parent: ParentNode, node: ComponentNode, render: (state: BoundData) => {
22
+ el: Node;
23
+ teardown?: Teardown;
24
+ }): Teardown;
25
+ //# sourceMappingURL=kit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kit.d.ts","sourceRoot":"","sources":["../../src/parts/kit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAsC,MAAM,0BAA0B,CAAC;AAC9F,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE5E,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE3D;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAClF,wBAAgB,QAAQ,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;AASpF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,IAAI,CAUvF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,aAAa,EACjB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAE,GAC9D,QAAQ,CAeV"}
@@ -0,0 +1,41 @@
1
+ import { resolveDataStateView, resolveToken } from "@kohaku-ui/renderer-core";
2
+ import { el, noop, text } from "../dom.js";
3
+ export function tokenStr(rt, name, fallback) {
4
+ return String(fallback === undefined
5
+ ? resolveToken(rt.theme, name)
6
+ : resolveToken(rt.theme, name, fallback));
7
+ }
8
+ /**
9
+ * Common display for loading / stale / error (same markup as renderer-react's DataStateNotice).
10
+ * Returns null for ready / idle since there is no display element.
11
+ */
12
+ export function dataStateNotice(rt, state) {
13
+ const view = resolveDataStateView(state, rt.theme, rt.messages);
14
+ if (view == null)
15
+ return null;
16
+ const node = el("div", { role: view.role }, { background: view.bg, color: view.fg, borderRadius: 6, padding: "10px 12px", fontSize: 13 });
17
+ node.appendChild(text(view.text));
18
+ return node;
19
+ }
20
+ /**
21
+ * Common wiring for parts that carry reference-passed data. Places a swap anchor in parent, attaches a BoundDataController,
22
+ * and on every onChange swaps in the result of render(state) (last-write-wins, invalidation, and freshness matching are guaranteed by the controller).
23
+ * render conventionally returns dataStateNotice for non-ready states. childTeardown can return child cleanup for row templates, etc.
24
+ */
25
+ export function mountBoundPart(rt, parent, node, render) {
26
+ let current = document.createComment(`kohaku:bound:${node.id}`);
27
+ parent.appendChild(current);
28
+ let childTeardown = noop;
29
+ const detach = rt.controller.attach(node, rt.spec, (state) => {
30
+ childTeardown();
31
+ const next = render(state);
32
+ childTeardown = next.teardown ?? noop;
33
+ current.replaceWith(next.el);
34
+ current = next.el;
35
+ });
36
+ return () => {
37
+ detach();
38
+ childTeardown();
39
+ };
40
+ }
41
+ //# sourceMappingURL=kit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kit.js","sourceRoot":"","sources":["../../src/parts/kit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,oBAAoB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE9F,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAU3C,MAAM,UAAU,QAAQ,CAAC,EAAiB,EAAE,IAAY,EAAE,QAAiB;IACzE,OAAO,MAAM,CACX,QAAQ,KAAK,SAAS;QACpB,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,IAA8B,CAAC;QACxD,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAC3C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,EAAiB,EAAE,KAAgB;IACjE,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IAChE,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,IAAI,GAAG,EAAE,CACb,KAAK,EACL,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EACnB,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC7F,CAAC;IACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,EAAiB,EACjB,MAAkB,EAClB,IAAmB,EACnB,MAA+D;IAE/D,IAAI,OAAO,GAAc,QAAQ,CAAC,aAAa,CAAC,gBAAgB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3E,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5B,IAAI,aAAa,GAAa,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3D,aAAa,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,aAAa,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;QACtC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,OAAO,GAAG,IAAI,CAAC,EAAe,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,EAAE;QACV,MAAM,EAAE,CAAC;QACT,aAAa,EAAE,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { PartBuilder } from "../types.js";
2
+ /** layout.stack — a vertical/horizontal stack (same markup as renderer-react's LayoutStack). */
3
+ export declare const layoutStack: PartBuilder;
4
+ /** layout.grid — an equal-width grid (same markup as renderer-react's LayoutGrid). */
5
+ export declare const layoutGrid: PartBuilder;
6
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/parts/layout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,gGAAgG;AAChG,eAAO,MAAM,WAAW,EAAE,WAezB,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,UAAU,EAAE,WAexB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { GAP } from "@kohaku-ui/renderer-core";
2
+ import { el } from "../dom.js";
3
+ /** layout.stack — a vertical/horizontal stack (same markup as renderer-react's LayoutStack). */
4
+ export const layoutStack = (rt, parent, node, row) => {
5
+ const direction = node.props["direction"] ?? "vertical";
6
+ const gap = GAP[node.props["gap"] ?? "md"] ?? 16;
7
+ const container = el("div", { "data-kohaku": node.id }, {
8
+ display: "flex",
9
+ flexDirection: direction === "horizontal" ? "row" : "column",
10
+ gap,
11
+ width: "100%",
12
+ });
13
+ parent.appendChild(container);
14
+ return rt.mountChildren(container, node.children, row);
15
+ };
16
+ /** layout.grid — an equal-width grid (same markup as renderer-react's LayoutGrid). */
17
+ export const layoutGrid = (rt, parent, node, row) => {
18
+ const columns = node.props["columns"] ?? 2;
19
+ const gap = GAP[node.props["gap"] ?? "md"] ?? 16;
20
+ const container = el("div", { "data-kohaku": node.id }, {
21
+ display: "grid",
22
+ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`,
23
+ gap,
24
+ width: "100%",
25
+ });
26
+ parent.appendChild(container);
27
+ return rt.mountChildren(container, node.children, row);
28
+ };
29
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/parts/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAG/B,gGAAgG;AAChG,MAAM,CAAC,MAAM,WAAW,GAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAChE,MAAM,SAAS,GAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAY,IAAI,UAAU,CAAC;IACpE,MAAM,GAAG,GAAG,GAAG,CAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7D,MAAM,SAAS,GAAG,EAAE,CAClB,KAAK,EACL,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,EAC1B;QACE,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,SAAS,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;QAC5D,GAAG;QACH,KAAK,EAAE,MAAM;KACd,CACF,CAAC;IACF,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,sFAAsF;AACtF,MAAM,CAAC,MAAM,UAAU,GAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC/D,MAAM,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAY,IAAI,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,GAAG,CAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7D,MAAM,SAAS,GAAG,EAAE,CAClB,KAAK,EACL,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,EAC1B;QACE,OAAO,EAAE,MAAM;QACf,mBAAmB,EAAE,UAAU,OAAO,mBAAmB;QACzD,GAAG;QACH,KAAK,EAAE,MAAM;KACd,CACF,CAAC;IACF,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AACzD,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { PartBuilder } from "../types.js";
2
+ /**
3
+ * presentList — applies the children template to each row of the data reference and lays them out (same as renderer-react's PresentList).
4
+ * A row's props "$row.<column>" are substituted in the row context (rt.mountNode applies resolveRowProps), and if an itemClick
5
+ * declaration exists, each row is made interactive (the context row is in runtime.row).
6
+ */
7
+ export declare const presentList: PartBuilder;
8
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/parts/list.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAA2B,MAAM,aAAa,CAAC;AAGxE;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WAUzB,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { GAP, HARD_ROW_CAP, hasDeclaredEvent, isActivationKey, } from "@kohaku-ui/renderer-core";
2
+ import { el, noop, text } from "../dom.js";
3
+ import { dataStateNotice, mountBoundPart, tokenStr } from "./kit.js";
4
+ /**
5
+ * presentList — applies the children template to each row of the data reference and lays them out (same as renderer-react's PresentList).
6
+ * A row's props "$row.<column>" are substituted in the row context (rt.mountNode applies resolveRowProps), and if an itemClick
7
+ * declaration exists, each row is made interactive (the context row is in runtime.row).
8
+ */
9
+ export const presentList = (rt, parent, node) => {
10
+ const itemClickable = hasDeclaredEvent(rt.spec, node.id, "itemClick");
11
+ const gap = GAP[node.props["gap"] ?? "sm"] ?? 8;
12
+ const maxItems = node.props["maxItems"];
13
+ const emptyText = String(node.props["emptyText"] ?? "(No data)");
14
+ return mountBoundPart(rt, parent, node, (state) => {
15
+ if (state.status !== "ready")
16
+ return { el: dataStateNotice(rt, state) };
17
+ return renderList(rt, node, state.data.rows, { itemClickable, gap, maxItems, emptyText });
18
+ });
19
+ };
20
+ function renderList(rt, node, allRows, opts) {
21
+ const limit = Math.min(opts.maxItems ?? HARD_ROW_CAP, HARD_ROW_CAP);
22
+ const rows = allRows.slice(0, limit);
23
+ if (rows.length === 0) {
24
+ const empty = el("div", { "data-kohaku": node.id }, { color: tokenStr(rt, "color.muted"), fontSize: 13, padding: "8px 2px" });
25
+ empty.appendChild(text(opts.emptyText));
26
+ return { el: empty, teardown: noop };
27
+ }
28
+ const container = el("div", { "data-kohaku": node.id, role: "list" }, {
29
+ display: "flex",
30
+ flexDirection: "column",
31
+ gap: opts.gap,
32
+ width: "100%",
33
+ });
34
+ const teardowns = [];
35
+ rows.forEach((row) => {
36
+ const item = el("div", { role: "listitem" }, { cursor: opts.itemClickable ? "pointer" : "default" });
37
+ if (opts.itemClickable) {
38
+ item.tabIndex = 0;
39
+ item.addEventListener("click", () => rt.emit(node, "itemClick", { row }, row));
40
+ item.addEventListener("keydown", (e) => {
41
+ if (isActivationKey(e.key)) {
42
+ if (e.key === " ")
43
+ e.preventDefault();
44
+ rt.emit(node, "itemClick", { row }, row);
45
+ }
46
+ });
47
+ }
48
+ // Build the children template in the row context ($row substitution and row-context events are resolved by rt.mountChildren).
49
+ teardowns.push(rt.mountChildren(item, node.children, row));
50
+ container.appendChild(item);
51
+ });
52
+ return {
53
+ el: container,
54
+ teardown: () => {
55
+ for (const t of teardowns)
56
+ t();
57
+ },
58
+ };
59
+ }
60
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/parts/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { PartBuilder } from "../types.js";
2
+ /**
3
+ * ui.loading — a skeleton for the intermediate streaming state (same markup as renderer-react's UiLoading).
4
+ * role="status" + aria-busy="true". The spinner is a self-contained aria-hidden SVG (animateTransform).
5
+ */
6
+ export declare const uiLoading: PartBuilder;
7
+ //# sourceMappingURL=loading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading.d.ts","sourceRoot":"","sources":["../../src/parts/loading.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,WA4CvB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { el, svgEl, text } from "../dom.js";
2
+ import { tokenStr } from "./kit.js";
3
+ /**
4
+ * ui.loading — a skeleton for the intermediate streaming state (same markup as renderer-react's UiLoading).
5
+ * role="status" + aria-busy="true". The spinner is a self-contained aria-hidden SVG (animateTransform).
6
+ */
7
+ export const uiLoading = (rt, parent, node) => {
8
+ const label = String(node.props["label"] ?? "Loading…");
9
+ const muted = tokenStr(rt, "color.muted");
10
+ const border = tokenStr(rt, "color.border");
11
+ const container = el("div", { "data-kohaku": node.id, role: "status", "aria-busy": "true" }, { display: "flex", alignItems: "center", gap: 10, color: muted, fontSize: 13, padding: "10px 12px" });
12
+ const svg = svgEl("svg", { "aria-hidden": "true", width: "16", height: "16", viewBox: "0 0 16 16" }, {
13
+ flexShrink: 0,
14
+ });
15
+ svg.appendChild(svgEl("circle", { cx: "8", cy: "8", r: "6", fill: "none", stroke: border, "stroke-width": "2" }));
16
+ const path = svgEl("path", {
17
+ d: "M8 2 a6 6 0 0 1 6 6",
18
+ fill: "none",
19
+ stroke: muted,
20
+ "stroke-width": "2",
21
+ "stroke-linecap": "round",
22
+ });
23
+ path.appendChild(svgEl("animateTransform", {
24
+ attributeName: "transform",
25
+ type: "rotate",
26
+ from: "0 8 8",
27
+ to: "360 8 8",
28
+ dur: "0.7s",
29
+ repeatCount: "indefinite",
30
+ }));
31
+ svg.appendChild(path);
32
+ container.appendChild(svg);
33
+ container.appendChild(text(label));
34
+ parent.appendChild(container);
35
+ return () => container.remove();
36
+ };
37
+ //# sourceMappingURL=loading.js.map