@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.
- package/CHANGELOG.md +15 -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 +848 -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 +105 -0
- package/src/components/bento-grid/bento-item.js +57 -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/icons/quote-icon.js +28 -0
- package/src/components/install-options/install-options.css.js +276 -0
- package/src/components/install-options/install-options.js +184 -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.css.js +1 -5
- 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/review/review-grid.css.js +34 -0
- package/src/components/review/review-grid.js +63 -0
- package/src/components/review/review.css.js +50 -0
- package/src/components/review/review.js +58 -0
- package/src/components/review/review.stories.js +228 -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,243 @@
|
|
|
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
|
+
:host([background="blue"]) {
|
|
10
|
+
background: var(--color-blue-50);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.bd-compattable-wrapper {
|
|
14
|
+
max-width: var(--layout-ensemble-max-width, 1200px);
|
|
15
|
+
margin: 0 auto;
|
|
16
|
+
padding: var(--spacing-48) var(--layout-ensemble-inline-padding, var(--spacing-24));
|
|
17
|
+
box-sizing: border-box;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.bd-compattable-title {
|
|
21
|
+
display: block;
|
|
22
|
+
margin: 0 0 var(--spacing-12);
|
|
23
|
+
color: var(--color-neutral-1000);
|
|
24
|
+
line-height: var(--typography-lineHeight-tight, 1.1);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.bd-compattable-description {
|
|
28
|
+
display: block;
|
|
29
|
+
margin: 0 0 var(--spacing-32);
|
|
30
|
+
color: var(--color-neutral-700);
|
|
31
|
+
max-width: 60ch;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* === TABLE CONTAINER (default / outcome / risk) === */
|
|
35
|
+
.bd-compattable-table-container {
|
|
36
|
+
display: table;
|
|
37
|
+
width: 100%;
|
|
38
|
+
background: var(--color-neutral-0, #fff);
|
|
39
|
+
border: 1px solid var(--color-neutral-100, #e5e7eb);
|
|
40
|
+
border-radius: var(--radius-xl, 12px);
|
|
41
|
+
overflow: hidden;
|
|
42
|
+
box-sizing: border-box;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* === HEADER ROW === */
|
|
46
|
+
.bd-compattable-header {
|
|
47
|
+
display: grid;
|
|
48
|
+
grid-template-columns: 1.4fr 1.2fr 2.4fr;
|
|
49
|
+
background: var(--color-neutral-50);
|
|
50
|
+
border-bottom: 1px solid var(--color-neutral-200);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
:host([variant="outcome"]) .bd-compattable-header {
|
|
54
|
+
grid-template-columns: 1.2fr 1.6fr 1.6fr;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
:host([variant="risk"]) .bd-compattable-header {
|
|
58
|
+
grid-template-columns: 1fr 1.6fr;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.bd-compattable-header-cell {
|
|
62
|
+
padding: var(--spacing-16) var(--spacing-24);
|
|
63
|
+
color: var(--color-neutral-700);
|
|
64
|
+
font-family: var(--typography-fontFamily-mono, monospace);
|
|
65
|
+
font-size: var(--typography-fontSize-sm);
|
|
66
|
+
text-transform: uppercase;
|
|
67
|
+
letter-spacing: .06em;
|
|
68
|
+
font-weight: var(--font-weight-mono-semibold);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
:host([variant="outcome"]) .bd-compattable-header-cell,
|
|
72
|
+
:host([variant="risk"]) .bd-compattable-header-cell {
|
|
73
|
+
font-size: var(--typography-fontSize-xs);
|
|
74
|
+
color: var(--color-neutral-600);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* === BODY === */
|
|
78
|
+
.bd-compattable-body {
|
|
79
|
+
display: flex;
|
|
80
|
+
flex-direction: column;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.bd-compattable-row {
|
|
84
|
+
display: grid;
|
|
85
|
+
grid-template-columns: 1.4fr 1.2fr 2.4fr;
|
|
86
|
+
border-bottom: 1px solid var(--color-neutral-50, #f3f4f6);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
:host([variant="outcome"]) .bd-compattable-row {
|
|
90
|
+
grid-template-columns: 1.2fr 1.6fr 1.6fr;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
:host([variant="risk"]) .bd-compattable-row {
|
|
94
|
+
grid-template-columns: 1fr 1.6fr;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.bd-compattable-row:last-child {
|
|
98
|
+
border-bottom: none;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.bd-compattable-cell {
|
|
102
|
+
padding: var(--spacing-20) var(--spacing-24);
|
|
103
|
+
display: flex;
|
|
104
|
+
align-items: center;
|
|
105
|
+
color: var(--color-neutral-800);
|
|
106
|
+
font-size: var(--typography-fontSize-base);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.bd-compattable-cell--environment {
|
|
110
|
+
color: var(--color-neutral-900);
|
|
111
|
+
font-weight: var(--typography-fontWeight-semibold);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.bd-compattable-cell--notes {
|
|
115
|
+
color: var(--color-neutral-800);
|
|
116
|
+
gap: var(--spacing-8);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.bd-compattable-cell--notes ::slotted(*) {
|
|
120
|
+
vertical-align: middle;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.bd-compattable-cell--event {
|
|
124
|
+
color: var(--color-neutral-900);
|
|
125
|
+
font-weight: var(--typography-fontWeight-semibold);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.bd-compattable-cell--without {
|
|
129
|
+
color: var(--color-red-600, #dc2626);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.bd-compattable-cell--with {
|
|
133
|
+
color: var(--color-green-600, #16a34a);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.bd-compattable-cell--category {
|
|
137
|
+
color: var(--color-neutral-900);
|
|
138
|
+
font-weight: var(--typography-fontWeight-semibold);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.bd-compattable-cell--riskcoverage {
|
|
142
|
+
color: var(--color-blue-700, #1d4ed8);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* === LIGHT VARIANT === */
|
|
146
|
+
.bd-compattable-lightgrid {
|
|
147
|
+
display: grid;
|
|
148
|
+
grid-template-columns: 1fr 1fr;
|
|
149
|
+
column-gap: var(--spacing-48);
|
|
150
|
+
row-gap: 0;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.bd-compattable-lightrow {
|
|
154
|
+
display: flex;
|
|
155
|
+
align-items: baseline;
|
|
156
|
+
justify-content: space-between;
|
|
157
|
+
gap: var(--spacing-16);
|
|
158
|
+
padding: var(--spacing-16) 0;
|
|
159
|
+
border-bottom: 1px solid var(--color-neutral-100, #e5e7eb);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.bd-compattable-lightlabel {
|
|
163
|
+
color: var(--color-neutral-500);
|
|
164
|
+
font-size: var(--typography-fontSize-base);
|
|
165
|
+
flex-shrink: 0;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.bd-compattable-lightvalue {
|
|
169
|
+
color: var(--color-neutral-900);
|
|
170
|
+
font-weight: var(--typography-fontWeight-semibold);
|
|
171
|
+
text-align: right;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/* === RESPONSIVE === */
|
|
175
|
+
@media (max-width: 767px) {
|
|
176
|
+
.bd-compattable-header {
|
|
177
|
+
display: none;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.bd-compattable-row {
|
|
181
|
+
grid-template-columns: 1fr;
|
|
182
|
+
padding: var(--spacing-16) var(--spacing-20);
|
|
183
|
+
gap: var(--spacing-4);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.bd-compattable-cell {
|
|
187
|
+
padding: var(--spacing-4) 0;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.bd-compattable-cell--coverage::before {
|
|
191
|
+
content: "Coverage: ";
|
|
192
|
+
color: var(--color-neutral-500);
|
|
193
|
+
font-size: var(--typography-fontSize-xs);
|
|
194
|
+
text-transform: uppercase;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.bd-compattable-cell--notes::before {
|
|
198
|
+
content: "Notes: ";
|
|
199
|
+
color: var(--color-neutral-500);
|
|
200
|
+
font-size: var(--typography-fontSize-xs);
|
|
201
|
+
text-transform: uppercase;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.bd-compattable-cell--without::before {
|
|
205
|
+
content: "Without AI Guardian: ";
|
|
206
|
+
color: var(--color-neutral-500);
|
|
207
|
+
font-size: var(--typography-fontSize-xs);
|
|
208
|
+
text-transform: uppercase;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.bd-compattable-cell--with::before {
|
|
212
|
+
content: "With AI Guardian: ";
|
|
213
|
+
color: var(--color-neutral-500);
|
|
214
|
+
font-size: var(--typography-fontSize-xs);
|
|
215
|
+
text-transform: uppercase;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.bd-compattable-cell--riskcoverage::before {
|
|
219
|
+
content: "AI Guardian coverage: ";
|
|
220
|
+
color: var(--color-neutral-500);
|
|
221
|
+
font-size: var(--typography-fontSize-xs);
|
|
222
|
+
text-transform: uppercase;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.bd-compattable-lightgrid {
|
|
226
|
+
grid-template-columns: 1fr;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.bd-compattable-lightrow {
|
|
230
|
+
flex-direction: column;
|
|
231
|
+
align-items: flex-start;
|
|
232
|
+
gap: var(--spacing-4);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.bd-compattable-lightvalue {
|
|
236
|
+
text-align: left;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.bd-compattable-wrapper {
|
|
240
|
+
padding: var(--spacing-32) var(--spacing-24);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
`;
|
|
@@ -0,0 +1,123 @@
|
|
|
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 compatibilityTableCSS from "./compatibility-table.css.js";
|
|
6
|
+
|
|
7
|
+
class CompatibilityTable extends LitElement {
|
|
8
|
+
static properties = {
|
|
9
|
+
title : { type: String },
|
|
10
|
+
description: { type: String },
|
|
11
|
+
variant : { type: String, reflect: true }, // "default" | "outcome" | "risk" | "light"
|
|
12
|
+
background : { type: String, reflect: true }, // "default" | "blue"
|
|
13
|
+
columns : { type: Array },
|
|
14
|
+
rows : { type: Array }
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
static styles = [tokens, compatibilityTableCSS];
|
|
18
|
+
|
|
19
|
+
constructor() {
|
|
20
|
+
super();
|
|
21
|
+
this.title = "";
|
|
22
|
+
this.description = "";
|
|
23
|
+
this.variant = "default";
|
|
24
|
+
this.background = "default";
|
|
25
|
+
this.columns = null;
|
|
26
|
+
this.rows = [];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
_defaultColumns() {
|
|
30
|
+
if (this.columns) return this.columns;
|
|
31
|
+
if (this.variant === "outcome") return ["Agent event", "Without AI Guardian", "With AI Guardian"];
|
|
32
|
+
if (this.variant === "risk") return ["Risk category", "AI Guardian coverage"];
|
|
33
|
+
if (this.variant === "light") return null;
|
|
34
|
+
return ["Environment", "Coverage", "Notes"];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
_renderRow(row) {
|
|
38
|
+
if (this.variant === "outcome") {
|
|
39
|
+
return html`
|
|
40
|
+
<div class="bd-compattable-row" role="row">
|
|
41
|
+
<span class="bd-compattable-cell bd-compattable-cell--event" role="cell">${row.event}</span>
|
|
42
|
+
<span class="bd-compattable-cell bd-compattable-cell--without" role="cell">${row.without}</span>
|
|
43
|
+
<span class="bd-compattable-cell bd-compattable-cell--with" role="cell">${row.with}</span>
|
|
44
|
+
</div>
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (this.variant === "risk") {
|
|
49
|
+
return html`
|
|
50
|
+
<div class="bd-compattable-row" role="row">
|
|
51
|
+
<span class="bd-compattable-cell bd-compattable-cell--category" role="cell">${row.category}</span>
|
|
52
|
+
<span class="bd-compattable-cell bd-compattable-cell--riskcoverage" role="cell">${row.coverage}</span>
|
|
53
|
+
</div>
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (this.variant === "light") {
|
|
58
|
+
return html`
|
|
59
|
+
<div class="bd-compattable-lightrow" role="row">
|
|
60
|
+
<span class="bd-compattable-lightlabel" role="cell">${row.label}</span>
|
|
61
|
+
<span class="bd-compattable-lightvalue" role="cell">${row.value}</span>
|
|
62
|
+
</div>
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return html`
|
|
67
|
+
<div class="bd-compattable-row" role="row">
|
|
68
|
+
<span class="bd-compattable-cell bd-compattable-cell--environment" role="cell">${row.environment}</span>
|
|
69
|
+
<span class="bd-compattable-cell bd-compattable-cell--coverage" role="cell">${row.coverage}</span>
|
|
70
|
+
<span class="bd-compattable-cell bd-compattable-cell--notes" role="cell">${row.notes}</span>
|
|
71
|
+
</div>
|
|
72
|
+
`;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
render() {
|
|
76
|
+
const columns = this._defaultColumns();
|
|
77
|
+
|
|
78
|
+
return html`
|
|
79
|
+
<div class="bd-compattable-wrapper">
|
|
80
|
+
${this.title
|
|
81
|
+
? html`
|
|
82
|
+
<bd-h as="h2" class="bd-compattable-title">
|
|
83
|
+
<slot name="title">${this.title}</slot>
|
|
84
|
+
</bd-h>
|
|
85
|
+
`
|
|
86
|
+
: nothing}
|
|
87
|
+
|
|
88
|
+
${this.description
|
|
89
|
+
? html`
|
|
90
|
+
<bd-p kind="regular" class="bd-compattable-description">
|
|
91
|
+
<slot name="description">${this.description}</slot>
|
|
92
|
+
</bd-p>
|
|
93
|
+
`
|
|
94
|
+
: nothing}
|
|
95
|
+
|
|
96
|
+
${this.variant === "light"
|
|
97
|
+
? html`
|
|
98
|
+
<div class="bd-compattable-lightgrid" role="table">
|
|
99
|
+
${this.rows.map((row) => this._renderRow(row))}
|
|
100
|
+
<slot name="rows"></slot>
|
|
101
|
+
</div>
|
|
102
|
+
`
|
|
103
|
+
: html`
|
|
104
|
+
<div class="bd-compattable-table-container" role="table">
|
|
105
|
+
<div class="bd-compattable-header" role="row">
|
|
106
|
+
${columns.map(
|
|
107
|
+
(col) => html`<span class="bd-compattable-header-cell" role="columnheader">${col}</span>`
|
|
108
|
+
)}
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<div class="bd-compattable-body">
|
|
112
|
+
${this.rows.map((row) => this._renderRow(row))}
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
<slot name="rows"></slot>
|
|
116
|
+
</div>
|
|
117
|
+
`}
|
|
118
|
+
</div>
|
|
119
|
+
`;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
customElements.define("bd-compatibility-table", CompatibilityTable);
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { html } from "lit";
|
|
2
|
+
import "./compatibility-table.js";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
title : "Components/Compatibility Table",
|
|
6
|
+
component : "bd-compatibility-table",
|
|
7
|
+
tags : ["autodocs"],
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: "padded",
|
|
10
|
+
docs : {
|
|
11
|
+
description: {
|
|
12
|
+
component: `
|
|
13
|
+
**CompatibilityTable** displays a title, description, and a 3-column table inside a
|
|
14
|
+
bordered, rounded card. It has two variants:
|
|
15
|
+
|
|
16
|
+
- **default** (\`variant="default"\`, the default): Environment / Coverage / Notes —
|
|
17
|
+
used for platform/runtime compatibility matrices. \`notes\` accepts plain strings or
|
|
18
|
+
Lit \`html\` templates for inline badges/icons.
|
|
19
|
+
- **outcome** (\`variant="outcome"\`): Agent event / Without AI Guardian / With AI
|
|
20
|
+
Guardian — the "without" column renders in red, the "with" column in green, for
|
|
21
|
+
before/after risk comparisons.
|
|
22
|
+
|
|
23
|
+
### Usage
|
|
24
|
+
\`\`\`html
|
|
25
|
+
<!-- default variant -->
|
|
26
|
+
<bd-compatibility-table
|
|
27
|
+
title="What does AI Guardian work with?"
|
|
28
|
+
.rows=\${[
|
|
29
|
+
{ environment: "MCP clients and servers", coverage: "Supported in BETA", notes: "Tool inspection at the Model Context Protocol layer" }
|
|
30
|
+
]}
|
|
31
|
+
></bd-compatibility-table>
|
|
32
|
+
|
|
33
|
+
<!-- outcome variant -->
|
|
34
|
+
<bd-compatibility-table
|
|
35
|
+
variant="outcome"
|
|
36
|
+
title="The same agent, with and without AI Guardian"
|
|
37
|
+
.rows=\${[
|
|
38
|
+
{ event: "Prompt injection", without: "Agent may follow the injected instruction", with: "Flagged or blocked before it acts" }
|
|
39
|
+
]}
|
|
40
|
+
></bd-compatibility-table>
|
|
41
|
+
\`\`\`
|
|
42
|
+
|
|
43
|
+
### Attributes
|
|
44
|
+
| Attribute | Type | Default | Description |
|
|
45
|
+
|------------------|--------|-----------------|---------------------------------------------------|
|
|
46
|
+
| \`title\` | String | \`""\` | Heading above the table (or the \`title\` slot) |
|
|
47
|
+
| \`description\` | String | \`""\` | Paragraph under the title (or the \`description\` slot) |
|
|
48
|
+
| \`variant\` | String | \`"default"\` | \`"default"\` or \`"outcome"\` — determines row shape, columns, and coloring |
|
|
49
|
+
| \`columns\` | Array | variant default | Overrides the 3 header labels for either variant |
|
|
50
|
+
| \`rows\` | Array | \`[]\` | default: \`{ environment, coverage, notes }\` — outcome: \`{ event, without, with }\` |
|
|
51
|
+
|
|
52
|
+
### Slots
|
|
53
|
+
| Slot | Description |
|
|
54
|
+
|-----------------|----------------------------------------------------------|
|
|
55
|
+
| \`title\` | Overrides the \`title\` attribute if content is provided |
|
|
56
|
+
| \`description\` | Overrides the \`description\` attribute if content is provided |
|
|
57
|
+
| \`rows\` | Extra freeform rows appended after the ones from \`rows\` |
|
|
58
|
+
`
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
argTypes: {
|
|
63
|
+
variant : { control: { type: "select" }, options: ["default", "outcome"], table: { category: "Appearance" } },
|
|
64
|
+
title : { control: "text", table: { category: "Content" } },
|
|
65
|
+
description: { control: "text", table: { category: "Content" } },
|
|
66
|
+
rows : { control: "object", table: { category: "Content" } }
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// ─── Default variant ────────────────────────────────────────────────────────
|
|
71
|
+
|
|
72
|
+
export const Default = {
|
|
73
|
+
name: "1. Default Variant — Compatibility",
|
|
74
|
+
args: {
|
|
75
|
+
variant : "default",
|
|
76
|
+
title : "What does AI Guardian work with?",
|
|
77
|
+
description: "AI Guardian attaches to the agent runtime on macOS, so coverage follows what an agent does on the machine rather than which vendor built it.",
|
|
78
|
+
rows : [
|
|
79
|
+
{ environment: "MCP clients and servers", coverage: "Supported in BETA", notes: "Tool inspection at the Model Context Protocol layer" },
|
|
80
|
+
{ environment: "Agent skills and plugins", coverage: "Supported in BETA", notes: "Skill vetting before a skill executes" },
|
|
81
|
+
{ environment: "macOS", coverage: "Supported in BETA", notes: "Initial platform" },
|
|
82
|
+
{ environment: "Windows and Linux", coverage: "Planned", notes: "Not available in BETA" }
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
render: (args) => html`
|
|
86
|
+
<bd-compatibility-table
|
|
87
|
+
variant=${args.variant}
|
|
88
|
+
title=${args.title}
|
|
89
|
+
description=${args.description}
|
|
90
|
+
.rows=${args.rows}
|
|
91
|
+
></bd-compatibility-table>
|
|
92
|
+
`,
|
|
93
|
+
parameters: {
|
|
94
|
+
docs: {
|
|
95
|
+
description: {
|
|
96
|
+
story: "The original variant: Environment / Coverage / Notes."
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// ─── Outcome variant — new iteration ────────────────────────────────────────
|
|
103
|
+
|
|
104
|
+
export const Outcome = {
|
|
105
|
+
name: "2. Outcome Variant — With/Without",
|
|
106
|
+
args: {
|
|
107
|
+
variant : "outcome",
|
|
108
|
+
title : "The same agent, with and without AI Guardian",
|
|
109
|
+
description: "",
|
|
110
|
+
rows : [
|
|
111
|
+
{ event: "Prompt injection", without: "Agent may follow the injected instruction", with: "Flagged or blocked before it acts" },
|
|
112
|
+
{ event: "Malicious MCP tool", without: "Tool runs and can steer the agent", with: "Blocked before the agent calls it" },
|
|
113
|
+
{ event: "API key in a prompt", without: "Secret can leave the machine", with: "Credential exposure is detected" },
|
|
114
|
+
{ event: "Access to ~/.ssh/id_rsa", without: "Sensitive files readable by the agent", with: "Unauthorised access is blocked" },
|
|
115
|
+
{ event: "Unreviewed skill", without: "Runs without inspection", with: "Vetted before it runs" }
|
|
116
|
+
]
|
|
117
|
+
},
|
|
118
|
+
render: (args) => html`
|
|
119
|
+
<bd-compatibility-table
|
|
120
|
+
variant=${args.variant}
|
|
121
|
+
title=${args.title}
|
|
122
|
+
description=${args.description}
|
|
123
|
+
.rows=${args.rows}
|
|
124
|
+
></bd-compatibility-table>
|
|
125
|
+
`,
|
|
126
|
+
parameters: {
|
|
127
|
+
docs: {
|
|
128
|
+
description: {
|
|
129
|
+
story: "The new outcome variant: Agent event / Without AI Guardian (red) / With AI Guardian (green) — matches the reference screenshot exactly."
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
export const OutcomeWithDescription = {
|
|
136
|
+
name: "3. Outcome Variant — With Description",
|
|
137
|
+
args: {
|
|
138
|
+
variant : "outcome",
|
|
139
|
+
title : "The same agent, with and without AI Guardian",
|
|
140
|
+
description: "A side-by-side look at how common risky events play out with AI Guardian active versus not.",
|
|
141
|
+
rows : [
|
|
142
|
+
{ event: "Prompt injection", without: "Agent may follow the injected instruction", with: "Flagged or blocked before it acts" },
|
|
143
|
+
{ event: "Malicious MCP tool", without: "Tool runs and can steer the agent", with: "Blocked before the agent calls it" }
|
|
144
|
+
]
|
|
145
|
+
},
|
|
146
|
+
render: (args) => html`
|
|
147
|
+
<bd-compatibility-table
|
|
148
|
+
variant=${args.variant}
|
|
149
|
+
title=${args.title}
|
|
150
|
+
description=${args.description}
|
|
151
|
+
.rows=${args.rows}
|
|
152
|
+
></bd-compatibility-table>
|
|
153
|
+
`,
|
|
154
|
+
parameters: {
|
|
155
|
+
docs: {
|
|
156
|
+
description: {
|
|
157
|
+
story: "Outcome variant with an optional description paragraph under the title."
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
export const Playground = {
|
|
164
|
+
name: "Playground",
|
|
165
|
+
args: {
|
|
166
|
+
variant : "outcome",
|
|
167
|
+
title : "The same agent, with and without AI Guardian",
|
|
168
|
+
description: "",
|
|
169
|
+
rows : [
|
|
170
|
+
{ event: "Prompt injection", without: "Agent may follow the injected instruction", with: "Flagged or blocked before it acts" },
|
|
171
|
+
{ event: "Malicious MCP tool", without: "Tool runs and can steer the agent", with: "Blocked before the agent calls it" }
|
|
172
|
+
]
|
|
173
|
+
},
|
|
174
|
+
render: (args) => html`
|
|
175
|
+
<bd-compatibility-table
|
|
176
|
+
variant=${args.variant}
|
|
177
|
+
title=${args.title}
|
|
178
|
+
description=${args.description}
|
|
179
|
+
.rows=${args.rows}
|
|
180
|
+
></bd-compatibility-table>
|
|
181
|
+
`,
|
|
182
|
+
parameters: {
|
|
183
|
+
docs: {
|
|
184
|
+
description: {
|
|
185
|
+
story: "Fully interactive — switch `variant` in Controls to see both table shapes."
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
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-ctabanner-container {
|
|
10
|
+
background: radial-gradient(1200px 600px at 78% -10%, var(--color-blue-400) 0%, transparent 55%), linear-gradient(160deg, var(--color-blue-500) 0%, var(--color-blue-700) 48%, var(--color-blue-950) 100%);
|
|
11
|
+
padding: var(--spacing-64) var(--layout-ensemble-inline-padding, var(--spacing-24));
|
|
12
|
+
box-sizing: border-box;
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
align-items: center;
|
|
16
|
+
text-align: center;
|
|
17
|
+
gap: var(--spacing-16);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.bd-ctabanner-title {
|
|
21
|
+
display: block;
|
|
22
|
+
margin: 0;
|
|
23
|
+
color: var(--color-neutral-0, #fff);
|
|
24
|
+
line-height: var(--typography-lineHeight-tight, 1.1);
|
|
25
|
+
max-width: 800px;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.bd-ctabanner-description {
|
|
29
|
+
display: block;
|
|
30
|
+
margin: 0 0 var(--spacing-16);
|
|
31
|
+
color: rgba(255, 255, 255, 0.85);
|
|
32
|
+
max-width: 640px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.bd-ctabanner-cta {
|
|
36
|
+
display: flex;
|
|
37
|
+
flex-wrap: wrap;
|
|
38
|
+
justify-content: center;
|
|
39
|
+
gap: var(--spacing-16);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.bd-ctabanner-caption {
|
|
43
|
+
display: block;
|
|
44
|
+
margin: var(--spacing-8) 0 0;
|
|
45
|
+
color: rgba(255, 255, 255, 0.6);
|
|
46
|
+
font-family: var(--typography-fontFamily-mono, monospace);
|
|
47
|
+
font-size: var(--typography-fontSize-xs);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@media (max-width: 599px) {
|
|
51
|
+
.bd-ctabanner-container {
|
|
52
|
+
padding: var(--spacing-48) var(--spacing-24);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.bd-ctabanner-cta {
|
|
56
|
+
flex-direction: column;
|
|
57
|
+
width: 100%;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
`;
|
|
@@ -0,0 +1,63 @@
|
|
|
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 ctaBannerCSS from "./cta-banner.css.js";
|
|
6
|
+
|
|
7
|
+
class CtaBanner extends LitElement {
|
|
8
|
+
static properties = {
|
|
9
|
+
title : { type: String },
|
|
10
|
+
description: { type: String },
|
|
11
|
+
caption : { type: String }
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
static styles = [tokens, ctaBannerCSS];
|
|
15
|
+
|
|
16
|
+
constructor() {
|
|
17
|
+
super();
|
|
18
|
+
this.title = "";
|
|
19
|
+
this.description = "";
|
|
20
|
+
this.caption = "";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
render() {
|
|
24
|
+
return html`
|
|
25
|
+
<div class="bd-ctabanner-container">
|
|
26
|
+
${this.title
|
|
27
|
+
? html`
|
|
28
|
+
<bd-h as="h2" class="bd-ctabanner-title">
|
|
29
|
+
<slot name="title">${this.title}</slot>
|
|
30
|
+
</bd-h>
|
|
31
|
+
`
|
|
32
|
+
: nothing}
|
|
33
|
+
|
|
34
|
+
${this.description
|
|
35
|
+
? html`
|
|
36
|
+
<bd-p kind="large" class="bd-ctabanner-description">
|
|
37
|
+
<slot name="description">${this.description}</slot>
|
|
38
|
+
</bd-p>
|
|
39
|
+
`
|
|
40
|
+
: nothing}
|
|
41
|
+
|
|
42
|
+
<div class="bd-ctabanner-cta">
|
|
43
|
+
<slot name="primary-button"></slot>
|
|
44
|
+
<slot name="secondary-button"></slot>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
${this.caption
|
|
48
|
+
? html`
|
|
49
|
+
<bd-p
|
|
50
|
+
kind="small"
|
|
51
|
+
class="bd-ctabanner-caption"
|
|
52
|
+
font-family="'IBM Plex Mono', ui-monospace, SFMono-Regular, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace"
|
|
53
|
+
>
|
|
54
|
+
<slot name="caption">${this.caption}</slot>
|
|
55
|
+
</bd-p>
|
|
56
|
+
`
|
|
57
|
+
: nothing}
|
|
58
|
+
</div>
|
|
59
|
+
`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
customElements.define("bd-cta-banner", CtaBanner);
|
|
@@ -78,7 +78,7 @@ export default css`
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
.input-md {
|
|
81
|
-
padding: var(--spacing-
|
|
81
|
+
padding: var(--spacing-8) var(--spacing-16);
|
|
82
82
|
font-size: var(--typography-fontSize-base);
|
|
83
83
|
height: var(--dimension-45px);
|
|
84
84
|
border-radius: var(--form-input-large-borderRadius);
|
|
@@ -9,7 +9,6 @@ export default css`
|
|
|
9
9
|
font-size: var(--typography-body-small-fontSize);
|
|
10
10
|
line-height: var(--typography-lineHeight-normal);
|
|
11
11
|
}
|
|
12
|
-
/* Stiluri de accesibilitate pentru toate link-urile din footer */
|
|
13
12
|
.footer-nav-main a:focus,
|
|
14
13
|
.footer-links a:focus,
|
|
15
14
|
.footer-countries-container a:focus,
|