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.
@@ -504,14 +504,18 @@
504
504
  .pmc-card--muted .pmc-card__title {
505
505
  color: var(--muted-foreground);
506
506
  }
507
- /* card in a phone deck (pm/phone-deck.js adds .ph-card only while a phone shows its Cards view): one tall target that
508
- * opens it, its title at reading size */
509
- .pmc-card.ph-card { padding: 0; }
510
- .pmc-card.ph-card .pmc-card__top { flex: 1; align-items: stretch; min-height: 0; }
511
- .pmc-card.ph-card .pmc-card__open { display: flex; flex-direction: column; justify-content: flex-start; gap: 14px; padding: 22px 18px; min-width: 0; text-align: left; }
512
- .pmc-card.ph-card .pmc-card__title { font-size: 20px; line-height: 1.25; font-weight: 600; white-space: normal; overflow: visible; display: block; }
513
- .pmc-card.ph-card .pmc-card__meta { flex-wrap: wrap; white-space: normal; font-size: 14px; line-height: 1.5; }
514
- .pmc-card.ph-card .pmc-card__trail { align-self: flex-start; padding: 8px 6px 0 0; }
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
- /* Six destinations, one per column, 64px tall — the prototype's bottom nav, with Docs (the desktop bar's order). */
206
- .mobnav { display: grid; grid-template-columns: repeat(6, 1fr); min-width: 0; }
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: 3px;
215
+ gap: 4px;
213
216
  min-width: 0;
214
- min-height: 64px;
215
- padding: 0 2px;
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 .g { font-size: 17px; line-height: 1; }
219
- .mobnav-b .l { font-size: 10px; line-height: 1; }
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
- /* The tabs are words (the frame's five tabs); the Today tab carries the count of what needs the PM. */
222
- .mobnav-b { font-family: var(--sans); }
223
- .mobnav-b .l { font-size: 12px; max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
224
- .mobnav-b[aria-current="page"] .l { text-decoration: underline; text-underline-offset: 4px; }
225
- .mobnav-n { font-family: var(--mono); font-size: 11px; line-height: 1; }
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 cards are a deck, one card on the screen at a time
229
- * (pm/phone-deck.js), and the deck head above them says which card of how many it is. The controls that serve desk
230
- * work are not drawn. Nothing below removes a capability: each hidden control is a desktop one, or the deck head's
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 deck head; the scope is the bar's Repository menu (it has
235
- * All repositories). Day, the deck head's second view, is the day section: goals, calendar, jobs.
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
- * deck head's All is the List, ⌘K has New initiative, and a card's ⋯ moves it.
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 card each. All, the deck head's second view, lists every copy and
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 deck head and the pager (pm/phone-deck.js) ─────────────────────────────────────────── */
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: 10px;
271
- min-height: 48px;
272
- padding: 0 14px;
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(--mono);
276
- font-size: 11px;
277
- letter-spacing: .06em;
278
- text-transform: uppercase;
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; border: 1px solid var(--border); }
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: inherit;
288
- letter-spacing: inherit;
289
- text-transform: inherit;
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[aria-pressed="true"] { background: var(--foreground); color: var(--background); }
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
- /* The deck: the tab's own list, laid side by side, one card per screen width, snapping to each. The card's height is
301
- * the screen between the deck head and the pager (--fr-deck-h, measured by pm/phone-deck.js). */
302
- body[data-ph-view="cards"] .ph-deck {
303
- display: flex !important;
304
- flex-direction: row !important;
305
- flex-wrap: nowrap !important;
306
- gap: 0 !important;
307
- margin: 0 !important;
308
- padding: 0 !important;
309
- overflow-x: auto;
310
- overflow-y: hidden;
311
- scroll-snap-type: x mandatory;
312
- overscroll-behavior-x: contain;
313
- scrollbar-width: none;
314
- }
315
- body[data-ph-view="cards"] .ph-deck::-webkit-scrollbar { display: none; }
316
- /* The Roadmap's three columns and the Docs' groups hand their cards to the one deck. */
317
- body[data-ph-view="cards"] .ph-deck .in-col,
318
- body[data-ph-view="cards"] .ph-deck .in-list,
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
- /* A Today card: the cause leads, the evidence wraps under it, the acts sit at the bottom at full width. */
341
- body[data-ph-view="cards"] .ph-card.td-card { padding: 20px 18px; }
342
- body[data-ph-view="cards"] .ph-card .td-card__top { flex: 1; display: flex; flex-direction: column; justify-content: space-between; gap: 18px; }
343
- body[data-ph-view="cards"] .ph-card .td-card__text { display: grid; gap: 12px; align-content: start; }
344
- body[data-ph-view="cards"] .ph-card .td-card__cause { font-size: 20px; line-height: 1.3; font-weight: 600; }
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-pager[hidden], .mob-deck__views[hidden] { display: none !important; }
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
- for (const b of buttons) b.setAttribute('aria-current', b.dataset.dest === nav.dest ? 'page' : 'false');
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
  }