@repobit/dex-system-design 0.25.12 → 1.0.0
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 +204 -0
- package/README.md +131 -8
- package/package.json +96 -13
- package/schemas/component-manifest.json +3294 -405
- package/schemas/manifest-omissions.json +173 -0
- package/src/blog/src/breakpoints.js +6 -6
- package/src/blog/src/content/blog-atoms-showcase.js +1 -1
- package/src/blog/src/content/blog-page-layout.js +2 -2
- package/src/blog/src/lib/article-toc.js +7 -7
- package/src/blog/src/shell/blog-shell.js +1 -1
- package/src/blog/src/tokens/blog.js +2 -2
- package/src/blog/src/tokens/core.js +34 -35
- package/src/blog/src/tokens/legacy.js +0 -9
- package/src/blog/tokens/blog.js +2 -2
- package/src/blog/tokens/core.js +34 -35
- package/src/blog/tokens/legacy.js +0 -9
- package/src/blog/tokens.css +36 -46
- package/src/components/accordion/accordion-bg.css.js +83 -59
- package/src/components/accordion/accordion-bg.js +29 -10
- package/src/components/accordion/accordion-bg.stories.js +67 -67
- package/src/components/accordion/accordion-keyboard.js +80 -0
- package/src/components/accordion/accordion.css.js +142 -80
- package/src/components/accordion/accordion.js +37 -10
- package/src/components/accordion/accordion.stories.js +7 -7
- package/src/components/agent-endpoints/agent-endpoints.css.js +36 -39
- package/src/components/agent-endpoints/agent-endpoints.js +30 -20
- package/src/components/agent-endpoints/agent-endpoints.stories.js +1 -1
- package/src/components/ai-guardian-demo.stories.js +91 -91
- package/src/components/alert/alert.css.js +198 -0
- package/src/components/alert/alert.js +103 -0
- package/src/components/alert/alert.stories.js +206 -0
- package/src/components/anchor/anchor-nav.css.js +213 -101
- package/src/components/anchor/anchor-nav.js +26 -40
- package/src/components/anchor/anchor.stories.js +22 -12
- package/src/components/annotation/annotation.css.js +58 -0
- package/src/components/annotation/annotation.js +67 -0
- package/src/components/annotation/annotation.stories.js +63 -0
- package/src/components/architecture.stories.js +285 -0
- package/src/components/atoms.stories.js +342 -0
- package/src/components/avatar/avatar.css.js +67 -0
- package/src/components/avatar/avatar.js +42 -0
- package/src/components/avatar/avatar.stories.js +95 -0
- package/src/components/awards/awards-flex.css.js +209 -23
- package/src/components/awards/awards-flex.js +66 -7
- package/src/components/awards/awards-flex.stories.js +1 -1
- package/src/components/awards/{awards-light.stories.js → awards-summary.stories.js} +54 -64
- package/src/components/awards/awards.css.js +116 -58
- package/src/components/awards/awards.js +102 -28
- package/src/components/awards/awards.stories.js +1 -1
- package/src/components/back/back.css.js +51 -22
- package/src/components/back/back.js +28 -7
- package/src/components/back/back.stories.js +9 -3
- package/src/components/badge/badge.css.js +158 -46
- package/src/components/badge/badge.js +62 -74
- package/src/components/badge/badge.stories.js +176 -248
- package/src/components/bento-grid/bento-grid.css.js +21 -16
- package/src/components/bento-grid/bento-grid.js +16 -4
- package/src/components/bento-grid/bento-grid.stories.js +19 -18
- package/src/components/bento-grid/bento-item.css.js +52 -28
- package/src/components/bento-grid/bento-item.js +2 -2
- package/src/components/blockquote/blockquote.css.js +47 -0
- package/src/components/blockquote/blockquote.js +29 -0
- package/src/components/blockquote/blockquote.stories.js +62 -0
- package/src/components/breadcrumb/breadcrumb.css.js +92 -22
- package/src/components/breadcrumb/breadcrumb.js +56 -11
- package/src/components/button/button.css.js +531 -161
- package/src/components/button/button.js +206 -214
- package/src/components/button/button.stories.js +322 -174
- package/src/components/caption/caption.css.js +21 -0
- package/src/components/caption/caption.js +31 -0
- package/src/components/caption/caption.stories.js +62 -0
- package/src/components/card-features/card-features.css.js +14 -22
- package/src/components/card-features/card-features.js +68 -9
- package/src/components/card-features/card-features.stories.js +11 -11
- package/src/components/cards/card.css.js +60 -81
- package/src/components/cards/card.js +56 -25
- package/src/components/cards/card.stories.js +39 -39
- package/src/components/carousel/carousel.css.js +93 -99
- package/src/components/carousel/carousel.js +32 -4
- package/src/components/checkbox/checkbox.css.js +111 -93
- package/src/components/checkbox/checkbox.js +64 -90
- package/src/components/checkbox/checkbox.stories.js +96 -29
- package/src/components/code/code.css.js +70 -0
- package/src/components/code/code.js +40 -0
- package/src/components/code/code.stories.js +73 -0
- package/src/components/compare/compare.css.js +179 -43
- package/src/components/compare/compare.js +52 -25
- package/src/components/compare/compare.stories.js +61 -4
- package/src/components/comparison-panel/comparison-panel.css.js +38 -51
- package/src/components/comparison-panel/comparison-panel.js +5 -4
- package/src/components/comparison-panel/comparison-panel.stories.js +1 -1
- package/src/components/compatibility-table/compatibility-table.css.js +180 -80
- package/src/components/compatibility-table/compatibility-table.js +37 -9
- package/src/components/control-alignment.stories.js +393 -0
- package/src/components/cta-banner/cta-banner.css.js +41 -13
- package/src/components/cta-banner/cta-banner.js +6 -5
- package/src/components/cta-banner/cta-banner.stories.js +43 -98
- package/src/components/display/display.css.js +25 -1
- package/src/components/display/display.js +46 -13
- package/src/components/display/display.stories.js +270 -40
- package/src/components/divider/divider-horizontal.js +21 -5
- package/src/components/divider/divider-vertical.js +15 -7
- package/src/components/divider/divider.css.js +2 -2
- package/src/components/divider/divider.stories.js +38 -34
- package/src/components/dropdown/dropdown.css.js +93 -126
- package/src/components/dropdown/dropdown.js +114 -34
- package/src/components/dropdown/dropdown.stories.js +56 -24
- package/src/components/features/features.css.js +24 -11
- package/src/components/features/features.js +7 -3
- package/src/components/features/features.stories.js +37 -37
- package/src/components/features-tab/features-tab.css.js +19 -8
- package/src/components/features-tab/features-tab.js +6 -5
- package/src/components/features-tab/features-tab.stories.js +23 -23
- package/src/components/fieldset/fieldset.css.js +30 -0
- package/src/components/fieldset/fieldset.js +28 -0
- package/src/components/fieldset/fieldset.stories.js +84 -0
- package/src/components/footer/footer-links-group.css.js +10 -14
- package/src/components/footer/footer-links-group.js +4 -3
- package/src/components/footer/footer-lp.css.js +59 -30
- package/src/components/footer/footer-lp.js +17 -12
- package/src/components/footer/footer-lp.stories.js +63 -75
- package/src/components/footer/footer-nav-menu.css.js +26 -4
- package/src/components/footer/footer-nav-menu.js +3 -2
- package/src/components/footer/footer.css.js +146 -264
- package/src/components/footer/footer.js +176 -106
- package/src/components/footer/footer.stories.js +9 -9
- package/src/components/footer/localeMap.js +1 -1
- package/src/components/grid/grid.css.js +1 -1
- package/src/components/grid/grid.js +49 -7
- package/src/components/grid/grid.stories.js +111 -0
- package/src/components/header/header-code.css.js +61 -51
- package/src/components/header/header-code.js +28 -14
- package/src/components/header/header-code.stories.js +5 -5
- package/src/components/header/header.css.js +655 -176
- package/src/components/header/header.js +269 -36
- package/src/components/header/header.stories.js +841 -18
- package/src/components/heading/heading.css.js +14 -17
- package/src/components/heading/heading.js +48 -33
- package/src/components/heading/heading.stories.js +27 -25
- package/src/components/help-text/help-text.css.js +21 -0
- package/src/components/help-text/help-text.js +25 -0
- package/src/components/help-text/help-text.stories.js +66 -0
- package/src/components/highlight/highlight.css.js +86 -64
- package/src/components/highlight/highlight.js +18 -27
- package/src/components/highlight/highlight.stories.js +14 -3
- package/src/components/icons/analysis-icon.js +6 -16
- package/src/components/icons/arrow-down-icon.js +6 -19
- package/src/components/icons/arrow-icon.js +44 -0
- package/src/components/icons/arrow-right-icon.js +30 -23
- package/src/components/icons/arrow-up-icon.js +19 -18
- package/src/components/icons/bd-ai-icon.js +1 -1
- package/src/components/icons/brand-marks.stories.js +279 -0
- package/src/components/icons/brand-signature-icon.js +42 -0
- package/src/components/icons/check-icon.js +27 -0
- package/src/components/icons/circle-info-icon.js +33 -0
- package/src/components/icons/close-icon.js +6 -18
- package/src/components/icons/family-icon.js +8 -20
- package/src/components/icons/globe-icon.js +6 -18
- package/src/components/icons/guide-icon.js +6 -18
- package/src/components/icons/icon-element.js +99 -0
- package/src/components/icons/icons.js +36 -0
- package/src/components/icons/icons.stories.js +184 -52
- package/src/components/icons/individual-icon.js +6 -18
- package/src/components/icons/laurel-icon.js +9 -19
- package/src/components/icons/machine-learning-icon.js +6 -17
- package/src/components/icons/marks.js +41 -0
- package/src/components/icons/minus-icon.js +7 -21
- package/src/components/icons/missing-icon.js +52 -0
- package/src/components/icons/plus-icon.js +7 -21
- package/src/components/icons/quote-icon.js +19 -19
- package/src/components/image/image.css.js +72 -25
- package/src/components/image/image.js +11 -6
- package/src/components/image/image.stories.js +2 -2
- package/src/components/input/custom-form.stories.js +214 -62
- package/src/components/input/input-clipboard.css.js +51 -144
- package/src/components/input/input-clipboard.js +31 -15
- package/src/components/input/input.css.js +8 -146
- package/src/components/input/input.js +93 -38
- package/src/components/install-options/install-options.css.js +84 -77
- package/src/components/install-options/install-options.js +33 -30
- package/src/components/install-options/install-options.stories.js +3 -3
- package/src/components/label/label.css.js +35 -0
- package/src/components/label/label.js +38 -0
- package/src/components/label/label.stories.js +82 -0
- package/src/components/light-carousel/light-carousel.css.js +111 -63
- package/src/components/light-carousel/light-carousel.js +85 -11
- package/src/components/light-carousel/light-carousel.stories.js +126 -82
- package/src/components/link/link.css.js +150 -99
- package/src/components/link/link.js +86 -11
- package/src/components/link/link.stories.js +124 -30
- package/src/components/list/list-item/list-item.css.js +74 -22
- package/src/components/list/list-item/list-item.js +32 -10
- package/src/components/list/list-item/list-item.stories.js +23 -23
- package/src/components/list/list.css.js +8 -2
- package/src/components/list/list.js +3 -2
- package/src/components/list/list.stories.js +222 -0
- package/src/components/modal/modal.css.js +114 -24
- package/src/components/modal/modal.js +83 -7
- package/src/components/modal/modal.stories.js +9 -9
- package/src/components/overview/overview.css.js +19 -14
- package/src/components/overview/overview.js +6 -5
- package/src/components/overview/overview.stories.js +10 -10
- package/src/components/page-switcher/page-switcher.css.js +97 -40
- package/src/components/page-switcher/page-switcher.js +28 -5
- package/src/components/page-switcher/page-switcher.stories.js +95 -0
- package/src/components/paragraph/paragraph.css.js +15 -10
- package/src/components/paragraph/paragraph.js +41 -44
- package/src/components/paragraph/paragraph.stories.js +56 -21
- package/src/components/picture/picture.css.js +103 -44
- package/src/components/picture/picture.js +100 -30
- package/src/components/picture/picture.stories.js +1 -1
- package/src/components/pricing-cards/new-pricing-card.js +3 -3
- package/src/components/pricing-cards/new-pricing.css.js +24 -15
- package/src/components/pricing-cards/pricing-card-actions.css.js +1 -1
- package/src/components/pricing-cards/pricing-card-actions.js +3 -4
- package/src/components/pricing-cards/pricing-card-container.css.js +3 -3
- package/src/components/pricing-cards/pricing-card-container.js +3 -2
- package/src/components/pricing-cards/pricing-card-header.css.js +10 -8
- package/src/components/pricing-cards/pricing-card-header.js +6 -7
- package/src/components/pricing-cards/pricing-card-pricing.css.js +16 -9
- package/src/components/pricing-cards/pricing-card-pricing.js +8 -6
- package/src/components/pricing-cards/pricing-card-show-more.css.js +11 -3
- package/src/components/pricing-cards/pricing-card-show-more.js +8 -3
- package/src/components/pricing-cards/pricing-card.css.js +244 -190
- package/src/components/pricing-cards/pricing-card.js +54 -70
- package/src/components/pricing-cards/pricing-feature-item.css.js +25 -8
- package/src/components/pricing-cards/pricing-feature-item.js +8 -3
- package/src/components/process-steps/process-steps.css.js +26 -14
- package/src/components/process-steps/process-steps.js +23 -6
- package/src/components/process-steps/process-steps.stories.js +1 -1
- package/src/components/progress/progress.css.js +80 -0
- package/src/components/progress/progress.js +42 -0
- package/src/components/progress/progress.stories.js +79 -0
- package/src/components/quick-answer/quick-answer.css.js +75 -13
- package/src/components/quick-answer/quick-answer.js +8 -3
- package/src/components/radio/radio.css.js +92 -128
- package/src/components/radio/radio.js +106 -127
- package/src/components/radio/radio.stories.js +54 -19
- package/src/components/review/review-grid.css.js +5 -6
- package/src/components/review/review-grid.js +14 -11
- package/src/components/review/review.css.js +11 -6
- package/src/components/review/review.js +3 -8
- package/src/components/shared/ensemble.css.js +93 -0
- package/src/components/shared/form-field.css.js +206 -0
- package/src/components/shared/prop-vocabulary.js +48 -0
- package/src/components/shared/token-scales.js +306 -0
- package/src/components/skeleton/skeleton.css.js +34 -0
- package/src/components/skeleton/skeleton.js +32 -0
- package/src/components/skeleton/skeleton.stories.js +70 -0
- package/src/components/spinner/spinner.css.js +62 -0
- package/src/components/spinner/spinner.js +38 -0
- package/src/components/spinner/spinner.stories.js +92 -0
- package/src/components/spotlight-section/spotlight-section.css.js +14 -13
- package/src/components/spotlight-section/spotlight-section.js +42 -39
- package/src/components/switch/switch.css.js +103 -0
- package/src/components/switch/switch.js +44 -0
- package/src/components/switch/switch.stories.js +86 -0
- package/src/components/tab-list/content-switcher.stories.js +189 -0
- package/src/components/tab-list/tab-list.css.js +250 -0
- package/src/components/tab-list/tab-list.js +184 -0
- package/src/components/tab-list/tab-list.stories.js +221 -0
- package/src/components/tabs/tabs.css.js +14 -123
- package/src/components/tabs/tabs.js +16 -19
- package/src/components/tabs/tabs.stories.js +95 -95
- package/src/components/tag/tag.css.js +54 -0
- package/src/components/tag/tag.js +32 -0
- package/src/components/tag/tag.stories.js +126 -0
- package/src/components/terminal/terminal-message.css.js +164 -60
- package/src/components/terminal/terminal-message.js +5 -5
- package/src/components/terminal/terminal-message.stories.js +70 -1
- package/src/components/termsOfUse/terms.css.js +25 -20
- package/src/components/termsOfUse/terms.js +13 -9
- package/src/components/termsOfUse/terms.stories.js +1 -1
- package/src/components/textarea/textarea.css.js +51 -0
- package/src/components/textarea/textarea.js +136 -0
- package/src/components/textarea/textarea.stories.js +191 -0
- package/src/components/tooltip/tooltip.css.js +75 -0
- package/src/components/tooltip/tooltip.js +156 -0
- package/src/components/tooltip/tooltip.stories.js +161 -0
- package/src/components/trust-panel/trust-panel.css.js +85 -33
- package/src/components/trust-panel/trust-panel.js +18 -10
- package/src/components/trust-panel/trust-panel.stories.js +1 -1
- package/src/components/ultimate-security-demo.stories.js +431 -0
- package/src/components/video/video.css.js +17 -0
- package/src/components/video/video.js +40 -0
- package/src/components/video/video.stories.js +106 -0
- package/src/components/video-player/video-player.css.js +67 -11
- package/src/components/video-player/video-player.js +35 -4
- package/src/components/video-player/video-player.stories.js +1 -1
- package/src/components/visual-alignment.stories.js +411 -0
- package/src/components/visually-hidden/visually-hidden.css.js +24 -0
- package/src/components/visually-hidden/visually-hidden.js +16 -0
- package/src/components/visually-hidden/visually-hidden.stories.js +56 -0
- package/src/stories/Button.stories.js +17 -17
- package/src/stories/Header.stories.js +10 -10
- package/src/stories/Page.js +1 -1
- package/src/stories/Page.stories.js +6 -6
- package/src/tokens/borders.stories.js +339 -0
- package/src/tokens/color-responsibilities.stories.js +227 -0
- package/src/tokens/dark-derivation.js +309 -0
- package/src/tokens/dark-findings.js +197 -0
- package/src/tokens/dark-mode.stories.js +207 -0
- package/src/tokens/dimension.stories.js +251 -0
- package/src/tokens/elevation.stories.js +143 -0
- package/src/tokens/focus.stories.js +276 -0
- package/src/tokens/fonts.css +20 -20
- package/src/tokens/fonts.stories.js +354 -374
- package/src/tokens/layout.css +25 -11
- package/src/tokens/motion.stories.js +231 -0
- package/src/tokens/shape.stories.js +272 -0
- package/src/tokens/spacing-rhythm.stories.js +359 -0
- package/src/tokens/spacing.stories.js +208 -703
- package/src/tokens/story-chrome.js +503 -0
- package/src/tokens/surfaces.stories.js +224 -0
- package/src/tokens/text-on-surface.stories.js +164 -0
- package/src/tokens/token-map.js +220 -0
- package/src/tokens/token-map.stories.js +257 -0
- package/src/tokens/token-purposes.js +266 -0
- package/src/tokens/tokens-grid.stories.js +388 -900
- package/src/tokens/tokens.css +1633 -1045
- package/src/tokens/tokens.js +1130 -492
- package/src/tokens/tokens.stories.js +137 -47
- package/src/tokens/type-ceiling-words.js +299 -0
- package/src/tokens/typography.stories.js +1003 -965
- package/src/tokens/vertical-rhythm.stories.js +224 -0
- package/src/components/awards/awards-icon.js +0 -56
- package/src/components/awards/awards-light.js +0 -240
- package/src/components/banner/banner.js +0 -60
- package/src/components/banner/banner.stories.js +0 -51
- package/src/components/button/icons.js +0 -24
- package/src/components/input/index.js +0 -0
- package/src/components/light-carousel/light-carousel-simple.css.js +0 -183
- package/src/components/light-carousel/light-carousel-simple.js +0 -74
- package/src/tokens/colors.js +0 -121
- package/src/tokens/typography.css.js +0 -207
- package/src/tokens/typography.js +0 -0
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
import { html } from "lit";
|
|
2
|
+
|
|
3
|
+
// A product landing page composed from what the package already ships and
|
|
4
|
+
// nothing else. Every element below is a registered bd-* / pricing / compare
|
|
5
|
+
// element, every attribute is one its element observes, and every image is one
|
|
6
|
+
// public/assets already serves. If a section of the reference could not be
|
|
7
|
+
// expressed that way, the gap is recorded in the docs description rather than
|
|
8
|
+
// papered over with markup of its own.
|
|
9
|
+
import "./header/header.js";
|
|
10
|
+
import "./image/image.js";
|
|
11
|
+
import "./anchor/anchor-nav.js";
|
|
12
|
+
import "./highlight/highlight.js";
|
|
13
|
+
import "./light-carousel/light-carousel.js";
|
|
14
|
+
import "./pricing-cards/pricing-card.js";
|
|
15
|
+
import "./card-features/card-features.js";
|
|
16
|
+
import "./awards/awards-flex.js";
|
|
17
|
+
import "./compare/compare.js";
|
|
18
|
+
import "./tabs/tabs.js";
|
|
19
|
+
import "./features/features.js";
|
|
20
|
+
import "./features-tab/features-tab.js";
|
|
21
|
+
import "./accordion/accordion.js";
|
|
22
|
+
import "./accordion/accordion-bg.js";
|
|
23
|
+
import "./termsOfUse/terms.js";
|
|
24
|
+
import "./footer/footer-lp.js";
|
|
25
|
+
import "./footer/footer-nav-menu.js";
|
|
26
|
+
import "./divider/divider-vertical.js";
|
|
27
|
+
import "./heading/heading.js";
|
|
28
|
+
import "./paragraph/paragraph.js";
|
|
29
|
+
import "./badge/badge.js";
|
|
30
|
+
import "./list/list.js";
|
|
31
|
+
import "./list/list-item/list-item.js";
|
|
32
|
+
import "./icons/individual-icon.js";
|
|
33
|
+
import "./icons/globe-icon.js";
|
|
34
|
+
import "./icons/machine-learning-icon.js";
|
|
35
|
+
import "./icons/analysis-icon.js";
|
|
36
|
+
import "./icons/family-icon.js";
|
|
37
|
+
import "./icons/arrow-up-icon.js";
|
|
38
|
+
import "./icons/close-icon.js";
|
|
39
|
+
|
|
40
|
+
export default {
|
|
41
|
+
title : "Demos/Ultimate Security Landing",
|
|
42
|
+
tags : ["autodocs"],
|
|
43
|
+
parameters: {
|
|
44
|
+
layout : "fullscreen",
|
|
45
|
+
controls: { disable: true },
|
|
46
|
+
docs : {
|
|
47
|
+
description: {
|
|
48
|
+
component: `
|
|
49
|
+
**Ultimate Security Landing** rebuilds the consumer product page from the
|
|
50
|
+
reference screenshot using only existing atoms, components and modules. No
|
|
51
|
+
new element, no new attribute, no page-level CSS.
|
|
52
|
+
|
|
53
|
+
Section by section, what the reference asked for and what the package could
|
|
54
|
+
answer with:
|
|
55
|
+
|
|
56
|
+
| Reference section | Built from |
|
|
57
|
+
|---|---|
|
|
58
|
+
| Hero with price, Buy / View plans, disclaimers, image | bd-header (price zones are store-driven) |
|
|
59
|
+
| Sticky section nav with Buy now | bd-anchor-nav + bd-anchor-nav-item |
|
|
60
|
+
| Eyebrow + highlighted section title | bd-highlight |
|
|
61
|
+
| Four protection pillars | bd-light-carousel-section variant="simple" |
|
|
62
|
+
| Individual / Family plans with Monthly / Yearly | bd-pricing-container (PRODUCT_FROZEN, self-contained) |
|
|
63
|
+
| Nine Scam Copilot capabilities with NEW / IMPROVED | bd-card-features-section + bd-card-features-item |
|
|
64
|
+
| Award band with seven badges | bd-awards-flex background="tint" layout="grid" |
|
|
65
|
+
| Best Protection / Best Performance bars | bd-compare-section + compare-card + compare-bar |
|
|
66
|
+
| Family member tabs with image | bd-tabs + bd-tab-panel + bd-features-tab |
|
|
67
|
+
| Platform tabs, three feature columns on blue | bd-tabs bg-blue + bd-features + bd-feature-col |
|
|
68
|
+
| Questions? Answers. | bd-accordion-bg |
|
|
69
|
+
| System requirements, Terms of use, footnotes | bd-accordion-section, bd-terms-section |
|
|
70
|
+
| Legal footer | bd-footer-lp + bd-footer-nav |
|
|
71
|
+
|
|
72
|
+
Where the vocabulary ran out, the page says so rather than inventing:
|
|
73
|
+
|
|
74
|
+
- The Scam Copilot section in the reference has an eyebrow above its title.
|
|
75
|
+
bd-card-features-section has a title and nothing above it, so the eyebrow
|
|
76
|
+
and title are carried by a bd-highlight in front of the module and the
|
|
77
|
+
module's own title is left empty.
|
|
78
|
+
- The hero's price comes from the store integration inside bd-header
|
|
79
|
+
(bd-product / bd-option). Without a store context the price zones render
|
|
80
|
+
empty; the fullPrice / discount / finalPrice attributes exist on the element
|
|
81
|
+
and are passed, but the template reads the store, not them.
|
|
82
|
+
- bd-pricing-container carries its own product content. It is the closest
|
|
83
|
+
match to the reference's plan cards and switches, and it is frozen, so the
|
|
84
|
+
copy is its copy.
|
|
85
|
+
`
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// ─── Content ─────────────────────────────────────────────────────────────────
|
|
92
|
+
|
|
93
|
+
const awardBadges = [
|
|
94
|
+
{ id: "pc-mag", label: "PC MAG Editors' Choice", type: "red", icon: "pc-mag" },
|
|
95
|
+
{ id: "av-comparatives", label: "AV-Comparatives", type: "dark", icon: "av-comparatives" },
|
|
96
|
+
{ id: "best-brands", label: "Best Brands 2024", type: "dark", icon: "best-brands" },
|
|
97
|
+
{ id: "pc-mag-2024", label: "PC Choice 2024", type: "red", icon: "pc-mag-2024" },
|
|
98
|
+
{ id: "pc-mag-readers", label: "PC MAG Readers' Choice", type: "red", icon: "pc-mag-readers" },
|
|
99
|
+
{ id: "pc-mag-business", label: "PC Business Choice", type: "red", icon: "pc-mag-business" },
|
|
100
|
+
{ id: "top-product", label: "AV-TEST Top Product", type: "red", icon: "top-product" }
|
|
101
|
+
];
|
|
102
|
+
|
|
103
|
+
const AV_TEST_URL = "https://www.av-test.org/";
|
|
104
|
+
|
|
105
|
+
const scamCopilot = [
|
|
106
|
+
{ title: "Scam Copilot Chatbot", badge: "NEW", variant: "bd-light-blue", icon: "individual", text: "Specialized AI chatbot that helps you identify suspicious online interactions so you don't become a victim." },
|
|
107
|
+
{ title: "Scam Wave Alerts", badge: "NEW", variant: "bd-light-blue", icon: "globe", text: "Stay informed with real-time alerts about ongoing scam outbreaks detected in your area automatically." },
|
|
108
|
+
{ title: "Online Scam Protection", badge: "NEW", variant: "bd-light-blue", icon: "machine-learning", text: "Focused on browsing activities, it specializes in detecting the newest scam patterns and tactics." },
|
|
109
|
+
{ title: "Remote Access Protection", badge: "NEW", variant: "bd-light-blue", icon: "analysis", text: "Detects patterns of behavior typical of scammers seeking to access your data remotely." },
|
|
110
|
+
{ title: "SMS Protection", badge: "IMPROVED", variant: "bd-light-green", icon: "family", text: "Detects scams and harmful links in SMS messages using advanced AI for fast, real-time protection." },
|
|
111
|
+
{ title: "Email Protection", badge: "", variant: "", icon: "arrow-up", text: "Monitors web mailboxes from Gmail and Outlook 24/7 and marks every incoming email as safe or unsafe." },
|
|
112
|
+
{ title: "Scam Notification Protection", badge: "", variant: "", icon: "close", text: "Scans and detects scam attempts directly in push notifications before you even tap or interact." },
|
|
113
|
+
{ title: "Chat Protection", badge: "", variant: "", icon: "globe", text: "Identifies scam messages in WhatsApp, Messenger, Telegram and Discord chats before they reach your attention." },
|
|
114
|
+
{ title: "Calendar Invites Protection", badge: "", variant: "", icon: "analysis", text: "Finds and blocks scam calendar events before they can trick you with fake links or misleading invites." }
|
|
115
|
+
];
|
|
116
|
+
|
|
117
|
+
const icon = (name) => {
|
|
118
|
+
switch (name) {
|
|
119
|
+
case "individual": return html`<bd-individual-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-individual-icon>`;
|
|
120
|
+
case "globe": return html`<bd-globe-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-globe-icon>`;
|
|
121
|
+
case "machine-learning": return html`<bd-machine-learning-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-machine-learning-icon>`;
|
|
122
|
+
case "analysis": return html`<bd-analysis-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-analysis-icon>`;
|
|
123
|
+
case "family": return html`<bd-family-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-family-icon>`;
|
|
124
|
+
case "arrow-up": return html`<bd-arrow-up-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-arrow-up-icon>`;
|
|
125
|
+
default: return html`<bd-close-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-close-icon>`;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
// A family-member panel: the same layout object four times over, with the
|
|
130
|
+
// image side alternating so the section reads as a conversation.
|
|
131
|
+
const familyPanel = (title, heading, body, image, reverse) => html`
|
|
132
|
+
<bd-tab-panel title="${title}">
|
|
133
|
+
<bd-features-tab cta-label="Buy now" cta-href="#section-pricing" cta-kind="danger" ?reverse="${reverse}">
|
|
134
|
+
<bd-h as="h3" visual-level="h3" slot="heading" color="primary">${heading}</bd-h>
|
|
135
|
+
<div slot="content">
|
|
136
|
+
<bd-p variant="regular">${body}</bd-p>
|
|
137
|
+
</div>
|
|
138
|
+
<bd-img slot="media" src="${image}" alt="" loading="lazy" width="520" height="347" fit="cover"></bd-img>
|
|
139
|
+
</bd-features-tab>
|
|
140
|
+
</bd-tab-panel>
|
|
141
|
+
`;
|
|
142
|
+
|
|
143
|
+
// A platform panel: three feature columns, each an accordion of capabilities.
|
|
144
|
+
// The item lists are shortened for macOS, iOS and Android, as on the reference,
|
|
145
|
+
// where each platform shows only what it ships.
|
|
146
|
+
const platformPanel = (title, protection, privacy, identity) => html`
|
|
147
|
+
<bd-tab-panel title="${title}">
|
|
148
|
+
<bd-features>
|
|
149
|
+
<bd-feature-col title="Protection">
|
|
150
|
+
<bd-individual-icon slot="icon" size="40" color="var(--color-blue-500)"></bd-individual-icon>
|
|
151
|
+
<bd-p variant="small" slot="description">Bitdefender's unbeatable multi-layered protection keeps your devices safe from all new and existing cyber threats.</bd-p>
|
|
152
|
+
<bd-accordion-section no-container>
|
|
153
|
+
${protection.map(([label, text, badge], i) => html`
|
|
154
|
+
<bd-accordion-item title="${label}" ?open="${i === 0}">
|
|
155
|
+
${badge ? html`<bd-badge slot="badge" tone="brand" variant="fill" size="sm">${badge}</bd-badge>` : ""}
|
|
156
|
+
<bd-p variant="small">${text}</bd-p>
|
|
157
|
+
</bd-accordion-item>
|
|
158
|
+
`)}
|
|
159
|
+
</bd-accordion-section>
|
|
160
|
+
</bd-feature-col>
|
|
161
|
+
|
|
162
|
+
<bd-feature-col title="Privacy">
|
|
163
|
+
<bd-globe-icon slot="icon" size="40" color="var(--color-blue-500)"></bd-globe-icon>
|
|
164
|
+
<bd-p variant="small" slot="description">Bitdefender Ultimate Security takes care of your online privacy and personal information.</bd-p>
|
|
165
|
+
<bd-accordion-section no-container>
|
|
166
|
+
${privacy.map(([label, text], i) => html`
|
|
167
|
+
<bd-accordion-item title="${label}" ?open="${i === 0}">
|
|
168
|
+
<bd-p variant="small">${text}</bd-p>
|
|
169
|
+
</bd-accordion-item>
|
|
170
|
+
`)}
|
|
171
|
+
</bd-accordion-section>
|
|
172
|
+
</bd-feature-col>
|
|
173
|
+
|
|
174
|
+
<bd-feature-col title="Identity Protection">
|
|
175
|
+
<bd-analysis-icon slot="icon" size="40" color="var(--color-blue-500)"></bd-analysis-icon>
|
|
176
|
+
<bd-p variant="small" slot="description">Goes beyond credit monitoring to protect you against identity theft attacks you might not always recognize.</bd-p>
|
|
177
|
+
<bd-accordion-section no-container>
|
|
178
|
+
${identity.map(([label, text], i) => html`
|
|
179
|
+
<bd-accordion-item title="${label}" ?open="${i === 0}">
|
|
180
|
+
<bd-p variant="small">${text}</bd-p>
|
|
181
|
+
</bd-accordion-item>
|
|
182
|
+
`)}
|
|
183
|
+
</bd-accordion-section>
|
|
184
|
+
</bd-feature-col>
|
|
185
|
+
</bd-features>
|
|
186
|
+
</bd-tab-panel>
|
|
187
|
+
`;
|
|
188
|
+
|
|
189
|
+
const protectionWindows = [
|
|
190
|
+
["Complete Real-Time Data Protection", "Absolute power in the most efficient security bundle available today. Bitdefender Ultimate Security works against all e-threats.", "NEW"],
|
|
191
|
+
["Network Threat Prevention", "Proactive network monitoring stops attacks before they reach your files.", "INDUSTRY 1ST"],
|
|
192
|
+
["Advanced Threat Defense", "Behavioral detection stops unknown threats before they execute."],
|
|
193
|
+
["Scam Copilot", "AI-powered scam detection and prevention across chat, email and the web."],
|
|
194
|
+
["Multi-Layer Ransomware Protection", "Protects your files from unauthorized encryption and rolls back changes."],
|
|
195
|
+
["Anti-Phishing", "Blocks pages that pose as trustworthy in order to steal your data."],
|
|
196
|
+
["Web Attack Prevention", "Filters all web traffic and blocks malicious content before it loads."]
|
|
197
|
+
];
|
|
198
|
+
const privacyWindows = [
|
|
199
|
+
["Unlimited VPN Traffic", "Encrypt your connection and stay private online across all your devices."],
|
|
200
|
+
["Password Manager", "Store and autofill passwords securely, with one master password."],
|
|
201
|
+
["Anti-tracker", "Block trackers and keep your browsing activity private."],
|
|
202
|
+
["Webcam Protection", "Prevent unauthorized access to your webcam."],
|
|
203
|
+
["Microphone Monitor", "Alerts you when apps try to access your microphone."],
|
|
204
|
+
["Privacy Firewall", "Advanced firewall protection for your network."]
|
|
205
|
+
];
|
|
206
|
+
const identityAll = [
|
|
207
|
+
["Continuous Dark Web & Surface Monitoring", "Get instant alerts if your data appears on the dark web."],
|
|
208
|
+
["Digital Footprint Visualization", "See and reduce your digital exposure online."],
|
|
209
|
+
["Identity Protection Score", "Understand your identity risk at a glance."],
|
|
210
|
+
["Real-Time Breach Notifications", "Be first to know when your accounts are compromised."],
|
|
211
|
+
["Credit Report Monitoring", "Track changes to your credit report in real time."],
|
|
212
|
+
["Identity Theft Insurance — Up to $2 million", "Coverage for eligible losses and expenses related to identity theft."]
|
|
213
|
+
];
|
|
214
|
+
const protectionMac = [
|
|
215
|
+
["Real-Time Protection", "Continuous protection against all Mac and cross-platform threats.", "NEW"],
|
|
216
|
+
["Ransomware Remediation", "Backs up your files and restores them after an attack."],
|
|
217
|
+
["Scam Copilot", "AI-powered scam detection and prevention."],
|
|
218
|
+
["Adware Blocker", "Removes adware and unwanted software."]
|
|
219
|
+
];
|
|
220
|
+
const privacyMac = [
|
|
221
|
+
["Unlimited VPN Traffic", "Encrypt your connection and stay private online."],
|
|
222
|
+
["Password Manager", "Store and autofill passwords securely."],
|
|
223
|
+
["Anti-tracker", "Block trackers and keep your browsing private."]
|
|
224
|
+
];
|
|
225
|
+
const protectionMobile = [
|
|
226
|
+
["Malware Scanner", "Scans every app you install and flags the ones you should not trust.", "NEW"],
|
|
227
|
+
["Scam Alert", "Monitors links in SMS, notifications and chats for scams."],
|
|
228
|
+
["Web Protection", "Blocks dangerous pages before they load."]
|
|
229
|
+
];
|
|
230
|
+
const privacyMobile = [
|
|
231
|
+
["Unlimited VPN Traffic", "Encrypt your connection on any network."],
|
|
232
|
+
["Password Manager", "Autofill on the go, with one master password."],
|
|
233
|
+
["Account Privacy", "Find out if your email address has leaked."]
|
|
234
|
+
];
|
|
235
|
+
|
|
236
|
+
// ─── The page ────────────────────────────────────────────────────────────────
|
|
237
|
+
|
|
238
|
+
export const Landing = {
|
|
239
|
+
name : "Ultimate Security",
|
|
240
|
+
render: () => html`
|
|
241
|
+
<bd-header
|
|
242
|
+
title="Bitdefender Ultimate Security"
|
|
243
|
+
subtitle="Complete Security, Enhanced Privacy, and Identity Protection"
|
|
244
|
+
description="All-in-one plan to provide personalized digital safety. Incorporates AI-powered scams & device protection, secure password management, unlimited VPN traffic & online identity protection for individuals and families."
|
|
245
|
+
product-id="vsb"
|
|
246
|
+
devices="5"
|
|
247
|
+
subscription="1"
|
|
248
|
+
>
|
|
249
|
+
<bd-img slot="header-picture" src="/assets/bd-header-us.jpg" alt="A person relaxing at a laptop, protected" loading="eager" width="750" height="500" fit="cover"></bd-img>
|
|
250
|
+
<span slot="disclaimer-top">
|
|
251
|
+
Protection for 1 account & 5 PCs, Macs, tablets, or smartphones.
|
|
252
|
+
Windows® | macOS® | Android™ | iOS®
|
|
253
|
+
</span>
|
|
254
|
+
<span slot="disclaimer-bottom-text-start">First year price. Sales tax included. See</span>
|
|
255
|
+
<a slot="disclaimer-bottom-link" href="#section-terms">Terms of Use</a>
|
|
256
|
+
<span slot="disclaimer-bottom-text-end"> below.</span>
|
|
257
|
+
</bd-header>
|
|
258
|
+
|
|
259
|
+
<bd-anchor-nav cta-label="Buy now" cta-href="#section-pricing">
|
|
260
|
+
<bd-anchor-nav-item title="Overview" href="#section-overview"></bd-anchor-nav-item>
|
|
261
|
+
<bd-anchor-nav-item title="Plans" href="#section-pricing"></bd-anchor-nav-item>
|
|
262
|
+
<bd-anchor-nav-item title="Scam Copilot" href="#section-scam-copilot"></bd-anchor-nav-item>
|
|
263
|
+
<bd-anchor-nav-item title="Features" href="#section-platforms"></bd-anchor-nav-item>
|
|
264
|
+
<bd-anchor-nav-item title="FAQ" href="#section-faq"></bd-anchor-nav-item>
|
|
265
|
+
</bd-anchor-nav>
|
|
266
|
+
|
|
267
|
+
<!-- Four pillars -->
|
|
268
|
+
<bd-highlight id="section-overview" sub-title="Let's Secure Your Digital Life" highlight-text="next generation of digital security">
|
|
269
|
+
Introducing the next generation of digital security: your personalized shield for a worry-free online experience.
|
|
270
|
+
</bd-highlight>
|
|
271
|
+
<bd-light-carousel-section variant="simple">
|
|
272
|
+
<bd-light-carousel-item variant="simple" title="AI-Powered protection" icon="/assets/device_protection.png">
|
|
273
|
+
<bd-p variant="small">Protect all your devices from malware, ransomware, and disruptions on interruptions ease.</bd-p>
|
|
274
|
+
</bd-light-carousel-item>
|
|
275
|
+
<bd-light-carousel-item variant="simple" title="Privacy Protection" icon="/assets/privacy_protection.png">
|
|
276
|
+
<bd-p variant="small">Browse and stream privately with VPN and anti-tracking tools that keep your identity safe and secure.</bd-p>
|
|
277
|
+
</bd-light-carousel-item>
|
|
278
|
+
<bd-light-carousel-item variant="simple" title="Identity Protection" icon="/assets/identity_protection.png">
|
|
279
|
+
<bd-p variant="small">Get real-time alerts if your data leaks online and stop identity theft early with 24/7 monitoring tools.</bd-p>
|
|
280
|
+
</bd-light-carousel-item>
|
|
281
|
+
<bd-light-carousel-item variant="simple" title="Financial Insurance" icon="/assets/financial_insurance.png">
|
|
282
|
+
<bd-p variant="small">Get peace of mind with fraud protection and identity recovery coverage, up to $2 million included.</bd-p>
|
|
283
|
+
</bd-light-carousel-item>
|
|
284
|
+
</bd-light-carousel-section>
|
|
285
|
+
|
|
286
|
+
<!-- Plans -->
|
|
287
|
+
<bd-highlight highlight-text="digital life">
|
|
288
|
+
Live your digital life confidently with award-winning online protection
|
|
289
|
+
</bd-highlight>
|
|
290
|
+
<bd-pricing-container id="section-pricing"></bd-pricing-container>
|
|
291
|
+
|
|
292
|
+
<!-- Scam Copilot -->
|
|
293
|
+
<bd-highlight id="section-scam-copilot" sub-title="Introducing Bitdefender Scam Copilot">
|
|
294
|
+
Our AI-powered platform that detects and fights scams. In real time.
|
|
295
|
+
</bd-highlight>
|
|
296
|
+
<bd-card-features-section>
|
|
297
|
+
${scamCopilot.map((item) => html`
|
|
298
|
+
<bd-card-features-item title="${item.title}" badge="${item.badge}" badge-variant="${item.variant}">
|
|
299
|
+
${icon(item.icon)}
|
|
300
|
+
<bd-p>${item.text}</bd-p>
|
|
301
|
+
</bd-card-features-item>
|
|
302
|
+
`)}
|
|
303
|
+
</bd-card-features-section>
|
|
304
|
+
|
|
305
|
+
<!-- Awards -->
|
|
306
|
+
<bd-awards-flex
|
|
307
|
+
background="tint"
|
|
308
|
+
layout="grid"
|
|
309
|
+
headline="Award-winning security software you can trust. Always."
|
|
310
|
+
subtext="We've added 25 new accolades in the past two years to the hundreds we have won since we started in 2001 – so you know you are in good hands."
|
|
311
|
+
.badges=${awardBadges}
|
|
312
|
+
></bd-awards-flex>
|
|
313
|
+
|
|
314
|
+
<!-- Comparison -->
|
|
315
|
+
<bd-compare-section title="Bitdefender's comparison with other cybersecurity brands" gap="32px">
|
|
316
|
+
<compare-card
|
|
317
|
+
title="Best Protection"
|
|
318
|
+
description="Best Protection against e-Threats (On a scale of 0 to 6, with 6 as the highest level of protection)"
|
|
319
|
+
footnote="Overall Score. July 2011 – February 2025. Source AV-TEST.org"
|
|
320
|
+
footnote-href="${AV_TEST_URL}"
|
|
321
|
+
icon-src="/assets/shield-check.svg"
|
|
322
|
+
bar-stretch="false"
|
|
323
|
+
>
|
|
324
|
+
<compare-bar label="Bitdefender" score="5.98" max-score="6" variant="primary"></compare-bar>
|
|
325
|
+
<compare-bar label="Norton" score="5.89" max-score="6" variant="secondary" scale="0.73"></compare-bar>
|
|
326
|
+
<compare-bar label="McAfee" score="5.53" max-score="6" variant="secondary" scale="0.47"></compare-bar>
|
|
327
|
+
</compare-card>
|
|
328
|
+
<compare-card
|
|
329
|
+
title="Best Performance"
|
|
330
|
+
description="Lightest Impact on Performance (On a scale of 0 to 6, with 6 as the lightest level of impact)"
|
|
331
|
+
footnote="Overall Score. February 2013 – February 2025. Source AV-TEST.org"
|
|
332
|
+
footnote-href="${AV_TEST_URL}"
|
|
333
|
+
icon-src="/assets/speedometer.svg"
|
|
334
|
+
bar-stretch="false"
|
|
335
|
+
>
|
|
336
|
+
<compare-bar label="Bitdefender" score="5.86" max-score="6" variant="primary"></compare-bar>
|
|
337
|
+
<compare-bar label="Norton" score="5.69" max-score="6" variant="secondary" scale="0.73"></compare-bar>
|
|
338
|
+
<compare-bar label="McAfee" score="5.53" max-score="6" variant="secondary" scale="0.47"></compare-bar>
|
|
339
|
+
</compare-card>
|
|
340
|
+
</bd-compare-section>
|
|
341
|
+
|
|
342
|
+
<!-- Family -->
|
|
343
|
+
<bd-tabs
|
|
344
|
+
title="Customized Online Protection for Each Family Member – Smart, Private & Safe"
|
|
345
|
+
highlight-text="Family Member"
|
|
346
|
+
subtitle="Your family is unique and so should be your online security. Our family protection plan adapts to each member's needs, offering the ideal mix of privacy, freedom, and safety."
|
|
347
|
+
>
|
|
348
|
+
${familyPanel("Admin", "Keep your loved ones protected.", "As the Subscription Manager, you can oversee and adjust online safety through an intuitive dashboard. Effortlessly manage settings, monitor real-time alerts, and maintain control without compromising simplicity or security.", "/assets/tabs-img1.png", false)}
|
|
349
|
+
${familyPanel("Adult", "Privacy that travels with you.", "Unlimited VPN, a password manager and anti-tracker keep every adult's browsing, banking and shopping private, on every device they own.", "/assets/tabs-img2.png", true)}
|
|
350
|
+
${familyPanel("Teen", "Freedom, with a safety net.", "Scam Copilot watches chats, SMS and social feeds for the tricks aimed at teenagers, and says so without reading their messages.", "/assets/tabs-img3.png", false)}
|
|
351
|
+
${familyPanel("Child", "A gentler internet.", "Screen-time schedules, content filters and location alerts, set once and adjusted from your own phone as your child grows.", "/assets/tabs-img1.png", true)}
|
|
352
|
+
</bd-tabs>
|
|
353
|
+
|
|
354
|
+
<!-- Platforms -->
|
|
355
|
+
<bd-tabs
|
|
356
|
+
id="section-platforms"
|
|
357
|
+
bg-blue
|
|
358
|
+
title="The Ultimate Protection and Privacy for all platforms. Bitdefender Premium VPN, Password Manager and Identity Protection included."
|
|
359
|
+
subtitle="Your digital safety is our top priority, always and everywhere. These comprehensive suites safeguard your digital life by seamlessly combining the ultimate award-winning device security with protection against identity theft and privacy intrusions, plus credit protection."
|
|
360
|
+
>
|
|
361
|
+
${platformPanel("Windows", protectionWindows, privacyWindows, identityAll)}
|
|
362
|
+
${platformPanel("macOS", protectionMac, privacyMac, identityAll)}
|
|
363
|
+
${platformPanel("iOS", protectionMobile, privacyMobile, identityAll)}
|
|
364
|
+
${platformPanel("Android", protectionMobile, privacyMobile, identityAll)}
|
|
365
|
+
</bd-tabs>
|
|
366
|
+
|
|
367
|
+
<!-- FAQ -->
|
|
368
|
+
<bd-accordion-bg id="section-faq" title="Questions? Answers.">
|
|
369
|
+
<bd-accordion-bg-item title="How does Scam Copilot work?">
|
|
370
|
+
<bd-p variant="small">Scam Copilot is an AI-powered platform that watches the places scams arrive — email, SMS, chat apps, notifications, calendar invites and the web — and warns you before you act on one.</bd-p>
|
|
371
|
+
</bd-accordion-bg-item>
|
|
372
|
+
<bd-accordion-bg-item title="How does Bitdefender collect and use my personal information?">
|
|
373
|
+
<bd-p variant="small">We respect and value the privacy of everyone who visits our website. We only collect and use your personal data in accordance with our Privacy Policy, and only to the extent necessary to provide the products and services you request.</bd-p>
|
|
374
|
+
<bd-list type="unordered" spacing="md" variant="default" orientation="vertical">
|
|
375
|
+
<bd-li variant="bullet" size="md"><bd-p variant="small">Threat telemetry is anonymized before it leaves your device</bd-p></bd-li>
|
|
376
|
+
<bd-li variant="bullet" size="md"><bd-p variant="small">Scam Copilot never reads the content of your private messages</bd-p></bd-li>
|
|
377
|
+
<bd-li variant="bullet" size="md"><bd-p variant="small">You can review and delete your data from Bitdefender Central at any time</bd-p></bd-li>
|
|
378
|
+
</bd-list>
|
|
379
|
+
</bd-accordion-bg-item>
|
|
380
|
+
<bd-accordion-bg-item title="How can I avoid falling for scams?">
|
|
381
|
+
<bd-p variant="small">Slow down, verify the sender through a channel you already trust, and never act on urgency. Scam Copilot does this check for you, in real time, wherever the message arrives.</bd-p>
|
|
382
|
+
</bd-accordion-bg-item>
|
|
383
|
+
<bd-accordion-bg-item title="Where can I send feedback about my experience with Scam Copilot?">
|
|
384
|
+
<bd-p variant="small">Every Scam Copilot verdict has a feedback control. Tell us when it was right and when it was not; that is how the model gets better for everyone.</bd-p>
|
|
385
|
+
</bd-accordion-bg-item>
|
|
386
|
+
</bd-accordion-bg>
|
|
387
|
+
|
|
388
|
+
<!-- System requirements, terms, notes -->
|
|
389
|
+
<bd-accordion-section title="System Requirements" guide-icon="/assets/user_guide.png" guide-label="User guide" guide-href="#">
|
|
390
|
+
<bd-accordion-item title="Bitdefender Ultimate Security" open>
|
|
391
|
+
<bd-p variant="small"><strong>Windows™ Operating Systems</strong><br />Microsoft Windows 10 (all versions) or later.</bd-p>
|
|
392
|
+
<bd-p variant="small"><strong>Mac® Operating Systems</strong><br />macOS Big Sur (11) or later.</bd-p>
|
|
393
|
+
<bd-p variant="small"><strong>Android™ Operating Systems</strong><br />Android 8.0 or later.</bd-p>
|
|
394
|
+
<bd-p variant="small"><strong>iOS Operating Systems</strong><br />iOS 15 or later.</bd-p>
|
|
395
|
+
</bd-accordion-item>
|
|
396
|
+
<bd-accordion-item title="Bitdefender Central">
|
|
397
|
+
<bd-p variant="small">A modern browser and a Bitdefender account. Bitdefender Central is where devices, subscriptions and family members are managed.</bd-p>
|
|
398
|
+
</bd-accordion-item>
|
|
399
|
+
</bd-accordion-section>
|
|
400
|
+
|
|
401
|
+
<bd-terms-section id="section-terms"></bd-terms-section>
|
|
402
|
+
|
|
403
|
+
<bd-accordion-section title="Please Note!">
|
|
404
|
+
<bd-p variant="small">
|
|
405
|
+
1. And local email clients on Windows<br />
|
|
406
|
+
2. Windows only<br />
|
|
407
|
+
3. Android and iOS only<br />
|
|
408
|
+
4. Android only<br />
|
|
409
|
+
5. iOS only
|
|
410
|
+
</bd-p>
|
|
411
|
+
</bd-accordion-section>
|
|
412
|
+
|
|
413
|
+
<bd-footer-lp>
|
|
414
|
+
<bd-footer-nav slot="secondary-nav">
|
|
415
|
+
<a href="/legal/">Legal Information</a>
|
|
416
|
+
<bd-divider-vertical color="inverse" height="18"></bd-divider-vertical>
|
|
417
|
+
<a href="/site/view/legal-privacy-policy-for-bitdefender-websites/">Privacy Policy</a>
|
|
418
|
+
<bd-divider-vertical color="inverse" height="18"></bd-divider-vertical>
|
|
419
|
+
<a href="/sitemap/">Site Map</a>
|
|
420
|
+
<bd-divider-vertical color="inverse" height="18"></bd-divider-vertical>
|
|
421
|
+
<a href="/company/">Company</a>
|
|
422
|
+
<bd-divider-vertical color="inverse" height="18"></bd-divider-vertical>
|
|
423
|
+
<a href="https://www.bitdefender.com/consumer/support/">Contact Us</a>
|
|
424
|
+
<bd-divider-vertical color="inverse" height="18"></bd-divider-vertical>
|
|
425
|
+
<a href="#">Privacy Settings</a>
|
|
426
|
+
<bd-divider-vertical color="inverse" height="18"></bd-divider-vertical>
|
|
427
|
+
<a href="#" class="impressum-link">Impressum</a>
|
|
428
|
+
</bd-footer-nav>
|
|
429
|
+
</bd-footer-lp>
|
|
430
|
+
`
|
|
431
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { css } from 'lit';
|
|
2
|
+
|
|
3
|
+
/** Styled entirely from design tokens — see npm run lint:tokens. */
|
|
4
|
+
export const videoCSS = css`
|
|
5
|
+
:host { display: block; }
|
|
6
|
+
|
|
7
|
+
video {
|
|
8
|
+
display: block;
|
|
9
|
+
width: 100%;
|
|
10
|
+
height: auto;
|
|
11
|
+
border-radius: var(--radius-lg);
|
|
12
|
+
/* the frame around media, dark in every theme (dark mode decision 15) */
|
|
13
|
+
background: var(--color-surface-media);
|
|
14
|
+
}
|
|
15
|
+
`;
|
|
16
|
+
|
|
17
|
+
export default videoCSS;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { LitElement, html, nothing } from 'lit';
|
|
2
|
+
// Installs the design tokens into document scope; see src/tokens/tokens.js
|
|
3
|
+
import '../../tokens/tokens.js';
|
|
4
|
+
import { videoCSS } from './video.css.js';
|
|
5
|
+
|
|
6
|
+
export class BdVideo extends LitElement {
|
|
7
|
+
static styles = [videoCSS];
|
|
8
|
+
|
|
9
|
+
static properties = {
|
|
10
|
+
src : { type: String },
|
|
11
|
+
poster : { type: String },
|
|
12
|
+
controls: { type: Boolean },
|
|
13
|
+
muted : { type: Boolean },
|
|
14
|
+
loop : { type: Boolean }
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
constructor() {
|
|
18
|
+
super();
|
|
19
|
+
this.src = '';
|
|
20
|
+
this.poster = '';
|
|
21
|
+
this.controls = true;
|
|
22
|
+
this.muted = false;
|
|
23
|
+
this.loop = false;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
render() {
|
|
27
|
+
return html`
|
|
28
|
+
<video
|
|
29
|
+
src=${this.src || nothing}
|
|
30
|
+
poster=${this.poster || nothing}
|
|
31
|
+
?controls=${this.controls}
|
|
32
|
+
?muted=${this.muted}
|
|
33
|
+
?loop=${this.loop}
|
|
34
|
+
playsinline
|
|
35
|
+
><slot></slot></video>
|
|
36
|
+
`;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
customElements.define('bd-video', BdVideo);
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { html } from 'lit';
|
|
2
|
+
import './video.js';
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
title : 'Atoms/Video',
|
|
6
|
+
tags : ['autodocs'],
|
|
7
|
+
parameters: {
|
|
8
|
+
docs: {
|
|
9
|
+
description: {
|
|
10
|
+
component: `
|
|
11
|
+
**BdVideo** wraps a native \`<video>\` with the system's framing.
|
|
12
|
+
|
|
13
|
+
### Usage
|
|
14
|
+
\`\`\`html
|
|
15
|
+
<bd-video src="/media/overview.mp4" poster="/images/overview.jpg"></bd-video>
|
|
16
|
+
<bd-video src="/media/loop.mp4" muted loop></bd-video>
|
|
17
|
+
|
|
18
|
+
<bd-video src="/media/overview.mp4">
|
|
19
|
+
<track kind="captions" src="/media/overview.en.vtt" srclang="en" label="English" default>
|
|
20
|
+
</bd-video>
|
|
21
|
+
\`\`\`
|
|
22
|
+
|
|
23
|
+
### Props
|
|
24
|
+
| Prop | Values | Default |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| \`src\` | video URL | \`''\` |
|
|
27
|
+
| \`poster\` | still shown before playback | \`''\` |
|
|
28
|
+
| \`controls\` | boolean, native controls | \`true\` |
|
|
29
|
+
| \`muted\` | boolean | \`false\` |
|
|
30
|
+
| \`loop\` | boolean | \`false\` |
|
|
31
|
+
|
|
32
|
+
### Captions go in the slot
|
|
33
|
+
Anything slotted is passed through into the \`<video>\`, which is how you supply
|
|
34
|
+
\`<track>\` elements. **Recorded video needs captions** — WCAG 1.2.2 at level A —
|
|
35
|
+
and this element does nothing to add them for you.
|
|
36
|
+
|
|
37
|
+
### Notes
|
|
38
|
+
\`playsinline\` is always set, so iOS plays in place instead of taking over the
|
|
39
|
+
screen.
|
|
40
|
+
|
|
41
|
+
\`controls\` defaults to \`true\` on purpose: a video a user cannot pause is a
|
|
42
|
+
2.2.2 failure the moment it plays for more than five seconds. If you turn
|
|
43
|
+
controls off, the video must also be \`muted\` and \`loop\` and behave as
|
|
44
|
+
decoration.
|
|
45
|
+
|
|
46
|
+
There is no \`autoplay\` prop, deliberately — autoplay with sound is both
|
|
47
|
+
disruptive and blocked by most browsers anyway.
|
|
48
|
+
`
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
argTypes: {
|
|
53
|
+
src: {
|
|
54
|
+
control : 'text',
|
|
55
|
+
description: 'Video URL.',
|
|
56
|
+
table : { type: { summary: 'string' }, defaultValue: { summary: "" }, category: 'Content' }
|
|
57
|
+
},
|
|
58
|
+
poster: {
|
|
59
|
+
control : 'text',
|
|
60
|
+
description: 'Still frame shown before playback.',
|
|
61
|
+
table : { type: { summary: 'string' }, defaultValue: { summary: "" }, category: 'Content' }
|
|
62
|
+
},
|
|
63
|
+
controls: {
|
|
64
|
+
control : 'boolean',
|
|
65
|
+
description: 'Native playback controls. Turning them off risks a WCAG 2.2.2 failure.',
|
|
66
|
+
table : { type: { summary: 'boolean' }, defaultValue: { summary: "true" }, category: 'Playback' }
|
|
67
|
+
},
|
|
68
|
+
muted: {
|
|
69
|
+
control : 'boolean',
|
|
70
|
+
description: 'Start muted.',
|
|
71
|
+
table : { type: { summary: 'boolean' }, defaultValue: { summary: "false" }, category: 'Playback' }
|
|
72
|
+
},
|
|
73
|
+
loop: {
|
|
74
|
+
control : 'boolean',
|
|
75
|
+
description: 'Repeat on end.',
|
|
76
|
+
table : { type: { summary: 'boolean' }, defaultValue: { summary: "false" }, category: 'Playback' }
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export const Default = () => html`
|
|
82
|
+
<bd-video poster="/images/bd-header-img.jpg"></bd-video>
|
|
83
|
+
`;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Controls off is only safe when the video is decoration — so it comes with
|
|
87
|
+
* `muted` and `loop`, which is the pairing WCAG 2.2.2 asks for. Rendered here
|
|
88
|
+
* so the no-chrome shape is snapshotted alongside the default one; the
|
|
89
|
+
* `--radius-lg` corner and the `--color-neutral-900` poster ground are the
|
|
90
|
+
* whole of this atom's styling and are easiest to see without controls over
|
|
91
|
+
* them.
|
|
92
|
+
*/
|
|
93
|
+
export const Decorative = () => html`
|
|
94
|
+
<bd-video poster="/images/bd-header-img.jpg" ?controls=${false} muted loop></bd-video>
|
|
95
|
+
`;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* With no `poster` and no `src` the element is just its own background. Kept
|
|
99
|
+
* because that is what a consumer sees before the media resolves, and it is
|
|
100
|
+
* the only view of the poster ground on its own.
|
|
101
|
+
*/
|
|
102
|
+
export const Empty = () => html`
|
|
103
|
+
<div style="max-width: 32rem">
|
|
104
|
+
<bd-video></bd-video>
|
|
105
|
+
</div>
|
|
106
|
+
`;
|