@profpowell/vb-project-planning 0.2.1 → 0.2.3

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.
Files changed (66) hide show
  1. package/README.md +10 -5
  2. package/dist/vb-project-planning.css +69 -3
  3. package/dist/vb-project-planning.js +3191 -2544
  4. package/dist/vb-project-planning.min.css +1 -1
  5. package/dist/vb-project-planning.min.js +221 -197
  6. package/package.json +7 -4
  7. package/src/lib/board-surface.js +158 -0
  8. package/src/lib/bundle-registry.js +2 -75
  9. package/src/lib/dates.js +125 -0
  10. package/src/lib/escape.js +34 -0
  11. package/src/lib/hash.js +16 -0
  12. package/src/lib/portrait-url.js +3 -29
  13. package/src/lib/src-loader.js +78 -0
  14. package/src/lib/vb-view-transition.js +7 -1
  15. package/src/utils/copy-init.js +56 -17
  16. package/src/web-components/_ux-base.js +409 -24
  17. package/src/web-components/adr-wc/README.md +18 -16
  18. package/src/web-components/adr-wc/api.json +7 -5
  19. package/src/web-components/adr-wc/logic.js +50 -136
  20. package/src/web-components/burndown-chart/api.json +8 -6
  21. package/src/web-components/burndown-chart/logic.js +75 -39
  22. package/src/web-components/empathy-map/api.json +13 -13
  23. package/src/web-components/empathy-map/logic.js +161 -168
  24. package/src/web-components/empathy-map/static.html +3 -3
  25. package/src/web-components/empathy-map/styles.js +1 -0
  26. package/src/web-components/gantt-chart/README.md +12 -6
  27. package/src/web-components/gantt-chart/api.json +23 -7
  28. package/src/web-components/gantt-chart/logic.js +456 -431
  29. package/src/web-components/gantt-chart/styles.css +14 -1
  30. package/src/web-components/impact-effort/api.json +9 -7
  31. package/src/web-components/impact-effort/logic.js +238 -209
  32. package/src/web-components/impact-effort/static.html +12 -4
  33. package/src/web-components/iron-triangle/_capacity.js +0 -18
  34. package/src/web-components/kanban-board/api.json +8 -6
  35. package/src/web-components/kanban-board/logic.js +289 -333
  36. package/src/web-components/product-roadmap/api.json +14 -13
  37. package/src/web-components/product-roadmap/logic.js +393 -246
  38. package/src/web-components/product-roadmap/styles.css +40 -0
  39. package/src/web-components/quadrant-grid/api.json +9 -4
  40. package/src/web-components/quadrant-grid/logic.js +80 -12
  41. package/src/web-components/quadrant-grid/styles.css +7 -0
  42. package/src/web-components/quality-target/_quality-utils.js +2 -46
  43. package/src/web-components/review-surface/README.md +9 -5
  44. package/src/web-components/review-surface/api.json +10 -8
  45. package/src/web-components/review-surface/logic.js +349 -218
  46. package/src/web-components/risk-register/api.json +1 -6
  47. package/src/web-components/risk-register/logic.js +71 -24
  48. package/src/web-components/risk-register/styles.css +9 -1
  49. package/src/web-components/story-map/api.json +8 -6
  50. package/src/web-components/story-map/logic.js +280 -281
  51. package/src/web-components/story-map/static.html +15 -5
  52. package/src/web-components/traceability-matrix/api.json +10 -3
  53. package/src/web-components/traceability-matrix/logic.js +112 -63
  54. package/src/web-components/traceability-matrix/styles.css +22 -1
  55. package/src/web-components/user-journey/api.json +25 -24
  56. package/src/web-components/user-journey/logic.js +76 -127
  57. package/src/web-components/user-journey/static.html +2 -2
  58. package/src/web-components/user-persona/api.json +15 -14
  59. package/src/web-components/user-persona/logic.js +71 -117
  60. package/src/web-components/user-persona/styles.js +1 -0
  61. package/src/web-components/user-story/api.json +13 -11
  62. package/src/web-components/user-story/logic.js +164 -195
  63. package/src/web-components/user-story/styles.js +28 -1
  64. package/src/web-components/work-item/README.md +3 -3
  65. package/src/web-components/work-item/api.json +13 -11
  66. package/src/web-components/work-item/logic.js +58 -154
package/README.md CHANGED
@@ -62,12 +62,14 @@ import '@profpowell/vb-project-planning/kanban-board';
62
62
  <user-persona name="Fred" role="Engineer">…</user-persona>
