@tienne/gestalt 0.90.1 → 0.92.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 (94) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/plugin/skills/architecture/SKILL.md +27 -2
  3. package/dist/schemas/architecture-ir.schema.json +20 -0
  4. package/dist/src/architecture/compare-layout.d.ts.map +1 -1
  5. package/dist/src/architecture/compare-layout.js +1 -0
  6. package/dist/src/architecture/compare-layout.js.map +1 -1
  7. package/dist/src/architecture/dataflow-layout.d.ts.map +1 -1
  8. package/dist/src/architecture/dataflow-layout.js +1 -0
  9. package/dist/src/architecture/dataflow-layout.js.map +1 -1
  10. package/dist/src/architecture/drilldown.d.ts.map +1 -1
  11. package/dist/src/architecture/drilldown.js +1 -0
  12. package/dist/src/architecture/drilldown.js.map +1 -1
  13. package/dist/src/architecture/html-client.d.ts +8 -0
  14. package/dist/src/architecture/html-client.d.ts.map +1 -1
  15. package/dist/src/architecture/html-client.js +312 -23
  16. package/dist/src/architecture/html-client.js.map +1 -1
  17. package/dist/src/architecture/html-renderer.d.ts.map +1 -1
  18. package/dist/src/architecture/html-renderer.js +240 -15
  19. package/dist/src/architecture/html-renderer.js.map +1 -1
  20. package/dist/src/architecture/html-theme.d.ts +2 -0
  21. package/dist/src/architecture/html-theme.d.ts.map +1 -1
  22. package/dist/src/architecture/html-theme.js +68 -1
  23. package/dist/src/architecture/html-theme.js.map +1 -1
  24. package/dist/src/architecture/ir-schema.d.ts +66 -26
  25. package/dist/src/architecture/ir-schema.d.ts.map +1 -1
  26. package/dist/src/architecture/ir-schema.js +9 -0
  27. package/dist/src/architecture/ir-schema.js.map +1 -1
  28. package/dist/src/architecture/kind-text.d.ts +10 -0
  29. package/dist/src/architecture/kind-text.d.ts.map +1 -1
  30. package/dist/src/architecture/kind-text.js +17 -0
  31. package/dist/src/architecture/kind-text.js.map +1 -1
  32. package/dist/src/architecture/layout.d.ts +5 -0
  33. package/dist/src/architecture/layout.d.ts.map +1 -1
  34. package/dist/src/architecture/layout.js +14 -3
  35. package/dist/src/architecture/layout.js.map +1 -1
  36. package/dist/src/architecture/merge.d.ts.map +1 -1
  37. package/dist/src/architecture/merge.js +9 -0
  38. package/dist/src/architecture/merge.js.map +1 -1
  39. package/dist/src/architecture/packs/data.d.ts +14 -0
  40. package/dist/src/architecture/packs/data.d.ts.map +1 -1
  41. package/dist/src/architecture/packs/data.js +11 -7
  42. package/dist/src/architecture/packs/data.js.map +1 -1
  43. package/dist/src/architecture/packs/generic.d.ts +7 -0
  44. package/dist/src/architecture/packs/generic.d.ts.map +1 -1
  45. package/dist/src/architecture/packs/generic.js +13 -6
  46. package/dist/src/architecture/packs/generic.js.map +1 -1
  47. package/dist/src/architecture/packs/harness.d.ts +10 -0
  48. package/dist/src/architecture/packs/harness.d.ts.map +1 -1
  49. package/dist/src/architecture/packs/harness.js +18 -6
  50. package/dist/src/architecture/packs/harness.js.map +1 -1
  51. package/dist/src/architecture/packs/index.d.ts +110 -0
  52. package/dist/src/architecture/packs/index.d.ts.map +1 -1
  53. package/dist/src/architecture/packs/infra.d.ts +10 -0
  54. package/dist/src/architecture/packs/infra.d.ts.map +1 -1
  55. package/dist/src/architecture/packs/infra.js +9 -4
  56. package/dist/src/architecture/packs/infra.js.map +1 -1
  57. package/dist/src/architecture/packs/knowledge.d.ts +8 -0
  58. package/dist/src/architecture/packs/knowledge.d.ts.map +1 -1
  59. package/dist/src/architecture/packs/knowledge.js +8 -4
  60. package/dist/src/architecture/packs/knowledge.js.map +1 -1
  61. package/dist/src/architecture/packs/process.d.ts +10 -0
  62. package/dist/src/architecture/packs/process.d.ts.map +1 -1
  63. package/dist/src/architecture/packs/process.js +14 -5
  64. package/dist/src/architecture/packs/process.js.map +1 -1
  65. package/dist/src/architecture/packs/types.d.ts +6 -0
  66. package/dist/src/architecture/packs/types.d.ts.map +1 -1
  67. package/dist/src/architecture/packs/web-product.d.ts +51 -0
  68. package/dist/src/architecture/packs/web-product.d.ts.map +1 -1
  69. package/dist/src/architecture/packs/web-product.js +94 -33
  70. package/dist/src/architecture/packs/web-product.js.map +1 -1
  71. package/dist/src/architecture/sequence-layout.d.ts.map +1 -1
  72. package/dist/src/architecture/sequence-layout.js +1 -0
  73. package/dist/src/architecture/sequence-layout.js.map +1 -1
  74. package/dist/src/architecture/sequence-views.d.ts +155 -0
  75. package/dist/src/architecture/sequence-views.d.ts.map +1 -0
  76. package/dist/src/architecture/sequence-views.js +407 -0
  77. package/dist/src/architecture/sequence-views.js.map +1 -0
  78. package/dist/src/architecture/types.d.ts +15 -0
  79. package/dist/src/architecture/types.d.ts.map +1 -1
  80. package/dist/src/architecture/types.js +4 -0
  81. package/dist/src/architecture/types.js.map +1 -1
  82. package/dist/src/architecture/validator.d.ts +9 -1
  83. package/dist/src/architecture/validator.d.ts.map +1 -1
  84. package/dist/src/architecture/validator.js +102 -1
  85. package/dist/src/architecture/validator.js.map +1 -1
  86. package/dist/src/mcp/tools/architecture-passthrough.d.ts.map +1 -1
  87. package/dist/src/mcp/tools/architecture-passthrough.js +3 -1
  88. package/dist/src/mcp/tools/architecture-passthrough.js.map +1 -1
  89. package/package.json +1 -1
  90. package/plugin/.codex-plugin/plugin.json +1 -1
  91. package/plugin/.mcp.json +1 -1
  92. package/plugin/mcp.json +1 -1
  93. package/plugin/skills/architecture/SKILL.md +27 -2
  94. package/schemas/architecture-ir.schema.json +20 -0
