@repobit/dex-system-design 0.24.4 → 0.24.6

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 (72) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/package.json +4 -4
  3. package/src/components/accordion/accordion.css.js +40 -0
  4. package/src/components/accordion/accordion.js +31 -0
  5. package/src/components/accordion/accordion.stories.js +147 -4
  6. package/src/components/agent-endpoints/agent-endpoints.css.js +92 -0
  7. package/src/components/agent-endpoints/agent-endpoints.js +86 -0
  8. package/src/components/agent-endpoints/agent-endpoints.stories.js +148 -0
  9. package/src/components/ai-guardian-demo.stories.js +848 -0
  10. package/src/components/awards/awards-flex.css.js +169 -0
  11. package/src/components/awards/awards-flex.js +269 -0
  12. package/src/components/awards/awards-flex.stories.js +657 -0
  13. package/src/components/bento-grid/bento-grid.css.js +57 -0
  14. package/src/components/bento-grid/bento-grid.js +186 -0
  15. package/src/components/bento-grid/bento-grid.stories.js +440 -0
  16. package/src/components/bento-grid/bento-item.css.js +105 -0
  17. package/src/components/bento-grid/bento-item.js +57 -0
  18. package/src/components/button/button.css.js +26 -0
  19. package/src/components/button/button.js +8 -0
  20. package/src/components/button/button.stories.js +12 -0
  21. package/src/components/comparison-panel/comparison-panel.css.js +104 -0
  22. package/src/components/comparison-panel/comparison-panel.js +100 -0
  23. package/src/components/comparison-panel/comparison-panel.stories.js +223 -0
  24. package/src/components/compatibility-table/compatibility-table.css.js +243 -0
  25. package/src/components/compatibility-table/compatibility-table.js +123 -0
  26. package/src/components/compatibility-table/compatibility-table.stories.js +189 -0
  27. package/src/components/cta-banner/cta-banner.css.js +60 -0
  28. package/src/components/cta-banner/cta-banner.js +63 -0
  29. package/src/components/dropdown/dropdown.css.js +1 -1
  30. package/src/components/footer/footer.css.js +0 -1
  31. package/src/components/header/header-code.css.js +125 -0
  32. package/src/components/header/header-code.js +69 -0
  33. package/src/components/header/header-code.stories.js +226 -0
  34. package/src/components/heading/heading.css.js +3 -0
  35. package/src/components/icons/bd-ai-icon.js +27 -0
  36. package/src/components/icons/quote-icon.js +28 -0
  37. package/src/components/install-options/install-options.css.js +276 -0
  38. package/src/components/install-options/install-options.js +184 -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.css.js +1 -5
  47. package/src/components/paragraph/paragraph.js +7 -3
  48. package/src/components/process-steps/process-steps.css.js +95 -0
  49. package/src/components/process-steps/process-steps.js +72 -0
  50. package/src/components/process-steps/process-steps.stories.js +144 -0
  51. package/src/components/quick-answer/quick-answer.css.js +67 -0
  52. package/src/components/quick-answer/quick-answer.js +59 -0
  53. package/src/components/quick-answer/quick-answer.stories.js +160 -0
  54. package/src/components/review/review-grid.css.js +34 -0
  55. package/src/components/review/review-grid.js +63 -0
  56. package/src/components/review/review.css.js +50 -0
  57. package/src/components/review/review.js +58 -0
  58. package/src/components/review/review.stories.js +228 -0
  59. package/src/components/terminal/terminal-cursor.js +49 -0
  60. package/src/components/terminal/terminal-message.css.js +161 -0
  61. package/src/components/terminal/terminal-message.js +169 -0
  62. package/src/components/terminal/terminal-message.stories.js +321 -0
  63. package/src/components/trust-panel/trust-panel.css.js +167 -0
  64. package/src/components/trust-panel/trust-panel.js +116 -0
  65. package/src/components/trust-panel/trust-panel.stories.js +234 -0
  66. package/src/tokens/tokens.css +1 -1
  67. package/src/components/tabsComponent/tabsComponent.css.js +0 -267
  68. package/src/components/tabsComponent/tabsComponent.js +0 -193
  69. package/src/components/tabsComponent/tabsComponent.stories.js +0 -134
  70. package/src/components/tabsComponentFamily/tabsComponentFamily.css.js +0 -181
  71. package/src/components/tabsComponentFamily/tabsComponentFamily.js +0 -180
  72. package/src/components/tabsComponentFamily/tabsComponentFamily.stories.js +0 -319
