@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.
Files changed (78) hide show
  1. package/bin/fit-pathway.js +8 -4
  2. package/package.json +6 -2
  3. package/src/commands/agent.js +6 -3
  4. package/src/commands/behaviour.js +11 -1
  5. package/src/commands/build.js +11 -2
  6. package/src/commands/command-factory.js +4 -2
  7. package/src/commands/dev.js +9 -2
  8. package/src/commands/discipline.js +25 -10
  9. package/src/commands/driver.js +11 -1
  10. package/src/commands/job.js +127 -28
  11. package/src/commands/level.js +25 -3
  12. package/src/commands/skill.js +11 -1
  13. package/src/commands/stage.js +11 -1
  14. package/src/commands/tool.js +6 -3
  15. package/src/commands/track.js +20 -4
  16. package/src/components/card.js +8 -104
  17. package/src/components/comparison-radar.js +1 -1
  18. package/src/components/detail.js +16 -118
  19. package/src/components/error-page.js +8 -68
  20. package/src/components/grid.js +12 -106
  21. package/src/components/list.js +7 -116
  22. package/src/components/nav.js +7 -60
  23. package/src/css/bundles/app.css +25 -21
  24. package/src/css/bundles/handout.css +33 -33
  25. package/src/css/bundles/slides.css +25 -25
  26. package/src/formatters/discipline/markdown.js +16 -1
  27. package/src/formatters/interview/shared.js +3 -3
  28. package/src/formatters/job/description.js +2 -2
  29. package/src/formatters/progress/shared.js +3 -3
  30. package/src/formatters/skill/shared.js +1 -1
  31. package/src/formatters/track/markdown.js +14 -0
  32. package/src/formatters/track/shared.js +1 -1
  33. package/src/handout.html +32 -13
  34. package/src/index.html +32 -13
  35. package/src/lib/error-boundary.js +3 -66
  36. package/src/lib/errors.js +7 -45
  37. package/src/lib/job-cache.js +1 -1
  38. package/src/lib/markdown.js +2 -109
  39. package/src/lib/reactive.js +7 -73
  40. package/src/lib/render.js +49 -197
  41. package/src/lib/router-core.js +2 -156
  42. package/src/lib/router-pages.js +2 -11
  43. package/src/lib/router-slides.js +2 -197
  44. package/src/lib/state.js +14 -63
  45. package/src/lib/utils.js +3 -10
  46. package/src/lib/yaml-loader.js +13 -71
  47. package/src/pages/agent-builder.js +1 -1
  48. package/src/pages/assessment-results.js +1 -1
  49. package/src/pages/job-builder.js +1 -1
  50. package/src/pages/job.js +1 -1
  51. package/src/pages/skill.js +1 -1
  52. package/src/slide-main.js +1 -1
  53. package/src/slides/index.js +1 -1
  54. package/src/slides/job.js +1 -1
  55. package/src/slides/overview.js +1 -1
  56. package/src/slides.html +32 -13
  57. package/src/css/base.css +0 -56
  58. package/src/css/components/badges.css +0 -232
  59. package/src/css/components/buttons.css +0 -101
  60. package/src/css/components/forms.css +0 -191
  61. package/src/css/components/layout.css +0 -218
  62. package/src/css/components/nav.css +0 -206
  63. package/src/css/components/progress.css +0 -166
  64. package/src/css/components/states.css +0 -82
  65. package/src/css/components/surfaces.css +0 -347
  66. package/src/css/components/tables.css +0 -362
  67. package/src/css/components/top-bar.css +0 -180
  68. package/src/css/components/typography.css +0 -121
  69. package/src/css/components/utilities.css +0 -41
  70. package/src/css/pages/detail.css +0 -119
  71. package/src/css/reset.css +0 -50
  72. package/src/css/tokens.css +0 -162
  73. package/src/css/views/handout.css +0 -30
  74. package/src/css/views/print.css +0 -634
  75. package/src/css/views/slide-animations.css +0 -113
  76. package/src/css/views/slide-base.css +0 -331
  77. package/src/css/views/slide-sections.css +0 -597
  78. package/src/css/views/slide-tables.css +0 -275
