@repobit/dex-system-design 0.24.3 → 0.24.5

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 (66) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/package.json +4 -4
  3. package/src/components/accordion/accordion-bg.css.js +6 -1
  4. package/src/components/accordion/accordion-bg.js +3 -1
  5. package/src/components/accordion/accordion-bg.stories.js +49 -0
  6. package/src/components/accordion/accordion.css.js +40 -0
  7. package/src/components/accordion/accordion.js +31 -0
  8. package/src/components/accordion/accordion.stories.js +147 -4
  9. package/src/components/agent-endpoints/agent-endpoints.css.js +92 -0
  10. package/src/components/agent-endpoints/agent-endpoints.js +86 -0
  11. package/src/components/agent-endpoints/agent-endpoints.stories.js +148 -0
  12. package/src/components/ai-guardian-demo.stories.js +669 -0
  13. package/src/components/awards/awards-flex.css.js +169 -0
  14. package/src/components/awards/awards-flex.js +269 -0
  15. package/src/components/awards/awards-flex.stories.js +657 -0
  16. package/src/components/bento-grid/bento-grid.css.js +57 -0
  17. package/src/components/bento-grid/bento-grid.js +186 -0
  18. package/src/components/bento-grid/bento-grid.stories.js +440 -0
  19. package/src/components/bento-grid/bento-item.css.js +79 -0
  20. package/src/components/bento-grid/bento-item.js +54 -0
  21. package/src/components/button/button.css.js +26 -0
  22. package/src/components/button/button.js +8 -0
  23. package/src/components/button/button.stories.js +12 -0
  24. package/src/components/comparison-panel/comparison-panel.css.js +104 -0
  25. package/src/components/comparison-panel/comparison-panel.js +100 -0
  26. package/src/components/comparison-panel/comparison-panel.stories.js +223 -0
  27. package/src/components/compatibility-table/compatibility-table.css.js +243 -0
  28. package/src/components/compatibility-table/compatibility-table.js +123 -0
  29. package/src/components/compatibility-table/compatibility-table.stories.js +189 -0
  30. package/src/components/cta-banner/cta-banner.css.js +60 -0
  31. package/src/components/cta-banner/cta-banner.js +63 -0
  32. package/src/components/dropdown/dropdown.css.js +1 -1
  33. package/src/components/footer/footer.css.js +0 -1
  34. package/src/components/header/header-code.css.js +125 -0
  35. package/src/components/header/header-code.js +69 -0
  36. package/src/components/header/header-code.stories.js +226 -0
  37. package/src/components/heading/heading.css.js +3 -0
  38. package/src/components/icons/bd-ai-icon.js +27 -0
  39. package/src/components/list/list-item/list-item.css.js +3 -3
  40. package/src/components/list/list-item/list-item.js +10 -4
  41. package/src/components/overview/overview.css.js +121 -0
  42. package/src/components/overview/overview.js +63 -0
  43. package/src/components/overview/overview.stories.js +193 -0
  44. package/src/components/page-switcher/page-switcher.css.js +100 -0
  45. package/src/components/page-switcher/page-switcher.js +42 -0
  46. package/src/components/paragraph/paragraph.js +7 -3
  47. package/src/components/process-steps/process-steps.css.js +95 -0
  48. package/src/components/process-steps/process-steps.js +72 -0
  49. package/src/components/process-steps/process-steps.stories.js +144 -0
  50. package/src/components/quick-answer/quick-answer.css.js +67 -0
  51. package/src/components/quick-answer/quick-answer.js +59 -0
  52. package/src/components/quick-answer/quick-answer.stories.js +160 -0
  53. package/src/components/terminal/terminal-cursor.js +49 -0
  54. package/src/components/terminal/terminal-message.css.js +161 -0
  55. package/src/components/terminal/terminal-message.js +169 -0
  56. package/src/components/terminal/terminal-message.stories.js +321 -0
  57. package/src/components/trust-panel/trust-panel.css.js +167 -0
  58. package/src/components/trust-panel/trust-panel.js +116 -0
  59. package/src/components/trust-panel/trust-panel.stories.js +234 -0
  60. package/src/tokens/tokens.css +1 -1
  61. package/src/components/tabsComponent/tabsComponent.css.js +0 -267
  62. package/src/components/tabsComponent/tabsComponent.js +0 -193
  63. package/src/components/tabsComponent/tabsComponent.stories.js +0 -134
  64. package/src/components/tabsComponentFamily/tabsComponentFamily.css.js +0 -181
  65. package/src/components/tabsComponentFamily/tabsComponentFamily.js +0 -180
  66. package/src/components/tabsComponentFamily/tabsComponentFamily.stories.js +0 -319
