@dfosco/storyboard-react 4.0.0-beta.9 → 4.0.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 (75) hide show
  1. package/package.json +6 -3
  2. package/src/AuthModal/AuthModal.jsx +134 -0
  3. package/src/AuthModal/AuthModal.module.css +221 -0
  4. package/src/BranchBar/BranchBar.jsx +56 -0
  5. package/src/BranchBar/BranchBar.module.css +230 -0
  6. package/src/BranchBar/useBranches.js +79 -0
  7. package/src/CommandPalette/CommandPalette.jsx +936 -0
  8. package/src/CommandPalette/CreateDialog.jsx +219 -0
  9. package/src/CommandPalette/command-palette.css +111 -0
  10. package/src/Icon.jsx +180 -0
  11. package/src/Viewfinder.jsx +1104 -57
  12. package/src/Viewfinder.module.css +1107 -149
  13. package/src/canvas/CanvasControls.jsx +51 -2
  14. package/src/canvas/CanvasControls.module.css +31 -0
  15. package/src/canvas/CanvasPage.bridge.test.jsx +142 -19
  16. package/src/canvas/CanvasPage.dragdrop.test.jsx +346 -0
  17. package/src/canvas/CanvasPage.jsx +807 -251
  18. package/src/canvas/CanvasPage.module.css +98 -50
  19. package/src/canvas/CanvasPage.multiselect.test.jsx +13 -11
  20. package/src/canvas/CanvasToolbar.jsx +2 -2
  21. package/src/canvas/MarqueeOverlay.jsx +20 -0
  22. package/src/canvas/PageSelector.jsx +239 -0
  23. package/src/canvas/PageSelector.module.css +165 -0
  24. package/src/canvas/PageSelector.test.jsx +104 -0
  25. package/src/canvas/canvasApi.js +22 -8
  26. package/src/canvas/canvasTheme.js +96 -52
  27. package/src/canvas/componentIsolate.jsx +33 -7
  28. package/src/canvas/useCanvas.js +9 -8
  29. package/src/canvas/useCanvas.test.js +4 -4
  30. package/src/canvas/useMarqueeSelect.js +187 -0
  31. package/src/canvas/useMarqueeSelect.test.js +78 -0
  32. package/src/canvas/widgets/CodePenEmbed.jsx +292 -0
  33. package/src/canvas/widgets/CodePenEmbed.module.css +161 -0
  34. package/src/canvas/widgets/ComponentWidget.jsx +42 -10
  35. package/src/canvas/widgets/ComponentWidget.module.css +6 -5
  36. package/src/canvas/widgets/FigmaEmbed.jsx +110 -24
  37. package/src/canvas/widgets/FigmaEmbed.module.css +21 -7
  38. package/src/canvas/widgets/LinkPreview.jsx +297 -11
  39. package/src/canvas/widgets/LinkPreview.module.css +386 -18
  40. package/src/canvas/widgets/LinkPreview.test.jsx +193 -0
  41. package/src/canvas/widgets/MarkdownBlock.jsx +86 -5
  42. package/src/canvas/widgets/MarkdownBlock.module.css +64 -15
  43. package/src/canvas/widgets/PrototypeEmbed.jsx +96 -145
  44. package/src/canvas/widgets/PrototypeEmbed.module.css +74 -4
  45. package/src/canvas/widgets/StickyNote.module.css +5 -0
  46. package/src/canvas/widgets/StickyNote.test.jsx +9 -9
  47. package/src/canvas/widgets/StoryWidget.jsx +277 -0
  48. package/src/canvas/widgets/StoryWidget.module.css +211 -0
  49. package/src/canvas/widgets/WidgetChrome.jsx +76 -20
  50. package/src/canvas/widgets/WidgetChrome.module.css +2 -6
  51. package/src/canvas/widgets/WidgetWrapper.module.css +2 -0
  52. package/src/canvas/widgets/codepenUrl.js +75 -0
  53. package/src/canvas/widgets/codepenUrl.test.js +76 -0
  54. package/src/canvas/widgets/embedInteraction.test.jsx +235 -0
  55. package/src/canvas/widgets/embedOverlay.module.css +35 -0
  56. package/src/canvas/widgets/embedTheme.js +138 -39
  57. package/src/canvas/widgets/githubUrl.js +82 -0
  58. package/src/canvas/widgets/githubUrl.test.js +74 -0
  59. package/src/canvas/widgets/iframeDevLogs.js +49 -0
  60. package/src/canvas/widgets/iframeDevLogs.test.jsx +81 -0
  61. package/src/canvas/widgets/index.js +4 -0
  62. package/src/canvas/widgets/pasteRules.js +295 -0
  63. package/src/canvas/widgets/pasteRules.test.js +474 -0
  64. package/src/canvas/widgets/snapshotDisplay.test.jsx +259 -0
  65. package/src/canvas/widgets/widgetConfig.js +16 -5
  66. package/src/canvas/widgets/widgetConfig.test.js +34 -12
  67. package/src/context.jsx +145 -16
  68. package/src/hooks/useSceneData.js +4 -2
  69. package/src/hooks/useThemeState.js +61 -0
  70. package/src/hooks/useThemeState.test.js +66 -0
  71. package/src/index.js +10 -0
  72. package/src/story/StoryPage.jsx +117 -0
  73. package/src/story/StoryPage.module.css +18 -0
  74. package/src/vite/data-plugin.js +348 -66
  75. package/src/vite/data-plugin.test.js +405 -5
