@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.
- package/README.md +10 -5
- package/dist/vb-project-planning.css +69 -3
- package/dist/vb-project-planning.js +3191 -2544
- package/dist/vb-project-planning.min.css +1 -1
- package/dist/vb-project-planning.min.js +221 -197
- package/package.json +7 -4
- package/src/lib/board-surface.js +158 -0
- package/src/lib/bundle-registry.js +2 -75
- package/src/lib/dates.js +125 -0
- package/src/lib/escape.js +34 -0
- package/src/lib/hash.js +16 -0
- package/src/lib/portrait-url.js +3 -29
- package/src/lib/src-loader.js +78 -0
- package/src/lib/vb-view-transition.js +7 -1
- package/src/utils/copy-init.js +56 -17
- package/src/web-components/_ux-base.js +409 -24
- package/src/web-components/adr-wc/README.md +18 -16
- package/src/web-components/adr-wc/api.json +7 -5
- package/src/web-components/adr-wc/logic.js +50 -136
- package/src/web-components/burndown-chart/api.json +8 -6
- package/src/web-components/burndown-chart/logic.js +75 -39
- package/src/web-components/empathy-map/api.json +13 -13
- package/src/web-components/empathy-map/logic.js +161 -168
- package/src/web-components/empathy-map/static.html +3 -3
- package/src/web-components/empathy-map/styles.js +1 -0
- package/src/web-components/gantt-chart/README.md +12 -6
- package/src/web-components/gantt-chart/api.json +23 -7
- package/src/web-components/gantt-chart/logic.js +456 -431
- package/src/web-components/gantt-chart/styles.css +14 -1
- package/src/web-components/impact-effort/api.json +9 -7
- package/src/web-components/impact-effort/logic.js +238 -209
- package/src/web-components/impact-effort/static.html +12 -4
- package/src/web-components/iron-triangle/_capacity.js +0 -18
- package/src/web-components/kanban-board/api.json +8 -6
- package/src/web-components/kanban-board/logic.js +289 -333
- package/src/web-components/product-roadmap/api.json +14 -13
- package/src/web-components/product-roadmap/logic.js +393 -246
- package/src/web-components/product-roadmap/styles.css +40 -0
- package/src/web-components/quadrant-grid/api.json +9 -4
- package/src/web-components/quadrant-grid/logic.js +80 -12
- package/src/web-components/quadrant-grid/styles.css +7 -0
- package/src/web-components/quality-target/_quality-utils.js +2 -46
- package/src/web-components/review-surface/README.md +9 -5
- package/src/web-components/review-surface/api.json +10 -8
- package/src/web-components/review-surface/logic.js +349 -218
- package/src/web-components/risk-register/api.json +1 -6
- package/src/web-components/risk-register/logic.js +71 -24
- package/src/web-components/risk-register/styles.css +9 -1
- package/src/web-components/story-map/api.json +8 -6
- package/src/web-components/story-map/logic.js +280 -281
- package/src/web-components/story-map/static.html +15 -5
- package/src/web-components/traceability-matrix/api.json +10 -3
- package/src/web-components/traceability-matrix/logic.js +112 -63
- package/src/web-components/traceability-matrix/styles.css +22 -1
- package/src/web-components/user-journey/api.json +25 -24
- package/src/web-components/user-journey/logic.js +76 -127
- package/src/web-components/user-journey/static.html +2 -2
- package/src/web-components/user-persona/api.json +15 -14
- package/src/web-components/user-persona/logic.js +71 -117
- package/src/web-components/user-persona/styles.js +1 -0
- package/src/web-components/user-story/api.json +13 -11
- package/src/web-components/user-story/logic.js +164 -195
- package/src/web-components/user-story/styles.js +28 -1
- package/src/web-components/work-item/README.md +3 -3
- package/src/web-components/work-item/api.json +13 -11
- package/src/web-components/work-item/logic.js +58 -154
|
@@ -5,19 +5,27 @@
|
|
|
5
5
|
-->
|
|
6
6
|
<impact-effort>
|
|
7
7
|
<user-story data-quadrant="quick-wins" draggable="true" data-id="PROJ-201"
|
|
8
|
-
story-id="PROJ-201"
|
|
8
|
+
story-id="PROJ-201"
|
|
9
9
|
priority="medium" status="to-do" points="2" detail="minimal">
|
|
10
|
+
<span slot="persona">PM</span>
|
|
11
|
+
<span slot="action">add CSV export to reports</span>
|
|
10
12
|
</user-story>
|
|
11
13
|
<user-story data-quadrant="big-bets" draggable="true" data-id="PROJ-301"
|
|
12
|
-
story-id="PROJ-301"
|
|
14
|
+
story-id="PROJ-301"
|
|
13
15
|
priority="high" status="in-progress" points="13" detail="minimal">
|
|
16
|
+
<span slot="persona">Developer</span>
|
|
17
|
+
<span slot="action">migrate to new API gateway</span>
|
|
14
18
|
</user-story>
|
|
15
19
|
<user-story data-quadrant="fill-ins" draggable="true" data-id="PROJ-401"
|
|
16
|
-
story-id="PROJ-401"
|
|
20
|
+
story-id="PROJ-401"
|
|
17
21
|
priority="low" status="backlog" points="1" detail="minimal">
|
|
22
|
+
<span slot="persona">Developer</span>
|
|
23
|
+
<span slot="action">update README with new setup steps</span>
|
|
18
24
|
</user-story>
|
|
19
25
|
<user-story data-quadrant="money-pit" draggable="true" data-id="PROJ-501"
|
|
20
|
-
story-id="PROJ-501"
|
|
26
|
+
story-id="PROJ-501"
|
|
21
27
|
priority="medium" status="backlog" points="21" detail="minimal">
|
|
28
|
+
<span slot="persona">Admin</span>
|
|
29
|
+
<span slot="action">rewrite legacy auth module</span>
|
|
22
30
|
</user-story>
|
|
23
31
|
</impact-effort>
|
|
@@ -19,24 +19,6 @@ export function defaultFormula(time, cost, focusFactor) {
|
|
|
19
19
|
return Math.ceil(weeks * fte * f);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
/**
|
|
23
|
-
* Format the formula string used as the human-readable explanation
|
|
24
|
-
* shown beneath the readout. Matches the formula above; if either
|
|
25
|
-
* factor is missing the string degrades gracefully.
|
|
26
|
-
*/
|
|
27
|
-
export function defaultFormulaText(time, cost, focusFactor) {
|
|
28
|
-
const sprintCount = num(time?.sprintCount);
|
|
29
|
-
const sprintWeeks = num(time?.sprintWeeks) || 1;
|
|
30
|
-
const totalWeeks = sprintCount > 0 ? sprintCount * sprintWeeks : sprintWeeks;
|
|
31
|
-
const fte = num(cost?.teamFTE);
|
|
32
|
-
const f = clamp(num(focusFactor), 0, 1);
|
|
33
|
-
const points = defaultFormula(time, cost, focusFactor);
|
|
34
|
-
if (!points) return 'Set sprint length, team size, and focus factor to compute capacity.';
|
|
35
|
-
const weeksLabel = sprintCount > 0
|
|
36
|
-
? `${sprintCount} × ${sprintWeeks}wk = ${totalWeeks}wk`
|
|
37
|
-
: `${sprintWeeks}wk`;
|
|
38
|
-
return `${weeksLabel} × ${fte} FTE × ${f} = ${(totalWeeks * fte * f).toFixed(1)} → ${points} points`;
|
|
39
|
-
}
|
|
40
22
|
|
|
41
23
|
/**
|
|
42
24
|
* FNV-1a (32-bit) hash over a stable JSON serialization of the triangle.
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"description": "Columnar drag-and-drop board with user-defined columns, count badges, and optional WIP limits",
|
|
6
6
|
"htmlvalidate": { "flow": true, "permittedContent": ["section"] },
|
|
7
7
|
"attributes": [
|
|
8
|
-
{ "name": "src", "kind": "host-api", "purpose": "config", "type": "string", "description": "URL to JSON data for columns and items" },
|
|
9
|
-
{ "name": "title", "kind": "host-api", "purpose": "config", "type": "string", "description": "Optional heading above the board" },
|
|
8
|
+
{ "name": "src", "kind": "host-api", "purpose": "config", "type": "string", "description": "URL to JSON data for columns and items. Fetched once per value; a new value replaces the board and aborts an older in-flight request" },
|
|
9
|
+
{ "name": "title", "kind": "host-api", "purpose": "config", "type": "string", "description": "Optional heading above the board; also names the board region" },
|
|
10
10
|
{ "name": "compact", "kind": "host-api", "purpose": "config", "type": "boolean", "description": "Reduced spacing variant" }
|
|
11
11
|
],
|
|
12
12
|
"childAttributes": [
|
|
@@ -16,9 +16,11 @@
|
|
|
16
16
|
{ "name": "data-column-color", "on": "section", "type": "string", "description": "Color token for column tint (success, warning, error, info)" }
|
|
17
17
|
],
|
|
18
18
|
"events": [
|
|
19
|
-
{ "name": "kanban-board:transfer",
|
|
20
|
-
{ "name": "kanban-board:reorder",
|
|
21
|
-
{ "name": "kanban-board:ready",
|
|
22
|
-
{ "name": "kanban-board:wip-exceeded",
|
|
19
|
+
{ "name": "kanban-board:transfer", "detail": "{ itemId, fromColumn, toColumn, newIndex, item }", "description": "Item moved between columns" },
|
|
20
|
+
{ "name": "kanban-board:reorder", "detail": "{ itemId, column, oldIndex, newIndex }", "description": "Item reordered within a column" },
|
|
21
|
+
{ "name": "kanban-board:ready", "detail": "{ columnCount, itemCount }", "description": "Fired once after the first render. With src, fired once the JSON has loaded and rendered. Once per element: not re-fired by a later src change (watch items-changed with source 'src') or when the board is moved in the DOM" },
|
|
22
|
+
{ "name": "kanban-board:wip-exceeded", "detail": "{ column, limit, count }", "description": "Fired when a drop takes a column over its WIP limit" },
|
|
23
|
+
{ "name": "kanban-board:items-changed", "detail": "{ items, source: 'api' | 'drag' | 'src' }", "description": "Fired after the items array changes: an .items assignment, or a .columns assignment that drops cards (source 'api'), a drag (source 'drag'), or each src load once its data has rendered (source 'src'). Filter on source to avoid feedback loops" },
|
|
24
|
+
{ "name": "kanban-board:upgraded", "detail": "", "description": "Fired (in a microtask) each time the board connects and upgrades; a safe signal for assigning .columns / .items from a framework" }
|
|
23
25
|
]
|
|
24
26
|
}
|