@@ -0,0 +1,144 @@
1
+ import { html } from "lit";
2
+ import "../icons/close-icon.js";
3
+ import "../icons/globe-icon.js";
4
+ import "../icons/guide-icon.js";
5
+ import "./process-steps.js";
6
+
7
+ export default {
8
+ title : "Components/Process Steps",
9
+ component : "bd-process-steps",
10
+ tags : ["autodocs"],
11
+ parameters: {
12
+ layout: "fullscreen",
13
+ docs : {
14
+ description: {
15
+ component: `
16
+ **ProcessSteps** is a dark-background section showing a title, description, and a
17
+ 3-column row of steps — each with a top divider line, icon, title, and description —
18
+ used to explain a sequential process or workflow.
19
+
20
+ Icons are rendered via the \`icon\` field in each step object, using real icon
21
+ components from \`components/icons\` (e.g. \`<bd-guide-icon>\`), not inline SVGs.
22
+
23
+ ### Usage
24
+ \`\`\`html
25
+ <bd-process-steps
26
+ title="Policy, guardrail, verdict"
27
+ description="AI Guardian works in three stages: you set a policy baseline, it enforces guardrails at execution, and it monitors and responds to what happens."
28
+ .steps=\${[
29
+ { icon: html\`<bd-guide-icon width="40" height="40"></bd-guide-icon>\`, title: "Set a policy baseline", description: "..." },
30
+ { icon: html\`<bd-close-icon width="40" height="40"></bd-close-icon>\`, title: "Guardrails at execution", description: "..." },
31
+ { icon: html\`<bd-globe-icon width="40" height="40"></bd-globe-icon>\`, title: "Monitor and respond", description: "..." }
32
+ ]}
33
+ ></bd-process-steps>
34
+ \`\`\`
35
+
36
+ ### Attributes
37
+ | Attribute | Type | Default | Description |
38
+ |------------------|--------|---------|------------------------------------------------------------------|
39
+ | \`title\` | String | \`""\` | Heading above the description (or the \`title\` slot) |
40
+ | \`description\` | String | \`""\` | Paragraph under the title (or the \`description\` slot) |
41
+ | \`steps\` | Array | \`[]\` | \`{ icon, title, description }\` — \`icon\` can be a URL string or a Lit template (real icon component) |
42
+
43
+ ### Slots
44
+ | Slot | Description |
45
+ |-----------------|--------------------------------------------------------------|
46
+ | \`title\` | Overrides the \`title\` attribute if content is provided |
47
+ | \`description\` | Overrides the \`description\` attribute if content is provided |
48
+ | \`steps\` | Extra freeform steps appended after the ones from \`steps\` |
49
+ `
50
+ }
51
+ }
52
+ },
53
+ argTypes: {
54
+ title : { control: "text", table: { category: "Content" } },
55
+ description: { control: "text", table: { category: "Content" } }
56
+ }
57
+ };
58
+
59
+ const iconGuide = html`<bd-guide-icon width="40" height="40" color="#60a5fa"></bd-guide-icon>`;
60
+ const iconClose = html`<bd-close-icon width="40" height="40" color="#60a5fa"></bd-close-icon>`;
61
+ const iconGlobe = html`<bd-globe-icon width="40" height="40" color="#60a5fa"></bd-globe-icon>`;
62
+
63
+ const render = (args) => html`
64
+ <bd-process-steps
65
+ title=${args.title}
66
+ description=${args.description}
67
+ .steps=${[
68
+ { icon: iconGuide, title: "Set a policy baseline", description: "Define what agents are allowed to do — permissions, policies, and auditing for tools, files, and actions." },
69
+ { icon: iconClose, title: "Guardrails at execution", description: "Every tool call and action is checked against policy in real time and gets a verdict: allowed, flagged, or blocked." },
70
+ { icon: iconGlobe, title: "Monitor and respond", description: "Security events feed monitoring and response workflows, so teams can review what agents did and why." }
71
+ ]}
72
+ ></bd-process-steps>
73
+ `;
74
+
75
+ export const Default = {
76
+ name: "Default — Policy, Guardrail, Verdict",
77
+ args: {
78
+ title : "Policy, guardrail, verdict",
79
+ description: "AI Guardian works in three stages: you set a policy baseline, it enforces guardrails at execution, and it monitors and responds to what happens."
80
+ },
81
+ render,
82
+ parameters: {
83
+ docs: {
84
+ description: {
85
+ story: "Matches the reference design: dark gradient background, title + description, and a 3-column row of steps using real icon components from the icons folder."
86
+ }
87
+ }
88
+ }
89
+ };
90
+
91
+ export const FourSteps = {
92
+ name : "Four Steps",
93
+ render: () => html`
94
+ <bd-process-steps
95
+ title="How it works"
96
+ description="A four-stage version, demonstrating the grid with more than three items."
97
+ .steps=${[
98
+ { icon: iconGuide, title: "Define policy", description: "Set the rules agents must follow." },
99
+ { icon: iconClose, title: "Enforce at runtime", description: "Every action is checked live." },
100
+ { icon: iconGlobe, title: "Monitor", description: "Track what happened and why." },
101
+ { icon: iconGuide, title: "Respond", description: "Act on flagged or blocked events." }
102
+ ]}
103
+ ></bd-process-steps>
104
+ `,
105
+ parameters: {
106
+ docs: {
107
+ description: {
108
+ story: "4 steps — the grid stays 3 columns wide on desktop, wrapping the 4th onto a new row."
109
+ }
110
+ }
111
+ }
112
+ };
113
+
114
+ export const NoDescription = {
115
+ name: "No Description",
116
+ args: {
117
+ title : "Policy, guardrail, verdict",
118
+ description: ""
119
+ },
120
+ render,
121
+ parameters: {
122
+ docs: {
123
+ description: {
124
+ story: "`description` omitted — no paragraph rendered under the title, no leftover gap."
125
+ }
126
+ }
127
+ }
128
+ };
129
+
130
+ export const Playground = {
131
+ name: "Playground",
132
+ args: {
133
+ title : "Policy, guardrail, verdict",
134
+ description: "AI Guardian works in three stages: you set a policy baseline, it enforces guardrails at execution, and it monitors and responds to what happens."
135
+ },
136
+ render,
137
+ parameters: {
138
+ docs: {
139
+ description: {
140
+ story: "Fully interactive story — use the Controls panel to edit title and description live."
141
+ }
142
+ }
143
+ }
144
+ };
@@ -0,0 +1,67 @@
1
+ import { css } from "lit";
2
+
3
+ export default css`
4
+ :host {
5
+ display: block;
6
+ font-family: var(--typography-fontFamily-sans);
7
+ }
8
+
9
+ .bd-quickanswer-container {
10
+ background: var(--color-blue-50, #eef4ff);
11
+ // border-radius: var(--radius-2xl, 16px);
12
+ padding: var(--spacing-32) var(--spacing-28) var(--spacing-32) var(--spacing-28);
13
+ box-sizing: border-box;
14
+ }
15
+
16
+ .bd-quickanswer-label {
17
+ color: var(--color-blue-500);
18
+ font-weight: var(--typography-fontWeight-medium);
19
+ margin: 0 0 var(--spacing-16);
20
+ }
21
+
22
+ .bd-quickanswer-text {
23
+ color: var(--color-neutral-800);
24
+ margin: 0;
25
+ }
26
+
27
+ .bd-quickanswer-divider {
28
+ border-top: 1px solid var(--color-blue-100, rgba(59, 130, 246, 0.15));
29
+ margin: var(--spacing-24) 0 var(--spacing-16);
30
+ }
31
+
32
+ .bd-quickanswer-meta {
33
+ display: flex;
34
+ flex-wrap: wrap;
35
+ gap: var(--spacing-24);
36
+ }
37
+
38
+ .bd-quickanswer-meta-item {
39
+ display: inline-flex;
40
+ align-items: baseline;
41
+ gap: var(--spacing-8);
42
+ }
43
+
44
+ .bd-quickanswer-meta-label {
45
+ color: var(--color-neutral-500);
46
+ font-size: var(--typography-fontSize-xxs);
47
+ text-transform: uppercase;
48
+ letter-spacing: 0.04em;
49
+ font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
50
+ }
51
+
52
+ .bd-quickanswer-meta-value {
53
+ color: var(--color-neutral-1000);
54
+ font-weight: var(--typography-fontWeight-semibold);
55
+ }
56
+
57
+ @media (max-width: 599px) {
58
+ .bd-quickanswer-container {
59
+ padding: var(--spacing-24);
60
+ }
61
+
62
+ .bd-quickanswer-meta {
63
+ flex-direction: column;
64
+ gap: var(--spacing-12);
65
+ }
66
+ }
67
+ `;
@@ -0,0 +1,59 @@
1
+ import { LitElement, html, nothing } from "lit";
2
+ import { tokens } from "../../tokens/tokens.js";
3
+ import "../paragraph/paragraph.js";
4
+ import quickAnswerCSS from "./quick-answer.css.js";
5
+
6
+ class QuickAnswer extends LitElement {
7
+ static properties = {
8
+ label: { type: String },
9
+ text : { type: String },
10
+ items: { type: Array } // [{ label: String, value: String }]
11
+ };
12
+
13
+ static styles = [tokens, quickAnswerCSS];
14
+
15
+ constructor() {
16
+ super();
17
+ this.label = "Quick answer";
18
+ this.text = "";
19
+ this.items = [];
20
+ }
21
+
22
+ render() {
23
+ return html`
24
+ <div class="bd-quickanswer-container">
25
+ ${this.label
26
+ ? html`
27
+ <bd-p kind="normal" class="bd-quickanswer-label">
28
+ <slot name="label">${this.label}</slot>
29
+ </bd-p>
30
+ `
31
+ : nothing}
32
+
33
+ <bd-p kind="normal" class="bd-quickanswer-text">
34
+ <slot name="text">${this.text}</slot>
35
+ </bd-p>
36
+
37
+ <slot></slot>
38
+
39
+ ${this.items && this.items.length
40
+ ? html`
41
+ <div class="bd-quickanswer-divider"></div>
42
+ <div class="bd-quickanswer-meta">
43
+ ${this.items.map(
44
+ (item) => html`
45
+ <span class="bd-quickanswer-meta-item">
46
+ <span class="bd-quickanswer-meta-label">${item.label}</span>
47
+ <span class="bd-quickanswer-meta-value">${item.value}</span>
48
+ </span>
49
+ `
50
+ )}
51
+ </div>
52
+ `
53
+ : nothing}
54
+ </div>
55
+ `;
56
+ }
57
+ }
58
+
59
+ customElements.define("bd-quick-answer", QuickAnswer);
@@ -0,0 +1,160 @@
1
+ import { html } from "lit";
2
+ import "./quick-answer.js";
3
+
4
+ export default {
5
+ title : "Components/Quick Answer",
6
+ component : "bd-quick-answer",
7
+ tags : ["autodocs"],
8
+ parameters: {
9
+ layout: "padded",
10
+ docs : {
11
+ description: {
12
+ component: `
13
+ **QuickAnswer** is a light-blue callout box that gives a short, direct answer to a
14
+ question, followed by an optional row of labeled meta values (platform, status,
15
+ vendor, etc.), separated by a divider.
16
+
17
+ ### Usage
18
+ \`\`\`html
19
+ <bd-quick-answer
20
+ label="Quick answer"
21
+ text="Bitdefender AI Guardian is a security layer for autonomous AI agents on macOS. It inspects what an agent does — tool calls, file access, prompts, skills — and returns a verdict of allowed, flagged or blocked against a policy baseline you set. It targets prompt injection, MCP tool poisoning, credential leakage and unauthorised actions. Currently in open BETA."
22
+ .items=\${[
23
+ { label: "PLATFORM", value: "macOS" },
24
+ { label: "STATUS", value: "Open BETA" },
25
+ { label: "MADE BY", value: "Bitdefender" }
26
+ ]}
27
+ ></bd-quick-answer>
28
+ \`\`\`
29
+
30
+ ### Attributes
31
+ | Attribute | Type | Default | Description |
32
+ |-----------|--------|-------------------|--------------------------------------------------|
33
+ | \`label\` | String | \`"Quick answer"\` | Small blue heading label above the body text |
34
+ | \`text\` | String | \`""\` | The main answer paragraph |
35
+ | \`items\` | Array | \`[]\` | Meta row entries: \`{ label, value }\` — omitted entirely if empty |
36
+
37
+ ### Slots
38
+ | Slot | Description |
39
+ |-----------|-----------------------------------------------------------|
40
+ | (default) | Extra freeform content appended after the text, before the divider |
41
+ `
42
+ }
43
+ }
44
+ },
45
+ argTypes: {
46
+ label: { control: "text", table: { category: "Content" } },
47
+ text : { control: "text", table: { category: "Content" } },
48
+ items: { control: "object", table: { category: "Content" } }
49
+ }
50
+ };
51
+
52
+ const render = (args) => html`
53
+ <bd-quick-answer
54
+ label=${args.label}
55
+ text=${args.text}
56
+ .items=${args.items}
57
+ ></bd-quick-answer>
58
+ `;
59
+
60
+ export const Default = {
61
+ name: "Default — AI Guardian",
62
+ args: {
63
+ label: "Quick answer",
64
+ text : "Bitdefender AI Guardian is a security layer for autonomous AI agents on macOS. It inspects what an agent does — tool calls, file access, prompts, skills — and returns a verdict of allowed, flagged or blocked against a policy baseline you set. It targets prompt injection, MCP tool poisoning, credential leakage and unauthorised actions. Currently in open BETA.",
65
+ items: [
66
+ { label: "PLATFORM", value: "macOS" },
67
+ { label: "STATUS", value: "Open BETA" },
68
+ { label: "MADE BY", value: "Bitdefender" }
69
+ ]
70
+ },
71
+ render,
72
+ parameters: {
73
+ docs: {
74
+ description: {
75
+ story: "Matches the reference design: label, body text, divider, and a row of meta values."
76
+ }
77
+ }
78
+ }
79
+ };
80
+
81
+ export const NoMeta = {
82
+ name: "No Meta Row",
83
+ args: {
84
+ label: "Quick answer",
85
+ text : "A short, direct answer with no meta row underneath.",
86
+ items: []
87
+ },
88
+ render,
89
+ parameters: {
90
+ docs: {
91
+ description: {
92
+ story: "`items` left empty — no divider, no meta row rendered."
93
+ }
94
+ }
95
+ }
96
+ };
97
+
98
+ export const ManyMetaItems = {
99
+ name: "Many Meta Items",
100
+ args: {
101
+ label: "Quick answer",
102
+ text : "Demonstrates the meta row wrapping onto a second line when there are more entries than fit horizontally.",
103
+ items: [
104
+ { label: "PLATFORM", value: "macOS" },
105
+ { label: "STATUS", value: "Open BETA" },
106
+ { label: "MADE BY", value: "Bitdefender" },
107
+ { label: "PRICE", value: "Free" },
108
+ { label: "LICENSE", value: "Proprietary" },
109
+ { label: "LANGUAGE", value: "Swift" }
110
+ ]
111
+ },
112
+ render,
113
+ parameters: {
114
+ docs: {
115
+ description: {
116
+ story: "The meta row wraps automatically when it runs out of horizontal space."
117
+ }
118
+ }
119
+ }
120
+ };
121
+
122
+ export const NoLabel = {
123
+ name: "No Label",
124
+ args: {
125
+ label: "",
126
+ text : "The label is optional — omitting it removes the blue heading entirely.",
127
+ items: [
128
+ { label: "STATUS", value: "Open BETA" }
129
+ ]
130
+ },
131
+ render,
132
+ parameters: {
133
+ docs: {
134
+ description: {
135
+ story: "`label` omitted — no heading above the body text."
136
+ }
137
+ }
138
+ }
139
+ };
140
+
141
+ export const Playground = {
142
+ name: "Playground",
143
+ args: {
144
+ label: "Quick answer",
145
+ text : "Bitdefender AI Guardian is a security layer for autonomous AI agents on macOS.",
146
+ items: [
147
+ { label: "PLATFORM", value: "macOS" },
148
+ { label: "STATUS", value: "Open BETA" },
149
+ { label: "MADE BY", value: "Bitdefender" }
150
+ ]
151
+ },
152
+ render,
153
+ parameters: {
154
+ docs: {
155
+ description: {
156
+ story: "Fully interactive story — use the Controls panel to edit label, text, and meta items live."
157
+ }
158
+ }
159
+ }
160
+ };
@@ -0,0 +1,49 @@
1
+ import { LitElement, css, html } from "lit";
2
+ import { tokens } from "../../tokens/tokens.js";
3
+
4
+ class TerminalCursor extends LitElement {
5
+ static properties = {
6
+ color: { type: String }
7
+ };
8
+
9
+ static styles = [
10
+ tokens,
11
+ css`
12
+ :host {
13
+ display: inline-block;
14
+ width: 8px;
15
+ height: 16px;
16
+ vertical-align: middle;
17
+ }
18
+
19
+ .bd-terminal-cursor {
20
+ width: 100%;
21
+ height: 100%;
22
+ background: var(--bd-terminal-cursor-color, var(--color-blue-400));
23
+ animation: bd-terminal-cursor-blink 1s steps(1) infinite;
24
+ display: block;
25
+ }
26
+
27
+ @keyframes bd-terminal-cursor-blink {
28
+ 0%, 50% {
29
+ opacity: 1;
30
+ }
31
+ 50.01%, 100% {
32
+ opacity: 0;
33
+ }
34
+ }
35
+ `
36
+ ];
37
+
38
+ constructor() {
39
+ super();
40
+ this.color = "";
41
+ }
42
+
43
+ render() {
44
+ const style = this.color ? `background: ${this.color};` : "";
45
+ return html`<span class="bd-terminal-cursor" style="${style}"></span>`;
46
+ }
47
+ }
48
+
49
+ customElements.define("bd-terminal-cursor", TerminalCursor);
@@ -0,0 +1,161 @@
1
+ import { css } from "lit";
2
+
3
+ export default css`
4
+ :host {
5
+ display: block;
6
+ font-family: var(--typography-fontFamily-mono, monospace);
7
+ color: var(--color-neutral-0, #fff);
8
+ background: #151719;
9
+ border-radius: var(--radius-xl, 12px);
10
+ padding: var(--spacing-14) var(--spacing-16) var(--spacing-32);
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ /* === TITLEBAR (traffic-light dots only, no label) === */
15
+ .bd-terminalmsg-titlebar {
16
+ display: flex;
17
+ align-items: center;
18
+ gap: var(--spacing-8);
19
+ padding-bottom: var(--spacing-16);
20
+ }
21
+
22
+ .bd-terminalmsg-dot {
23
+ width: var(--spacing-8);
24
+ height: var(--spacing-8);
25
+ border-radius: 50%;
26
+ display: inline-block;
27
+ flex-shrink: 0;
28
+ }
29
+
30
+ .bd-terminalmsg-dot--red {
31
+ background: #ff5f56;
32
+ }
33
+
34
+ .bd-terminalmsg-dot--yellow {
35
+ background: #ffbd2e;
36
+ }
37
+
38
+ .bd-terminalmsg-dot--green {
39
+ background: #27c93f;
40
+ }
41
+
42
+ /* === PANEL === */
43
+ .bd-terminalmsg-panel {
44
+ position: relative;
45
+ border: 1px solid rgba(255, 255, 255, 0.12);
46
+ border-radius: var(--radius-lg, 10px);
47
+ padding: var(--spacing-20) var(--spacing-20) calc(var(--spacing-20) + var(--spacing-8));
48
+ }
49
+
50
+ /* Top "legend": text sitting on the top border line, background matching the
51
+ panel's own bg color masks the border behind the text. */
52
+ .bd-terminalmsg-panel-label {
53
+ position: absolute;
54
+ top: 0;
55
+ left: var(--spacing-16);
56
+ transform: translateY(-50%);
57
+ background: #151719;
58
+ padding: 0 var(--spacing-8);
59
+ color: rgba(255, 255, 255, 0.4);
60
+ font-family: var(--typography-fontFamily-mono, monospace);
61
+ font-size: var(--typography-fontSize-xs);
62
+ }
63
+
64
+ .bd-terminalmsg-body {
65
+ font-size: var(--typography-fontSize-sm);
66
+ line-height: var(--typography-lineHeight-normal);
67
+ }
68
+
69
+ .bd-terminalmsg-greeting-text {
70
+ color: var(--color-blue-400, #7ab8ff);
71
+ font-weight: var(--typography-fontWeight-bold);
72
+ }
73
+
74
+ .bd-terminalmsg-intro {
75
+ color: var(--color-neutral-0, #fff);
76
+ }
77
+
78
+ .bd-terminalmsg-list {
79
+ display: block;
80
+ padding-left: var(--spacing-16);
81
+ margin: 0 0 var(--spacing-12);
82
+ }
83
+
84
+ .bd-terminalmsg-footer {
85
+ color: var(--color-neutral-0, #fff);
86
+ margin: 0;
87
+ }
88
+
89
+ /* === HINT ("legend" sitting on the bottom border line, mirrors panel-label) === */
90
+ .bd-terminalmsg-hint {
91
+ position: absolute;
92
+ bottom: 0;
93
+ left: var(--spacing-16);
94
+ transform: translateY(50%);
95
+ background: #151719;
96
+ padding: 0 var(--spacing-8);
97
+ color: rgba(255, 255, 255, 0.5);
98
+ font-family: var(--typography-fontFamily-mono, monospace);
99
+ font-size: var(--typography-fontSize-xs);
100
+ white-space: nowrap;
101
+ }
102
+
103
+ /* Bracketed key labels inside the hint (e.g. "[Enter]", "[esc]") — bold + white,
104
+ standing out from the rest of the dimmer hint text. */
105
+ .bd-terminalmsg-hint-key {
106
+ color: #fff;
107
+ font-weight: var(--typography-fontWeight-bold, 700);
108
+ }
109
+
110
+ /* === TYPED-LINE API (bd-terminal-message .lines=...) ===
111
+ A literal sequence of terminal lines, each with its own semantic
112
+ color/weight — for content like:
113
+ $ npx skills add bitdefender/agent-skill-scanner → cmd
114
+ ✓ agent-skill-scanner installed → ok
115
+ ──────────────────────────────── → sep
116
+ > scan the my-skill skill for security risks → ask
117
+ ──────────────────────────────── → sep
118
+ # Skill Scan: my-skill → strong
119
+ - Severity: CLEAN → dim
120
+ - Scan Date: 2026-06-15 → dim
121
+ No security findings detected. → dim
122
+ */
123
+ .bd-terminalmsg-lines {
124
+ display: block;
125
+ }
126
+
127
+ .bd-terminalmsg-l-cmd {
128
+ color: var(--color-neutral-0, #fff);
129
+ font-weight: var(--typography-fontWeight-bold, 700);
130
+ }
131
+
132
+ .bd-terminalmsg-l-ok {
133
+ color: #27c93f;
134
+ padding-bottom: var(--spacing-12);
135
+ }
136
+
137
+ .bd-terminalmsg-l-ask {
138
+ color: var(--color-blue-400, #7ab8ff);
139
+ padding: var(--spacing-12) 0;
140
+ }
141
+
142
+ .bd-terminalmsg-l-strong {
143
+ color: var(--color-neutral-0, #fff);
144
+ font-weight: var(--typography-fontWeight-bold, 700);
145
+ padding-top: var(--spacing-12);
146
+ }
147
+
148
+ .bd-terminalmsg-l-dim {
149
+ color: rgba(255, 255, 255, 0.5);
150
+ }
151
+
152
+ .bd-terminalmsg-l-space {
153
+ height: var(--spacing-12);
154
+ }
155
+
156
+ .bd-terminalmsg-l-sep {
157
+ border: none;
158
+ border-top: 1px solid rgba(255, 255, 255, 0.12);
159
+ margin: var(--spacing-8) 0;
160
+ }
161
+ `;