@@ -1,7 +1,7 @@
1
1
  import { BAND_LINE_X, BAND_LINE_Y, BAND_TITLE_HALF, BAND_TITLE_X } from './canvas-geometry.js';
2
2
  import { FOCUS_SOURCE } from './focus.js';
3
3
  import { PRODUCT_COLORS } from './html-theme.js';
4
- import { FRAME_PAD } from './layout.js';
4
+ import { FRAME_PAD, NODE_DESC_LINE } from './layout.js';
5
5
  // component는 칩 글자를 노드의 displayKind에서, 색과 아이콘은 renderClass에서 가져온다. types.ts의 displayKindOf, chipTextOverride와 같은 규칙이다.
6
6
  // 이 조각은 component를 쓸 수 있는 어휘에만 싣는다. 늘 실으면 component가 없는 그림의 바이트까지 바뀐다
7
7
  const COMPONENT_DKIND = "n.kind === 'component' ? 'cx_' + (n.renderClass || 'service') : ";
@@ -150,7 +150,10 @@ const VIEW_CLICK = `var vm = e.target.closest('.link.seq-m');
150
150
  const VIEW_KEY = `var vm = e.target.closest('.link.seq-m');
151
151
  if (vm) { e.preventDefault(); activateMessage(vm); return; }
152
152
  `;
153
- const VIEW_FUNCS = ` var messages = data.messages || {};
153
+ // 순서도 보기 바가 화면 위를 덮으면 머리 카드는 그 바 아래에 붙인다
154
+ const STICK_FROM = '-view.y / view.k';
155
+ const SEQ_STICK_FROM = '(seqTop() - view.y) / view.k';
156
+ const viewFuncs = (sequences) => ` var messages = data.messages || {};
154
157
  // 전체 레벨은 지도 위 카드 줄만큼 내려가 있다. 같은 이름으로 다시 선언해 그 거리를 더한 쪽이 쓰이게 한다
155
158
  function cardCenter(c) {
156
159
  var s = c.closest('.level');
@@ -162,7 +165,7 @@ const VIEW_FUNCS = ` var messages = data.messages || {};
162
165
  if (!bar) return;
163
166
  var top = parseFloat(bar.style.top);
164
167
  var end = Number(active.getAttribute('data-h')) - top - bar.offsetHeight;
165
- var dy = Math.min(Math.max(0, -view.y / view.k - top), Math.max(0, end));
168
+ var dy = Math.min(Math.max(0, ${sequences ? SEQ_STICK_FROM : STICK_FROM} - top), Math.max(0, end));
166
169
  var t = dy > 0 ? 'translateY(' + dy + 'px)' : '';
167
170
  bar.style.transform = t;
168
171
  bar.classList.toggle('stuck', dy > 0);
@@ -198,6 +201,184 @@ const VIEW_POP = ` setupPop('views-btn', 'views');
198
201
  var viewsPop = byId('views');
199
202
  if (viewsPop) viewsPop.addEventListener('click', function (e) { if (e.target.closest('a')) closePops(false); });
200
203
  `;
