@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,169 @@
|
|
|
1
|
+
import { LitElement, html, nothing } from "lit";
|
|
2
|
+
import { tokens } from "../../tokens/tokens.js";
|
|
3
|
+
import "../heading/heading.js";
|
|
4
|
+
import "../list/list-item/list-item.js";
|
|
5
|
+
import "../list/list.js";
|
|
6
|
+
import "../paragraph/paragraph.js";
|
|
7
|
+
import "./terminal-cursor.js";
|
|
8
|
+
import terminalMessageCSS from "./terminal-message.css.js";
|
|
9
|
+
|
|
10
|
+
class TerminalMessage extends LitElement {
|
|
11
|
+
static properties = {
|
|
12
|
+
showTitlebar: { type: Boolean, attribute: "show-titlebar" },
|
|
13
|
+
panelLabel : { type: String, attribute: "panel-label" },
|
|
14
|
+
dimText : { type: String, attribute: "dim-text" },
|
|
15
|
+
greeting : { type: String },
|
|
16
|
+
icon : { type: String },
|
|
17
|
+
intro : { type: String },
|
|
18
|
+
items : { type: Array },
|
|
19
|
+
footer : { type: String },
|
|
20
|
+
footerBold : { type: String, attribute: "footer-bold" },
|
|
21
|
+
showCursor : { type: Boolean, attribute: "show-cursor" },
|
|
22
|
+
hint : { type: String },
|
|
23
|
+
// New: raw typed-line API, for terminals that are a literal sequence of
|
|
24
|
+
// command/result lines (unlike greeting/intro/items, which model a
|
|
25
|
+
// single chat-style message). Each entry: { type, text }.
|
|
26
|
+
// type: "cmd" | "ok" | "ask" | "strong" | "dim" | "sep" | "space"
|
|
27
|
+
// "sep" and "space" ignore `text`.
|
|
28
|
+
lines : { type: Array }
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
static styles = [tokens, terminalMessageCSS];
|
|
32
|
+
|
|
33
|
+
constructor() {
|
|
34
|
+
super();
|
|
35
|
+
this.showTitlebar = false;
|
|
36
|
+
this.panelLabel = "";
|
|
37
|
+
this.dimText = "";
|
|
38
|
+
this.greeting = "";
|
|
39
|
+
this.icon = "";
|
|
40
|
+
this.intro = "";
|
|
41
|
+
this.items = [];
|
|
42
|
+
this.footer = "";
|
|
43
|
+
this.footerBold = "";
|
|
44
|
+
this.showCursor = false;
|
|
45
|
+
this.hint = "";
|
|
46
|
+
this.lines = [];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
_renderTitlebar() {
|
|
50
|
+
if (!this.showTitlebar) return nothing;
|
|
51
|
+
return html`
|
|
52
|
+
<div class="bd-terminalmsg-titlebar">
|
|
53
|
+
<span class="bd-terminalmsg-dot bd-terminalmsg-dot--red"></span>
|
|
54
|
+
<span class="bd-terminalmsg-dot bd-terminalmsg-dot--yellow"></span>
|
|
55
|
+
<span class="bd-terminalmsg-dot bd-terminalmsg-dot--green"></span>
|
|
56
|
+
</div>
|
|
57
|
+
`;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Splits the hint text on bracketed key labels like "[Enter]" or "[esc]" and
|
|
61
|
+
// wraps each one in a <strong> so it renders bold + white, while the rest of
|
|
62
|
+
// the text keeps the dim hint color. Works with the plain string prop as-is —
|
|
63
|
+
// no need to pass markup through `hint`.
|
|
64
|
+
_renderHint() {
|
|
65
|
+
if (!this.hint) return nothing;
|
|
66
|
+
|
|
67
|
+
const parts = this.hint.split(/(\[[^\]]+\])/g);
|
|
68
|
+
|
|
69
|
+
return html`
|
|
70
|
+
<span class="bd-terminalmsg-hint">
|
|
71
|
+
${parts.map((part) =>
|
|
72
|
+
/^\[[^\]]+\]$/.test(part)
|
|
73
|
+
? html`<strong class="bd-terminalmsg-hint-key">${part}</strong>`
|
|
74
|
+
: part
|
|
75
|
+
)}
|
|
76
|
+
</span>
|
|
77
|
+
`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
_renderLines() {
|
|
81
|
+
if (!this.lines || !this.lines.length) return nothing;
|
|
82
|
+
|
|
83
|
+
return html`
|
|
84
|
+
<div class="bd-terminalmsg-lines">
|
|
85
|
+
${this.lines.map(({ type, text }) => {
|
|
86
|
+
switch (type) {
|
|
87
|
+
case "sep":
|
|
88
|
+
return html`<hr class="bd-terminalmsg-l-sep" />`;
|
|
89
|
+
case "space":
|
|
90
|
+
return html`<div class="bd-terminalmsg-l-space" aria-hidden="true"> </div>`;
|
|
91
|
+
case "cmd":
|
|
92
|
+
return html`<div class="bd-terminalmsg-l-cmd">${text}</div>`;
|
|
93
|
+
case "ok":
|
|
94
|
+
return html`<div class="bd-terminalmsg-l-ok">${text}</div>`;
|
|
95
|
+
case "ask":
|
|
96
|
+
return html`<div class="bd-terminalmsg-l-ask">${text}</div>`;
|
|
97
|
+
case "strong":
|
|
98
|
+
return html`<div class="bd-terminalmsg-l-strong">${text}</div>`;
|
|
99
|
+
case "dim":
|
|
100
|
+
return html`<div class="bd-terminalmsg-l-dim">${text}</div>`;
|
|
101
|
+
default:
|
|
102
|
+
return html`<div class="bd-terminalmsg-l-dim">${text}</div>`;
|
|
103
|
+
}
|
|
104
|
+
})}
|
|
105
|
+
</div>
|
|
106
|
+
`;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
render() {
|
|
110
|
+
return html`
|
|
111
|
+
${this._renderTitlebar()}
|
|
112
|
+
|
|
113
|
+
<div class="bd-terminalmsg-panel">
|
|
114
|
+
${this.panelLabel
|
|
115
|
+
? html`<span class="bd-terminalmsg-panel-label">${this.panelLabel}</span>`
|
|
116
|
+
: nothing}
|
|
117
|
+
|
|
118
|
+
<div class="bd-terminalmsg-body">
|
|
119
|
+
${this._renderLines()}
|
|
120
|
+
|
|
121
|
+
${this.dimText
|
|
122
|
+
? html`<bd-p kind="small" font-family="var(--font-family-mono)" paddingBottom="var(--spacing-12)" class="bd-terminalmsg-dim">${this.dimText}</bd-p>`
|
|
123
|
+
: nothing}
|
|
124
|
+
|
|
125
|
+
${this.greeting
|
|
126
|
+
? html`
|
|
127
|
+
<bd-p kind="regular" font-family="var(--font-family-mono)" paddingBottom="var(--spacing-12)" class="bd-terminalmsg-greeting">
|
|
128
|
+
${this.icon ? html`${this.icon} ` : nothing}
|
|
129
|
+
<span class="bd-terminalmsg-greeting-text">${this.greeting}</span>
|
|
130
|
+
</bd-p>
|
|
131
|
+
`
|
|
132
|
+
: nothing}
|
|
133
|
+
|
|
134
|
+
${this.intro
|
|
135
|
+
? html`<bd-p kind="regular" font-family="var(--font-family-mono)" paddingBottom="var(--spacing-12)" class="bd-terminalmsg-intro">${this.intro}</bd-p>`
|
|
136
|
+
: nothing}
|
|
137
|
+
|
|
138
|
+
${this.items && this.items.length
|
|
139
|
+
? html`
|
|
140
|
+
<bd-list class="bd-terminalmsg-list">
|
|
141
|
+
${this.items.map((item) => html`<bd-li kind="bullet" size="sm" color="#fff">${item}</bd-li>`)}
|
|
142
|
+
</bd-list>
|
|
143
|
+
`
|
|
144
|
+
: nothing}
|
|
145
|
+
|
|
146
|
+
${this.footer || this.footerBold
|
|
147
|
+
? html`
|
|
148
|
+
<bd-p kind="regular" font-family="var(--font-family-mono)" class="bd-terminalmsg-footer">
|
|
149
|
+
${this.footerBold
|
|
150
|
+
? html`<strong>${this.footerBold}</strong> `
|
|
151
|
+
: nothing}
|
|
152
|
+
${this.footer}
|
|
153
|
+
${this.showCursor
|
|
154
|
+
? html`<bd-terminal-cursor></bd-terminal-cursor>`
|
|
155
|
+
: nothing}
|
|
156
|
+
</bd-p>
|
|
157
|
+
`
|
|
158
|
+
: nothing}
|
|
159
|
+
|
|
160
|
+
<slot></slot>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
${this._renderHint()}
|
|
164
|
+
</div>
|
|
165
|
+
`;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
customElements.define("bd-terminal-message", TerminalMessage);
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { html } from "lit";
|
|
2
|
+
import "./terminal-cursor.js";
|
|
3
|
+
import "./terminal-message.js";
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
title : "Components/Terminal Message",
|
|
7
|
+
component : "bd-terminal-message",
|
|
8
|
+
tags : ["autodocs"],
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: "centered",
|
|
11
|
+
docs : {
|
|
12
|
+
description: {
|
|
13
|
+
component: `
|
|
14
|
+
**TerminalMessage** structures a terminal-style chat/status message (optional titlebar
|
|
15
|
+
with traffic-light dots, dim label, greeting, intro line, bullet list, footer with
|
|
16
|
+
optional blinking cursor, and a hint line) as attributes/data instead of hand-written
|
|
17
|
+
markup. Renders its own dark background and rounded corners — no wrapper needed.
|
|
18
|
+
|
|
19
|
+
Every field is optional — omitted fields render nothing rather than empty space.
|
|
20
|
+
|
|
21
|
+
### Usage
|
|
22
|
+
\`\`\`html
|
|
23
|
+
<bd-terminal-message
|
|
24
|
+
show-titlebar
|
|
25
|
+
label="AI Guardian CLI · first-run setup"
|
|
26
|
+
dim-text="Welcome"
|
|
27
|
+
icon="👋"
|
|
28
|
+
greeting="Hi, I'm AI Guardian."
|
|
29
|
+
intro="I keep an eye on what your AI assistant can access and do:"
|
|
30
|
+
.items=\${["which tools it can use", "which credentials to watch", "which MCP servers to trust"]}
|
|
31
|
+
footer-bold="Let's get started."
|
|
32
|
+
footer="It only takes a minute, and nothing changes until you confirm it."
|
|
33
|
+
show-cursor
|
|
34
|
+
hint="[Enter] to continue · [esc] to cancel"
|
|
35
|
+
></bd-terminal-message>
|
|
36
|
+
\`\`\`
|
|
37
|
+
|
|
38
|
+
### Attributes
|
|
39
|
+
| Attribute | Type | Description |
|
|
40
|
+
|-----------------|---------|--------------------------------------------------------------|
|
|
41
|
+
| \`show-titlebar\` | Boolean | Shows the red/yellow/green traffic-light dots bar |
|
|
42
|
+
| \`label\` | String | Text next to the dots (only shown when \`show-titlebar\` is set) |
|
|
43
|
+
| \`dim-text\` | String | Faint header line, e.g. "Welcome" |
|
|
44
|
+
| \`icon\` | String | Emoji or short prefix before the greeting |
|
|
45
|
+
| \`greeting\` | String | Highlighted intro line, e.g. bot name/greeting |
|
|
46
|
+
| \`intro\` | String | Plain paragraph after the greeting |
|
|
47
|
+
| \`items\` | Array | Bullet list items |
|
|
48
|
+
| \`footer-bold\` | String | Bold lead-in for the footer paragraph |
|
|
49
|
+
| \`footer\` | String | Footer paragraph text |
|
|
50
|
+
| \`show-cursor\` | Boolean | Appends a blinking \`bd-terminal-cursor\` after the footer |
|
|
51
|
+
| \`hint\` | String | Small dim hint line at the bottom, e.g. keyboard shortcuts |
|
|
52
|
+
|
|
53
|
+
### Slots
|
|
54
|
+
| Slot | Description |
|
|
55
|
+
|-----------|-------------------------------------------------------------------|
|
|
56
|
+
| (default) | Extra freeform content appended after every structured field |
|
|
57
|
+
`
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
argTypes: {
|
|
62
|
+
showTitlebar: {
|
|
63
|
+
control : "boolean",
|
|
64
|
+
description: "Show the traffic-light dots titlebar",
|
|
65
|
+
table : { category: "Titlebar" }
|
|
66
|
+
},
|
|
67
|
+
label: {
|
|
68
|
+
control : "text",
|
|
69
|
+
description: "Titlebar label text",
|
|
70
|
+
table : { category: "Titlebar" }
|
|
71
|
+
},
|
|
72
|
+
dimText: {
|
|
73
|
+
control : "text",
|
|
74
|
+
description: "Faint header line",
|
|
75
|
+
table : { category: "Content" }
|
|
76
|
+
},
|
|
77
|
+
icon: {
|
|
78
|
+
control : "text",
|
|
79
|
+
description: "Emoji/prefix before the greeting",
|
|
80
|
+
table : { category: "Content" }
|
|
81
|
+
},
|
|
82
|
+
greeting: {
|
|
83
|
+
control : "text",
|
|
84
|
+
description: "Highlighted greeting line",
|
|
85
|
+
table : { category: "Content" }
|
|
86
|
+
},
|
|
87
|
+
intro: {
|
|
88
|
+
control : "text",
|
|
89
|
+
description: "Plain paragraph after the greeting",
|
|
90
|
+
table : { category: "Content" }
|
|
91
|
+
},
|
|
92
|
+
items: {
|
|
93
|
+
control : "object",
|
|
94
|
+
description: "Bullet list items",
|
|
95
|
+
table : { category: "Content" }
|
|
96
|
+
},
|
|
97
|
+
footerBold: {
|
|
98
|
+
control : "text",
|
|
99
|
+
description: "Bold lead-in for the footer paragraph",
|
|
100
|
+
table : { category: "Content" }
|
|
101
|
+
},
|
|
102
|
+
footer: {
|
|
103
|
+
control : "text",
|
|
104
|
+
description: "Footer paragraph text",
|
|
105
|
+
table : { category: "Content" }
|
|
106
|
+
},
|
|
107
|
+
showCursor: {
|
|
108
|
+
control : "boolean",
|
|
109
|
+
description: "Append a blinking cursor after the footer",
|
|
110
|
+
table : { category: "Content" }
|
|
111
|
+
},
|
|
112
|
+
hint: {
|
|
113
|
+
control : "text",
|
|
114
|
+
description: "Small dim hint line at the bottom",
|
|
115
|
+
table : { category: "Content" }
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
const containerStyle = "width: 480px;";
|
|
121
|
+
|
|
122
|
+
const render = (args) => html`
|
|
123
|
+
<div style="${containerStyle}">
|
|
124
|
+
<bd-terminal-message
|
|
125
|
+
?show-titlebar=${args.showTitlebar}
|
|
126
|
+
label=${args.label}
|
|
127
|
+
dim-text=${args.dimText}
|
|
128
|
+
icon=${args.icon}
|
|
129
|
+
greeting=${args.greeting}
|
|
130
|
+
intro=${args.intro}
|
|
131
|
+
.items=${args.items}
|
|
132
|
+
footer-bold=${args.footerBold}
|
|
133
|
+
footer=${args.footer}
|
|
134
|
+
?show-cursor=${args.showCursor}
|
|
135
|
+
hint=${args.hint}
|
|
136
|
+
></bd-terminal-message>
|
|
137
|
+
</div>
|
|
138
|
+
`;
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
// ─── Full message with titlebar (matches the AI Guardian reference) ──────────
|
|
142
|
+
|
|
143
|
+
export const Default = {
|
|
144
|
+
name: "Default — Full Message With Titlebar",
|
|
145
|
+
args: {
|
|
146
|
+
showTitlebar: true,
|
|
147
|
+
label : "AI Guardian CLI · first-run setup",
|
|
148
|
+
dimText : "Welcome",
|
|
149
|
+
icon : "👋",
|
|
150
|
+
greeting : "Hi, I'm AI Guardian.",
|
|
151
|
+
intro : "I keep an eye on what your AI assistant can access and do:",
|
|
152
|
+
items : [
|
|
153
|
+
"which tools it can use",
|
|
154
|
+
"which credentials to watch",
|
|
155
|
+
"which MCP servers to trust"
|
|
156
|
+
],
|
|
157
|
+
footerBold: "Let's get started.",
|
|
158
|
+
footer : "It only takes a minute, and nothing changes until you confirm it.",
|
|
159
|
+
showCursor: true,
|
|
160
|
+
hint : "[Enter] to continue · [esc] to cancel"
|
|
161
|
+
},
|
|
162
|
+
render,
|
|
163
|
+
parameters: {
|
|
164
|
+
docs: {
|
|
165
|
+
description: {
|
|
166
|
+
story: "Every field populated, including the titlebar with red/yellow/green dots and a label."
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
// ─── Without titlebar ──────────────────────────────────────────────────────────
|
|
174
|
+
|
|
175
|
+
export const NoTitlebar = {
|
|
176
|
+
name: "Without Titlebar",
|
|
177
|
+
args: {
|
|
178
|
+
showTitlebar: false,
|
|
179
|
+
label : "",
|
|
180
|
+
dimText : "Welcome",
|
|
181
|
+
icon : "👋",
|
|
182
|
+
greeting : "Hi, I'm AI Guardian.",
|
|
183
|
+
intro : "I keep an eye on what your AI assistant can access and do:",
|
|
184
|
+
items : [
|
|
185
|
+
"which tools it can use",
|
|
186
|
+
"which credentials to watch",
|
|
187
|
+
"which MCP servers to trust"
|
|
188
|
+
],
|
|
189
|
+
footerBold: "Let's get started.",
|
|
190
|
+
footer : "It only takes a minute, and nothing changes until you confirm it.",
|
|
191
|
+
showCursor: true,
|
|
192
|
+
hint : "[Enter] to continue · [esc] to cancel"
|
|
193
|
+
},
|
|
194
|
+
render,
|
|
195
|
+
parameters: {
|
|
196
|
+
docs: {
|
|
197
|
+
description: {
|
|
198
|
+
story: "`show-titlebar` left `false` — no dots bar, useful when the surrounding layout already has a window chrome."
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
// ─── Minimal — just greeting + footer ─────────────────────────────────────────
|
|
206
|
+
|
|
207
|
+
export const Minimal = {
|
|
208
|
+
name: "Minimal — Greeting + Footer Only",
|
|
209
|
+
args: {
|
|
210
|
+
showTitlebar: true,
|
|
211
|
+
label : "status",
|
|
212
|
+
dimText : "",
|
|
213
|
+
icon : "",
|
|
214
|
+
greeting : "Scanning complete.",
|
|
215
|
+
intro : "",
|
|
216
|
+
items : [],
|
|
217
|
+
footerBold : "",
|
|
218
|
+
footer : "No threats found on this device.",
|
|
219
|
+
showCursor : true,
|
|
220
|
+
hint : ""
|
|
221
|
+
},
|
|
222
|
+
render,
|
|
223
|
+
parameters: {
|
|
224
|
+
docs: {
|
|
225
|
+
description: {
|
|
226
|
+
story: "Only `greeting` and `footer` are set — every other field is omitted entirely, no empty gaps left behind."
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
// ─── List only ────────────────────────────────────────────────────────────────
|
|
234
|
+
|
|
235
|
+
export const ListOnly = {
|
|
236
|
+
name: "Bullet List Only",
|
|
237
|
+
args: {
|
|
238
|
+
showTitlebar: false,
|
|
239
|
+
label : "",
|
|
240
|
+
dimText : "",
|
|
241
|
+
icon : "",
|
|
242
|
+
greeting : "",
|
|
243
|
+
intro : "Permissions requested:",
|
|
244
|
+
items : [
|
|
245
|
+
"Read access to project files",
|
|
246
|
+
"Network access for API calls",
|
|
247
|
+
"Ability to run shell commands"
|
|
248
|
+
],
|
|
249
|
+
footerBold: "",
|
|
250
|
+
footer : "",
|
|
251
|
+
showCursor: false,
|
|
252
|
+
hint : ""
|
|
253
|
+
},
|
|
254
|
+
render,
|
|
255
|
+
parameters: {
|
|
256
|
+
docs: {
|
|
257
|
+
description: {
|
|
258
|
+
story: "Only `intro` and `items` are set, demonstrating the list rendering on its own without a greeting or footer."
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
// ─── With extra slotted content ────────────────────────────────────────────────
|
|
266
|
+
|
|
267
|
+
export const WithSlottedContent = {
|
|
268
|
+
name : "With Extra Slotted Content",
|
|
269
|
+
render: () => html`
|
|
270
|
+
<div style="${containerStyle}">
|
|
271
|
+
<bd-terminal-message
|
|
272
|
+
show-titlebar
|
|
273
|
+
label="AI Guardian CLI"
|
|
274
|
+
dim-text="Welcome"
|
|
275
|
+
icon="👋"
|
|
276
|
+
greeting="Hi, I'm AI Guardian."
|
|
277
|
+
>
|
|
278
|
+
<p style="margin: 12px 0 0; color: #22c55e;">✓ Custom slotted line appended after the structured fields.</p>
|
|
279
|
+
</bd-terminal-message>
|
|
280
|
+
</div>
|
|
281
|
+
`,
|
|
282
|
+
parameters: {
|
|
283
|
+
docs: {
|
|
284
|
+
description: {
|
|
285
|
+
story: "The default slot lets you append arbitrary extra markup after all the structured fields, for cases the attribute API doesn't cover."
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
// ─── Playground ─────────────────────────────────────────────────────────────────
|
|
293
|
+
|
|
294
|
+
export const Playground = {
|
|
295
|
+
name: "Playground",
|
|
296
|
+
args: {
|
|
297
|
+
showTitlebar: true,
|
|
298
|
+
label : "AI Guardian CLI · first-run setup",
|
|
299
|
+
dimText : "Welcome",
|
|
300
|
+
icon : "👋",
|
|
301
|
+
greeting : "Hi, I'm AI Guardian.",
|
|
302
|
+
intro : "I keep an eye on what your AI assistant can access and do:",
|
|
303
|
+
items : [
|
|
304
|
+
"which tools it can use",
|
|
305
|
+
"which credentials to watch",
|
|
306
|
+
"which MCP servers to trust"
|
|
307
|
+
],
|
|
308
|
+
footerBold: "Let's get started.",
|
|
309
|
+
footer : "It only takes a minute, and nothing changes until you confirm it.",
|
|
310
|
+
showCursor: true,
|
|
311
|
+
hint : "[Enter] to continue · [esc] to cancel"
|
|
312
|
+
},
|
|
313
|
+
render,
|
|
314
|
+
parameters: {
|
|
315
|
+
docs: {
|
|
316
|
+
description: {
|
|
317
|
+
story: "Fully interactive story — use the Controls panel to edit every field live, including the titlebar and bullet list."
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
};
|
|
@@ -0,0 +1,167 @@
|
|
|
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-trustpanel-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-trustpanel-eyebrow {
|
|
18
|
+
display: block;
|
|
19
|
+
margin: 0 0 var(--spacing-8);
|
|
20
|
+
color: var(--color-blue-600);
|
|
21
|
+
font-weight: var(--typography-fontWeight-medium);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.bd-trustpanel-title {
|
|
25
|
+
margin: 0 0 var(--spacing-16);
|
|
26
|
+
color: var(--color-neutral-900);
|
|
27
|
+
line-height: var(--typography-lineHeight-tight, 1.1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.bd-trustpanel-description {
|
|
31
|
+
display: block;
|
|
32
|
+
margin: 0 0 var(--spacing-40);
|
|
33
|
+
color: var(--color-neutral-600);
|
|
34
|
+
max-width: 80ch;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.bd-trustpanel-inline-link {
|
|
38
|
+
color: var(--color-blue-500);
|
|
39
|
+
font-weight: var(--typography-fontWeight-medium);
|
|
40
|
+
text-decoration: none;
|
|
41
|
+
white-space: nowrap;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.bd-trustpanel-card-link {
|
|
45
|
+
color: var(--color-blue-500);
|
|
46
|
+
font-weight: var(--typography-fontWeight-semibold);
|
|
47
|
+
text-decoration: none;
|
|
48
|
+
white-space: nowrap;
|
|
49
|
+
}
|
|
50
|
+
.bd-trustpanel-inline-link:hover,
|
|
51
|
+
.bd-trustpanel-card-link:hover {
|
|
52
|
+
text-decoration: underline;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* === STATS ROW === */
|
|
56
|
+
.bd-trustpanel-stats {
|
|
57
|
+
display: grid;
|
|
58
|
+
grid-template-columns: repeat(6, 1fr);
|
|
59
|
+
gap: var(--spacing-24);
|
|
60
|
+
margin-bottom: var(--spacing-40);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.bd-trustpanel-stat {
|
|
64
|
+
display: flex;
|
|
65
|
+
flex-direction: column;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.bd-trustpanel-stat-divider {
|
|
69
|
+
border-top: 2px solid var(--color-blue-500);
|
|
70
|
+
margin-bottom: var(--spacing-16);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.bd-trustpanel-stat-value {
|
|
74
|
+
color: var(--color-blue-500);
|
|
75
|
+
font-size: var(--typography-fontSize-3xl, 2rem);
|
|
76
|
+
font-weight: var(--typography-fontWeight-bold, 700);
|
|
77
|
+
line-height: 1.1;
|
|
78
|
+
margin-bottom: var(--spacing-4);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.bd-trustpanel-stat-label {
|
|
82
|
+
color: var(--color-neutral-600);
|
|
83
|
+
font-size: var(--typography-fontSize-sm);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* === CARDS === */
|
|
87
|
+
.bd-trustpanel-cards {
|
|
88
|
+
display: grid;
|
|
89
|
+
grid-template-columns: 1fr 1fr;
|
|
90
|
+
gap: var(--spacing-24);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
.bd-trustpanel-card {
|
|
95
|
+
background: var(--color-neutral-0, #fff);
|
|
96
|
+
border: 1px solid var(--color-neutral-100, #e5e7eb);
|
|
97
|
+
border-radius: var(--radius-2xl);
|
|
98
|
+
padding: var(--spacing-32);
|
|
99
|
+
box-sizing: border-box;
|
|
100
|
+
display: flex;
|
|
101
|
+
flex-direction: column;
|
|
102
|
+
transition: transform 0.25s ease, box-shadow 0.25s ease;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.bd-trustpanel-card:hover {
|
|
106
|
+
transform: translateY(-3px);
|
|
107
|
+
box-shadow: 0px 14px 40px #00000012;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.bd-trustpanel-card-eyebrow {
|
|
111
|
+
display: block;
|
|
112
|
+
margin: 0 0 var(--spacing-16);
|
|
113
|
+
color: var(--color-blue-600);
|
|
114
|
+
font-weight: var(--typography-fontWeight-medium);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.bd-trustpanel-card-logos {
|
|
118
|
+
display: flex;
|
|
119
|
+
align-items: center;
|
|
120
|
+
gap: var(--spacing-16);
|
|
121
|
+
margin-bottom: var(--spacing-20);
|
|
122
|
+
flex-wrap: wrap;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.bd-trustpanel-card-logos ::slotted(*) {
|
|
126
|
+
height: 32px;
|
|
127
|
+
width: auto;
|
|
128
|
+
object-fit: contain;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.bd-trustpanel-card-title {
|
|
132
|
+
margin: 0 0 var(--spacing-12);
|
|
133
|
+
color: var(--color-neutral-900);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.bd-trustpanel-card-description {
|
|
137
|
+
display: block;
|
|
138
|
+
margin: 0 0 var(--spacing-16);
|
|
139
|
+
color: var(--color-neutral-600);
|
|
140
|
+
flex: 1;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* === RESPONSIVE === */
|
|
144
|
+
@media (max-width: 899px) {
|
|
145
|
+
.bd-trustpanel-stats {
|
|
146
|
+
grid-template-columns: repeat(3, 1fr);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
@media (max-width: 767px) {
|
|
151
|
+
.bd-trustpanel-stats {
|
|
152
|
+
grid-template-columns: repeat(2, 1fr);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.bd-trustpanel-cards {
|
|
156
|
+
grid-template-columns: 1fr;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.bd-trustpanel-wrapper {
|
|
160
|
+
padding: var(--spacing-32) var(--spacing-24);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.bd-trustpanel-card {
|
|
164
|
+
padding: var(--spacing-24);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
`;
|