@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
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
  /**
@@ -17,12 +17,12 @@ import { jobToDOM } from "../formatters/index.js";
17
17
  */
18
18
  export function renderJobSlide({ render, data, params }) {
19
19
  const discipline = data.disciplines.find((d) => d.id === params.discipline);
20
- const grade = data.grades.find((g) => g.id === params.grade);
20
+ const level = data.levels.find((g) => g.id === params.level);
21
21
  const track = data.tracks.find((t) => t.id === params.track);
22
22
 
23
23
  const view = prepareJobDetail({
24
24
  discipline,
25
- grade,
25
+ level,
26
26
  track,
27
27
  skills: data.skills,
28
28
  behaviours: data.behaviours,
@@ -49,7 +49,7 @@ export function renderJobSlide({ render, data, params }) {
49
49
  showJobDescriptionHtml: true,
50
50
  showJobDescriptionMarkdown: false,
51
51
  discipline,
52
- grade,
52
+ level,
53
53
  track,
54
54
  }),
55
55
  );
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Level Slide View
3
+ *
4
+ * Printer-friendly view of a level.
5
+ */
6
+
7
+ import { div, h1, p } from "../lib/render.js";
8
+ import { levelToDOM } from "../formatters/index.js";
9
+
10
+ /**
11
+ * Render level slide
12
+ * @param {Object} params
13
+ * @param {Function} params.render
14
+ * @param {Object} params.data
15
+ * @param {Object} params.params
16
+ */
17
+ export function renderLevelSlide({ render, data, params }) {
18
+ const level = data.levels.find((g) => g.id === params.id);
19
+
20
+ if (!level) {
21
+ render(
22
+ div(
23
+ { className: "slide-error" },
24
+ h1({}, "Level Not Found"),
25
+ p({}, `No level found with ID: ${params.id}`),
26
+ ),
27
+ );
28
+ return;
29
+ }
30
+
31
+ render(levelToDOM(level, { framework: data.framework, showBackLink: false }));
32
+ }
@@ -12,7 +12,7 @@ import {
12
12
  skillToCardConfig,
13
13
  behaviourToCardConfig,
14
14
  driverToCardConfig,
15
- gradeToCardConfig,
15
+ levelToCardConfig,
16
16
  trackToCardConfig,
17
17
  jobToCardConfig,
18
18
  } from "../lib/card-mappers.js";
@@ -20,9 +20,9 @@ import { prepareDisciplinesList } from "../formatters/discipline/shared.js";
20
20
  import { prepareSkillsList } from "../formatters/skill/shared.js";
21
21
  import { prepareBehavioursList } from "../formatters/behaviour/shared.js";
22
22
  import { prepareDriversList } from "../formatters/driver/shared.js";
23
- import { prepareGradesList } from "../formatters/grade/shared.js";
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
@@ -92,12 +92,12 @@ export function renderOverviewSlide({ render, data, params }) {
92
92
  mapper: disciplineToCardConfig,
93
93
  isGrouped: true,
94
94
  },
95
- grade: {
96
- title: framework.entityDefinitions.grade.title,
97
- emojiIcon: framework.entityDefinitions.grade.emojiIcon,
98
- description: framework.entityDefinitions.grade.description,
99
- entities: prepareGradesList(data.grades).items,
100
- mapper: gradeToCardConfig,
95
+ level: {
96
+ title: framework.entityDefinitions.level.title,
97
+ emojiIcon: framework.entityDefinitions.level.emojiIcon,
98
+ description: framework.entityDefinitions.level.description,
99
+ entities: prepareLevelsList(data.levels).items,
100
+ mapper: levelToCardConfig,
101
101
  },
102
102
  track: {
103
103
  title: framework.entityDefinitions.track.title,
@@ -112,7 +112,7 @@ export function renderOverviewSlide({ render, data, params }) {
112
112
  description: framework.entityDefinitions.job.description,
113
113
  entities: generateAllJobs({
114
114
  disciplines: data.disciplines,
115
- grades: data.grades,
115
+ levels: data.levels,
116
116
  tracks: data.tracks,
117
117
  skills: data.skills,
118
118
  behaviours: data.behaviours,
@@ -7,7 +7,7 @@
7
7
  import { div, h1, p } from "../lib/render.js";
8
8
  import {
9
9
  prepareProgressDetail,
10
- getDefaultTargetGrade,
10
+ getDefaultTargetLevel,
11
11
  } from "../formatters/progress/shared.js";
12
12
  import { progressToDOM } from "../formatters/index.js";
13
13
 
@@ -20,12 +20,12 @@ import { progressToDOM } from "../formatters/index.js";
20
20
  */
21
21
  export function renderProgressSlide({ render, data, params }) {
22
22
  const discipline = data.disciplines.find((d) => d.id === params.discipline);
23
- const grade = data.grades.find((g) => g.id === params.grade);
23
+ const level = data.levels.find((g) => g.id === params.level);
24
24
  const track = params.track
25
25
  ? data.tracks.find((t) => t.id === params.track)
26
26
  : null;
27
27
 
28
- if (!discipline || !grade) {
28
+ if (!discipline || !level) {
29
29
  render(
30
30
  div(
31
31
  { className: "slide-error" },
@@ -36,23 +36,23 @@ export function renderProgressSlide({ render, data, params }) {
36
36
  return;
37
37
  }
38
38
 
39
- // Get compare grade from URL query or default to next grade
39
+ // Get compare level from URL query or default to next level
40
40
  const urlParams = new URLSearchParams(window.location.search);
41
- const compareGradeId = urlParams.get("compare");
41
+ const compareLevelId = urlParams.get("compare");
42
42
 
43
- let targetGrade;
44
- if (compareGradeId) {
45
- targetGrade = data.grades.find((g) => g.id === compareGradeId);
43
+ let targetLevel;
44
+ if (compareLevelId) {
45
+ targetLevel = data.levels.find((g) => g.id === compareLevelId);
46
46
  } else {
47
- targetGrade = getDefaultTargetGrade(grade, data.grades);
47
+ targetLevel = getDefaultTargetLevel(level, data.levels);
48
48
  }
49
49
 
50
- if (!targetGrade) {
50
+ if (!targetLevel) {
51
51
  render(
52
52
  div(
53
53
  { className: "slide-error" },
54
54
  h1({}, "No Progression Available"),
55
- p({}, "No next grade available for this role."),
55
+ p({}, "No next level available for this role."),
56
56
  ),
57
57
  );
58
58
  return;
@@ -60,10 +60,10 @@ export function renderProgressSlide({ render, data, params }) {
60
60
 
61
61
  const view = prepareProgressDetail({
62
62
  fromDiscipline: discipline,
63
- fromGrade: grade,
63
+ fromLevel: level,
64
64
  fromTrack: track,
65
65
  toDiscipline: discipline,
66
- toGrade: targetGrade,
66
+ toLevel: targetLevel,
67
67
  toTrack: track,
68
68
  skills: data.skills,
69
69
  behaviours: data.behaviours,
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/types.js CHANGED
@@ -19,7 +19,7 @@
19
19
  * @property {boolean} [humanOnly] - Whether this skill requires human presence
20
20
  * @property {'primary'|'secondary'|'tertiary'} type - Skill type in this role
21
21
  * @property {string} level - Level ID (e.g., "advanced", "expert")
22
- * @property {string} levelDescription - Human-readable level description
22
+ * @property {string} proficiencyDescription - Human-readable level description
23
23
  */
24
24
 
25
25
  // ============================================================================
@@ -1,6 +1,6 @@
1
1
  # {{{title}}}
2
2
 
3
- - **Level:** {{{gradeId}}}
3
+ - **Level:** {{{levelId}}}
4
4
  - **Experience:** {{{typicalExperienceRange}}}
5
5
  {{#hasTrack}}- **Track:** {{{trackName}}}
6
6
  {{/hasTrack}}
@@ -34,7 +34,7 @@
34
34
  {{{responsibilityDescription}}}:
35
35
 
36
36
  {{#skills}}
37
- - **{{{skillName}}}:** {{{levelDescription}}}
37
+ - **{{{skillName}}}:** {{{proficiencyDescription}}}
38
38
  {{/skills}}
39
39
  {{/capabilitySkills}}
40
40
  {{/hasCapabilitySkills}}
@@ -1,60 +0,0 @@
1
- /**
2
- * Grade CLI Command
3
- *
4
- * Handles grade summary, listing, and detail display in the terminal.
5
- *
6
- * Usage:
7
- * npx pathway grade # Summary with stats
8
- * npx pathway grade --list # IDs only (for piping)
9
- * npx pathway grade <id> # Detail view
10
- * npx pathway grade --validate # Validation checks
11
- */
12
-
13
- import { createEntityCommand } from "./command-factory.js";
14
- import { gradeToMarkdown } from "../formatters/grade/markdown.js";
15
- import { formatTable } from "../lib/cli-output.js";
16
- import { getConceptEmoji } from "@forwardimpact/map/levels";
17
- import { capitalize } from "../formatters/shared.js";
18
-
19
- /**
20
- * Format grade summary output
21
- * @param {Array} grades - Raw grade entities
22
- * @param {Object} data - Full data context
23
- */
24
- function formatSummary(grades, data) {
25
- const { framework } = data;
26
- const emoji = framework ? getConceptEmoji(framework, "grade") : "📊";
27
-
28
- console.log(`\n${emoji} Grades\n`);
29
-
30
- const rows = grades.map((g) => [
31
- g.id,
32
- g.displayName || g.id,
33
- g.typicalExperienceRange || "-",
34
- capitalize(g.baseSkillLevels?.primary || "-"),
35
- ]);
36
-
37
- console.log(formatTable(["ID", "Name", "Experience", "Primary Level"], rows));
38
- console.log(`\nTotal: ${grades.length} grades`);
39
- console.log(`\nRun 'npx pathway grade --list' for IDs`);
40
- console.log(`Run 'npx pathway grade <id>' for details\n`);
41
- }
42
-
43
- /**
44
- * Format grade detail output
45
- * @param {Object} grade - Raw grade entity
46
- * @param {Object} framework - Framework config
47
- */
48
- function formatDetail(grade, framework) {
49
- console.log(gradeToMarkdown(grade, framework));
50
- }
51
-
52
- export const runGradeCommand = createEntityCommand({
53
- entityName: "grade",
54
- pluralName: "grades",
55
- findEntity: (data, id) => data.grades.find((g) => g.id === id),
56
- presentDetail: (entity) => entity,
57
- formatSummary,
58
- formatDetail,
59
- emojiIcon: "📊",
60
- });
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
- }