lastriko 0.1.4 → 0.1.9

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 (56) hide show
  1. package/README.md +1 -1
  2. package/dist/__tests__/integration/ws-flow.integration.test.js +59 -125
  3. package/dist/__tests__/integration/ws-flow.integration.test.js.map +1 -1
  4. package/dist/client/events.js +155 -60
  5. package/dist/client/events.js.map +1 -1
  6. package/dist/client/swap.d.ts +16 -1
  7. package/dist/client/swap.js +355 -7
  8. package/dist/client/swap.js.map +1 -1
  9. package/dist/client/ws.d.ts +1 -0
  10. package/dist/client/ws.js +147 -46
  11. package/dist/client/ws.js.map +1 -1
  12. package/dist/client/ws.test.js +6 -309
  13. package/dist/client/ws.test.js.map +1 -1
  14. package/dist/components/context.d.ts +13 -1
  15. package/dist/components/context.js +312 -1
  16. package/dist/components/context.js.map +1 -1
  17. package/dist/components/context.test.js +73 -116
  18. package/dist/components/context.test.js.map +1 -1
  19. package/dist/components/registry.d.ts +2 -2
  20. package/dist/components/registry.js +52 -4
  21. package/dist/components/registry.js.map +1 -1
  22. package/dist/components/types.d.ts +175 -3
  23. package/dist/engine/executor.js +27 -0
  24. package/dist/engine/executor.js.map +1 -1
  25. package/dist/engine/executor.test.js +48 -10
  26. package/dist/engine/executor.test.js.map +1 -1
  27. package/dist/engine/messages.d.ts +9 -1
  28. package/dist/engine/messages.js.map +1 -1
  29. package/dist/engine/messages.test.d.ts +1 -0
  30. package/dist/engine/messages.test.js +39 -0
  31. package/dist/engine/messages.test.js.map +1 -0
  32. package/dist/engine/renderer.js +224 -11
  33. package/dist/engine/renderer.js.map +1 -1
  34. package/dist/engine/renderer.test.js +223 -234
  35. package/dist/engine/renderer.test.js.map +1 -1
  36. package/dist/engine/server.d.ts +1 -0
  37. package/dist/engine/server.js +41 -5
  38. package/dist/engine/server.js.map +1 -1
  39. package/dist/engine/server.test.js +62 -4
  40. package/dist/engine/server.test.js.map +1 -1
  41. package/dist/engine/watcher.d.ts +17 -1
  42. package/dist/engine/watcher.js +42 -5
  43. package/dist/engine/watcher.js.map +1 -1
  44. package/dist/engine/watcher.test.d.ts +1 -0
  45. package/dist/engine/watcher.test.js +62 -0
  46. package/dist/engine/watcher.test.js.map +1 -0
  47. package/dist/engine/websocket.hub.test.js +24 -0
  48. package/dist/engine/websocket.hub.test.js.map +1 -1
  49. package/dist/engine/websocket.js +0 -1
  50. package/dist/engine/websocket.js.map +1 -1
  51. package/dist/index.d.ts +3 -1
  52. package/dist/index.js +1 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/style.css +160 -0
  55. package/dist/theme/lastriko.css +160 -0
  56. package/package.json +2 -1
