create-aiaui-module 0.1.1-TEST → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +13 -12
  2. package/bin/create-aiaui-module.js +24 -32
  3. package/package.json +4 -3
  4. package/runtime/_runtime/host.py +7 -15
  5. package/runtime/_runtime/registry.py +4 -1
  6. package/templates/JobDashboard/CUSTOMIZATION.md +123 -0
  7. package/templates/{JobInformation → JobDashboard}/README.md +22 -9
  8. package/templates/JobDashboard/backend/api.py +144 -0
  9. package/templates/JobDashboard/backend/config.json +46 -0
  10. package/templates/JobDashboard/client/dist/modules.js +3513 -0
  11. package/templates/JobDashboard/client/src/contract.ts +146 -0
  12. package/templates/JobDashboard/client/src/customization.ts +30 -0
  13. package/templates/JobDashboard/client/src/defaults/DefaultPanel.vue +129 -0
  14. package/templates/JobDashboard/client/src/defaults/Icons.vue +49 -0
  15. package/templates/JobDashboard/client/src/defaults/InputCarriers.vue +18 -0
  16. package/templates/JobDashboard/client/src/defaults/JobBottom.vue +32 -0
  17. package/templates/JobDashboard/client/src/defaults/JobCard.vue +48 -0
  18. package/templates/JobDashboard/client/src/defaults/JobHeader.vue +41 -0
  19. package/templates/JobDashboard/client/src/defaults/JobMiddle.vue +41 -0
  20. package/templates/JobDashboard/client/src/defaults/JobName.vue +9 -0
  21. package/templates/JobDashboard/client/src/defaults/LotId.vue +14 -0
  22. package/templates/JobDashboard/client/src/defaults/OutputCarriers.vue +21 -0
  23. package/templates/JobDashboard/client/src/defaults/Recipe.vue +12 -0
  24. package/templates/JobDashboard/client/src/defaults/Status.vue +29 -0
  25. package/templates/JobDashboard/client/src/defaults/Timeline.vue +65 -0
  26. package/templates/JobDashboard/client/src/defaults/board-data.ts +36 -0
  27. package/templates/JobDashboard/client/src/defaults/config-defaults.ts +36 -0
  28. package/templates/JobDashboard/client/src/defaults/format.ts +51 -0
  29. package/templates/JobDashboard/client/src/defaults/slots.ts +26 -0
  30. package/templates/JobDashboard/client/src/defaults/styles.css +619 -0
  31. package/templates/{JobInformation/resources → JobDashboard/client}/src/index.ts +10 -18
  32. package/templates/JobInformation/CUSTOMIZATION.md +0 -173
  33. package/templates/JobInformation/api.py +0 -53
  34. package/templates/JobInformation/resources/dist/modules.js +0 -2919
  35. package/templates/JobInformation/resources/src/bus.ts +0 -38
  36. package/templates/JobInformation/resources/src/contract.ts +0 -74
  37. package/templates/JobInformation/resources/src/customization.ts +0 -25
  38. package/templates/JobInformation/resources/src/defaults/DefaultPanel.vue +0 -22
  39. package/templates/JobInformation/resources/src/defaults/Header.vue +0 -12
  40. package/templates/JobInformation/resources/src/defaults/InputCarriers.vue +0 -15
  41. package/templates/JobInformation/resources/src/defaults/OutputCarriers.vue +0 -14
  42. package/templates/JobInformation/resources/src/defaults/Recipe.vue +0 -18
  43. package/templates/JobInformation/resources/src/defaults/Timeline.vue +0 -22
  44. package/templates/JobInformation/resources/src/defaults/slots.ts +0 -16
  45. package/templates/JobInformation/resources/src/defaults/styles.css +0 -90
  46. /package/templates/{JobInformation/resources → JobDashboard/client}/build.mjs +0 -0
  47. /package/templates/{JobInformation/resources → JobDashboard/client}/dist/manifest.json +0 -0
  48. /package/templates/{JobInformation/resources → JobDashboard/client}/package-lock.json +0 -0
  49. /package/templates/{JobInformation/resources → JobDashboard/client}/package.json +0 -0
  50. /package/templates/{JobInformation/resources → JobDashboard/client}/src/vite-env.d.ts +0 -0
  51. /package/templates/{JobInformation/resources → JobDashboard/client}/vite.config.mjs +0 -0
  52. /package/templates/{JobInformation → JobDashboard}/contractVersion +0 -0
