@forwardimpact/pathway 0.21.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 (123) hide show
  1. package/README.md +3 -3
  2. package/bin/fit-pathway.js +22 -22
  3. package/package.json +4 -3
  4. package/src/commands/agent.js +14 -10
  5. package/src/commands/behaviour.js +11 -1
  6. package/src/commands/build.js +11 -2
  7. package/src/commands/command-factory.js +4 -2
  8. package/src/commands/dev.js +9 -2
  9. package/src/commands/discipline.js +19 -2
  10. package/src/commands/driver.js +11 -1
  11. package/src/commands/index.js +1 -1
  12. package/src/commands/init.js +1 -1
  13. package/src/commands/interview.js +8 -8
  14. package/src/commands/job.js +41 -28
  15. package/src/commands/level.js +76 -0
  16. package/src/commands/progress.js +20 -20
  17. package/src/commands/questions.js +3 -3
  18. package/src/commands/skill.js +11 -1
  19. package/src/commands/stage.js +11 -1
  20. package/src/commands/tool.js +4 -3
  21. package/src/commands/track.js +11 -1
  22. package/src/components/action-buttons.js +3 -3
  23. package/src/components/builder.js +25 -25
  24. package/src/components/card.js +8 -104
  25. package/src/components/comparison-radar.js +4 -4
  26. package/src/components/detail.js +18 -120
  27. package/src/components/error-page.js +8 -68
  28. package/src/components/grid.js +12 -106
  29. package/src/components/list.js +7 -116
  30. package/src/components/nav.js +7 -60
  31. package/src/components/radar-chart.js +3 -3
  32. package/src/components/skill-matrix.js +7 -7
  33. package/src/css/bundles/app.css +25 -21
  34. package/src/css/bundles/handout.css +33 -33
  35. package/src/css/bundles/slides.css +25 -25
  36. package/src/css/pages/landing.css +5 -5
  37. package/src/formatters/index.js +5 -5
  38. package/src/formatters/interview/shared.js +23 -23
  39. package/src/formatters/job/description.js +18 -18
  40. package/src/formatters/job/dom.js +12 -12
  41. package/src/formatters/job/markdown.js +7 -7
  42. package/src/formatters/json-ld.js +24 -24
  43. package/src/formatters/{grade → level}/dom.js +31 -27
  44. package/src/formatters/{grade → level}/markdown.js +19 -28
  45. package/src/formatters/{grade → level}/microdata.js +28 -38
  46. package/src/formatters/level/shared.js +86 -0
  47. package/src/formatters/progress/markdown.js +2 -2
  48. package/src/formatters/progress/shared.js +51 -51
  49. package/src/formatters/questions/markdown.js +8 -6
  50. package/src/formatters/questions/shared.js +7 -7
  51. package/src/formatters/skill/dom.js +4 -4
  52. package/src/formatters/skill/markdown.js +1 -1
  53. package/src/formatters/skill/microdata.js +3 -3
  54. package/src/formatters/skill/shared.js +3 -3
  55. package/src/formatters/track/shared.js +1 -1
  56. package/src/handout-main.js +12 -12
  57. package/src/handout.html +32 -13
  58. package/src/index.html +33 -14
  59. package/src/lib/card-mappers.js +16 -16
  60. package/src/lib/cli-command.js +3 -3
  61. package/src/lib/cli-output.js +2 -2
  62. package/src/lib/error-boundary.js +3 -66
  63. package/src/lib/errors.js +7 -45
  64. package/src/lib/job-cache.js +12 -12
  65. package/src/lib/markdown.js +2 -109
  66. package/src/lib/reactive.js +7 -73
  67. package/src/lib/render.js +53 -201
  68. package/src/lib/router-core.js +2 -156
  69. package/src/lib/router-pages.js +2 -11
  70. package/src/lib/router-slides.js +2 -197
  71. package/src/lib/state.js +16 -65
  72. package/src/lib/utils.js +3 -10
  73. package/src/lib/yaml-loader.js +22 -80
  74. package/src/main.js +10 -10
  75. package/src/pages/agent-builder.js +12 -12
  76. package/src/pages/assessment-results.js +28 -24
  77. package/src/pages/interview-builder.js +6 -6
  78. package/src/pages/interview.js +8 -8
  79. package/src/pages/job-builder.js +7 -7
  80. package/src/pages/job.js +8 -8
  81. package/src/pages/landing.js +8 -8
  82. package/src/pages/level.js +122 -0
  83. package/src/pages/progress-builder.js +8 -8
  84. package/src/pages/progress.js +74 -74
  85. package/src/pages/self-assessment.js +7 -7
  86. package/src/pages/skill.js +1 -1
  87. package/src/slide-main.js +23 -23
  88. package/src/slides/chapter.js +4 -4
  89. package/src/slides/index.js +11 -11
  90. package/src/slides/interview.js +2 -2
  91. package/src/slides/job.js +4 -4
  92. package/src/slides/level.js +32 -0
  93. package/src/slides/overview.js +10 -10
  94. package/src/slides/progress.js +13 -13
  95. package/src/slides.html +32 -13
  96. package/src/types.js +1 -1
  97. package/templates/job.template.md +2 -2
  98. package/src/commands/grade.js +0 -60
  99. package/src/css/base.css +0 -56
  100. package/src/css/components/badges.css +0 -232
  101. package/src/css/components/buttons.css +0 -101
  102. package/src/css/components/forms.css +0 -191
  103. package/src/css/components/layout.css +0 -218
  104. package/src/css/components/nav.css +0 -206
  105. package/src/css/components/progress.css +0 -166
  106. package/src/css/components/states.css +0 -82
  107. package/src/css/components/surfaces.css +0 -347
  108. package/src/css/components/tables.css +0 -362
  109. package/src/css/components/top-bar.css +0 -180
  110. package/src/css/components/typography.css +0 -121
  111. package/src/css/components/utilities.css +0 -41
  112. package/src/css/pages/detail.css +0 -119
  113. package/src/css/reset.css +0 -50
  114. package/src/css/tokens.css +0 -162
  115. package/src/css/views/handout.css +0 -30
  116. package/src/css/views/print.css +0 -634
  117. package/src/css/views/slide-animations.css +0 -113
  118. package/src/css/views/slide-base.css +0 -331
  119. package/src/css/views/slide-sections.css +0 -597
  120. package/src/css/views/slide-tables.css +0 -275
  121. package/src/formatters/grade/shared.js +0 -86
  122. package/src/pages/grade.js +0 -122
  123. package/src/slides/grade.js +0 -32
