create-pmos 0.75.0 → 0.77.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.
- package/package.json +1 -1
- package/payload/KIT-VERSION +1 -1
- package/payload/planning/evals/eval-calibration.md +1 -1
- package/payload/planning/okrs/health-budgets.md +1 -1
- package/payload/state/discoveries.md +1 -1
- package/workspace/guide/layout.md +10 -11
- package/workspace/guide/notes.md +15 -10
- package/workspace/lib/mobile-nav.js +9 -2
- package/workspace/lib/notes-whisper.js +94 -22
- package/workspace/lib/notes.js +559 -59
- package/workspace/lib/routes-notes.js +276 -46
- package/workspace/package-lock.json +1 -1
- package/workspace/package.json +1 -1
- package/workspace/public/index.html +14 -20
- package/workspace/public/pm/components.css +154 -8
- package/workspace/public/pm/mobile.css +77 -93
- package/workspace/public/pm/mobile.js +6 -2
- package/workspace/public/pm/note-dock.js +12 -6
- package/workspace/public/pm/phone-deck.js +67 -143
- package/workspace/public/pm/view-notes.js +245 -102
- package/workspace/public/vendor/lucide-sprite.js +9 -2
- package/workspace/server.js +12 -1
- package/workspace/third-party/README.md +1 -1
|
@@ -504,14 +504,18 @@
|
|
|
504
504
|
.pmc-card--muted .pmc-card__title {
|
|
505
505
|
color: var(--muted-foreground);
|
|
506
506
|
}
|
|
507
|
-
/* card
|
|
508
|
-
*
|
|
509
|
-
|
|
510
|
-
.pmc-card
|
|
511
|
-
.pmc-card
|
|
512
|
-
.pmc-card
|
|
513
|
-
.pmc-card
|
|
514
|
-
.pmc-card
|
|
507
|
+
/* card on a phone (≤760px), in the Initiatives and Board places only: a row in one vertical list (workspace-phone-scroll-layout). One open target as tall as what
|
|
508
|
+
* it says, with a 64px floor so short and long cards line up; the title and its line under it at reading size. */
|
|
509
|
+
@media (max-width: 760px) {
|
|
510
|
+
.pmc-card:where([data-fr-host="initiatives"] *) { min-height: 64px; padding: 12px 14px; justify-content: center; }
|
|
511
|
+
.pmc-card:where([data-fr-host="initiatives"] *) .pmc-card__title { font-size: 16px; line-height: 1.3; font-weight: 600; }
|
|
512
|
+
.pmc-card:where([data-fr-host="initiatives"] *) .pmc-card__meta { font-size: 14px; line-height: 1.4; }
|
|
513
|
+
.pmc-card:where([data-fr-host="initiatives"] *) .pmc-card__open { gap: 4px; }
|
|
514
|
+
.pmc-card:where([data-fr-host="board"] *) { min-height: 64px; padding: 12px 14px; justify-content: center; }
|
|
515
|
+
.pmc-card:where([data-fr-host="board"] *) .pmc-card__title { font-size: 16px; line-height: 1.3; font-weight: 600; }
|
|
516
|
+
.pmc-card:where([data-fr-host="board"] *) .pmc-card__meta { font-size: 14px; line-height: 1.4; }
|
|
517
|
+
.pmc-card:where([data-fr-host="board"] *) .pmc-card__open { gap: 4px; }
|
|
518
|
+
}
|
|
515
519
|
.pmc-card:focus-visible,
|
|
516
520
|
.pmc-card:has(.pmc-card__open:focus-visible) {
|
|
517
521
|
outline: 2px solid color-mix(in oklab, var(--ring) 50%, var(--foreground));
|
|
@@ -6326,6 +6330,148 @@
|
|
|
6326
6330
|
padding: 12px;
|
|
6327
6331
|
}
|
|
6328
6332
|
|
|
6333
|
+
/* meeting-notes Run 7: the note reads top to bottom (prototype/meeting-notes/simple-note-mockup.html). A bar with the state and
|
|
6334
|
+
one action, the title, the day, the meeting and the initiative on one line, the people, then the sections, each item led by
|
|
6335
|
+
its meeting time. The transcript folds away. The same column in the pop-up and on the full screen. */
|
|
6336
|
+
.nt-wrap:not(.nt-wrap--inline) {
|
|
6337
|
+
max-width: 760px;
|
|
6338
|
+
}
|
|
6339
|
+
.nt-pop__body {
|
|
6340
|
+
padding: 0 16px 16px;
|
|
6341
|
+
}
|
|
6342
|
+
.nt-header {
|
|
6343
|
+
flex-direction: column;
|
|
6344
|
+
align-items: stretch;
|
|
6345
|
+
flex-wrap: nowrap;
|
|
6346
|
+
gap: 8px;
|
|
6347
|
+
}
|
|
6348
|
+
.nt-bar {
|
|
6349
|
+
display: flex;
|
|
6350
|
+
align-items: center;
|
|
6351
|
+
justify-content: space-between;
|
|
6352
|
+
gap: 8px;
|
|
6353
|
+
min-height: 40px;
|
|
6354
|
+
border-bottom: 1px solid var(--border);
|
|
6355
|
+
}
|
|
6356
|
+
.nt-wrap--inline .nt-bar {
|
|
6357
|
+
position: sticky;
|
|
6358
|
+
top: 0;
|
|
6359
|
+
z-index: 1;
|
|
6360
|
+
background: var(--card);
|
|
6361
|
+
}
|
|
6362
|
+
.nt-bar .nt-live {
|
|
6363
|
+
flex: 1 1 auto;
|
|
6364
|
+
min-width: 0;
|
|
6365
|
+
overflow: hidden;
|
|
6366
|
+
white-space: nowrap;
|
|
6367
|
+
text-overflow: ellipsis;
|
|
6368
|
+
}
|
|
6369
|
+
.nt-bar .nt-acts {
|
|
6370
|
+
flex: none;
|
|
6371
|
+
flex-wrap: nowrap;
|
|
6372
|
+
gap: 4px;
|
|
6373
|
+
}
|
|
6374
|
+
.nt-live b {
|
|
6375
|
+
font-family: var(--sans);
|
|
6376
|
+
font-weight: 500;
|
|
6377
|
+
}
|
|
6378
|
+
.nt-when .nt-link + .nt-link::before,
|
|
6379
|
+
.nt-when > span:first-child::after {
|
|
6380
|
+
content: "·";
|
|
6381
|
+
margin-right: 8px;
|
|
6382
|
+
color: var(--muted-foreground);
|
|
6383
|
+
}
|
|
6384
|
+
.nt-when > span:first-child::after {
|
|
6385
|
+
margin: 0 0 0 8px;
|
|
6386
|
+
}
|
|
6387
|
+
.nt-headl {
|
|
6388
|
+
flex: none;
|
|
6389
|
+
flex-direction: column;
|
|
6390
|
+
align-items: stretch;
|
|
6391
|
+
gap: 4px;
|
|
6392
|
+
}
|
|
6393
|
+
.nt-when {
|
|
6394
|
+
display: flex;
|
|
6395
|
+
flex-wrap: wrap;
|
|
6396
|
+
align-items: center;
|
|
6397
|
+
gap: 4px 8px;
|
|
6398
|
+
}
|
|
6399
|
+
.nt-when .nt-link {
|
|
6400
|
+
display: inline-flex;
|
|
6401
|
+
align-items: center;
|
|
6402
|
+
color: var(--foreground);
|
|
6403
|
+
}
|
|
6404
|
+
.nt-people {
|
|
6405
|
+
display: flex;
|
|
6406
|
+
align-items: center;
|
|
6407
|
+
gap: 8px;
|
|
6408
|
+
font-size: 12px;
|
|
6409
|
+
color: var(--muted-foreground);
|
|
6410
|
+
}
|
|
6411
|
+
.nt-avs {
|
|
6412
|
+
display: inline-flex;
|
|
6413
|
+
gap: 2px;
|
|
6414
|
+
}
|
|
6415
|
+
.nt-av {
|
|
6416
|
+
width: 24px;
|
|
6417
|
+
height: 24px;
|
|
6418
|
+
display: inline-grid;
|
|
6419
|
+
place-items: center;
|
|
6420
|
+
font-size: 11px;
|
|
6421
|
+
font-weight: 500;
|
|
6422
|
+
color: var(--foreground);
|
|
6423
|
+
background: var(--muted);
|
|
6424
|
+
}
|
|
6425
|
+
.nt-body2 {
|
|
6426
|
+
display: flex;
|
|
6427
|
+
flex-direction: column;
|
|
6428
|
+
gap: 16px;
|
|
6429
|
+
}
|
|
6430
|
+
.nt-notecol,
|
|
6431
|
+
.nt-wrap--inline .nt-notecol {
|
|
6432
|
+
padding: 0;
|
|
6433
|
+
}
|
|
6434
|
+
.nt-trans,
|
|
6435
|
+
.nt-wrap--inline .nt-trans {
|
|
6436
|
+
padding: 12px 0 0;
|
|
6437
|
+
border-left: 0;
|
|
6438
|
+
border-top: 1px solid var(--border);
|
|
6439
|
+
}
|
|
6440
|
+
.nt-fold {
|
|
6441
|
+
cursor: pointer;
|
|
6442
|
+
}
|
|
6443
|
+
.nt-src {
|
|
6444
|
+
font-weight: 400;
|
|
6445
|
+
letter-spacing: normal;
|
|
6446
|
+
text-transform: none;
|
|
6447
|
+
}
|
|
6448
|
+
.nt-item {
|
|
6449
|
+
display: grid;
|
|
6450
|
+
grid-template-columns: 44px minmax(0, 1fr) auto;
|
|
6451
|
+
align-items: baseline;
|
|
6452
|
+
border-bottom: 0;
|
|
6453
|
+
padding: 2px 0;
|
|
6454
|
+
}
|
|
6455
|
+
.nt-item--plain {
|
|
6456
|
+
grid-template-columns: minmax(0, 1fr) auto;
|
|
6457
|
+
}
|
|
6458
|
+
.nt-addrow {
|
|
6459
|
+
display: grid;
|
|
6460
|
+
grid-template-columns: 44px minmax(0, 1fr);
|
|
6461
|
+
align-items: center;
|
|
6462
|
+
gap: 8px;
|
|
6463
|
+
}
|
|
6464
|
+
.nt-addrow .nt-at {
|
|
6465
|
+
font-variant-numeric: tabular-nums;
|
|
6466
|
+
}
|
|
6467
|
+
.nt-ln__meta .nt-at {
|
|
6468
|
+
font-variant-numeric: tabular-nums;
|
|
6469
|
+
}
|
|
6470
|
+
.nt-spk--typed {
|
|
6471
|
+
color: var(--foreground);
|
|
6472
|
+
font-weight: 500;
|
|
6473
|
+
}
|
|
6474
|
+
|
|
6329
6475
|
/* -- layouts · .lg- the legacy and fixture shells (Run 3, slice 3D) -- */
|
|
6330
6476
|
/* The legacy and fixture cockpit's two columns: the list head (a stack) and the rail's tile column. */
|
|
6331
6477
|
.lg-stack {
|
|
@@ -202,43 +202,57 @@
|
|
|
202
202
|
}
|
|
203
203
|
.ctrlbar .lbl { font-size: 11px; letter-spacing: .04em; }
|
|
204
204
|
|
|
205
|
-
/*
|
|
206
|
-
|
|
205
|
+
/* Five tabs, one per column: an icon over a short word, the bar most phone apps draw (workspace-phone-scroll-layout).
|
|
206
|
+
* The tab on screen is drawn in the foreground ink, with a heavier icon stroke and a 2px rule along its top edge. The
|
|
207
|
+
* Agenda tab carries the count of what needs the PM beside its icon. */
|
|
208
|
+
.mobnav { display: grid; grid-template-columns: repeat(5, 1fr); min-width: 0; }
|
|
207
209
|
.mobnav-b {
|
|
210
|
+
position: relative;
|
|
208
211
|
display: flex;
|
|
209
212
|
flex-direction: column;
|
|
210
213
|
align-items: center;
|
|
211
214
|
justify-content: center;
|
|
212
|
-
gap:
|
|
215
|
+
gap: 4px;
|
|
213
216
|
min-width: 0;
|
|
214
|
-
min-height:
|
|
215
|
-
padding:
|
|
217
|
+
min-height: 60px;
|
|
218
|
+
padding: 6px 2px 4px;
|
|
216
219
|
color: var(--muted-foreground);
|
|
220
|
+
font-family: var(--sans);
|
|
217
221
|
}
|
|
218
|
-
.mobnav-b .
|
|
219
|
-
.mobnav-b .l { font-size:
|
|
222
|
+
.mobnav-b .mobnav-i { width: 22px; height: 22px; stroke-width: 1.75; }
|
|
223
|
+
.mobnav-b .l { font-size: 11px; line-height: 1; font-weight: 500; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
220
224
|
.mobnav-b[aria-current="page"] { color: var(--foreground); }
|
|
221
|
-
|
|
222
|
-
.mobnav-b {
|
|
223
|
-
.mobnav-
|
|
224
|
-
|
|
225
|
-
|
|
225
|
+
.mobnav-b[aria-current="page"] .mobnav-i { stroke-width: 2.25; }
|
|
226
|
+
.mobnav-b[aria-current="page"]::before { content: ""; position: absolute; top: 0; left: 25%; right: 25%; height: 2px; background: var(--foreground); }
|
|
227
|
+
.mobnav-n {
|
|
228
|
+
position: absolute;
|
|
229
|
+
top: 6px;
|
|
230
|
+
left: calc(50% + 8px);
|
|
231
|
+
min-width: 18px;
|
|
232
|
+
padding: 2px 4px;
|
|
233
|
+
font-family: var(--mono);
|
|
234
|
+
font-size: 11px;
|
|
235
|
+
line-height: 1;
|
|
236
|
+
text-align: center;
|
|
237
|
+
background: var(--destructive);
|
|
238
|
+
color: var(--background);
|
|
239
|
+
}
|
|
226
240
|
|
|
227
241
|
/* ── one job per screen, one card at a time ────────────────────────────────────────────────────
|
|
228
|
-
* A phone is not a small desktop. At a tab's root the tab's
|
|
229
|
-
* (pm/phone-deck.js)
|
|
230
|
-
* work are not drawn. Nothing below removes a capability: each hidden control is a desktop one, or the
|
|
242
|
+
* A phone is not a small desktop. At a tab's root the tab's list runs top to bottom and only the list scrolls; the
|
|
243
|
+
* head above it (pm/phone-deck.js) says how many things it holds and switches the tab's second view. The controls that
|
|
244
|
+
* serve desk work are not drawn. Nothing below removes a capability: each hidden control is a desktop one, or the head's
|
|
231
245
|
* view switch, the bar's Repository menu or ⌘K (the bar's search) reaches the same act. The nodes stay in the DOM,
|
|
232
246
|
* so the renderers are the desktop's, unchanged (see pm/mobile.js, "ONE renderer, two shells").
|
|
233
247
|
*
|
|
234
|
-
* Today the Today cards. The count is in the
|
|
235
|
-
* All repositories).
|
|
248
|
+
* Today the Today cards. The count is in the head; the scope is the bar's Repository menu (it has
|
|
249
|
+
* All repositories). My day, the head's second view, is the day section: goals, calendar, jobs.
|
|
236
250
|
* Initiatives the Roadmap's cards. No title, view switch, New initiative, count line, hint or drag grips: the
|
|
237
|
-
*
|
|
251
|
+
* head's All is the List, ⌘K has New initiative, and a card's ⋯ moves it.
|
|
238
252
|
* Board the picked initiative's cards in the column on screen: Active or Mine, the initiative picker and
|
|
239
253
|
* the column switch stay. No count, and not a second "no item" note above the column's own.
|
|
240
254
|
* Reports read a report, or draft one: no title (the tab names it) and no schedule set-up.
|
|
241
|
-
* Docs the copies that need you, one
|
|
255
|
+
* Docs the copies that need you, one row each. All, the head's second view, lists every copy and
|
|
242
256
|
* has the search.
|
|
243
257
|
* An initiative (the sheet) act on its next step: the stepper and the waiting line lead. The Breakdown tab shows
|
|
244
258
|
* the Tree only (the Board tab is the board) and not the starter list, which is authoring. */
|
|
@@ -261,95 +275,65 @@
|
|
|
261
275
|
[data-in-sheet] .bd-head > [data-bd-view],
|
|
262
276
|
[data-in-sheet] [data-bd-starters] { display: none !important; }
|
|
263
277
|
|
|
264
|
-
/* ── the
|
|
265
|
-
|
|
278
|
+
/* ── the list head (pm/phone-deck.js) ───────────────────────────────────────────────────────────
|
|
279
|
+
* One line above the list: how many things it holds, then the tab's two views as a segmented switch, each button an
|
|
280
|
+
* icon and a word. It sits in the phone's top block, so it stays put while the list scrolls under it. */
|
|
266
281
|
.mob-deck {
|
|
267
282
|
display: flex;
|
|
268
283
|
align-items: center;
|
|
269
284
|
justify-content: space-between;
|
|
270
|
-
gap:
|
|
271
|
-
min-height:
|
|
272
|
-
padding: 0
|
|
285
|
+
gap: 12px;
|
|
286
|
+
min-height: 52px;
|
|
287
|
+
padding: 0 12px 0 16px;
|
|
273
288
|
background: var(--background);
|
|
274
289
|
border-bottom: 1px solid var(--border);
|
|
275
|
-
font-family: var(--
|
|
276
|
-
font-size:
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
color: var(--muted-foreground);
|
|
290
|
+
font-family: var(--sans);
|
|
291
|
+
font-size: 14px;
|
|
292
|
+
font-weight: 600;
|
|
293
|
+
color: var(--foreground);
|
|
280
294
|
}
|
|
281
295
|
.mob-deck__where { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
282
|
-
.mob-deck__views { display: inline-flex; flex: none;
|
|
296
|
+
.mob-deck__views { display: inline-flex; flex: none; gap: 2px; padding: 2px; background: var(--muted); }
|
|
283
297
|
.mob-deck__view {
|
|
298
|
+
display: inline-flex;
|
|
299
|
+
align-items: center;
|
|
300
|
+
gap: 6px;
|
|
284
301
|
min-width: 44px;
|
|
285
302
|
min-height: 44px;
|
|
286
303
|
padding: 0 12px;
|
|
287
|
-
font:
|
|
288
|
-
|
|
289
|
-
|
|
304
|
+
font-family: var(--sans);
|
|
305
|
+
font-size: 14px;
|
|
306
|
+
font-weight: 500;
|
|
290
307
|
color: var(--muted-foreground);
|
|
291
308
|
}
|
|
292
|
-
.mob-deck__view
|
|
293
|
-
|
|
294
|
-
.mob-pager { display: grid; grid-template-columns: 48px minmax(0, 1fr) 48px; align-items: center; border-bottom: 1px solid var(--border); }
|
|
295
|
-
.mob-pager__b { display: grid; place-items: center; min-width: 48px; min-height: 44px; color: var(--foreground); }
|
|
296
|
-
.mob-pager__b:disabled { opacity: .3; }
|
|
297
|
-
.mob-pager__track { height: 3px; background: var(--border); }
|
|
298
|
-
.mob-pager__fill { display: block; height: 100%; width: var(--fr-deck-fill, 0); background: var(--foreground); transition: width .2s ease-out; }
|
|
309
|
+
.mob-deck__view .mob-deck__i { width: 16px; height: 16px; }
|
|
310
|
+
.mob-deck__view[aria-pressed="true"] { background: var(--card); color: var(--foreground); }
|
|
299
311
|
|
|
300
|
-
/*
|
|
301
|
-
*
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
body[data-ph-view="cards"] .ph-deck .rp-docs-group,
|
|
320
|
-
body[data-ph-view="cards"] .ph-deck .rp-docs-group > [role="list"] { display: contents !important; }
|
|
321
|
-
body[data-ph-view="cards"] .ph-deck .in-col__head,
|
|
322
|
-
body[data-ph-view="cards"] .ph-deck .in-col__empty,
|
|
323
|
-
body[data-ph-view="cards"] .ph-deck .in-col > :not(.in-list),
|
|
324
|
-
body[data-ph-view="cards"] .ph-deck .in-list--dormant { display: none !important; }
|
|
325
|
-
body[data-ph-view="cards"] .ph-deck > .rp-section__empty { flex: 0 0 100%; }
|
|
326
|
-
body[data-ph-view="cards"] .ph-card {
|
|
327
|
-
flex: 0 0 100% !important;
|
|
328
|
-
width: 100% !important;
|
|
329
|
-
max-width: none !important;
|
|
330
|
-
height: var(--fr-deck-h, 60vh);
|
|
331
|
-
margin: 0 !important;
|
|
332
|
-
overflow-y: auto;
|
|
333
|
-
scroll-snap-align: start;
|
|
334
|
-
scroll-snap-stop: always;
|
|
335
|
-
display: flex !important;
|
|
336
|
-
flex-direction: column;
|
|
337
|
-
background: var(--card);
|
|
338
|
-
border: 1px solid var(--border);
|
|
312
|
+
/* ── the list: one scroller, rows sized to what they hold ───────────────────────────────────────
|
|
313
|
+
* The place is the only thing that scrolls. It does not hand a drag at its top or bottom to the page, so the bars never
|
|
314
|
+
* move and nothing empty is dragged along. Rows take the height of what they say, with one floor, so a short row and a
|
|
315
|
+
* long one line up as a column. */
|
|
316
|
+
[data-fr="main"] > .fr-dest { overscroll-behavior: contain; -webkit-overflow-scrolling: touch; }
|
|
317
|
+
html, body { overscroll-behavior: none; }
|
|
318
|
+
[data-dest="today"] .td-board { gap: 8px; padding: 12px; }
|
|
319
|
+
[data-dest="today"] .td-card { min-height: 64px; padding: 14px; gap: 10px; }
|
|
320
|
+
[data-dest="today"] .td-card--host { padding: 0; }
|
|
321
|
+
[data-dest="today"] .td-card__top { display: grid; grid-template-columns: minmax(0, 1fr); gap: 10px; }
|
|
322
|
+
[data-dest="today"] .td-card__cause { font-size: 16px; line-height: 1.3; font-weight: 600; align-items: flex-start; }
|
|
323
|
+
[data-dest="today"] .td-card__evidence {
|
|
324
|
+
padding-left: 0;
|
|
325
|
+
font-size: 14px;
|
|
326
|
+
line-height: 1.4;
|
|
327
|
+
display: -webkit-box;
|
|
328
|
+
-webkit-line-clamp: 2;
|
|
329
|
+
-webkit-box-orient: vertical;
|
|
330
|
+
overflow: hidden;
|
|
339
331
|
}
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
body[data-ph-view="cards"] .ph-card .td-card__evidence { white-space: normal; overflow: visible; font-size: 14px; line-height: 1.45; }
|
|
346
|
-
body[data-ph-view="cards"] .ph-card .td-card__acts { display: grid !important; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; width: 100%; margin: 0; }
|
|
347
|
-
body[data-ph-view="cards"] .ph-card .td-card__acts > :first-child { width: 100%; }
|
|
348
|
-
body[data-ph-view="cards"] .ph-card .td-card__acts > * { min-height: 48px; justify-content: center; }
|
|
349
|
-
body[data-ph-view="cards"] .ph-card.td-card--prep .td-card__acts { grid-template-columns: minmax(0, 1fr); }
|
|
350
|
-
/* An initiative or a Board item: a .pmc-card primitive, so its deck size lives in components.css (.pmc-card.ph-card). */
|
|
351
|
-
/* A copy that differs: the row's sentence and its one button. */
|
|
352
|
-
body[data-ph-view="cards"] .ph-card.rp-docs-row { padding: 6px 4px; }
|
|
332
|
+
[data-dest="today"] .td-card__acts { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; width: 100%; margin: 0; }
|
|
333
|
+
[data-dest="today"] .td-card__acts > * { min-height: 44px; justify-content: center; }
|
|
334
|
+
[data-dest="today"] .td-card--prep .td-card__acts { grid-template-columns: minmax(0, 1fr); }
|
|
335
|
+
/* An initiative or a Board item is a .pmc-card primitive: its phone size lives in components.css's primitives section. */
|
|
336
|
+
[data-dest="docs"] .rp-docs-row { min-height: 56px; }
|
|
353
337
|
|
|
354
338
|
/* ── the terminal takes the screen ────────────────────────────────────────────────────────────
|
|
355
339
|
* The PM's word: entering a terminal switches the whole screen to it, because it is mostly output. The tabs are not
|
|
@@ -363,7 +347,7 @@
|
|
|
363
347
|
* the thing this workspace refuses to ship. */
|
|
364
348
|
.mob[hidden], .mobmenu[hidden], .mob-back[hidden], .mob-brand[hidden] { display: none !important; }
|
|
365
349
|
.mob-repo[hidden], .mob-set[hidden], .mob-sync[hidden], .mob-theme[hidden], .mobnav-n[hidden] { display: none !important; }
|
|
366
|
-
.mob-deck[hidden], .mob-
|
|
350
|
+
.mob-deck[hidden], .mob-deck__views[hidden] { display: none !important; }
|
|
367
351
|
|
|
368
352
|
/* ── a touch screen: the visible height, no page bounce, no zoom on focus ─────────────────────
|
|
369
353
|
* pm/mobile.js sets `pm-vv` and `--fr-vvh` (the visual viewport's height) on a touch screen. The
|
|
@@ -387,7 +387,9 @@ export function applyMobile() {
|
|
|
387
387
|
}
|
|
388
388
|
|
|
389
389
|
const buttons = menu ? menu.querySelectorAll('#mobNav [data-dest]') : [];
|
|
390
|
-
|
|
390
|
+
// Reports has no tab of its own: it is the Board tab's second view, so Board stays lit (lib/mobile-nav.js TAB_OF).
|
|
391
|
+
const lit = typeof NAV.tabOf === 'function' ? NAV.tabOf(nav.dest) : nav.dest;
|
|
392
|
+
for (const b of buttons) b.setAttribute('aria-current', b.dataset.dest === lit ? 'page' : 'false');
|
|
391
393
|
|
|
392
394
|
if (s.kind !== 'terminal' && s.kind !== 'agent' && ctrlArmed) setCtrlArmed(false);
|
|
393
395
|
|
|
@@ -544,8 +546,9 @@ export function mountMobile(context) {
|
|
|
544
546
|
document.addEventListener('click', onChromeClick);
|
|
545
547
|
|
|
546
548
|
if (window.visualViewport) {
|
|
549
|
+
// resize only. A visualViewport `scroll` fires on every pan of the page, and answering it with scrollTo(0, 0) and a
|
|
550
|
+
// refit undid the PM's own scroll in one jump (workspace-phone-scroll-layout). The height changes only on a resize.
|
|
547
551
|
window.visualViewport.addEventListener('resize', fitViewport);
|
|
548
|
-
window.visualViewport.addEventListener('scroll', fitViewport);
|
|
549
552
|
}
|
|
550
553
|
if (TOUCH.addEventListener) TOUCH.addEventListener('change', fitViewport);
|
|
551
554
|
window.addEventListener('orientationchange', () => setTimeout(() => { fitViewport(); refit(); }, 250));
|
|
@@ -567,6 +570,7 @@ export function mountMobile(context) {
|
|
|
567
570
|
|
|
568
571
|
mountDeck({
|
|
569
572
|
rerender: () => setState({}),
|
|
573
|
+
go: (dest) => setDest(dest),
|
|
570
574
|
apply: () => { if (isMobile() && nav) applyDeck(frameOn(), NAV.current(nav)); },
|
|
571
575
|
place: () => ctx.bodyGrid.querySelector('[data-fr="main"]'),
|
|
572
576
|
});
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* mountDock() → draws the dock on every render (pm/app.js boot)
|
|
12
12
|
* takeNotes(e, opts, btn) → makes a note linked to the event, starts listening, and keeps it minimized
|
|
13
13
|
* openDock(id) → shows a note in the pop-up
|
|
14
|
-
* minimize() · activeId()
|
|
14
|
+
* minimize() · activeId() · forget(id)
|
|
15
15
|
*/
|
|
16
16
|
import { el } from './dom.js';
|
|
17
17
|
import { button, iconButton, layer, toast, ensureComponentsCss } from './primitives.js';
|
|
@@ -74,6 +74,13 @@ export async function openDock(id) {
|
|
|
74
74
|
setState({});
|
|
75
75
|
requestAnimationFrame(() => { const t = host && host.querySelector('[data-nt-body]'); if (t) t.focus(); });
|
|
76
76
|
}
|
|
77
|
+
/** A note was deleted: when it is the one in the dock, the dock lets it go. */
|
|
78
|
+
export function forget(id) {
|
|
79
|
+
if (!active || active.id !== id) return;
|
|
80
|
+
active = null; open = false; write();
|
|
81
|
+
if (V) V.setPopped(null);
|
|
82
|
+
setState({});
|
|
83
|
+
}
|
|
77
84
|
function close() {
|
|
78
85
|
if (liveId() === (active && active.id)) return;
|
|
79
86
|
active = null; open = false; write();
|
|
@@ -127,11 +134,10 @@ function draw() {
|
|
|
127
134
|
live ? null : iconButton({ icon: 'x', ariaLabel: 'Put the note away', onClick: close, attrs: { 'data-nt-dock-close': '' } })));
|
|
128
135
|
return;
|
|
129
136
|
}
|
|
137
|
+
// the note draws its own bar (status, Stop, Minimize and the ⋯ menu): the pop-up adds no second head (Run 7)
|
|
130
138
|
const body = el('div', { class: 'nt-pop__body' });
|
|
131
|
-
const pop = el('section', { class: 'nt-pop', role: 'dialog', 'aria-label': 'Meeting note', 'data-nt-pop': active.id },
|
|
132
|
-
el('div', { class: 'nt-pop__head' }, el('span', { class: 'nt-sec__h' }, live ? 'Taking notes' : 'Meeting note'),
|
|
133
|
-
button({ label: 'Minimize', variant: 'ghost', size: 'sm', onClick: minimize, attrs: { 'data-nt-minimize': '' } })),
|
|
134
|
-
body);
|
|
139
|
+
const pop = el('section', { class: 'nt-pop', role: 'dialog', 'aria-label': 'Meeting note', 'data-nt-pop': active.id }, body);
|
|
135
140
|
host.replaceChildren(pop);
|
|
136
|
-
if (!v.renderInline(body, viewCtx, active.id)) body.appendChild(el('p', { class: 'nt-hint' }, 'Another note is being taken.')
|
|
141
|
+
if (!v.renderInline(body, viewCtx, active.id, { onMinimize: minimize })) body.appendChild(el('p', { class: 'nt-hint' }, 'Another note is being taken.'),
|
|
142
|
+
button({ label: 'Minimize', variant: 'ghost', size: 'sm', onClick: minimize, attrs: { 'data-nt-minimize': '' } }));
|
|
137
143
|
}
|