@@ -0,0 +1,619 @@
1
+ /* Built-in default panel styles (ported from the legacy Job Information page). */
2
+
3
+ .legacy-jobs {
4
+ display: grid;
5
+ gap: 20px;
6
+ padding: 28px;
7
+ }
8
+
9
+ .legacy-toolbar {
10
+ display: flex;
11
+ align-items: center;
12
+ justify-content: space-between;
13
+ gap: 12px;
14
+ flex-wrap: wrap;
15
+ min-height: 42px;
16
+ }
17
+
18
+ .legacy-search:focus-within {
19
+ border-color: color-mix(in srgb, var(--workspace-accent) 40%, #ffffff);
20
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--workspace-accent) 8%, transparent);
21
+ }
22
+
23
+ .legacy-filters {
24
+ display: flex;
25
+ align-items: center;
26
+ gap: 8px;
27
+ font-size: 13px;
28
+ }
29
+
30
+ .legacy-search {
31
+ display: inline-flex;
32
+ align-items: stretch;
33
+ gap: 6px;
34
+ height: 30px;
35
+ color: var(--apple-muted, #62626b);
36
+ border: 1px solid rgba(14, 18, 32, 0.07);
37
+ border-radius: 8px;
38
+ background: var(--apple-card, #ffffff);
39
+ box-sizing: border-box;
40
+ padding: 0;
41
+ }
42
+
43
+ .legacy-search > svg {
44
+ align-self: center;
45
+ margin-left: 10px;
46
+ }
47
+
48
+ .legacy-search input {
49
+ flex: none;
50
+ min-width: 0;
51
+ font: inherit;
52
+ line-height: 28px;
53
+ border: 0;
54
+ outline: 0;
55
+ padding: 0 10px 0 0;
56
+ width: 220px;
57
+ color: var(--apple-text, #101014);
58
+ background: transparent;
59
+ }
60
+
61
+ .legacy-filter,
62
+ .legacy-refresh {
63
+ display: inline-flex;
64
+ align-items: center;
65
+ justify-content: center;
66
+ gap: 6px;
67
+ height: 30px;
68
+ min-height: 30px;
69
+ box-sizing: border-box;
70
+ font: inherit;
71
+ color: var(--apple-text, #101014);
72
+ background: var(--apple-card, #ffffff);
73
+ border: 1px solid rgba(14, 18, 32, 0.07);
74
+ border-radius: 8px;
75
+ padding: 0 10px;
76
+ cursor: pointer;
77
+ line-height: 28px;
78
+ appearance: none;
79
+ vertical-align: middle;
80
+ }
81
+
82
+ .legacy-filter:active,
83
+ .legacy-refresh:hover {
84
+ background: var(--apple-canvas, #f5f5f7);
85
+ }
86
+
87
+ .legacy-filter:disabled,
88
+ .legacy-refresh:disabled {
89
+ opacity: 0.75;
90
+ cursor: not-allowed;
91
+ }
92
+
93
+ .legacy-card {
94
+ position: relative;
95
+ border: 1px solid rgba(14, 18, 32, 0.06);
96
+ border-radius: 14px;
97
+ background: var(--apple-card, #ffffff);
98
+ box-shadow: 0 1px 2px rgba(14, 18, 32, 0.04), 0 0 0 1px rgba(14, 18, 32, 0.02);
99
+ min-width: 0;
100
+ overflow: hidden;
101
+ }
102
+
103
+
104
+
105
+ .legacy-job-head {
106
+ display: flex;
107
+ align-items: center;
108
+ justify-content: space-between;
109
+ gap: 12px;
110
+ flex-wrap: wrap;
111
+ padding: 22px 20px 14px;
112
+ }
113
+
114
+ .legacy-job-main {
115
+ display: flex;
116
+ align-items: center;
117
+ gap: 10px;
118
+ min-width: 0;
119
+ flex-wrap: wrap;
120
+ }
121
+
122
+ .legacy-job-name {
123
+ display: inline-flex;
124
+ align-items: center;
125
+ gap: 8px;
126
+ }
127
+
128
+ .legacy-job-main h2,
129
+ .legacy-job-name {
130
+ margin: 0;
131
+ display: inline-flex;
132
+ align-items: center;
133
+ gap: 8px;
134
+ font-size: 17px;
135
+ line-height: 1.2;
136
+ font-weight: 500;
137
+ font-style: italic;
138
+ letter-spacing: 0.01em;
139
+ color: var(--apple-text, #101014);
140
+ }
141
+
142
+ .legacy-job-main h2::before,
143
+ .legacy-job-name::before {
144
+ content: '';
145
+ width: 9px;
146
+ height: 9px;
147
+ border-radius: 999px;
148
+ flex: none;
149
+ background: var(--workspace-accent);
150
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--workspace-accent) 18%, transparent);
151
+ }
152
+
153
+ .legacy-lot {
154
+ display: inline-flex;
155
+ align-items: center;
156
+ gap: 6px;
157
+ font-size: 12px;
158
+ line-height: 1;
159
+ color: var(--workspace-accent);
160
+ background: color-mix(in srgb, var(--workspace-accent) 6%, #ffffff);
161
+ border: 1px solid color-mix(in srgb, var(--workspace-accent) 14%, #ffffff);
162
+ border-radius: 10px;
163
+ padding: 5px 10px 5px 8px;
164
+ vertical-align: middle;
165
+ box-shadow: 0 1px 1px rgba(14, 18, 32, 0.03);
166
+ }
167
+
168
+ .legacy-lot-label {
169
+ color: var(--apple-muted, #62626b);
170
+ font-weight: 600;
171
+ letter-spacing: 0.04em;
172
+ }
173
+
174
+ .legacy-lot-value {
175
+ color: var(--apple-text, #101014);
176
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
177
+ font-size: 12px;
178
+ letter-spacing: 0.02em;
179
+ }
180
+
181
+ .legacy-chip {
182
+ display: inline-flex;
183
+ align-items: center;
184
+ justify-content: center;
185
+ box-sizing: border-box;
186
+ min-width: 116px;
187
+ width: 116px;
188
+ height: 26px;
189
+ text-align: center;
190
+ font-size: 11px;
191
+ font-weight: 700;
192
+ letter-spacing: 0.06em;
193
+ text-transform: uppercase;
194
+ line-height: 1;
195
+ border-radius: 999px;
196
+ border: 1px solid transparent;
197
+ white-space: nowrap;
198
+ overflow: hidden;
199
+ text-overflow: ellipsis;
200
+ }
201
+
202
+ .legacy-chip-default {
203
+ color: #5b6472;
204
+ background: #f1f3f7;
205
+ border-color: #e2e5ec;
206
+ }
207
+
208
+ /* Executing / Running → 主蓝 */
209
+ .legacy-chip-executing {
210
+ color: #1d4ed8;
211
+ background: #e6efff;
212
+ border-color: color-mix(in srgb, #2563eb 12%, #ffffff);
213
+ }
214
+
215
+ /* Setup → 浅蓝 */
216
+ .legacy-chip-setup {
217
+ color: #0369a1;
218
+ background: #eaf5fd;
219
+ border-color: color-mix(in srgb, #0ea5e9 14%, #ffffff);
220
+ }
221
+
222
+ .legacy-chip-complete {
223
+ color: #166534;
224
+ background: #ecfdf3;
225
+ border-color: #b7edd0;
226
+ }
227
+
228
+ /* ── card body: left carriers | timeline | right carriers ── */
229
+
230
+ .legacy-body {
231
+ display: flex;
232
+ align-items: stretch;
233
+ gap: 18px;
234
+ padding: 22px 20px 24px;
235
+ }
236
+
237
+ .legacy-body > .legacy-carriers {
238
+ flex: 0 0 auto;
239
+ }
240
+
241
+ .legacy-body > .legacy-timeline {
242
+ flex: 1 1 0;
243
+ min-width: 0;
244
+ }
245
+
246
+ .legacy-carriers {
247
+ display: flex;
248
+ flex-direction: column;
249
+ justify-content: flex-start;
250
+ gap: 12px;
251
+ min-width: 0;
252
+ height: 124px;
253
+ padding: 14px 16px;
254
+ border: 1px solid rgba(14, 18, 32, 0.035);
255
+ border-radius: 12px;
256
+ background: #fbfbfc;
257
+ box-shadow:
258
+ 0 0 0 1px rgba(14, 18, 32, 0.02),
259
+ 0 1px 2px rgba(14, 18, 32, 0.02);
260
+ }
261
+
262
+ .legacy-carriers-out {
263
+ align-items: stretch;
264
+ }
265
+
266
+ .legacy-carriers-label {
267
+ display: inline-flex;
268
+ align-items: center;
269
+ gap: 7px;
270
+ font-size: 11px;
271
+ font-weight: 700;
272
+ letter-spacing: 0.08em;
273
+ color: var(--apple-muted, #62626b);
274
+ white-space: nowrap;
275
+ }
276
+
277
+ .legacy-carriers-label::before {
278
+ content: '';
279
+ display: inline-block;
280
+ width: 3px;
281
+ height: 13px;
282
+ border-radius: 2px;
283
+ background: var(--workspace-accent);
284
+ }
285
+
286
+ .legacy-carriers-label::after {
287
+ content: '';
288
+ display: inline-block;
289
+ flex: 1;
290
+ min-width: 8px;
291
+ height: 0;
292
+ border-bottom: 2px dotted color-mix(in srgb, var(--workspace-border) 70%, #ffffff);
293
+ }
294
+
295
+ .legacy-carriers-list {
296
+ flex: 1;
297
+ min-width: 0;
298
+ max-width: 100%;
299
+ display: grid;
300
+ place-items: center;
301
+ }
302
+
303
+ .legacy-carrier-chip {
304
+ display: block;
305
+ max-width: 100%;
306
+ font-size: 12px;
307
+ color: var(--apple-text, #101014);
308
+ background: var(--apple-canvas, #f5f5f7);
309
+ border: 1px solid var(--workspace-border);
310
+ border-radius: 8px;
311
+ padding: 3px 9px;
312
+ white-space: nowrap;
313
+ overflow: hidden;
314
+ text-overflow: ellipsis;
315
+ }
316
+
317
+ .legacy-carrier-empty {
318
+ font-size: 12px;
319
+ color: var(--apple-muted, #9a9aa4);
320
+ }
321
+
322
+ .legacy-timeline {
323
+ display: grid;
324
+ grid-template-columns: repeat(4, minmax(0, 1fr)) max-content;
325
+ list-style: none;
326
+ margin: 0;
327
+ padding: 22px 18px 14px;
328
+ border: 1px solid rgba(14, 18, 32, 0.035);
329
+ border-radius: 12px;
330
+ background: #ffffff;
331
+ box-shadow:
332
+ 0 0 0 1px rgba(14, 18, 32, 0.02),
333
+ 0 1px 2px rgba(14, 18, 32, 0.02);
334
+ }
335
+
336
+ .legacy-timeline li {
337
+ min-width: 0;
338
+ position: relative;
339
+ display: flex;
340
+ flex-direction: column;
341
+ align-items: flex-start;
342
+ font-size: 12px;
343
+ animation: legacy-node-in 0.45s both;
344
+ }
345
+
346
+ .legacy-timeline li:nth-child(2) {
347
+ animation-delay: 0.06s;
348
+ }
349
+ .legacy-timeline li:nth-child(3) {
350
+ animation-delay: 0.12s;
351
+ }
352
+ .legacy-timeline li:nth-child(4) {
353
+ animation-delay: 0.18s;
354
+ }
355
+ .legacy-timeline li:nth-child(5) {
356
+ animation-delay: 0.24s;
357
+ }
358
+
359
+ @keyframes legacy-node-in {
360
+ from {
361
+ opacity: 0;
362
+ transform: translateY(8px);
363
+ }
364
+ to {
365
+ opacity: 1;
366
+ transform: none;
367
+ }
368
+ }
369
+
370
+ .legacy-timeline li::after {
371
+ content: '';
372
+ position: absolute;
373
+ height: 4px;
374
+ top: 16px;
375
+ left: 42px;
376
+ right: 6px;
377
+ border-radius: 2px;
378
+ background-image: repeating-linear-gradient(
379
+ 90deg,
380
+ #dfe3ea 0 10px,
381
+ #e7ebf1 10px 20px
382
+ );
383
+ background-size: 20px 4px;
384
+ }
385
+
386
+ @keyframes legacy-connector-flow {
387
+ to {
388
+ background-position: 20px 0;
389
+ }
390
+ }
391
+
392
+ .legacy-timeline li:last-child::after {
393
+ display: none;
394
+ }
395
+
396
+ /* active → pending(即将进入)静态,蓝色弱条纹 */
397
+ .legacy-step-active::after {
398
+ background-image: repeating-linear-gradient(
399
+ 90deg,
400
+ color-mix(in srgb, var(--workspace-accent) 55%, #ffffff) 0 10px,
401
+ color-mix(in srgb, var(--workspace-accent) 24%, #ffffff) 10px 20px
402
+ );
403
+ }
404
+
405
+ /* pending → pending 静态,中性灰条纹 */
406
+ .legacy-step-pending::after {
407
+ background-image: repeating-linear-gradient(90deg, #dfe3ea 0 10px, #e7ebf1 10px 20px);
408
+ }
409
+
410
+ .legacy-step-symbol-empty::after {
411
+ content: '';
412
+ width: 6px;
413
+ height: 6px;
414
+ border-radius: 999px;
415
+ background: #c9cfda;
416
+ }
417
+
418
+ .legacy-step-symbol {
419
+ display: grid;
420
+ place-items: center;
421
+ z-index: 1;
422
+ width: 36px;
423
+ height: 36px;
424
+ border-radius: 10px;
425
+ color: #526176;
426
+ background: #f3f5f9;
427
+ border: 1px solid rgba(14, 18, 32, 0.06);
428
+ box-shadow: 0 1px 1px rgba(14, 18, 32, 0.03);
429
+ margin-bottom: 9px;
430
+ }
431
+
432
+ .legacy-step-pending .legacy-step-symbol {
433
+ background: transparent;
434
+ border-color: rgba(14, 18, 32, 0.04);
435
+ color: #9aa3b2;
436
+ box-shadow: none;
437
+ }
438
+
439
+ /* done → green */
440
+ .legacy-step-done .legacy-step-symbol {
441
+ color: #16a34a;
442
+ background: #ecfdf3;
443
+ border-color: #bbf3d1;
444
+ }
445
+
446
+ .legacy-step-done .legacy-step-label {
447
+ color: #15803d;
448
+ }
449
+
450
+ .legacy-step-done::after {
451
+ background-image: repeating-linear-gradient(90deg, #8fd3ac 0 10px, #b9e6cc 10px 20px);
452
+ animation: legacy-connector-flow 1.1s linear infinite;
453
+ }
454
+
455
+ .legacy-step-duration {
456
+ position: absolute;
457
+ top: -12px;
458
+ left: calc(21px + (100% - 42px) / 2);
459
+ transform: translateX(-50%);
460
+ font-size: 10px;
461
+ line-height: 1.4;
462
+ font-variant-numeric: tabular-nums;
463
+ font-weight: 600;
464
+ color: #15803d;
465
+ background: #f6fdf8;
466
+ border: 1px solid rgba(22, 163, 74, 0.16);
467
+ border-radius: 999px;
468
+ padding: 1px 8px;
469
+ box-shadow: 0 2px 4px rgba(21, 128, 61, 0.08);
470
+ white-space: nowrap;
471
+ z-index: 2;
472
+ }
473
+
474
+ .legacy-step-duration::after {
475
+ content: '';
476
+ position: absolute;
477
+ left: 50%;
478
+ top: 100%;
479
+ width: 7px;
480
+ height: 7px;
481
+ background: #f6fdf8;
482
+ border-right: 1px solid #cfe8d8;
483
+ border-bottom: 1px solid #cfe8d8;
484
+ transform: translate(-50%, -3.5px) rotate(45deg);
485
+ }
486
+
487
+ .legacy-step-active .legacy-step-symbol {
488
+ color: var(--workspace-accent);
489
+ background: color-mix(in srgb, var(--workspace-accent) 8%, #ffffff);
490
+ border-color: color-mix(in srgb, var(--workspace-accent) 18%, #ffffff);
491
+ animation: legacy-pulse 2s ease-in-out infinite;
492
+ }
493
+
494
+ @keyframes legacy-pulse {
495
+ 0%,
496
+ 100% {
497
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--workspace-accent) 6%, transparent);
498
+ }
499
+ 50% {
500
+ box-shadow: 0 0 0 8px color-mix(in srgb, var(--workspace-accent) 10%, transparent);
501
+ }
502
+ }
503
+
504
+ .legacy-step-active .legacy-step-label {
505
+ color: var(--workspace-accent);
506
+ }
507
+
508
+ .legacy-step-pending .legacy-step-label {
509
+ color: #9aa3b2;
510
+ }
511
+
512
+ .legacy-step-label {
513
+ color: var(--apple-muted, #62626b);
514
+ line-height: 18px;
515
+ overflow-wrap: anywhere;
516
+ }
517
+
518
+ .legacy-step-time {
519
+ color: var(--apple-text, #101014);
520
+ font-variant-numeric: tabular-nums;
521
+ margin-top: 3px;
522
+ }
523
+
524
+ .legacy-step-time {
525
+ position: relative;
526
+ }
527
+
528
+ .legacy-step-time-hoverable {
529
+ cursor: default;
530
+ outline: 0;
531
+ }
532
+
533
+ .legacy-step-time-hoverable:hover .legacy-step-popover,
534
+ .legacy-step-time-hoverable:focus-visible .legacy-step-popover,
535
+ .legacy-step-time-hoverable:focus-within .legacy-step-popover {
536
+ opacity: 1;
537
+ visibility: visible;
538
+ transform: translate(-50%, 0);
539
+ }
540
+
541
+ .legacy-step-popover {
542
+ position: absolute;
543
+ left: 50%;
544
+ bottom: calc(100% + 6px);
545
+ transform: translate(-50%, 4px);
546
+ background: #172033;
547
+ color: #ffffff;
548
+ font-size: 11px;
549
+ font-variant-numeric: tabular-nums;
550
+ line-height: 1;
551
+ padding: 5px 9px;
552
+ border-radius: 7px;
553
+ white-space: nowrap;
554
+ opacity: 0;
555
+ visibility: hidden;
556
+ transition:
557
+ opacity 0.16s ease,
558
+ transform 0.16s ease,
559
+ visibility 0.16s;
560
+ pointer-events: none;
561
+ z-index: 5;
562
+ }
563
+
564
+ .legacy-step-popover::after {
565
+ content: '';
566
+ position: absolute;
567
+ left: 50%;
568
+ top: 100%;
569
+ width: 7px;
570
+ height: 7px;
571
+ background: #172033;
572
+ transform: translateX(-50%) rotate(45deg) translate(-3px, -3px);
573
+ }
574
+
575
+ /* ── slim production progress strip ── */
576
+
577
+ .legacy-progress {
578
+ display: flex;
579
+ align-items: center;
580
+ gap: 12px;
581
+ border-top: 1px solid var(--workspace-border);
582
+ padding: 14px 20px 16px;
583
+ font-size: 13px;
584
+ background: linear-gradient(90deg, #f9fafd 0%, #ffffff 45%);
585
+ }
586
+
587
+ .legacy-recipe-label {
588
+ display: inline-flex;
589
+ align-items: center;
590
+ gap: 8px;
591
+ font-size: 11px;
592
+ font-weight: 700;
593
+ letter-spacing: 0.1em;
594
+ text-transform: uppercase;
595
+ color: var(--apple-muted, #62626b);
596
+ }
597
+
598
+
599
+
600
+ .legacy-recipe {
601
+ color: var(--apple-text, #101014);
602
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
603
+ font-size: 12px;
604
+ font-variant-numeric: tabular-nums;
605
+ letter-spacing: 0.02em;
606
+ overflow-wrap: anywhere;
607
+ }
608
+
609
+ @media (max-width: 900px) {
610
+ .legacy-body {
611
+ grid-template-columns: minmax(0, 1fr);
612
+ }
613
+ .legacy-timeline {
614
+ grid-template-columns: repeat(3, minmax(0, 1fr));
615
+ }
616
+ .legacy-timeline li::after {
617
+ display: none;
618
+ }
619
+ }
@@ -1,9 +1,8 @@
1
1
  import { createApp, type App } from "vue";
2
2
  import DefaultPanel from "./defaults/DefaultPanel.vue";
3
- import { defaultSlots, slotOrder } from "./defaults/slots";
3
+ import { defaultSlots } from "./defaults/slots";
4
4
  import { customization } from "./customization";
5
- import { createBus } from "./bus";
6
- import type { HostModuleContext, ModuleContext } from "./contract";
5
+ import type { ModuleContext, HostModuleContext } from "./contract";
7
6
  import defaultStyles from "./defaults/styles.css?inline";
8
7
 
9
8
  let app: App | null = null;
@@ -16,28 +15,21 @@ function ensureStyles() {
16
15
  document.head.appendChild(styleElement);
17
16
  }
18
17
 
18
+ /**
19
+ * The one entry point the host loads. Slot resolution happens inside the
20
+ * defaults; `customization.slots` may override any card region or leaf.
21
+ */
19
22
  export function mount(container: HTMLElement, context: HostModuleContext) {
20
23
  context.place({ kind: "route", path: "/jobs", label: "Jobs", order: 20 });
21
-
22
- // One bus per mount: every slot component of this mount (built-in, custom,
23
- // or full-mode) shares it via `context.bus`, and it dies on unmount.
24
- const moduleContext: ModuleContext = { ...context, bus: createBus() };
25
-
26
- if (customization.mode === "full") {
27
- return customization.mount(container, moduleContext);
28
- }
29
-
30
24
  ensureStyles();
31
- const slots = { ...defaultSlots, ...(customization.slots ?? {}) };
32
- app = createApp(DefaultPanel, { context: moduleContext, slots, slotOrder });
25
+
26
+ const moduleContext: ModuleContext = context;
27
+ const slotMap = { ...defaultSlots, ...(customization.slots ?? {}) };
28
+ app = createApp(DefaultPanel, { context: moduleContext, slotMap });
33
29
  app.mount(container);
34
30
  }
35
31
 
36
32
  export function unmount() {
37
- if (customization.mode === "full") {
38
- customization.unmount();
39
- return;
40
- }
41
33
  app?.unmount();
42
34
  app = null;
43
35
  styleElement?.remove();