@@ -1,113 +0,0 @@
1
- /**
2
- * Slide Animations
3
- *
4
- * All animation keyframes for slide views - consolidated definition.
5
- */
6
-
7
- @layer slides {
8
- /* Background gradient animation */
9
- @keyframes gradientShift {
10
- 0%,
11
- 100% {
12
- background-position: 0% 50%;
13
- }
14
- 50% {
15
- background-position: 100% 50%;
16
- }
17
- }
18
-
19
- /* Brand tag gradient animation */
20
- @keyframes gradient-shift {
21
- 0%,
22
- 100% {
23
- background-position: 0% 50%;
24
- }
25
- 50% {
26
- background-position: 100% 50%;
27
- }
28
- }
29
-
30
- /* Loading pulse */
31
- @keyframes pulse {
32
- 0%,
33
- 100% {
34
- opacity: 1;
35
- }
36
- 50% {
37
- opacity: 0.5;
38
- }
39
- }
40
-
41
- /* Header shimmer effect */
42
- @keyframes shimmer {
43
- 0% {
44
- left: -100%;
45
- }
46
- 100% {
47
- left: 100%;
48
- }
49
- }
50
-
51
- /* Title fade in and scale */
52
- @keyframes fadeInScale {
53
- from {
54
- opacity: 0;
55
- transform: scale(0.95);
56
- }
57
- to {
58
- opacity: 1;
59
- transform: scale(1);
60
- }
61
- }
62
-
63
- /* Badge pop in */
64
- @keyframes badgePopIn {
65
- 0% {
66
- opacity: 0;
67
- transform: scale(0) rotate(-12deg);
68
- }
69
- 60% {
70
- transform: scale(1.1) rotate(2deg);
71
- }
72
- 100% {
73
- opacity: 1;
74
- transform: scale(1) rotate(0deg);
75
- }
76
- }
77
-
78
- /* Dot fill animation */
79
- @keyframes dotFillUp {
80
- 0% {
81
- transform: scale(0.3);
82
- opacity: 0;
83
- }
84
- 50% {
85
- transform: scale(1.15);
86
- }
87
- 100% {
88
- transform: scale(1);
89
- opacity: 1;
90
- }
91
- }
92
-
93
- /* Dot pulse animation */
94
- @keyframes dotPulse {
95
- 0%,
96
- 100% {
97
- transform: scale(1);
98
- }
99
- 50% {
100
- transform: scale(1.08);
101
- }
102
- }
103
-
104
- /* Fade in animation */
105
- @keyframes fadeIn {
106
- from {
107
- opacity: 0;
108
- }
109
- to {
110
- opacity: 1;
111
- }
112
- }
113
- }
@@ -1,331 +0,0 @@
1
- /**
2
- * Slide View Base Styles
3
- *
4
- * Base styles for the slide view layout and navigation.
5
- */
6
-
7
- @layer slides {
8
- .slide-view {
9
- max-width: 1400px;
10
- margin: 0 auto;
11
- padding: var(--space-xl);
12
- background: linear-gradient(
13
- 135deg,
14
- #ffffff 0%,
15
- #f8fafc 25%,
16
- #f1f5f9 50%,
17
- #f8fafc 75%,
18
- #ffffff 100%
19
- );
20
- background-size: 400% 400%;
21
- animation: gradientShift 15s ease infinite;
22
- min-height: 100vh;
23
- position: relative;
24
- }
25
-
26
- .slide-view::before {
27
- content: "";
28
- position: fixed;
29
- top: 0;
30
- left: 0;
31
- right: 0;
32
- height: 300px;
33
- background: radial-gradient(
34
- ellipse at top,
35
- rgba(59, 130, 246, 0.08) 0%,
36
- rgba(147, 51, 234, 0.05) 40%,
37
- transparent 70%
38
- );
39
- pointer-events: none;
40
- z-index: 0;
41
- }
42
-
43
- .slide-view main {
44
- padding-bottom: 5rem; /* Account for fixed nav */
45
- position: relative;
46
- z-index: 1;
47
- }
48
-
49
- /* Loading state */
50
- .slide-loading {
51
- display: flex;
52
- align-items: center;
53
- justify-content: center;
54
- min-height: 200px;
55
- font-size: var(--font-size-lg);
56
- background: linear-gradient(135deg, #3b82f6, #9333ea);
57
- -webkit-background-clip: text;
58
- -webkit-text-fill-color: transparent;
59
- background-clip: text;
60
- font-weight: 600;
61
- animation: pulse 2s ease-in-out infinite;
62
- }
63
-
64
- .slide-loading.hidden {
65
- display: none;
66
- }
67
-
68
- /* Navigation */
69
- .slide-nav {
70
- position: fixed;
71
- bottom: 0;
72
- left: 0;
73
- right: 0;
74
- display: flex;
75
- align-items: center;
76
- justify-content: center;
77
- gap: var(--space-xl);
78
- padding: var(--space-md);
79
- background: rgba(255, 255, 255, 0.85);
80
- backdrop-filter: blur(20px) saturate(180%);
81
- -webkit-backdrop-filter: blur(20px) saturate(180%);
82
- border-top: 1px solid rgba(59, 130, 246, 0.15);
83
- box-shadow:
84
- 0 -4px 20px rgba(59, 130, 246, 0.08),
85
- 0 -1px 4px rgba(147, 51, 234, 0.05);
86
- z-index: 100;
87
- }
88
-
89
- .slide-nav-btn {
90
- padding: var(--space-sm) var(--space-md);
91
- border: 1px solid transparent;
92
- border-radius: var(--radius-md);
93
- background:
94
- linear-gradient(white, white) padding-box,
95
- linear-gradient(135deg, rgba(59, 130, 246, 0.3), rgba(147, 51, 234, 0.3))
96
- border-box;
97
- color: var(--color-text);
98
- cursor: pointer;
99
- font-size: var(--font-size-sm);
100
- font-family: inherit;
101
- font-weight: 500;
102
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
103
- box-shadow: 0 2px 8px rgba(59, 130, 246, 0.1);
104
- position: relative;
105
- overflow: hidden;
106
- }
107
-
108
- .slide-nav-btn::before {
109
- content: "";
110
- position: absolute;
111
- top: 0;
112
- left: -100%;
113
- width: 100%;
114
- height: 100%;
115
- background: linear-gradient(
116
- 90deg,
117
- transparent,
118
- rgba(255, 255, 255, 0.3),
119
- transparent
120
- );
121
- transition: left 0.5s;
122
- }
123
-
124
- .slide-nav-btn:hover:not(:disabled)::before {
125
- left: 100%;
126
- }
127
-
128
- .slide-nav-btn:hover:not(:disabled) {
129
- background: linear-gradient(135deg, #3b82f6, #9333ea);
130
- color: white;
131
- transform: translateY(-1px);
132
- box-shadow:
133
- 0 4px 16px rgba(59, 130, 246, 0.3),
134
- 0 2px 8px rgba(147, 51, 234, 0.2);
135
- }
136
-
137
- .slide-nav-btn:disabled {
138
- opacity: 0.4;
139
- cursor: not-allowed;
140
- background: rgba(248, 250, 252, 0.5);
141
- box-shadow: none;
142
- }
143
-
144
- .slide-nav-chapter {
145
- min-width: 44px;
146
- padding: var(--space-sm);
147
- font-size: var(--font-size-md);
148
- aspect-ratio: 1;
149
- }
150
-
151
- .slide-indicator {
152
- font-size: var(--font-size-sm);
153
- color: var(--color-text-muted);
154
- font-weight: 500;
155
- background: linear-gradient(135deg, #3b82f6, #9333ea);
156
- -webkit-background-clip: text;
157
- -webkit-text-fill-color: transparent;
158
- background-clip: text;
159
- min-width: 80px;
160
- text-align: center;
161
- }
162
-
163
- /* Page header */
164
- .slide-view .page-header {
165
- border-bottom: 2px solid transparent;
166
- border-image: linear-gradient(
167
- 90deg,
168
- rgba(59, 130, 246, 0.3),
169
- rgba(147, 51, 234, 0.3),
170
- rgba(59, 130, 246, 0.3)
171
- )
172
- 1;
173
- margin-bottom: var(--space-xl);
174
- padding-bottom: var(--space-lg);
175
- background: linear-gradient(
176
- 135deg,
177
- rgba(255, 255, 255, 0.9) 0%,
178
- rgba(248, 250, 252, 0.8) 100%
179
- );
180
- backdrop-filter: blur(10px);
181
- border-radius: var(--radius-lg);
182
- padding: var(--space-lg);
183
- box-shadow:
184
- 0 4px 20px rgba(59, 130, 246, 0.08),
185
- 0 2px 8px rgba(147, 51, 234, 0.05);
186
- position: relative;
187
- overflow: hidden;
188
- }
189
-
190
- .slide-view .page-header::before {
191
- content: "";
192
- position: absolute;
193
- top: 0;
194
- left: -100%;
195
- width: 200%;
196
- height: 100%;
197
- background: linear-gradient(
198
- 90deg,
199
- transparent,
200
- rgba(59, 130, 246, 0.03),
201
- transparent
202
- );
203
- animation: shimmer 3s infinite;
204
- }
205
-
206
- .slide-view .page-title {
207
- font-size: var(--font-size-3xl);
208
- font-weight: 700;
209
- margin: 0 0 var(--space-sm);
210
- color: var(--color-text);
211
- position: relative;
212
- animation: fadeInScale 0.6s cubic-bezier(0.4, 0, 0.2, 1);
213
- }
214
-
215
- .slide-view .page-title .gradient-text {
216
- background: linear-gradient(135deg, #1e40af, #7c3aed);
217
- -webkit-background-clip: text;
218
- -webkit-text-fill-color: transparent;
219
- background-clip: text;
220
- }
221
-
222
- .slide-view .page-description {
223
- font-size: var(--font-size-lg);
224
- color: var(--color-text-muted);
225
- max-width: 80ch;
226
- margin: 0;
227
- position: relative;
228
- }
229
-
230
- .slide-view .page-meta {
231
- display: flex;
232
- gap: var(--space-md);
233
- margin-top: var(--space-md);
234
- flex-wrap: wrap;
235
- position: relative;
236
- }
237
-
238
- /* Hide elements in slide mode */
239
- .slide-view .nav,
240
- .slide-view .page-actions,
241
- .slide-view footer,
242
- .slide-view .action-buttons,
243
- .slide-view .back-link,
244
- .slide-view #app-drawer,
245
- .slide-view .top-bar,
246
- .slide-view #app-footer {
247
- display: none !important;
248
- }
249
-
250
- /* Hide job description HTML on screen - only show when printing */
251
- .slide-view .job-description-print-section {
252
- display: none;
253
- }
254
-
255
- /* Page brand header */
256
- .page-brand-header {
257
- display: flex;
258
- align-items: center;
259
- justify-content: space-between;
260
- padding: var(--space-sm) var(--space-lg);
261
- margin-bottom: var(--space-lg);
262
- border-bottom: 1px solid var(--color-border);
263
- }
264
-
265
- .page-brand-header .brand-title {
266
- font-size: var(--font-size-sm);
267
- font-weight: 600;
268
- color: var(--color-text-muted);
269
- }
270
-
271
- .page-brand-header .brand-tag {
272
- font-size: var(--font-size-xs);
273
- font-weight: 600;
274
- letter-spacing: 0.5px;
275
- padding: 2px 8px;
276
- border-radius: 9999px;
277
- background: linear-gradient(135deg, #f472b6 0%, #a78bfa 50%, #38bdf8 100%);
278
- background-size: 200% 200%;
279
- color: white;
280
- animation: gradient-shift 6s ease infinite;
281
- opacity: 0.9;
282
- }
283
-
284
- /* Chapter cover page */
285
- .chapter-cover {
286
- display: flex;
287
- flex-direction: column;
288
- justify-content: center;
289
- align-items: center;
290
- min-height: 60vh;
291
- text-align: center;
292
- padding: var(--space-xl);
293
- }
294
-
295
- .chapter-title {
296
- font-size: 3rem;
297
- font-weight: 700;
298
- color: var(--color-text);
299
- margin-bottom: var(--space-lg);
300
- }
301
-
302
- .chapter-title .gradient-text {
303
- background: linear-gradient(135deg, #3b82f6, #9333ea);
304
- -webkit-background-clip: text;
305
- -webkit-text-fill-color: transparent;
306
- background-clip: text;
307
- }
308
-
309
- .chapter-description {
310
- font-size: 1.25rem;
311
- max-width: 600px;
312
- line-height: 1.6;
313
- color: var(--color-text-muted);
314
- }
315
-
316
- /* Responsive */
317
- @media (max-width: 768px) {
318
- .slide-view {
319
- padding: var(--space-md);
320
- }
321
-
322
- .slide-view .page-title {
323
- font-size: var(--font-size-2xl);
324
- }
325
-
326
- .slide-nav {
327
- gap: var(--space-md);
328
- padding: var(--space-sm);
329
- }
330
- }
331
- }