package/README.md CHANGED
@@ -35,7 +35,7 @@ Run with `tsx` or `bun`; open the URL printed in the console (default port **350
35
35
 
36
36
  - [Project manifest & roadmap](https://github.com/aixpose/lastriko/blob/main/MANIFEST.md)
37
37
  - [API reference](https://github.com/aixpose/lastriko/blob/main/docs/API-REFERENCE.md)
38
- - [Phase 2 (MVP) scope](https://github.com/aixpose/lastriko/blob/main/docs/phases/PHASE-2.md)
38
+ - [Current phase plan (Phase 3)](https://github.com/aixpose/lastriko/blob/main/docs/phases/PHASE-3.md)
39
39
 
40
40
  ## Examples in this repo
41
41
 
@@ -11,16 +11,21 @@ function createSocket() {
11
11
  sent,
12
12
  };
13
13
  }
14
- function byType(sent, type) {
15
- return sent
16
- .map((item) => JSON.parse(item))
17
- .filter((msg) => msg.type === type);
14
+ function parseAll(sent) {
15
+ return sent.map((item) => JSON.parse(item));
16
+ }
17
+ function ofType(sent, type) {
18
+ return parseAll(sent).filter((msg) => msg.type === type);
19
+ }
20
+ function batchedEntries(sent) {
21
+ const batches = ofType(sent, 'BATCH');
22
+ return batches.flatMap((batch) => batch.payload.messages);
18
23
  }
19
24
  describe('websocket integration flow', () => {
20
- it('ready emits RENDER and button click emits FRAGMENT', () => {
25
+ it('ready emits RENDER and button click emits FRAGMENT via BATCH', async () => {
21
26
  const { socket, sent } = createSocket();
22
27
  const runtime = createWebSocketHub({
23
- title: 'Phase2',
28
+ title: 'Phase3',
24
29
  callback: (ui) => {
25
30
  const text = ui.text('before');
26
31
  ui.button('go', () => {
@@ -33,7 +38,7 @@ describe('websocket integration flow', () => {
33
38
  type: 'READY',
34
39
  payload: { viewport: { width: 100, height: 100 }, theme: 'dark' },
35
40
  }));
36
- const render = byType(sent, 'RENDER')[0];
41
+ const render = ofType(sent, 'RENDER')[0];
37
42
  expect(render).toBeDefined();
38
43
  expect(render?.payload.html).toContain('before');
39
44
  const buttonId = render?.payload.html.match(/data-lk-id="(button-[^"]+)"/)?.[1];
@@ -42,10 +47,15 @@ describe('websocket integration flow', () => {
42
47
  type: 'EVENT',
43
48
  payload: { id: buttonId, event: 'click' },
44
49
  }));
45
- const fragment = byType(sent, 'FRAGMENT').at(-1);
46
- expect(fragment?.payload.html).toContain('after');
50
+ await new Promise((resolve) => setTimeout(resolve, 25));
51
+ const fragment = batchedEntries(sent)
52
+ .find((entry) => entry.type === 'FRAGMENT' && entry.payload.id === 'text-1');
53
+ expect(fragment).toBeDefined();
54
+ if (fragment?.type !== 'FRAGMENT')
55
+ throw new Error('Expected FRAGMENT entry');
56
+ expect(fragment.payload.html).toContain('after');
47
57
  });
48
- it('change EVENT updates input value and pushes FRAGMENT', () => {
58
+ it('change EVENT updates input value and emits batched FRAGMENT', async () => {
49
59
  const { socket, sent } = createSocket();
50
60
  const runtime = createWebSocketHub({
51
61
  title: 'Inputs',
@@ -58,18 +68,22 @@ describe('websocket integration flow', () => {
58
68
  type: 'READY',
59
69
  payload: { viewport: { width: 100, height: 100 }, theme: null },
60
70
  }));
61
- const render = byType(sent, 'RENDER')[0];
71
+ const render = ofType(sent, 'RENDER')[0];
62
72
  const inputId = render.payload.html.match(/data-lk-id="(textInput-[^"]+)"/)?.[1];
63
73
  expect(inputId).toBeDefined();
64
74
  runtime.handleRawMessage(socket, JSON.stringify({
65
75
  type: 'EVENT',
66
76
  payload: { id: inputId, event: 'change', value: 'updated' },
67
77
  }));
68
- const fragment = byType(sent, 'FRAGMENT').at(-1);
69
- expect(fragment?.payload.id).toBe(inputId);
70
- expect(fragment?.payload.html).toContain('updated');
78
+ await new Promise((resolve) => setTimeout(resolve, 25));
79
+ const fragment = batchedEntries(sent)
80
+ .find((entry) => entry.type === 'FRAGMENT' && entry.payload.id === inputId);
81
+ expect(fragment).toBeDefined();
82
+ if (fragment?.type !== 'FRAGMENT')
83
+ throw new Error('Expected FRAGMENT entry');
84
+ expect(fragment.payload.html).toContain('updated');
71
85
  });
72
- it('streamText append emits STREAM_CHUNK messages in order', () => {
86
+ it('streamText append emits batched STREAM_CHUNK entries in order', async () => {
73
87
  const { socket, sent } = createSocket();
74
88
  const runtime = createWebSocketHub({
75
89
  title: 'Streaming',
@@ -87,19 +101,20 @@ describe('websocket integration flow', () => {
87
101
  type: 'READY',
88
102
  payload: { viewport: { width: 100, height: 100 }, theme: null },
89
103
  }));
90
- const render = byType(sent, 'RENDER')[0];
104
+ const render = ofType(sent, 'RENDER')[0];
91
105
  const buttonId = render.payload.html.match(/data-lk-id="(button-[^"]+)"/)?.[1];
92
106
  runtime.handleRawMessage(socket, JSON.stringify({
93
107
  type: 'EVENT',
94
108
  payload: { id: buttonId, event: 'click' },
95
109
  }));
96
- const chunks = byType(sent, 'STREAM_CHUNK');
110
+ await new Promise((resolve) => setTimeout(resolve, 25));
111
+ const chunks = batchedEntries(sent).filter((entry) => entry.type === 'STREAM_CHUNK');
97
112
  expect(chunks).toHaveLength(3);
98
- expect(chunks[0]?.payload.chunk).toBe('a');
99
- expect(chunks[1]?.payload.chunk).toBe('b');
100
- expect(chunks[2]?.payload.done).toBe(true);
113
+ expect(chunks[0]?.type === 'STREAM_CHUNK' ? chunks[0].payload.chunk : '').toBe('a');
114
+ expect(chunks[1]?.type === 'STREAM_CHUNK' ? chunks[1].payload.chunk : '').toBe('b');
115
+ expect(chunks[2]?.type === 'STREAM_CHUNK' ? chunks[2].payload.done : false).toBe(true);
101
116
  });
102
- it('table row click EVENT dispatches onRowClick handler', () => {
117
+ it('table row click EVENT dispatches onRowClick handler', async () => {
103
118
  const { socket, sent } = createSocket();
104
119
  const clicks = [];
105
120
  const runtime = createWebSocketHub({
@@ -116,7 +131,7 @@ describe('websocket integration flow', () => {
116
131
  type: 'READY',
117
132
  payload: { viewport: { width: 120, height: 80 }, theme: null },
118
133
  }));
119
- const render = byType(sent, 'RENDER')[0];
134
+ const render = ofType(sent, 'RENDER')[0];
120
135
  const tableId = render.payload.html.match(/data-lk-id="(table-[^"]+)"/)?.[1];
121
136
  const rowId = render.payload.html.match(/data-lk-table-row-id="([^"]+)"/)?.[1];
122
137
  expect(tableId).toBeDefined();
@@ -125,125 +140,44 @@ describe('websocket integration flow', () => {
125
140
  type: 'EVENT',
126
141
  payload: { id: tableId, event: 'click', value: rowId },
127
142
  }));
143
+ await new Promise((resolve) => setTimeout(resolve, 0));
128
144
  expect(clicks).toEqual(['row-1']);
129
145
  });
130
- it('tracks READY viewport/theme and handles THEME_CHANGE', () => {
131
- const { socket, sent } = createSocket();
132
- const runtime = createWebSocketHub({
133
- title: 'Scope',
134
- callback: (ui) => {
135
- ui.text(`viewport-${ui.viewport.width}x${ui.viewport.height}-${ui.theme}`);
136
- },
137
- });
138
- const scope = runtime.addConnection(socket);
139
- runtime.handleRawMessage(socket, JSON.stringify({
140
- type: 'READY',
141
- payload: { viewport: { width: 10, height: 20 }, theme: 'dark' },
142
- }));
143
- expect(scope.viewport).toEqual({ width: 10, height: 20 });
144
- expect(scope.theme).toBe('dark');
145
- runtime.handleRawMessage(socket, JSON.stringify({
146
- type: 'THEME_CHANGE',
147
- payload: { mode: 'light' },
148
- }));
149
- const themeMsg = byType(sent, 'THEME').at(-1);
150
- expect(themeMsg?.payload.mode).toBe('light');
151
- });
152
- it('numberInput and toggle change EVENT update values and emit FRAGMENT', () => {
153
- const { socket, sent } = createSocket();
154
- const runtime = createWebSocketHub({
155
- title: 'More inputs',
156
- callback: (ui) => {
157
- ui.numberInput('N', { default: 1 });
158
- ui.toggle('T', { default: false });
159
- },
160
- });
161
- runtime.addConnection(socket);
162
- runtime.handleRawMessage(socket, JSON.stringify({
163
- type: 'READY',
164
- payload: { viewport: { width: 100, height: 100 }, theme: null },
165
- }));
166
- const render = byType(sent, 'RENDER')[0];
167
- const numId = render.payload.html.match(/data-lk-id="(numberInput-[^"]+)"/)?.[1];
168
- const toggleId = render.payload.html.match(/data-lk-id="(toggle-[^"]+)"/)?.[1];
169
- expect(numId).toBeDefined();
170
- expect(toggleId).toBeDefined();
171
- runtime.handleRawMessage(socket, JSON.stringify({
172
- type: 'EVENT',
173
- payload: { id: numId, event: 'change', value: 42 },
174
- }));
175
- const fragNum = byType(sent, 'FRAGMENT').at(-1);
176
- expect(fragNum?.payload.id).toBe(numId);
177
- expect(fragNum?.payload.html).toContain('value="42"');
178
- runtime.handleRawMessage(socket, JSON.stringify({
179
- type: 'EVENT',
180
- payload: { id: toggleId, event: 'change', value: true },
181
- }));
182
- const fragToggle = byType(sent, 'FRAGMENT').at(-1);
183
- expect(fragToggle?.payload.id).toBe(toggleId);
184
- expect(fragToggle?.payload.html).toContain('checked');
185
- });
186
- it('cross-region: sidebar button updates header metric via shared scope', () => {
146
+ it('multiSelect change EVENT updates selected values', async () => {
187
147
  const { socket, sent } = createSocket();
188
148
  const runtime = createWebSocketHub({
189
- title: 'Shell',
149
+ title: 'Multi',
190
150
  callback: (ui) => {
191
- let metric;
192
- ui.shell({
193
- header: (h) => {
194
- metric = h.metric('Count', '0');
195
- },
196
- main: () => { },
197
- sidebar: (s) => {
198
- s.button('inc', () => {
199
- metric?.update('1');
200
- });
201
- },
151
+ ui.multiSelect('Models', ['gpt-4o', 'claude-3.5', 'llama-3.1'], {
152
+ defaults: ['gpt-4o'],
202
153
  });
203
154
  },
204
155
  });
205
156
  runtime.addConnection(socket);
206
157
  runtime.handleRawMessage(socket, JSON.stringify({
207
158
  type: 'READY',
208
- payload: { viewport: { width: 200, height: 200 }, theme: null },
159
+ payload: { viewport: { width: 120, height: 80 }, theme: null },
209
160
  }));
210
- const render = byType(sent, 'RENDER')[0];
211
- const buttonId = render.payload.html.match(/data-lk-id="(button-[^"]+)"/)?.[1];
212
- expect(buttonId).toBeDefined();
213
- expect(render.payload.html).toContain('lk-metric-value');
161
+ const render = ofType(sent, 'RENDER')[0];
162
+ const id = render.payload.html.match(/data-lk-id="(multiSelect-[^"]+)"/)?.[1];
163
+ expect(id).toBeDefined();
214
164
  runtime.handleRawMessage(socket, JSON.stringify({
215
165
  type: 'EVENT',
216
- payload: { id: buttonId, event: 'click' },
217
- }));
218
- const lastMetricFrag = [...byType(sent, 'FRAGMENT')]
219
- .filter((f) => f.payload.html.includes('lk-metric'))
220
- .at(-1);
221
- expect(lastMetricFrag?.payload.html).toContain('1');
222
- });
223
- it('keeps scopes isolated across connections', () => {
224
- const a = createSocket();
225
- const b = createSocket();
226
- const runtime = createWebSocketHub({
227
- title: 'Isolation',
228
- callback: (ui) => {
229
- ui.text(`scope-${ui.scope.id}`);
166
+ payload: {
167
+ id,
168
+ event: 'change',
169
+ value: ['claude-3.5', 'llama-3.1'],
230
170
  },
231
- });
232
- const scopeA = runtime.addConnection(a.socket);
233
- const scopeB = runtime.addConnection(b.socket);
234
- runtime.handleRawMessage(a.socket, JSON.stringify({
235
- type: 'READY',
236
- payload: { viewport: { width: 10, height: 10 }, theme: null },
237
- }));
238
- runtime.handleRawMessage(b.socket, JSON.stringify({
239
- type: 'READY',
240
- payload: { viewport: { width: 20, height: 20 }, theme: null },
241
171
  }));
242
- const aRender = byType(a.sent, 'RENDER')[0];
243
- const bRender = byType(b.sent, 'RENDER')[0];
244
- expect(aRender.payload.html).toContain(`scope-${scopeA.id}`);
245
- expect(bRender.payload.html).toContain(`scope-${scopeB.id}`);
246
- expect(scopeA.id).not.toBe(scopeB.id);
172
+ await new Promise((resolve) => setTimeout(resolve, 25));
173
+ const fragment = batchedEntries(sent)
174
+ .find((entry) => entry.type === 'FRAGMENT' && entry.payload.id === id);
175
+ expect(fragment).toBeDefined();
176
+ if (fragment?.type !== 'FRAGMENT')
177
+ throw new Error('Expected FRAGMENT entry');
178
+ expect(fragment.payload.html).toContain('value="claude-3.5" checked');
179
+ expect(fragment.payload.html).toContain('value="llama-3.1" checked');
180
+ expect(fragment.payload.html).toContain('value="gpt-4o"');
247
181
  });
248
182
  });
249
183
  //# sourceMappingURL=ws-flow.integration.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ws-flow.integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/ws-flow.integration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,SAAS,YAAY;IACnB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,OAAO;QACL,MAAM,EAAE;YACN,IAAI,CAAC,IAAY;gBACf,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;SACF;QACD,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAA8B,IAAc,EAAE,IAAY;IACvE,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC/B,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAQ,CAAC;AAC/C,CAAC;AAED,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC;YACjC,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;gBACf,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC/B,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;oBACnB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACvB,CAAC,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;SAClE,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,CAAgD,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,QAAQ,GAAG,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChF,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;SAC1C,CAAC,CACH,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,CAAkD,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAClG,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC;YACjC,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;gBACf,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;YAC3C,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SAChE,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,CAAgC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAE9B,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;SAC5D,CAAC,CACH,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,CAA4C,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC;YACjC,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;gBACf,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;gBAClD,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;oBACnB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACnB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACnB,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,CAAC,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SAChE,CAAC,CACH,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAgC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/E,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;SAC1C,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,CAAgD,IAAI,EAAE,cAAc,CAAC,CAAC;QAC3F,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;QACxC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,kBAAkB,CAAC;YACjC,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;gBACf,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACnE,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,EAAE;oBACvB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChC,CAAC,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SAC/D,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,CAAgC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAE5B,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;SACvD,CAAC,CACH,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC;YACjC,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;gBACf,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7E,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;SAChE,CAAC,CACH,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEjC,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;SAC3B,CAAC,CACH,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,CAAgC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC;YACjC,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;gBACf,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;gBACpC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACrC,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SAChE,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,CAAgC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5B,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAE/B,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;SACnD,CAAC,CACH,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAA4C,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAEtD,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;SACxD,CAAC,CACH,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,CAA4C,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9F,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC;YACjC,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;gBACf,IAAI,MAAgD,CAAC;gBACrD,EAAE,CAAC,KAAK,CAAC;oBACP,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;wBACZ,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;oBAClC,CAAC;oBACD,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;oBACd,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;wBACb,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE;4BACnB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;wBACtB,CAAC,CAAC,CAAC;oBACL,CAAC;iBACF,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SAChE,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,CAAgC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAEzD,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;SAC1C,CAAC,CACH,CAAC;QAEF,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAgC,IAAI,EAAE,UAAU,CAAC,CAAC;aAChF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;aACnD,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACV,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,kBAAkB,CAAC;YACjC,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;gBACf,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAClC,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,CAAC,gBAAgB,CACtB,CAAC,CAAC,MAAM,EACR,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SAC9D,CAAC,CACH,CAAC;QACF,OAAO,CAAC,gBAAgB,CACtB,CAAC,CAAC,MAAM,EACR,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SAC9D,CAAC,CACH,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,CAAgC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,MAAM,CAAgC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"ws-flow.integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/ws-flow.integration.test.ts"],"names":[],"mappings":"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"}
@@ -13,11 +13,19 @@ function coerceValue(target) {
13
13
  return Number(target.value);
14
14
  return target.value;
15
15
  }
16
- if (target instanceof HTMLSelectElement || target instanceof HTMLTextAreaElement) {
16
+ if (target instanceof HTMLSelectElement || target instanceof HTMLTextAreaElement)
17
17
  return target.value;
18
- }
19
18
  return undefined;
20
19
  }
20
+ function coerceMultiSelectValue(root) {
21
+ const values = [];
22
+ for (const box of Array.from(root.querySelectorAll('input[type="checkbox"][data-lk-multi-option]'))) {
23
+ if (box.checked) {
24
+ values.push(box.value);
25
+ }
26
+ }
27
+ return values;
28
+ }
21
29
  function resolveComponentId(target) {
22
30
  if (!(target instanceof Element))
23
31
  return null;
@@ -41,48 +49,109 @@ function closestWithEventToken(target, token) {
41
49
  }
42
50
  return null;
43
51
  }
44
- export function bindEventDelegation(root, channel) {
52
+ function hasAnyEventToken(element, tokens) {
53
+ return tokens.some((token) => hasEventToken(element, token));
54
+ }
55
+ function sendEvent(channel, id, event, value) {
56
+ channel.send({
57
+ type: 'EVENT',
58
+ payload: { id, event, value },
59
+ });
60
+ }
61
+ function bindWidgetClicks(root, channel) {
45
62
  root.addEventListener('click', (event) => {
46
- if (!(event.target instanceof Element))
63
+ if (!(event.target instanceof Element)) {
47
64
  return;
48
- const tabBtn = event.target.closest('.lk-tab[data-lk-tab-target]');
49
- if (tabBtn && !tabBtn.disabled) {
50
- const tabsRoot = tabBtn.closest('.lk-tabs');
51
- const target = tabBtn.dataset.lkTabTarget;
52
- if (tabsRoot && target) {
53
- for (const b of Array.from(tabsRoot.querySelectorAll('.lk-tab[data-lk-tab-target]'))) {
54
- b.classList.toggle('is-active', b.dataset.lkTabTarget === target);
55
- }
56
- for (const panel of Array.from(tabsRoot.querySelectorAll('.lk-tab-panel'))) {
57
- const match = panel.dataset.lkTabPanel === target;
58
- if (match) {
59
- panel.removeAttribute('hidden');
60
- }
61
- else {
62
- panel.setAttribute('hidden', '');
63
- }
64
- }
65
- const id = resolveComponentId(tabsRoot);
66
- if (id) {
67
- channel.send({
68
- type: 'EVENT',
69
- payload: { id, event: 'change', value: target },
70
- });
71
- }
65
+ }
66
+ const swatch = closestWithEventToken(event.target, 'pick-swatch');
67
+ if (swatch) {
68
+ event.preventDefault();
69
+ event.stopImmediatePropagation();
70
+ const holder = swatch.closest('[data-lk-id][data-lk-kind="colorPicker"]');
71
+ const id = holder?.dataset.lkId;
72
+ const picked = swatch.getAttribute('data-lk-swatch') ?? '';
73
+ if (!holder || !id || !picked) {
74
+ return;
72
75
  }
76
+ const colorInput = holder.querySelector('input[type="color"]');
77
+ if (colorInput) {
78
+ colorInput.value = picked;
79
+ }
80
+ const code = holder.querySelector('.lk-color-value');
81
+ if (code) {
82
+ code.textContent = picked;
83
+ }
84
+ sendEvent(channel, id, 'change', picked);
85
+ return;
86
+ }
87
+ const filmItem = closestWithEventToken(event.target, 'filmstrip-select');
88
+ if (!filmItem) {
89
+ return;
90
+ }
91
+ event.preventDefault();
92
+ event.stopImmediatePropagation();
93
+ const strip = filmItem.closest('.lk-film-strip[data-lk-id]');
94
+ const id = strip?.dataset.lkId;
95
+ if (!strip || !id) {
96
+ return;
97
+ }
98
+ const index = Number(filmItem.dataset.lkIndex ?? '-1');
99
+ const buttons = Array.from(strip.querySelectorAll('.lk-film-item[data-lk-index]'));
100
+ const preview = strip.querySelector('.lk-film-strip-viewer img');
101
+ for (const [i, button] of buttons.entries()) {
102
+ const active = i === index;
103
+ button.classList.toggle('is-selected', active);
104
+ button.setAttribute('aria-selected', active ? 'true' : 'false');
105
+ if (!active || !preview) {
106
+ continue;
107
+ }
108
+ const src = button.dataset.lkSrc;
109
+ const alt = button.dataset.lkAlt;
110
+ if (src) {
111
+ preview.src = src;
112
+ }
113
+ if (alt) {
114
+ preview.alt = alt;
115
+ }
116
+ }
117
+ if (index >= 0) {
118
+ sendEvent(channel, id, 'change', index);
73
119
  }
74
120
  });
121
+ }
122
+ function bindTabs(root, channel) {
75
123
  root.addEventListener('click', (event) => {
76
124
  if (!(event.target instanceof Element))
77
125
  return;
78
- const clickable = closestWithEventToken(event.target, 'click');
79
- if (!clickable)
126
+ const tabBtn = event.target.closest('.lk-tab[data-lk-tab-target]');
127
+ if (!tabBtn || tabBtn.disabled)
80
128
  return;
81
- const id = resolveComponentId(clickable);
129
+ const tabsRoot = tabBtn.closest('.lk-tabs');
130
+ const target = tabBtn.dataset.lkTabTarget;
131
+ if (!tabsRoot || !target)
132
+ return;
133
+ for (const b of Array.from(tabsRoot.querySelectorAll('.lk-tab[data-lk-tab-target]'))) {
134
+ const active = b.dataset.lkTabTarget === target;
135
+ b.classList.toggle('is-active', active);
136
+ b.setAttribute('aria-selected', active ? 'true' : 'false');
137
+ b.tabIndex = active ? 0 : -1;
138
+ }
139
+ for (const panel of Array.from(tabsRoot.querySelectorAll('.lk-tab-panel'))) {
140
+ const match = panel.dataset.lkTabPanel === target;
141
+ if (match) {
142
+ panel.removeAttribute('hidden');
143
+ }
144
+ else {
145
+ panel.setAttribute('hidden', '');
146
+ }
147
+ }
148
+ const id = resolveComponentId(tabsRoot);
82
149
  if (!id)
83
150
  return;
84
- channel.send({ type: 'EVENT', payload: { id, event: 'click' } });
151
+ sendEvent(channel, id, 'change', target);
85
152
  });
153
+ }
154
+ function bindTableClicks(root, channel) {
86
155
  root.addEventListener('click', (event) => {
87
156
  if (!(event.target instanceof Element))
88
157
  return;
@@ -94,8 +163,25 @@ export function bindEventDelegation(root, channel) {
94
163
  const rowId = tableRow.dataset.lkTableRowId;
95
164
  if (!id || !rowId)
96
165
  return;
97
- channel.send({ type: 'EVENT', payload: { id, event: 'click', value: rowId } });
166
+ sendEvent(channel, id, 'click', rowId);
98
167
  });
168
+ }
169
+ function bindGenericClicks(root, channel) {
170
+ root.addEventListener('click', (event) => {
171
+ if (!(event.target instanceof Element))
172
+ return;
173
+ const clickable = closestWithEventToken(event.target, 'click');
174
+ if (!clickable)
175
+ return;
176
+ if (hasAnyEventToken(clickable, ['pick-swatch', 'filmstrip-select']))
177
+ return;
178
+ const id = resolveComponentId(clickable);
179
+ if (!id)
180
+ return;
181
+ sendEvent(channel, id, 'click');
182
+ });
183
+ }
184
+ function bindChanges(root, channel) {
99
185
  root.addEventListener('change', (event) => {
100
186
  if (!(event.target instanceof Element))
101
187
  return;
@@ -105,11 +191,15 @@ export function bindEventDelegation(root, channel) {
105
191
  const id = resolveComponentId(changeable);
106
192
  if (!id)
107
193
  return;
108
- channel.send({
109
- type: 'EVENT',
110
- payload: { id, event: 'change', value: coerceValue(event.target) },
111
- });
194
+ const holder = changeable.closest('[data-lk-kind="multiSelect"]');
195
+ if (holder) {
196
+ sendEvent(channel, id, 'change', coerceMultiSelectValue(holder));
197
+ return;
198
+ }
199
+ sendEvent(channel, id, 'change', coerceValue(event.target));
112
200
  });
201
+ }
202
+ function bindLiveInput(root, channel) {
113
203
  root.addEventListener('input', (event) => {
114
204
  if (!(event.target instanceof Element))
115
205
  return;
@@ -121,11 +211,10 @@ export function bindEventDelegation(root, channel) {
121
211
  const id = resolveComponentId(liveInput);
122
212
  if (!id)
123
213
  return;
124
- channel.send({
125
- type: 'EVENT',
126
- payload: { id, event: 'change', value: coerceValue(event.target) },
127
- });
214
+ sendEvent(channel, id, 'change', coerceValue(event.target));
128
215
  });
216
+ }
217
+ function bindNumberClamp(root, channel) {
129
218
  root.addEventListener('blur', (event) => {
130
219
  if (!(event.target instanceof HTMLInputElement))
131
220
  return;
@@ -148,11 +237,10 @@ export function bindEventDelegation(root, channel) {
148
237
  const id = resolveComponentId(clamped);
149
238
  if (!id)
150
239
  return;
151
- channel.send({
152
- type: 'EVENT',
153
- payload: { id, event: 'change', value: next },
154
- });
240
+ sendEvent(channel, id, 'change', next);
155
241
  }, true);
242
+ }
243
+ function bindCopyCode(root) {
156
244
  root.addEventListener('click', async (event) => {
157
245
  if (!(event.target instanceof Element))
158
246
  return;
@@ -177,6 +265,8 @@ export function bindEventDelegation(root, channel) {
177
265
  // ignore clipboard errors in unsupported contexts
178
266
  }
179
267
  });
268
+ }
269
+ function bindFileUpload(root, channel) {
180
270
  root.addEventListener('change', async (event) => {
181
271
  if (!(event.target instanceof HTMLInputElement))
182
272
  return;
@@ -188,7 +278,7 @@ export function bindEventDelegation(root, channel) {
188
278
  return;
189
279
  const files = event.target.files ? Array.from(event.target.files) : [];
190
280
  if (files.length === 0) {
191
- channel.send({ type: 'EVENT', payload: { id, event: 'change', value: null } });
281
+ sendEvent(channel, id, 'change', null);
192
282
  return;
193
283
  }
194
284
  const formData = new FormData();
@@ -197,36 +287,41 @@ export function bindEventDelegation(root, channel) {
197
287
  }
198
288
  try {
199
289
  const connectionId = String(window.localStorage.getItem('lk-connection-id') ?? '');
290
+ const maxSize = holder.dataset.lkMaxSize;
200
291
  const search = connectionId ? `?connectionId=${encodeURIComponent(connectionId)}` : '';
201
292
  const uploadUrl = `/upload${search}`;
202
293
  if (isDebugWs()) {
203
294
  console.debug('[lastriko] fetch →', uploadUrl, 'POST', '(multipart)');
204
295
  }
205
- const response = await fetch(uploadUrl, { method: 'POST', body: formData });
296
+ const headers = new Headers();
297
+ if (maxSize) {
298
+ headers.set('x-lastriko-upload-max-size', maxSize);
299
+ }
300
+ const response = await fetch(uploadUrl, { method: 'POST', body: formData, headers });
206
301
  if (isDebugWs()) {
207
302
  console.debug('[lastriko] fetch ←', uploadUrl, response.status, response.statusText);
208
303
  }
209
- if (!response.ok) {
304
+ if (!response.ok)
210
305
  return;
211
- }
212
306
  const payload = await response.json();
213
- const uploaded = Array.isArray(payload)
214
- ? payload
215
- : payload.file;
216
- channel.send({
217
- type: 'EVENT',
218
- payload: {
219
- id,
220
- event: 'change',
221
- value: uploaded ?? null,
222
- },
223
- });
307
+ sendEvent(channel, id, 'change', payload ?? null);
224
308
  }
225
309
  catch {
226
310
  // best effort
227
311
  }
228
312
  });
229
313
  }
314
+ export function bindEventDelegation(root, channel) {
315
+ bindWidgetClicks(root, channel);
316
+ bindTabs(root, channel);
317
+ bindGenericClicks(root, channel);
318
+ bindTableClicks(root, channel);
319
+ bindChanges(root, channel);
320
+ bindLiveInput(root, channel);
321
+ bindNumberClamp(root, channel);
322
+ bindCopyCode(root);
323
+ bindFileUpload(root, channel);
324
+ }
230
325
  export function bindThemeToggle(root, channel) {
231
326
  const toggle = root.getElementById('lk-theme-toggle');
232
327
  if (!toggle)