@forwardimpact/pathway 0.22.0 → 0.23.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 (75) hide show
  1. package/package.json +3 -2
  2. package/src/commands/agent.js +7 -3
  3. package/src/commands/behaviour.js +11 -1
  4. package/src/commands/build.js +11 -2
  5. package/src/commands/command-factory.js +4 -2
  6. package/src/commands/dev.js +9 -2
  7. package/src/commands/discipline.js +19 -2
  8. package/src/commands/driver.js +11 -1
  9. package/src/commands/job.js +25 -12
  10. package/src/commands/level.js +19 -3
  11. package/src/commands/skill.js +11 -1
  12. package/src/commands/stage.js +11 -1
  13. package/src/commands/tool.js +4 -3
  14. package/src/commands/track.js +11 -1
  15. package/src/components/card.js +8 -104
  16. package/src/components/comparison-radar.js +1 -1
  17. package/src/components/detail.js +16 -118
  18. package/src/components/error-page.js +8 -68
  19. package/src/components/grid.js +12 -106
  20. package/src/components/list.js +7 -116
  21. package/src/components/nav.js +7 -60
  22. package/src/css/bundles/app.css +25 -21
  23. package/src/css/bundles/handout.css +33 -33
  24. package/src/css/bundles/slides.css +25 -25
  25. package/src/formatters/interview/shared.js +3 -3
  26. package/src/formatters/job/description.js +2 -2
  27. package/src/formatters/progress/shared.js +3 -3
  28. package/src/formatters/skill/shared.js +1 -1
  29. package/src/formatters/track/shared.js +1 -1
  30. package/src/handout.html +32 -13
  31. package/src/index.html +32 -13
  32. package/src/lib/error-boundary.js +3 -66
  33. package/src/lib/errors.js +7 -45
  34. package/src/lib/job-cache.js +1 -1
  35. package/src/lib/markdown.js +2 -109
  36. package/src/lib/reactive.js +7 -73
  37. package/src/lib/render.js +49 -197
  38. package/src/lib/router-core.js +2 -156
  39. package/src/lib/router-pages.js +2 -11
  40. package/src/lib/router-slides.js +2 -197
  41. package/src/lib/state.js +14 -63
  42. package/src/lib/utils.js +3 -10
  43. package/src/lib/yaml-loader.js +13 -71
  44. package/src/pages/agent-builder.js +1 -1
  45. package/src/pages/assessment-results.js +1 -1
  46. package/src/pages/job-builder.js +1 -1
  47. package/src/pages/job.js +1 -1
  48. package/src/pages/skill.js +1 -1
  49. package/src/slide-main.js +1 -1
  50. package/src/slides/index.js +1 -1
  51. package/src/slides/job.js +1 -1
  52. package/src/slides/overview.js +1 -1
  53. package/src/slides.html +32 -13
  54. package/src/css/base.css +0 -56
  55. package/src/css/components/badges.css +0 -232
  56. package/src/css/components/buttons.css +0 -101
  57. package/src/css/components/forms.css +0 -191
  58. package/src/css/components/layout.css +0 -218
  59. package/src/css/components/nav.css +0 -206
  60. package/src/css/components/progress.css +0 -166
  61. package/src/css/components/states.css +0 -82
  62. package/src/css/components/surfaces.css +0 -347
  63. package/src/css/components/tables.css +0 -362
  64. package/src/css/components/top-bar.css +0 -180
  65. package/src/css/components/typography.css +0 -121
  66. package/src/css/components/utilities.css +0 -41
  67. package/src/css/pages/detail.css +0 -119
  68. package/src/css/reset.css +0 -50
  69. package/src/css/tokens.css +0 -162
  70. package/src/css/views/handout.css +0 -30
  71. package/src/css/views/print.css +0 -634
  72. package/src/css/views/slide-animations.css +0 -113
  73. package/src/css/views/slide-base.css +0 -331
  74. package/src/css/views/slide-sections.css +0 -597
  75. package/src/css/views/slide-tables.css +0 -275
