@repobit/dex-system-design 0.24.18 → 0.24.20

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.
Files changed (29) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/package.json +4 -4
  3. package/src/components/ai-guardian-demo.stories.js +454 -33
  4. package/src/components/bento-grid/bento-grid.css.js +12 -1
  5. package/src/components/bento-grid/bento-grid.js +59 -1
  6. package/src/components/bento-grid/bento-grid.stories.js +45 -0
  7. package/src/components/cards/card.css.js +56 -0
  8. package/src/components/cards/card.js +64 -11
  9. package/src/components/cards/card.stories.js +65 -2
  10. package/src/components/comparison-panel/comparison-panel.css.js +52 -1
  11. package/src/components/comparison-panel/comparison-panel.js +6 -1
  12. package/src/components/compatibility-table/compatibility-table.css.js +29 -13
  13. package/src/components/compatibility-table/compatibility-table.js +13 -7
  14. package/src/components/cta-banner/cta-banner.css.js +11 -0
  15. package/src/components/cta-banner/cta-banner.js +7 -0
  16. package/src/components/footer/footer-lp.css.js +10 -21
  17. package/src/components/footer/footer-lp.js +3 -18
  18. package/src/components/footer/footer-nav-menu.css.js +0 -2
  19. package/src/components/footer/footer.css.js +18 -35
  20. package/src/components/footer/footer.js +5 -1
  21. package/src/components/header/header-code.css.js +208 -10
  22. package/src/components/header/header-code.js +148 -5
  23. package/src/components/header/header-code.stories.js +83 -27
  24. package/src/components/page-switcher/page-switcher.js +1 -1
  25. package/src/components/paragraph/paragraph.js +6 -0
  26. package/src/components/quick-answer/quick-answer.css.js +2 -0
  27. package/src/components/quick-answer/quick-answer.js +1 -1
  28. package/src/components/terminal/terminal-message.css.js +153 -13
  29. package/src/components/terminal/terminal-message.js +37 -11
package/CHANGELOG.md CHANGED
@@ -3,6 +3,20 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [0.24.20](https://github.com/bitdefender/dex-core/compare/@repobit/dex-system-design@0.24.19...@repobit/dex-system-design@0.24.20) (2026-09-24)
7
+
8
+ ### Bug Fixes
9
+
10
+ * **DEX-1014:** new adjustments for Card component
11
+
12
+
13
+ ## [0.24.19](https://github.com/bitdefender/dex-core/compare/@repobit/dex-system-design@0.24.18...@repobit/dex-system-design@0.24.19) (2026-09-23)
14
+
15
+ ### Bug Fixes
16
+
17
+ * **DEX-1014:** adjustments for AI Bitdefender
18
+
19
+
6
20
  ## [0.24.18](https://github.com/bitdefender/dex-core/compare/@repobit/dex-system-design@0.24.17...@repobit/dex-system-design@0.24.18) (2026-09-23)
7
21
 
8
22
  **Note:** Version bump only for package @repobit/dex-system-design
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@repobit/dex-system-design",
3
- "version": "0.24.18",
3
+ "version": "0.24.20",
4
4
  "description": "Design system based on Web Components.",
5
5
  "author": "Iordache Matei Cezar <miordache@bitdefender.com>",
6
6
  "homepage": "https://github.com/bitdefender/dex-core#readme",
@@ -76,8 +76,8 @@
76
76
  "url": "https://github.com/bitdefender/dex-core/issues"
77
77
  },
78
78
  "dependencies": {
79
- "@repobit/dex-store": "1.6.34",
80
- "@repobit/dex-store-elements": "2.1.4",
79
+ "@repobit/dex-store": "1.6.36",
80
+ "@repobit/dex-store-elements": "2.1.6",
81
81
  "lit": "^3.3.2"
82
82
  },
83
83
  "devDependencies": {
@@ -94,5 +94,5 @@
94
94
  "volta": {
95
95
  "node": "24.14.0"
96
96
  },
97
- "gitHead": "a4dee375b21a421ee8d7c7afae913250def584c6"
97
+ "gitHead": "c5b184f2837dad5acab88a931b12d3d51121ed57"
98
98
  }
@@ -1,4 +1,4 @@
1
- import { LitElement, html } from "lit";
1
+ import { LitElement, html, nothing } from "lit";
2
2
  import "./accordion/accordion-bg.js";
3
3
  import "./accordion/accordion.js";
4
4
  import "./agent-endpoints/agent-endpoints.js";