204
+ // 순서도 보기 조각. 순서도가 있는 그림에만 싣는다.
205
+ // 단계별 카드와 따라가기는 순서도 섹션 옆 형제 섹션(.seq-alt)이고 data-level-id가 없어 레벨 목록에 안 잡힌다.
206
+ // 보기는 레벨마다 페이지 메모리에만 둔다. 주소에 실으면 보기 전환이 뒤로가기 기록을 채운다
207
+ const SEQ_FUNCS = ` var seqBar = byId('seq-bar');
208
+ var seqSteps = byId('seq-steps');
209
+ var seqCap = seqBar.querySelector('.seq-cap');
210
+ var seqPlayBtn = seqBar.querySelector('.sw-play');
211
+ var seqSay = seqCap.querySelector('.sw-say');
212
+ var seqModeBtns = Array.prototype.slice.call(seqBar.querySelectorAll('button[data-seq-mode]'));
213
+ var seqAlts = Array.prototype.slice.call(doc.querySelectorAll('.seq-alt'));
214
+ var seqBase = null;
215
+ var seqMode = 'seq';
216
+ var seqModes = {};
217
+ var seqAt = {};
218
+ var seqN = 0;
219
+ var seqTimer = 0;
220
+ function seqNarrow() { return window.matchMedia('(max-width: 860px)').matches; }
221
+ function seqTop() { return seqBar.hidden ? 0 : seqBar.offsetTop + seqBar.offsetHeight; }
222
+ function seqInset() {
223
+ var r = { t: 0, r: 0, b: 0 };
224
+ if (seqBar.hidden) return r;
225
+ r.t = seqTop();
226
+ if (!seqSteps.hidden) {
227
+ if (seqNarrow()) r.b = seqSteps.offsetHeight + 16;
228
+ else r.r = seqSteps.offsetWidth + 16;
229
+ }
230
+ return r;
231
+ }
232
+ function seqBaseId() { return seqBase ? seqBase.getAttribute('data-level-id') : null; }
233
+ function seqAlt(mode) {
234
+ var id = seqBaseId();
235
+ for (var i = 0; i < seqAlts.length; i++) {
236
+ if (seqAlts[i].getAttribute('data-seq-of') === id && seqAlts[i].getAttribute('data-seq-mode') === mode) return seqAlts[i];
237
+ }
238
+ return null;
239
+ }
240
+ function seqList() {
241
+ var id = seqBaseId();
242
+ var lists = seqSteps.querySelectorAll('.ss-list');
243
+ for (var i = 0; i < lists.length; i++) if (lists[i].getAttribute('data-seq-of') === id) return lists[i];
244
+ return null;
245
+ }
246
+ function seqTotal() {
247
+ var walk = seqAlt('walk');
248
+ return walk ? walk.querySelectorAll('.w-step').length : 0;
249
+ }
250
+ function seqStop() {
251
+ if (seqTimer) clearInterval(seqTimer);
252
+ seqTimer = 0;
253
+ seqPlayBtn.setAttribute('aria-pressed', 'false');
254
+ seqSay.setAttribute('aria-live', 'polite');
255
+ }
256
+ // 보기 바가 두 줄로 접히면 목록이 그 아래에서 시작해야 안 겹친다. 창 폭이 바뀌면 다시 잰다
257
+ function seqPlaceSteps() {
258
+ seqSteps.style.top = !seqSteps.hidden && !seqNarrow() ? seqTop() + 8 + 'px' : '';
259
+ }
260
+ function seqLeave() {
261
+ seqStop();
262
+ seqAlts.forEach(function (s) { s.hidden = true; });
263
+ seqBar.hidden = true;
264
+ seqSteps.hidden = true;
265
+ seqBase = null;
266
+ }
267
+ function showStep(n) {
268
+ var walk = seqAlt('walk');
269
+ var total = seqTotal();
270
+ if (!walk || !total) return;
271
+ seqN = Math.max(1, Math.min(total, n));
272
+ seqAt[seqBaseId()] = seqN;
273
+ var on = null;
274
+ walk.querySelectorAll('.w-step').forEach(function (p) {
275
+ var hit = Number(p.getAttribute('data-n')) === seqN;
276
+ p.classList.toggle('on', hit);
277
+ if (hit) on = p;
278
+ });
279
+ var from = on.getAttribute('data-from');
280
+ var to = on.getAttribute('data-to');
281
+ walk.querySelectorAll('.node').forEach(function (c) {
282
+ var id = c.getAttribute('data-node-id');
283
+ c.classList.toggle('w-dim', id !== from && id !== to);
284
+ });
285
+ var item = null;
286
+ var list = seqList();
287
+ if (list) list.querySelectorAll('button[data-n]').forEach(function (b) {
288
+ if (Number(b.getAttribute('data-n')) === seqN) { b.setAttribute('aria-current', 'step'); item = b; }
289
+ else b.removeAttribute('aria-current');
290
+ });
291
+ seqCap.querySelector('.sw-n').textContent = seqN + ' / ' + total;
292
+ seqCap.querySelector('.sw-p').textContent = item ? item.getAttribute('data-phase') : '';
293
+ seqCap.querySelector('.sw-t').textContent = item ? item.getAttribute('data-say') : '';
294
+ var block = seqCap.querySelector('.sw-b');
295
+ block.textContent = item ? item.getAttribute('data-block') : '';
296
+ block.hidden = !block.textContent;
297
+ if (item) item.scrollIntoView({ block: 'nearest' });
298
+ }
299
+ function applySeqMode(mode, refit) {
300
+ if (!seqBase) return;
301
+ seqStop();
302
+ closeDrawer(false);
303
+ if (active) clearLit(active);
304
+ seqMode = mode;
305
+ seqModes[seqBaseId()] = mode;
306
+ seqBase.hidden = mode !== 'seq';
307
+ var alt = mode === 'seq' ? null : seqAlt(mode);
308
+ seqAlts.forEach(function (s) { s.hidden = s !== alt; });
309
+ active = alt || seqBase;
310
+ if (envPicker) applyEnv(active);
311
+ seqModeBtns.forEach(function (b) { b.setAttribute('aria-pressed', String(b.getAttribute('data-seq-mode') === mode)); });
312
+ var walking = mode === 'walk';
313
+ seqCap.hidden = !walking;
314
+ seqSteps.hidden = !walking;
315
+ var list = seqList();
316
+ seqSteps.querySelectorAll('.ss-list').forEach(function (l) { l.hidden = l !== list; });
317
+ seqPlaceSteps();
318
+ if (walking) showStep(seqAt[seqBaseId()] || 1);
319
+ syncFocusBtn();
320
+ if (refit) {
321
+ fit('smart');
322
+ runSearch(false);
323
+ }
324
+ }
325
+ function syncSeqBar(id) {
326
+ seqStop();
327
+ var base = sectionOf(id);
328
+ var has = !!base && seqAlts.some(function (s) { return s.getAttribute('data-seq-of') === id; });
329
+ seqAlts.forEach(function (s) { s.hidden = true; });
330
+ seqBar.hidden = !has;
331
+ seqSteps.hidden = true;
332
+ seqBase = has ? base : null;
333
+ if (has) applySeqMode(seqModes[id] || 'seq', false);
334
+ }
335
+ function seqPlay() {
336
+ if (seqTimer) { seqStop(); return; }
337
+ if (seqN >= seqTotal()) showStep(1);
338
+ // 단추 이름은 '재생' 그대로 두고 눌림 상태로만 알린다. 이름까지 바꾸면 낭독기가 상태를 거꾸로 읽는다
339
+ seqPlayBtn.setAttribute('aria-pressed', 'true');
340
+ // 재생 중에 단계마다 읽어 주면 낭독이 밀려 쌓인다. 멈추면 seqStop이 되돌린다
341
+ seqSay.setAttribute('aria-live', 'off');
342
+ seqTimer = setInterval(function () {
343
+ // 마지막 단계는 재생을 먼저 끝내고 그린다. aria-live가 polite로 돌아온 뒤에 써야 낭독기가 읽는다
344
+ var next = seqN + 1;
345
+ if (next >= seqTotal()) { seqStop(); showStep(next); return; }
346
+ showStep(next);
347
+ }, 900);
348
+ }
349
+ seqBar.addEventListener('click', function (e) {
350
+ var b = e.target.closest('button');
351
+ if (!b) return;
352
+ var mode = b.getAttribute('data-seq-mode');
353
+ // 보기를 바꾼 뒤에도 키보드로 같은 바에서 이어 고를 수 있게 누른 단추에 포커스를 둔다
354
+ if (mode) { if (mode !== seqMode) { applySeqMode(mode, true); b.focus(); } return; }
355
+ if (b.classList.contains('sw-prev')) { seqStop(); showStep(seqN - 1); }
356
+ else if (b.classList.contains('sw-next')) { seqStop(); showStep(seqN + 1); }
357
+ else if (b.classList.contains('sw-play')) seqPlay();
358
+ });
359
+ seqSteps.addEventListener('click', function (e) {
360
+ var b = e.target.closest('button[data-n]');
361
+ if (!b) return;
362
+ seqStop();
363
+ showStep(Number(b.getAttribute('data-n')));
364
+ });
365
+ // 다른 탭에 가 있는 동안 단계가 혼자 넘어가 있지 않게 멈춘다
366
+ doc.addEventListener('visibilitychange', function () { if (doc.hidden) seqStop(); });
367
+ `;
368
+ const SEQ_FIT = `
369
+ var sq = seqInset();
370
+ W -= sq.r;
371
+ H -= sq.t + sq.b;`;
372
+ // ←, →는 따라가기 보기가 떠 있고 포커스가 보기 바, 단계 목록, 따라가기 지도 안이거나 아무 데도 없을 때만 단계를 넘긴다.
373
+ // 그 밖의 자리에서는 스크롤 같은 브라우저 기본 동작을 그대로 둔다
374
+ export const SEQ_KEYS = ` if ((e.key === 'ArrowLeft' || e.key === 'ArrowRight') && seqBase && seqMode === 'walk' && !seqBar.hidden &&
375
+ (t === doc.body || seqBar.contains(t) || seqSteps.contains(t) || !!(seqAlt('walk') && seqAlt('walk').contains(t)))) {
376
+ e.preventDefault();
377
+ seqStop();
378
+ showStep(seqN + (e.key === 'ArrowRight' ? 1 : -1));
379
+ return;
380
+ }
381
+ `;
201
382
  export const THEME_STORAGE_KEY = 'gestalt-architecture-theme';