@@ -0,0 +1,193 @@
1
+ import { html } from "lit";
2
+ import "./overview.js";
3
+
4
+ export default {
5
+ title : "Components/Overview",
6
+ component : "bd-info-panel",
7
+ tags : ["autodocs"],
8
+ parameters: {
9
+ layout: "fullscreen",
10
+ docs : {
11
+ description: {
12
+ component: `
13
+ **InfoPanel** pairs a large title + description on the left with a stacked list of
14
+ labeled facts on the right, each row separated by a thin top border line — a
15
+ "spec sheet" style layout, e.g. for a product's key facts.
16
+
17
+ ### Usage
18
+ \`\`\`html
19
+ <bd-info-panel
20
+ title="What is AI Guardian?"
21
+ description="AI Guardian is a Bitdefender security product that helps protect people and organisations from the risks of autonomous AI agents — prompt injection, unsafe tool use, data leakage, and unauthorised actions. It adds a baseline security model of policies, permissions, and auditing, guardrails for tool execution, and monitoring and response workflows."
22
+ .facts=\${[
23
+ { label: "CATEGORY", value: "AI agent security" },
24
+ { label: "PLATFORM", value: "macOS (initial)" },
25
+ { label: "RUNS AS", value: "Background service" },
26
+ { label: "VERDICTS", value: "Allowed / Flagged / Blocked" }
27
+ ]}
28
+ ></bd-info-panel>
29
+ \`\`\`
30
+
31
+ ### Attributes
32
+ | Attribute | Type | Default | Description |
33
+ |------------------|--------|---------|-------------------------------------------------------------|
34
+ | \`title\` | String | \`""\` | Large heading on the left (or use the \`title\` slot) |
35
+ | \`description\` | String | \`""\` | Supporting paragraph under the title (or the \`description\` slot) |
36
+ | \`facts\` | Array | \`[]\` | Right-column rows: \`{ label, value }\` |
37
+
38
+ ### Slots
39
+ | Slot | Description |
40
+ |-----------------|--------------------------------------------------------------|
41
+ | \`title\` | Overrides the \`title\` attribute if content is provided |
42
+ | \`description\` | Overrides the \`description\` attribute if content is provided |
43
+ | \`facts\` | Extra freeform fact rows appended after the ones from \`facts\` |
44
+ | (default) | Extra freeform content appended after the description on the left |
45
+ `
46
+ }
47
+ }
48
+ },
49
+ argTypes: {
50
+ title : { control: "text", table: { category: "Content" } },
51
+ description: { control: "text", table: { category: "Content" } },
52
+ facts : { control: "object", table: { category: "Content" } }
53
+ }
54
+ };
55
+
56
+ const render = (args) => html`
57
+ <bd-info-panel
58
+ title=${args.title}
59
+ description=${args.description}
60
+ .facts=${args.facts}
61
+ ></bd-info-panel>
62
+ `;
63
+
64
+ export const Default = {
65
+ name: "Default — AI Guardian",
66
+ args: {
67
+ title : "What is AI Guardian?",
68
+ description: "AI Guardian is a Bitdefender security product that helps protect people and organisations from the risks of autonomous AI agents — prompt injection, unsafe tool use, data leakage, and unauthorised actions. It adds a baseline security model of policies, permissions, and auditing, guardrails for tool execution, and monitoring and response workflows.",
69
+ facts : [
70
+ { label: "CATEGORY", value: "AI agent security" },
71
+ { label: "PLATFORM", value: "macOS (initial)" },
72
+ { label: "RUNS AS", value: "Background service" },
73
+ { label: "VERDICTS", value: "Allowed / Flagged / Blocked" }
74
+ ]
75
+ },
76
+ render,
77
+ parameters: {
78
+ docs: {
79
+ description: {
80
+ story: "Matches the reference design exactly: title + description on the left, 4 labeled fact rows on the right, each preceded by a thin blue divider line."
81
+ }
82
+ }
83
+ }
84
+ };
85
+
86
+ export const TwoFacts = {
87
+ name: "Two Facts",
88
+ args: {
89
+ title : "What is AI Guardian?",
90
+ description: "A shorter description paired with just two fact rows on the right.",
91
+ facts : [
92
+ { label: "CATEGORY", value: "AI agent security" },
93
+ { label: "PLATFORM", value: "macOS (initial)" }
94
+ ]
95
+ },
96
+ render,
97
+ parameters: {
98
+ docs: {
99
+ description: {
100
+ story: "Only 2 facts — the right column is simply shorter, no extra spacing added to compensate."
101
+ }
102
+ }
103
+ }
104
+ };
105
+
106
+ export const ManyFacts = {
107
+ name: "Many Facts",
108
+ args: {
109
+ title : "What is AI Guardian?",
110
+ description: "A longer fact list demonstrates the row/divider pattern repeating cleanly.",
111
+ facts : [
112
+ { label: "CATEGORY", value: "AI agent security" },
113
+ { label: "PLATFORM", value: "macOS (initial)" },
114
+ { label: "RUNS AS", value: "Background service" },
115
+ { label: "VERDICTS", value: "Allowed / Flagged / Blocked" },
116
+ { label: "PRICING", value: "Free during open BETA" },
117
+ { label: "LANGUAGE", value: "Swift" }
118
+ ]
119
+ },
120
+ render,
121
+ parameters: {
122
+ docs: {
123
+ description: {
124
+ story: "6 fact rows — the pattern of divider + label + value repeats consistently regardless of count."
125
+ }
126
+ }
127
+ }
128
+ };
129
+
130
+ export const NoDescription = {
131
+ name: "No Description",
132
+ args: {
133
+ title : "What is AI Guardian?",
134
+ description: "",
135
+ facts : [
136
+ { label: "CATEGORY", value: "AI agent security" },
137
+ { label: "PLATFORM", value: "macOS (initial)" }
138
+ ]
139
+ },
140
+ render,
141
+ parameters: {
142
+ docs: {
143
+ description: {
144
+ story: "`description` omitted — no paragraph rendered under the title, no leftover gap."
145
+ }
146
+ }
147
+ }
148
+ };
149
+
150
+ export const SlottedContent = {
151
+ name : "Slotted Title, Description, and Extra Facts",
152
+ render: () => html`
153
+ <bd-info-panel>
154
+ <span slot="title">Custom <em>slotted</em> title</span>
155
+ <span slot="description">Custom slotted description with <strong>inline markup</strong>.</span>
156
+
157
+ <div slot="facts" class="bd-infopanel-row" style="display:flex; flex-direction:column; gap:4px; padding-top:16px;">
158
+ <div style="border-top: 1px solid #3b82f6; margin-bottom:16px;"></div>
159
+ <span style="text-transform:uppercase; letter-spacing:0.06em; font-size:12px; color:#60a5fa;">EXTRA</span>
160
+ <strong>A manually slotted fact row</strong>
161
+ </div>
162
+ </bd-info-panel>
163
+ `,
164
+ parameters: {
165
+ docs: {
166
+ description: {
167
+ story: "Demonstrates overriding `title`/`description` via slots (for inline markup) and appending an extra fact row via the `facts` slot alongside the ones generated from the `facts` array."
168
+ }
169
+ }
170
+ }
171
+ };
172
+
173
+ export const Playground = {
174
+ name: "Playground",
175
+ args: {
176
+ title : "What is AI Guardian?",
177
+ description: "AI Guardian is a Bitdefender security product that helps protect people and organisations from the risks of autonomous AI agents.",
178
+ facts : [
179
+ { label: "CATEGORY", value: "AI agent security" },
180
+ { label: "PLATFORM", value: "macOS (initial)" },
181
+ { label: "RUNS AS", value: "Background service" },
182
+ { label: "VERDICTS", value: "Allowed / Flagged / Blocked" }
183
+ ]
184
+ },
185
+ render,
186
+ parameters: {
187
+ docs: {
188
+ description: {
189
+ story: "Fully interactive story — use the Controls panel to edit title, description, and the facts array live."
190
+ }
191
+ }
192
+ }
193
+ };
@@ -0,0 +1,100 @@
1
+ import { css } from "lit";
2
+
3
+ export const pageSwitcherStyles = css`
4
+ :host {
5
+ display: block;
6
+ position: sticky;
7
+ top: 0;
8
+ z-index: 200;
9
+ background: var(--color-neutral-0);
10
+ border-bottom: var(--border-width-1) solid var(--color-neutral-100);
11
+ --bd-accesibility-focus: var(--color-blue-500);
12
+ }
13
+
14
+ .inner {
15
+ max-width: 1200px;
16
+ margin-inline: auto;
17
+ padding-block: var(--spacing-16);
18
+ padding-inline: var(--spacing-24);
19
+ box-sizing: border-box;
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: space-between;
23
+ gap: var(--spacing-32);
24
+ }
25
+
26
+ .logo {
27
+ font-size: var(--typography-fontSize-lg);
28
+ font-weight: var(--typography-fontWeight-semibold);
29
+ color: var(--color-neutral-900);
30
+ }
31
+
32
+ .logo span {
33
+ color: var(--color-blue-500);
34
+ }
35
+
36
+ nav {
37
+ display: flex;
38
+ align-items: center;
39
+ gap: var(--spacing-16) var(--spacing-32);
40
+ }
41
+
42
+ .page-link {
43
+ position: relative;
44
+ text-decoration: none !important;
45
+ color: var(--color-neutral-900);
46
+ font-weight: var(--typography-fontWeight-normal);
47
+ padding: var(--spacing-10) var(--spacing-0);
48
+ display: inline-block;
49
+ font-size: var(--typography-body-regular-fontSize);
50
+ font-family: var(--typography-body-regular-fontFamily);
51
+ transition: color var(--transition-duration-fast) var(--transition-easing-smooth);
52
+ }
53
+
54
+ .page-link.active {
55
+ font-weight: var(--typography-fontWeight-semibold);
56
+ color: var(--color-neutral-900);
57
+ }
58
+
59
+ .page-link:hover,
60
+ .page-link.bd-link--primary:hover {
61
+ color: var(--color-blue-500) !important;
62
+ text-decoration: none !important;
63
+ }
64
+
65
+ .page-link.bd-link--secondary:hover {
66
+ color: var(--color-neutral-900) !important;
67
+ text-decoration: none !important;
68
+ }
69
+
70
+ .page-link.active:hover {
71
+ color: var(--color-neutral-900) !important;
72
+ }
73
+
74
+ .page-link::after {
75
+ content: "";
76
+ position: absolute;
77
+ left: var(--spacing-0);
78
+ bottom: calc(-1 * var(--spacing-14));
79
+ width: 0%;
80
+ height: var(--border-width-3);
81
+ background-color: var(--color-blue-500);
82
+ transition: width var(--transition-duration-slow) var(--transition-easing-ease-out);
83
+ }
84
+
85
+ .page-link.active::after {
86
+ width: 100%;
87
+ }
88
+
89
+ .page-link:focus-visible {
90
+ outline: var(--spacing-2) solid var(--bd-accesibility-focus);
91
+ outline-offset: var(--spacing-2);
92
+ border-radius: var(--space-2xs);
93
+ }
94
+
95
+ @media (prefers-reduced-motion: reduce) {
96
+ .page-link::after {
97
+ transition: none !important;
98
+ }
99
+ }
100
+ `;
@@ -0,0 +1,42 @@
1
+ import { LitElement, html, nothing } from "lit";
2
+ import { tokens } from "../../tokens/tokens.js";
3
+ import "../icons/bd-ai-icon.js";
4
+ import "../link/link.js";
5
+ import { pageSwitcherStyles } from "./page-switcher.css.js";
6
+
7
+ class BdPageSwitcher extends LitElement {
8
+ static properties = {
9
+ items: { type: Array } // [{ title, href, active }]
10
+ };
11
+
12
+ static styles = [tokens, pageSwitcherStyles];
13
+
14
+ constructor() {
15
+ super();
16
+ this.items = [];
17
+ }
18
+
19
+ render() {
20
+ return html`
21
+ <div class="inner">
22
+ <bd-ai-icon class="logo" width="126" height="24"></bd-ai-icon>
23
+
24
+ <nav aria-label="Product navigation">
25
+ ${this.items.map(({ title, href, active }) => html`
26
+ <bd-link
27
+ href=${href}
28
+ kind=${active ? "primary" : "secondary"}
29
+ no-underline
30
+ color="var(--color-neutral-900)"
31
+ ?active=${active}
32
+ aria-current=${active ? "true" : nothing}
33
+ class="page-link ${active ? "active" : ""}"
34
+ >${title || nothing}</bd-link>
35
+ `)}
36
+ </nav>
37
+ </div>
38
+ `;
39
+ }
40
+ }
41
+
42
+ customElements.define("bd-page-switcher", BdPageSwitcher);
@@ -3,7 +3,7 @@ import { css } from "lit";
3
3
  export default css`
4
4
  :host {
5
5
  display: block;
6
- color: var(--color-neutral-1000);
6
+ color: var(--bd-paragraph-color, var(--color-neutral-1000));
7
7
  }
8
8
 
9
9
  p {
@@ -47,8 +47,4 @@ export default css`
47
47
  line-height: var(--typography-body-lead-lineHeight);