@@ -1,232 +0,0 @@
1
- /**
2
- * Badge Components
3
- *
4
- * All badge variants consolidated: type badges, level badges, capability badges, modifiers.
5
- */
6
-
7
- @layer components {
8
- /* Base badge - 28px height matches tool icons for consistent row heights */
9
- .badge {
10
- display: inline-flex;
11
- align-items: center;
12
- justify-content: center;
13
- height: 28px;
14
- padding: 0 var(--space-sm);
15
- border-radius: var(--radius-md);
16
- font-size: var(--font-size-xs);
17
- font-weight: 500;
18
- text-transform: uppercase;
19
- letter-spacing: 0.025em;
20
- }
21
-
22
- .badge-default {
23
- background: var(--color-primary-light);
24
- color: var(--color-primary-dark);
25
- }
26
-
27
- .badge-human-only {
28
- background: #fef3c7;
29
- color: #92400e;
30
- }
31
-
32
- /* Skill type badges */
33
- .badge-primary {
34
- background: var(--color-primary-skill-light);
35
- color: var(--color-primary-skill);
36
- }
37
-
38
- .badge-secondary {
39
- background: var(--color-secondary-light);
40
- color: #92400e;
41
- }
42
-
43
- .badge-broad {
44
- background: var(--color-broad-light);
45
- color: #047857;
46
- }
47
-
48
- .badge-negative {
49
- background: var(--color-primary-skill-light);
50
- color: var(--color-primary-skill);
51
- }
52
-
53
- /* Level badges (1-5) - consolidated definition */
54
- .badge-1,
55
- .level-badge-1 {
56
- background: var(--color-level-1);
57
- color: #991b1b;
58
- }
59
-
60
- .badge-2,
61
- .level-badge-2 {
62
- background: var(--color-level-2);
63
- color: #92400e;
64
- }
65
-
66
- .badge-3,
67
- .level-badge-3 {
68
- background: var(--color-level-3);
69
- color: #166534;
70
- }
71
-
72
- .badge-4,
73
- .level-badge-4 {
74
- background: var(--color-level-4);
75
- color: #0e7490;
76
- }
77
-
78
- .badge-5,
79
- .level-badge-5 {
80
- background: var(--color-level-5);
81
- color: #5b21b6;
82
- }
83
-
84
- /* Level badge base style - 28px height matches tool icons */
85
- .level-badge {
86
- display: inline-flex;
87
- align-items: center;
88
- justify-content: center;
89
- height: 28px;
90
- padding: 0 var(--space-sm);
91
- border-radius: var(--radius-md);
92
- font-size: var(--font-size-sm);
93
- font-weight: 500;
94
- }
95
-
96
- /* Capability badges - each capability ID maps to its own distinct color */
97
- .badge-ai {
98
- background: var(--color-cap-ai-light);
99
- color: var(--color-cap-ai);
100
- }
101
-
102
- .badge-business {
103
- background: var(--color-cap-business-light);
104
- color: var(--color-cap-business);
105
- }
106
-
107
- .badge-data {
108
- background: var(--color-cap-data-light);
109
- color: var(--color-cap-data);
110
- }
111
-
112
- .badge-delivery {
113
- background: var(--color-cap-delivery-light);
114
- color: var(--color-cap-delivery);
115
- }
116
-
117
- .badge-documentation {
118
- background: var(--color-cap-documentation-light);
119
- color: var(--color-cap-documentation);
120
- }
121
-
122
- .badge-ml {
123
- background: var(--color-cap-ml-light);
124
- color: var(--color-cap-ml);
125
- }
126
-
127
- .badge-people {
128
- background: var(--color-cap-people-light);
129
- color: var(--color-cap-people);
130
- }
131
-
132
- .badge-process {
133
- background: var(--color-cap-process-light);
134
- color: var(--color-cap-process);
135
- }
136
-
137
- .badge-product {
138
- background: var(--color-cap-product-light);
139
- color: var(--color-cap-product);
140
- }
141
-
142
- .badge-reliability {
143
- background: var(--color-cap-reliability-light);
144
- color: var(--color-cap-reliability);
145
- }
146
-
147
- .badge-scale {
148
- background: var(--color-cap-scale-light);
149
- color: var(--color-cap-scale);
150
- }
151
-
152
- /* Tool badge */
153
- .badge-tool {
154
- background: var(--color-bg);
155
- color: var(--color-text);
156
- border: 1px solid var(--color-border);
157
- font-size: 0.9rem;
158
- padding: var(--space-xs) var(--space-sm);
159
- }
160
-
161
- /* Modifier tags - 28px height matches badges and tool icons */
162
- .modifier {
163
- display: inline-flex;
164
- align-items: center;
165
- height: 28px;
166
- padding: 0 var(--space-sm);
167
- border-radius: var(--radius-sm);
168
- font-size: var(--font-size-sm);
169
- font-weight: 600;
170
- line-height: 1;
171
- }
172
-
173
- .modifier-positive {
174
- background: var(--color-level-3);
175
- color: #166534;
176
- }
177
-
178
- .modifier-negative {
179
- background: var(--color-level-1);
180
- color: #991b1b;
181
- }
182
-
183
- .modifier-neutral {
184
- background: var(--color-surface);
185
- color: var(--color-text-muted);
186
- border: 1px solid var(--color-border);
187
- }
188
-
189
- /* Info tags */
190
- .info-tags {
191
- display: flex;
192
- gap: var(--space-sm);
193
- flex-wrap: wrap;
194
- }
195
-
196
- .info-tag {
197
- display: inline-block;
198
- padding: var(--space-xs) var(--space-sm);
199
- background: var(--color-bg);
200
- border-radius: var(--radius-md);
201
- font-size: var(--font-size-sm);
202
- color: var(--color-text-muted);
203
- }
204
-
205
- /* Tool/skill badges container */
206
- .tool-badges,
207
- .skill-badges {
208
- display: flex;
209
- flex-wrap: wrap;
210
- gap: var(--space-sm);
211
- }
212
-
213
- /* Change indicators */
214
- .change-indicator {
215
- display: inline-flex;
216
- align-items: center;
217
- gap: var(--space-xs);
218
- font-weight: 500;
219
- }
220
-
221
- .change-up {
222
- color: var(--color-success);
223
- }
224
-
225
- .change-down {
226
- color: var(--color-error);
227
- }
228
-
229
- .change-same {
230
- color: var(--color-text-muted);
231
- }
232
- }
@@ -1,101 +0,0 @@
1
- /**
2
- * Button Components
3
- *
4
- * Button styles for all button variants.
5
- */
6
-
7
- @layer components {
8
- .btn {
9
- display: inline-block;
10
- padding: var(--space-sm) var(--space-lg);
11
- border: none;
12
- border-radius: var(--radius-md);
13
- font-size: var(--font-size-base);
14
- font-weight: 500;
15
- cursor: pointer;
16
- text-decoration: none;
17
- transition: all 0.2s;
18
- text-align: center;
19
- }
20
-
21
- .btn:hover {
22
- text-decoration: none;
23
- }
24
-
25
- .btn-primary {
26
- background: var(--color-primary);
27
- color: white;
28
- }
29
-
30
- .btn-primary:hover {
31
- background: var(--color-primary-dark);
32
- color: white;
33
- }
34
-
35
- .btn-secondary {
36
- background: var(--color-bg);
37
- color: var(--color-text);
38
- border: 1px solid var(--color-border);
39
- }
40
-
41
- .btn-secondary:hover {
42
- background: var(--color-border);
43
- }
44
-
45
- .btn-sm {
46
- padding: var(--space-xs) var(--space-md);
47
- font-size: var(--font-size-sm);
48
- }
49
-
50
- .btn-lg {
51
- padding: var(--space-md) var(--space-xl);
52
- font-size: var(--font-size-lg);
53
- }
54
-
55
- .btn:disabled {
56
- opacity: 0.5;
57
- cursor: not-allowed;
58
- }
59
-
60
- /* Button groups */
61
- .button-group {
62
- display: flex;
63
- gap: var(--space-sm);
64
- flex-wrap: wrap;
65
- }
66
-
67
- /* Copy button */
68
- .copy-btn {
69
- white-space: nowrap;
70
- display: inline-flex;
71
- align-items: center;
72
- gap: var(--space-sm);
73
- transition: all 0.2s ease;
74
- }
75
-
76
- .copy-btn.copied {
77
- background-color: var(--color-success);
78
- border-color: var(--color-success);
79
- }
80
-
81
- /* Download all button */
82
- .download-all-btn {
83
- width: 100%;
84
- padding: var(--space-md);
85
- font-size: var(--font-size-lg);
86
- }
87
-
88
- /* Back link */
89
- .back-link {
90
- display: inline-flex;
91
- align-items: center;
92
- gap: var(--space-xs);
93
- color: var(--color-text-muted);
94
- font-size: var(--font-size-sm);
95
- margin-bottom: var(--space-md);
96
- }
97
-
98
- .back-link:hover {
99
- color: var(--color-primary);
100
- }
101
- }
@@ -1,191 +0,0 @@
1
- /**
2
- * Form Components
3
- *
4
- * Form inputs, selects, and form groups.
5
- */
6
-
7
- @layer components {
8
- .form-group {
9
- margin-bottom: var(--space-md);
10
- }
11
-
12
- .form-label {
13
- display: block;
14
- margin-bottom: var(--space-xs);
15
- font-weight: 500;
16
- color: var(--color-text);
17
- }
18
-
19
- .form-input,
20
- .form-select {
21
- width: 100%;
22
- padding: var(--space-sm) var(--space-md);
23
- border: 1px solid var(--color-border);
24
- border-radius: var(--radius-md);
25
- font-size: var(--font-size-base);
26
- font-family: inherit;
27
- background: var(--color-surface);
28
- transition:
29
- border-color 0.2s,
30
- box-shadow 0.2s;
31
- }
32
-
33
- .form-input:focus,
34
- .form-select:focus {
35
- outline: none;
36
- border-color: var(--color-primary);
37
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
38
- }
39
-
40
- .form-select {
41
- cursor: pointer;
42
- }
43
-
44
- /* Search bar */
45
- .search-bar {
46
- display: flex;
47
- gap: var(--space-md);
48
- margin-bottom: var(--space-xl);
49
- flex-wrap: wrap;
50
- }
51
-
52
- .search-bar .form-input {
53
- flex: 1;
54
- min-width: 200px;
55
- }
56
-
57
- .search-bar .form-select {
58
- min-width: 150px;
59
- }
60
-
61
- /* Stage radio buttons */
62
- .stage-radio-group {
63
- display: flex;
64
- flex-wrap: wrap;
65
- gap: var(--space-sm);
66
- }
67
-
68
- .stage-radio-item {
69
- display: flex;
70
- align-items: center;
71
- }
72
-
73
- .stage-radio-input {
74
- position: absolute;
75
- opacity: 0;
76
- width: 0;
77
- height: 0;
78
- }
79
-
80
- .stage-radio-label {
81
- display: inline-flex;
82
- align-items: center;
83
- gap: var(--space-xs);
84
- padding: var(--space-sm) var(--space-md);
85
- background: var(--color-surface);
86
- border: 2px solid var(--color-border);
87
- border-radius: var(--radius-md);
88
- cursor: pointer;
89
- font-weight: 500;
90
- transition:
91
- border-color 0.2s ease,
92
- background-color 0.2s ease;
93
- }
94
-
95
- .stage-radio-label:hover {
96
- border-color: var(--color-primary);
97
- background: var(--color-bg);
98
- }
99
-
100
- .stage-radio-label.active {
101
- border-color: var(--color-primary);
102
- background: var(--color-primary-light, rgba(37, 99, 235, 0.1));
103
- color: var(--color-primary);
104
- }
105
-
106
- /* Code display - collapsible component for code/markdown with copy buttons */
107
- .code-display-pane {
108
- border: 1px solid var(--color-border);
109
- border-radius: var(--radius-md);
110
- background: var(--color-bg);
111
- overflow: hidden;
112
- }
113
-
114
- .code-display-summary {
115
- display: flex;
116
- align-items: center;
117
- gap: var(--space-sm);
118
- padding: var(--space-sm) var(--space-md);
119
- cursor: pointer;
120
- list-style: none;
121
- background: var(--color-surface);
122
- border-bottom: 1px solid transparent;
123
- }
124
-
125
- .code-display-summary::-webkit-details-marker {
126
- display: none;
127
- }
128
-
129
- .code-display-summary::before {
130
- content: "▸";
131
- font-size: var(--font-size-xs);
132
- color: var(--color-text-muted);
133
- flex-shrink: 0;
134
- }
135
-
136
- .code-display-pane[open] > .code-display-summary {
137
- border-bottom-color: var(--color-border);
138
- }
139
-
140
- .code-display-pane[open] > .code-display-summary::before {
141
- content: "▾";
142
- }
143
-
144
- .code-display-summary .code-display-filename {
145
- flex: 1;
146
- min-width: 0;
147
- overflow: hidden;
148
- text-overflow: ellipsis;
149
- white-space: nowrap;
150
- }
151
-
152
- .code-display-summary .button-group {
153
- flex-shrink: 0;
154
- }
155
-
156
- .code-display-body {
157
- padding: var(--space-sm) var(--space-md) var(--space-md);
158
- }
159
-
160
- .code-display-body .text-muted {
161
- margin: 0 0 var(--space-sm);
162
- }
163
-
164
- .code-display-filename {
165
- font-family: var(--font-family-mono);
166
- font-size: var(--font-size-xs);
167
- color: var(--color-text-muted);
168
- }
169
-
170
- .code-display {
171
- width: 100%;
172
- margin: 0;
173
- padding: var(--space-md);
174
- font-family: var(--font-family-mono);
175
- font-size: var(--font-size-xs);
176
- line-height: 1.6;
177
- background-color: var(--color-surface);
178
- border: 1px solid var(--color-border);
179
- border-radius: var(--radius-md);
180
- overflow: auto;
181
- color: var(--color-text);
182
- white-space: pre-wrap;
183
- word-wrap: break-word;
184
- }
185
-
186
- .code-display code {
187
- background: transparent;
188
- padding: 0;
189
- color: inherit;
190
- }
191
- }
@@ -1,218 +0,0 @@
1
- /**
2
- * Layout Utilities
3
- *
4
- * Stack, flex, and grid utilities for consistent layouts.
5
- */
6
-
7
- @layer components {
8
- /* App container */
9
- #app {
10
- min-height: 100vh;
11
- }
12
-
13
- #app-content {
14
- flex: 1;
15
- max-width: var(--max-width);
16
- width: 100%;
17
- margin: 0 auto;
18
- padding: var(--space-lg);
19
- }
20
-
21
- /* Stack - vertical flex container with gap */
22
- .stack {
23
- display: flex;
24
- flex-direction: column;
25
- }
26
-
27
- .stack-xs {
28
- gap: var(--space-xs);
29
- }
30
-
31
- .stack-sm {
32
- gap: var(--space-sm);
33
- }
34
-
35
- .stack-md {
36
- gap: var(--space-md);
37
- }
38
-
39
- .stack-lg {
40
- gap: var(--space-lg);
41
- }
42
-
43
- .stack-xl {
44
- gap: var(--space-xl);
45
- }
46
-
47
- /* Flex utilities */
48
- .flex-between {
49
- display: flex;
50
- justify-content: space-between;
51
- align-items: center;
52
- }
53
-
54
- .flex-center {
55
- display: flex;
56
- align-items: center;
57
- justify-content: center;
58
- }
59
-
60
- .flex-start {
61
- display: flex;
62
- align-items: flex-start;
63
- }
64
-
65
- .flex-wrap {
66
- flex-wrap: wrap;
67
- }
68
-
69
- .flex-gap-sm {
70
- gap: var(--space-sm);
71
- }
72
-
73
- .flex-gap-md {
74
- gap: var(--space-md);
75
- }
76
-
77
- .flex-gap-lg {
78
- gap: var(--space-lg);
79
- }
80
-
81
- /* Fixed column grids */
82
- .grid {
83
- display: grid;
84
- gap: var(--space-lg);
85
- }
86
-
87
- .grid-2 {
88
- grid-template-columns: repeat(2, 1fr);
89
- }
90
-
91
- .grid-3 {
92
- grid-template-columns: repeat(3, 1fr);
93
- }
94
-
95
- .grid-4 {
96
- grid-template-columns: repeat(4, 1fr);
97
- }
98
-
99
- .grid-6 {
100
- grid-template-columns: repeat(6, 1fr);
101
- }
102
-
103
- /* Auto-fit grids - responsive grids that automatically adjust column count */
104
- .auto-grid-xs {
105
- display: grid;
106
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
107
- gap: var(--space-md);
108
- }
109
-
110
- .auto-grid-sm {
111
- display: grid;
112
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
113
- gap: var(--space-md);
114
- }
115
-
116
- .auto-grid-md {
117
- display: grid;
118
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
119
- gap: var(--space-lg);
120
- }
121
-
122
- .auto-grid-lg {
123
- display: grid;
124
- grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
125
- gap: var(--space-xl);
126
- }
127
-
128
- /* Gap modifiers */
129
- .gap-sm {
130
- gap: var(--space-sm);
131
- }
132
-
133
- .gap-md {
134
- gap: var(--space-md);
135
- }
136
-
137
- .gap-lg {
138
- gap: var(--space-lg);
139
- }
140
-
141
- .gap-xl {
142
- gap: var(--space-xl);
143
- }
144
-
145
- /* Two-column layout */
146
- .two-columns {
147
- display: grid;
148
- grid-template-columns: 1fr 1fr;
149
- gap: var(--space-xl);
150
- }
151
-
152
- /* Content columns */
153
- .content-columns {
154
- display: grid;
155
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
156
- gap: var(--space-md);
157
- }
158
-
159
- /* Print-optimized two-column layout */
160
- .print-columns {
161
- display: grid;
162
- grid-template-columns: 1fr 1fr;
163
- gap: var(--space-lg);
164
- align-items: start;
165
- }
166
-
167
- .print-columns > .section-detail,
168
- .print-columns > .section {
169
- margin-top: 0;
170
- margin-bottom: 0;
171
- }
172
-
173
- @media (max-width: 1280px) {
174
- .grid-3 {
175
- grid-template-columns: repeat(2, 1fr);
176
- }
177
-
178
- .grid-4 {
179
- grid-template-columns: repeat(2, 1fr);
180
- }
181
-
182
- .grid-6 {
183
- grid-template-columns: repeat(3, 1fr);
184
- }
185
- }
186
-
187
- @media (max-width: 768px) {
188
- .two-columns {
189
- grid-template-columns: 1fr;
190
- }
191
-
192
- .print-columns {
193
- grid-template-columns: 1fr;
194
- }
195
- }
196
-
197
- @media (max-width: 640px) {
198
- .grid-2 {
199
- grid-template-columns: 1fr;
200
- }
201
-
202
- .grid-3 {
203
- grid-template-columns: 1fr;
204
- }
205
-
206
- .grid-4 {
207
- grid-template-columns: repeat(2, 1fr);
208
- }
209
-
210
- .grid-6 {
211
- grid-template-columns: repeat(2, 1fr);
212
- }
213
-
214
- .auto-grid-lg {
215
- grid-template-columns: 1fr;
216
- }
217
- }
218
- }