@dfosco/storyboard-react 4.2.0-beta.4 → 4.2.1

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 (89) hide show
  1. package/package.json +10 -11
  2. package/src/AuthModal/AuthModal.jsx +6 -8
  3. package/src/BranchBar/BranchBar.jsx +20 -6
  4. package/src/BranchBar/BranchBar.module.css +13 -4
  5. package/src/BranchBar/useBranches.js +20 -6
  6. package/src/BranchBar/useBranches.test.js +68 -0
  7. package/src/CommandPalette/CommandPalette.jsx +480 -187
  8. package/src/CommandPalette/command-palette.css +142 -78
  9. package/src/Icon.jsx +157 -58
  10. package/src/Viewfinder.jsx +562 -207
  11. package/src/Viewfinder.module.css +434 -93
  12. package/src/Workspace.jsx +7 -0
  13. package/src/canvas/CanvasPage.bridge.test.jsx +14 -6
  14. package/src/canvas/CanvasPage.dragdrop.test.jsx +11 -7
  15. package/src/canvas/CanvasPage.jsx +739 -219
  16. package/src/canvas/CanvasPage.module.css +13 -15
  17. package/src/canvas/CanvasPage.multiselect.test.jsx +17 -6
  18. package/src/canvas/ConnectorLayer.jsx +121 -165
  19. package/src/canvas/ConnectorLayer.module.css +69 -0
  20. package/src/canvas/PageSelector.test.jsx +15 -6
  21. package/src/canvas/canvasApi.js +68 -2
  22. package/src/canvas/canvasReloadGuard.test.js +1 -1
  23. package/src/canvas/connectorGeometry.js +132 -0
  24. package/src/canvas/hotPoolDevLogs.js +25 -0
  25. package/src/canvas/useCanvas.js +1 -1
  26. package/src/canvas/useMarqueeSelect.js +30 -4
  27. package/src/canvas/widgets/CodePenEmbed.jsx +1 -0
  28. package/src/canvas/widgets/ComponentSetWidget.jsx +199 -0
  29. package/src/canvas/widgets/ComponentSetWidget.module.css +89 -0
  30. package/src/canvas/widgets/ComponentWidget.jsx +1 -0
  31. package/src/canvas/widgets/CropOverlay.jsx +219 -0
  32. package/src/canvas/widgets/CropOverlay.module.css +118 -0
  33. package/src/canvas/widgets/ExpandedPane.jsx +474 -0
  34. package/src/canvas/widgets/ExpandedPane.module.css +179 -0
  35. package/src/canvas/widgets/ExpandedPane.test.jsx +240 -0
  36. package/src/canvas/widgets/ExpandedPaneTopBar.jsx +111 -0
  37. package/src/canvas/widgets/ExpandedPaneTopBar.module.css +59 -0
  38. package/src/canvas/widgets/ExpandedPaneTopBar.test.jsx +45 -0
  39. package/src/canvas/widgets/FigmaEmbed.jsx +62 -47
  40. package/src/canvas/widgets/FigmaEmbed.module.css +61 -0
  41. package/src/canvas/widgets/ImageWidget.jsx +130 -9
  42. package/src/canvas/widgets/ImageWidget.module.css +30 -0
  43. package/src/canvas/widgets/LinkPreview.jsx +113 -5
  44. package/src/canvas/widgets/LinkPreview.module.css +127 -0
  45. package/src/canvas/widgets/MarkdownBlock.jsx +167 -17
  46. package/src/canvas/widgets/MarkdownBlock.module.css +148 -0
  47. package/src/canvas/widgets/PromptWidget.jsx +414 -0
  48. package/src/canvas/widgets/PromptWidget.module.css +273 -0
  49. package/src/canvas/widgets/PrototypeEmbed.jsx +77 -39
  50. package/src/canvas/widgets/PrototypeEmbed.module.css +117 -0
  51. package/src/canvas/widgets/PrototypeEmbed.test.jsx +2 -2
  52. package/src/canvas/widgets/ResizeHandle.jsx +17 -6
  53. package/src/canvas/widgets/StoryWidget.jsx +73 -15
  54. package/src/canvas/widgets/TerminalReadWidget.jsx +146 -0
  55. package/src/canvas/widgets/TerminalReadWidget.module.css +94 -0
  56. package/src/canvas/widgets/TerminalWidget.jsx +445 -67
  57. package/src/canvas/widgets/TerminalWidget.module.css +271 -8
  58. package/src/canvas/widgets/TilesWidget.jsx +300 -0
  59. package/src/canvas/widgets/TilesWidget.module.css +133 -0
  60. package/src/canvas/widgets/WidgetChrome.jsx +74 -153
  61. package/src/canvas/widgets/WidgetChrome.module.css +30 -1
  62. package/src/canvas/widgets/embedInteraction.test.jsx +24 -26
  63. package/src/canvas/widgets/expandUtils.js +560 -0
  64. package/src/canvas/widgets/expandUtils.test.js +155 -0
  65. package/src/canvas/widgets/index.js +9 -0
  66. package/src/canvas/widgets/snapshotDisplay.test.jsx +23 -71
  67. package/src/canvas/widgets/tilePool.js +23 -0
  68. package/src/canvas/widgets/tiles/diagonal-bl.png +0 -0
  69. package/src/canvas/widgets/tiles/diagonal-br.png +0 -0
  70. package/src/canvas/widgets/tiles/diagonal-tl.png +0 -0
  71. package/src/canvas/widgets/tiles/leaf.png +0 -0
  72. package/src/canvas/widgets/tiles/quarter-tl.png +0 -0
  73. package/src/canvas/widgets/tiles/quarter-tr.png +0 -0
  74. package/src/canvas/widgets/tiles/solid-a.png +0 -0
  75. package/src/canvas/widgets/tiles/solid-b.png +0 -0
  76. package/src/canvas/widgets/widgetConfig.js +55 -4
  77. package/src/canvas/widgets/widgetIcons.jsx +190 -0
  78. package/src/canvas/widgets/widgetProps.js +1 -0
  79. package/src/context.jsx +48 -20
  80. package/src/hooks/useConfig.js +14 -0
  81. package/src/hooks/usePrototypeReloadGuard.js +64 -0
  82. package/src/hooks/useSceneData.js +1 -0
  83. package/src/hooks/useThemeState.test.js +1 -1
  84. package/src/index.js +8 -2
  85. package/src/story/ComponentSetPage.jsx +186 -0
  86. package/src/story/ComponentSetPage.module.css +121 -0
  87. package/src/story/StoryPage.jsx +32 -2
  88. package/src/vite/data-plugin.js +407 -67
  89. package/src/vite/data-plugin.test.js +1 -1
