@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,105 @@
1
+ import { css } from "lit";
2
+
3
+ export default css`
4
+ :host {
5
+ display: block;
6
+ height: 100%;
7
+ --background-card-grey: var(--color-neutral-25);
8
+ box-sizing: border-box;
9
+ }
10
+
11
+ .bd-bentoitem-box {
12
+ background: var(--background-card-grey);
13
+ border-radius: var(--spacing-20);
14
+ padding: var(--spacing-32);
15
+ display: flex;
16
+ flex-direction: column;
17
+ align-items: stretch;
18
+ justify-content: flex-start;
19
+ text-align: start;
20
+ height: 100%;
21
+ box-sizing: border-box;
22
+ font-family: var(--typography-fontFamily-sans);
23
+ min-width: 0;
24
+ transition: transform 0.25s ease, box-shadow 0.25s ease;
25
+ border: 1px solid var(--color-neutral-100);
26
+ }
27
+
28
+
29
+ .bd-bentoitem-box:hover {
30
+ transform: translateY(-3px);
31
+ box-shadow: 0px 14px 40px #00000012;
32
+ }
33
+
34
+ .bd-bentoitem-icon-wrap {
35
+ display: flex;
36
+ flex-direction: column;
37
+ align-items: flex-start;
38
+ justify-content: flex-start;
39
+ gap: var(--spacing-8);
40
+ padding-bottom: var(--spacing-8);
41
+ min-height: 48px;
42
+ }
43
+
44
+ .bd-bentoitem-icon,
45
+ ::slotted([slot="icon"]) {
46
+ max-width: 48px;
47
+ max-height: 48px;
48
+ width: 48px;
49
+ height: 48px;
50
+ object-fit: contain;
51
+ display: block;
52
+ }
53
+
54
+ .bd-bentoitem-title-wrap {
55
+ display: flex;
56
+ align-items: flex-start;
57
+ gap: var(--spacing-4, 4px);
58
+ overflow: hidden;
59
+ margin-bottom: var(--spacing-8);
60
+ width: 100%;
61
+ }
62
+
63
+ .bd-bentoitem-body {
64
+ font-size: var(--spacing-16);
65
+ margin: 0 0 1em 0;
66
+ color: var(--color-neutral-700, inherit);
67
+ width: 100%;
68
+ }
69
+
70
+ ::slotted(bd-p) {
71
+ width: 100%;
72
+ }
73
+
74
+ /* === TONE VARIANTS === */
75
+
76
+ :host([tone="tint"]) {
77
+ --background-card-grey: var(--color-blue-50);
78
+ }
79
+
80
+ :host([tone="tint"]) .bd-bentoitem-box {
81
+ border-color: var(--color-blue-50);
82
+ }
83
+
84
+ :host([tone="dark"]) {
85
+ --background-card-grey: var(--color-neutral-900);
86
+ }
87
+
88
+ :host([tone="dark"]) .bd-bentoitem-box {
89
+ border-color: var(--color-neutral-900);
90
+ }
91
+
92
+ :host([tone="dark"]) .bd-bentoitem-title-wrap bd-h {
93
+ color: var(--color-neutral-0);
94
+ }
95
+
96
+ :host([tone="dark"]) .bd-bentoitem-body {
97
+ --bd-paragraph-color: var(--color-neutral-0);
98
+ }
99
+
100
+ @media (max-width: 599px) {
101
+ .bd-bentoitem-box {
102
+ padding: var(--spacing-24);
103
+ }
104
+ }
105
+ `;
@@ -0,0 +1,57 @@
1
+ import { LitElement, html } from "lit";
2
+ import { tokens } from "../../tokens/tokens.js";
3
+ import "../heading/heading.js";
4
+ import "../paragraph/paragraph.js";
5
+ import bentoItemCSS from "./bento-item.css.js";
6
+
7
+ class BentoItem extends LitElement {
8
+ static properties = {
9
+ title : { type: String },
10
+ body : { type: String },
11
+ icon : { type: String },
12
+ priority : { type: String, reflect: true },
13
+ orientation: { type: String, attribute: "orientation" },
14
+ // "default" (neutral-25 fill) | "tint" (light blue fill) | "dark" (dark fill, light text)
15
+ tone : { type: String, reflect: true }
16
+ };
17
+
18
+ static styles = [tokens, bentoItemCSS];
19
+
20
+ constructor() {
21
+ super();
22
+ this.title = "";
23
+ this.body = "";
24
+ this.icon = "";
25
+ this.priority = "standard";
26
+ this.orientation = "auto";
27
+ this.tone = "default";
28
+ }
29
+
30
+ render() {
31
+ return html`
32
+ <div class="bd-bentoitem-box">
33
+ <div class="bd-bentoitem-icon-wrap">
34
+ <slot name="icon">
35
+ ${this.icon ? html`<img src="${this.icon}" alt="" class="bd-bentoitem-icon" />` : ""}
36
+ </slot>
37
+ </div>
38
+
39
+ ${this.title
40
+ ? html`
41
+ <div class="bd-bentoitem-title-wrap">
42
+ <bd-h as="h5" fontWeight="700">${this.title}</bd-h>
43
+ </div>
44
+ `
45
+ : ""}
46
+
47
+ ${this.body
48
+ ? html`<bd-p kind="regular" class="bd-bentoitem-body">${this.body}</bd-p>`
49
+ : ""}
50
+
51
+ <slot></slot>
52
+ </div>
53
+ `;
54
+ }
55
+ }
56
+
57
+ customElements.define("bd-bento-item", BentoItem);
@@ -219,4 +219,30 @@ export default css`
219
219
  transition: none !important;
220
220
  }
221
221
  }
222
+ .button--white {
223
+ background-color: var(--color-neutral-0);
224
+ color: var(--color-blue-500);
225
+ }
226
+
227
+ .button--white:hover {
228
+ background-color: var(--color-blue-50);
229
+ }
230
+
231
+ .button--white:active {
232
+ background-color: var(--color-blue-100);
233
+ }
234
+
235
+ .button--outline-white {
236
+ background-color: transparent;
237
+ box-shadow: inset 0 0 0 1.5px #ffffff8c;
238
+ color: var(--color-neutral-0);
239
+ }
240
+
241
+ .button--outline-white:hover {
242
+ background-color: rgba(255, 255, 255, 0.1);
243
+ }
244
+
245
+ .button--outline-white:active {
246
+ background-color: rgba(255, 255, 255, 0.2);
247
+ }
222
248
  `;