@@ -1,235 +1,1193 @@
1
- .container {
2
- min-height: 100vh;
3
- background-color: var(--bgColor-default, #0d1117);
4
- color: var(--fgColor-default, #e6edf3);
5
- padding: 80px 32px 48px;
1
+ /* Viewfinder — SaaS-style homescreen layout */
2
+
3
+ .layout {
4
+ display: flex;
5
+ flex-direction: column;
6
+ height: calc(100vh - var(--sb-branch-bar-height, 0px));
7
+ font-family: 'Mona Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
8
+ color: var(--fgColor-default, #1a1a1a);
9
+ background: var(--bgColor-inset, #fafafa);
6
10
  }
7
11
 
8
- .header {
9
- max-width: 720px;
10
- margin: 0 auto 64px;
12
+ /* ─── Full-width header ─── */
13
+
14
+ .topBar {
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: space-between;
18
+ padding: 16px 24px;
19
+ border-bottom: 1px solid var(--borderColor-default, #e5e5e5);
20
+ background: var(--bgColor-default, #fff);
21
+ flex-shrink: 0;
11
22
  }
12
23
 
13
- .title {
14
- font-size: 72px;
15
- font-weight: 400;
16
- margin: 0 0 12px;
17
- color: var(--fgColor-default, #e6edf3);
18
- letter-spacing: -0.03em;
19
- line-height: 1;
24
+ .topBarLeft {
25
+ display: flex;
26
+ align-items: center;
27
+ gap: 12px;
28
+ }
29
+
30
+ .logo {
31
+ width: 48px;
32
+ height: 48px;
33
+ background: var(--bgColor-emphasis, #313131);
34
+ border-radius: 8px;
35
+ transform: rotate(-1deg);
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ color: var(--fgColor-onEmphasis, #fff);
40
+ flex-shrink: 0;
20
41
  }
21
42
 
22
- .subtitle {
23
- font-size: 15px;
24
- color: var(--fgColor-muted, #848d97);
25
- margin: 4px 0 0;
26
- letter-spacing: 0.01em;
43
+ .appName {
44
+ font-size: 24px;
45
+ /* font-style: italic; */
46
+ font-weight: 900;
47
+ color: var(--fgColor-default, #1a1a1a);
48
+ line-height: 1.1;
27
49
  }
28
50
 
29
- .sceneCount {
30
- font-size: 13px;
31
- color: var(--fgColor-muted, #848d97);
32
- margin: 16px 0 0;
33
- letter-spacing: 0.01em;
51
+ .appSubtitle {
52
+ font-size: 16px;
53
+ color: var(--fgColor-muted, #888);
54
+ line-height: 1.3;
55
+ margin-top: 4px;
34
56
  }
35
57
 
36
- .grid {
37
- display: grid;
38
- grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
39
- gap: 16px;
40
- max-width: 720px;
41
- margin: 0 auto;
58
+ .topActions {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 8px;
42
62
  }
43
63
 
44
- .list {
64
+ .createBtn {
45
65
  display: flex;
46
- flex-direction: column;
47
- max-width: 720px;
48
- margin: 0 auto;
66
+ align-items: center;
67
+ gap: 6px;
68
+ padding: 8px 20px;
69
+ background: var(--bgColor-emphasis, #1a1a1a);
70
+ color: var(--fgColor-onEmphasis, #fff);
71
+ border: none;
72
+ border-radius: 8px;
73
+ font-size: 16px;
74
+ font-weight: 500;
75
+ cursor: pointer;
76
+ transition: background 0.15s;
77
+ }
78
+
79
+ .createBtn:hover {
80
+ background: var(--bgColor-emphasis, #333);
49
81
  }
50
82
 
51
- .listItem {
83
+ /* Branch dropdown */
84
+
85
+ .branchBtn {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: 6px;
89
+ padding: 7px 14px;
90
+ background: var(--bgColor-default, #fff);
91
+ 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
+ }
136
+
137
+ .branchItem {
138
+ display: flex;
139
+ align-items: center;
140
+ gap: 8px;
141
+ padding: 7px 14px;
142
+ font-size: 16px;
143
+ 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;
172
+ }
173
+
174
+ .branchShowAll {
52
175
  display: block;
53
- padding: 8px 0;
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;
185
+ }
186
+
187
+ .branchShowAll:hover {
188
+ background: var(--bgColor-muted, #f5f5f5);
189
+ }
190
+
191
+ /* ─── Body: sidebar + content ─── */
192
+
193
+ .body {
194
+ display: flex;
195
+ flex: 1;
196
+ overflow: hidden;
197
+ }
198
+
199
+ /* ─── Sidebar ─── */
200
+
201
+ .sidebar {
202
+ width: 260px;
203
+ min-width: 220px;
204
+ background: var(--bgColor-default, #fff);
205
+ border-right: 1px solid var(--borderColor-default, #e5e5e5);
206
+ display: flex;
207
+ flex-direction: column;
208
+ padding: 0;
209
+ overflow: hidden;
210
+ }
211
+
212
+ .sidebarContent {
213
+ flex: 1;
214
+ overflow-y: auto;
215
+ }
216
+
217
+ /* Nav items */
218
+
219
+ .navSection {
220
+ padding: 12px 8px 4px;
221
+ }
222
+
223
+ .navItem {
224
+ display: flex;
225
+ align-items: center;
226
+ gap: 10px;
227
+ padding: 7px 12px;
228
+ border-radius: 6px;
229
+ font-size: 16px;
230
+ font-weight: 500;
231
+ color: var(--fgColor-muted, #555);
232
+ cursor: pointer;
233
+ border: none;
234
+ background: none;
235
+ width: 100%;
236
+ text-align: left;
237
+ transition: background 0.1s;
238
+ }
239
+
240
+ .navItem:hover {
241
+ background: var(--bgColor-muted, #f5f5f5);
242
+ }
243
+
244
+ .navItemActive {
245
+ composes: navItem;
246
+ background: var(--bgColor-neutral-muted, #f0f0f0);
247
+ color: var(--fgColor-default, #1a1a1a);
248
+ font-weight: 600;
249
+ }
250
+
251
+ .navIcon {
252
+ width: 18px;
253
+ height: 18px;
254
+ display: flex;
255
+ align-items: center;
256
+ justify-content: center;
257
+ opacity: 0.6;
258
+ font-size: 16px;
259
+ }
260
+
261
+ .navItemActive .navIcon {
262
+ opacity: 1;
263
+ }
264
+
265
+ .navCount {
266
+ margin-left: auto;
267
+ font-size: 14px;
268
+ color: var(--fgColor-muted);
269
+ font-weight: 500;
270
+ }
271
+
272
+ /* Separator */
273
+
274
+ .separator {
275
+ height: 1px;
276
+ background: var(--borderColor-default, #e5e5e5);
277
+ margin: 8px 16px;
278
+ }
279
+
280
+ /* Starred section */
281
+
282
+ .sectionLabel {
283
+ padding: 8px 20px 4px;
284
+ font-size: 12px;
285
+ font-weight: 600;
286
+ color: var(--fgColor-muted, #999);
287
+ text-transform: uppercase;
288
+ letter-spacing: 0.5px;
289
+ }
290
+
291
+ .starredItem {
292
+ display: flex;
293
+ align-items: center;
294
+ gap: 8px;
295
+ padding: 6px 20px;
296
+ font-size: 16px;
297
+ color: var(--fgColor-muted, #555);
298
+ cursor: pointer;
299
+ transition: background 0.1s;
54
300
  text-decoration: none;
55
- color: inherit;
56
- /* border-bottom: 1px solid var(--borderColor-muted, #21262d); */
57
301
  }
58
302
 
59
- .listItem:first-child {
60
- /* border-top: 1px solid var(--borderColor-muted, #21262d); */
303
+ .starredItem:link,
304
+ .starredItem:visited {
305
+ color: var(--fgColor-muted, #555);
306
+ text-decoration: none;
61
307
  }
62
308
 
63
- .listItem:hover {
64
- text-decoration: none !important;
309
+ .starredItem:hover {
310
+ background: var(--bgColor-muted, #f5f5f5);
65
311
  }
66
312
 
67
- .listItem .author {
68
- margin-top: 8px;
313
+ .starredEmpty {
314
+ padding: 6px 20px;
315
+ font-size: 14px;
316
+ color: var(--fgColor-muted);
317
+ font-style: italic;
69
318
  }
70
319
 
71
- .card {
72
- display: block;
73
- border: 1px solid var(--borderColor-default, #30363d);
320
+ .starredIcon {
321
+ width: 16px;
322
+ height: 16px;
323
+ display: flex;
324
+ align-items: center;
325
+ justify-content: center;
326
+ flex-shrink: 0;
327
+ opacity: 0.5;
328
+ }
329
+
330
+ /* Sidebar footer */
331
+
332
+ .sidebarFooter {
333
+ flex-shrink: 0;
334
+ border-top: 1px solid var(--borderColor-default, #e5e5e5);
335
+ padding: 12px;
336
+ }
337
+
338
+ .avatar {
339
+ width: 32px;
340
+ height: 32px;
341
+ border-radius: 50%;
342
+ background: var(--bgColor-neutral-muted, #f0f0f0);
343
+ display: flex;
344
+ align-items: center;
345
+ justify-content: center;
346
+ font-size: 16px;
347
+ color: var(--fgColor-muted, #888);
348
+ flex-shrink: 0;
349
+ }
350
+
351
+ .userName {
352
+ font-size: 16px;
353
+ font-weight: 500;
354
+ color: var(--fgColor-default, #1a1a1a);
355
+ }
356
+
357
+ .userSub {
358
+ font-size: 14px;
359
+ color: var(--fgColor-muted, #999);
360
+ }
361
+
362
+ .loginBtn {
363
+ display: flex;
364
+ align-items: center;
365
+ gap: 10px;
366
+ width: 100%;
367
+ padding: 8px 10px;
368
+ background: none;
369
+ border: 1px solid var(--borderColor-default, #e5e5e5);
74
370
  border-radius: 8px;
371
+ font-size: 16px;
372
+ color: var(--fgColor-muted, #555);
373
+ cursor: pointer;
374
+ transition: all 0.15s;
375
+ text-align: left;
376
+ }
377
+
378
+ .loginBtn:hover {
379
+ background: var(--bgColor-muted, #f5f5f5);
380
+ border-color: var(--borderColor-muted);
381
+ }
382
+
383
+ /* ─── Main Content ─── */
384
+
385
+ .main {
386
+ flex: 1;
387
+ display: flex;
388
+ flex-direction: column;
389
+ overflow-y: auto;
390
+ }
391
+
392
+ /* Tabs */
393
+
394
+ .tabs {
395
+ display: flex;
396
+ align-items: center;
397
+ gap: 0;
398
+ min-height: 52px;
399
+ padding: 0 32px;
400
+ background: var(--bgColor-default, #fff);
401
+ border-bottom: 1px solid var(--borderColor-default, #e5e5e5);
402
+ }
403
+
404
+ .tab {
405
+ padding: 11px 16px;
406
+ font-size: 16px;
407
+ font-weight: 500;
408
+ color: var(--fgColor-muted, #888);
409
+ border: none;
410
+ background: none;
411
+ cursor: pointer;
412
+ border-bottom: 2px solid transparent;
413
+ transition: all 0.15s;
414
+ }
415
+
416
+ .tab:hover {
417
+ color: var(--fgColor-default, #1a1a1a);
418
+ }
419
+
420
+ .tabActive {
421
+ composes: tab;
422
+ color: var(--fgColor-default, #1a1a1a);
423
+ border-bottom-color: var(--fgColor-default, #1a1a1a);
424
+ font-weight: 600;
425
+ }
426
+
427
+ /* Grid */
428
+
429
+ .content {
430
+ padding: 24px 32px;
431
+ flex: 1;
432
+ }
433
+
434
+ .grid {
435
+ display: grid;
436
+ grid-template-columns: repeat(4, 1fr);
437
+ gap: 16px;
438
+ }
439
+
440
+ .emptyState {
441
+ padding: 48px 0;
442
+ text-align: center;
443
+ font-size: 16px;
444
+ color: var(--fgColor-muted, #999);
445
+ }
446
+
447
+ /* Card */
448
+
449
+ .card {
450
+ background: var(--bgColor-default, #fff);
451
+ border: 1px solid var(--borderColor-default, #e5e5e5);
452
+ border-radius: 10px;
75
453
  overflow: hidden;
76
- background: var(--bgColor-muted, #161b22);
77
- text-decoration: none;
454
+ cursor: pointer;
455
+ transition: all 0.15s;
456
+ text-decoration: none !important;
78
457
  color: inherit;
79
- transition: border-color 0.15s ease, box-shadow 0.15s ease;
458
+ display: block;
80
459
  }
81
460
 
82
461
  .card:hover {
83
- border-color: var(--borderColor-accent-emphasis, #1f6feb);
84
- box-shadow: 0 0 0 1px var(--borderColor-accent-emphasis, #1f6feb);
462
+ border-color: var(--borderColor-muted, rgba(128, 128, 128, 0.3));
463
+ box-shadow: 0 1px 6px rgba(0, 0, 0, 0.06);
464
+ text-decoration: none !important;
465
+ }
466
+
467
+ .card:visited,
468
+ .card:focus,
469
+ .card:active,
470
+ .card:link {
85
471
  text-decoration: none !important;
472
+ color: inherit;
86
473
  }
87
474
 
88
- .thumbnail {
89
- aspect-ratio: 16 / 10;
475
+ .cardThumb {
476
+ height: 140px;
477
+ background: var(--bgColor-muted, #f5f5f5);
478
+ display: flex;
479
+ align-items: flex-start;
480
+ justify-content: space-between;
481
+ position: relative;
482
+ padding: 10px;
483
+ }
484
+
485
+ .cardBadge {
486
+ padding: 3px 8px;
487
+ border-radius: 4px;
488
+ font-size: 12px;
489
+ font-weight: 600;
490
+ text-transform: uppercase;
491
+ letter-spacing: 0.3px;
492
+ background: var(--bgColor-neutral-muted, #f0f0f0);
493
+ color: var(--fgColor-muted, #555);
494
+ }
495
+
496
+ /* Icon buttons (star, flows, etc.) */
497
+
498
+ .iconBtn {
90
499
  display: flex;
91
500
  align-items: center;
92
501
  justify-content: center;
502
+ width: 32px;
503
+ height: 32px;
504
+ border-radius: 6px;
505
+ border: none;
506
+ background: none;
507
+ cursor: pointer;
508
+ color: var(--fgColor-muted);
509
+ transition: all 0.15s;
510
+ }
511
+
512
+ .iconBtn:hover {
513
+ background: rgba(0, 0, 0, 0.06);
514
+ color: var(--fgColor-muted, #555);
515
+ }
516
+
517
+ .iconBtnActive {
518
+ composes: iconBtn;
519
+ color: var(--fgColor-attention, #f59e0b);
520
+ }
521
+
522
+ .iconBtnActive:hover {
523
+ background: rgba(0, 0, 0, 0.06);
524
+ color: var(--fgColor-attention, #d97706);
525
+ }
526
+
527
+ .cardActions {
528
+ display: flex;
529
+ align-items: center;
530
+ gap: 2px;
531
+ }
532
+
533
+ .cardBody {
534
+ padding: 12px 14px;
535
+ display: flex;
536
+ align-items: flex-start;
537
+ gap: 8px;
538
+ }
539
+
540
+ .cardBodyContent {
541
+ flex: 1;
542
+ min-width: 0;
543
+ }
544
+
545
+ .cardTitle {
546
+ font-size: 16px;
547
+ font-weight: 600;
548
+ color: var(--fgColor-default, #1a1a1a);
549
+ margin-bottom: 4px;
550
+ white-space: nowrap;
93
551
  overflow: hidden;
94
- background: var(--bgColor-inset, #010409);
552
+ text-overflow: ellipsis;
553
+ text-decoration: none;
554
+ }
555
+
556
+ .cardMeta {
557
+ display: flex;
558
+ align-items: center;
559
+ gap: 6px;
560
+ font-size: 14px;
561
+ color: var(--fgColor-muted);
562
+ text-decoration: none;
563
+ }
95
564
 
96
- --placeholder-bg: var(--bgColor-inset, #010409);
97
- --placeholder-grid: var(--borderColor-default, #30363d);
98
- --placeholder-accent: var(--fgColor-accent, #58a6ff);
99
- --placeholder-fg: var(--fgColor-default, #c9d1d9);
100
- --placeholder-muted: var(--fgColor-muted, #484f58);
565
+ .cardMetaDot {
566
+ width: 3px;
567
+ height: 3px;
568
+ border-radius: 50%;
569
+ background: var(--borderColor-muted, #d1d5db);
101
570
  }
102
571
 
103
- .thumbnail svg {
572
+ /* Folder card */
573
+
574
+ .folderCard {
575
+ composes: card;
576
+ }
577
+
578
+ .folderThumb {
579
+ height: 140px;
580
+ background: var(--bgColor-accent-muted, #f0f4ff);
581
+ display: flex;
582
+ align-items: center;
583
+ justify-content: center;
584
+ color: var(--fgColor-accent, #54aeff);
585
+ }
586
+
587
+ /* External badge */
588
+
589
+ .externalBadge {
590
+ display: inline-flex;
591
+ align-items: center;
592
+ gap: 3px;
593
+ margin-left: 6px;
594
+ font-size: 12px;
595
+ color: var(--fgColor-muted, #999);
596
+ font-weight: 500;
597
+ }
598
+
599
+ /* Create menu overlay */
600
+
601
+ .createMenuOverlay {
602
+ position: fixed;
603
+ inset: 0;
604
+ background: rgba(0, 0, 0, 0.15);
605
+ z-index: 100;
606
+ display: flex;
607
+ align-items: center;
608
+ justify-content: center;
609
+ }
610
+
611
+ .createMenu {
612
+ background: var(--bgColor-default, #fff);
613
+ border-radius: 12px;
614
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.12);
615
+ padding: 24px;
616
+ width: 360px;
617
+ max-width: 90vw;
618
+ }
619
+
620
+ .createMenuTitle {
621
+ font-size: 18px;
622
+ font-weight: 600;
623
+ color: var(--fgColor-default, #1a1a1a);
624
+ }
625
+
626
+ .createMenuGrid {
627
+ display: flex;
628
+ flex-direction: column;
629
+ gap: 8px;
630
+ }
631
+
632
+ .createMenuItem {
633
+ display: flex;
634
+ align-items: center;
635
+ gap: 12px;
636
+ padding: 12px 14px;
637
+ border: 1px solid var(--borderColor-default, #e5e5e5);
638
+ border-radius: 8px;
639
+ background: var(--bgColor-default, #fff);
640
+ cursor: pointer;
641
+ transition: all 0.15s;
642
+ text-align: left;
643
+ }
644
+
645
+ .createMenuItem:hover {
646
+ border-color: var(--borderColor-muted);
647
+ background: var(--bgColor-inset, #fafafa);
648
+ }
649
+
650
+ .createMenuIcon {
651
+ width: 36px;
652
+ height: 36px;
653
+ border-radius: 8px;
654
+ display: flex;
655
+ align-items: center;
656
+ justify-content: center;
657
+ font-size: 24px;
658
+ flex-shrink: 0;
659
+ background: var(--bgColor-neutral-muted, #f0f0f0);
660
+ color: var(--fgColor-default, #1a1a1a);
661
+ }
662
+
663
+ .createMenuItemTitle {
664
+ font-size: 16px;
665
+ font-weight: 600;
666
+ color: var(--fgColor-default, #1a1a1a);
667
+ }
668
+
669
+ .createMenuItemDesc {
670
+ font-size: 14px;
671
+ color: var(--fgColor-muted, #999);
672
+ }
673
+
674
+ /* Create form styles */
675
+
676
+ .createFormHeader {
677
+ display: flex;
678
+ align-items: center;
679
+ justify-content: space-between;
680
+ margin-bottom: 16px;
681
+ }
682
+
683
+ .createFormClose {
684
+ display: flex;
685
+ align-items: center;
686
+ justify-content: center;
687
+ width: 28px;
688
+ height: 28px;
689
+ background: none;
690
+ border: none;
691
+ border-radius: 6px;
692
+ color: var(--fgColor-muted, #888);
693
+ cursor: pointer;
694
+ }
695
+
696
+ .createFormClose:hover {
697
+ color: var(--fgColor-default, #1a1a1a);
698
+ background: var(--bgColor-neutral-muted, #f0f0f0);
699
+ }
700
+
701
+ .createFormField {
702
+ margin-bottom: 14px;
703
+ }
704
+
705
+ .createFormLabel {
706
+ font-size: 16px;
707
+ font-weight: 500;
708
+ margin-bottom: 4px;
709
+ display: block;
710
+ }
711
+
712
+ .createFormInput {
104
713
  width: 100%;
105
- height: 100%;
714
+ padding: 8px 12px;
715
+ border: 1px solid var(--borderColor-default, #e5e5e5);
716
+ border-radius: 6px;
717
+ font-size: 16px;
718
+ box-sizing: border-box;
106
719
  }
107
720
 
108
- .cardBody {
721
+ .createFormInput:focus {
722
+ outline: none;
723
+ border-color: var(--fgColor-muted, #999);
724
+ }
725
+
726
+ .createFormCheckbox {
727
+ display: flex;
728
+ align-items: center;
729
+ gap: 8px;
730
+ font-size: 16px;
731
+ }
732
+
733
+ .createFormActions {
734
+ margin-top: 20px;
735
+ }
736
+
737
+ .createFormSubmit {
738
+ width: 100%;
109
739
  padding: 12px 16px;
740
+ background: var(--fgColor-default, #1a1a1a);
741
+ color: var(--bgColor-default, #fff);
742
+ border: none;
743
+ border-radius: 10px;
744
+ font-size: 16px;
745
+ font-weight: 600;
746
+ cursor: pointer;
747
+ transition: opacity 0.15s;
748
+ }
110
749
 
111
- &:hover {
112
- background-color: var(--bgColor-muted);
113
- }
750
+ .createFormSubmit:hover {
751
+ opacity: 0.85;
752
+ }
753
+
754
+ .createFormSubmit:disabled {
755
+ opacity: 0.4;
756
+ cursor: not-allowed;
757
+ }
758
+
759
+ .createFooter {
760
+ display: flex;
761
+ align-items: center;
762
+ gap: 8px;
763
+ margin-top: 16px;
764
+ padding-top: 12px;
765
+ border-top: 1px solid var(--borderColor-default, #e5e5e5);
766
+ }
767
+
768
+ .createFooterDot {
769
+ width: 8px;
770
+ height: 8px;
771
+ border-radius: 50%;
772
+ background: var(--fgColor-accent, #2563eb);
773
+ flex-shrink: 0;
774
+ }
775
+
776
+ .createFooterText {
777
+ font-size: 14px;
778
+ color: var(--fgColor-muted, #999);
779
+ }
780
+
781
+ .createFormError {
782
+ font-size: 14px;
783
+ color: var(--fgColor-danger, #dc2626);
784
+ margin-top: 8px;
785
+ }
786
+
787
+ /* Muted thumbnail colors */
788
+ .thumbBlue { background: var(--bgColor-accent-muted, #f0f4f8); }
789
+ .thumbAmber { background: var(--bgColor-attention-muted, #faf5ee); }
790
+ .thumbGreen { background: var(--bgColor-success-muted, #f0f7f4); }
791
+ .thumbPurple { background: var(--bgColor-done-muted, #f5f0fa); }
792
+ .thumbRose { background: var(--bgColor-danger-muted, #faf0f2); }
793
+ .thumbSlate { background: var(--bgColor-neutral-muted, #f3f4f6); }
794
+
795
+
796
+ /* Group by folders checkbox */
797
+
798
+ .groupByFolders {
799
+ display: flex;
800
+ align-items: center;
801
+ gap: 6px;
802
+ margin-left: auto;
803
+ font-size: 14px;
804
+ color: var(--fgColor-muted, #555);
805
+ cursor: pointer;
806
+ padding: 0 4px;
807
+ white-space: nowrap;
808
+ user-select: none;
809
+ }
810
+
811
+ .groupByFoldersCheckbox {
812
+ accent-color: var(--fgColor-default, #1a1a1a);
813
+ cursor: pointer;
814
+ }
815
+
816
+ /* Folder sections */
817
+
818
+ .folderSection {
819
+ margin-top: 24px;
820
+ padding-bottom: 24px;
821
+ margin-bottom: 24px;
822
+ border-bottom: 1px solid var(--borderColor-default, #e5e5e5);
823
+ }
824
+
825
+ .folderSectionCollapsed {
826
+ composes: folderSection;
827
+ padding-bottom: 0;
828
+ }
829
+
830
+ .folderSection:first-child {
831
+ margin-top: 0;
832
+ }
833
+
834
+ .folderSection:last-child,
835
+ .folderSectionCollapsed:last-child {
836
+ border-bottom: none;
837
+ margin-bottom: 0;
838
+ }
839
+
840
+ .folderHeader {
841
+ display: flex;
842
+ align-items: center;
843
+ gap: 8px;
844
+ padding: 8px 0;
845
+ margin-bottom: 16px;
846
+ border: none;
847
+ background: none;
848
+ cursor: pointer;
849
+ font-size: 16px;
850
+ font-weight: 600;
851
+ color: var(--fgColor-default, #1a1a1a);
852
+ width: 100%;
853
+ text-align: left;
114
854
  }
115
855
 
116
- .sceneName {
117
- font-size: 28px;
856
+ .folderHeader:hover {
857
+ color: var(--fgColor-muted, #555);
858
+ }
859
+
860
+ .folderIcon {
861
+ color: var(--fgColor-default, #1a1a1a);
862
+ flex-shrink: 0;
863
+ }
864
+
865
+ .folderName {
866
+ flex: 1;
867
+ }
868
+
869
+ .folderCount {
870
+ font-size: 14px;
118
871
  font-weight: 400;
119
- color: var(--fgColor-default, #e6edf3);
120
- margin: 0;
121
- letter-spacing: -0.02em;
122
- line-height: 1.2;
123
- transition: font-style 0.15s ease;
872
+ color: var(--fgColor-muted, #999);
124
873
  }
125
874
 
126
- .empty {
127
- text-align: center;
128
- padding: 80px 24px;
129
- color: var(--fgColor-muted, #848d97);
130
- font-size: 15px;
131
- max-width: 720px;
132
- margin: 0 auto;
875
+ .folderChevron {
876
+ color: var(--fgColor-muted, #999);
877
+ transition: transform 0.2s;
878
+ }
879
+
880
+ .folderChevronExpanded {
881
+ composes: folderChevron;
882
+ transform: rotate(90deg);
883
+ }
884
+
885
+ /* Flows dropdown */
886
+
887
+ .flowsBtn {
888
+ display: flex;
889
+ align-items: center;
890
+ justify-content: center;
891
+ width: 24px;
892
+ height: 24px;
893
+ border-radius: 4px;
894
+ border: none;
895
+ background: none;
896
+ cursor: pointer;
897
+ color: var(--fgColor-muted, #999);
898
+ flex-shrink: 0;
899
+ transition: all 0.15s;
900
+ margin-top: 1px;
901
+ }
902
+
903
+ .flowsBtn:hover {
904
+ background: var(--bgColor-neutral-muted, #f0f0f0);
905
+ color: var(--fgColor-muted, #555);
906
+ }
907
+
908
+ .flowsPositioner {
909
+ z-index: 200;
133
910
  }
134
911
 
135
- .sectionTitle {
136
- font-size: 11px;
137
- font-weight: 700;
912
+ .flowsPopup {
913
+ background: var(--bgColor-default, #fff);
914
+ border: 1px solid var(--borderColor-default, #e5e5e5);
915
+ border-radius: 8px;
916
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
917
+ min-width: 180px;
918
+ padding: 4px 0;
919
+ font-family: 'Mona Sans', -apple-system, BlinkMacSystemFont, sans-serif;
920
+ }
921
+
922
+ .flowsTitle {
923
+ padding: 6px 12px 4px;
924
+ font-size: 12px;
925
+ font-weight: 600;
926
+ color: var(--fgColor-muted, #999);
138
927
  text-transform: uppercase;
139
- letter-spacing: 0.12em;
140
- color: var(--fgColor-muted, #848d97);
141
- margin: 0 auto 20px;
142
- max-width: 720px;
928
+ letter-spacing: 0.4px;
143
929
  }
144
930
 
145
- .headerTop {
931
+ .flowsItem {
932
+ display: block;
933
+ width: 100%;
934
+ padding: 6px 12px;
935
+ font-size: 14px;
936
+ color: var(--fgColor-muted, #555);
937
+ cursor: pointer;
938
+ border: none;
939
+ background: none;
940
+ text-align: left;
941
+ transition: background 0.1s;
942
+ text-decoration: none;
943
+ }
944
+
945
+ .flowsItem:hover,
946
+ .flowsItem[data-highlighted] {
947
+ background: var(--bgColor-muted, #f5f5f5);
948
+ color: var(--fgColor-default, #1a1a1a);
949
+ }
950
+
951
+ /* Avatar stack */
952
+
953
+ .avatarStack {
146
954
  display: flex;
147
- align-items: baseline;
148
- justify-content: space-between;
149
- gap: 16px;
955
+ flex-direction: row-reverse;
956
+ justify-content: flex-end;
957
+ }
958
+
959
+ .avatarStack > .avatarImg + .avatarImg {
960
+ margin-right: -8px;
150
961
  }
151
962
 
152
- .branchDropdown {
963
+ .avatarImg {
964
+ width: 24px;
965
+ height: 24px;
966
+ border-radius: 50%;
967
+ border: 2px solid var(--bgColor-default, #fff);
968
+ object-fit: cover;
969
+ flex-shrink: 0;
970
+ }
971
+
972
+ /* Text-only card header */
973
+
974
+ .cardHeader {
153
975
  display: flex;
154
976
  align-items: center;
155
- gap: 0;
156
- flex-shrink: 0;
157
- position: relative;
977
+ justify-content: space-between;
978
+ padding: 14px 16px 0;
158
979
  }
159
980
 
160
- .branchIcon {
161
- position: absolute;
162
- left: 10px;
163
- color: var(--fgColor-muted, #848d97);
164
- pointer-events: none;
165
- z-index: 1;
166
- }
167
-
168
- .branchSelect {
169
- appearance: none;
170
- background-color: transparent;
171
- color: var(--fgColor-default, #e6edf3);
172
- border: 1px solid var(--borderColor-default, #30363d);
173
- border-radius: 20px;
174
- padding: 6px 32px 6px 32px;
175
- font-size: 13px;
176
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
177
- cursor: pointer;
178
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%23848d97'%3E%3Cpath d='M6 8.5L1.5 4h9L6 8.5z'/%3E%3C/svg%3E");
179
- background-repeat: no-repeat;
180
- background-position: right 12px center;
181
- min-width: 140px;
182
- max-width: 220px;
183
- text-overflow: ellipsis;
981
+ .cardDescription {
982
+ font-size: 14px;
983
+ color: var(--fgColor-muted, #999);
984
+ line-height: 1.5;
985
+ display: -webkit-box;
986
+ -webkit-line-clamp: 2;
987
+ -webkit-box-orient: vertical;
184
988
  overflow: hidden;
185
- transition: border-color 0.15s ease;
989
+ margin-top: 4px;
990
+ }
991
+
992
+ .cardFooter {
993
+ display: flex;
994
+ align-items: center;
995
+ gap: 8px;
996
+ margin-top: 10px;
997
+ }
998
+
999
+ /* Create dropdown (replaces modal) */
1000
+
1001
+ .createDropdownPositioner {
1002
+ z-index: 200;
1003
+ }
1004
+
1005
+ .createDropdown {
1006
+ background: var(--bgColor-default, #fff);
1007
+ border: 1px solid var(--borderColor-default, #e5e5e5);
1008
+ border-radius: 12px;
1009
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.12);
1010
+ padding: 16px;
1011
+ width: 380px;
1012
+ max-width: 90vw;
1013
+ font-family: 'Mona Sans', -apple-system, BlinkMacSystemFont, sans-serif;
1014
+ }
1015
+
1016
+ .createDropdownTitle {
1017
+ font-size: 16px;
1018
+ font-weight: 600;
1019
+ margin-bottom: 12px;
1020
+ color: var(--fgColor-default, #1a1a1a);
186
1021
  }
187
1022
 
188
- .branchSelect:hover {
189
- border-color: var(--fgColor-muted, #848d97);
1023
+ .createDropdownGrid {
1024
+ display: flex;
1025
+ flex-direction: column;
1026
+ gap: 6px;
190
1027
  }
191
1028
 
192
- .branchSelect:focus-visible {
193
- outline: 2px solid var(--borderColor-accent-emphasis, #1f6feb);
194
- outline-offset: -1px;
1029
+ .createDropdownForm {
1030
+ /* Wrapper for inline form inside dropdown */
195
1031
  }
196
1032
 
197
- .author {
1033
+ /* More options */
1034
+
1035
+ .moreOptionsBtn {
198
1036
  display: flex;
199
1037
  align-items: center;
200
- gap: 8px;
201
- margin-top: 6px;
1038
+ gap: 4px;
1039
+ background: none;
1040
+ border: none;
1041
+ color: var(--fgColor-muted);
1042
+ font-size: 14px;
1043
+ font-weight: 500;
1044
+ cursor: pointer;
1045
+ padding: 8px 0 4px;
1046
+ margin-top: 8px;
1047
+ transition: color 0.15s;
202
1048
  }
203
1049
 
204
- .authorAvatars {
1050
+ .moreOptionsBtn:hover {
1051
+ color: var(--fgColor-default, #1a1a1a);
1052
+ }
1053
+
1054
+ .moreOptionsSection {
1055
+ margin-top: 8px;
205
1056
  display: flex;
206
- flex-direction: row;
1057
+ flex-direction: column;
1058
+ gap: 4px;
1059
+ padding-top: 8px;
1060
+ border-top: 1px solid var(--borderColor-muted, #eee);
207
1061
  }
208
1062
 
209
- .authorAvatars:hover .authorAvatar {
210
- margin-left: 2px;
1063
+ .moreOptionItem {
1064
+ display: block;
1065
+ width: 100%;
1066
+ padding: 10px 12px;
1067
+ border: none;
1068
+ background: none;
1069
+ border-radius: 6px;
1070
+ cursor: pointer;
1071
+ text-align: left;
1072
+ transition: background 0.1s;
211
1073
  }
212
1074
 
213
- .authorAvatars:hover .authorAvatar:first-child {
214
- margin-left: 0;
1075
+ .moreOptionItem:hover {
1076
+ background: var(--bgColor-muted, #f5f5f5);
215
1077
  }
216
1078
 
217
- .authorAvatar {
218
- width: 18px;
219
- height: 18px;
220
- border-radius: 50%;
221
- margin-left: -6px;
222
- transition: margin-left 0.15s ease;
223
- outline: 2px solid var(--bgColor-default, #0d1117);
224
- position: relative;
1079
+ .moreOptionTitle {
1080
+ font-size: 14px;
1081
+ font-weight: 600;
1082
+ color: var(--fgColor-default, #1a1a1a);
1083
+ }
1084
+
1085
+ .moreOptionDesc {
1086
+ font-size: 12px;
1087
+ color: var(--fgColor-muted, #999);
1088
+ margin-top: 2px;
1089
+ }
1090
+
1091
+ /* Create tip */
1092
+
1093
+ .createTip {
1094
+ margin-top: 12px;
1095
+ padding-top: 10px;
1096
+ border-top: 1px solid var(--borderColor-muted, #eee);
225
1097
  }
226
1098
 
227
- .authorAvatar:first-child {
228
- margin-left: 0;
1099
+ .createTipText {
1100
+ font-size: 12px;
1101
+ color: var(--fgColor-muted, #999);
1102
+ line-height: 1.5;
229
1103
  }
230
1104
 
231
- .authorName {
232
- font-size: 13px;
233
- color: var(--fgColor-muted, #848d97);
234
- letter-spacing: 0.01em;
1105
+ .createTipCode {
1106
+ font-family: 'SF Mono', SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace;
1107
+ font-size: 12px;
1108
+ background: var(--bgColor-neutral-muted, #f0f0f0);
1109
+ padding: 1px 5px;
1110
+ border-radius: 3px;
1111
+ color: var(--fgColor-muted, #555);
1112
+ }
1113
+
1114
+ /* Hamburger button — hidden on desktop */
1115
+
1116
+ .hamburgerBtn {
1117
+ display: none;
1118
+ align-items: center;
1119
+ justify-content: center;
1120
+ width: 36px;
1121
+ height: 36px;
1122
+ border-radius: 8px;
1123
+ border: none;
1124
+ background: none;
1125
+ cursor: pointer;
1126
+ color: var(--fgColor-muted, #555);
1127
+ transition: background 0.15s;
1128
+ }
1129
+
1130
+ .hamburgerBtn:hover {
1131
+ background: var(--bgColor-neutral-muted, #f0f0f0);
1132
+ }
1133
+
1134
+ /* ─── Responsive: cards wrap on smaller screens ─── */
1135
+
1136
+ @media (max-width: 1200px) {
1137
+ .grid {
1138
+ grid-template-columns: repeat(3, 1fr);
1139
+ }
1140
+ }
1141
+
1142
+ @media (max-width: 900px) {
1143
+ .grid {
1144
+ grid-template-columns: repeat(2, 1fr);
1145
+ }
1146
+ }
1147
+
1148
+ /* ─── Responsive: sidebar collapses under 1030px ─── */
1149
+
1150
+ @media (max-width: 1030px) {
1151
+ .hamburgerBtn {
1152
+ display: flex;
1153
+ }
1154
+
1155
+ .sidebar {
1156
+ display: none;
1157
+ position: absolute;
1158
+ top: 0;
1159
+ left: 0;
1160
+ z-index: 100;
1161
+ width: 260px;
1162
+ height: 100%;
1163
+ box-shadow: 4px 0 16px rgba(0, 0, 0, 0.1);
1164
+ }
1165
+
1166
+ .sidebarOpen {
1167
+ display: flex;
1168
+ }
1169
+
1170
+ .body {
1171
+ position: relative;
1172
+ }
1173
+
1174
+ .grid {
1175
+ grid-template-columns: 1fr;
1176
+ }
1177
+
1178
+ .topBar {
1179
+ padding: 12px 16px;
1180
+ }
1181
+
1182
+ .content {
1183
+ padding: 16px;
1184
+ }
1185
+
1186
+ .tabs {
1187
+ padding: 0 16px;
1188
+ }
1189
+
1190
+ .groupByFolders {
1191
+ display: none;
1192
+ }
235
1193
  }