@@ -42,8 +42,7 @@
42
42
 
43
43
  .appName {
44
44
  font-size: 24px;
45
- /* font-style: italic; */
46
- font-weight: 900;
45
+ font-weight: 800;
47
46
  color: var(--fgColor-default, #1a1a1a);
48
47
  line-height: 1.1;
49
48
  }
@@ -82,110 +81,39 @@
82
81
 
83
82
  /* Branch dropdown */
84
83
 
85
- .branchBtn {
84
+ .branchNav {
86
85
  display: flex;
87
86
  align-items: center;
88
87
  gap: 6px;
89
- padding: 7px 14px;
90
- background: var(--bgColor-default, #fff);
91
88
  color: var(--fgColor-muted, #555);
92
- border: 1px solid var(--borderColor-default, #e5e5e5);
93
- border-radius: 8px;
94
- font-size: 16px;
95
- font-weight: 500;
96
- cursor: pointer;
97
- transition: all 0.15s;
98
- font-family: inherit;
99
- }
100
-
101
- .branchBtn:hover {
102
- background: var(--bgColor-muted, #f5f5f5);
103
- border-color: var(--borderColor-muted);
104
- }
105
-
106
- .branchBtnText {
107
- max-width: 160px;
108
- overflow: hidden;
109
- text-overflow: ellipsis;
110
- white-space: nowrap;
111
- }
112
-
113
- .branchPositioner {
114
- z-index: 200;
115
- }
116
-
117
- .branchPopup {
118
- background: var(--bgColor-default, #fff);
119
- border: 1px solid var(--borderColor-default, #e5e5e5);
120
- border-radius: 10px;
121
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
122
- min-width: 240px;
123
- max-width: 320px;
124
- padding: 6px 0;
125
- font-family: 'Mona Sans', -apple-system, BlinkMacSystemFont, sans-serif;
126
- }
127
-
128
- .branchSectionLabel {
129
- padding: 8px 14px 4px;
130
- font-size: 14px;
131
- font-weight: 600;
132
- color: var(--fgColor-muted, #999);
133
- text-transform: uppercase;
134
- letter-spacing: 0.4px;
135
89
  }
136
90
 
137
- .branchItem {
91
+ .switchOverlay {
92
+ position: fixed;
93
+ inset: 0;
94
+ z-index: 9999;
138
95
  display: flex;
96
+ flex-direction: column;
139
97
  align-items: center;
140
- gap: 8px;
141
- padding: 7px 14px;
142
- font-size: 16px;
98
+ justify-content: center;
99
+ gap: 12px;
100
+ background: var(--bgColor-default, #fff);
143
101
  color: var(--fgColor-muted, #555);
144
- cursor: pointer;
145
- transition: background 0.1s;
146
- border: none;
147
- background: none;
148
- width: 100%;
149
- text-align: left;
150
- }
151
-
152
- .branchItem:hover,
153
- .branchItem[data-highlighted] {
154
- background: var(--bgColor-muted, #f5f5f5);
155
- }
156
-
157
- .branchItemActive {
158
- composes: branchItem;
159
- color: var(--fgColor-default, #1a1a1a);
160
- font-weight: 600;
161
- }
162
-
163
- .branchSeparator {
164
- height: 1px;
165
- background: var(--borderColor-default, #e5e5e5);
166
- margin: 4px 10px;
167
- }
168
-
169
- .branchViewport {
170
- max-height: 280px;
171
- overflow-y: auto;
102
+ font-size: 15px;
103
+ font-weight: 500;
172
104
  }
173
105
 
174
- .branchShowAll {
175
- display: block;
176
- width: 100%;
177
- padding: 8px 14px;
178
- font-size: 16px;
179
- color: var(--fgColor-accent, #2563eb);
180
- background: none;
181
- border: none;
182
- cursor: pointer;
183
- text-align: left;
184
- font-family: inherit;
106
+ .switchSpinner {
107
+ width: 24px;
108
+ height: 24px;
109
+ border: 3px solid var(--borderColor-default, #e5e5e5);
110
+ border-top-color: var(--fgColor-accent, #2563eb);
111
+ border-radius: 50%;
112
+ animation: branchSpin 0.6s linear infinite;
185
113
  }
186
114
 
187
- .branchShowAll:hover {
188
- background: var(--bgColor-muted, #f5f5f5);
115
+ @keyframes branchSpin {
116
+ to { transform: rotate(360deg); }
189
117
  }
190
118
 
191
119
  /* ─── Body: sidebar + content ─── */
@@ -249,6 +177,7 @@
249
177
  }
250
178
 
251
179
  .navIcon {
180
+ color: var(--fgColor-default, #1a1a1a);
252
181
  width: 18px;
253
182
  height: 18px;
254
183
  display: flex;
@@ -380,6 +309,247 @@
380
309
  border-color: var(--borderColor-muted);
381
310
  }
382
311
 
312
+ .userAvatar {
313
+ width: 32px;
314
+ height: 32px;
315
+ border-radius: 50%;
316
+ object-fit: cover;
317
+ flex-shrink: 0;
318
+ }
319
+
320
+ .footerRow {
321
+ display: flex;
322
+ align-items: center;
323
+ gap: 6px;
324
+ }
325
+
326
+ .userBtn {
327
+ display: flex;
328
+ align-items: center;
329
+ gap: 10px;
330
+ flex: 1;
331
+ min-width: 0;
332
+ padding: 8px 10px;
333
+ background: none;
334
+ border: 1px solid var(--borderColor-default, #e5e5e5);
335
+ border-radius: 8px;
336
+ font-size: 16px;
337
+ color: var(--fgColor-muted, #555);
338
+ cursor: pointer;
339
+ transition: all 0.15s;
340
+ text-align: left;
341
+ }
342
+
343
+ .userBtn:hover {
344
+ background: var(--bgColor-muted, #f5f5f5);
345
+ border-color: var(--borderColor-muted);
346
+ }
347
+
348
+ .userInfo {
349
+ flex: 1;
350
+ min-width: 0;
351
+ overflow: hidden;
352
+ text-overflow: ellipsis;
353
+ white-space: nowrap;
354
+ }
355
+
356
+ .gearBtn {
357
+ display: flex;
358
+ align-items: center;
359
+ justify-content: center;
360
+ width: 36px;
361
+ height: 36px;
362
+ flex-shrink: 0;
363
+ background: none;
364
+ border: 1px solid var(--borderColor-default, #e5e5e5);
365
+ border-radius: 8px;
366
+ color: var(--fgColor-muted, #888);
367
+ cursor: pointer;
368
+ transition: all 0.15s;
369
+ }
370
+
371
+ .gearBtn:hover {
372
+ background: var(--bgColor-muted, #f5f5f5);
373
+ border-color: var(--borderColor-muted);
374
+ color: var(--fgColor-default, #333);
375
+ }
376
+
377
+ /* ─── Settings Dialog ─── */
378
+
379
+ .settingsBackdrop {
380
+ position: fixed;
381
+ inset: 0;
382
+ background: var(--overlay-backdrop-bgColor, rgba(0, 0, 0, 0.4));
383
+ z-index: 10000;
384
+ }
385
+
386
+ .settingsPopupWrap {
387
+ position: fixed;
388
+ inset: 0;
389
+ z-index: 10001;
390
+ display: flex;
391
+ align-items: center;
392
+ justify-content: center;
393
+ pointer-events: none;
394
+ }
395
+
396
+ .settingsPopupWrap > * {
397
+ pointer-events: auto;
398
+ }
399
+
400
+ .settingsPopup {
401
+ background: var(--bgColor-default);
402
+ border-radius: 12px;
403
+ box-shadow: var(--shadow-overlay, 0 16px 48px rgba(0, 0, 0, 0.12));
404
+ padding: 28px;
405
+ max-width: 480px;
406
+ width: 90vw;
407
+ max-height: 90vh;
408
+ overflow-y: auto;
409
+ color: var(--fgColor-default);
410
+ position: relative;
411
+ }
412
+
413
+ .settingsTitle {
414
+ font-size: 18px;
415
+ font-weight: 600;
416
+ margin-bottom: 20px;
417
+ color: var(--fgColor-default);
418
+ padding-right: 32px;
419
+ }
420
+
421
+ .settingsCloseBtn {
422
+ position: absolute;
423
+ top: 16px;
424
+ right: 16px;
425
+ background: none;
426
+ border: none;
427
+ font-size: 24px;
428
+ line-height: 1;
429
+ color: var(--fgColor-muted);
430
+ cursor: pointer;
431
+ padding: 4px 8px;
432
+ border-radius: 4px;
433
+ }
434
+
435
+ .settingsCloseBtn:hover {
436
+ background: var(--bgColor-neutral-muted);
437
+ color: var(--fgColor-default);
438
+ }
439
+
440
+ .settingsSection {
441
+ margin-bottom: 20px;
442
+ }
443
+
444
+ .settingsSectionHeader {
445
+ display: flex;
446
+ align-items: center;
447
+ gap: 8px;
448
+ font-size: 14px;
449
+ font-weight: 600;
450
+ color: var(--fgColor-muted);
451
+ text-transform: uppercase;
452
+ letter-spacing: 0.03em;
453
+ margin-bottom: 12px;
454
+ }
455
+
456
+ .settingsTokenCard {
457
+ background: var(--bgColor-muted);
458
+ border: 1px solid var(--borderColor-default);
459
+ border-radius: 8px;
460
+ padding: 14px 16px;
461
+ }
462
+
463
+ .settingsTokenRow {
464
+ display: flex;
465
+ align-items: baseline;
466
+ gap: 10px;
467
+ font-size: 14px;
468
+ line-height: 2;
469
+ color: var(--fgColor-muted);
470
+ }
471
+
472
+ .settingsTokenLabel {
473
+ flex-shrink: 0;
474
+ min-width: 90px;
475
+ font-weight: 500;
476
+ color: var(--fgColor-default);
477
+ }
478
+
479
+ .settingsTokenValue {
480
+ font-family: 'SF Mono', SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace;
481
+ font-size: 13px;
482
+ color: var(--fgColor-muted);
483
+ display: flex;
484
+ flex-wrap: wrap;
485
+ gap: 4px;
486
+ align-items: center;
487
+ }
488
+
489
+ .settingsScope {
490
+ font-family: 'SF Mono', SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace;
491
+ font-size: 12px;
492
+ color: var(--fgColor-default);
493
+ background: var(--bgColor-default);
494
+ padding: 1px 6px;
495
+ border-radius: 4px;
496
+ border: 1px solid var(--borderColor-default);
497
+ }
498
+
499
+ .settingsRemoveBtn {
500
+ display: flex;
501
+ align-items: center;
502
+ gap: 6px;
503
+ margin-top: 12px;
504
+ padding: 6px 12px;
505
+ background: none;
506
+ border: 1px solid var(--borderColor-danger-muted, #ff818266);
507
+ border-radius: 6px;
508
+ font-size: 13px;
509
+ color: var(--fgColor-danger, #d1242f);
510
+ cursor: pointer;
511
+ transition: all 0.15s;
512
+ }
513
+
514
+ .settingsRemoveBtn:hover {
515
+ background: var(--bgColor-danger-muted, #ffebe966);
516
+ border-color: var(--borderColor-danger-emphasis, #cf222e);
517
+ }
518
+
519
+ .settingsNoToken {
520
+ background: var(--bgColor-muted);
521
+ border: 1px solid var(--borderColor-default);
522
+ border-radius: 8px;
523
+ padding: 16px;
524
+ text-align: center;
525
+ color: var(--fgColor-muted);
526
+ font-size: 14px;
527
+ }
528
+
529
+ .settingsNoToken p {
530
+ margin-bottom: 12px;
531
+ }
532
+
533
+ .settingsSignInBtn {
534
+ display: inline-flex;
535
+ align-items: center;
536
+ gap: 8px;
537
+ padding: 8px 16px;
538
+ background: var(--bgColor-default);
539
+ border: 1px solid var(--borderColor-default);
540
+ border-radius: 6px;
541
+ font-size: 14px;
542
+ font-weight: 500;
543
+ color: var(--fgColor-default);
544
+ cursor: pointer;
545
+ transition: all 0.15s;
546
+ }
547
+
548
+ .settingsSignInBtn:hover {
549
+ background: var(--bgColor-muted);
550
+ border-color: var(--borderColor-muted);
551
+ }
552
+
383
553
  /* ─── Main Content ─── */
384
554
 
385
555
  .main {
@@ -1190,4 +1360,175 @@
1190
1360
  .groupByFolders {
1191
1361
  display: none;
1192
1362
  }
1363
+
1364
+ .logo {
1365
+ display: none;
1366
+ }
1367
+
1368
+ .appSubtitle {
1369
+ display: none;
1370
+ }
1371
+ }
1372
+
1373
+ /* Title row: flex container for title + inline star */
1374
+ .cardTitleRow {
1375
+ display: flex;
1376
+ align-items: center;
1377
+ gap: 4px;
1378
+ }
1379
+
1380
+ /* Inline star button variants */
1381
+ .iconBtnInline {
1382
+ composes: iconBtn;
1383
+ width: 28px;
1384
+ height: 28px;
1385
+ flex-shrink: 0;
1386
+ margin: -2px -4px -2px 0;
1387
+ }
1388
+
1389
+ .iconBtnInlineActive {
1390
+ composes: iconBtnInline;
1391
+ color: var(--fgColor-attention, #f59e0b);
1392
+ }
1393
+
1394
+ .iconBtnInlineActive:hover {
1395
+ background: rgba(0, 0, 0, 0.06);
1396
+ color: var(--fgColor-attention, #d97706);
1397
+ }
1398
+
1399
+ /* Card actions dropdown menu */
1400
+ .actionsMenuPositioner {
1401
+ z-index: 200;
1402
+ }
1403
+
1404
+ .actionsMenu {
1405
+ background: var(--bgColor-default, #fff);
1406
+ border: 1px solid var(--borderColor-default, #e5e5e5);
1407
+ border-radius: 8px;
1408
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
1409
+ padding: 4px;
1410
+ min-width: 160px;
1411
+ font-family: 'Mona Sans', -apple-system, BlinkMacSystemFont, sans-serif;
1412
+ }
1413
+
1414
+ .actionsMenuItem {
1415
+ display: flex;
1416
+ align-items: center;
1417
+ gap: 8px;
1418
+ width: 100%;
1419
+ padding: 8px 12px;
1420
+ border: none;
1421
+ background: none;
1422
+ border-radius: 6px;
1423
+ cursor: pointer;
1424
+ font-size: 14px;
1425
+ color: var(--fgColor-default, #1a1a1a);
1426
+ text-align: left;
1427
+ }
1428
+
1429
+ .actionsMenuItem:hover {
1430
+ background: var(--bgColor-neutral-muted, #f0f0f0);
1431
+ }
1432
+
1433
+ .actionsMenuItemDanger {
1434
+ composes: actionsMenuItem;
1435
+ color: var(--fgColor-danger, #cf222e);
1436
+ }
1437
+
1438
+ .actionsMenuItemDanger:hover {
1439
+ background: var(--bgColor-danger-muted, #fff0f0);
1440
+ color: var(--fgColor-danger, #cf222e);
1441
+ }
1442
+
1443
+ /* Modal overlay and content */
1444
+ .modalOverlay {
1445
+ position: fixed;
1446
+ inset: 0;
1447
+ background: rgba(0, 0, 0, 0.4);
1448
+ display: flex;
1449
+ align-items: center;
1450
+ justify-content: center;
1451
+ z-index: 300;
1452
+ }
1453
+
1454
+ .modalContent {
1455
+ background: var(--bgColor-default, #fff);
1456
+ border: 1px solid var(--borderColor-default, #e5e5e5);
1457
+ border-radius: 12px;
1458
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.12);
1459
+ padding: 16px;
1460
+ width: 380px;
1461
+ max-width: 90vw;
1462
+ font-family: 'Mona Sans', -apple-system, BlinkMacSystemFont, sans-serif;
1463
+ }
1464
+
1465
+ .modalActions {
1466
+ display: flex;
1467
+ align-items: center;
1468
+ gap: 8px;
1469
+ margin-top: 20px;
1470
+ justify-content: flex-end;
1471
+ }
1472
+
1473
+ .modalSubmitBtn {
1474
+ padding: 8px 16px;
1475
+ background: var(--fgColor-default, #1a1a1a);
1476
+ color: var(--bgColor-default, #fff);
1477
+ border: none;
1478
+ border-radius: 6px;
1479
+ font-size: 14px;
1480
+ font-weight: 600;
1481
+ cursor: pointer;
1482
+ transition: opacity 0.15s;
1483
+ }
1484
+
1485
+ .modalSubmitBtn:hover {
1486
+ opacity: 0.85;
1487
+ }
1488
+
1489
+ .modalSubmitBtn:disabled {
1490
+ opacity: 0.4;
1491
+ cursor: not-allowed;
1492
+ }
1493
+
1494
+ .modalCancelBtn {
1495
+ padding: 8px 16px;
1496
+ border: 1px solid var(--borderColor-default, #e5e5e5);
1497
+ border-radius: 6px;
1498
+ background: var(--bgColor-default, #fff);
1499
+ color: var(--fgColor-default, #1a1a1a);
1500
+ cursor: pointer;
1501
+ font-size: 14px;
1502
+ font-weight: 500;
1503
+ }
1504
+
1505
+ .modalCancelBtn:hover {
1506
+ background: var(--bgColor-neutral-muted, #f0f0f0);
1507
+ }
1508
+
1509
+ .deleteMessage {
1510
+ font-size: 14px;
1511
+ color: var(--fgColor-muted, #555);
1512
+ line-height: 1.5;
1513
+ margin: 12px 0;
1514
+ }
1515
+
1516
+ .deleteConfirmBtn {
1517
+ padding: 8px 16px;
1518
+ border: none;
1519
+ border-radius: 6px;
1520
+ background: var(--bgColor-danger-emphasis, #cf222e);
1521
+ color: #fff;
1522
+ cursor: pointer;
1523
+ font-size: 14px;
1524
+ font-weight: 600;
1525
+ }
1526
+
1527
+ .deleteConfirmBtn:hover {
1528
+ background: var(--bgColor-danger-emphasis, #a40e26);
1529
+ }
1530
+
1531
+ .deleteConfirmBtn:disabled {
1532
+ opacity: 0.6;
1533
+ cursor: not-allowed;
1193
1534
  }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Workspace — canonical entry point.
3
+ *
4
+ * Re-exports from Viewfinder.jsx (legacy filename kept for backwards compat).
5
+ * New code should import from this file.
6
+ */
7
+ export { default, default as Workspace } from './Viewfinder.jsx'
@@ -63,12 +63,16 @@ vi.mock('./widgets/widgetProps.js', () => ({
63
63
  getDefaults: () => ({}),
64
64
  }))
65
65
 
66
- vi.mock('./widgets/widgetConfig.js', () => ({
67
- getFeatures: () => [],
68
- isResizable: () => false,
69
- schemas: {},
70
- getMenuWidgetTypes: () => [],
71
- }))
66
+ vi.mock('./widgets/widgetConfig.js', async () => {
67
+ const actual = await vi.importActual('./widgets/widgetConfig.js')
68
+ return {
69
+ getFeatures: () => [],
70
+ isResizable: () => false,
71
+ schemas: {},
72
+ getMenuWidgetTypes: () => [],
73
+ getConnectorDefaults: actual.getConnectorDefaults,
74
+ }
75
+ })
72
76
 
73
77
  vi.mock('./widgets/figmaUrl.js', () => ({
74
78
  isFigmaUrl: () => false,
@@ -129,6 +133,8 @@ describe('CanvasPage canvas bridge', () => {
129
133
  expect(window.__storyboardCanvasBridgeState).toEqual({
130
134
  active: true,
131
135
  canvasId: 'design-overview',
136
+ connectors: [],
137
+ widgets: [{ id: 'widget-1', type: 'mock-widget', position: { x: 10, y: 20 }, props: {} }],
132
138
  zoom: 100,
133
139
  })
134
140
  expect(mountedHandler).toHaveBeenCalled()
@@ -138,6 +144,8 @@ describe('CanvasPage canvas bridge', () => {
138
144
  expect(statusHandler.mock.calls.at(-1)?.[0]?.detail).toEqual({
139
145
  active: true,
140
146
  canvasId: 'design-overview',
147
+ connectors: [],
148
+ widgets: [{ id: 'widget-1', type: 'mock-widget', position: { x: 10, y: 20 }, props: {} }],
141
149
  zoom: 100,
142
150
  })
143
151
 
@@ -5,7 +5,7 @@
5
5
  * onto the canvas, including coordinate conversion and file filtering.
6
6
  */
7
7
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
8
- import { fireEvent, render, act, waitFor } from '@testing-library/react'
8
+ import { render, act } from '@testing-library/react'
9
9
  import CanvasPage from './CanvasPage.jsx'
10
10
  import { addWidget, uploadImage } from './canvasApi.js'
11
11
 
@@ -48,12 +48,16 @@ vi.mock('./widgets/widgetProps.js', () => ({
48
48
  getDefaults: () => ({}),
49
49
  }))
50
50
 
51
- vi.mock('./widgets/widgetConfig.js', () => ({
52
- getFeatures: () => [],
53
- isResizable: () => false,
54
- schemas: {},
55
- getMenuWidgetTypes: () => [],
56
- }))
51
+ vi.mock('./widgets/widgetConfig.js', async () => {
52
+ const actual = await vi.importActual('./widgets/widgetConfig.js')
53
+ return {
54
+ getFeatures: () => [],
55
+ isResizable: () => false,
56
+ schemas: {},
57
+ getMenuWidgetTypes: () => [],
58
+ getConnectorDefaults: actual.getConnectorDefaults,
59
+ }
60
+ })
57
61
 
58
62
  vi.mock('./widgets/figmaUrl.js', () => ({
59
63
  isFigmaUrl: () => false,