@forwardimpact/pathway 0.22.0 → 0.23.1
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/bin/fit-pathway.js +8 -4
- package/package.json +6 -2
- package/src/commands/agent.js +6 -3
- package/src/commands/behaviour.js +11 -1
- package/src/commands/build.js +11 -2
- package/src/commands/command-factory.js +4 -2
- package/src/commands/dev.js +9 -2
- package/src/commands/discipline.js +25 -10
- package/src/commands/driver.js +11 -1
- package/src/commands/job.js +127 -28
- package/src/commands/level.js +25 -3
- package/src/commands/skill.js +11 -1
- package/src/commands/stage.js +11 -1
- package/src/commands/tool.js +6 -3
- package/src/commands/track.js +20 -4
- package/src/components/card.js +8 -104
- package/src/components/comparison-radar.js +1 -1
- package/src/components/detail.js +16 -118
- package/src/components/error-page.js +8 -68
- package/src/components/grid.js +12 -106
- package/src/components/list.js +7 -116
- package/src/components/nav.js +7 -60
- package/src/css/bundles/app.css +25 -21
- package/src/css/bundles/handout.css +33 -33
- package/src/css/bundles/slides.css +25 -25
- package/src/formatters/discipline/markdown.js +16 -1
- package/src/formatters/interview/shared.js +3 -3
- package/src/formatters/job/description.js +2 -2
- package/src/formatters/progress/shared.js +3 -3
- package/src/formatters/skill/shared.js +1 -1
- package/src/formatters/track/markdown.js +14 -0
- package/src/formatters/track/shared.js +1 -1
- package/src/handout.html +32 -13
- package/src/index.html +32 -13
- package/src/lib/error-boundary.js +3 -66
- package/src/lib/errors.js +7 -45
- package/src/lib/job-cache.js +1 -1
- package/src/lib/markdown.js +2 -109
- package/src/lib/reactive.js +7 -73
- package/src/lib/render.js +49 -197
- package/src/lib/router-core.js +2 -156
- package/src/lib/router-pages.js +2 -11
- package/src/lib/router-slides.js +2 -197
- package/src/lib/state.js +14 -63
- package/src/lib/utils.js +3 -10
- package/src/lib/yaml-loader.js +13 -71
- package/src/pages/agent-builder.js +1 -1
- package/src/pages/assessment-results.js +1 -1
- package/src/pages/job-builder.js +1 -1
- package/src/pages/job.js +1 -1
- package/src/pages/skill.js +1 -1
- package/src/slide-main.js +1 -1
- package/src/slides/index.js +1 -1
- package/src/slides/job.js +1 -1
- package/src/slides/overview.js +1 -1
- package/src/slides.html +32 -13
- package/src/css/base.css +0 -56
- package/src/css/components/badges.css +0 -232
- package/src/css/components/buttons.css +0 -101
- package/src/css/components/forms.css +0 -191
- package/src/css/components/layout.css +0 -218
- package/src/css/components/nav.css +0 -206
- package/src/css/components/progress.css +0 -166
- package/src/css/components/states.css +0 -82
- package/src/css/components/surfaces.css +0 -347
- package/src/css/components/tables.css +0 -362
- package/src/css/components/top-bar.css +0 -180
- package/src/css/components/typography.css +0 -121
- package/src/css/components/utilities.css +0 -41
- package/src/css/pages/detail.css +0 -119
- package/src/css/reset.css +0 -50
- package/src/css/tokens.css +0 -162
- package/src/css/views/handout.css +0 -30
- package/src/css/views/print.css +0 -634
- package/src/css/views/slide-animations.css +0 -113
- package/src/css/views/slide-base.css +0 -331
- package/src/css/views/slide-sections.css +0 -597
- package/src/css/views/slide-tables.css +0 -275
package/src/lib/yaml-loader.js
CHANGED
|
@@ -1,56 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Browser-compatible YAML loading
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Generic utilities from @forwardimpact/libui/yaml-loader,
|
|
5
|
+
* plus Pathway-specific entity loaders.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
export {
|
|
9
|
+
loadYamlFile,
|
|
10
|
+
tryLoadYamlFile,
|
|
11
|
+
loadDirIndex,
|
|
12
|
+
} from "@forwardimpact/libui/yaml-loader";
|
|
9
13
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
export async function loadYamlFile(path) {
|
|
16
|
-
const response = await fetch(path);
|
|
17
|
-
if (!response.ok) {
|
|
18
|
-
throw new Error(
|
|
19
|
-
`Failed to load ${path}: ${response.status} ${response.statusText}`,
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
const text = await response.text();
|
|
23
|
-
return parseYaml(text);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Try to load a YAML file, return null if not found
|
|
28
|
-
* @param {string} path - Path to the YAML file
|
|
29
|
-
* @returns {Promise<*|null>}
|
|
30
|
-
*/
|
|
31
|
-
async function tryLoadYamlFile(path) {
|
|
32
|
-
const response = await fetch(path);
|
|
33
|
-
if (response.status === 404) {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
if (!response.ok) {
|
|
37
|
-
throw new Error(
|
|
38
|
-
`Failed to load ${path}: ${response.status} ${response.statusText}`,
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
const text = await response.text();
|
|
42
|
-
return parseYaml(text);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Load directory index (list of file IDs)
|
|
47
|
-
* @param {string} dir - Directory path
|
|
48
|
-
* @returns {Promise<string[]>} Array of file IDs
|
|
49
|
-
*/
|
|
50
|
-
async function loadDirIndex(dir) {
|
|
51
|
-
const index = await loadYamlFile(`${dir}/_index.yaml`);
|
|
52
|
-
return index.files || [];
|
|
53
|
-
}
|
|
14
|
+
import {
|
|
15
|
+
loadYamlFile,
|
|
16
|
+
tryLoadYamlFile,
|
|
17
|
+
loadDirIndex,
|
|
18
|
+
} from "@forwardimpact/libui/yaml-loader";
|
|
54
19
|
|
|
55
20
|
/**
|
|
56
21
|
* Load skills from capability files
|
|
@@ -115,23 +80,18 @@ async function loadDisciplinesFromDir(disciplinesDir) {
|
|
|
115
80
|
const disciplines = await Promise.all(
|
|
116
81
|
disciplineIds.map(async (id) => {
|
|
117
82
|
const content = await loadYamlFile(`${disciplinesDir}/${id}.yaml`);
|
|
118
|
-
// Shared content at top level, role summaries under human:
|
|
119
83
|
const {
|
|
120
84
|
specialization,
|
|
121
85
|
roleTitle,
|
|
122
|
-
// Track constraints
|
|
123
86
|
isProfessional,
|
|
124
87
|
isManagement,
|
|
125
88
|
validTracks,
|
|
126
89
|
minLevel,
|
|
127
|
-
// Shared content - now at root level
|
|
128
90
|
description,
|
|
129
|
-
// Structural properties (derivation inputs)
|
|
130
91
|
coreSkills,
|
|
131
92
|
supportingSkills,
|
|
132
93
|
broadSkills,
|
|
133
94
|
behaviourModifiers,
|
|
134
|
-
// Presentation sections
|
|
135
95
|
human,
|
|
136
96
|
agent,
|
|
137
97
|
} = content;
|
|
@@ -139,19 +99,15 @@ async function loadDisciplinesFromDir(disciplinesDir) {
|
|
|
139
99
|
id,
|
|
140
100
|
specialization,
|
|
141
101
|
roleTitle,
|
|
142
|
-
// Track constraints
|
|
143
102
|
isProfessional,
|
|
144
103
|
isManagement,
|
|
145
104
|
validTracks,
|
|
146
105
|
minLevel,
|
|
147
|
-
// Shared content at top level
|
|
148
106
|
description,
|
|
149
|
-
// Structural properties
|
|
150
107
|
coreSkills,
|
|
151
108
|
supportingSkills,
|
|
152
109
|
broadSkills,
|
|
153
110
|
behaviourModifiers,
|
|
154
|
-
// Human presentation content (role summaries only)
|
|
155
111
|
...human,
|
|
156
112
|
...(agent && { agent }),
|
|
157
113
|
};
|
|
@@ -171,27 +127,21 @@ async function loadTracksFromDir(tracksDir) {
|
|
|
171
127
|
const tracks = await Promise.all(
|
|
172
128
|
trackIds.map(async (id) => {
|
|
173
129
|
const content = await loadYamlFile(`${tracksDir}/${id}.yaml`);
|
|
174
|
-
// Shared content at top level (no human section for tracks anymore)
|
|
175
130
|
const {
|
|
176
131
|
name,
|
|
177
|
-
// Shared content - now at root level
|
|
178
132
|
description,
|
|
179
133
|
roleContext,
|
|
180
|
-
// Structural properties (derivation inputs)
|
|
181
134
|
skillModifiers,
|
|
182
135
|
behaviourModifiers,
|
|
183
136
|
matchingWeights,
|
|
184
137
|
minLevel,
|
|
185
|
-
// Agent section (no human section anymore for tracks)
|
|
186
138
|
agent,
|
|
187
139
|
} = content;
|
|
188
140
|
return {
|
|
189
141
|
id,
|
|
190
142
|
name,
|
|
191
|
-
// Shared content at top level
|
|
192
143
|
description,
|
|
193
144
|
roleContext,
|
|
194
|
-
// Structural properties
|
|
195
145
|
skillModifiers,
|
|
196
146
|
behaviourModifiers,
|
|
197
147
|
matchingWeights,
|
|
@@ -214,7 +164,6 @@ async function loadBehavioursFromDir(behavioursDir) {
|
|
|
214
164
|
const behaviours = await Promise.all(
|
|
215
165
|
behaviourIds.map(async (id) => {
|
|
216
166
|
const content = await loadYamlFile(`${behavioursDir}/${id}.yaml`);
|
|
217
|
-
// Flatten human properties to top level (behaviours use human: section in YAML)
|
|
218
167
|
const { name, human, agent } = content;
|
|
219
168
|
return {
|
|
220
169
|
id,
|
|
@@ -297,13 +246,9 @@ async function loadQuestionFolder(
|
|
|
297
246
|
* @returns {Promise<Object>}
|
|
298
247
|
*/
|
|
299
248
|
export async function loadAllData(dataDir = "./data") {
|
|
300
|
-
// Load capabilities first (skills are embedded in capabilities)
|
|
301
249
|
const capabilities = await loadCapabilitiesFromDir(`${dataDir}/capabilities`);
|
|
302
|
-
|
|
303
|
-
// Extract skills from capabilities
|
|
304
250
|
const skills = await loadSkillsFromCapabilities(`${dataDir}/capabilities`);
|
|
305
251
|
|
|
306
|
-
// Load remaining core data in parallel (using _index.yaml for discovery)
|
|
307
252
|
const [drivers, behaviours, disciplines, tracks, levels, stages, framework] =
|
|
308
253
|
await Promise.all([
|
|
309
254
|
loadYamlFile(`${dataDir}/drivers.yaml`),
|
|
@@ -315,7 +260,6 @@ export async function loadAllData(dataDir = "./data") {
|
|
|
315
260
|
loadYamlFile(`${dataDir}/framework.yaml`),
|
|
316
261
|
]);
|
|
317
262
|
|
|
318
|
-
// Load questions using skill/behaviour/capability IDs
|
|
319
263
|
const questions = await loadQuestionFolder(
|
|
320
264
|
`${dataDir}/questions`,
|
|
321
265
|
skills,
|
|
@@ -339,9 +283,8 @@ export async function loadAllData(dataDir = "./data") {
|
|
|
339
283
|
|
|
340
284
|
/**
|
|
341
285
|
* Load agent-specific data for browser-based agent generation
|
|
342
|
-
* Uses co-located files where agent sections are embedded in entity files
|
|
343
286
|
* @param {string} [dataDir='./data'] - Path to data directory
|
|
344
|
-
* @returns {Promise<Object>}
|
|
287
|
+
* @returns {Promise<Object>}
|
|
345
288
|
*/
|
|
346
289
|
export async function loadAgentDataBrowser(dataDir = "./data") {
|
|
347
290
|
const [
|
|
@@ -360,7 +303,6 @@ export async function loadAgentDataBrowser(dataDir = "./data") {
|
|
|
360
303
|
tryLoadYamlFile(`${dataDir}/copilot-setup-steps.yaml`),
|
|
361
304
|
]);
|
|
362
305
|
|
|
363
|
-
// Extract agent sections from co-located files
|
|
364
306
|
return {
|
|
365
307
|
disciplines: disciplines
|
|
366
308
|
.filter((d) => d.agent)
|
|
@@ -19,7 +19,7 @@ import { getState } from "../lib/state.js";
|
|
|
19
19
|
import { createBadge } from "../components/card.js";
|
|
20
20
|
import { formatLevel } from "../lib/render.js";
|
|
21
21
|
import { getAssessmentState, resetAssessment } from "./self-assessment.js";
|
|
22
|
-
import { findRealisticMatches } from "@forwardimpact/
|
|
22
|
+
import { findRealisticMatches } from "@forwardimpact/libskill/matching";
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* Render the assessment results page
|
package/src/pages/job-builder.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { render } from "../lib/render.js";
|
|
6
6
|
import { getState } from "../lib/state.js";
|
|
7
7
|
import { createBuilder, createStandardPreview } from "../components/builder.js";
|
|
8
|
-
import { prepareJobBuilderPreview } from "@forwardimpact/
|
|
8
|
+
import { prepareJobBuilderPreview } from "@forwardimpact/libskill/job";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Render job builder page
|
package/src/pages/job.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { render, div, p } from "../lib/render.js";
|
|
6
6
|
import { getState } from "../lib/state.js";
|
|
7
7
|
import { renderError } from "../components/error-page.js";
|
|
8
|
-
import { prepareJobDetail } from "@forwardimpact/
|
|
8
|
+
import { prepareJobDetail } from "@forwardimpact/libskill/job";
|
|
9
9
|
import { jobToDOM } from "../formatters/job/dom.js";
|
|
10
10
|
|
|
11
11
|
/** @type {string|null} Cached job template */
|
package/src/pages/skill.js
CHANGED
|
@@ -11,7 +11,7 @@ import { prepareSkillsList } from "../formatters/skill/shared.js";
|
|
|
11
11
|
import { skillToDOM } from "../formatters/skill/dom.js";
|
|
12
12
|
import { skillToCardConfig } from "../lib/card-mappers.js";
|
|
13
13
|
import { getCapabilityEmoji, getConceptEmoji } from "@forwardimpact/map/levels";
|
|
14
|
-
import { generateSkillMarkdown } from "@forwardimpact/
|
|
14
|
+
import { generateSkillMarkdown } from "@forwardimpact/libskill";
|
|
15
15
|
import { formatAgentSkill } from "../formatters/agent/skill.js";
|
|
16
16
|
|
|
17
17
|
/** @type {string|null} Cached skill template */
|
package/src/slide-main.js
CHANGED
|
@@ -8,7 +8,7 @@ import { createSlideRouter } from "./lib/router-slides.js";
|
|
|
8
8
|
import { setData, getState } from "./lib/state.js";
|
|
9
9
|
import { loadAllData } from "./lib/yaml-loader.js";
|
|
10
10
|
import { span, a } from "./lib/render.js";
|
|
11
|
-
import { generateAllJobs } from "@forwardimpact/
|
|
11
|
+
import { generateAllJobs } from "@forwardimpact/libskill/derivation";
|
|
12
12
|
import { sortTracksByName } from "./formatters/track/shared.js";
|
|
13
13
|
|
|
14
14
|
// Import slide renderers
|
package/src/slides/index.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import { div, heading1, heading2, p, a, ul, li, span } from "../lib/render.js";
|
|
8
8
|
import { getConceptEmoji } from "@forwardimpact/map/levels";
|
|
9
|
-
import { generateAllJobs } from "@forwardimpact/
|
|
9
|
+
import { generateAllJobs } from "@forwardimpact/libskill/derivation";
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Render the slide index
|
package/src/slides/job.js
CHANGED
package/src/slides/overview.js
CHANGED
|
@@ -22,7 +22,7 @@ import { prepareBehavioursList } from "../formatters/behaviour/shared.js";
|
|
|
22
22
|
import { prepareDriversList } from "../formatters/driver/shared.js";
|
|
23
23
|
import { prepareLevelsList } from "../formatters/level/shared.js";
|
|
24
24
|
import { prepareTracksList } from "../formatters/track/shared.js";
|
|
25
|
-
import { generateAllJobs } from "@forwardimpact/
|
|
25
|
+
import { generateAllJobs } from "@forwardimpact/libskill/derivation";
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* Format discipline group name for display
|
package/src/slides.html
CHANGED
|
@@ -13,19 +13,38 @@
|
|
|
13
13
|
"@forwardimpact/map/levels": "/map/lib/levels.js",
|
|
14
14
|
"@forwardimpact/map/loader": "/map/lib/loader.js",
|
|
15
15
|
"@forwardimpact/map/validation": "/map/lib/validation.js",
|
|
16
|
-
"@forwardimpact/
|
|
17
|
-
"@forwardimpact/
|
|
18
|
-
"@forwardimpact/
|
|
19
|
-
"@forwardimpact/
|
|
20
|
-
"@forwardimpact/
|
|
21
|
-
"@forwardimpact/
|
|
22
|
-
"@forwardimpact/
|
|
23
|
-
"@forwardimpact/
|
|
24
|
-
"@forwardimpact/
|
|
25
|
-
"@forwardimpact/
|
|
26
|
-
"@forwardimpact/
|
|
27
|
-
"@forwardimpact/
|
|
28
|
-
"@forwardimpact/
|
|
16
|
+
"@forwardimpact/libskill": "/model/lib/index.js",
|
|
17
|
+
"@forwardimpact/libskill/derivation": "/model/lib/derivation.js",
|
|
18
|
+
"@forwardimpact/libskill/modifiers": "/model/lib/modifiers.js",
|
|
19
|
+
"@forwardimpact/libskill/agent": "/model/lib/agent.js",
|
|
20
|
+
"@forwardimpact/libskill/interview": "/model/lib/interview.js",
|
|
21
|
+
"@forwardimpact/libskill/job": "/model/lib/job.js",
|
|
22
|
+
"@forwardimpact/libskill/job-cache": "/model/lib/job-cache.js",
|
|
23
|
+
"@forwardimpact/libskill/checklist": "/model/lib/checklist.js",
|
|
24
|
+
"@forwardimpact/libskill/matching": "/model/lib/matching.js",
|
|
25
|
+
"@forwardimpact/libskill/profile": "/model/lib/profile.js",
|
|
26
|
+
"@forwardimpact/libskill/progression": "/model/lib/progression.js",
|
|
27
|
+
"@forwardimpact/libskill/policies": "/model/lib/policies/index.js",
|
|
28
|
+
"@forwardimpact/libskill/toolkit": "/model/lib/toolkit.js",
|
|
29
|
+
"@forwardimpact/libui": "/ui/lib/index.js",
|
|
30
|
+
"@forwardimpact/libui/render": "/ui/lib/render.js",
|
|
31
|
+
"@forwardimpact/libui/reactive": "/ui/lib/reactive.js",
|
|
32
|
+
"@forwardimpact/libui/state": "/ui/lib/state.js",
|
|
33
|
+
"@forwardimpact/libui/errors": "/ui/lib/errors.js",
|
|
34
|
+
"@forwardimpact/libui/error-boundary": "/ui/lib/error-boundary.js",
|
|
35
|
+
"@forwardimpact/libui/router-core": "/ui/lib/router-core.js",
|
|
36
|
+
"@forwardimpact/libui/router-pages": "/ui/lib/router-pages.js",
|
|
37
|
+
"@forwardimpact/libui/router-slides": "/ui/lib/router-slides.js",
|
|
38
|
+
"@forwardimpact/libui/yaml-loader": "/ui/lib/yaml-loader.js",
|
|
39
|
+
"@forwardimpact/libui/markdown": "/ui/lib/markdown.js",
|
|
40
|
+
"@forwardimpact/libui/utils": "/ui/lib/utils.js",
|
|
41
|
+
"@forwardimpact/libui/components": "/ui/lib/components/index.js",
|
|
42
|
+
"@forwardimpact/libui/components/card": "/ui/lib/components/card.js",
|
|
43
|
+
"@forwardimpact/libui/components/grid": "/ui/lib/components/grid.js",
|
|
44
|
+
"@forwardimpact/libui/components/list": "/ui/lib/components/list.js",
|
|
45
|
+
"@forwardimpact/libui/components/detail": "/ui/lib/components/detail.js",
|
|
46
|
+
"@forwardimpact/libui/components/nav": "/ui/lib/components/nav.js",
|
|
47
|
+
"@forwardimpact/libui/components/error-page": "/ui/lib/components/error-page.js"
|
|
29
48
|
}
|
|
30
49
|
}
|
|
31
50
|
</script>
|
package/src/css/base.css
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base Styles
|
|
3
|
-
*
|
|
4
|
-
* Typography, links, and body defaults using design tokens.
|
|
5
|
-
* Import after tokens.css and reset.css.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
@layer base {
|
|
9
|
-
body {
|
|
10
|
-
font-family: var(--font-family);
|
|
11
|
-
font-size: var(--font-size-base);
|
|
12
|
-
line-height: 1.6;
|
|
13
|
-
color: var(--color-text);
|
|
14
|
-
background-color: var(--color-bg);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
h1,
|
|
18
|
-
h2,
|
|
19
|
-
h3,
|
|
20
|
-
h4,
|
|
21
|
-
h5,
|
|
22
|
-
h6 {
|
|
23
|
-
margin-bottom: var(--space-md);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
h1 {
|
|
27
|
-
font-size: var(--font-size-3xl);
|
|
28
|
-
font-weight: 700;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
h2 {
|
|
32
|
-
font-size: var(--font-size-2xl);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
h3 {
|
|
36
|
-
font-size: var(--font-size-xl);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
h4 {
|
|
40
|
-
font-size: var(--font-size-lg);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
p {
|
|
44
|
-
margin-bottom: var(--space-md);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
a {
|
|
48
|
-
color: var(--color-primary);
|
|
49
|
-
text-decoration: none;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
a:hover {
|
|
53
|
-
color: var(--color-primary-dark);
|
|
54
|
-
text-decoration: underline;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
@@ -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
|
-
}
|