@profpowell/vb-project-planning 0.1.0 → 0.2.1

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/README.md CHANGED
@@ -35,7 +35,7 @@ Project- and UX-planning Web Components for the research, planning, and delivery
35
35
  npm install @profpowell/vb-project-planning
36
36
  ```
37
37
 
38
- Or load from a CDN (after publish):
38
+ Or load from a CDN:
39
39
 
40
40
  ```html
41
41
  <script type="module" src="https://unpkg.com/@profpowell/vb-project-planning/dist/vb-project-planning.min.js"></script>
@@ -62,9 +62,12 @@ import '@profpowell/vb-project-planning/kanban-board';
62
62
  <user-persona name="Fred" role="Engineer">…</user-persona>
63
63
  ```
64
64
 
65
- ## Peer: `<drag-surface>`
65
+ ## Runtime peers: `<drag-surface>` and `<data-table>`
66
66
 
67
- The drag-to-reorder components (`kanban-board`, `quadrant-grid`, `impact-effort`, `story-map`) use Vanilla Breeze's `<drag-surface>` element as a runtime peer. It ships with Vanilla Breeze core — load VB on the page and dragging works. Without it, these components still render and function; only drag-reordering is unavailable.
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.
68
+
69
+ - `<drag-surface>` — the drag-to-reorder components (`kanban-board`, `quadrant-grid`, `impact-effort`, `story-map`). Without it, drag-reordering is off.
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.
68
71
 
69
72
  ## Design-token contract
70
73
 
@@ -74,7 +77,7 @@ These components are **token-driven**: they read Vanilla Breeze CSS custom prope
74
77
  <link rel="stylesheet" href="https://unpkg.com/vanilla-breeze/dist/cdn/vanilla-breeze.css">
75
78
  ```
76
79
 
77
- `vanilla-breeze` is declared as an **optional peer dependency**: required if you want VB to supply tokens/themes and the `<drag-surface>` peer (most consumers do).
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).
78
81
 
79
82
  ## Relationship to Vanilla Breeze
80
83
 
@@ -84,9 +87,28 @@ This package was decomposed out of `vanilla-breeze` core so that framework stays
84
87
 
85
88
  ```bash
86
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
+ ```
92
+
93
+ `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
+
95
+ 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.
96
+
97
+ ```bash
98
+ cd site && npm ci && npm run dev # local preview
99
+ cd site && npm run build && node scripts/publish-docs.js /vb-project-planning # regenerate docs/
100
+ ```
101
+
102
+ GitHub Pages serves the committed `docs/` folder. The **Publish docs** workflow regenerates and commits it automatically when `site/` or `dist/` change on `main`.
103
+
104
+ ### Releasing
105
+
106
+ ```bash
107
+ npm version minor # bumps package.json and tags vX.Y.Z
108
+ git push --follow-tags
87
109
  ```
88
110
 
89
- Note the demo site depends on `vanilla-breeze` for tokens/themes and the `<drag-surface>` peer, and import this package directly.
111
+ The **Release** workflow builds, runs the tests, publishes to npm with provenance, and creates a GitHub release from the matching `CHANGELOG.md` section. CI publishing needs an `NPM_TOKEN` repository secret. Without one, publish from a logged-in terminal first (`npm publish --access public`) and then push the tag; the workflow sees the version is already on the registry, skips the publish, and still creates the GitHub release.
90
112
 
91
113
  ## License
92
114
 
@@ -1321,20 +1321,76 @@ iron-triangle svg .center:hover .quality-label,
1321
1321
  iron-triangle svg .center:focus-visible .quality-label {
1322
1322
  fill: var(--color-interactive);
1323
1323
  }
1324
+ iron-triangle > .iron-triangle-status {
1325
+ display: flex;
1326
+ flex-wrap: wrap;
1327
+ align-items: center;
1328
+ justify-content: center;
1329
+ gap: var(--size-s, 0.75rem);
1330
+ margin-block-start: var(--size-xs, 0.5rem);
1331
+ font-size: var(--font-size-sm, 0.875rem);
1332
+ }
1333
+ iron-triangle > .iron-triangle-status .iron-triangle-readout {
1334
+ position: absolute;
1335
+ inline-size: 1px;
1336
+ block-size: 1px;
1337
+ margin: -1px;
1338
+ padding: 0;
1339
+ overflow: hidden;
1340
+ clip-path: inset(50%);
1341
+ white-space: nowrap;
1342
+ border: 0;
1343
+ }
1344
+ iron-triangle > .iron-triangle-status .iron-triangle-mode {
1345
+ font-size: inherit;
1346
+ font-weight: var(--font-weight-normal, 400);
1347
+ padding-block: 0;
1348
+ padding-inline: var(--size-xs, 0.5rem);
1349
+ border-color: transparent;
1350
+ color: var(--color-text-muted);
1351
+ }
1352
+ iron-triangle > .iron-triangle-status .iron-triangle-mode:hover {
1353
+ color: var(--color-text);
1354
+ }
1355
+ iron-triangle > .iron-triangle-status .iron-triangle-mode[aria-pressed=true] {
1356
+ color: var(--color-interactive);
1357
+ text-decoration: underline;
1358
+ text-decoration-thickness: var(--border-width-medium, 2px);
1359
+ text-underline-offset: 0.25em;
1360
+ }
1361
+ iron-triangle > .iron-triangle-status .iron-triangle-warning {
1362
+ margin: 0;
1363
+ padding: var(--size-2xs, 0.25rem) var(--size-xs, 0.5rem);
1364
+ border-radius: var(--radius-s, 0.25rem);
1365
+ border: var(--border-width-thin, 1px) solid var(--iron-triangle-warning-color, var(--color-warning));
1366
+ color: var(--iron-triangle-warning-color, var(--color-warning));
1367
+ font-weight: var(--font-weight-semibold, 600);
1368
+ }
1369
+ iron-triangle > .iron-triangle-status .iron-triangle-warning::before {
1370
+ content: "\26a0\fe0e ";
1371
+ }
1372
+ iron-triangle > dialog.iron-triangle-dialog [hidden] {
1373
+ display: none;
1374
+ }
1375
+ iron-triangle > dialog.iron-triangle-dialog .iron-triangle-dialog__hint {
1376
+ margin: 0;
1377
+ color: var(--color-text-muted);
1378
+ font-size: var(--font-size-sm, 0.875rem);
1379
+ }
1324
1380
  iron-triangle:state(over-deadline) svg .triangle {
1325
- stroke: var(--color-warning);
1381
+ stroke: var(--iron-triangle-warning-color, var(--color-warning));
1326
1382
  }
1327
1383
  iron-triangle:state(unbudgeted) svg .capacity {
1328
- fill: var(--color-warning);
1329
- }
1330
- iron-triangle:state(manual) svg .quality-label::after {
1331
- content: " (manual)";
1384
+ fill: var(--iron-triangle-warning-color, var(--color-warning));
1332
1385
  }
1333
1386
  iron-triangle[disabled],
1334
1387
  iron-triangle[locked] {
1335
1388
  opacity: 0.85;
1336
1389
  pointer-events: none;
1337
1390
  }
1391
+ iron-triangle[locked]:not([disabled]) svg .center[data-target=quality] {
1392
+ pointer-events: auto;
1393
+ }
1338
1394
  iron-triangle > dialog.iron-triangle-dialog {
1339
1395
  inline-size: min(28rem, 92vw);
1340
1396
  border: var(--border-width-thin, 1px) solid var(--color-border);