@repobit/dex-system-design 0.23.7 → 0.23.9

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.
@@ -1,339 +1,243 @@
1
- import { html } from 'lit';
2
- import './accordion.js';
1
+ import { html } from "lit";
2
+ import "./accordion.js";
3
3
 
4
4
  export default {
5
- title : 'Components/Accordion',
6
- tags : ['autodocs'],
5
+ title : "Components/Accordion",
6
+ tags : ["autodocs"],
7
7
  parameters: {
8
- docs: {
8
+ layout: "padded",
9
+ docs : {
9
10
  description: {
10
11
  component: `
11
- **BdAccordionItem** and **BdAccordionSection** are Lit web components for building structured, collapsible FAQ or guide sections.
12
+ Two Lit web components for building accordion sections.
12
13
 
13
- Two elements are available:
14
- - \`<bd-accordion-item>\` — a single collapsible item with a +/− toggle
15
- - \`<bd-accordion-section>\` — a section wrapper with optional title and user guide link
16
-
17
- ### Usage
18
14
  \`\`\`html
19
- <bd-accordion-section
20
- title="General Questions"
21
- guide-label="View User Guide"
22
- guide-href="/guide"
23
- >
24
- <bd-accordion-item title="What is included?">
25
- <p>All features are included in every plan.</p>
15
+ <bd-accordion-section title="Frequently Asked Questions">
16
+ <bd-accordion-item title="What is Bitdefender?">
17
+ <p>Bitdefender is a cybersecurity company...</p>
18
+ </bd-accordion-item>
19
+ <bd-accordion-item title="How do I install it?">
20
+ <p>Download the installer from our website...</p>
26
21
  </bd-accordion-item>
27
22
  </bd-accordion-section>
28
23
  \`\`\`
29
24
 
30
- ### Notes
31
- - \`bd-accordion-item\` uses \`+\` / \`−\` as toggle indicators
32
- - \`bd-accordion-section\` renders a guide link only when \`guide-label\` is provided
33
- - \`title\` on \`bd-accordion-section\` is optional — the \`<h2>\` is omitted when absent
25
+ ### Attributes
26
+
27
+ #### \`bd-accordion-section\`
28
+ | Attribute | Type | Default | Description |
29
+ |---------------|--------|-------------|-----------------------------------------------------------------------------|
30
+ | \`title\` | String | — | Optional section heading rendered as \`<h2>\` |
31
+ | \`variant\` | String | \`default\` | \`default\` · \`default-blue\` · \`small\` |
32
+ | \`guide-icon\` | String | — | Path to icon shown next to the user guide link |
33
+ | \`guide-label\` | String | — | Text for the user guide link (renders the link when set) |
34
+ | \`guide-href\` | String | \`#\` | URL for the user guide link |
35
+
36
+ #### \`bd-accordion-item\`
37
+ | Attribute | Type | Default | Description |
38
+ |-----------|---------|---------|--------------------------------------|
39
+ | \`title\` | String | — | Trigger label |
40
+ | \`open\` | Boolean | \`false\`| Whether the panel is expanded |
34
41
  `
35
42
  }
36
43
  }
37
- },
38
- argTypes: {
39
- // BdAccordionItem
40
- itemTitle: {
41
- control : 'text',
42
- description: 'Title text displayed in the accordion item header',
43
- table : {
44
- type : { summary: 'string' },
45
- defaultValue: { summary: '' },
46
- category : 'BdAccordionItem'
47
- }
48
- },
49
- open: {
50
- control : 'boolean',
51
- description: 'Whether the accordion item is expanded by default',
52
- table : {
53
- type : { summary: 'boolean' },
54
- defaultValue: { summary: 'false' },
55
- category : 'BdAccordionItem'
56
- }
57
- },
58
- // BdAccordionSection
59
- sectionTitle: {
60
- control : 'text',
61
- description: 'Section heading rendered as an `<h2>`',
62
- table : {
63
- type : { summary: 'string' },
64
- defaultValue: { summary: '' },
65
- category : 'BdAccordionSection'
66
- }
67
- },
68
- guideLabel: {
69
- control : 'text',
70
- description: 'Label for the user guide link. If empty, the link is not rendered.',
71
- table : {
72
- type : { summary: 'string' },
73
- defaultValue: { summary: '' },
74
- category : 'BdAccordionSection'
75
- }
76
- },
77
- guideHref: {
78
- control : 'text',
79
- description: 'URL for the user guide link',
80
- table : {
81
- type : { summary: 'string' },
82
- defaultValue: { summary: '#' },
83
- category : 'BdAccordionSection'
84
- }
85
- },
86
- guideIcon: {
87
- control : 'text',
88
- description: 'Path to the icon image shown next to the guide link',
89
- table : {
90
- type : { summary: 'string' },
91
- defaultValue: { summary: '/assets/user_guide.png' },
92
- category : 'BdAccordionSection'
93
- }
94
- }
95
44
  }
96
45
  };
97
46
 
98
- const defaultItems = [
99
- { title: 'What is included in my plan?', content: 'All core features are included in every Bitdefender plan.' },
100
- { title: 'Can I use it on multiple devices?', content: 'Yes, depending on your subscription you can protect up to unlimited devices.' },
101
- { title: 'How do I renew my subscription?', content: 'You can renew from your Bitdefender Central account at any time.' },
102
- { title: 'Is there a free trial?', content: 'Yes, a 30-day free trial is available for most products.' }
103
- ];
104
47
 
105
- // ─── BdAccordionItem Stories ────────────────────────────────────────────────
48
+ // ─── Default ─────────────────────────────────────────────────────────────────
106
49
 
107
- export const ItemDefault = {
108
- name : 'Item — Default (Collapsed)',
50
+ export const Default = {
51
+ name : "Default",
109
52
  render: () => html`
110
- <bd-accordion-item title="What is included in my plan?">
111
- <p>All core features are included in every Bitdefender plan.</p>
112
- </bd-accordion-item>
113
- `,
114
- parameters: {
115
- docs: {
116
- description: {
117
- story: 'A single accordion item in its default collapsed state, showing the `+` toggle.'
118
- }
119
- }
120
- }
53
+ <bd-accordion-section title="Frequently Asked Questions">
54
+ <bd-accordion-item title="What is Bitdefender Total Security?">
55
+ <p>Bitdefender Total Security offers real-time protection against viruses, malware, spyware, ransomware, and other cyber threats across Windows, macOS, iOS, and Android.</p>
56
+ </bd-accordion-item>
57
+ <bd-accordion-item title="How many devices can I protect?">
58
+ <p>Depending on your subscription plan, you can protect between 1 and 10 devices simultaneously with a single Bitdefender account.</p>
59
+ </bd-accordion-item>
60
+ <bd-accordion-item title="Does Bitdefender slow down my computer?">
61
+ <p>Bitdefender is consistently rated as one of the lightest security solutions on system performance in independent AV-TEST benchmarks.</p>
62
+ </bd-accordion-item>
63
+ </bd-accordion-section>
64
+ `
121
65
  };
122
66
 
123
- export const ItemOpen = {
124
- name : 'Item — Open',
125
- render: () => html`
126
- <bd-accordion-item title="What is included in my plan?" open>
127
- <p>All core features are included in every Bitdefender plan.</p>
128
- </bd-accordion-item>
129
- `,
130
- parameters: {
131
- docs: {
132
- description: {
133
- story: 'Accordion item rendered in the open/expanded state using the `open` attribute. Shows the `−` toggle.'
134
- }
135
- }
136
- }
137
- };
138
67
 
139
- export const ItemRichContent = {
140
- name : 'Item — Rich Slotted Content',
68
+ // ─── One item open by default ─────────────────────────────────────────────────
69
+
70
+ export const OpenByDefault = {
71
+ name : "Item open by default",
141
72
  render: () => html`
142
- <bd-accordion-item title="What platforms are supported?" open>
143
- <ul>
144
- <li>Windows 10 / 11</li>
145
- <li>macOS 12+</li>
146
- <li>Android 8.0+</li>
147
- <li>iOS 14+</li>
148
- </ul>
149
- <p>Visit <a href="#">our compatibility page</a> for full details.</p>
150
- </bd-accordion-item>
151
- `,
152
- parameters: {
153
- docs: {
154
- description: {
155
- story: 'Item with rich slotted content: a list, a paragraph, and an anchor link.'
156
- }
157
- }
158
- }
73
+ <bd-accordion-section title="Getting Started">
74
+ <bd-accordion-item title="How do I install Bitdefender?" open>
75
+ <p>Download the installer from your Bitdefender account, run it, and follow the on-screen instructions. The process takes under two minutes.</p>
76
+ </bd-accordion-item>
77
+ <bd-accordion-item title="Do I need to uninstall my previous antivirus?">
78
+ <p>Yes. Running two security solutions simultaneously can cause conflicts. Bitdefender will prompt you to remove any detected antivirus during installation.</p>
79
+ </bd-accordion-item>
80
+ <bd-accordion-item title="What operating systems are supported?">
81
+ <p>Bitdefender supports Windows 7 and later, macOS 10.14 and later, Android 5.0 and later, and iOS 12 and later.</p>
82
+ </bd-accordion-item>
83
+ </bd-accordion-section>
84
+ `
159
85
  };
160
86
 
161
- // ─── BdAccordionSection Stories ─────────────────────────────────────────────
162
87
 
163
- export const SectionDefault = {
164
- name : 'Section — Default',
88
+ // ─── No section title ─────────────────────────────────────────────────────────
89
+
90
+ export const NoSectionTitle = {
91
+ name : "No section title",
165
92
  render: () => html`
166
- <bd-accordion-section title="General Questions">
167
- ${defaultItems.map(item => html`
168
- <bd-accordion-item title="${item.title}">
169
- <p>${item.content}</p>
170
- </bd-accordion-item>
171
- `)}
93
+ <bd-accordion-section>
94
+ <bd-accordion-item title="What payment methods are accepted?">
95
+ <p>We accept all major credit and debit cards, PayPal, and bank transfers depending on your region.</p>
96
+ </bd-accordion-item>
97
+ <bd-accordion-item title="Can I get a refund?">
98
+ <p>Yes. Bitdefender offers a 30-day money-back guarantee on all subscription plans.</p>
99
+ </bd-accordion-item>
100
+ <bd-accordion-item title="Is my subscription renewed automatically?">
101
+ <p>Subscriptions auto-renew by default. You can disable auto-renewal at any time from your Bitdefender account dashboard.</p>
102
+ </bd-accordion-item>
172
103
  </bd-accordion-section>
173
- `,
174
- parameters: {
175
- docs: {
176
- description: {
177
- story: 'A full accordion section with a title and four collapsed items. No guide link.'
178
- }
179
- }
180
- }
104
+ `
181
105
  };
182
106
 
183
- export const SectionWithGuideLink = {
184
- name : 'Section With Guide Link',
107
+
108
+ // ─── Variant: default-blue ────────────────────────────────────────────────────
109
+
110
+ export const VariantDefaultBlue = {
111
+ name : "Variant — default-blue",
185
112
  render: () => html`
186
113
  <bd-accordion-section
187
- title="Installation Help"
188
- guide-label="View Installation Guide"
189
- guide-href="/docs/install"
190
- guide-icon="/assets/user_guide.png"
114
+ title="Product Features"
115
+ variant="default-blue"
191
116
  >
192
- ${defaultItems.map(item => html`
193
- <bd-accordion-item title="${item.title}">
194
- <p>${item.content}</p>
195
- </bd-accordion-item>
196
- `)}
117
+ <bd-accordion-item title="What is VPN and do I need it?">
118
+ <p>A VPN encrypts your internet traffic and hides your IP address, protecting your privacy on public Wi-Fi networks and preventing tracking.</p>
119
+ </bd-accordion-item>
120
+ <bd-accordion-item title="What is Bitdefender Photon™?">
121
+ <p>Photon is Bitdefender's adaptive technology that learns the patterns of your hardware and software to optimize scanning speed and efficiency.</p>
122
+ </bd-accordion-item>
123
+ <bd-accordion-item title="Does it include parental controls?">
124
+ <p>Yes. Bitdefender Total Security and Family Pack include comprehensive parental controls with content filtering, screen time limits, and location tracking.</p>
125
+ </bd-accordion-item>
197
126
  </bd-accordion-section>
198
- `,
199
- parameters: {
200
- docs: {
201
- description: {
202
- story: 'Section with all three guide link props set: `guide-label`, `guide-href`, and `guide-icon`. The link and icon are rendered below the items.'
203
- }
204
- }
205
- }
127
+ `
206
128
  };
207
129
 
208
- export const SectionWithGuideLinkNoIcon = {
209
- name : 'Section Guide Link Without Icon',
130
+
131
+ // ─── Variant: small ───────────────────────────────────────────────────────────
132
+
133
+ export const VariantSmall = {
134
+ name : "Variant — small",
210
135
  render: () => html`
211
136
  <bd-accordion-section
212
- title="Billing Questions"
213
- guide-label="View Billing Guide"
214
- guide-href="/docs/billing"
215
- guide-icon=""
137
+ title="System Requirements"
138
+ variant="small"
216
139
  >
217
- ${defaultItems.map(item => html`
218
- <bd-accordion-item title="${item.title}">
219
- <p>${item.content}</p>
220
- </bd-accordion-item>
221
- `)}
140
+ <bd-accordion-item title="Windows requirements">
141
+ <p>Windows 7 with Service Pack 1, Windows 8, Windows 8.1, Windows 10, Windows 11. Minimum 2 GB RAM and 2.5 GB free disk space.</p>
142
+ </bd-accordion-item>
143
+ <bd-accordion-item title="macOS requirements">
144
+ <p>macOS 10.14 (Mojave) or later. Minimum 1 GB RAM and 1 GB free disk space.</p>
145
+ </bd-accordion-item>
146
+ <bd-accordion-item title="Android requirements">
147
+ <p>Android 5.0 or later. At least 150 MB free storage space.</p>
148
+ </bd-accordion-item>
149
+ <bd-accordion-item title="iOS requirements">
150
+ <p>iOS 12.0 or later. Compatible with iPhone, iPad, and iPod touch.</p>
151
+ </bd-accordion-item>
222
152
  </bd-accordion-section>
223
- `,
224
- parameters: {
225
- docs: {
226
- description: {
227
- story: '`guide-icon` is set to an empty string — only the text label is rendered inside the guide link, without an icon image.'
228
- }
229
- }
230
- }
153
+ `
231
154
  };
232
155
 
233
- export const SectionNoTitle = {
234
- name : 'Section — No Title',
235
- render: () => html`
236
- <bd-accordion-section>
237
- ${defaultItems.map(item => html`
238
- <bd-accordion-item title="${item.title}">
239
- <p>${item.content}</p>
240
- </bd-accordion-item>
241
- `)}
242
- </bd-accordion-section>
243
- `,
244
- parameters: {
245
- docs: {
246
- description: {
247
- story: 'Section without a `title` prop. The `<h2>` is conditionally omitted.'
248
- }
249
- }
250
- }
251
- };
252
156
 
253
- export const SectionWithOpenItem = {
254
- name : 'Section — First Item Open',
255
- render: () => html`
256
- <bd-accordion-section title="FAQ">
257
- ${defaultItems.map((item, i) => html`
258
- <bd-accordion-item title="${item.title}" ?open="${i === 0}">
259
- <p>${item.content}</p>
260
- </bd-accordion-item>
261
- `)}
262
- </bd-accordion-section>
263
- `,
264
- parameters: {
265
- docs: {
266
- description: {
267
- story: 'First item is open by default. Remaining items are collapsed.'
268
- }
269
- }
270
- }
271
- };
157
+ // ─── With user guide link ─────────────────────────────────────────────────────
272
158
 
273
- export const MultipleSections = {
274
- name : 'Multiple Sections',
159
+ export const WithGuideLink = {
160
+ name : "With user guide link",
275
161
  render: () => html`
276
- <bd-accordion-section title="General Questions">
277
- <bd-accordion-item title="What is Bitdefender?">
278
- <p>Bitdefender is a global cybersecurity company founded in 2001.</p>
162
+ <bd-accordion-section
163
+ title="Troubleshooting"
164
+ guide-label="View the full user guide"
165
+ guide-href="https://www.bitdefender.com/consumer/support/"
166
+ >
167
+ <bd-accordion-item title="Bitdefender won't install — what should I do?">
168
+ <p>Make sure you have administrator rights, temporarily disable any other security software, and check that your system meets the minimum requirements.</p>
169
+ </bd-accordion-item>
170
+ <bd-accordion-item title="My subscription is not activating">
171
+ <p>Verify that you entered the correct activation code and that it has not already been used on the maximum number of devices allowed by your plan.</p>
279
172
  </bd-accordion-item>
280
- <bd-accordion-item title="Where is Bitdefender based?">
281
- <p>Bitdefender is headquartered in Bucharest, Romania.</p>
173
+ <bd-accordion-item title="Scans are taking very long">
174
+ <p>Run a Quick Scan first to address active threats. For full system scans, schedule them during low-activity periods such as overnight.</p>
282
175
  </bd-accordion-item>
283
176
  </bd-accordion-section>
177
+ `
178
+ };
284
179
 
180
+
181
+ // ─── With user guide link + icon ─────────────────────────────────────────────
182
+
183
+ export const WithGuideLinkAndIcon = {
184
+ name : "With user guide link + icon",
185
+ render: () => html`
285
186
  <bd-accordion-section
286
- title="Technical Support"
287
- guide-label="View Support Guide"
288
- guide-href="/docs/support"
187
+ title="Troubleshooting"
188
+ guide-icon="/assets/book.svg"
189
+ guide-label="View the full user guide"
190
+ guide-href="https://www.bitdefender.com/consumer/support/"
289
191
  >
290
- <bd-accordion-item title="How do I contact support?">
291
- <p>You can reach support via live chat or email from your Central account.</p>
192
+ <bd-accordion-item title="Bitdefender won't install — what should I do?">
193
+ <p>Make sure you have administrator rights, temporarily disable any other security software, and check that your system meets the minimum requirements.</p>
292
194
  </bd-accordion-item>
293
- <bd-accordion-item title="What are the support hours?">
294
- <p>Support is available 24/7 for all premium plans.</p>
195
+ <bd-accordion-item title="My subscription is not activating">
196
+ <p>Verify that you entered the correct activation code and that it has not already been used on the maximum number of devices allowed by your plan.</p>
295
197
  </bd-accordion-item>
296
198
  </bd-accordion-section>
297
- `,
298
- parameters: {
299
- docs: {
300
- description: {
301
- story: 'Two separate `bd-accordion-section` components rendered sequentially — one without a guide link, one with.'
302
- }
303
- }
304
- }
199
+ `
305
200
  };
306
201
 
307
- export const Playground = {
308
- name: '🛝 Playground',
309
- args: {
310
- sectionTitle: 'FAQ Section',
311
- guideLabel : 'View User Guide',
312
- guideHref : '/docs/guide',
313
- guideIcon : '/assets/user_guide.png',
314
- itemTitle : 'Can I cancel anytime?',
315
- open : false
316
- },
317
- render: (args) => html`
318
- <bd-accordion-section
319
- title="${args.sectionTitle}"
320
- guide-label="${args.guideLabel}"
321
- guide-href="${args.guideHref}"
322
- guide-icon="${args.guideIcon}"
323
- >
324
- <bd-accordion-item title="${args.itemTitle}" ?open="${args.open}">
325
- <p>Yes, you can cancel your subscription at any time from your Bitdefender Central account.</p>
202
+
203
+ // ─── bd-accordion-item isolated ──────────────────────────────────────────────
204
+
205
+ export const ItemIsolated = {
206
+ name : "bd-accordion-item (isolated)",
207
+ render: () => html`
208
+ <div style="max-width: 680px; padding: 1rem;">
209
+ <bd-accordion-item title="What is two-factor authentication?">
210
+ <p>Two-factor authentication (2FA) adds an extra layer of security by requiring a second form of verification — such as a code sent to your phone — in addition to your password.</p>
211
+ </bd-accordion-item>
212
+ </div>
213
+ `
214
+ };
215
+
216
+
217
+ // ─── Many items ───────────────────────────────────────────────────────────────
218
+
219
+ export const ManyItems = {
220
+ name : "Many items",
221
+ render: () => html`
222
+ <bd-accordion-section title="Everything You Need to Know">
223
+ <bd-accordion-item title="What is ransomware protection?">
224
+ <p>Ransomware protection detects and blocks attempts to encrypt your files without authorization, keeping your documents, photos, and videos safe.</p>
225
+ </bd-accordion-item>
226
+ <bd-accordion-item title="What is Safe Online Banking?">
227
+ <p>Safe Online Banking opens a dedicated, isolated browser for financial transactions, protecting against keyloggers, screen capture malware, and phishing.</p>
228
+ </bd-accordion-item>
229
+ <bd-accordion-item title="Can I use one subscription on multiple platforms?">
230
+ <p>Yes. Multi-device plans allow you to mix and match Windows, macOS, Android, and iOS devices up to your plan limit.</p>
326
231
  </bd-accordion-item>
327
- <bd-accordion-item title="Is there a free trial?">
328
- <p>Yes, a 30-day free trial is available.</p>
232
+ <bd-accordion-item title="What is Bitdefender Central?">
233
+ <p>Bitdefender Central is the web and mobile dashboard where you manage all your protected devices, subscriptions, and security reports from one place.</p>
234
+ </bd-accordion-item>
235
+ <bd-accordion-item title="Is my data sent to Bitdefender servers?">
236
+ <p>Bitdefender uses cloud-assisted detection to identify new threats quickly. Only suspicious file hashes and metadata are transmitted — never your personal files.</p>
237
+ </bd-accordion-item>
238
+ <bd-accordion-item title="What happens when my subscription expires?">
239
+ <p>Protection stops when your subscription expires. You will receive notifications before expiry so you can renew without a gap in coverage.</p>
329
240
  </bd-accordion-item>
330
241
  </bd-accordion-section>
331
- `,
332
- parameters: {
333
- docs: {
334
- description: {
335
- story: 'Interactive playground. Adjust section title, guide link props, and the first item\'s title and open state via Controls.'
336
- }
337
- }
338
- }
242
+ `
339
243
  };
@@ -1,44 +1,56 @@
1
- import { LitElement, html } from 'lit';
1
+ import { LitElement, html, css } from "lit";
2
2
 
3
- export class BdIcon extends LitElement {
3
+ /**
4
+ * Optional `src` (image URL) with `label` for alt text, or default slot for inline SVG.
5
+ */
6
+ class BdIcon extends LitElement {
4
7
  static properties = {
5
- src : { type: String },
6
- label : { type: String },
7
- width : { type: String },
8
+ src: { type: String },
9
+ label: { type: String },
10
+ width: { type: String },
8
11
  height: { type: String }
9
12
  };
10
13
 
11
- constructor() {
12
- super();
13
- this.width = '100%';
14
- this.height = '100%';
15
- }
16
-
17
- render() {
18
- const ariaLabel = this.label || null;
19
-
20
- const commonStyles = `
14
+ static styles = css`
15
+ :host {
16
+ display: inline-block;
17
+ vertical-align: middle;
18
+ line-height: 0;
19
+ color: var(--color-blue-500);
20
+ }
21
+ .wrap,
22
+ img {
23
+ display: block;
24
+ width: var(--bd-icon-w, auto);
25
+ height: var(--bd-icon-h, auto);
26
+ }
27
+ img {
28
+ object-fit: contain;
29
+ }
30
+ ::slotted(svg) {
21
31
  display: block;
22
32
  width: 100%;
23
33
  height: 100%;
24
- `;
34
+ }
35
+ `;
25
36
 
26
- return html`
27
- ${this.src
28
- ? html`<img
29
- src="${this.src}"
30
- alt="${ariaLabel}"
31
- aria-label="${ariaLabel}"
32
- width="${this.width}"
33
- height="${this.height}"
34
- style="${commonStyles} object-fit: contain;"
35
- >`
36
- : html`<div style="${commonStyles}">
37
- <slot></slot>
38
- </div>`
39
- }
40
- `;
37
+ render() {
38
+ const w = this.width || "";
39
+ const h = this.height || "";
40
+ const style = `${w ? `--bd-icon-w:${w};` : ""}${h ? `--bd-icon-h:${h};` : ""}`;
41
+ if (this.src) {
42
+ return html`
43
+ <img
44
+ src="${this.src}"
45
+ alt="${this.label || ""}"
46
+ style="${style}"
47
+ loading="lazy"
48
+ decoding="async"
49
+ />
50
+ `;
51
+ }
52
+ return html`<span class="wrap" style="${style}"><slot></slot></span>`;
41
53
  }
42
54
  }
43
55
 
44
- customElements.define('bd-icon', BdIcon);
56
+ customElements.define("bd-icon", BdIcon);