202
383
  const HINT_STORAGE_KEY = 'gestalt-architecture-hint';
203
384
  // 첫 화면을 그리기 전에 저장한 테마를 걸어야 밝은 화면이 한 번 번쩍이지 않는다
@@ -226,8 +407,12 @@ export function renderClientScript(c) {
226
407
  var MICRO_HOSTS = {};
227
408
  (data.microHosts || []).forEach(function (id) { MICRO_HOSTS[id] = true; });
228
409
  var KIND_TEXT = ${JSON.stringify(c.kindText)};
410
+ var KIND_ABOUT = ${JSON.stringify(c.kindAbout)};
229
411
  var EVIDENCE_TEXT = ${JSON.stringify(c.evidenceText)};
230
412
  var LANE_TITLE = ${JSON.stringify(c.laneTitles)};
413
+ var LANE_ABOUT = ${JSON.stringify(c.laneAbout)};
414
+ var STAGE_LANE_ABOUT = ${JSON.stringify(c.stageLaneAbout)};
415
+ var NODE_DESC_LINE = ${NODE_DESC_LINE};
231
416
  var GUESS = ${JSON.stringify(c.inferredBadge)};
232
417
  var PLATFORM_CHIP = ${JSON.stringify(c.platformChip)};
233
418
  var PLATFORM_NAME = ${JSON.stringify(c.platformName)};
@@ -526,6 +711,86 @@ ${FOCUS_SOURCE}
526
711
  panel.appendChild(body);
527
712
  openDrawer();
528
713
  }
