@profpowell/vb-project-planning 0.1.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.
Files changed (106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/vb-project-planning.css +1603 -0
  4. package/dist/vb-project-planning.js +11138 -0
  5. package/dist/vb-project-planning.min.css +1 -0
  6. package/dist/vb-project-planning.min.js +3312 -0
  7. package/package.json +80 -0
  8. package/src/index.css +14 -0
  9. package/src/index.js +26 -0
  10. package/src/lib/bundle-registry.js +156 -0
  11. package/src/lib/diff-by-key.js +86 -0
  12. package/src/lib/portrait-url.js +87 -0
  13. package/src/lib/vb-collection.js +122 -0
  14. package/src/lib/vb-element.js +96 -0
  15. package/src/lib/vb-store.js +200 -0
  16. package/src/lib/vb-view-transition.js +44 -0
  17. package/src/utils/copy-init.js +287 -0
  18. package/src/web-components/_ux-base.js +106 -0
  19. package/src/web-components/adr-wc/README.md +77 -0
  20. package/src/web-components/adr-wc/api.json +26 -0
  21. package/src/web-components/adr-wc/logic.js +376 -0
  22. package/src/web-components/adr-wc/static.html +17 -0
  23. package/src/web-components/adr-wc/styles.js +338 -0
  24. package/src/web-components/burndown-chart/api.json +74 -0
  25. package/src/web-components/burndown-chart/logic.js +198 -0
  26. package/src/web-components/burndown-chart/static.html +31 -0
  27. package/src/web-components/burndown-chart/styles.css +59 -0
  28. package/src/web-components/capacity-plan/_capacity-utils.js +56 -0
  29. package/src/web-components/capacity-plan/api.json +20 -0
  30. package/src/web-components/capacity-plan/logic.js +222 -0
  31. package/src/web-components/capacity-plan/static.html +24 -0
  32. package/src/web-components/capacity-plan/styles.css +84 -0
  33. package/src/web-components/empathy-map/api.json +31 -0
  34. package/src/web-components/empathy-map/logic.js +502 -0
  35. package/src/web-components/empathy-map/static.html +32 -0
  36. package/src/web-components/empathy-map/styles.js +534 -0
  37. package/src/web-components/gantt-chart/README.md +91 -0
  38. package/src/web-components/gantt-chart/api.json +20 -0
  39. package/src/web-components/gantt-chart/logic.js +812 -0
  40. package/src/web-components/gantt-chart/static.html +60 -0
  41. package/src/web-components/gantt-chart/styles.css +391 -0
  42. package/src/web-components/impact-effort/api.json +21 -0
  43. package/src/web-components/impact-effort/logic.js +392 -0
  44. package/src/web-components/impact-effort/static.html +23 -0
  45. package/src/web-components/impact-effort/styles.css +193 -0
  46. package/src/web-components/iron-triangle/_capacity.js +83 -0
  47. package/src/web-components/iron-triangle/_triangle-geometry.js +322 -0
  48. package/src/web-components/iron-triangle/api.json +26 -0
  49. package/src/web-components/iron-triangle/logic.js +474 -0
  50. package/src/web-components/iron-triangle/static.html +28 -0
  51. package/src/web-components/iron-triangle/styles.css +158 -0
  52. package/src/web-components/kanban-board/api.json +24 -0
  53. package/src/web-components/kanban-board/logic.js +698 -0
  54. package/src/web-components/kanban-board/static.html +20 -0
  55. package/src/web-components/kanban-board/styles.css +242 -0
  56. package/src/web-components/product-roadmap/api.json +118 -0
  57. package/src/web-components/product-roadmap/logic.js +460 -0
  58. package/src/web-components/product-roadmap/static.html +44 -0
  59. package/src/web-components/product-roadmap/styles.css +158 -0
  60. package/src/web-components/quadrant-grid/api.json +125 -0
  61. package/src/web-components/quadrant-grid/logic.js +397 -0
  62. package/src/web-components/quadrant-grid/static.html +49 -0
  63. package/src/web-components/quadrant-grid/styles.css +184 -0
  64. package/src/web-components/quality-target/_quality-utils.js +460 -0
  65. package/src/web-components/quality-target/api.json +30 -0
  66. package/src/web-components/quality-target/logic.js +516 -0
  67. package/src/web-components/quality-target/static.html +22 -0
  68. package/src/web-components/quality-target/styles.css +203 -0
  69. package/src/web-components/requirement-card/api.json +25 -0
  70. package/src/web-components/requirement-card/logic.js +166 -0
  71. package/src/web-components/requirement-card/static.html +36 -0
  72. package/src/web-components/requirement-card/styles.js +114 -0
  73. package/src/web-components/review-surface/README.md +178 -0
  74. package/src/web-components/review-surface/api.json +30 -0
  75. package/src/web-components/review-surface/logic.js +807 -0
  76. package/src/web-components/review-surface/static.html +33 -0
  77. package/src/web-components/review-surface/styles.js +459 -0
  78. package/src/web-components/risk-register/api.json +47 -0
  79. package/src/web-components/risk-register/logic.js +180 -0
  80. package/src/web-components/risk-register/static.html +46 -0
  81. package/src/web-components/risk-register/styles.css +37 -0
  82. package/src/web-components/story-map/api.json +22 -0
  83. package/src/web-components/story-map/logic.js +445 -0
  84. package/src/web-components/story-map/static.html +35 -0
  85. package/src/web-components/story-map/styles.css +169 -0
  86. package/src/web-components/traceability-matrix/api.json +84 -0
  87. package/src/web-components/traceability-matrix/logic.js +243 -0
  88. package/src/web-components/traceability-matrix/static.html +41 -0
  89. package/src/web-components/traceability-matrix/styles.css +94 -0
  90. package/src/web-components/user-journey/api.json +84 -0
  91. package/src/web-components/user-journey/logic.js +368 -0
  92. package/src/web-components/user-journey/static.html +14 -0
  93. package/src/web-components/user-journey/styles.js +317 -0
  94. package/src/web-components/user-persona/api.json +35 -0
  95. package/src/web-components/user-persona/logic.js +502 -0
  96. package/src/web-components/user-persona/static.html +20 -0
  97. package/src/web-components/user-persona/styles.js +299 -0
  98. package/src/web-components/user-story/api.json +35 -0
  99. package/src/web-components/user-story/logic.js +567 -0
  100. package/src/web-components/user-story/static.html +27 -0
  101. package/src/web-components/user-story/styles.js +332 -0
  102. package/src/web-components/work-item/README.md +85 -0
  103. package/src/web-components/work-item/api.json +30 -0
  104. package/src/web-components/work-item/logic.js +414 -0
  105. package/src/web-components/work-item/static.html +24 -0
  106. package/src/web-components/work-item/styles.js +376 -0
@@ -0,0 +1,20 @@
1
+ <!--
2
+ kanban-board — static (zero-JS) form
3
+ Column sections with draggable children render as vertical flow before
4
+ JS upgrades to horizontal columns with drag-and-drop.
5
+ -->
6
+ <kanban-board>
7
+ <section data-column="backlog" data-column-label="Backlog">
8
+ <article draggable="true" data-id="task-1">Design review for dashboard</article>
9
+ <article draggable="true" data-id="task-2">Write API documentation</article>
10
+ </section>
11
+ <section data-column="doing" data-column-label="In Progress" data-wip="3">
12
+ <article draggable="true" data-id="task-3">Implement user authentication</article>
13
+ </section>
14
+ <section data-column="review" data-column-label="Review" data-wip="2">
15
+ <article draggable="true" data-id="task-4">Add loading indicators</article>
16
+ </section>
17
+ <section data-column="done" data-column-label="Done" data-column-color="success">
18
+ <article draggable="true" data-id="task-5">Set up CI/CD pipeline</article>
19
+ </section>
20
+ </kanban-board>
@@ -0,0 +1,242 @@
1
+ /* ── kanban-board ──────────────────────────────────────────────────────────── */
2
+ /* Light DOM styles — element selector pattern */
3
+
4
+ kanban-board {
5
+ display: block;
6
+ container-type: inline-size;
7
+ }
8
+
9
+ kanban-board:not(:defined) {
10
+ display: block;
11
+ }
12
+
13
+ /* ── Columns container ────────────────────────────────────────────────────── */
14
+
15
+ .kb-columns {
16
+ display: flex;
17
+ gap: 1px;
18
+ background: var(--color-border, #e0e0e0);
19
+ border: 1px solid var(--color-border, #e0e0e0);
20
+ border-radius: var(--radius-l, 0.75rem);
21
+ overflow: hidden;
22
+ flex-wrap: wrap;
23
+ }
24
+
25
+ /* ── Individual column ────────────────────────────────────────────────────── */
26
+
27
+ .kb-column {
28
+ min-inline-size: 14rem;
29
+ flex: 1 1 14rem;
30
+ display: flex;
31
+ flex-direction: column;
32
+ background: var(--color-surface, #fff);
33
+ /* Columns are authored as <section> siblings. VB's @scope flow-separator rule
34
+ adds margin-block-start, padding-block-start and a top border to every
35
+ section after the first — which shoves the 2nd+ column headers down and
36
+ misaligns the board. Neutralize the separator so all columns top-align. */
37
+ margin-block: 0 !important;
38
+ padding-block-start: 0 !important;
39
+ border-block-start: 0 !important;
40
+ }
41
+
42
+ /* ── Column header ────────────────────────────────────────────────────────── */
43
+
44
+ .kb-column-header {
45
+ position: sticky;
46
+ inset-block-start: 0;
47
+ z-index: 2;
48
+ padding: var(--size-s, 12px) var(--size-m, 16px);
49
+ background: var(--color-surface-raised, #f8f9fa);
50
+ border-block-end: 2px solid var(--color-border, #e0e0e0);
51
+ }
52
+
53
+ .kb-column-header h3 {
54
+ margin: 0;
55
+ font-size: 0.875rem;
56
+ font-weight: 700;
57
+ text-transform: uppercase;
58
+ letter-spacing: 0.04em;
59
+ color: var(--color-text, #1a1a1a);
60
+ display: flex;
61
+ align-items: center;
62
+ gap: 0.25em;
63
+ }
64
+
65
+ /* ── Count badge ──────────────────────────────────────────────────────────── */
66
+
67
+ .kb-count {
68
+ font-size: 0.7rem;
69
+ font-weight: 600;
70
+ color: var(--color-text-muted, #666);
71
+ background: var(--color-border, #e0e0e0);
72
+ border-radius: var(--radius-full, 9999px);
73
+ padding: 1px 8px;
74
+ margin-inline-start: 4px;
75
+ }
76
+
77
+ /* ── WIP limit badge ──────────────────────────────────────────────────────── */
78
+
79
+ .kb-wip {
80
+ font-size: 0.65rem;
81
+ font-weight: 400;
82
+ color: var(--color-text-muted, #999);
83
+ }
84
+
85
+ /* ── WIP exceeded state ───────────────────────────────────────────────────── */
86
+
87
+ [data-wip-exceeded] .kb-column-header {
88
+ border-block-end-color: var(--color-error, #ef4444);
89
+ }
90
+
91
+ [data-wip-exceeded] .kb-count {
92
+ background: color-mix(in oklch, var(--color-error, #ef4444) 15%, var(--color-surface, #fff));
93
+ color: var(--color-error, #ef4444);
94
+ }
95
+
96
+ /* ── Column color tints ───────────────────────────────────────────────────── */
97
+
98
+ [data-column-tint="success"] {
99
+ background: color-mix(in oklch, var(--color-success, #22c55e) 6%, var(--color-surface, #fff));
100
+ }
101
+
102
+ [data-column-tint="warning"] {
103
+ background: color-mix(in oklch, var(--color-warning, #f59e0b) 6%, var(--color-surface, #fff));
104
+ }
105
+
106
+ [data-column-tint="error"] {
107
+ background: color-mix(in oklch, var(--color-error, #ef4444) 6%, var(--color-surface, #fff));
108
+ }
109
+
110
+ [data-column-tint="info"] {
111
+ background: color-mix(in oklch, var(--color-info, #3b82f6) 6%, var(--color-surface, #fff));
112
+ }
113
+
114
+ [data-column-tint="interactive"] {
115
+ background: color-mix(in oklch, var(--color-interactive, #3b82f6) 6%, var(--color-surface, #fff));
116
+ }
117
+
118
+ /* ── Inner drag-surfaces ──────────────────────────────────────────────────── */
119
+
120
+ kanban-board drag-surface {
121
+ padding: var(--size-s, 12px);
122
+ min-block-size: 6rem;
123
+ flex: 1;
124
+ }
125
+
126
+ /* ── Default card style for JSON-created articles ─────────────────────────── */
127
+
128
+ kanban-board .kb-card {
129
+ background: var(--color-surface, #fff);
130
+ border: var(--border-width-thin, 1px) solid var(--color-border, #e0e0e0);
131
+ border-radius: var(--radius-s, 0.375rem);
132
+ padding: var(--size-xs, 8px) var(--size-s, 12px);
133
+ cursor: grab;
134
+ font-size: var(--font-size-s, 0.875rem);
135
+ line-height: 1.4;
136
+ }
137
+
138
+ kanban-board .kb-card:active {
139
+ cursor: grabbing;
140
+ }
141
+
142
+ /* ── Empty column placeholder ─────────────────────────────────────────────── */
143
+
144
+ .kb-empty {
145
+ color: var(--color-text-muted, #888);
146
+ font-size: 0.8rem;
147
+ font-style: italic;
148
+ padding: var(--size-s, 12px);
149
+ margin: 0;
150
+ }
151
+
152
+ /* ── Title ────────────────────────────────────────────────────────────────── */
153
+
154
+ .kb-title {
155
+ margin-block-end: var(--size-s, 12px);
156
+ }
157
+
158
+ /* ── Live region (visually hidden) ────────────────────────────────────────── */
159
+
160
+ .kb-live-region {
161
+ position: absolute;
162
+ width: 1px;
163
+ height: 1px;
164
+ overflow: hidden;
165
+ clip: rect(0, 0, 0, 0);
166
+ white-space: nowrap;
167
+ border: 0;
168
+ padding: 0;
169
+ margin: -1px;
170
+ }
171
+
172
+ /* ── Compact variant ──────────────────────────────────────────────────────── */
173
+
174
+ kanban-board[compact] .kb-column {
175
+ min-inline-size: 11rem;
176
+ flex: 1 1 11rem;
177
+ }
178
+
179
+ kanban-board[compact] .kb-column-header {
180
+ padding: var(--size-xs, 8px) var(--size-s, 12px);
181
+ }
182
+
183
+ kanban-board[compact] .kb-column-header h3 {
184
+ font-size: 0.75rem;
185
+ }
186
+
187
+ kanban-board[compact] drag-surface {
188
+ padding: var(--size-xs, 8px);
189
+ min-block-size: 4rem;
190
+ }
191
+
192
+ kanban-board[compact] .kb-count {
193
+ font-size: 0.6rem;
194
+ }
195
+
196
+ /* ── Container query: single-column stacking ──────────────────────────────── */
197
+
198
+ @container (max-width: 30rem) {
199
+ .kb-columns {
200
+ flex-direction: column;
201
+ }
202
+
203
+ .kb-column {
204
+ min-inline-size: unset;
205
+ }
206
+ }
207
+
208
+ /* ── Reduced motion ───────────────────────────────────────────────────────── */
209
+
210
+ @media (prefers-reduced-motion: reduce) {
211
+ kanban-board,
212
+ kanban-board * {
213
+ transition: none;
214
+ }
215
+ }
216
+
217
+ /* ── Print ────────────────────────────────────────────────────────────────── */
218
+
219
+ @media print {
220
+ .kb-columns {
221
+ flex-wrap: wrap;
222
+ border: 0.5pt solid #ccc;
223
+ gap: 0;
224
+ }
225
+
226
+ .kb-column {
227
+ border: 0.5pt solid #ccc;
228
+ break-inside: avoid;
229
+ }
230
+
231
+ .kb-column-header {
232
+ position: static;
233
+ }
234
+
235
+ kanban-board drag-surface {
236
+ min-block-size: auto;
237
+ }
238
+
239
+ kanban-board [draggable] {
240
+ cursor: default;
241
+ }
242
+ }
@@ -0,0 +1,118 @@
1
+ {
2
+ "$schema": "../../../schemas/api.schema.json",
3
+ "element": "product-roadmap",
4
+ "type": "web-component",
5
+ "description": "Interactive themes \u00d7 quarters product roadmap. Auto-discovers lane sections + initiative articles; editable mode wires drag-to-reschedule, drag-to-resize, and drop-on-lane.",
6
+ "attributes": [
7
+ {
8
+ "name": "start",
9
+ "kind": "host-api",
10
+ "purpose": "config",
11
+ "type": "string",
12
+ "description": "First date in the range (ISO 8601 or \"YYYY-Qn\"; required)"
13
+ },
14
+ {
15
+ "name": "end",
16
+ "kind": "host-api",
17
+ "purpose": "config",
18
+ "type": "string",
19
+ "description": "Last date in the range (ISO 8601 or \"YYYY-Qn\"; required, inclusive)"
20
+ },
21
+ {
22
+ "name": "view",
23
+ "kind": "host-api",
24
+ "purpose": "visual-variant",
25
+ "type": "enum",
26
+ "values": [
27
+ "quarter",
28
+ "month"
29
+ ],
30
+ "description": "Time-axis granularity (default: quarter)"
31
+ },
32
+ {
33
+ "name": "editable",
34
+ "kind": "host-api",
35
+ "purpose": "config",
36
+ "type": "boolean",
37
+ "description": "Wire drag-to-reschedule, drag-to-resize, and lane drop"
38
+ },
39
+ {
40
+ "name": "today-marker",
41
+ "kind": "host-api",
42
+ "purpose": "config",
43
+ "type": "boolean",
44
+ "description": "Render a vertical line at today's date if it falls within the range"
45
+ }
46
+ ],
47
+ "structure": [
48
+ {
49
+ "element": "<section data-lane=\"\u2026\">",
50
+ "description": "One per swimlane row"
51
+ },
52
+ {
53
+ "element": "<article data-start=\"\u2026\" data-end=\"\u2026\">",
54
+ "description": "One per initiative bar inside a lane (data-status sets the bar color)"
55
+ }
56
+ ],
57
+ "childAttributes": [
58
+ {
59
+ "name": "data-lane",
60
+ "on": "section",
61
+ "type": "string",
62
+ "description": "Lane name (used as the row label)"
63
+ },
64
+ {
65
+ "name": "data-start",
66
+ "on": "article",
67
+ "type": "string",
68
+ "description": "Initiative start date (ISO 8601 or YYYY-Qn)"
69
+ },
70
+ {
71
+ "name": "data-end",
72
+ "on": "article",
73
+ "type": "string",
74
+ "description": "Initiative end date (ISO 8601 or YYYY-Qn)"
75
+ },
76
+ {
77
+ "name": "data-status",
78
+ "on": "article",
79
+ "type": "enum",
80
+ "values": [
81
+ "planned",
82
+ "in-progress",
83
+ "at-risk",
84
+ "shipped",
85
+ "blocked"
86
+ ],
87
+ "description": "Status enum; drives bar color"
88
+ }
89
+ ],
90
+ "events": [
91
+ {
92
+ "name": "product-roadmap:select",
93
+ "detail": "{ initiative, lane, start, end, status }",
94
+ "description": "Fired on bar click"
95
+ },
96
+ {
97
+ "name": "product-roadmap:reschedule",
98
+ "detail": "{ initiative, lane, start, end }",
99
+ "description": "Fired after drag-to-move snaps to grid"
100
+ },
101
+ {
102
+ "name": "product-roadmap:resize",
103
+ "detail": "{ initiative, lane, start, end }",
104
+ "description": "Fired after drag-to-resize snaps to grid"
105
+ },
106
+ {
107
+ "name": "product-roadmap:move",
108
+ "detail": "{ initiative, fromLane, toLane, start, end }",
109
+ "description": "Fired after a bar drops on a different lane"
110
+ }
111
+ ],
112
+ "htmlvalidate": {
113
+ "flow": true,
114
+ "permittedContent": [
115
+ "@flow"
116
+ ]
117
+ }
118
+ }