viberoom 0.5.2 → 0.5.4

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 (40) hide show
  1. package/NOTICE +8 -2
  2. package/README.md +1 -1
  3. package/dist/hub.js +55 -2
  4. package/dist/main.js +10 -0
  5. package/dist/room.js +43 -3
  6. package/dist/server.js +41 -1
  7. package/dist/templates.js +27 -3
  8. package/dist/update.js +95 -0
  9. package/package.json +1 -1
  10. package/templates/wren-and-quinn/template.json +28 -0
  11. package/ui/app.css +61 -19
  12. package/ui/app.js +306 -14
  13. package/ui/fonts/fira-code-cyrillic-ext.woff2 +0 -0
  14. package/ui/fonts/fira-code-cyrillic.woff2 +0 -0
  15. package/ui/fonts/fira-code-latin-ext.woff2 +0 -0
  16. package/ui/fonts/fira-code-latin.woff2 +0 -0
  17. package/ui/fonts/fira-code.css +5 -0
  18. package/ui/fonts/inter-cyrillic-ext.woff2 +0 -0
  19. package/ui/fonts/inter-cyrillic.woff2 +0 -0
  20. package/ui/fonts/inter-latin-ext.woff2 +0 -0
  21. package/ui/fonts/inter-latin.woff2 +0 -0
  22. package/ui/fonts/inter.css +5 -0
  23. package/ui/fonts/jetbrains-mono-cyrillic-ext.woff2 +0 -0
  24. package/ui/fonts/jetbrains-mono-cyrillic.woff2 +0 -0
  25. package/ui/fonts/jetbrains-mono-latin-ext.woff2 +0 -0
  26. package/ui/fonts/jetbrains-mono-latin.woff2 +0 -0
  27. package/ui/fonts/jetbrains-mono.css +5 -0
  28. package/ui/fonts/noto-sans-cyrillic-ext.woff2 +0 -0
  29. package/ui/fonts/noto-sans-cyrillic.woff2 +0 -0
  30. package/ui/fonts/noto-sans-latin-ext.woff2 +0 -0
  31. package/ui/fonts/noto-sans-latin.woff2 +0 -0
  32. package/ui/fonts/noto-sans.css +5 -0
  33. package/ui/fonts/source-code-pro-cyrillic-ext.woff2 +0 -0
  34. package/ui/fonts/source-code-pro-cyrillic.woff2 +0 -0
  35. package/ui/fonts/source-code-pro-latin-ext.woff2 +0 -0
  36. package/ui/fonts/source-code-pro-latin.woff2 +0 -0
  37. package/ui/fonts/source-code-pro.css +5 -0
  38. package/ui/index.html +11 -0
  39. package/ui/theme.css +44 -18
  40. package/templates/forge-and-lumen/template.json +0 -28
package/ui/app.css CHANGED
@@ -35,7 +35,7 @@
35
35
  .rail-room:hover .room-mark { opacity: 1; transform: translateY(-1px); }
36
36
  .rail-room.active, .rail-room.active:hover { background: transparent; box-shadow: none; }
37
37
  .rail-room.active .room-mark { opacity: 1; box-shadow: 0 0 0 2px var(--bg), 0 0 0 4px var(--primary); }