@@ -1,56 +1,21 @@
1
1
  /**
2
2
  * Browser-compatible YAML loading
3
3
  *
4
- * Uses _index.yaml files to discover files in directory structures.
5
- * These index files are auto-generated by the CLI (npx pathway --generate-index).
4
+ * Generic utilities from @forwardimpact/libui/yaml-loader,
5
+ * plus Pathway-specific entity loaders.
6
6
  */
7
7
 
8
- import { parse as parseYaml } from "https://cdn.jsdelivr.net/npm/yaml@2.3.4/+esm";
8
+ export {
9
+ loadYamlFile,
10
+ tryLoadYamlFile,
11
+ loadDirIndex,
12
+ } from "@forwardimpact/libui/yaml-loader";
9
13
 
10
- /**
11
- * Load and parse a YAML file
12
- * @param {string} path - Path to the YAML file
13
- * @returns {Promise<*>}
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>} Agent data including disciplines, tracks, behaviours, vscodeSettings, devcontainer, copilotSetupSteps
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)
@@ -29,7 +29,7 @@ import {
29
29
  deriveReferenceLevel,
30
30
  deriveToolkit,
31
31
  buildAgentIndex,
32
- } from "@forwardimpact/libpathway";
32
+ } from "@forwardimpact/libskill";
33
33
  import {
34
34
  createSelectWithValue,
35
35
  createDisciplineSelect,
@@ -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/libpathway/matching";
22
+ import { findRealisticMatches } from "@forwardimpact/libskill/matching";
23
23
 
24
24
  /**
25
25
  * Render the assessment results page
@@ -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/libpathway/job";
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/libpathway/job";
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 */
@@ -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/libpathway";
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/libpathway/derivation";
11
+ import { generateAllJobs } from "@forwardimpact/libskill/derivation";
12
12
  import { sortTracksByName } from "./formatters/track/shared.js";
13
13
 
14
14
  // Import slide renderers
@@ -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/libpathway/derivation";
9
+ import { generateAllJobs } from "@forwardimpact/libskill/derivation";
10
10
 
11
11
  /**
12
12
  * Render the slide index
package/src/slides/job.js CHANGED
@@ -5,7 +5,7 @@
5
5
  */
6
6
 
7
7
  import { div, h1, p } from "../lib/render.js";
8
- import { prepareJobDetail } from "@forwardimpact/libpathway/job";
8
+ import { prepareJobDetail } from "@forwardimpact/libskill/job";
9
9
  import { jobToDOM } from "../formatters/index.js";
10
10
 
11
11
  /**
@@ -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/libpathway/derivation";
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/libpathway": "/model/lib/index.js",
17
- "@forwardimpact/libpathway/derivation": "/model/lib/derivation.js",
18
- "@forwardimpact/libpathway/modifiers": "/model/lib/modifiers.js",
19
- "@forwardimpact/libpathway/agent": "/model/lib/agent.js",
20
- "@forwardimpact/libpathway/interview": "/model/lib/interview.js",
21
- "@forwardimpact/libpathway/job": "/model/lib/job.js",
22
- "@forwardimpact/libpathway/job-cache": "/model/lib/job-cache.js",
23
- "@forwardimpact/libpathway/checklist": "/model/lib/checklist.js",
24
- "@forwardimpact/libpathway/matching": "/model/lib/matching.js",
25
- "@forwardimpact/libpathway/profile": "/model/lib/profile.js",
26
- "@forwardimpact/libpathway/progression": "/model/lib/progression.js",
27
- "@forwardimpact/libpathway/policies": "/model/lib/policies/index.js",
28
- "@forwardimpact/libpathway/toolkit": "/model/lib/toolkit.js"
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
- }