@leftoff/cli 0.9.8-beta.10 → 0.9.8-beta.11
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/CHANGELOG.md +5 -0
- package/bin/leftoff.js +327 -324
- package/mod/.claude-plugin/plugin.json +1 -1
- package/mod/hooks/register.js +1 -1
- package/package.json +1 -1
- package/ui/app.css +148 -1
- package/ui/app.js +387 -13
- package/ui/attach.js +211 -0
- package/ui/composer.js +46 -0
- package/ui/lightbox.js +452 -0
- package/ui/live-view.js +16 -3
- package/ui/pdfview.js +510 -0
- package/ui/vendor/PDFJS-LICENSE.txt +179 -0
- package/ui/vendor/pdfjs/pdf.min.js +27 -0
- package/ui/vendor/pdfjs/pdf.worker.min.js +27 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leftoff",
|
|
3
|
-
"version": "0.9.8-beta.
|
|
3
|
+
"version": "0.9.8-beta.11",
|
|
4
4
|
"description": "Leftoff (formerly Checkpoints): WTF was I working on? Tracks every Claude Code session on this machine, writes a 3-line checkpoint when one goes quiet, and adds /cp (checkpoint now), /cp-name and a /leftoff pane. Talks to the local Leftoff daemon on 127.0.0.1:7429 and falls back to writing markdown in ~/checkpoints.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Joel"
|
package/mod/hooks/register.js
CHANGED
|
@@ -28,7 +28,7 @@ const END_TIMEOUT_MS = 1000
|
|
|
28
28
|
const MODEL_TIMEOUT_MS = 20000
|
|
29
29
|
|
|
30
30
|
// Module state. $.state is not used: the pane redraws with $.ui.invalidate.
|
|
31
|
-
const MOD_VERSION = '0.9.8-beta.
|
|
31
|
+
const MOD_VERSION = '0.9.8-beta.11' // keep in step with .claude-plugin/plugin.json
|
|
32
32
|
|
|
33
33
|
const st = {
|
|
34
34
|
internal: false,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@leftoff/cli",
|
|
3
|
-
"version": "0.9.8-beta.
|
|
3
|
+
"version": "0.9.8-beta.11",
|
|
4
4
|
"description": "Leftoff: WTF was I working on? Tracks every Claude Code session, writes a 3-line checkpoint when one goes quiet, and gives you a daily digest and a board, on your Mac and (optionally) your phone.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude",
|
package/ui/app.css
CHANGED
|
@@ -2124,7 +2124,78 @@ mark.tx, .co-snip mark, .tx-snip mark, .tx-msg-text mark { background: var(--tx-
|
|
|
2124
2124
|
/* 0.9.8: another Mac's session whose Mac is offline */
|
|
2125
2125
|
.owner-off { display: flex; gap: 10px; align-items: flex-start; margin: 12px 0; padding: 10px 12px; border: 1px solid var(--line); border-radius: var(--radius); background: var(--card); color: var(--text); font-size: 14px; line-height: 1.45; }
|
|
2126
2126
|
.owner-off .ic { flex: none; width: 18px; height: 18px; margin-top: 1px; color: var(--muted); }
|
|
2127
|
-
|
|
2127
|
+
/* 0.9.8 the Live composer: one rounded box, a textarea that starts at one line
|
|
2128
|
+
and grows to 8 (then scrolls inside), a round ↑ in the corner. The focus ring
|
|
2129
|
+
is the box's. The button is 44px to hit with a 32px dot inside. */
|
|
2130
|
+
.composer { position: relative; display: flex; align-items: flex-end; gap: 2px; margin-top: 10px; padding: 3px 3px 3px 14px; border: 1px solid var(--line-strong); border-radius: 22px; background: var(--card2); box-shadow: 0 1px 2px rgba(0,0,0,.18); cursor: text; transition: border-color .15s, box-shadow .15s; }
|
|
2131
|
+
[data-theme="light"] .composer { background: #fff; box-shadow: 0 1px 3px rgba(22,26,36,.07), 0 1px 1px rgba(22,26,36,.04); }
|
|
2132
|
+
.composer:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--focus); }
|
|
2133
|
+
.composer.off { opacity: .6; cursor: default; }
|
|
2134
|
+
.composer .composer-input { flex: 1 1 auto; min-width: 0; display: block; box-sizing: border-box; height: 44px; min-height: 0; max-height: none; margin: 0; padding: 11px 0; border: 0; border-radius: 0; background: transparent; color: var(--text); font: inherit; font-size: 16px; line-height: 22px; resize: none; overflow-y: hidden; outline: none; box-shadow: none; -webkit-appearance: none; appearance: none; scrollbar-width: thin; }
|
|
2135
|
+
.composer .composer-input:focus, .composer .composer-input:focus-visible { outline: none; border: 0; box-shadow: none; }
|
|
2136
|
+
.composer .composer-input::placeholder { color: var(--muted); opacity: 1; }
|
|
2137
|
+
.composer .composer-input:disabled { cursor: not-allowed; }
|
|
2138
|
+
.composer-send { flex: none; position: relative; width: 44px; height: 44px; margin: 0; padding: 0; border: 0; background: transparent; display: grid; place-items: center; cursor: pointer; color: var(--on-accent); -webkit-tap-highlight-color: transparent; }
|
|
2139
|
+
.composer-dot { width: 32px; height: 32px; border-radius: 50%; display: grid; place-items: center; background: var(--accent); color: var(--on-accent); transition: background-color .15s, color .15s, transform .1s; }
|
|
2140
|
+
.composer-dot .ic { width: 18px; height: 18px; }
|
|
2141
|
+
.composer-send:hover:not(:disabled) .composer-dot { background: color-mix(in srgb, var(--accent) 86%, var(--text)); }
|
|
2142
|
+
.composer-send:active:not(:disabled) .composer-dot { transform: scale(.92); }
|
|
2143
|
+
.composer-send:disabled { cursor: default; }
|
|
2144
|
+
.composer-send:disabled .composer-dot { background: color-mix(in srgb, var(--muted) 22%, transparent); color: var(--faint); }
|
|
2145
|
+
.composer-send:focus { outline: none; }
|
|
2146
|
+
.composer-send:focus-visible .composer-dot { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
2147
|
+
.composer-send.sending .composer-dot { background: var(--accent); color: var(--on-accent); opacity: .55; }
|
|
2148
|
+
.composer-send.sending .composer-dot .ic { animation: composer-up 1s ease-in-out infinite; }
|
|
2149
|
+
@keyframes composer-up { 0%, 100% { transform: translateY(1px); } 50% { transform: translateY(-2px); } }
|
|
2150
|
+
@media (prefers-reduced-motion: reduce) { .composer, .composer-dot { transition: none; } .composer-send.sending .composer-dot .ic { animation: none; } }
|
|
2151
|
+
|
|
2152
|
+
/* 0.9.8 attachments: a paperclip beside ↑, chips above the words inside the box, thumbnails in your bubble */
|
|
2153
|
+
.composer { flex-wrap: wrap; }
|
|
2154
|
+
.composer .att-chips { flex: 0 0 100%; order: -1; display: flex; flex-wrap: wrap; gap: 6px; padding: 8px 8px 2px 0; margin-left: -6px; }
|
|
2155
|
+
.composer .att-chips[hidden] { display: none; }
|
|
2156
|
+
.composer.att-drop { border-color: var(--accent); box-shadow: 0 0 0 3px var(--focus); background: color-mix(in srgb, var(--accent) 7%, var(--card2)); }
|
|
2157
|
+
.att-input { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; overflow: hidden; clip: rect(0 0 0 0); }
|
|
2158
|
+
.composer-attach { flex: none; width: 44px; height: 44px; margin: 0; padding: 0; border: 0; background: transparent; display: grid; place-items: center; cursor: pointer; color: var(--muted); -webkit-tap-highlight-color: transparent; }
|
|
2159
|
+
.composer-clip { width: 32px; height: 32px; border-radius: 50%; display: grid; place-items: center; transition: background-color .15s, color .15s; }
|
|
2160
|
+
.composer-clip .ic { width: 19px; height: 19px; }
|
|
2161
|
+
.composer-attach:hover:not(:disabled) .composer-clip { background: color-mix(in srgb, var(--muted) 16%, transparent); color: var(--text); }
|
|
2162
|
+
.composer-attach:focus { outline: none; }
|
|
2163
|
+
.composer-attach:focus-visible .composer-clip { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
2164
|
+
.composer-attach:disabled { cursor: default; opacity: .5; }
|
|
2165
|
+
.att-chip { position: relative; display: flex; align-items: center; gap: 8px; max-width: 100%; min-width: 0; width: auto; flex: 0 1 auto; height: 52px; padding: 4px 0 4px 4px; border: 1px solid var(--line); border-radius: 12px; background: var(--card); overflow: hidden; cursor: default; }
|
|
2166
|
+
[data-theme="light"] .att-chip { background: #f6f7f9; }
|
|
2167
|
+
.att-chip.failed { border-color: color-mix(in srgb, var(--red) 60%, var(--line)); }
|
|
2168
|
+
.att-thumb { flex: none; width: 42px; height: 42px; border-radius: 8px; overflow: hidden; display: grid; place-items: center; background: color-mix(in srgb, var(--muted) 14%, transparent); color: var(--muted); }
|
|
2169
|
+
.att-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
|
|
2170
|
+
.att-thumb .ic { width: 22px; height: 22px; }
|
|
2171
|
+
.att-thumb-pdf > * { grid-area: 1 / 1; }
|
|
2172
|
+
.att-thumb-pdf img { object-position: 50% 0; background: #fff; }
|
|
2173
|
+
.att-thumb-pdf img:not([src]) { visibility: hidden; }
|
|
2174
|
+
.att-meta { flex: 1 1 auto; min-width: 48px; max-width: 170px; display: flex; flex-direction: column; line-height: 1.25; }
|
|
2175
|
+
.att-name { font-size: 13px; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
2176
|
+
.att-size { font-size: 12px; color: var(--muted); white-space: nowrap; }
|
|
2177
|
+
.att-chip.failed .att-size { color: var(--red); }
|
|
2178
|
+
.att-btn { flex: none; width: 44px; height: 44px; margin: 0 -4px 0 -10px; padding: 0; border: 0; background: transparent; color: var(--muted); font-size: 20px; line-height: 1; cursor: pointer; display: grid; place-items: center; border-radius: 50%; -webkit-tap-highlight-color: transparent; }
|
|
2179
|
+
.att-btn + .att-btn { margin-left: -14px; }
|
|
2180
|
+
.att-btn:hover { color: var(--text); }
|
|
2181
|
+
.att-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: -6px; }
|
|
2182
|
+
.att-retry { font-size: 18px; color: var(--accent); }
|
|
2183
|
+
.att-bar { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: color-mix(in srgb, var(--muted) 18%, transparent); }
|
|
2184
|
+
.att-bar > span { display: block; height: 100%; background: var(--accent); transition: width .15s; }
|
|
2185
|
+
.lv-atts { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; justify-content: flex-end; }
|
|
2186
|
+
.lv-att { padding: 0; border: 1px solid var(--line); border-radius: 12px; background: var(--card); cursor: pointer; overflow: hidden; color: inherit; font: inherit; min-height: 44px; min-width: 44px; }
|
|
2187
|
+
.lv-att-img { width: 132px; height: 132px; background: color-mix(in srgb, var(--muted) 12%, transparent); }
|
|
2188
|
+
.lv-att-img img { width: 100%; height: 100%; object-fit: cover; display: block; }
|
|
2189
|
+
.lv-att-img img:not([src]) { visibility: hidden; }
|
|
2190
|
+
.lv-att-file { display: flex; align-items: center; gap: 8px; padding: 4px 12px 4px 4px; max-width: 240px; text-align: left; }
|
|
2191
|
+
.lv-att.gone { opacity: .55; }
|
|
2192
|
+
.lv-att:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
2193
|
+
.att-full { display: grid; place-items: center; }
|
|
2194
|
+
.att-full img { max-width: 100%; max-height: 72vh; height: auto; border-radius: 8px; }
|
|
2195
|
+
.att-full-actions { display: flex; justify-content: center; margin-top: 12px; }
|
|
2196
|
+
.att-text { white-space: pre-wrap; word-break: break-word; font-size: 13px; max-height: 70vh; overflow: auto; }
|
|
2197
|
+
@media (max-width: 700px) { .att-chip { gap: 6px; padding-left: 3px; } .att-chip .att-thumb { width: 36px; height: 36px; } .att-chip .att-btn { margin-left: -12px; margin-right: -6px; } .lv-att-img { width: 112px; height: 112px; } }
|
|
2198
|
+
@media (prefers-reduced-motion: reduce) { .att-bar > span, .composer-clip { transition: none; } }
|
|
2128
2199
|
/* Chat on a live card: straight to the Live box */
|
|
2129
2200
|
.btn.chat-btn { position: relative; color: var(--green); border-color: color-mix(in srgb, var(--green) 40%, var(--btn-line)); font-weight: 600; }
|
|
2130
2201
|
.chat-btn .unread-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); position: absolute; top: -3px; right: -3px; box-shadow: 0 0 0 2px var(--card); }
|
|
@@ -2439,3 +2510,79 @@ mark.tx, .co-snip mark, .tx-snip mark, .tx-msg-text mark { background: var(--tx-
|
|
|
2439
2510
|
.lvs-hint { color: var(--muted); font-style: italic; }
|
|
2440
2511
|
.lv-reconnecting .lvs-time, .lv-reconnecting .lvs-sep, .lv-reconnecting .lvs-label { display: none; }
|
|
2441
2512
|
.lv-reconnecting .lv-spin { animation-duration: 2.4s; opacity: .5; }
|
|
2513
|
+
|
|
2514
|
+
/* 0.9.8: the image preview (ui/lightbox.js): full screen, dark, the picture fit
|
|
2515
|
+
inside the safe areas; a top bar that fades when left alone; edge arrows on a
|
|
2516
|
+
desktop. Pinch, pan and swipe are ours (touch-action: none) — only here: the
|
|
2517
|
+
page itself keeps the browser's zoom. */
|
|
2518
|
+
.lightbox { position: fixed; inset: 0; z-index: 70; color: #fff; outline: none; touch-action: none; overscroll-behavior: contain; -webkit-user-select: none; user-select: none; -webkit-tap-highlight-color: transparent; opacity: 0; }
|
|
2519
|
+
.lightbox[hidden] { display: none; }
|
|
2520
|
+
.lightbox.lb-in { opacity: 1; transition: opacity 180ms ease-out; }
|
|
2521
|
+
.lightbox.lb-out { opacity: 0; transition: opacity 160ms ease-in; }
|
|
2522
|
+
html.lb-open, html.lb-open body { overflow: hidden; }
|
|
2523
|
+
.lb-back { position: absolute; inset: 0; background: rgba(0, 0, 0, .97); }
|
|
2524
|
+
.lb-stage { position: absolute; inset: 0; overflow: hidden; touch-action: none; padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left); cursor: default; }
|
|
2525
|
+
.lb-img { position: absolute; left: 50%; top: 50%; max-width: none; max-height: none; transform-origin: 50% 50%; will-change: transform; -webkit-user-drag: none; user-select: none; cursor: zoom-in; image-rendering: auto; }
|
|
2526
|
+
.lb-img:not([src]) { visibility: hidden; }
|
|
2527
|
+
.lightbox.lb-zoomed .lb-img { cursor: grab; }
|
|
2528
|
+
.lightbox.lb-zoomed .lb-img:active { cursor: grabbing; }
|
|
2529
|
+
.lightbox.lb-anim .lb-img { transition: transform 220ms cubic-bezier(.2, .8, .2, 1); }
|
|
2530
|
+
.lb-img.lb-loading { filter: blur(12px); }
|
|
2531
|
+
.lb-spin { position: absolute; left: 50%; top: 50%; width: 28px; height: 28px; margin: -14px 0 0 -14px; border-color: rgba(255, 255, 255, .25); border-top-color: #fff; }
|
|
2532
|
+
.lb-spin[hidden] { display: none; }
|
|
2533
|
+
.lb-err { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); max-width: 80vw; text-align: center; color: rgba(255, 255, 255, .8); font-size: 15px; }
|
|
2534
|
+
.lb-err[hidden] { display: none; }
|
|
2535
|
+
.lb-bar { position: absolute; left: 0; right: 0; top: 0; display: flex; align-items: center; gap: 4px; padding: calc(6px + env(safe-area-inset-top)) calc(6px + env(safe-area-inset-right)) 18px calc(14px + env(safe-area-inset-left)); background: linear-gradient(to bottom, rgba(0, 0, 0, .62), rgba(0, 0, 0, .28) 70%, transparent); transition: opacity 220ms ease; }
|
|
2536
|
+
.lb-meta { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; line-height: 1.25; }
|
|
2537
|
+
.lb-name { font-weight: 600; font-size: 15px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
2538
|
+
.lb-sub { display: flex; gap: 8px; font-size: 12.5px; color: rgba(255, 255, 255, .72); font-variant-numeric: tabular-nums; }
|
|
2539
|
+
.lb-size:empty, .lb-count:empty, .lb-count[hidden] { display: none; }
|
|
2540
|
+
.lb-size:not(:empty) + .lb-count:not(:empty)::before { content: "·"; margin-right: 8px; }
|
|
2541
|
+
.lb-btn { flex: none; display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-width: 44px; height: 44px; padding: 0 10px; border: 0; border-radius: 22px; background: transparent; color: #fff; font: inherit; font-size: 14px; text-decoration: none; cursor: pointer; }
|
|
2542
|
+
.lb-btn .ic { width: 22px; height: 22px; }
|
|
2543
|
+
.lb-x { width: 44px; padding: 0; }
|
|
2544
|
+
.lb-btn:hover { background: rgba(255, 255, 255, .14); }
|
|
2545
|
+
.lb-btn:focus-visible, .lb-nav:focus-visible { outline: 2px solid #fff; outline-offset: -2px; }
|
|
2546
|
+
.lb-dl[aria-disabled="true"] { opacity: .45; cursor: default; }
|
|
2547
|
+
.lb-dl[hidden] { display: none; }
|
|
2548
|
+
.lb-nav { position: absolute; top: 50%; width: 48px; height: 48px; margin-top: -24px; border: 0; border-radius: 50%; display: none; align-items: center; justify-content: center; background: rgba(30, 30, 30, .62); color: #fff; cursor: pointer; transition: opacity 220ms ease, background 120ms; }
|
|
2549
|
+
.lb-nav .ic { width: 24px; height: 24px; }
|
|
2550
|
+
.lb-nav:hover { background: rgba(60, 60, 60, .8); }
|
|
2551
|
+
.lb-prev { left: calc(14px + env(safe-area-inset-left)); }
|
|
2552
|
+
.lb-next { right: calc(14px + env(safe-area-inset-right)); }
|
|
2553
|
+
.lightbox.lb-fine .lb-nav:not([hidden]) { display: inline-flex; }
|
|
2554
|
+
.lightbox.lb-idle .lb-bar, .lightbox.lb-idle .lb-nav { opacity: 0; pointer-events: none; }
|
|
2555
|
+
.lightbox.lb-idle .lb-stage { cursor: none; }
|
|
2556
|
+
.lb-live { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
|
|
2557
|
+
@media (max-width: 699.98px) { .lb-dl-label { display: none; } .lb-dl { width: 44px; padding: 0; } }
|
|
2558
|
+
@media (prefers-reduced-motion: reduce) { .lightbox.lb-in, .lightbox.lb-out, .lightbox.lb-anim .lb-img, .lb-bar, .lb-nav { transition: none; } .lb-spin { animation: none; } }
|
|
2559
|
+
|
|
2560
|
+
/* 0.9.8: the PDF preview (ui/pdfview.js): the image preview's family (dark,
|
|
2561
|
+
a top bar with name, size, "page 3 of 12", Download, ×); the pages stacked
|
|
2562
|
+
and scrolled under it, fit to the width. One finger scrolls (the browser's
|
|
2563
|
+
own); two pinch (ours, so the page underneath never zooms). */
|
|
2564
|
+
.pdfview { position: fixed; inset: 0; z-index: 70; color: #fff; background: #121214; outline: none; overscroll-behavior: contain; -webkit-tap-highlight-color: transparent; opacity: 0; }
|
|
2565
|
+
.pdfview[hidden] { display: none; }
|
|
2566
|
+
.pdfview.pv-in { opacity: 1; transition: opacity 160ms ease-out; }
|
|
2567
|
+
.pdfview.pv-out { opacity: 0; transition: opacity 150ms ease-in; }
|
|
2568
|
+
html.pv-open, html.pv-open body { overflow: hidden; }
|
|
2569
|
+
.pv-scroll { position: absolute; inset: 0; overflow: auto; -webkit-overflow-scrolling: touch; overscroll-behavior: contain; touch-action: pan-x pan-y; outline: none; padding: 0 env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left); }
|
|
2570
|
+
.pv-scroll:focus-visible { box-shadow: inset 0 0 0 2px rgba(255, 255, 255, .5); }
|
|
2571
|
+
.pv-stack { position: relative; transform-origin: 0 0; will-change: transform; }
|
|
2572
|
+
.pv-page { position: absolute; background: #fff; border-radius: 2px; box-shadow: 0 1px 3px rgba(0, 0, 0, .5), 0 6px 24px rgba(0, 0, 0, .35); overflow: hidden; }
|
|
2573
|
+
.pv-page:not(.pv-drawn)::after { content: ""; position: absolute; left: 50%; top: 50%; width: 22px; height: 22px; margin: -11px 0 0 -11px; border-radius: 50%; border: 2px solid rgba(0, 0, 0, .12); border-top-color: rgba(0, 0, 0, .45); animation: spin .8s linear infinite; }
|
|
2574
|
+
.pv-page.pv-failed::after { display: none; }
|
|
2575
|
+
.pv-canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
|
|
2576
|
+
.pdfview.pv-zoomed .pv-scroll { cursor: zoom-out; }
|
|
2577
|
+
.pv-bar { position: absolute; z-index: 2; left: 0; right: 0; top: 0; display: flex; align-items: center; gap: 2px; padding: calc(6px + env(safe-area-inset-top)) calc(6px + env(safe-area-inset-right)) 6px calc(14px + env(safe-area-inset-left)); background: rgba(10, 10, 12, .82); -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px); border-bottom: 1px solid rgba(255, 255, 255, .08); }
|
|
2578
|
+
.pv-zoom { display: none; width: 44px; padding: 0; }
|
|
2579
|
+
.pdfview.pv-fine .pv-zoom { display: inline-flex; }
|
|
2580
|
+
.pv-zoom:disabled { opacity: .35; cursor: default; background: transparent; }
|
|
2581
|
+
.pv-msg { position: absolute; z-index: 1; left: 50%; top: 50%; transform: translate(-50%, -50%); display: flex; flex-direction: column; align-items: center; gap: 14px; max-width: 80vw; text-align: center; color: rgba(255, 255, 255, .85); font-size: 15px; }
|
|
2582
|
+
.pv-msg[hidden], .pv-spin[hidden], .pv-msg-dl[hidden] { display: none; }
|
|
2583
|
+
.pv-spin { width: 28px; height: 28px; border-color: rgba(255, 255, 255, .25); border-top-color: #fff; }
|
|
2584
|
+
.pv-msg-dl { background: rgba(255, 255, 255, .14); padding: 0 16px; }
|
|
2585
|
+
@media (prefers-reduced-motion: reduce) { .pdfview.pv-in, .pdfview.pv-out { transition: none; } .pv-spin, .pv-page:not(.pv-drawn)::after { animation: none; } }
|
|
2586
|
+
/* a chip in the box opens its preview (its × and ↻ stay their own buttons) */
|
|
2587
|
+
.att-open { display: flex; align-items: center; gap: inherit; min-width: 0; flex: 1 1 auto; min-height: 44px; padding: 0; margin: 0; border: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer; border-radius: 9px; }
|
|
2588
|
+
.att-open:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|