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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "privateboard",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "PrivateBoard · your private board meeting, on call. Local-first, multi-agent thinking amplifier.",
5
5
  "type": "module",
6
6
  "bin": {
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