privateboard 0.1.3 → 0.1.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.
- package/dist/cli.js +17 -3
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/public/index.html +164 -1
package/package.json
CHANGED
package/public/index.html
CHANGED
|
@@ -2434,9 +2434,18 @@
|
|
|
2434
2434
|
the SSE `room-paused` event arrives. */
|
|
2435
2435
|
html.pause-pending .input-bar .input-wrap { display: none; }
|
|
2436
2436
|
html.pause-pending .input-bar .speaking-queue { display: none; }
|
|
2437
|
+
/* Hide the session-control toolbar mid-transition · prevents double-
|
|
2438
|
+
clicking pause while the previous pause is still resolving (and
|
|
2439
|
+
adjourn while we're stopping cleanly is also confusing UX). */
|
|
2440
|
+
html.pause-pending .input-bar .input-bar-actions { display: none; }
|
|
2437
2441
|
html.pause-pending .input-bar::before {
|
|
2438
2442
|
content: "⌛ pausing after the current turn finishes…";
|
|
2439
2443
|
display: block;
|
|
2444
|
+
/* `.input-bar` is now `display: flex` (for the new icon toolbar),
|
|
2445
|
+
so this pseudo is a flex child. Without `flex: 1` it shrinks
|
|
2446
|
+
to its text width instead of spanning the bar. The grow-to-fill
|
|
2447
|
+
restores the pre-flex banner behaviour. */
|
|
2448
|
+
flex: 1 1 auto;
|
|
2440
2449
|
text-align: center;
|
|
2441
2450
|
font-family: var(--mono);
|
|
2442
2451
|
font-size: 11px;
|
|
@@ -2487,6 +2496,39 @@
|
|
|
2487
2496
|
}
|
|
2488
2497
|
.resume-btn-lg:hover { background: var(--bg); color: var(--lime); }
|
|
2489
2498
|
|
|
2499
|
+
/* Adjourn button on the paused-bar · same shape as resume-btn-lg
|
|
2500
|
+
but secondary (ghost) treatment so resume reads as the primary
|
|
2501
|
+
action when both are present. Goes warn-coloured on hover for
|
|
2502
|
+
the destructive cue (matches the input-bar's ib-adjourn). */
|
|
2503
|
+
.adjourn-btn-lg {
|
|
2504
|
+
display: inline-flex;
|
|
2505
|
+
align-items: center;
|
|
2506
|
+
gap: 5px;
|
|
2507
|
+
padding: 6px 12px;
|
|
2508
|
+
background: transparent;
|
|
2509
|
+
color: var(--text-soft);
|
|
2510
|
+
border: 0.5px solid var(--line-bright);
|
|
2511
|
+
font-family: var(--mono);
|
|
2512
|
+
font-size: 10px;
|
|
2513
|
+
font-weight: 700;
|
|
2514
|
+
line-height: 1.2;
|
|
2515
|
+
cursor: pointer;
|
|
2516
|
+
text-decoration: none;
|
|
2517
|
+
text-transform: uppercase;
|
|
2518
|
+
letter-spacing: 0.1em;
|
|
2519
|
+
transition: color 0.12s, border-color 0.12s, background 0.12s;
|
|
2520
|
+
}
|
|
2521
|
+
.adjourn-btn-lg .adjourn-glyph {
|
|
2522
|
+
color: var(--text-faint);
|
|
2523
|
+
letter-spacing: -0.04em;
|
|
2524
|
+
}
|
|
2525
|
+
.adjourn-btn-lg:hover {
|
|
2526
|
+
color: var(--red, #C75450);
|
|
2527
|
+
border-color: var(--red, #C75450);
|
|
2528
|
+
background: var(--bg);
|
|
2529
|
+
}
|
|
2530
|
+
.adjourn-btn-lg:hover .adjourn-glyph { color: var(--red, #C75450); }
|
|
2531
|
+
|
|
2490
2532
|
/* ─── Adjourned-state controls (room is archived) ─── */
|
|
2491
2533
|
.adjourned-pill {
|
|
2492
2534
|
display: inline-flex;
|
|
@@ -8811,14 +8853,123 @@
|
|
|
8811
8853
|
background: var(--panel);
|
|
8812
8854
|
}
|
|
8813
8855
|
|
|
8814
|
-
/* Input bar — sits inside the chat column
|
|
8856
|
+
/* Input bar — sits inside the chat column. Live state hosts a
|
|
8857
|
+
small action toolbar (pause / adjourn) on the left, then the
|
|
8858
|
+
input pill which grows to fill remaining width. */
|
|
8815
8859
|
.input-bar {
|
|
8816
8860
|
flex: 0 0 auto;
|
|
8817
8861
|
border-top: 0.5px solid var(--line-bright);
|
|
8818
8862
|
padding: 8px 14px;
|
|
8819
8863
|
background: var(--panel-2);
|
|
8864
|
+
display: flex;
|
|
8865
|
+
align-items: stretch;
|
|
8866
|
+
gap: 10px;
|
|
8867
|
+
}
|
|
8868
|
+
/* Session-control icons · sit to the LEFT of the input pill as
|
|
8869
|
+
bare glyph buttons. Borderless in the resting state so they
|
|
8870
|
+
don't compete with the input pill's hairline frame.
|
|
8871
|
+
──────────────────────────────────────────────────────────────
|
|
8872
|
+
Visual vocabulary mirrors the sidebar's nav icons (Lucide-style
|
|
8873
|
+
stroked SVG, 16px, mask-image fill via currentColor). Hover
|
|
8874
|
+
state matches the sidebar's `.new-btn:hover` — panel-2 bg + text
|
|
8875
|
+
colour shift, no accent tint. The destructive cue for adjourn
|
|
8876
|
+
lives in the confirm overlay, not in the icon, so neither
|
|
8877
|
+
button needs an accent colour to broadcast severity here. Hit
|
|
8878
|
+
target 32×32; icon 16×16 sits centred inside it. */
|
|
8879
|
+
.input-bar-actions {
|
|
8880
|
+
display: flex;
|
|
8881
|
+
align-items: center;
|
|
8882
|
+
gap: 2px;
|
|
8883
|
+
}
|
|
8884
|
+
.ib-action {
|
|
8885
|
+
position: relative;
|
|
8886
|
+
width: 32px;
|
|
8887
|
+
height: 32px;
|
|
8888
|
+
display: inline-flex;
|
|
8889
|
+
align-items: center;
|
|
8890
|
+
justify-content: center;
|
|
8891
|
+
padding: 0;
|
|
8892
|
+
background: transparent;
|
|
8893
|
+
border: none;
|
|
8894
|
+
color: var(--text-faint);
|
|
8895
|
+
cursor: pointer;
|
|
8896
|
+
transition: color 0.12s, background 0.12s;
|
|
8897
|
+
}
|
|
8898
|
+
.ib-action::before {
|
|
8899
|
+
content: "";
|
|
8900
|
+
width: 16px;
|
|
8901
|
+
height: 16px;
|
|
8902
|
+
background-color: currentColor;
|
|
8903
|
+
-webkit-mask-image: var(--icon, none);
|
|
8904
|
+
mask-image: var(--icon, none);
|
|
8905
|
+
-webkit-mask-repeat: no-repeat;
|
|
8906
|
+
mask-repeat: no-repeat;
|
|
8907
|
+
-webkit-mask-position: center;
|
|
8908
|
+
mask-position: center;
|
|
8909
|
+
-webkit-mask-size: 16px 16px;
|
|
8910
|
+
mask-size: 16px 16px;
|
|
8911
|
+
}
|
|
8912
|
+
.ib-action:hover { background: var(--panel-2); color: var(--text); }
|
|
8913
|
+
/* Hover tooltip · CSS-only via ::after + data-tip. The native
|
|
8914
|
+
`title` attribute pops after a 1-2s OS delay, which is sluggish;
|
|
8915
|
+
this version reveals at ~300ms — slow enough not to be noisy
|
|
8916
|
+
when the cursor only passes through, fast enough to feel
|
|
8917
|
+
responsive on intentional dwell. Mirrors the .note-tip visual
|
|
8918
|
+
register (panel-2 surface, mono micro-type, hairline frame).
|
|
8919
|
+
Pointer-events:none so the tooltip never blocks the hover that
|
|
8920
|
+
triggers it. */
|
|
8921
|
+
.ib-action::after {
|
|
8922
|
+
content: attr(data-tip);
|
|
8923
|
+
position: absolute;
|
|
8924
|
+
bottom: calc(100% + 8px);
|
|
8925
|
+
/* Anchor the tooltip's LEFT edge to the button's left edge so
|
|
8926
|
+
the tip extends RIGHTWARD into the chat column. Centered
|
|
8927
|
+
anchoring would push the left half past the chat-column edge
|
|
8928
|
+
where `.body-grid { overflow: hidden }` (line ~215) clips it
|
|
8929
|
+
behind the sidebar — the user reported this as "tip gets cut
|
|
8930
|
+
off by the sidebar". Right-anchored gives clearance because
|
|
8931
|
+
the chat column has plenty of width to the right. */
|
|
8932
|
+
left: 0;
|
|
8933
|
+
transform: translateY(3px);
|
|
8934
|
+
background: var(--panel-2);
|
|
8935
|
+
border: 0.5px solid var(--line-strong);
|
|
8936
|
+
padding: 5px 9px;
|
|
8937
|
+
font-family: var(--mono);
|
|
8938
|
+
font-size: 10px;
|
|
8939
|
+
letter-spacing: 0.04em;
|
|
8940
|
+
color: var(--text);
|
|
8941
|
+
white-space: nowrap;
|
|
8942
|
+
pointer-events: none;
|
|
8943
|
+
opacity: 0;
|
|
8944
|
+
visibility: hidden;
|
|
8945
|
+
box-shadow: 0 4px 14px -6px rgba(0, 0, 0, 0.55);
|
|
8946
|
+
/* On exit the visibility flip is delayed past the opacity fade
|
|
8947
|
+
so the tooltip stays interactable until it has fully
|
|
8948
|
+
disappeared visually. */
|
|
8949
|
+
transition: opacity 0.14s ease, transform 0.14s ease, visibility 0s linear 0.18s;
|
|
8950
|
+
z-index: 50;
|
|
8951
|
+
}
|
|
8952
|
+
.ib-action:hover::after,
|
|
8953
|
+
.ib-action:focus-visible::after {
|
|
8954
|
+
opacity: 1;
|
|
8955
|
+
visibility: visible;
|
|
8956
|
+
transform: translateY(0);
|
|
8957
|
+
/* On entry · 0.3s delay before the fade starts; visibility
|
|
8958
|
+
flips immediately so the transform animates from offset. */
|
|
8959
|
+
transition: opacity 0.14s ease 0.3s, transform 0.14s ease 0.3s, visibility 0s linear 0.3s;
|
|
8960
|
+
}
|
|
8961
|
+
/* Pause · Lucide pause (two rounded vertical bars). */
|
|
8962
|
+
.ib-pause {
|
|
8963
|
+
--icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='14' y='3' width='5' height='18' rx='1'/><rect x='5' y='3' width='5' height='18' rx='1'/></svg>");
|
|
8964
|
+
}
|
|
8965
|
+
/* Adjourn · Lucide log-out (door + arrow exit). Reads as "leave
|
|
8966
|
+
this session"; the confirm overlay clarifies brief filing. */
|
|
8967
|
+
.ib-adjourn {
|
|
8968
|
+
--icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4'/><polyline points='16 17 21 12 16 7'/><line x1='21' x2='9' y1='12' y2='12'/></svg>");
|
|
8820
8969
|
}
|
|
8821
8970
|
.input-wrap {
|
|
8971
|
+
flex: 1 1 auto;
|
|
8972
|
+
min-width: 0;
|
|
8822
8973
|
background: var(--bg);
|
|
8823
8974
|
border: 0.5px solid var(--line-strong);
|
|
8824
8975
|
padding: 0 8px;
|
|
@@ -9073,6 +9224,17 @@
|
|
|
9073
9224
|
</div>
|
|
9074
9225
|
|
|
9075
9226
|
<footer class="input-bar">
|
|
9227
|
+
<!-- Session-control toolbar · pause + adjourn live left of
|
|
9228
|
+
the input pill so they're reachable without leaving
|
|
9229
|
+
the typing area. Both reuse the existing data-pause /
|
|
9230
|
+
data-adjourn handlers; no new backend routes. The
|
|
9231
|
+
visual grammar matches head-actions (mono caps,
|
|
9232
|
+
brackets) but at a tighter scale. Adjourn turns warn
|
|
9233
|
+
on hover to flag its destructiveness. -->
|
|
9234
|
+
<div class="input-bar-actions">
|
|
9235
|
+
<button type="button" class="ib-action ib-pause" data-pause aria-label="Pause discussion" data-tip="Pause · you can resume later"></button>
|
|
9236
|
+
<button type="button" class="ib-action ib-adjourn" data-adjourn aria-label="Adjourn the room" data-tip="Adjourn · file the report and end"></button>
|
|
9237
|
+
</div>
|
|
9076
9238
|
<div class="input-wrap">
|
|
9077
9239
|
<input type="text" placeholder="interject anytime · @first_p to direct a director..." data-send-input>
|
|
9078
9240
|
<button class="send-btn" data-send-button>[ Send ]</button>
|
|
@@ -9085,6 +9247,7 @@
|
|
|
9085
9247
|
</div>
|
|
9086
9248
|
<div class="paused-bar-actions">
|
|
9087
9249
|
<a href="?status=live" class="resume-btn-lg">[ ▶ Resume Discussion ]</a>
|
|
9250
|
+
<a href="#" class="adjourn-btn-lg" data-adjourn>[ <span class="adjourn-glyph">⏏</span> Adjourn ]</a>
|
|
9088
9251
|
</div>
|
|
9089
9252
|
</footer>
|
|
9090
9253
|
|