63
63
  ```
64
64
 
65
- ## Runtime peers: `<drag-surface>` and `<data-table>`
65
+ ## Runtime peers from Vanilla Breeze
66
66
 
67
- Two Vanilla Breeze core elements are used as runtime peers. Load VB on the page (the full bundle, or the per-component files under `dist/cdn/components/`) and they light up; without them the components still render, only the composed behaviour is unavailable.
67
+ Four Vanilla Breeze elements are used as runtime peers. Load VB on the page (the full bundle, or the per-component files under `dist/cdn/components/`) and they light up; without them the components still render, only the composed behaviour is unavailable.
68
68
 
69
69
  - `<drag-surface>` — the drag-to-reorder components (`kanban-board`, `quadrant-grid`, `impact-effort`, `story-map`). Without it, drag-reordering is off.
70
70
  - `<data-table>` — `risk-register` and `traceability-matrix` compose it for the severity rollup, heatmap, and sortable headers. Without it, the plain table renders but those features are inert.
71
+ - `<form-field>` — `iron-triangle` and `quality-target` (and `capacity-plan`, which embeds a quality target) wrap their dialog inputs in it for labels and validation messages. Without it, the inputs still work with native validation only.
72
+ - `<chart-wc>` — `burndown-chart` draws its chart with it. It ships in VB's optional charts bundle (`dist/cdn/vanilla-breeze-charts.js` + `.css`), not the main bundle. Without it no chart appears (the data lives in a `<template>`); only the scope-change notes render, so load the charts bundle wherever you use `burndown-chart`.
71
73
 
72
74
  ## Design-token contract
73
75
 
@@ -77,7 +79,7 @@ These components are **token-driven**: they read Vanilla Breeze CSS custom prope
77
79
  <link rel="stylesheet" href="https://unpkg.com/vanilla-breeze/dist/cdn/vanilla-breeze.css">
78
80
  ```
79
81
 
80
- `vanilla-breeze` is declared as an **optional peer dependency**: required if you want VB to supply tokens/themes and the `<drag-surface>` / `<data-table>` peers (most consumers do).
82
+ `vanilla-breeze` is declared as an **optional peer dependency**: required if you want VB to supply tokens/themes and the peers above (most consumers do).
81
83
 
82
84
  ## Relationship to Vanilla Breeze
83
85
 
@@ -86,10 +88,13 @@ This package was decomposed out of `vanilla-breeze` core so that framework stays
86
88
  ## Development
87
89
 
88
90
  ```bash
89
- npm run build # bundle dist/ (esm + minified, js + css) via esbuild
90
- npm test # Playwright component specs (serves the built docs/ on :4331)
91
+ npm run build # bundle dist/ (esm + minified, js + css) via esbuild
92
+ npm run typecheck # tsc checkJs over src/ (JSDoc types, no unused locals)
93
+ npm test # unit tests (src/lib, run with TZ=America/Los_Angeles) + Playwright specs
91
94
  ```
92
95
 
96
+ The Playwright specs load the demo pages from the committed `docs/` site but serve the component bundle from `dist/`, so run `npm run build` first and they test your current `src/`. Set `VB_TEST_PORT` to run the suite in more than one checkout at once (default 4331).
97
+
93
98
  `dist/` is committed: it is what the npm tarball ships and what the docs site vendors. CI fails if `src/` changes without a rebuilt `dist/`.
94
99
 
95
100
  The docs site lives in `site/` (CookSSG, styled by Vanilla Breeze) and depends on `vanilla-breeze` for tokens/themes and the `<drag-surface>` / `<data-table>` peers. It imports this package's `dist/` directly.
@@ -265,6 +265,9 @@ quadrant-grid {
265
265
  border-radius: var(--radius-s, 0.25rem);
266
266
  font-size: var(--font-size-sm, 0.875rem);
267
267
  }