48
48
  letter-spacing: var(--typography-body-lead-letterSpacing);
49
49
  }
50
-
51
-
52
-
53
-
54
50
  `;
@@ -7,8 +7,9 @@ export class BdP extends LitElement {
7
7
  kind : { type: String, reflect: true },
8
8
  padding : { type: String },
9
9
  paddingBottom: { type: String },
10
- paddingTop : { type: String }
11
-
10
+ paddingTop : { type: String },
11
+ fontFamily : { type: String, attribute: "font-family" },
12
+ fontWeight : { type: String, attribute: "font-weight" }
12
13
  };
13
14
 
14
15
  constructor() {
@@ -17,7 +18,8 @@ export class BdP extends LitElement {
17
18
  this.padding = "";
18
19
  this.paddingBottom = "";
19
20
  this.paddingTop = "";
20
-
21
+ this.fontFamily = "";
22
+ this.fontWeight = "";
21
23
  }
22
24
 
23
25
  _getKindClass() {
@@ -38,6 +40,8 @@ export class BdP extends LitElement {
38
40
  if (this.padding) styles.push(`padding: ${this.padding};`);
39
41
  if (this.paddingBottom) styles.push(`padding-bottom: ${this.paddingBottom};`);
40
42
  if (this.paddingTop) styles.push(`padding-top: ${this.paddingTop};`);
43
+ if (this.fontFamily) styles.push(`font-family: ${this.fontFamily};`);
44
+ if (this.fontWeight) styles.push(`font-weight: ${this.fontWeight};`);
41
45
 
42
46
  const kindClass = this._getKindClass();
43
47
 
@@ -0,0 +1,95 @@
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-processsteps-container {
10
+ color: var(--color-neutral-0);
11
+ background: linear-gradient(160deg, var(--color-neutral-800) 0%, #0b1626 100%);
12
+ padding: var(--spacing-64) var(--spacing-24) var(--spacing-64) var(--spacing-24);
13
+ box-sizing: border-box;
14
+ }
15
+
16
+ .bd-processsteps-title {
17
+ display: block;
18
+ margin: 0 0 var(--spacing-12);
19
+ color: var(--color-neutral-0, #fff);
20
+ line-height: var(--typography-lineHeight-tight, 1.1);
21
+ max-width: 900px;
22
+ margin-left: auto;
23
+ margin-right: auto;
24
+ }
25
+
26
+ .bd-processsteps-description {
27
+ display: block;
28
+ margin: 0 0 var(--spacing-40);
29
+ color: var(--color-neutral-300, #d1d5db);
30
+ max-width: 900px;
31
+ margin-left: auto;
32
+ margin-right: auto;
33
+ --typography-body-regular-fontWeight: var(--typography-fontWeight-bold, 700);
34
+
35
+ }
36
+
37
+ /* === GRID === */
38
+ .bd-processsteps-grid {
39
+ display: grid;
40
+ grid-template-columns: repeat(3, 1fr);
41
+ gap: var(--spacing-32);
42
+ max-width: 900px;
43
+ margin: 0 auto;
44
+ }
45
+
46
+ .bd-processsteps-step {
47
+ display: flex;
48
+ flex-direction: column;
49
+ }
50
+
51
+ .bd-processsteps-divider {
52
+ border-top: 1px solid rgba(255, 255, 255, 0.12);
53
+ margin-bottom: var(--spacing-24);
54
+ }
55
+
56
+ .bd-processsteps-icon-wrap {
57
+ display: flex;
58
+ align-items: center;
59
+ justify-content: center;
60
+ width: 40px;
61
+ height: 40px;
62
+ margin-bottom: var(--spacing-16);
63
+ color: var(--color-blue-400, #60a5fa);
64
+ }
65
+
66
+ .bd-processsteps-icon-img {
67
+ width: 100%;
68
+ height: 100%;
69
+ object-fit: contain;
70
+ }
71
+
72
+ .bd-processsteps-step-title {
73
+ display: block;
74
+ margin: 0 0 var(--spacing-8);
75
+ color: var(--color-neutral-0, #fff);
76
+ }
77
+
78
+ .bd-processsteps-step-description {
79
+ display: block;
80
+ margin: 0;
81
+ color: var(--color-neutral-300, #d1d5db);
82
+ }
83
+
84
+ /* === RESPONSIVE === */
85
+ @media (max-width: 899px) {
86
+ .bd-processsteps-grid {
87
+ grid-template-columns: 1fr;
88
+ gap: var(--spacing-32);
89
+ }
90
+
91
+ .bd-processsteps-container {
92
+ padding: var(--spacing-48) var(--spacing-24);
93
+ }
94
+ }
95
+ `;
@@ -0,0 +1,72 @@
1
+ import { LitElement, html, nothing } from "lit";
2
+ import { tokens } from "../../tokens/tokens.js";
3
+ import "../heading/heading.js";
4
+ import "../icons/close-icon.js";
5
+ import "../icons/globe-icon.js";
6
+ import "../icons/guide-icon.js";
7
+ import "../paragraph/paragraph.js";
8
+ import processStepsCSS from "./process-steps.css.js";
9
+
10
+ class ProcessSteps extends LitElement {
11
+ static properties = {
12
+ title : { type: String },
13
+ description: { type: String },
14
+ steps : { type: Array } // [{ icon: TemplateResult|String, title: String, description: String }]
15
+ };
16
+
17
+ static styles = [tokens, processStepsCSS];
18
+
19
+ constructor() {
20
+ super();
21
+ this.title = "";
22
+ this.description = "";
23
+ this.steps = [];
24
+ }
25
+
26
+ _renderIcon(icon) {
27
+ if (!icon) return nothing;
28
+ if (typeof icon === "string") {
29
+ return html`<img src="${icon}" alt="" class="bd-processsteps-icon-img" />`;
30
+ }
31
+ return icon;
32
+ }
33
+
34
+ render() {
35
+ return html`
36
+ <div class="bd-processsteps-container">
37
+ ${this.title
38
+ ? html`
39
+ <bd-h as="h2" class="bd-processsteps-title">
40
+ <slot name="title">${this.title}</slot>
41
+ </bd-h>
42
+ `
43
+ : nothing}
44
+
45
+ ${this.description
46
+ ? html`
47
+ <bd-p kind="regular" class="bd-processsteps-description">
48
+ <slot name="description">${this.description}</slot>
49
+ </bd-p>
50
+ `
51
+ : nothing}
52
+
53
+ <div class="bd-processsteps-grid">
54
+ ${this.steps.map(
55
+ (step) => html`
56
+ <div class="bd-processsteps-step">
57
+ <div class="bd-processsteps-divider"></div>
58
+ <div class="bd-processsteps-icon-wrap">${this._renderIcon(step.icon)}</div>
59
+ <bd-h as="h4" class="bd-processsteps-step-title">${step.title}</bd-h>
60
+ <bd-p kind="regular" class="bd-processsteps-step-description">${step.description}</bd-p>
61
+ </div>
62
+ `
63
+ )}
64
+ </div>
65
+
66
+ <slot name="steps"></slot>
67
+ </div>
68
+ `;
69
+ }
70
+ }
71
+
72
+ customElements.define("bd-process-steps", ProcessSteps);
@@ -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
+ };