@repobit/dex-system-design 0.24.4 → 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.
- package/CHANGELOG.md +7 -0
- package/package.json +4 -4
- package/src/components/accordion/accordion.css.js +40 -0
- package/src/components/accordion/accordion.js +31 -0
- package/src/components/accordion/accordion.stories.js +147 -4
- package/src/components/agent-endpoints/agent-endpoints.css.js +92 -0
- package/src/components/agent-endpoints/agent-endpoints.js +86 -0
- package/src/components/agent-endpoints/agent-endpoints.stories.js +148 -0
- package/src/components/ai-guardian-demo.stories.js +669 -0
- package/src/components/awards/awards-flex.css.js +169 -0
- package/src/components/awards/awards-flex.js +269 -0
- package/src/components/awards/awards-flex.stories.js +657 -0
- package/src/components/bento-grid/bento-grid.css.js +57 -0
- package/src/components/bento-grid/bento-grid.js +186 -0
- package/src/components/bento-grid/bento-grid.stories.js +440 -0
- package/src/components/bento-grid/bento-item.css.js +79 -0
- package/src/components/bento-grid/bento-item.js +54 -0
- package/src/components/button/button.css.js +26 -0
- package/src/components/button/button.js +8 -0
- package/src/components/button/button.stories.js +12 -0
- package/src/components/comparison-panel/comparison-panel.css.js +104 -0
- package/src/components/comparison-panel/comparison-panel.js +100 -0
- package/src/components/comparison-panel/comparison-panel.stories.js +223 -0
- package/src/components/compatibility-table/compatibility-table.css.js +243 -0
- package/src/components/compatibility-table/compatibility-table.js +123 -0
- package/src/components/compatibility-table/compatibility-table.stories.js +189 -0
- package/src/components/cta-banner/cta-banner.css.js +60 -0
- package/src/components/cta-banner/cta-banner.js +63 -0
- package/src/components/dropdown/dropdown.css.js +1 -1
- package/src/components/footer/footer.css.js +0 -1
- package/src/components/header/header-code.css.js +125 -0
- package/src/components/header/header-code.js +69 -0
- package/src/components/header/header-code.stories.js +226 -0
- package/src/components/heading/heading.css.js +3 -0
- package/src/components/icons/bd-ai-icon.js +27 -0
- package/src/components/list/list-item/list-item.css.js +3 -3
- package/src/components/list/list-item/list-item.js +10 -4
- package/src/components/overview/overview.css.js +121 -0
- package/src/components/overview/overview.js +63 -0
- package/src/components/overview/overview.stories.js +193 -0
- package/src/components/page-switcher/page-switcher.css.js +100 -0
- package/src/components/page-switcher/page-switcher.js +42 -0
- package/src/components/paragraph/paragraph.js +7 -3
- package/src/components/process-steps/process-steps.css.js +95 -0
- package/src/components/process-steps/process-steps.js +72 -0
- package/src/components/process-steps/process-steps.stories.js +144 -0
- package/src/components/quick-answer/quick-answer.css.js +67 -0
- package/src/components/quick-answer/quick-answer.js +59 -0
- package/src/components/quick-answer/quick-answer.stories.js +160 -0
- package/src/components/terminal/terminal-cursor.js +49 -0
- package/src/components/terminal/terminal-message.css.js +161 -0
- package/src/components/terminal/terminal-message.js +169 -0
- package/src/components/terminal/terminal-message.stories.js +321 -0
- package/src/components/trust-panel/trust-panel.css.js +167 -0
- package/src/components/trust-panel/trust-panel.js +116 -0
- package/src/components/trust-panel/trust-panel.stories.js +234 -0
- package/src/tokens/tokens.css +1 -1
- package/src/components/tabsComponent/tabsComponent.css.js +0 -267
- package/src/components/tabsComponent/tabsComponent.js +0 -193
- package/src/components/tabsComponent/tabsComponent.stories.js +0 -134
- package/src/components/tabsComponentFamily/tabsComponentFamily.css.js +0 -181
- package/src/components/tabsComponentFamily/tabsComponentFamily.js +0 -180
- package/src/components/tabsComponentFamily/tabsComponentFamily.stories.js +0 -319
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
@media (max-width: 599px) {
|
|
75
|
+
.bd-bentoitem-box {
|
|
76
|
+
padding: var(--spacing-24);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
`;
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
};
|
|
15
|
+
|
|
16
|
+
static styles = [tokens, bentoItemCSS];
|
|
17
|
+
|
|
18
|
+
constructor() {
|
|
19
|
+
super();
|
|
20
|
+
this.title = "";
|
|
21
|
+
this.body = "";
|
|
22
|
+
this.icon = "";
|
|
23
|
+
this.priority = "standard";
|
|
24
|
+
this.orientation = "auto";
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
render() {
|
|
28
|
+
return html`
|
|
29
|
+
<div class="bd-bentoitem-box">
|
|
30
|
+
<div class="bd-bentoitem-icon-wrap">
|
|
31
|
+
<slot name="icon">
|
|
32
|
+
${this.icon ? html`<img src="${this.icon}" alt="" class="bd-bentoitem-icon" />` : ""}
|
|
33
|
+
</slot>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
${this.title
|
|
37
|
+
? html`
|
|
38
|
+
<div class="bd-bentoitem-title-wrap">
|
|
39
|
+
<bd-h as="h5" fontWeight="700">${this.title}</bd-h>
|
|
40
|
+
</div>
|
|
41
|
+
`
|
|
42
|
+
: ""}
|
|
43
|
+
|
|
44
|
+
${this.body
|
|
45
|
+
? html`<bd-p kind="regular" class="bd-bentoitem-body">${this.body}</bd-p>`
|
|
46
|
+
: ""}
|
|
47
|
+
|
|
48
|
+
<slot></slot>
|
|
49
|
+
</div>
|
|
50
|
+
`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
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
|
+
};
|