268
+ .qg-items > li.qg-pin-item {
269
+ display: contents;
270
+ }
268
271
  .qg-pinned {
269
272
  position: absolute;
270
273
  inline-size: max-content;
@@ -332,9 +335,14 @@ risk-register {
332
335
  }
333
336
  .rr-layout {
334
337
  display: grid;
335
- grid-template-columns: 1fr;
338
+ grid-template-columns: minmax(0, 1fr);
336
339
  gap: var(--size-l, 1.5rem);
337
340
  }
341
+ .rr-layout > data-table {
342
+ display: block;
343
+ min-inline-size: 0;
344
+ overflow-x: auto;
345
+ }
338
346
  @media (width >= 64rem) {
339
347
  .rr-layout {
340
348
  grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
@@ -353,6 +361,11 @@ traceability-matrix {
353
361
  color: var(--color-text, #1a1a1a);
354
362
  }
355
363
  @scope (traceability-matrix) {
364
+ :scope > data-table {
365
+ display: block;
366
+ max-inline-size: 100%;
367
+ overflow-x: auto;
368
+ }
356
369
  .tm-label {
357
370
  display: block;
358
371
  font-size: var(--font-size-xs, 0.75rem);
@@ -402,9 +415,19 @@ traceability-matrix {
402
415
  border-block-end: var(--border-width-thin, 1px) solid var(--color-border, oklch(85% 0 0));
403
416
  cursor: default;
404
417
  }
405
- td[data-linked] {
418
+ .tm-cell-btn {
419
+ all: unset;
420
+ box-sizing: border-box;
421
+ display: block;
422
+ inline-size: 100%;
423
+ min-block-size: 1.5em;
424
+ text-align: inherit;
406
425
  cursor: pointer;
407
426
  }
427
+ .tm-cell-btn:focus-visible {
428
+ outline: 2px solid var(--color-accent, oklch(45% 0.18 260));
429
+ outline-offset: 2px;
430
+ }
408
431
  }
409
432
  [data-state-highlighted]:not(traceability-matrix *) {
410
433
  outline: 2px solid var(--color-accent, oklch(45% 0.18 260));
@@ -584,6 +607,38 @@ product-roadmap > section[data-lane] {
584
607
  border-start-end-radius: var(--radius-s, 0.25rem);
585
608
  border-end-end-radius: var(--radius-s, 0.25rem);
586
609
  }
610
+ .rm-bar:focus-visible {
611
+ outline: var(--border-width-medium, 2px) solid var(--color-focus, var(--color-interactive, #0066cc));
612
+ outline-offset: 2px;
613
+ }
614
+ .rm-bar[data-dragging] {
615
+ cursor: grabbing;
616
+ z-index: 3;
617
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.25);
618
+ }
619
+ .rm-bar-status {
620
+ flex: none;
621
+ font-size: var(--font-size-xs, 0.75rem);
622
+ font-weight: 600;
623
+ opacity: 0.9;
624
+ white-space: nowrap;
625
+ padding-inline-end: var(--size-xs, 0.5rem);
626
+ }
627
+ .rm-track[data-drop-target] {
628
+ outline: var(--border-width-medium, 2px) dashed var(--color-interactive, #0066cc);
629
+ outline-offset: -2px;
630
+ }
631
+ .rm-sr-only {
632
+ position: absolute;
633
+ inline-size: 1px;
634
+ block-size: 1px;
635
+ margin: -1px;
636
+ padding: 0;
637
+ overflow: hidden;
638
+ clip-path: inset(50%);
639
+ white-space: nowrap;
640
+ border: 0;
641
+ }
587
642
  .rm-bar[data-status=planned] {
588
643
  background: var(--color-info, oklch(60% 0.12 240));
589
644
  }
@@ -617,6 +672,9 @@ product-roadmap:not([editable]) .rm-bar {
617
672
  product-roadmap:not([editable]) .rm-bar-handle {
618
673
  display: none;
619
674
  }
675
+ product-roadmap[editable] .rm-bar {
676
+ touch-action: none;
677
+ }
620
678
  @media (prefers-reduced-motion: reduce) {
621
679
  product-roadmap .rm-bar {
622
680
  transition: none;
@@ -999,6 +1057,13 @@ gantt-chart:not([data-upgraded]) > table {
999
1057
  overflow: hidden;
1000
1058
  text-overflow: ellipsis;
1001
1059
  }
1060
+ .gc-task-status {
1061
+ flex: none;
1062
+ margin-inline-start: auto;
1063
+ font-size: 11px;
1064
+ font-weight: 600;
1065
+ color: var(--color-text-muted, #666666);
1066
+ }
1002
1067
  .gc-task-dates {
1003
1068
  position: absolute;
1004
1069
  width: 1px;
@@ -1149,10 +1214,10 @@ gantt-chart:not([data-upgraded]) > table {
1149
1214
  fill: none;
1150
1215
  stroke: var(--color-text-muted, #666666);
1151
1216
  stroke-width: 1.5;
1152
- marker-end: url(#gc-arrowhead);
1153
1217
  }
1154
1218
  .gc-sr-only {
1155
1219
  position: absolute;
1220
+ table-layout: fixed;
1156
1221
  width: 1px;
1157
1222
  height: 1px;
1158
1223
  padding: 0;
@@ -1209,6 +1274,7 @@ gantt-chart[compact] .gc-group-spacer {
1209
1274
  }
1210
1275
  gantt-chart[data-upgraded] .gc-sr-only {
1211
1276
  position: static;
1277
+ table-layout: auto;
1212
1278
  width: auto;
1213
1279
  height: auto;
1214
1280
  margin: 0;