@@ -70,6 +70,10 @@ class Button extends LitElement {
70
70
  return "button--primary";
71
71
  case "danger":
72
72
  return "button--danger";
73
+ case "white":
74
+ return "button--white";
75
+ case "outline-white":
76
+ return "button--outline-white";
73
77
  default:
74
78
  return "";
75
79
  }
@@ -173,6 +177,10 @@ class ButtonLink extends LitElement {
173
177
  return "button--primary";
174
178
  case "danger":
175
179
  return "button--danger";
180
+ case "white":
181
+ return "button--white";
182
+ case "outline-white":
183
+ return "button--outline-white";
176
184
  default:
177
185
  return "";
178
186
  }
@@ -405,4 +405,16 @@ export const Playground = {
405
405
  </div>
406
406
  `,
407
407
  parameters: { docs: { description: { story: 'Interactive playground for `bd-button`. Use Controls to adjust all props including alignment.' } } }
408
+ };
409
+ // ─── White / Outline-White (on dark background) ───────────────────────────
410
+
411
+ export const ButtonWhiteOnDark = {
412
+ name : 'Button — White / Outline-White (on dark background)',
413
+ render: () => html`
414
+ <div style="background: linear-gradient(120deg, #0038e0 0%, #061a5c 100%); padding: 48px; border-radius: 12px; display:flex; gap:16px; flex-wrap:wrap; align-items:center; justify-content:center;">
415
+ <bd-button-link kind="white" size="md" strong href="#">Download BETA Today</bd-button-link>
416
+ <bd-button-link kind="outline-white" size="md" strong href="#">Read the docs</bd-button-link>
417
+ </div>
418
+ `,
419
+ parameters: { docs: { description: { story: '`white` and `outline-white` kinds, meant for use on colored/dark backgrounds like `bd-cta-banner` or hero sections.' } } }
408
420
  };
@@ -0,0 +1,104 @@
1
+ import { css } from "lit";
2
+
3
+ export default css`
4
+ :host {
5
+ display: block;
6
+ font-family: var(--typography-fontFamily-sans);
7
+ background: var(--color-blue-50);
8
+ }
9
+
10
+ .bd-comparisonpanel-wrapper {
11
+ max-width: var(--layout-ensemble-max-width, 1200px);
12
+ margin: 0 auto;
13
+ padding: var(--spacing-48) var(--layout-ensemble-inline-padding, var(--spacing-24));
14
+ box-sizing: border-box;
15
+ }
16
+
17
+ .bd-comparisonpanel-title {
18
+ margin: 0 0 var(--spacing-16);
19
+ color: var(--color-neutral-900);
20
+ line-height: var(--typography-lineHeight-tight, 1.1);
21
+ }
22
+
23
+ .bd-comparisonpanel-description {
24
+ margin: 0 0 var(--spacing-48);
25
+ color: var(--color-neutral-600);
26
+ max-width: 70ch;
27
+ }
28
+
29
+ /* === COLUMNS === */
30
+ .bd-comparisonpanel-columns {
31
+ display: grid;
32
+ grid-template-columns: 1fr 1fr;
33
+ gap: var(--spacing-24);
34
+ }
35
+
36
+ .bd-comparisonpanel-column {
37
+ background: var(--color-neutral-0, #fff);
38
+ border: 1px solid var(--color-neutral-100, #e5e7eb);
39
+ border-radius: var(--radius-2xl);
40
+ padding: var(--spacing-32);
41
+ box-sizing: border-box;
42
+ }
43
+
44
+ .bd-comparisonpanel-column-title {
45
+ margin: 0 0 var(--spacing-16);
46
+ color: var(--color-neutral-900);
47
+ }
48
+
49
+ /* === LIST === */
50
+ .bd-comparisonpanel-list {
51
+ list-style: none;
52
+ margin: 0;
53
+ padding: 0;
54
+ display: flex;
55
+ flex-direction: column;
56
+ gap: var(--spacing-16);
57
+ }
58
+
59
+ .bd-comparisonpanel-item {
60
+ display: flex;
61
+ align-items: flex-start;
62
+ gap: var(--spacing-12);
63
+ }
64
+
65
+ .bd-comparisonpanel-icon {
66
+ flex-shrink: 0;
67
+ width: var(--spacing-20);
68
+ height: var(--spacing-20);
69
+ border-radius: 50%;
70
+ display: flex;
71
+ align-items: center;
72
+ justify-content: center;
73
+ margin-top: 1px;
74
+ }
75
+
76
+ .bd-comparisonpanel-icon--positive {
77
+ background: var(--color-green-700);
78
+ }
79
+
80
+ .bd-comparisonpanel-icon--negative {
81
+ background: var(--color-red-600);
82
+ }
83
+
84
+ .bd-comparisonpanel-text {
85
+ margin: 0;
86
+ color: var(--color-neutral-800);
87
+ line-height: var(--typography-lineHeight-normal);
88
+ }
89
+
90
+ /* === RESPONSIVE === */
91
+ @media (max-width: 767px) {
92
+ .bd-comparisonpanel-columns {
93
+ grid-template-columns: 1fr;
94
+ }
95
+
96
+ .bd-comparisonpanel-wrapper {
97
+ padding: var(--spacing-32) var(--spacing-24);
98
+ }
99
+
100
+ .bd-comparisonpanel-column {
101
+ padding: var(--spacing-24);
102
+ }
103
+ }
104
+ `;
@@ -0,0 +1,100 @@
1
+ import { LitElement, html, nothing } from "lit";
2
+ import { tokens } from "../../tokens/tokens.js";
3
+ import "../heading/heading.js";
4
+ import "../paragraph/paragraph.js";
5
+ import comparisonPanelCSS from "./comparison-panel.css.js";
6
+
7
+ class ComparisonPanel extends LitElement {
8
+ static properties = {
9
+ title : { type: String },
10
+ description : { type: String },
11
+ positiveTitle: { type: String, attribute: "positive-title" },
12
+ negativeTitle: { type: String, attribute: "negative-title" },
13
+ positiveItems: { type: Array }, // [String]
14
+ negativeItems: { type: Array } // [String]
15
+ };
16
+
17
+ static styles = [tokens, comparisonPanelCSS];
18
+
19
+ constructor() {
20
+ super();
21
+ this.title = "";
22
+ this.description = "";
23
+ this.positiveTitle = "";
24
+ this.negativeTitle = "";
25
+ this.positiveItems = [];
26
+ this.negativeItems = [];
27
+ }
28
+
29
+ _renderColumn(kind, colTitle, items, slotName) {
30
+ const isPositive = kind === "positive";
31
+ return html`
32
+ <div class="bd-comparisonpanel-column">
33
+ ${colTitle
34
+ ? html`
35
+ <bd-h as="h4" class="bd-comparisonpanel-column-title">
36
+ <slot name="${slotName}-title">${colTitle}</slot>
37
+ </bd-h>
38
+ `
39
+ : nothing}
40
+
41
+ <ul class="bd-comparisonpanel-list">
42
+ ${items.map(
43
+ (item) => html`
44
+ <li class="bd-comparisonpanel-item">
45
+ <span
46
+ class="bd-comparisonpanel-icon ${isPositive ? "bd-comparisonpanel-icon--positive" : "bd-comparisonpanel-icon--negative"}"
47
+ aria-hidden="true"
48
+ >
49
+ ${isPositive
50
+ ? html`
51
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none">
52
+ <path d="M3 7.2l2.6 2.6L11 4.4" stroke="white" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
53
+ </svg>
54
+ `
55
+ : html`
56
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none">
57
+ <path d="M3.5 3.5l7 7M10.5 3.5l-7 7" stroke="white" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
58
+ </svg>
59
+ `}
60
+ </span>
61
+ <bd-p kind="regular" class="bd-comparisonpanel-text">${item}</bd-p>
62
+ </li>
63
+ `
64
+ )}
65
+ </ul>
66
+
67
+ <slot name="${slotName}"></slot>
68
+ </div>
69
+ `;
70
+ }
71
+
72
+ render() {
73
+ return html`
74
+ <div class="bd-comparisonpanel-wrapper">
75
+ ${this.title
76
+ ? html`
77
+ <bd-h as="h2" class="bd-comparisonpanel-title">
78
+ <slot name="title">${this.title}</slot>
79
+ </bd-h>
80
+ `
81
+ : nothing}
82
+
83
+ ${this.description
84
+ ? html`
85
+ <bd-p kind="regular" class="bd-comparisonpanel-description">
86
+ <slot name="description">${this.description}</slot>
87
+ </bd-p>
88
+ `
89
+ : nothing}
90
+
91
+ <div class="bd-comparisonpanel-columns">
92
+ ${this._renderColumn("positive", this.positiveTitle, this.positiveItems, "positive")}
93
+ ${this._renderColumn("negative", this.negativeTitle, this.negativeItems, "negative")}
94
+ </div>
95
+ </div>
96
+ `;
97
+ }
98
+ }
99
+
100
+ customElements.define("bd-comparison-panel", ComparisonPanel);
@@ -0,0 +1,223 @@
1
+ import { html } from "lit";
2
+ import "./comparison-panel.js";
3
+
4
+ export default {
5
+ title : "Components/Comparison Panel",
6
+ component : "bd-comparison-panel",
7
+ tags : ["autodocs"],
8
+ parameters: {
9
+ layout: "padded",
10
+ docs : {
11
+ description: {
12
+ component: `
13
+ **ComparisonPanel** shows a title, description, and two side-by-side white cards —
14
+ one with green checkmarks ("what it is"), one with red X marks ("what it isn't") —
15
+ used to clarify scope/positioning.
16
+
17
+ ### Usage
18
+ \`\`\`html
19
+ <bd-comparison-panel
20
+ title="What it is, and what it isn't"
21
+ description="AI Guardian secures the actions an AI agent takes. It is not a traditional antivirus, a network VPN, or a chatbot content filter."
22
+ positive-title="AI Guardian is"
23
+ negative-title="AI Guardian is not"
24
+ .positiveItems=\${[
25
+ "A security layer for autonomous AI agents.",
26
+ "A baseline model of policies, permissions, and auditing.",
27
+ "Guardrails and monitoring around tool execution.",
28
+ "Focused on agent actions, tool calls, and data access.",
29
+ "Built for macOS first, with more platforms planned."
30
+ ]}
31
+ .negativeItems=\${[
32
+ "A traditional endpoint antivirus.",
33
+ "A network firewall or VPN.",
34
+ "A replacement for your agent framework or LLM.",
35
+ "A content-quality filter for chatbot text."
36
+ ]}
37
+ ></bd-comparison-panel>
38
+ \`\`\`
39
+
40
+ ### Attributes
41
+ | Attribute | Type | Default | Description |
42
+ |----------------------|--------|---------|---------------------------------------------------|
43
+ | \`title\` | String | \`""\` | Heading above both columns (or the \`title\` slot) |
44
+ | \`description\` | String | \`""\` | Paragraph under the title (or the \`description\` slot) |
45
+ | \`positive-title\` | String | \`""\` | Left column heading (or the \`positive-title\` slot) |
46
+ | \`negative-title\` | String | \`""\` | Right column heading (or the \`negative-title\` slot) |
47
+ | \`positiveItems\` | Array | \`[]\` | Left column list items, each with a green checkmark |
48
+ | \`negativeItems\` | Array | \`[]\` | Right column list items, each with a red X mark |
49
+
50
+ ### Slots
51
+ | Slot | Description |
52
+ |---------------------|----------------------------------------------------------|
53
+ | \`title\` | Overrides the \`title\` attribute |
54
+ | \`description\` | Overrides the \`description\` attribute |
55
+ | \`positive-title\` | Overrides the \`positive-title\` attribute |
56
+ | \`negative-title\` | Overrides the \`negative-title\` attribute |
57
+ | \`positive\` | Extra freeform content appended after the positive list |
58
+ | \`negative\` | Extra freeform content appended after the negative list |
59
+ `
60
+ }
61
+ }
62
+ },
63
+ argTypes: {
64
+ title : { control: "text", table: { category: "Content" } },
65
+ description : { control: "text", table: { category: "Content" } },
66
+ positiveTitle: { control: "text", table: { category: "Content" } },
67
+ negativeTitle: { control: "text", table: { category: "Content" } },
68
+ positiveItems: { control: "object", table: { category: "Content" } },
69
+ negativeItems: { control: "object", table: { category: "Content" } }
70
+ }
71
+ };
72
+
73
+ const render = (args) => html`
74
+ <bd-comparison-panel
75
+ title=${args.title}
76
+ description=${args.description}
77
+ positive-title=${args.positiveTitle}
78
+ negative-title=${args.negativeTitle}
79
+ .positiveItems=${args.positiveItems}
80
+ .negativeItems=${args.negativeItems}
81
+ ></bd-comparison-panel>
82
+ `;
83
+
84
+ export const Default = {
85
+ name: "Default — AI Guardian Scope",
86
+ args: {
87
+ title : "What it is, and what it isn't",
88
+ description : "AI Guardian secures the actions an AI agent takes. It is not a traditional antivirus, a network VPN, or a chatbot content filter.",
89
+ positiveTitle: "AI Guardian is",
90
+ negativeTitle: "AI Guardian is not",
91
+ positiveItems: [
92
+ "A security layer for autonomous AI agents.",
93
+ "A baseline model of policies, permissions, and auditing.",
94
+ "Guardrails and monitoring around tool execution.",
95
+ "Focused on agent actions, tool calls, and data access.",
96
+ "Built for macOS first, with more platforms planned."
97
+ ],
98
+ negativeItems: [
99
+ "A traditional endpoint antivirus.",
100
+ "A network firewall or VPN.",
101
+ "A replacement for your agent framework or LLM.",
102
+ "A content-quality filter for chatbot text."
103
+ ]
104
+ },
105
+ render,
106
+ parameters: {
107
+ docs: {
108
+ description: {
109
+ story: "Matches the reference design exactly: title, description, and two bordered white cards with green checkmarks / red X marks."
110
+ }
111
+ }
112
+ }
113
+ };
114
+
115
+ export const UnevenLists = {
116
+ name: "Uneven List Lengths",
117
+ args: {
118
+ title : "What it is, and what it isn't",
119
+ description : "Columns don't need matching item counts — each renders independently.",
120
+ positiveTitle: "Included",
121
+ negativeTitle: "Not included",
122
+ positiveItems: [
123
+ "Real-time tool-call monitoring.",
124
+ "Automatic policy enforcement."
125
+ ],
126
+ negativeItems: [
127
+ "Manual code review.",
128
+ "Static analysis of source files.",
129
+ "Dependency vulnerability scanning.",
130
+ "License compliance checks.",
131
+ "Container image scanning."
132
+ ]
133
+ },
134
+ render,
135
+ parameters: {
136
+ docs: {
137
+ description: {
138
+ story: "The two columns have different item counts (2 vs 5) — each card simply sizes to its own content, no forced height matching."
139
+ }
140
+ }
141
+ }
142
+ };
143
+
144
+ export const NoDescription = {
145
+ name: "No Description",
146
+ args: {
147
+ title : "What it is, and what it isn't",
148
+ description : "",
149
+ positiveTitle: "AI Guardian is",
150
+ negativeTitle: "AI Guardian is not",
151
+ positiveItems: [
152
+ "A security layer for autonomous AI agents.",
153
+ "Built for macOS first."
154
+ ],
155
+ negativeItems: [
156
+ "A traditional endpoint antivirus.",
157
+ "A network firewall or VPN."
158
+ ]
159
+ },
160
+ render,
161
+ parameters: {
162
+ docs: {
163
+ description: {
164
+ story: "`description` omitted — no paragraph rendered under the title, no leftover gap."
165
+ }
166
+ }
167
+ }
168
+ };
169
+
170
+ export const SlottedExtraContent = {
171
+ name : "Slotted Extra Content Per Column",
172
+ render: () => html`
173
+ <bd-comparison-panel
174
+ title="What it is, and what it isn't"
175
+ description="Demonstrates appending extra freeform content after each list via the positive/negative slots."
176
+ positive-title="AI Guardian is"
177
+ negative-title="AI Guardian is not"
178
+ .positiveItems=${["A security layer for autonomous AI agents."]}
179
+ .negativeItems=${["A traditional endpoint antivirus."]}
180
+ >
181
+ <a slot="positive" href="#" style="display:inline-block; margin-top:12px; color:#16a34a; font-size:14px; font-weight:600;">See full feature list →</a>
182
+ <a slot="negative" href="#" style="display:inline-block; margin-top:12px; color:#dc2626; font-size:14px; font-weight:600;">Read the full comparison →</a>
183
+ </bd-comparison-panel>
184
+ `,
185
+ parameters: {
186
+ docs: {
187
+ description: {
188
+ story: "Each column exposes its own slot (`positive`/`negative`) for extra freeform content, such as a link, appended after the checklist."
189
+ }
190
+ }
191
+ }
192
+ };
193
+
194
+ export const Playground = {
195
+ name: "Playground",
196
+ args: {
197
+ title : "What it is, and what it isn't",
198
+ description : "AI Guardian secures the actions an AI agent takes. It is not a traditional antivirus, a network VPN, or a chatbot content filter.",
199
+ positiveTitle: "AI Guardian is",
200
+ negativeTitle: "AI Guardian is not",
201
+ positiveItems: [
202
+ "A security layer for autonomous AI agents.",
203
+ "A baseline model of policies, permissions, and auditing.",
204
+ "Guardrails and monitoring around tool execution.",
205
+ "Focused on agent actions, tool calls, and data access.",
206
+ "Built for macOS first, with more platforms planned."
207
+ ],
208
+ negativeItems: [
209
+ "A traditional endpoint antivirus.",
210
+ "A network firewall or VPN.",
211
+ "A replacement for your agent framework or LLM.",
212
+ "A content-quality filter for chatbot text."
213
+ ]
214
+ },
215
+ render,
216
+ parameters: {
217
+ docs: {
218
+ description: {
219
+ story: "Fully interactive story — use the Controls panel to edit titles, description, and both item arrays live."
220
+ }
221
+ }
222
+ }
223
+ };