@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,206 +0,0 @@
1
- /**
2
- * Navigation Drawer
3
- *
4
- * Left-hand drawer with vertically stacked links, toggled by top bar button.
5
- * Open by default on desktop, overlays on mobile.
6
- */
7
-
8
- @layer components {
9
- /* --------------------------------------------------------------------------
10
- Drawer Panel
11
- -------------------------------------------------------------------------- */
12
- #app-drawer {
13
- position: fixed;
14
- top: var(--top-bar-height);
15
- left: 0;
16
- bottom: 0;
17
- width: var(--drawer-width);
18
- background: var(--color-surface);
19
- border-right: 1px solid var(--color-border);
20
- z-index: 100;
21
- overflow-y: auto;
22
- display: flex;
23
- flex-direction: column;
24
- transform: translateX(calc(-1 * var(--drawer-width)));
25
- transition: transform 0.3s ease;
26
- }
27
-
28
- .drawer-open #app-drawer {
29
- transform: translateX(0);
30
- }
31
-
32
- /* --------------------------------------------------------------------------
33
- Drawer Header - brand area
34
- -------------------------------------------------------------------------- */
35
- .drawer-header {
36
- padding: var(--space-lg) var(--space-md);
37
- border-bottom: 1px solid var(--color-border);
38
- flex-shrink: 0;
39
- }
40
-
41
- .nav-brand {
42
- display: flex;
43
- flex-direction: column;
44
- align-items: center;
45
- gap: var(--space-xs);
46
- text-decoration: none;
47
- color: var(--color-text);
48
- }
49
-
50
- .brand-emoji {
51
- font-size: 2.5rem;
52
- line-height: 1;
53
- }
54
-
55
- .nav-brand:hover {
56
- text-decoration: none;
57
- }
58
-
59
- .brand-title {
60
- font-size: var(--font-size-lg);
61
- font-weight: 700;
62
- color: var(--color-text);
63
- }
64
-
65
- .nav-brand:hover .brand-title {
66
- color: var(--color-primary);
67
- }
68
-
69
- .brand-tag {
70
- display: inline-block;
71
- font-size: var(--font-size-xs);
72
- font-weight: 600;
73
- letter-spacing: 0.5px;
74
- padding: 2px 8px;
75
- border-radius: 9999px;
76
- background: linear-gradient(135deg, #f472b6 0%, #a78bfa 50%, #38bdf8 100%);
77
- background-size: 200% 200%;
78
- color: white;
79
- animation: gradient-shift 6s ease infinite;
80
- opacity: 0.9;
81
- transition:
82
- opacity 0.2s,
83
- transform 0.2s;
84
- cursor: default;
85
- }
86
-
87
- .brand-tag:hover {
88
- opacity: 1;
89
- transform: scale(1.05);
90
- }
91
-
92
- @keyframes gradient-shift {
93
- 0%,
94
- 100% {
95
- background-position: 0% 50%;
96
- }
97
- 50% {
98
- background-position: 100% 50%;
99
- }
100
- }
101
-
102
- /* --------------------------------------------------------------------------
103
- Drawer Navigation - sections and links
104
- -------------------------------------------------------------------------- */
105
- .drawer-nav {
106
- flex: 1;
107
- overflow-y: auto;
108
- padding: var(--space-sm) 0;
109
- }
110
-
111
- .drawer-section {
112
- display: flex;
113
- flex-direction: column;
114
- padding: var(--space-sm) 0;
115
- }
116
-
117
- .drawer-section + .drawer-section {
118
- border-top: 1px solid var(--color-border);
119
- }
120
-
121
- .drawer-section-label {
122
- font-size: var(--font-size-xs);
123
- font-weight: 600;
124
- text-transform: uppercase;
125
- letter-spacing: 0.05em;
126
- color: var(--color-text-light);
127
- padding: var(--space-xs) var(--space-md);
128
- margin-bottom: var(--space-xs);
129
- }
130
-
131
- .drawer-nav a {
132
- display: block;
133
- color: var(--color-text-muted);
134
- font-weight: 500;
135
- font-size: var(--font-size-sm);
136
- padding: var(--space-xs) var(--space-md);
137
- text-decoration: none;
138
- transition: all 0.15s;
139
- border-left: 3px solid transparent;
140
- }
141
-
142
- .drawer-nav a:hover {
143
- color: var(--color-primary);
144
- background: rgba(59, 130, 246, 0.06);
145
- border-left-color: var(--color-primary-light);
146
- text-decoration: none;
147
- }
148
-
149
- .drawer-nav a.active {
150
- color: var(--color-primary);
151
- background: rgba(59, 130, 246, 0.1);
152
- border-left-color: var(--color-primary);
153
- font-weight: 600;
154
- }
155
-
156
- /* CTA links in drawer */
157
- .drawer-cta {
158
- color: var(--color-primary) !important;
159
- font-weight: 600 !important;
160
- }
161
-
162
- .drawer-cta:hover {
163
- background: rgba(59, 130, 246, 0.1) !important;
164
- }
165
-
166
- /* --------------------------------------------------------------------------
167
- App Body - content area that shifts with drawer
168
- -------------------------------------------------------------------------- */
169
- .app-body {
170
- min-height: 100vh;
171
- display: flex;
172
- flex-direction: column;
173
- transition: margin-left 0.3s ease;
174
- }
175
-
176
- .drawer-open .app-body {
177
- margin-left: var(--drawer-width);
178
- }
179
-
180
- /* --------------------------------------------------------------------------
181
- Drawer Overlay - backdrop on mobile when drawer is open
182
- -------------------------------------------------------------------------- */
183
- .drawer-overlay {
184
- display: none;
185
- position: fixed;
186
- top: var(--top-bar-height);
187
- left: 0;
188
- right: 0;
189
- bottom: 0;
190
- background: rgba(0, 0, 0, 0.3);
191
- z-index: 90;
192
- }
193
-
194
- /* --------------------------------------------------------------------------
195
- Mobile - overlay instead of push
196
- -------------------------------------------------------------------------- */
197
- @media (max-width: 768px) {
198
- .drawer-open .app-body {
199
- margin-left: 0;
200
- }
201
-
202
- .drawer-open .drawer-overlay {
203
- display: block;
204
- }
205
- }
206
- }
@@ -1,166 +0,0 @@
1
- /**
2
- * Progress Indicators
3
- *
4
- * Level dots, bars, and progress indicators - consolidated definition.
5
- */
6
-
7
- @layer components {
8
- /* Level bar */
9
- .level-bar {
10
- display: flex;
11
- gap: 6px;
12
- align-items: center;
13
- }
14
-
15
- /* Level dot base */
16
- .level-dot {
17
- width: 14px;
18
- height: 14px;
19
- border-radius: 50%;
20
- background: rgba(226, 232, 240, 0.5);
21
- border: 2px solid rgba(203, 213, 225, 0.8);
22
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
23
- position: relative;
24
- }
25
-
26
- .level-dot:hover {
27
- transform: scale(1.2);
28
- }
29
-
30
- .level-dot.filled {
31
- background: var(--color-primary);
32
- }
33
-
34
- /* Level dot colors by level */
35
- .level-dot.filled.level-1 {
36
- background: linear-gradient(135deg, #fecaca, #fca5a5);
37
- border-color: #f87171;
38
- box-shadow:
39
- 0 2px 8px rgba(239, 68, 68, 0.4),
40
- inset 0 1px 2px rgba(255, 255, 255, 0.5);
41
- }
42
-
43
- .level-dot.filled.level-2 {
44
- background: linear-gradient(135deg, #fde68a, #fcd34d);
45
- border-color: #fbbf24;
46
- box-shadow:
47
- 0 2px 8px rgba(245, 158, 11, 0.4),
48
- inset 0 1px 2px rgba(255, 255, 255, 0.5);
49
- }
50
-
51
- .level-dot.filled.level-3 {
52
- background: linear-gradient(135deg, #bbf7d0, #86efac);
53
- border-color: #34d399;
54
- box-shadow:
55
- 0 2px 8px rgba(16, 185, 129, 0.4),
56
- inset 0 1px 2px rgba(255, 255, 255, 0.5);
57
- }
58
-
59
- .level-dot.filled.level-4 {
60
- background: linear-gradient(135deg, #a5f3fc, #67e8f9);
61
- border-color: #22d3ee;
62
- box-shadow:
63
- 0 2px 8px rgba(6, 182, 212, 0.4),
64
- inset 0 1px 2px rgba(255, 255, 255, 0.5);
65
- }
66
-
67
- .level-dot.filled.level-5 {
68
- background: linear-gradient(135deg, #c4b5fd, #a78bfa);
69
- border-color: #a78bfa;
70
- box-shadow:
71
- 0 2px 8px rgba(139, 92, 246, 0.4),
72
- inset 0 1px 2px rgba(255, 255, 255, 0.5);
73
- }
74
-
75
- /* Level dots for compact display (no animation) */
76
- .level-dots {
77
- display: inline-flex;
78
- gap: var(--space-xs);
79
- }
80
-
81
- .level-dots .level-dot {
82
- width: 14px;
83
- height: 14px;
84
- border-radius: 50%;
85
- background: var(--color-border);
86
- }
87
-
88
- .level-dots .level-dot.filled {
89
- background: var(--color-primary);
90
- }
91
-
92
- /* Level cell */
93
- .level-cell {
94
- position: relative;
95
- }
96
-
97
- .level-label {
98
- display: block;
99
- margin-top: 4px;
100
- font-size: var(--font-size-xs);
101
- font-weight: 500;
102
- color: var(--color-text-muted);
103
- transition: color 0.3s;
104
- }
105
-
106
- .level-cell:hover .level-label {
107
- background: linear-gradient(135deg, #3b82f6, #9333ea);
108
- -webkit-background-clip: text;
109
- -webkit-text-fill-color: transparent;
110
- background-clip: text;
111
- }
112
-
113
- /* Progress bar */
114
- .progress-bar {
115
- height: 8px;
116
- background: var(--color-border);
117
- border-radius: var(--radius-sm);
118
- overflow: hidden;
119
- }
120
-
121
- .progress-bar-fill {
122
- height: 100%;
123
- background: var(--color-primary);
124
- border-radius: var(--radius-sm);
125
- transition: width 0.3s;
126
- }
127
-
128
- /* Stats */
129
- .stat-grid {
130
- display: grid;
131
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
132
- gap: var(--space-md);
133
- }
134
-
135
- .stat-item {
136
- background: var(--color-bg);
137
- padding: var(--space-md);
138
- border-radius: var(--radius-md);
139
- text-align: center;
140
- }
141
-
142
- .stats {
143
- display: flex;
144
- gap: var(--space-lg);
145
- margin-bottom: var(--space-xl);
146
- flex-wrap: wrap;
147
- }
148
-
149
- .stat {
150
- flex: 1;
151
- min-width: 120px;
152
- text-align: center;
153
- padding: var(--space-md);
154
- background: var(--color-surface);
155
- border-radius: var(--radius-md);
156
- border: 1px solid var(--color-border);
157
- }
158
-
159
- .stat-value {
160
- font-size: var(--font-size-3xl);
161
- font-weight: 700;
162
- color: var(--color-primary);
163
- display: block;
164
- margin-bottom: var(--space-xs);
165
- }
166
- }
@@ -1,82 +0,0 @@
1
- /**
2
- * State Components
3
- *
4
- * Loading, error, and empty states.
5
- */
6
-
7
- @layer components {
8
- /* Loading state */
9
- .loading {
10
- display: flex;
11
- flex-direction: column;
12
- align-items: center;
13
- justify-content: center;
14
- padding: var(--space-2xl);
15
- color: var(--color-text-muted);
16
- }
17
-
18
- .loading-spinner {
19
- width: 40px;
20
- height: 40px;
21
- border: 3px solid var(--color-border);
22
- border-top-color: var(--color-primary);
23
- border-radius: 50%;
24
- animation: spin 0.8s linear infinite;
25
- margin-bottom: var(--space-md);
26
- }
27
-
28
- @keyframes spin {
29
- to {
30
- transform: rotate(360deg);
31
- }
32
- }
33
-
34
- /* Error state */
35
- .error-message {
36
- background: #fef2f2;
37
- border: 1px solid #fecaca;
38
- border-radius: var(--radius-lg);
39
- padding: var(--space-xl);
40
- text-align: center;
41
- color: var(--color-error);
42
- }
43
-
44
- /* Empty state */
45
- .empty-state {
46
- text-align: center;
47
- padding: var(--space-2xl);
48
- color: var(--color-text-muted);
49
- }
50
-
51
- .empty-state-icon {
52
- font-size: 3rem;
53
- margin-bottom: var(--space-md);
54
- opacity: 0.5;
55
- }
56
-
57
- .empty-state-title {
58
- font-size: var(--font-size-lg);
59
- font-weight: 600;
60
- margin-bottom: var(--space-sm);
61
- color: var(--color-text);
62
- }
63
-
64
- .empty-state-message {
65
- margin: 0;
66
- }
67
-
68
- /* Not found state */
69
- .not-found {
70
- text-align: center;
71
- padding: var(--space-2xl);
72
- }
73
-
74
- .not-found h1 {
75
- font-size: var(--font-size-3xl);
76
- color: var(--color-text-muted);
77
- }
78
-
79
- .not-found-actions {
80
- margin-top: var(--space-xl);
81
- }
82
- }