@@ -576,7 +576,7 @@ function skillScannerBody() {
576
576
 
577
577
  <section id="anchor-3-section">
578
578
  <div style="padding: 24px 24px 48px;">
579
- <bd-p kind="normal" style="color: var(--color-blue-500); font-weight: 600; margin: 0 0 8px;>Detection coverage</bd-p>
579
+ <bd-p kind="normal" style="color: var(--color-blue-500); font-weight: 600; margin: 0 0 8px;">Detection coverage</bd-p>
580
580
  <bd-h as="h2" font-weight="700" style="margin: 0 0 8px;">What it detects</bd-h>
581
581
  <bd-p kind="regular" style="color: var(--color-neutral-700); margin: 0 0 24px; max-width: 72ch">
582
582
  Agent Skill Scanner runs 71 behavioural detectors across 16 threat categories, including code execution, obfuscation, reverse shells, crypto-mining, persistence, time bombs and stealth natural-language directives. It also extracts 18 indicator types from every text file: URLs, IPs, base64 blobs, dangerous shell commands, secret env-var names and invisible Unicode characters among them.
@@ -620,11 +620,6 @@ function skillScannerBody() {
620
620
  <bd-bento-grid
621
621
  title="How it works"
622
622
  >
623
- <!--
624
- Iconițele exacte din poză (stive/layers, scut+lupă, eprubetă,
625
- ceas, lacăt deschis, lupă+insectă) nu există în setul curent de
626
- iconițe -- am ales cele mai apropiate semantic ca placeholder.
627
- -->
628
623
  <bd-bento-item title="Layered analysis" tone="tint">
629
624
  <bd-analysis-icon slot="icon" width="32" height="32" color="#006DFF"></bd-analysis-icon>
630
625
  <bd-p color="var(--color-neutral-600)">Local indicator extraction feeds a server-side LLM that produces the report: a risk level, a plain-language summary, and per-file findings. Enough to decide, without wading through raw indicators.</bd-p>
@@ -883,15 +878,433 @@ function skillScannerBody() {
883
878
  </div>
884
879
  </bd-agent-endpoints>
885
880
  </section>
886
-
887
- <!--
888
- TODO: daca mai exista sectiuni sub asta pentru Skill Scanner,
889
- se adauga cand vine continutul.
890
- -->
891
881
  `;
892
882
  }
893
883
 
884
+ function vpnBody() {
885
+ return html`
886
+ <bd-header-code
887
+ variant="tint"
888
+ eyebrow="Privacy for autonomous AI agents"
889
+ title="Bitdefender VPN for AI Agents"
890
+ description="Each prompt gets a fresh, disposable container scoped to a specific location, so your agent's traffic isn't tied to your home connection or your personal IP."
891
+ meta-spec="macOS 13+ · Apple silicon (M1 or later) · 31 MB"
892
+ .metaFacts=${[
893
+ { label: "PLATFORM", value: "macOS" },
894
+ { label: "STATUS", value: "External beta" },
895
+ { label: "PRICE", value: "Free during beta" },
896
+ { label: "MADE BY", value: "Bitdefender" },
897
+ { label: "WINDOWS", value: "To follow" }
898
+ ]}
899
+ >
900
+ <span slot="breadcrumb">Bitdefender AI</span>
901
+ <span slot="breadcrumb">vpn-for-agents</span>
902
+
903
+ <bd-button-link
904
+ slot="primary-button"
905
+ label="Download for macOS"
906
+ kind="primary"
907
+ size="md"
908
+ font-size="18px"
909
+ font-weight="600"
910
+ >Download for macOS</bd-button-link>
911
+
912
+ <bd-button-link
913
+ slot="secondary-button"
914
+ label="See how it works"
915
+ kind="primary-outline"
916
+ size="md"
917
+ font-size="18px"
918
+ font-weight="600"
919
+ >See how it works</bd-button-link>
920
+
921
+ <span slot="badge">EXTERNAL BETA</span>
922
+
923
+ <span
924
+ slot="annotation-top"
925
+ style="display: inline-flex; align-items: center; background: var(--color-blue-50, #eaf2ff); border: 1px solid var(--color-blue-200, #bcd7ff); color: var(--color-blue-600, #1d5fd6); font-family: var(--typography-fontFamily-mono, monospace); font-size: 12px; font-weight: 600; padding: 6px 14px; border-radius: 999px; white-space: nowrap;"
926
+ >exit: frankfurt · server IP</span>
927
+
928
+ <span
929
+ slot="annotation-bottom"
930
+ style="display: inline-flex; align-items: center; background: var(--color-green-50, #e9faf0); border: 1px solid var(--color-green-200, #b7ecc9); color: var(--color-green-700, #1b7f42); font-family: var(--typography-fontFamily-mono, monospace); font-size: 12px; font-weight: 600; padding: 6px 14px; border-radius: 999px; white-space: nowrap;"
931
+ >tunnel closed — session cleared</span>
932
+
933
+ <bd-terminal-message
934
+ slot="terminal-content"
935
+ show-titlebar
936
+ variant="flush"
937
+ caption="// illustrative — every connection closes when the prompt ends"
938
+ .lines=${[
939
+ { type: "title", text: "VPN for AI Agents · connection log", live: true },
940
+ { type: "row", label: "MCP", text: "vpn_connect(location: frankfurt)", badge: "Open", badgeColor: "green" },
941
+ { type: "row", label: "REQUEST", text: "agent reaches insurer-compare.com", badge: "Server IP", badgeColor: "green" },
942
+ { type: "row", label: "NETWORK", text: "hotel Wi-Fi, unencrypted", badge: "Protected", badgeColor: "green" },
943
+ { type: "row", label: "MCP", text: "vpn_safefetch(location: frankfurt, url: insurer-compare.com)", badge: "Scanned", badgeColor: "amber" },
944
+ { type: "row", label: "MCP", text: "vpn_disconnect(location: frankfurt) — prompt ends", badge: "Closed — session cleared", badgeColor: "neutral" }
945
+ ]}
946
+ ></bd-terminal-message>
947
+ </bd-header-code>
948
+
949
+ <section>
950
+ <div style="max-width: 1200px; margin: 0 auto;">
951
+ <bd-quick-answer
952
+ label="Quick answer"
953
+ text="Bitdefender VPN for AI Agents is a macOS VPN scoped to AI-agent traffic. Each prompt gets its own container, scoped to a specific location and destroyed when the prompt ends, so no cookies, cache, or session state carries over. It covers what Claude Desktop, Cursor, Codex, and OpenCode route through Bitdefender's MCP tools. Free with no traffic caps during beta, currently in external beta."
954
+ ></bd-quick-answer>
955
+ </div>
956
+ </section>
957
+
958
+ <div style="max-width: 1200px; margin: 0 auto;">
959
+ <bd-anchor-nav
960
+ aria-label="VPN for AI Agents sections"
961
+ sticky-top="65px"
962
+ .items=${[
963
+ { title: "Overview" },
964
+ { title: "Protection" },
965
+ { title: "Use cases" },
966
+ { title: "How it works" },
967
+ { title: "Requirements" },
968
+ { title: "Why trust it" },
969
+ { title: "FAQ" }
970
+ ]}
971
+ style="margin-bottom: 0;"
972
+ >
973
+ </bd-anchor-nav>
974
+
975
+ <section id="anchor-1-section" style="margin-top: 0; padding-top: 0;">
976
+ <div style="padding: 48px 24px 24px;">
977
+ <bd-overview
978
+ title="What is VPN for AI Agents?"
979
+ description="VPN for AI Agents routes what Claude Desktop, Cursor, Codex, and OpenCode send over the network through Bitdefender's VPN servers instead of yours. Each prompt opens its own connection, exits on the VPN server's IP, and disappears the moment the prompt ends. No cookies, cache, or session state carries over to the next prompt. Requests the agent makes with its own built-in tools, outside Bitdefender's MCP server, are not routed through the VPN."
980
+ .facts=${[
981
+ { label: "CATEGORY", value: "Agent privacy & networking" },
982
+ { label: "PLATFORM", value: "macOS (initial)" },
983
+ { label: "RUNS AS", value: "Broker + MCP server" },
984
+ { label: "AGENTS", value: "Claude Desktop, Cursor, Codex, OpenCode" },
985
+ { label: "MODEL", value: "Free during beta, no traffic caps" }
986
+ ]}
987
+ ></bd-overview>
988
+ </div>
989
+ </section>
990
+
991
+ <section id="anchor-2-section">
992
+ <div style="padding: 24px 24px 48px;">
993
+ <bd-bento-grid
994
+ variant="equal"
995
+ equal-columns="3"
996
+ background="tint"
997
+ eyebrow="Protection"
998
+ title="What does VPN for AI Agents protect against?"
999
+ description="Each protection is structural: every request the agent routes through Bitdefender's MCP tools gets it automatically, with no setting to remember."
1000
+ >
1001
+ <bd-bento-item>
1002
+ <span slot="icon" style="color: var(--color-blue-500, #006DFF); font-weight: 700; font-family: var(--typography-fontFamily-mono, monospace); font-size: 14px; letter-spacing: 0.05em;">01</span>
1003
+ <bd-h as="h5" fontWeight="700" style="margin: 0 0 8px;">IP masking</bd-h>
1004
+ <bd-p color="var(--color-neutral-600)">When your agent reaches a site, it sees the VPN server's exit IP. Not your home address or IP-based location.</bd-p>
1005
+ </bd-bento-item>
1006
+
1007
+ <bd-bento-item>
1008
+ <span slot="icon" style="color: var(--color-blue-500, #006DFF); font-weight: 700; font-family: var(--typography-fontFamily-mono, monospace); font-size: 14px; letter-spacing: 0.05em;">02</span>
1009
+ <bd-h as="h5" fontWeight="700" style="margin: 0 0 8px;">Per-prompt encryption</bd-h>
1010
+ <bd-p color="var(--color-neutral-600)">Every request opens its own encrypted tunnel from your device to Bitdefender, so whoever runs the Wi-Fi you're on can't read what the agent sends.</bd-p>
1011
+ </bd-bento-item>
1012
+
1013
+ <bd-bento-item>
1014
+ <span slot="icon" style="color: var(--color-blue-500, #006DFF); font-weight: 700; font-family: var(--typography-fontFamily-mono, monospace); font-size: 14px; letter-spacing: 0.05em;">03</span>
1015
+ <bd-h as="h5" fontWeight="700" style="margin: 0 0 8px;">Session isolation</bd-h>
1016
+ <bd-p color="var(--color-neutral-600)">Each tunnel closes the moment the prompt ends. If a site sees two of your agent's requests, it has no network-level way to tell they came from the same prompt.</bd-p>
1017
+ </bd-bento-item>
1018
+
1019
+ <bd-bento-item>
1020
+ <span slot="icon" style="color: var(--color-blue-500, #006DFF); font-weight: 700; font-family: var(--typography-fontFamily-mono, monospace); font-size: 14px; letter-spacing: 0.05em;">04</span>
1021
+ <bd-h as="h5" fontWeight="700" style="margin: 0 0 8px;">Clean-IP browsing</bd-h>
1022
+ <bd-p color="var(--color-neutral-600)">Every request exits on the VPN server's IP rather than the same home address every time, useful for QA and monitoring work that needs a neutral, non-residential vantage point.</bd-p>
1023
+ </bd-bento-item>
1024
+
1025
+ <bd-bento-item>
1026
+ <span slot="icon" style="color: var(--color-blue-500, #006DFF); font-weight: 700; font-family: var(--typography-fontFamily-mono, monospace); font-size: 14px; letter-spacing: 0.05em;">05</span>
1027
+ <bd-h as="h5" fontWeight="700" style="margin: 0 0 8px;">Regional routing</bd-h>
1028
+ <bd-p color="var(--color-neutral-600)">Need to see a page the way a visitor from a specific country would? Route that one request through a Bitdefender server there, just for that prompt.</bd-p>
1029
+ </bd-bento-item>
1030
+ </bd-bento-grid>
1031
+ </div>
1032
+ </section>
1033
+
1034
+ <section id="anchor-3-section">
1035
+ <div style="padding: 24px 24px 48px;">
1036
+ <bd-bento-grid
1037
+ variant="equal"
1038
+ equal-columns="3"
1039
+ eyebrow="Who it's for"
1040
+ title="Built for agents that act on your behalf"
1041
+ description="VPN for AI Agents is aimed at people running agents that reach the open web — for research, QA, or comparison tasks — and want the traffic to be private and encrypted, without changing how the agent works."
1042
+ >
1043
+ <bd-bento-item>
1044
+ <bd-h as="h5" font-weight="700" style="margin: 0 0 8px;">IP privacy toward the sites you reach</bd-h>
1045
+ <bd-p color="var(--color-neutral-600)">If your agent sends dozens of requests a day, none of them carry your home IP, which makes it harder for sites to correlate requests to a single household, whether it's a research task or a run of price comparisons across competitors.</bd-p>
1046
+ </bd-bento-item>
1047
+
1048
+ <bd-bento-item>
1049
+ <bd-h as="h5" font-weight="700" style="margin: 0 0 8px;">QA on geolocalized pages</bd-h>
1050
+ <bd-p color="var(--color-neutral-600)">Your team ships a pricing page with different content for five countries. Route the agent through the German exit and check that version renders the way a visitor there would actually see it.</bd-p>
1051
+ </bd-bento-item>
1052
+
1053
+ <bd-bento-item>
1054
+ <bd-h as="h5" font-weight="700" style="margin: 0 0 8px;">Agents on untrusted networks</bd-h>
1055
+ <bd-p color="var(--color-neutral-600)">You're running a research agent from a conference or a café. The tunnel encrypts what it sends, so whoever runs that Wi-Fi can't read it.</bd-p>
1056
+ </bd-bento-item>
1057
+ </bd-bento-grid>
1058
+
1059
+ <bd-p kind="regular" style="color: var(--color-neutral-500); font-style: italic; margin-top: 24px; max-width: 90ch;">
1060
+ VPN for AI Agents changes the network path a request takes, not the rules of the site it reaches. It isn't a workaround for anyone's terms of service — more on that below.
1061
+ </bd-p>
1062
+ </div>
1063
+
1064
+ <bd-comparison-panel
1065
+ variant="dark"
1066
+ title="What it is, and what it isn't"
1067
+ description="VPN for AI Agents secures the network path your agent's traffic takes. It is not a device-wide VPN, a content filter, or a way to hide what the agent is doing from the AI provider."
1068
+ positive-title="VPN for AI Agents is"
1069
+ negative-title="VPN for AI Agents is not"
1070
+ .positiveItems=${[
1071
+ "A VPN scoped to agent traffic only — Claude Desktop, Cursor, Codex, and OpenCode.",
1072
+ "A fresh, isolated container per prompt — not a persistent tunnel.",
1073
+ "IP masking for every request routed through it.",
1074
+ "Free during beta, and standalone.",
1075
+ "Built for macOS first."
1076
+ ]}
1077
+ .negativeItems=${[
1078
+ "A device-wide VPN — the browser and other apps are unaffected.",
1079
+ "A way to hide prompts from the AI provider — the model behind your agent still receives prompts and account identity as normal.",
1080
+ "A guarantee every request is protected — only traffic the agent sends through Bitdefender's MCP tools is covered.",
1081
+ "An always-on tunnel — it opens and closes with each prompt.",
1082
+ "A way to bypass a site's terms of service, rate limits, or an existing IP ban — those decisions belong to the destination site, not to Bitdefender."
1083
+ ]}
1084
+ ></bd-comparison-panel>
1085
+ </section>
1086
+ <section id="anchor-4-section">
1087
+ <div style="padding: 24px 24px 48px;">
1088
+ <bd-bento-grid
1089
+ variant="equal"
1090
+ equal-columns="3"
1091
+ eyebrow="How it works"
1092
+ title="Arrives quietly, protects automatically"
1093
+ description="Setup happens once. Protection happens every prompt, without the user thinking about it."
1094
+ >
1095
+ <bd-bento-item>
1096
+ <span slot="icon" style="color: var(--color-blue-500, #006DFF); font-weight: 700; font-family: var(--typography-fontFamily-mono, monospace); font-size: 14px; letter-spacing: 0.05em;">01</span>
1097
+ <bd-h as="h5" fontWeight="700" style="margin: 0 0 8px;">Install & sign in</bd-h>
1098
+ <bd-p color="var(--color-neutral-600)">Download the macOS installer and run it. VPN for AI Agents runs as a lightweight macOS component you install once, no separate app to manage. First run: choose which agents to protect, consent to telemetry, sign in once.</bd-p>
1099
+ </bd-bento-item>
1100
+
1101
+ <bd-bento-item>
1102
+ <span slot="icon" style="color: var(--color-blue-500, #006DFF); font-weight: 700; font-family: var(--typography-fontFamily-mono, monospace); font-size: 14px; letter-spacing: 0.05em;">02</span>
1103
+ <bd-h as="h5" fontWeight="700" style="margin: 0 0 8px;">Restart to activate</bd-h>
1104
+ <bd-p color="var(--color-neutral-600)">Claude Desktop, Cursor, Codex, or OpenCode restarts once to pick up the new MCP configuration. No files to edit, nothing else to configure.</bd-p>
1105
+ </bd-bento-item>
1106
+
1107
+ <bd-bento-item>
1108
+ <span slot="icon" style="color: var(--color-blue-500, #006DFF); font-weight: 700; font-family: var(--typography-fontFamily-mono, monospace); font-size: 14px; letter-spacing: 0.05em;">03</span>
1109
+ <bd-h as="h5" fontWeight="700" style="margin: 0 0 8px;">Automatic for every MCP call</bd-h>
1110
+ <bd-p color="var(--color-neutral-600)">The tunnel opens when the agent calls a Bitdefender tool and closes when the prompt ends. No cookies, cache, or session state carries over to the next prompt, and idle containers close on their own.</bd-p>
1111
+ </bd-bento-item>
1112
+ </bd-bento-grid>
1113
+
1114
+ <div style="background: var(--color-yellow-50, #fffbeb); border: 1px solid var(--color-yellow-300, #fcd34d); border-radius: var(--radius-xl, 12px); padding: 16px 20px; color: var(--color-yellow-800, #92400e); margin-top: 24px;">
1115
+ <bd-p kind="small" style="margin:0;">External beta on macOS. Downloads the macOS beta installer (.dmg). Windows to follow.</bd-p>
1116
+ </div>
1117
+ </div>
1118
+ </section>
1119
+
1120
+ <section id="anchor-5-section">
1121
+ <div style="padding: 24px 24px 48px;">
1122
+ <bd-p kind="normal" style="color: var(--color-blue-500); font-weight: 600; margin: 0 0 8px;">System requirements</bd-p>
1123
+ <bd-h as="h2" font-weight="700" style="margin: 0 0 8px;">What it needs to run</bd-h>
1124
+ <bd-p kind="regular" style="color: var(--color-neutral-700); margin: 0 0 24px;">
1125
+ The floor is set by the container engine that isolates each prompt, not by the VPN itself. Figures are from the beta build.
1126
+ </bd-p>
894
1127
 
1128
+ <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 24px;">
1129
+ <bd-compatibility-table
1130
+ variant="light"
1131
+ background="bordered"
1132
+ light-columns="1"
1133
+ title="Minimum"
1134
+ .rows=${[
1135
+ { label: "macOS", value: "13 or later" },
1136
+ { label: "Processor", value: "Apple silicon" },
1137
+ { label: "Memory", value: "8 GB" },
1138
+ { label: "Free disk", value: "About 10 GB" },
1139
+ { label: "Max exit locations at once", value: "4" }
1140
+ ]}
1141
+ ></bd-compatibility-table>
1142
+
1143
+ <bd-compatibility-table
1144
+ variant="light"
1145
+ background="bordered"
1146
+ light-columns="1"
1147
+ title="Recommended for testing"
1148
+ .rows=${[
1149
+ { label: "macOS", value: "15 or later" },
1150
+ { label: "Processor", value: "Apple silicon" },
1151
+ { label: "Memory", value: "16 GB or more" },
1152
+ { label: "Free disk", value: "About 10 GB" },
1153
+ { label: "Max exit locations at once", value: "8" }
1154
+ ]}
1155
+ ></bd-compatibility-table>
1156
+ </div>
1157
+
1158
+ <bd-p kind="regular" style="color: var(--color-neutral-500); font-style: italic; margin-top: 24px;">
1159
+ Intel Macs are not supported.
1160
+ </bd-p>
1161
+ </div>
1162
+ </section>
1163
+ <section id="anchor-6-section">
1164
+ <bd-trust-panel
1165
+ eyebrow="Why trust it"
1166
+ title="Built by Bitdefender"
1167
+ description="VPN for AI Agents is made by Bitdefender, the company that has protected people and organisations since 2001. The figures and recognitions below describe Bitdefender the company — not VPN for AI Agents, which is in external beta."
1168
+ link-label="Why millions trust Bitdefender"
1169
+ link-href="#"
1170
+ .stats=${[
1171
+ { value: "50B+", label: "threats blocked every year" },
1172
+ { value: "580+", label: "technology patents" },
1173
+ { value: "170+", label: "countries protected" },
1174
+ { value: "15+", label: "years of AI-driven security" },
1175
+ { value: "50%+", label: "of employees work in R&D" },
1176
+ { value: "30+", label: "law-enforcement partnerships" }
1177
+ ]}
1178
+ .cards=${[
1179
+ {
1180
+ eyebrow : "Brand partnership",
1181
+ title : "Trusted by Ferrari as cybersecurity partner",
1182
+ description: "A partnership born from a passion for high performance and technological innovation — Bitdefender supports Ferrari with Advanced Threat Intelligence to improve detection and response to cyber threats.",
1183
+ linkLabel : "Learn more",
1184
+ linkHref : "#"
1185
+ },
1186
+ {
1187
+ eyebrow : "Brand recognition",
1188
+ title : "Award-winning security software you can trust. Always.",
1189
+ description: "Consistently top-ranked by the world's leading independent testing labs and tech publications.",
1190
+ linkLabel : "Learn more",
1191
+ linkHref : "#"
1192
+ }
1193
+ ]}
1194
+ >
1195
+ <span slot="card-1-logos" style="font-weight:700; color:#006DFF; font-size:18px;">Bitdefender</span>
1196
+ <span slot="card-1-logos" style="font-size:12px; color:#374151; font-weight:600;">FERRARI TEAM PARTNER</span>
1197
+
1198
+ <bd-pc-mag-icon slot="card-2-logos" height="32"></bd-pc-mag-icon>
1199
+ <bd-av-comparatives-icon slot="card-2-logos" height="32"></bd-av-comparatives-icon>
1200
+ <bd-top-product-icon slot="card-2-logos" height="32"></bd-top-product-icon>
1201
+ <bd-best-brands-icon slot="card-2-logos" height="32"></bd-best-brands-icon>
1202
+ <bd-laurel-icon slot="card-2-logos" height="32"></bd-laurel-icon>
1203
+ </bd-trust-panel>
1204
+ </section>
1205
+
1206
+ <section id="anchor-7-section" class="faq">
1207
+ <bd-accordion-bg title="Questions about agent privacy">
1208
+ <bd-accordion-bg-item title="Does VPN for AI Agents hide my prompts from Claude or Anthropic?">
1209
+ <bd-p>No. It protects the network path your agent's requests take, not the conversation itself. The model behind your agent still receives the user's prompts and account identity as normal.</bd-p>
1210
+ </bd-accordion-bg-item>
1211
+
1212
+ <bd-accordion-bg-item title="Will it slow my agent down?">
1213
+ <bd-p>Each request opens a fresh, isolated tunnel, so there is some per-connection overhead. Real latency numbers will be published after the external beta period, based on actual usage.</bd-p>
1214
+ </bd-accordion-bg-item>
1215
+
1216
+ <bd-accordion-bg-item title="How is this different from a normal VPN?">
1217
+ <bd-p>A classic VPN keeps one persistent connection open across everything you do. VPN for AI Agents opens a new, isolated container per prompt and closes it when the prompt ends, so consecutive prompts can't be linked together.</bd-p>
1218
+ </bd-accordion-bg-item>
1219
+
1220
+ <bd-accordion-bg-item title="Does it work on Windows?">
1221
+ <bd-p>VPN for AI Agents runs on macOS at launch, with Windows to follow.</bd-p>
1222
+ </bd-accordion-bg-item>
1223
+
1224
+ <bd-accordion-bg-item title="How much does it cost?">
1225
+ <bd-p>Free during beta, with no traffic caps. It's a standalone product with its own sign-in, with no dependency on any other Bitdefender subscription. Pricing decisions, if any, will follow real usage data.</bd-p>
1226
+ </bd-accordion-bg-item>
1227
+
1228
+ <bd-accordion-bg-item title="Can I use this to get around a site's terms of service or an IP ban?">
1229
+ <bd-p>No. VPN for AI Agents changes the network path a request takes, not the rules of the site it reaches. Using it to evade rate limits, bans, or scraping restrictions is against Bitdefender's acceptable use policy and can result in the account losing access to the beta.</bd-p>
1230
+ </bd-accordion-bg-item>
1231
+
1232
+ <bd-accordion-bg-item title="Which exit location does the VPN use?">
1233
+ <bd-p>If you don't specify a location in your prompt, the agent automatically picks the closest or optimal location based on latency. If you explicitly request a country or region, the agent honors it, as long as the target site isn't geo-blocked.</bd-p>
1234
+ </bd-accordion-bg-item>
1235
+
1236
+ <bd-accordion-bg-item title="What happens if the tunnel fails?">
1237
+ <bd-p>The request is dropped inside the isolated container; there's no automatic fallback to your own IP. Depending on the situation, the agent may retry with a different exit location, abandon the request, or ask you directly whether you want to continue without the VPN.</bd-p>
1238
+ </bd-accordion-bg-item>
1239
+
1240
+ <bd-accordion-bg-item title="What happens to telemetry data?">
1241
+ <bd-p>Telemetry collection and use are covered by Bitdefender's Privacy Policy.</bd-p>
1242
+ </bd-accordion-bg-item>
1243
+
1244
+ <bd-accordion-bg-item title="Do you offer team features (SSO, MDM, central configuration)?">
1245
+ <bd-p>Not at this stage — the current beta is designed for individual developers and freelancers, not organisations.</bd-p>
1246
+ </bd-accordion-bg-item>
1247
+
1248
+ <bd-accordion-bg-item title="What exactly does &quot;external beta&quot; mean?">
1249
+ <bd-p>The external beta starts on September 16 and runs for one month, during which we collect feedback from users (freelance developers and AI early adopters). Current commercial terms are those of the standard consumer EULA.</bd-p>
1250
+ </bd-accordion-bg-item>
1251
+ </bd-accordion-bg>
1252
+ </section>
1253
+ <bd-cta-banner
1254
+ title="Give your agent an exit that disappears"
1255
+ description="VPN for AI Agents is now in external beta on macOS, with Windows to follow."
1256
+ caption="Downloads the macOS beta installer (.dmg)."
1257
+ >
1258
+ <bd-button-link
1259
+ slot="primary-button"
1260
+ label="Download for macOS"
1261
+ kind="white"
1262
+ size="md"
1263
+ strong
1264
+ >Download for macOS</bd-button-link>
1265
+
1266
+ <bd-p slot="footer" kind="small" font-family="var(--typography-fontFamily-mono, monospace)" style="color: rgba(255,255,255,0.9); max-width: 700px;">
1267
+ <strong>Contact &amp; feedback.</strong> Questions or feedback about the beta? Email us at
1268
+ <a href="mailto:vpn-for-agents-feedback@bitdefender.com" style="color: #fff; text-decoration: underline;">vpn-for-agents-feedback@bitdefender.com</a>.
1269
+ </bd-p>
1270
+
1271
+ <bd-p slot="footer" kind="small" font-family="var(--typography-fontFamily-mono, monospace)" style="color: rgba(255,255,255,0.7); max-width: 900px;">
1272
+ Your AI agent decides when to use the VPN. Bitdefender cannot guarantee every request is routed through it. No security product guarantees complete protection. Features and availability may vary. Initially available on macOS, with Windows to follow.
1273
+ </bd-p>
1274
+ </bd-cta-banner>
1275
+ <section id="anchor-8-section">
1276
+ <bd-agent-endpoints
1277
+ eyebrow="For AI agents and assistants"
1278
+ title="Machine-readable endpoints"
1279
+ description="This site is built to be read by AI assistants, browsers, and agents. Structured, curated context is available at:"
1280
+ .endpoints=${[
1281
+ { label: "/llms.txt", href: "/llms.txt" },
1282
+ { label: "/llms-full.txt", href: "/llms-full.txt" },
1283
+ { label: "/vpn-for-agents/index.md", href: "/vpn-for-agents/index.md" },
1284
+ { label: "/sitemap.xml", href: "/sitemap.xml" },
1285
+ { label: "/robots.txt", href: "/robots.txt" }
1286
+ ]}
1287
+ >
1288
+ <div slot="rows" style="border-top: 1px solid var(--color-neutral-100); margin-top: 24px; padding-top: 24px;">
1289
+ <bd-p kind="regular" style="color: var(--color-neutral-700); margin: 0;">
1290
+ By using Bitdefender VPN for AI Agents, you confirm that you are over 16 years old and you have read and agreed to Bitdefender's
1291
+ <bd-link href="#" kind="primary">End User License Agreement</bd-link>
1292
+ and
1293
+ <bd-link href="#" kind="primary">Privacy Policy</bd-link>.
1294
+ </bd-p>
1295
+ </div>
1296
+
1297
+ <div slot="rows" style="border-top: 1px solid var(--color-neutral-100); margin-top: 24px; padding-top: 24px;">
1298
+ <bd-p kind="regular" style="color: var(--color-neutral-700); margin: 0;">
1299
+ Your AI agent decides when to use the VPN. Bitdefender cannot guarantee every request is routed through it. No security product guarantees complete protection. Features and availability may vary. Initially available on macOS, with Windows to follow.
1300
+ </bd-p>
1301
+ </div>
1302
+ </bd-agent-endpoints>
1303
+ </section>
1304
+
1305
+ </div>
1306
+ `;
1307
+ }
895
1308
  function sharedFooter() {
896
1309
  return html`
897
1310
  <bd-footer>
@@ -950,9 +1363,9 @@ function sharedFooter() {
950
1363
  }
951
1364
 
952
1365
  // ---------------------------------------------------------------------------
953
- // Wrapper interactiv: ține starea "activeTab" și intercepta click-ul pe
954
- // page-switcher (preventDefault pe anchor-ul intern) în loc să lase browserul
955
- // să navigheze la un URL care nu există în Storybook (de-asta dădea 404).
1366
+ // Wrapper interactiv: ține starea "activeTab" (acum 3 stări) și interceptează
1367
+ // click-ul pe page-switcher (preventDefault pe anchor-ul intern) în loc să
1368
+ // lase browserul să navigheze la un URL care nu există în Storybook.
956
1369
  // ---------------------------------------------------------------------------
957
1370
 
958
1371
  class AiGuardianSkillScannerDemo extends LitElement {
@@ -960,20 +1373,15 @@ class AiGuardianSkillScannerDemo extends LitElement {
960
1373
  activeTab: { state: true }
961
1374
  };
962
1375
 
963
- // light DOM: evenimentul de click (composed) tot ajunge aici din shadow-ul
964
- // intern al bd-page-switcher / bd-link, deci putem intercepta navigarea.
965
1376
  createRenderRoot() {
966
1377
  return this;
967
1378
  }
968
1379
 
969
1380
  constructor() {
970
1381
  super();
971
- this.activeTab = "ai-guardian";
1382
+ this.activeTab = "ai-guardian"; // "ai-guardian" | "skill-scanner" | "vpn"
972
1383
  }
973
1384
 
974
- // Folosim fragmente "#..." în loc de căi reale (/ai-guardian/, /agent-skill-scanner/):
975
- // un fragment nu navighează niciodată către altă pagină, deci nu poate da 404,
976
- // indiferent cum gestionează bd-link intern click-ul.
977
1385
  _onNavClick(event) {
978
1386
  const path = event.composedPath();
979
1387
  const anchor = path.find(
@@ -988,22 +1396,28 @@ class AiGuardianSkillScannerDemo extends LitElement {
988
1396
  } else if (href === "#skill-scanner") {
989
1397
  event.preventDefault();
990
1398
  this.activeTab = "skill-scanner";
1399
+ } else if (href === "#vpn") {
1400
+ event.preventDefault();
1401
+ this.activeTab = "vpn";
991
1402
  }
992
1403
  }
993
1404
 
994
1405
  render() {
995
- const isAiGuardian = this.activeTab === "ai-guardian";
1406
+ const tab = this.activeTab;
996
1407
 
997
1408
  return html`
998
1409
  <div @click=${this._onNavClick}>
999
1410
  <bd-page-switcher
1000
1411
  .items=${[
1001
- { title: "AI Guardian", href: "#ai-guardian", active: isAiGuardian },
1002
- { title: "Skill Scanner", href: "#skill-scanner", active: !isAiGuardian }
1412
+ { title: "AI Guardian", href: "#ai-guardian", active: tab === "ai-guardian" },
1413
+ { title: "Skill Scanner", href: "#skill-scanner", active: tab === "skill-scanner" },
1414
+ { title: "VPN for AI Agents", href: "#vpn", active: tab === "vpn" }
1003
1415
  ]}
1004
1416
  ></bd-page-switcher>
1005
1417
 
1006
- ${isAiGuardian ? aiGuardianBody() : skillScannerBody()}
1418
+ ${tab === "ai-guardian" ? aiGuardianBody() : nothing}
1419
+ ${tab === "skill-scanner" ? skillScannerBody() : nothing}
1420
+ ${tab === "vpn" ? vpnBody() : nothing}
1007
1421
 
1008
1422
  ${sharedFooter()}
1009
1423
  </div>
@@ -1025,15 +1439,15 @@ export default {
1025
1439
  docs : {
1026
1440
  description: {
1027
1441
  component: `
1028
- Interactive demo: sticky top-level product nav (\`AI Guardian\` / \`Skill Scanner\`)
1029
- switches, in place, between two full "pages" without any real navigation —
1030
- clicking a tab intercepts the anchor click and swaps local state instead of
1031
- following the href (which has no route in Storybook and would 404).
1442
+ Interactive demo: sticky top-level product nav (\`AI Guardian\` / \`Skill Scanner\` /
1443
+ \`VPN for AI Agents\`) switches, in place, between three full "pages" without any real
1444
+ navigation — clicking a tab intercepts the anchor click and swaps local state instead
1445
+ of following the href (which has no route in Storybook and would 404).
1032
1446
 
1033
- Both anchor-nav bars use \`sticky-top="65px"\` so they pin themselves *below*
1447
+ Both/all anchor-nav bars use \`sticky-top="65px"\` so they pin themselves *below*
1034
1448
  the sticky page-switcher instead of overlapping it once scrolled. That value
1035
1449
  is an estimate — measure bd-page-switcher's real rendered height in DevTools
1036
- and adjust if the two bars still overlap or leave a gap.
1450
+ and adjust if the bars still overlap or leave a gap.
1037
1451
 
1038
1452
  **AI Guardian** page: \`bd-header-code\`, \`bd-quick-answer\`, sticky \`bd-anchor-nav\`
1039
1453
  (9 items) wrapping \`bd-overview\`, \`bd-compatibility-table\` (default variant), the
@@ -1053,7 +1467,14 @@ for "Privacy", a \`bd-trust-panel\` + \`bd-accordion-bg\` FAQ (7 questions) unde
1053
1467
  "FAQ", a \`bd-cta-banner\`, and \`bd-agent-endpoints\` with legal copy in its
1054
1468
  \`rows\` slot.
1055
1469
 
1056
- Both pages share the same \`bd-footer\` at the bottom.
1470
+ **VPN for AI Agents** page: a \`bd-header-code\` using \`variant="tint"\` (light-blue
1471
+ gradient + perspective floor grid + stacked-card rings behind the terminal),
1472
+ a bordered "EXTERNAL BETA" badge, a breadcrumb, a facts/spec row via the
1473
+ \`meta\` slot, and two floating annotation pills around the terminal. Only
1474
+ the hero has been provided so far — the rest of the page follows the same
1475
+ pattern as the other two once that content is supplied.
1476
+
1477
+ Both/all pages share the same \`bd-footer\` at the bottom.
1057
1478
  `
1058
1479
  }
1059
1480
  }
@@ -1061,6 +1482,6 @@ Both pages share the same \`bd-footer\` at the bottom.
1061
1482
  };
1062
1483
 
1063
1484
  export const Default = {
1064
- name : "AI Guardian ↔ Skill Scanner (interactive)",
1485
+ name : "AI Guardian ↔ Skill Scanner ↔ VPN (interactive)",
1065
1486
  render: () => html`<demo-ai-guardian-skill-scanner></demo-ai-guardian-skill-scanner>`
1066
1487
  };
@@ -1,10 +1,21 @@
1
1
  import { css } from "lit";
2
2
 
3
3
  export default css`
4
- :host {
4
+ :host {
5
5
  display: block;
6
6
  width: 100%;
7
7
  box-sizing: border-box;
8
+ max-width: 1290px;
9
+ margin-inline: auto;
10
+ }
11
+
12
+ /* === BACKGROUND VARIANT — section-level tint, applied to the whole
13
+ component (header + track), not per-card. Padding compensates so the
14
+ tinted area doesn't hug the header/cards edge-to-edge. === */
15
+ :host([background="tint"]) {
16
+ background-color: var(--color-blue-50, #f0f6ff);
17
+ border-radius: var(--radius-2xl, 24px);
18
+ padding: var(--spacing-40, 40px) var(--spacing-32, 32px);
8
19
  }
9
20
 
10
21
  /* === HEADER (eyebrow / title / description) === */