714
+ // 환경 필터로 숨긴 카드는 화면에 없으니 목록에서도 뺀다
715
+ function connectionList(body, id, incoming) {
716
+ var list = data.edges.filter(function (e) {
717
+ var other = incoming ? e.from : e.to;
718
+ return (incoming ? e.to : e.from) === id && other !== id && !envHidden(other);
719
+ });
720
+ if (!list.length) return;
721
+ body.appendChild(el('h3', null, (incoming ? '들어오는 연결 ' : '나가는 연결 ') + list.length + '개'));
722
+ var otherOf = {};
723
+ list.forEach(function (e) { otherOf[e.id] = incoming ? e.from : e.to; });
724
+ refButtons(body, list.map(function (e) { return e.id; }), function (eid) { goToNode(otherOf[eid]); },
725
+ function (eid) { return 'i-' + dkind(nodes[otherOf[eid]]); },
726
+ function (eid) { return label(otherOf[eid]) + ' (' + kindText(edges[eid].kind) + ')'; });
727
+ }
728
+ // 선은 레벨 엣지에서 먼저 찾는다. 포함 선은 드릴다운이 만든 것이라 IR 엣지 표에 없다
729
+ function edgeOf(id) {
730
+ var level = levels[levelIdOf(active)];
731
+ return (level && level.edgeById[id]) || edges[id] || null;
732
+ }
733
+ function renderEdgePanel(g) {
734
+ var id = g.getAttribute('data-link-id');
735
+ var e = edgeOf(id);
736
+ if (!e) return;
737
+ var ir = edges[id];
738
+ active.querySelectorAll('.node.selected').forEach(function (x) { x.classList.remove('selected'); });
739
+ lightLink(active, g);
740
+ returnFocus = g;
741
+ selectedId = null;
742
+ syncFocusBtn();
743
+ panel.textContent = '';
744
+ panel.appendChild(panelHead('flow', 'u-link', kindText(e.kind), '', label(e.from) + ' → ' + label(e.to)));
745
+ var body = el('div', 'dr-body');
746
+ if (KIND_ABOUT[e.kind]) body.appendChild(el('p', 'desc', KIND_ABOUT[e.kind]));
747
+ var facts = el('ul', 'facts');
748
+ if (e.kind !== 'contains') factRow(facts, '선', e.lineStyle === 'dashed' ? '점선 (문서나 사람 말로만 확인)' : '실선 (코드나 스펙으로 확인)');
749
+ if (g.classList.contains('x-account')) factRow(facts, '계정', '계정을 넘는 연결이에요');
750
+ if (ir && ir.actions && ir.actions.length) factRow(facts, 'action', ir.actions.join(', '));
751
+ if (facts.childNodes.length) body.appendChild(facts);
752
+ body.appendChild(el('h3', null, '양 끝'));
753
+ refButtons(body, [e.from, e.to], goToNode, function (nid) { return 'i-' + dkind(nodes[nid]); }, label);
754
+ if (ir) evidenceList(body, ir.evidence);
755
+ else body.appendChild(el('p', 'desc', 'parent로 정한 포함 관계라 따로 근거가 없어요.'));
756
+ panel.appendChild(body);
757
+ openDrawer();
758
+ }
759
+ // 레인 제목과 rect.lane은 같은 순서로 그려진다. 포커스 화면과 환경 필터가 같은 짝짓기를 쓴다
760
+ function laneCards(t) {
761
+ var sec = t.parentNode;
762
+ var titles = Array.prototype.slice.call(sec.querySelectorAll('.lane-title'));
763
+ var r = sec.querySelectorAll('rect.lane')[titles.indexOf(t)];
764
+ if (!r) return [];
765
+ var x = parseFloat(r.getAttribute('x'));
766
+ var w = parseFloat(r.getAttribute('width'));
767
+ var ids = [];
768
+ sec.querySelectorAll('.node').forEach(function (c) {
769
+ var left = parseFloat(c.style.left);
770
+ if (left >= x && left < x + w && !c.classList.contains('env-off')) ids.push(c.getAttribute('data-node-id'));
771
+ });
772
+ return ids;
773
+ }
774
+ function laneAria(title, count) { return title + ' 레인, 카드 ' + count + '개'; }
775
+ function renderLanePanel(t) {
776
+ var laneId = t.getAttribute('data-lane-id') || '';
777
+ var title = t.firstChild ? t.firstChild.textContent : '';
778
+ var ids = laneCards(t);
779
+ active.querySelectorAll('.node.selected').forEach(function (x) { x.classList.remove('selected'); });
780
+ clearLit(active);
781
+ returnFocus = t;
782
+ selectedId = null;
783
+ syncFocusBtn();
784
+ panel.textContent = '';
785
+ panel.appendChild(panelHead('flow', 'u-legend', '레인', '', title));
786
+ var body = el('div', 'dr-body');
787
+ var about = laneId.indexOf('stage:') === 0 ? STAGE_LANE_ABOUT : LANE_ABOUT[laneId];
788
+ if (about) body.appendChild(el('p', 'desc', about));
789
+ body.appendChild(el('h3', null, '이 칸의 카드 ' + ids.length + '개'));
790
+ if (ids.length) refButtons(body, ids, focusCard, function (nid) { return 'i-' + dkind(nodes[nid]); }, label);
791
+ panel.appendChild(body);
792
+ openDrawer();
793
+ }
529
794
  function renderPanel(id) {
530
795
  if (isStep(id)) { renderStepPanel(id); return; }
531
796
  var n = nodes[id];
@@ -573,6 +838,11 @@ ${FOCUS_SOURCE}
573
838
  body.appendChild(actions);
574
839
  }
575
840
  if (n.description) body.appendChild(el('p', 'desc', n.description));
841
+ var about = KIND_ABOUT[dkind(n)];
842
+ if (about) {
843
+ body.appendChild(el('h3', null, '이 종류는'));
844
+ body.appendChild(el('p', 'desc', about));
845
+ }
576
846
  renderFacts(n, body);${c.docs ? '\n renderDoc(n, body);' : ''}
577
847
  if (flowsBySvc[id]) {
578
848
  body.appendChild(el('h3', null, '흐름 ' + flowsBySvc[id].length + '개'));
@@ -582,6 +852,8 @@ ${FOCUS_SOURCE}
582
852
  body.appendChild(el('h3', null, '이 항목이 나오는 흐름 단계 ' + stepsByRef[id].length + '개'));
583
853
  refButtons(body, stepsByRef[id], goToNode, function () { return 'u-flow'; }, function (sid) { return stepFlow[sid].title + ' › ' + label(sid); });
584
854
  }
855
+ connectionList(body, id, true);
856
+ connectionList(body, id, false);
585
857
  body.appendChild(el('h3', null, '출처 ' + n.evidence.length + '개'));