38
- .rail-room .rail-count { background: linear-gradient(135deg, #ff7a45, #f0452c); min-width: 18px; text-align: center; z-index: 2; }
38
+ .rail-room .rail-count { background: var(--unread-grad); min-width: 18px; text-align: center; z-index: 2; }
39
39
  .rail-room .rail-count.bump { animation: badge-pop 360ms var(--ease-pop); }
40
40
  @keyframes badge-pop { 0% { transform: scale(0.6); } 55% { transform: scale(1.3); } 100% { transform: scale(1); } }
41
41
  .shell.rail-open .rail-items { align-items: stretch; padding: 0 14px; }
@@ -44,7 +44,15 @@
44
44
  .rail-toggle { width: 44px; height: 24px; margin-top: 8px; border-radius: 8px; border: 0; background: transparent; color: var(--faint); display: grid; place-content: center; padding: 0; align-self: center; transition: background var(--t-fast), color var(--t-fast); }
45
45
  .rail-toggle .i { width: 16px; height: 16px; }
46
46
  .rail-toggle:hover { background: #fff; color: var(--primary); }
47
- .rail-foot { margin-top: auto; display: flex; flex-direction: column; gap: 0; align-items: center; }
47
+ .rail-foot { position: relative; margin-top: auto; display: flex; flex-direction: column; gap: 0; align-items: center; }
48
+ .update-pop { position: absolute; left: 12px; bottom: calc(100% - 2px); z-index: 30; display: flex; gap: 6px; align-items: flex-start; width: 250px; padding: 10px 8px 10px 14px; background: #fff; border-radius: 18px 18px 18px 6px; box-shadow: 0 10px 28px -12px rgba(28, 27, 51, 0.45), var(--shadow-tile); font-size: 12.5px; font-weight: 600; color: var(--ink-2); animation: bubble-in 0.45s var(--ease-out); }
49
+ .update-pop::after { content: ""; position: absolute; left: 14px; bottom: -6px; width: 12px; height: 12px; background: #fff; border-radius: 0 0 3px 0; transform: rotate(45deg); box-shadow: 3px 3px 4px -3px rgba(28, 27, 51, 0.25); }
50
+ .update-pop .up-main { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 8px; }
51
+ .update-pop .up-text { line-height: 1.4; }
52
+ .update-pop .up-text b { color: var(--ink); }
53
+ .update-pop .up-go { align-self: flex-start; }
54
+ .update-pop .up-side { flex: none; display: flex; flex-direction: column; gap: 2px; }
55
+ .update-pop .icon-btn.sm { width: 26px; height: 26px; }
48
56
  .shell.rail-open .rail-foot { align-items: stretch; padding: 0 14px; }
49
57
  .rail-item { position: relative; display: flex; align-items: center; justify-content: center; gap: 10px; width: 44px; height: 44px; padding: 0; border: 0; background: transparent; border-radius: 14px; color: var(--muted); font-weight: 800; font-size: 13px; white-space: nowrap; transition: background var(--t-fast), color var(--t-fast), box-shadow var(--t-fast); }
50
58
  .shell.rail-open .rail-item { width: auto; justify-content: flex-start; padding: 0 12px 0 0; }
@@ -214,9 +222,9 @@
214
222
  .timeline { position: absolute; right: 6px; top: 78px; bottom: calc(var(--composer-h, 60px) + 36px); width: 18px; z-index: 4; }
215
223
  .tl-ticks { position: absolute; inset: 0; }
216
224
  .tl-view { position: absolute; left: 2px; right: 2px; border-radius: 6px; background: rgba(91, 91, 240, 0.07); pointer-events: none; transition: top 80ms linear, height 80ms linear; }
217
- .tl-tick { position: absolute; left: 3px; width: 12px; height: 5px; border-radius: 3px; background: #cdcdf9; cursor: pointer; transition: background var(--t-fast), transform var(--t-fast); }
225
+ .tl-tick { position: absolute; left: 3px; width: 12px; height: 5px; border-radius: 3px; background: var(--tick-mine); cursor: pointer; transition: background var(--t-fast), transform var(--t-fast); }
218
226
  .tl-tick:hover, .tl-tick.active { background: var(--primary); transform: scaleX(1.25); }
219
- .tl-tick.in-view { background: #a9a9f5; }
227
+ .tl-tick.in-view { background: var(--tick-mine-view); }
220
228
  .tl-tick.pinned { background: var(--primary); }
221
229
  .tl-row.current.pinned { background: var(--lav-2); }
222
230
  .tl-row.pinned { opacity: 1; color: var(--ink); }
@@ -224,9 +232,9 @@
224
232
  .tl-row .tl-pin .i { width: 14px; height: 14px; }
225
233
  .timeline.left { left: 6px; right: auto; }
226
234
  .timeline.left .tl-view { background: rgba(28, 27, 51, 0.05); }
227
- .timeline.left .tl-tick { background: color-mix(in srgb, var(--tick, #9ca3af) 35%, #fff); }
228
- .timeline.left .tl-tick.in-view { background: color-mix(in srgb, var(--tick, #9ca3af) 60%, #fff); }
229
- .timeline.left .tl-tick.pinned, .timeline.left .tl-tick:hover, .timeline.left .tl-tick.active { background: var(--tick, #9ca3af); }
235
+ .timeline.left .tl-tick { background: color-mix(in srgb, var(--tick, var(--tick-fallback)) 35%, #fff); }
236
+ .timeline.left .tl-tick.in-view { background: color-mix(in srgb, var(--tick, var(--tick-fallback)) 60%, #fff); }
237
+ .timeline.left .tl-tick.pinned, .timeline.left .tl-tick:hover, .timeline.left .tl-tick.active { background: var(--tick, var(--tick-fallback)); }
230
238
  .timeline.left .tl-pop { left: 26px; right: auto; }
231
239
  .tl-pop::before { content: ""; position: absolute; top: -6px; bottom: -6px; right: -6px; width: 6px; }
232
240
  .timeline.left .tl-pop::before { right: auto; left: -6px; }
@@ -265,25 +273,25 @@
265
273
  .jump-latest:hover { background: var(--soft); }
266
274
  .done-notes { position: absolute; left: 30px; bottom: 96px; z-index: 5; display: flex; flex-direction: column-reverse; gap: 6px; }
267
275
  .done-note { display: inline-flex; align-items: center; gap: 8px; max-width: 230px; padding: 6px 12px 6px 8px; border: 0; border-radius: 14px; background: var(--warm); color: var(--warm-ink); font: inherit; text-align: left; cursor: pointer; box-shadow: var(--shadow-pop); animation: rise var(--t-base) var(--ease-out); overflow: hidden; }
268
- .done-note:hover { background: #ffeaa8; }
276
+ .done-note:hover { background: var(--note-hover); }
269
277
  .done-note .avatar { flex: none; }
270
278
  .done-go { display: inline-flex; align-items: center; gap: 8px; min-width: 0; padding: 6px 4px 6px 8px; border: 0; background: transparent; color: inherit; font: inherit; text-align: left; cursor: pointer; }
271
- .done-go:hover { background: #ffeaa8; }
279
+ .done-go:hover { background: var(--note-hover); }
272
280
  .done-go .avatar { flex: none; }
273
281
  .done-text { display: flex; flex-direction: column; min-width: 0; line-height: 1.25; }
274
282
  .done-text b { font-size: 12px; font-weight: 800; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
275
283
  .done-text small { font-size: 11px; font-weight: 600; opacity: 0.8; white-space: nowrap; }
276
284
  .done-x { border: 0; background: transparent; color: inherit; opacity: 0.6; font-size: 15px; line-height: 1; padding: 0 9px; cursor: pointer; }
277
- .done-x:hover { opacity: 1; background: #ffeaa8; }
285
+ .done-x:hover { opacity: 1; background: var(--note-hover); }
278
286
  .jump-latest .i { width: 16px; height: 16px; }
279
287
  .bubble { max-width: 100%; background: #fff; border-radius: 6px 18px 18px 18px; padding: 12px 16px; min-width: 0; font-size: 14.5px; font-weight: 600; line-height: 1.55; color: var(--ink-2); box-shadow: 0 2px 0 rgba(28, 27, 51, 0.06), 0 1px 3px rgba(28, 27, 51, 0.04); }
280
288
  .msg.mine .bubble { background: var(--grad-primary); color: #fff; border-radius: 18px 18px 6px 18px; box-shadow: 0 8px 18px -10px rgba(91, 91, 240, 0.7); padding: 11px 16px; }
281
289
  .msg.mine .bubble .text { color: #fff; }
282
- .msg.mine.waiting .bubble { background: linear-gradient(135deg, #ff9447, #e8642a); box-shadow: 0 8px 18px -10px rgba(232, 100, 42, 0.7); }
290
+ .msg.mine.waiting .bubble { background: var(--attention-grad); box-shadow: var(--attention-shadow); }
283
291
  .bubble .waiting { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 10px; padding-top: 8px; border-top: 1px solid rgba(255, 255, 255, 0.35); font-size: 13px; font-weight: 600; color: rgba(255, 255, 255, 0.92); }
284
292
  .bubble .waiting .i { width: 14px; height: 14px; vertical-align: -2px; }
285
293
  .bubble .waiting-text { flex: 1; min-width: 160px; }
286
- .bubble .waiting-stop { border: 0; border-radius: 10px; padding: 6px 12px; background: rgba(255, 255, 255, 0.92); color: #c9461c; font-weight: 800; font-size: 12.5px; cursor: pointer; }
294
+ .bubble .waiting-stop { border: 0; border-radius: 10px; padding: 6px 12px; background: rgba(255, 255, 255, 0.92); color: var(--attention-ink); font-weight: 800; font-size: 12.5px; cursor: pointer; }
287
295
  .bubble .waiting-stop:hover:not(:disabled) { background: #fff; }
288
296
  .bubble .waiting-stop:disabled { opacity: 0.7; cursor: default; }
289
297
  .msg.mine .mention { background: rgba(255, 255, 255, 0.22); color: #fff !important; padding: 1px 7px; border-radius: 6px; font-weight: 800; }
@@ -361,10 +369,17 @@ table.csv tbody tr:nth-child(even) td { background: rgba(91, 91, 240, 0.03); }
361
369
  .bubble .text.clamped { max-height: 9.2em; overflow: hidden; -webkit-mask-image: linear-gradient(180deg, #000 70%, transparent); mask-image: linear-gradient(180deg, #000 70%, transparent); }
362
370
  .bubble .more { background: none; border: 0; color: var(--primary); font-weight: 800; padding: 2px 0; font-size: 13px; }
363
371
  .msg.mine .bubble .more { color: #fff; }
364
- .bubble .pending { color: var(--muted); }
372
+ .bubble .pending { display: inline-flex; align-items: center; gap: 4px; height: 1.55em; vertical-align: text-bottom; }
373
+ .bubble .pending i { width: 5px; height: 5px; border-radius: 50%; background: var(--muted); opacity: 0.25; animation: think 1.4s ease-in-out infinite; }
374
+ .bubble .pending i:nth-child(2) { animation-delay: 0.2s; }
375
+ .bubble .pending i:nth-child(3) { animation-delay: 0.4s; }
376
+ @keyframes think { 0%, 60%, 100% { opacity: 0.25; transform: translateY(0); } 30% { opacity: 1; transform: translateY(-2px); } }
365
377
  .mention { font-weight: 800; }
366
- .caret { display: inline-block; width: 7px; height: 14px; background: var(--muted); margin-left: 2px; vertical-align: text-bottom; animation: blink 1s steps(2) infinite; }
367
- @keyframes blink { to { opacity: 0; } }
378
+ .working { display: inline-block; width: 19px; height: 15px; color: var(--faint); margin-left: 5px; vertical-align: -3px; overflow: visible; }
379
+ .working .forearm { animation: type 0.14s ease-in-out infinite alternate; transform-box: view-box; transform-origin: 23px 27px; }
380
+ .working .body { animation: bob 0.28s ease-in-out infinite alternate; }
381
+ @keyframes type { from { transform: rotate(-16deg); } to { transform: rotate(4deg); } }
382
+ @keyframes bob { from { transform: translateY(0); } to { transform: translateY(-0.8px); } }
368
383
  .thought { margin: 2px 0 6px; font-size: 12px; font-weight: 600; color: var(--muted); }
369
384
  .thought summary { cursor: pointer; }
370
385
  .thought-text { white-space: pre-wrap; padding: 4px 0 0 8px; border-left: 2px solid var(--lav-2); margin-top: 4px; }
@@ -403,8 +418,8 @@ table.csv tbody tr:nth-child(even) td { background: rgba(91, 91, 240, 0.03); }
403
418
  .head .edit-btn .i, .head .pin-btn .i { width: 14px; height: 14px; }
404
419
  .msg:hover .head .edit-btn, .head .edit-btn:focus, .msg:hover .head .pin-btn, .head .pin-btn:focus { opacity: 1; }
405
420
  .head .edit-btn:hover { color: var(--primary); }
406
- .head .pin-btn:hover { color: #ff8a3d; }
407
- .msg.pinned .head .pin-btn { opacity: 1; color: #ff8a3d; }
421
+ .head .pin-btn:hover { color: var(--attention); }
422
+ .msg.pinned .head .pin-btn { opacity: 1; color: var(--attention); }
408
423
  .edit-box { margin: 4px 0 6px; }
409
424
  .msg .bubble-col:has(> .bubble > .edit-box:not([hidden])) { width: 100%; }
410
425
  .msg .bubble:has(> .edit-box:not([hidden])) { width: min(760px, 100%); }
@@ -428,7 +443,7 @@ table.csv tbody tr:nth-child(even) td { background: rgba(91, 91, 240, 0.03); }
428
443
  .perm-result { color: var(--muted); font-size: 12px; }
429
444
  .visibility-divider { display: flex; align-items: center; gap: 10px; margin: 4px 0; }
430
445
  .visibility-divider .vd-line { flex: 1; height: 8px; background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='8' viewBox='0 0 16 8'><path d='M0 4 Q4 0 8 4 T16 4' fill='none' stroke='%23f472b6' stroke-width='1.6'/></svg>") repeat-x center / 16px 8px; opacity: 0.7; }
431
- .visibility-divider .vd-label { color: #be185d; background: #fff1f7; border-radius: var(--r-pill); padding: 4px 12px; font-size: 11px; font-weight: 800; white-space: nowrap; max-width: 70%; overflow: hidden; text-overflow: ellipsis; }
446
+ .visibility-divider .vd-label { color: var(--unseen-ink); background: var(--unseen-bg); border-radius: var(--r-pill); padding: 4px 12px; font-size: 11px; font-weight: 800; white-space: nowrap; max-width: 70%; overflow: hidden; text-overflow: ellipsis; }
432
447
  .msg.hidden { justify-content: center; }
433
448
  .hidden-turn { max-width: 720px; width: 100%; background: var(--soft); border-radius: 12px; padding: 6px 12px; font-size: 12px; font-weight: 600; color: var(--muted); }
434
449
  .hidden-turn summary { cursor: pointer; list-style: none; }
@@ -562,6 +577,31 @@ table.csv tbody tr:nth-child(even) td { background: rgba(91, 91, 240, 0.03); }
562
577
  .tpl-meta { color: var(--muted); font-size: 12px; font-weight: 600; }
563
578
  .tpl-item .avatar-stack { margin-top: 2px; }
564
579
  .tpl-rec { background: var(--warm); color: var(--warm-ink); font-size: 10px; padding: 1px 7px; }
580
+ .tpl-mine { background: var(--lav); color: var(--primary); font-size: 10px; padding: 1px 7px; }
581
+ .tpl-runs { display: flex; flex-wrap: wrap; gap: 6px; }
582
+ .stp-preview { display: flex; flex-direction: column; gap: 10px; max-height: 48vh; overflow: auto; padding-right: 4px; margin: 4px 0 10px; }
583
+ .stp-section { background: var(--soft); border-radius: 14px; padding: 10px 12px; }
584
+ .section.template { background: var(--lav); margin: 22px 0 14px; padding: 16px 18px 18px; box-sizing: border-box; width: 100%; overflow: hidden; }
585
+ .section.template > h4 { color: var(--primary); }
586
+ .stp-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0 12px; }
587
+ .stp-grid .field { margin-bottom: 8px; }
588
+ .stp-grid .field.wide { grid-column: 1 / -1; }
589
+ .stp-grid .switch { margin: 2px 0 8px; }
590
+ .stp-vm { display: grid; grid-template-columns: 36px 1fr; gap: 10px; align-items: start; padding: 10px 0 4px; border-top: 1px solid var(--lav-2); }
591
+ .stp-vm-fields { display: grid; grid-template-columns: 1fr 1fr; gap: 0 10px; }
592
+ .stp-vm-fields .field { margin-bottom: 8px; }
593
+ .stp-vm-fields .field.wide { grid-column: 1 / -1; }
594
+ .stp-vm-fields .field textarea { min-height: 54px; }
595
+ .stp-vm-top { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
596
+ .stp-vm-top b { flex: 1; }
597
+ .stp-section h5 { margin: 0 0 6px; font-size: 11px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--faint); }
598
+ .stp-section .kv { font-size: 12.5px; }
599
+ .stp-section ul { margin: 0; padding-left: 18px; color: var(--ink-2); font-size: 13px; font-weight: 600; }
600
+ .stp-vm { display: grid; grid-template-columns: 36px 1fr; gap: 10px; align-items: start; padding: 8px 0; border-top: 1px solid var(--lav-2); }
601
+ .stp-vm:first-of-type { border-top: 0; padding-top: 2px; }
602
+ .stp-vm-head { display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap; }
603
+ .stp-vm-role { color: var(--muted); font-size: 12.5px; font-weight: 600; line-height: 1.45; margin-top: 3px; }
604
+ .stp-vm .chips { margin-top: 5px; }
565
605
  .tpl-check { display: grid; place-items: center; width: 18px; height: 18px; border-radius: 50%; background: var(--primary); color: #fff; opacity: 0; transition: opacity var(--t-fast); }
566
606
  .tpl-check .i { width: 12px; height: 12px; }
567
607
  .tpl-item.on .tpl-check { opacity: 1; }
@@ -591,8 +631,10 @@ table.csv tbody tr:nth-child(even) td { background: rgba(91, 91, 240, 0.03); }
591
631
  .check-list.locked { pointer-events: none; opacity: 0.6; }
592
632
  .msg.system.done { justify-content: center; }
593
633
  .done-row { display: inline-flex; align-items: center; gap: 8px; padding: 6px 14px 6px 8px; border: 0; border-radius: var(--r-pill); background: var(--warm); color: var(--warm-ink); font: inherit; font-size: 12px; font-weight: 800; cursor: pointer; box-shadow: var(--edge); }
594
- .done-row:hover { background: #ffeaa8; }
634
+ .done-row:hover { background: var(--note-hover); }
595
635
  .done-notes { flex-direction: column; }
596
636
  .done-note.new { background: var(--card); color: var(--ink-2); }
597
637
  .done-note.new:hover { background: var(--soft); }
598
638
  .meta .seen-by { color: var(--primary); font-weight: 800; margin-left: 6px; }
639
+ .section.template .stp-row { justify-content: center; margin: 6px 0 0; }
640
+ .section.template .field-note { margin: -2px 0 12px; }