create-pmos 0.75.0 → 0.76.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/notes.md +15 -10
- 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/pm/components.css +142 -0
- package/workspace/public/pm/note-dock.js +12 -6
- package/workspace/public/pm/view-notes.js +245 -102
- package/workspace/server.js +12 -1
|
@@ -6326,6 +6326,148 @@
|
|
|
6326
6326
|
padding: 12px;
|
|
6327
6327
|
}
|
|
6328
6328
|
|
|
6329
|
+
/* meeting-notes Run 7: the note reads top to bottom (prototype/meeting-notes/simple-note-mockup.html). A bar with the state and
|
|
6330
|
+
one action, the title, the day, the meeting and the initiative on one line, the people, then the sections, each item led by
|
|
6331
|
+
its meeting time. The transcript folds away. The same column in the pop-up and on the full screen. */
|
|
6332
|
+
.nt-wrap:not(.nt-wrap--inline) {
|
|
6333
|
+
max-width: 760px;
|
|
6334
|
+
}
|
|
6335
|
+
.nt-pop__body {
|
|
6336
|
+
padding: 0 16px 16px;
|
|
6337
|
+
}
|
|
6338
|
+
.nt-header {
|
|
6339
|
+
flex-direction: column;
|
|
6340
|
+
align-items: stretch;
|
|
6341
|
+
flex-wrap: nowrap;
|
|
6342
|
+
gap: 8px;
|
|
6343
|
+
}
|
|
6344
|
+
.nt-bar {
|
|
6345
|
+
display: flex;
|
|
6346
|
+
align-items: center;
|
|
6347
|
+
justify-content: space-between;
|
|
6348
|
+
gap: 8px;
|
|
6349
|
+
min-height: 40px;
|
|
6350
|
+
border-bottom: 1px solid var(--border);
|
|
6351
|
+
}
|
|
6352
|
+
.nt-wrap--inline .nt-bar {
|
|
6353
|
+
position: sticky;
|
|
6354
|
+
top: 0;
|
|
6355
|
+
z-index: 1;
|
|
6356
|
+
background: var(--card);
|
|
6357
|
+
}
|
|
6358
|
+
.nt-bar .nt-live {
|
|
6359
|
+
flex: 1 1 auto;
|
|
6360
|
+
min-width: 0;
|
|
6361
|
+
overflow: hidden;
|
|
6362
|
+
white-space: nowrap;
|
|
6363
|
+
text-overflow: ellipsis;
|
|
6364
|
+
}
|
|
6365
|
+
.nt-bar .nt-acts {
|
|
6366
|
+
flex: none;
|
|
6367
|
+
flex-wrap: nowrap;
|
|
6368
|
+
gap: 4px;
|
|
6369
|
+
}
|
|
6370
|
+
.nt-live b {
|
|
6371
|
+
font-family: var(--sans);
|
|
6372
|
+
font-weight: 500;
|
|
6373
|
+
}
|
|
6374
|
+
.nt-when .nt-link + .nt-link::before,
|
|
6375
|
+
.nt-when > span:first-child::after {
|
|
6376
|
+
content: "·";
|
|
6377
|
+
margin-right: 8px;
|
|
6378
|
+
color: var(--muted-foreground);
|
|
6379
|
+
}
|
|
6380
|
+
.nt-when > span:first-child::after {
|
|
6381
|
+
margin: 0 0 0 8px;
|
|
6382
|
+
}
|
|
6383
|
+
.nt-headl {
|
|
6384
|
+
flex: none;
|
|
6385
|
+
flex-direction: column;
|
|
6386
|
+
align-items: stretch;
|
|
6387
|
+
gap: 4px;
|
|
6388
|
+
}
|
|
6389
|
+
.nt-when {
|
|
6390
|
+
display: flex;
|
|
6391
|
+
flex-wrap: wrap;
|
|
6392
|
+
align-items: center;
|
|
6393
|
+
gap: 4px 8px;
|
|
6394
|
+
}
|
|
6395
|
+
.nt-when .nt-link {
|
|
6396
|
+
display: inline-flex;
|
|
6397
|
+
align-items: center;
|
|
6398
|
+
color: var(--foreground);
|
|
6399
|
+
}
|
|
6400
|
+
.nt-people {
|
|
6401
|
+
display: flex;
|
|
6402
|
+
align-items: center;
|
|
6403
|
+
gap: 8px;
|
|
6404
|
+
font-size: 12px;
|
|
6405
|
+
color: var(--muted-foreground);
|
|
6406
|
+
}
|
|
6407
|
+
.nt-avs {
|
|
6408
|
+
display: inline-flex;
|
|
6409
|
+
gap: 2px;
|
|
6410
|
+
}
|
|
6411
|
+
.nt-av {
|
|
6412
|
+
width: 24px;
|
|
6413
|
+
height: 24px;
|
|
6414
|
+
display: inline-grid;
|
|
6415
|
+
place-items: center;
|
|
6416
|
+
font-size: 11px;
|
|
6417
|
+
font-weight: 500;
|
|
6418
|
+
color: var(--foreground);
|
|
6419
|
+
background: var(--muted);
|
|
6420
|
+
}
|
|
6421
|
+
.nt-body2 {
|
|
6422
|
+
display: flex;
|
|
6423
|
+
flex-direction: column;
|
|
6424
|
+
gap: 16px;
|
|
6425
|
+
}
|
|
6426
|
+
.nt-notecol,
|
|
6427
|
+
.nt-wrap--inline .nt-notecol {
|
|
6428
|
+
padding: 0;
|
|
6429
|
+
}
|
|
6430
|
+
.nt-trans,
|
|
6431
|
+
.nt-wrap--inline .nt-trans {
|
|
6432
|
+
padding: 12px 0 0;
|
|
6433
|
+
border-left: 0;
|
|
6434
|
+
border-top: 1px solid var(--border);
|
|
6435
|
+
}
|
|
6436
|
+
.nt-fold {
|
|
6437
|
+
cursor: pointer;
|
|
6438
|
+
}
|
|
6439
|
+
.nt-src {
|
|
6440
|
+
font-weight: 400;
|
|
6441
|
+
letter-spacing: normal;
|
|
6442
|
+
text-transform: none;
|
|
6443
|
+
}
|
|
6444
|
+
.nt-item {
|
|
6445
|
+
display: grid;
|
|
6446
|
+
grid-template-columns: 44px minmax(0, 1fr) auto;
|
|
6447
|
+
align-items: baseline;
|
|
6448
|
+
border-bottom: 0;
|
|
6449
|
+
padding: 2px 0;
|
|
6450
|
+
}
|
|
6451
|
+
.nt-item--plain {
|
|
6452
|
+
grid-template-columns: minmax(0, 1fr) auto;
|
|
6453
|
+
}
|
|
6454
|
+
.nt-addrow {
|
|
6455
|
+
display: grid;
|
|
6456
|
+
grid-template-columns: 44px minmax(0, 1fr);
|
|
6457
|
+
align-items: center;
|
|
6458
|
+
gap: 8px;
|
|
6459
|
+
}
|
|
6460
|
+
.nt-addrow .nt-at {
|
|
6461
|
+
font-variant-numeric: tabular-nums;
|
|
6462
|
+
}
|
|
6463
|
+
.nt-ln__meta .nt-at {
|
|
6464
|
+
font-variant-numeric: tabular-nums;
|
|
6465
|
+
}
|
|
6466
|
+
.nt-spk--typed {
|
|
6467
|
+
color: var(--foreground);
|
|
6468
|
+
font-weight: 500;
|
|
6469
|
+
}
|
|
6470
|
+
|
|
6329
6471
|
/* -- layouts · .lg- the legacy and fixture shells (Run 3, slice 3D) -- */
|
|
6330
6472
|
/* The legacy and fixture cockpit's two columns: the list head (a stack) and the rail's tile column. */
|
|
6331
6473
|
.lg-stack {
|
|
@@ -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
|
}
|