586
858
  var ul = el('ul', 'evidence');
587
859
  n.evidence.forEach(function (ev) { ul.appendChild(renderEvidence(ev)); });
@@ -637,7 +909,7 @@ ${FOCUS_SOURCE}
637
909
  var s = dims(active);
638
910
  var W = stage.clientWidth;
639
911
  var H = stage.clientHeight - (sheet.hidden ? 0 : sheet.offsetHeight + 16);
640
- var M = 24;
912
+ var M = 24;${c.sequences ? SEQ_FIT : ''}
641
913
  var kw = (W - M * 2) / s.w;
642
914
  var kh = (H - M * 2) / s.h;
643
915
  var k = Math.min(kw, kh, 1);
@@ -648,7 +920,7 @@ ${FOCUS_SOURCE}
648
920
  k = clampK(k);
649
921
  view.k = k;
650
922
  view.x = Math.max(M, (W - s.w * k) / 2);
651
- view.y = top ? M : Math.max(M, (H - s.h * k) / 2);
923
+ view.y = ${c.sequences ? 'sq.t + (' : ''}top ? M : Math.max(M, (H - s.h * k) / 2)${c.sequences ? ')' : ''};
652
924
  glide();
653
925
  applyView();
654
926
  }
@@ -857,7 +1129,7 @@ ${FOCUS_SOURCE}
857
1129
  returnFocus = g;
858
1130
  renderTransitionPanel(t);
859
1131
  }
860
- ${c.views ? VIEW_FUNCS : ''}${c.docs ? DOC_FUNCS : ''} stage.addEventListener('click', function (e) {
1132
+ ${c.views ? viewFuncs(!!c.sequences) : ''}${c.sequences ? SEQ_FUNCS : ''}${c.docs ? DOC_FUNCS : ''} stage.addEventListener('click', function (e) {
861
1133
  if (suppressClick) { suppressClick = false; return; }
862
1134
  var more = e.target.closest('.pb.more');
863
1135
  if (more) { toggleProducts(more); return; }
@@ -873,6 +1145,10 @@ ${c.views ? VIEW_FUNCS : ''}${c.docs ? DOC_FUNCS : ''} stage.addEventListener('
873
1145
  if (link) { activateBundle(link); return; }
874
1146
  var ft = e.target.closest('.link.flow-t');
875
1147
  if (ft) { activateTransition(ft); return; }
1148
+ var edge = e.target.closest('.link[data-link-id]');
1149
+ if (edge) { renderEdgePanel(edge); return; }
1150
+ var lane = e.target.closest('.lane-title[data-lane-id]');
1151
+ if (lane) { renderLanePanel(lane); return; }
876
1152
  if (drawerOpen()) closeDrawer(false);
877
1153
  });
878
1154
  stage.addEventListener('dblclick', function (e) {
@@ -889,7 +1165,11 @@ ${c.views ? VIEW_FUNCS : ''}${c.docs ? DOC_FUNCS : ''} stage.addEventListener('
889
1165
  var link = e.target.closest('.link.bundle');
890
1166
  if (link) { e.preventDefault(); activateBundle(link); return; }
891
1167
  var ft = e.target.closest('.link.flow-t');
892
- if (ft) { e.preventDefault(); activateTransition(ft); }
1168
+ if (ft) { e.preventDefault(); activateTransition(ft); return; }
1169
+ var edge = e.target.closest('.link[data-link-id]');
1170
+ if (edge) { e.preventDefault(); renderEdgePanel(edge); return; }
1171
+ var lane = e.target.closest('.lane-title[data-lane-id]');
1172
+ if (lane) { e.preventDefault(); renderLanePanel(lane); }
893
1173
  });
894
1174
 
895
1175
  // 위치 표시
@@ -995,7 +1275,7 @@ ${c.views ? VIEW_FUNCS : ''}${c.docs ? DOC_FUNCS : ''} stage.addEventListener('
995
1275
  if (active) active.querySelectorAll('.node.anchor').forEach(function (x) { x.classList.remove('anchor'); });
996
1276
  renderCrumbs(trailItems(id));
997
1277
  syncFlowBtn();
998
- fit('smart');
1278
+ ${c.sequences ? ' syncSeqBar(id);\n' : ''} fit('smart');
999
1279
  runSearch(false);
1000
1280
  }
1001
1281
 
@@ -1094,9 +1374,12 @@ ${c.views ? VIEW_FUNCS : ''}${c.docs ? DOC_FUNCS : ''} stage.addEventListener('
1094
1374
  if (c < 800) return 'db_table';
1095
1375
  return '';
1096
1376
  }
1377
+ // types.ts의 hasCardDescription, layout.ts의 measureNode와 같은 판정이다
1378
+ function hasDesc(n) { return !!(n && n.description && n.description.trim()); }
1097
1379
  function cardHeight(id) {
1098
1380
  var f = services[id];
1099
- return (nodes[id] && nodes[id].displayName) || (f && (f.prodDomain || f.platforms.length > 0)) ? 60 : 48;
1381
+ var base = (nodes[id] && nodes[id].displayName) || (f && (f.prodDomain || f.platforms.length > 0)) ? 60 : 48;
1382
+ return base + (hasDesc(nodes[id]) ? NODE_DESC_LINE : 0);
1100
1383
  }
1101
1384
  function platformChips(id, parent) {
1102
1385
  var f = services[id];
@@ -1141,7 +1424,8 @@ ${c.views ? VIEW_FUNCS : ''}${c.docs ? DOC_FUNCS : ''} stage.addEventListener('
1141
1424
  platformChips(id, l2);
1142
1425
  d.appendChild(l2);
1143
1426
  } else if (sub) d.appendChild(sub);
1144
- d.title = n && n.displayName ? n.displayName + (guess ? ' (' + GUESS + ')' : '') + '\\n' + n.label : label(id);
1427
+ if (hasDesc(n)) d.appendChild(el('span', 'ds', n.description));
1428
+ d.title = (n && n.displayName ? n.displayName + (guess ? ' (' + GUESS + ')' : '') + '\\n' + n.label : label(id)) + (hasDesc(n) ? '\\n' + n.description : '');
1145
1429
  d.setAttribute('aria-label', label(id) + ', ' + kindText(kind));
1146
1430
  if (enterMap[id]) {
1147
1431
  var more = el('span', 'go', '›');
@@ -1250,12 +1534,10 @@ ${c.views ? VIEW_FUNCS : ''}${c.docs ? DOC_FUNCS : ''} stage.addEventListener('
1250
1534
  var xa = nodes[e.from] && nodes[e.to] && nodes[e.from].account && nodes[e.to].account && nodes[e.from].account !== nodes[e.to].account;
1251
1535
  var g = svgEl('g', { 'class': (bundle ? 'link bundle' : 'link e-' + e.kind) + (xa ? ' x-account' : ''), 'data-from': e.from, 'data-to': e.to });
1252
1536
  var name = bundle ? label(e.from) + ' → ' + label(e.to) + ' ' + e.count + '개'${c.mixedBundles ? MIXED_NOTE : ''} : kindText(e.kind) + ': ' + label(e.from) + ' → ' + label(e.to);
1253
- if (bundle) {
1254
- g.setAttribute('data-bundle-id', e.id);
1255
- g.setAttribute('tabindex', '0');
1256
- g.setAttribute('role', 'button');
1257
- g.setAttribute('aria-label', name);
1258
- }
1537
+ g.setAttribute(bundle ? 'data-bundle-id' : 'data-link-id', e.id);
1538
+ g.setAttribute('tabindex', '0');
1539
+ g.setAttribute('role', 'button');
1540
+ g.setAttribute('aria-label', name);
1259
1541
  var t = svgEl('title', {});
1260
1542
  t.textContent = name;
1261
1543
  g.appendChild(t);
@@ -1283,6 +1565,12 @@ ${c.views ? VIEW_FUNCS : ''}${c.docs ? DOC_FUNCS : ''} stage.addEventListener('
1283
1565
  if (!l.title) return;
1284
1566
  var title = el('div', 'lane-title', l.title);
1285
1567
  title.appendChild(el('span', 'n', String(l.count)));
1568
+ if (l.id) {
1569
+ title.setAttribute('data-lane-id', l.id);
1570
+ title.setAttribute('role', 'button');
1571
+ title.tabIndex = 0;
1572
+ title.setAttribute('aria-label', laneAria(l.title, l.count));
1573
+ }
1286
1574
  title.style.left = l.x + 'px';
1287
1575
  title.style.top = '22px';
1288
1576
  title.style.width = l.width + 'px';
@@ -1348,7 +1636,7 @@ ${c.views ? VIEW_FUNCS : ''}${c.docs ? DOC_FUNCS : ''} stage.addEventListener('
1348
1636
  pos: pos,
1349
1637
  edges: list.map(function (e) { return { id: e.id, from: e.from, to: e.to, kind: e.kind, count: 1, lineStyle: e.lineStyle }; }),
1350
1638
  lanes: lanes.map(function (l) {
1351
- return { x: l.left - LANE_PAD, width: l.right - l.left + LANE_PAD * 2, title: LANE_TITLE[l.id] || '', count: l.count };
1639
+ return { x: l.left - LANE_PAD, width: l.right - l.left + LANE_PAD * 2, id: l.id, title: LANE_TITLE[l.id] || '', count: l.count };
1352
1640
  }),
1353
1641
  width: x + NODE_W + LANE_PAD + PAD_X,
1354
1642
  height: PAD_TOP + maxH + PAD_BOTTOM,
@@ -1367,7 +1655,7 @@ ${c.views ? VIEW_FUNCS : ''}${c.docs ? DOC_FUNCS : ''} stage.addEventListener('
1367
1655
  function drawPair(memberIds, title) {
1368
1656
  closeDrawer(false);
1369
1657
  sections.forEach(function (s) { s.hidden = true; });
1370
- clearFocus();
1658
+ ${c.sequences ? ' seqLeave();\n' : ''} clearFocus();
1371
1659
  pair.hidden = false;
1372
1660
  pair.textContent = '';
1373
1661
  pair._cards = null;
@@ -1495,11 +1783,11 @@ ${c.views ? VIEW_FUNCS : ''}${c.docs ? DOC_FUNCS : ''} stage.addEventListener('
1495
1783
  Object.keys(pos).forEach(function (id) { if (pos[id].x >= x && pos[id].x < x + w) n += 1; });
1496
1784
  if (!n) return;
1497
1785
  var t = titles[i];
1498
- lanes.push({ x: x, width: w, title: t ? t.firstChild.textContent : '', count: n });
1786
+ lanes.push({ id: t ? t.getAttribute('data-lane-id') : null, x: x, width: w, title: t ? t.firstChild.textContent : '', count: n });
1499
1787
  });
1500
1788
  var cards = cardMap(src);
1501
1789
  src.hidden = true;
1502
- focusSec.textContent = '';
1790
+ ${c.sequences ? ' seqLeave();\n' : ''} focusSec.textContent = '';
1503
1791
  focusSec._cards = null;
1504
1792
  focusSec._links = null;
1505
1793
  focusSec.setAttribute('data-focus-level', levelId);
@@ -1708,7 +1996,7 @@ ${c.views ? VIEW_POP : ''} // 흐름 단추는 서비스 아래 레벨에서만
1708
1996
  });
1709
1997
  window.addEventListener('resize', function () {
1710
1998
  pops.forEach(function (p) { if (!p.pop.hidden) placePop(p.btn, p.pop); });
1711
- });
1999
+ ${c.sequences ? ' seqPlaceSteps();\n' : ''} });
1712
2000
  function goToNode(id) {
1713
2001
  if (!id) return;
1714
2002
  if (active && cardMap(active)[id]) { focusCard(id); return; }
@@ -1734,7 +2022,7 @@ ${c.views ? VIEW_POP : ''} // 흐름 단추는 서비스 아래 레벨에서만
1734
2022
 
1735
2023
  doc.addEventListener('keydown', function (e) {
1736
2024
  if (e.key === 'Escape') {
1737
- if (!productMenu.hidden) { closeProducts(true); return; }
2025
+ ${c.sequences ? ' seqStop();\n' : ''} if (!productMenu.hidden) { closeProducts(true); return; }
1738
2026
  if (anyPop()) { closePops(true); return; }
1739
2027
  if (drawerOpen()) { closeDrawer(true); return; }
1740
2028
  releaseFocus();
@@ -1743,7 +2031,7 @@ ${c.views ? VIEW_POP : ''} // 흐름 단추는 서비스 아래 레벨에서만
1743
2031
  var t = e.target;
1744
2032
  if (t && (t.tagName === 'INPUT' || t.tagName === 'TEXTAREA' || t.isContentEditable)) return;
1745
2033
  if (e.metaKey || e.ctrlKey || e.altKey) return;
1746
- if (e.key === '/') { e.preventDefault(); search.focus(); search.select(); }
2034
+ ${c.sequences ? SEQ_KEYS : ''} if (e.key === '/') { e.preventDefault(); search.focus(); search.select(); }
1747
2035
  else if (e.key === '+' || e.key === '=') zoomBy(1.25);
1748
2036
  else if (e.key === '-' || e.key === '_') zoomBy(0.8);
1749
2037
  else if (e.key === '0') fit('full');
@@ -1782,6 +2070,7 @@ ${c.views ? VIEW_POP : ''} // 흐름 단추는 서비스 아래 레벨에서만
1782
2070
  t.classList.toggle('env-off', n === 0);
1783
2071
  var count = t.querySelector('.n');
1784
2072
  if (count) count.textContent = n;
2073
+ if (t.hasAttribute('data-lane-id')) t.setAttribute('aria-label', laneAria(t.firstChild.textContent, n));
1785
2074
  });
1786
2075
  }
1787
2076
  // 고른 환경은 주소 해시 뒤 ?env=prod,dev로 싣는다. 주소를 보내면 받은 사람도 같은 환경으로 본다.
@@ -1 +1 @@
1
- {"version":3,"file":"html-client.js","sourceRoot":"","sources":["../../../src/architecture/html-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AA4BrD,sHAAsH;AACtH,sEAAsE;AACtE,MAAM,eAAe,GAAG,kEAAkE,CAAC;AAC3F,MAAM,cAAc,GAAG,+CAA+C,CAAC;AACvE,MAAM,UAAU,GAAG,6EAA6E,CAAC;AAEjG,2EAA2E;AAC3E,MAAM,UAAU,GACd,+EAA+E,CAAC;AAClF,MAAM,gBAAgB,GACpB,yFAAyF,CAAC;AAC5F,MAAM,UAAU,GAAG;8FAC2E,CAAC;AAE/F,kFAAkF;AAClF,MAAM,OAAO,GACX,kGAAkG,CAAC;AAErG,wDAAwD;AACxD,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iEA2H+C,OAAO;;;;CAIvE,CAAC;AAEF,6BAA6B;AAC7B,MAAM,UAAU,GAAG;;KAEd,CAAC;AACN,MAAM,QAAQ,GAAG;;KAEZ,CAAC;AACN,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ClB,CAAC;AACF,MAAM,QAAQ,GAAG;;;CAGhB,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,4BAA4B,CAAC;AAC9D,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAErD,+CAA+C;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG;;oCAEG,iBAAiB;;;MAG/C,CAAC;AAEP;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAkB;IACnD,OAAO;;;;;qBAKY,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;qBAC3B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;oBAC5B,SAAS;sBACP,WAAW,mBAAmB,WAAW,oBAAoB,YAAY,uBAAuB,eAAe;yBAC5G,cAAc;;;oBAGnB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;wBACtB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;qBACjC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;gBACjC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;wBACvB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;wBAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;2BAC3B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC;2BAChC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC;;;;;;;;mBAQxC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;;qBAEvE,iBAAiB;oBAClB,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8DlC,YAAY;;;yCAG2B,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CAkOlC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAuCjD,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4RlE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;MAU/C,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;MAiBzB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uEAgP0C,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qFA6HpB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;+FAoBtB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kFAgS7C,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wDAiDhE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2D3E,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;;;;;;2CAMkB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgLzE,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"html-client.js","sourceRoot":"","sources":["../../../src/architecture/html-client.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"html-renderer.d.ts","sourceRoot":"","sources":["../../../src/architecture/html-renderer.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAwBnG,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAsBrB,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEpF,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AA+ED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAetD;AAmVD,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEjE;AAimCD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,WAAW,EACtB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,6BAA6B,GAClC,MAAM,CAkBR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,WAAW,EACtB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,6BAA6B,GAClC,MAAM,CAuIR"}
1
+ {"version":3,"file":"html-renderer.d.ts","sourceRoot":"","sources":["../../../src/architecture/html-renderer.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AA6BnG,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAgCrB,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEpF,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AA+ED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAetD;AA2VD,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEjE;AA06CD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,WAAW,EACtB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,6BAA6B,GAClC,MAAM,CAkBR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,WAAW,EACtB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,6BAA6B,GAClC,MAAM,CAsJR"}