@repobit/dex-system-design 0.23.10 → 0.23.12

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.
@@ -0,0 +1,128 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://repobit.github.io/dex-system-design/page-schema.json",
4
+ "title": "Dex System Design Page Schema",
5
+ "description": "Recursive page tree for n8n or other generators that build markup from dex-system-design components.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["version", "imports", "components"],
9
+ "properties": {
10
+ "version": {
11
+ "type": "integer",
12
+ "const": 1
13
+ },
14
+ "meta": {
15
+ "type": "object",
16
+ "additionalProperties": false,
17
+ "properties": {
18
+ "title": { "type": "string" },
19
+ "description": { "type": "string" },
20
+ "locale": { "type": "string" },
21
+ "route": { "type": "string" }
22
+ }
23
+ },
24
+ "imports": {
25
+ "type": "array",
26
+ "description": "Package exports that must be imported before rendering the page.",
27
+ "items": {
28
+ "type": "string"
29
+ },
30
+ "uniqueItems": true
31
+ },
32
+ "components": {
33
+ "type": "array",
34
+ "items": {
35
+ "$ref": "#/$defs/node"
36
+ }
37
+ }
38
+ },
39
+ "$defs": {
40
+ "scalar": {
41
+ "type": ["string", "number", "boolean", "null"]
42
+ },
43
+ "propValue": {
44
+ "oneOf": [
45
+ { "$ref": "#/$defs/scalar" },
46
+ {
47
+ "type": "array",
48
+ "items": {
49
+ "$ref": "#/$defs/propValue"
50
+ }
51
+ },
52
+ {
53
+ "type": "object",
54
+ "additionalProperties": {
55
+ "$ref": "#/$defs/propValue"
56
+ }
57
+ }
58
+ ]
59
+ },
60
+ "node": {
61
+ "type": "object",
62
+ "additionalProperties": false,
63
+ "required": ["type"],
64
+ "properties": {
65
+ "id": {
66
+ "type": "string"
67
+ },
68
+ "type": {
69
+ "type": "string",
70
+ "description": "Component tag from component-manifest.json."
71
+ },
72
+ "props": {
73
+ "type": "object",
74
+ "additionalProperties": {
75
+ "$ref": "#/$defs/propValue"
76
+ }
77
+ },
78
+ "slot": {
79
+ "type": "string"
80
+ },
81
+ "if": {
82
+ "type": "string",
83
+ "description": "Optional expression or upstream key used by a later renderer to decide whether to include the node."
84
+ },
85
+ "children": {
86
+ "type": "array",
87
+ "items": {
88
+ "oneOf": [
89
+ { "type": "string" },
90
+ { "$ref": "#/$defs/node" }
91
+ ]
92
+ }
93
+ }
94
+ }
95
+ }
96
+ },
97
+ "examples": [
98
+ {
99
+ "version": 1,
100
+ "imports": ["./heading", "./paragraph", "./button"],
101
+ "components": [
102
+ {
103
+ "type": "bd-h",
104
+ "props": {
105
+ "as": "h1"
106
+ },
107
+ "children": ["Bitdefender Security"]
108
+ },
109
+ {
110
+ "type": "bd-p",
111
+ "props": {
112
+ "kind": "regular"
113
+ },
114
+ "children": ["Advanced protection for devices, privacy, and identity."]
115
+ },
116
+ {
117
+ "type": "bd-button-link",
118
+ "props": {
119
+ "kind": "primary",
120
+ "size": "lg",
121
+ "href": "/buy"
122
+ },
123
+ "children": ["Buy now"]
124
+ }
125
+ ]
126
+ }
127
+ ]
128
+ }
@@ -1,92 +1,341 @@
1
1
  import { css } from "lit";
2
2
 
3
3
  export const anchorNavStyles = css`
4
- :host {
5
- padding: var(--spacing-0) 15em;
6
- margin: var(--spacing-0) auto;
7
- --bd-accesibility-focus: var(--color-blue-500);
8
- }
9
-
10
- .bd-container {
11
- flex-wrap: wrap;
12
- justify-content: space-between;
13
- gap: 2.5em;
14
- }
15
-
16
- a:focus-visible {
17
- outline: var(--spacing-2) solid var(--bd-accesibility-focus);
18
- outline-offset: var(--spacing-2);
19
- border-radius: var(--space-2xs);
20
- }
21
-
22
- nav {
23
- position: sticky;
24
- top: 0;
25
- z-index: 1000;
26
- box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05);
27
- display: flex;
28
- justify-content: space-between;
29
- align-items: center;
30
- border-top: 1px solid #f0f0f0;
31
- border-bottom: 1px solid #f0f0f0;
32
- padding: var(--spacing-10) 15em;
33
- width: 100%;
34
- box-sizing: border-box;
35
- background: white;
36
- margin-bottom: var(--spacing-64);
37
- }
38
-
39
- .bd-container {
40
- padding: 50px;
41
- }
42
-
43
-
44
- [id$="-section"] {
45
- scroll-margin-top: 120px;
46
- }
47
-
48
- .anchor-links {
49
- position: relative;
50
- display: flex;
51
- gap: var(--spacing-32);
52
- }
53
-
54
- a {
55
- position: relative;
56
- text-decoration: none;
57
- color: black;
58
- font-weight: 600;
59
- padding: var(--spacing-10) var(--spacing-0);
60
- display: inline-block;
61
- font-size: var(--typography-body-regular-fontSize) !important;
62
- font-family: var(--typography-fontFamily-sans) !important;
63
- }
64
-
65
- a::after {
66
- content: "";
67
- position: absolute;
68
- left: var(--spacing-0);
69
- bottom: -14px;
70
- width: 0%;
71
- height: 3px;
72
- background-color: #006dff;
73
- transition: width 0.3s ease;
74
- }
75
-
76
- a.active::after {
77
- width: 100%;
78
- }
79
-
80
- `;
81
-
82
- export const anchorNavItemStyles = css`
83
4
  :host {
84
- display: none;
5
+ display: block;
6
+ position: sticky;
7
+ top: var(--spacing-0);
8
+ z-index: 1000;
9
+ border-top: var(--border-width-1) solid var(--color-neutral-100);
10
+ border-bottom: var(--border-width-1) solid var(--color-neutral-100);
11
+ padding-block: var(--spacing-10);
12
+ padding-inline: var(--layout-ensemble-inline-padding);
13
+ width: 100%;
14
+ box-sizing: border-box;
15
+ background: var(--color-neutral-0);
16
+ margin-bottom: var(--spacing-0);
17
+ --bd-accesibility-focus: var(--color-blue-500);
85
18
  }
86
19
 
87
- :host([active]) {
20
+ a:focus-visible,
21
+ .bd-anchor-nav__cta:focus-visible,
22
+ .bd-anchor-nav__dropdown-toggle:focus-visible,
23
+ .bd-anchor-nav__dropdown-option:focus-visible {
24
+ outline: var(--spacing-2) solid var(--bd-accesibility-focus);
25
+ outline-offset: var(--spacing-2);
26
+ border-radius: var(--space-2xs);
27
+ }
28
+
29
+ nav {
88
30
  display: block;
89
- padding: var(--spacing-0) 15em;
90
- margin: var(--spacing-0) auto;
31
+ margin: var(--spacing-0);
32
+ padding: var(--spacing-0);
33
+ width: 100%;
34
+ box-sizing: border-box;
35
+ }
36
+
37
+ .bd-anchor-nav__inner {
38
+ display: flex;
39
+ flex-wrap: wrap;
40
+ justify-content: space-between;
41
+ align-items: center;
42
+ gap: var(--spacing-32);
43
+ width: 100%;
44
+ max-width: var(--layout-compare-grid-max);
45
+ margin-inline: auto;
46
+ box-sizing: border-box;
47
+ }
48
+
49
+ .anchor-links {
50
+ position: relative;
51
+ display: flex;
52
+ flex-wrap: wrap;
53
+ align-items: center;
54
+ gap: var(--spacing-16) var(--spacing-32);
55
+ row-gap: var(--spacing-8);
56
+ flex: 1 1 auto;
57
+ min-width: 0;
58
+ }
59
+
60
+ .anchor-links--desktop {
61
+ display: flex;
62
+ }
63
+
64
+ .bd-anchor-nav__dropdown {
65
+ display: none;
66
+ position: relative;
67
+ flex: 1 1 auto;
68
+ min-width: 0;
69
+ width: 100%;
70
+ }
71
+
72
+ /* ── Dropdown toggle ── */
73
+
74
+ .bd-anchor-nav__dropdown-toggle {
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: space-between;
78
+ gap: var(--spacing-12);
79
+ width: 100%;
80
+ min-height: var(--dimension-48px);
81
+ padding-block: var(--spacing-10);
82
+ padding-inline: var(--spacing-16);
83
+ box-sizing: border-box;
84
+ font-family: var(--typography-fontFamily-sans);
85
+ font-size: var(--typography-body-regular-fontSize);
86
+ font-weight: var(--typography-fontWeight-semibold);
87
+ color: var(--color-neutral-900);
88
+ background: var(--color-neutral-25);
89
+ border: var(--border-width-1) solid var(--color-neutral-200);
90
+ border-radius: var(--radius-lg);
91
+ cursor: pointer;
92
+ text-align: left;
93
+ transition:
94
+ background var(--transition-duration-fast) var(--transition-easing-smooth),
95
+ border-color var(--transition-duration-fast) var(--transition-easing-smooth),
96
+ border-radius var(--transition-duration-fast) var(--transition-easing-smooth);
97
+ }
98
+
99
+ .bd-anchor-nav__dropdown-toggle:hover {
100
+ background: var(--color-neutral-50);
101
+ border-color: var(--color-neutral-300);
102
+ }
103
+
104
+ .bd-anchor-nav__dropdown-toggle[aria-expanded="true"] {
105
+ background: var(--color-neutral-50);
106
+ border-color: var(--color-blue-200);
107
+ border-radius: var(--radius-lg) var(--radius-lg) var(--spacing-0) var(--spacing-0);
108
+ }
109
+
110
+ .bd-anchor-nav__dropdown-label {
111
+ flex: 1 1 auto;
112
+ min-width: 0;
113
+ overflow: hidden;
114
+ text-overflow: ellipsis;
115
+ white-space: nowrap;
116
+ transform-origin: left center;
117
+ }
118
+
119
+ .bd-anchor-nav__dropdown-chevron {
120
+ flex: 0 0 auto;
121
+ display: flex;
122
+ color: var(--color-neutral-600);
123
+ transition: transform var(--transition-duration-normal) var(--transition-easing-smooth);
124
+ }
125
+
126
+ .bd-anchor-nav__dropdown-toggle[aria-expanded="true"] .bd-anchor-nav__dropdown-chevron {
127
+ transform: rotate(180deg);
128
+ color: var(--color-blue-500);
129
+ }
130
+
131
+ /* ── Dropdown panel ── */
132
+
133
+ .bd-anchor-nav__dropdown-panel {
134
+ position: absolute;
135
+ left: var(--spacing-0);
136
+ right: var(--spacing-0);
137
+ top: 100%;
138
+ z-index: 1001;
139
+ max-height: min(50vh, 20rem);
140
+ overflow-y: auto;
141
+ background: var(--color-neutral-0);
142
+ border: var(--border-width-1) solid var(--color-blue-200);
143
+ border-top: none;
144
+ border-radius: var(--spacing-0) var(--spacing-0) var(--radius-lg) var(--radius-lg);
145
+ box-shadow: var(--shadow-md);
146
+ }
147
+
148
+ .bd-anchor-nav__dropdown-list {
149
+ list-style: none;
150
+ margin: var(--spacing-0);
151
+ padding: var(--spacing-8);
152
+ display: flex;
153
+ flex-direction: column;
154
+ gap: var(--spacing-2);
155
+ }
156
+
157
+ /* ── Dropdown options ── */
158
+
159
+ .bd-anchor-nav__dropdown-option {
160
+ display: flex;
161
+ align-items: center;
162
+ width: 100%;
163
+ min-height: var(--dimension-48px);
164
+ padding-block: var(--spacing-12);
165
+ padding-inline: var(--spacing-16);
166
+ box-sizing: border-box;
167
+ font-family: var(--typography-fontFamily-sans);
168
+ font-size: var(--typography-body-regular-fontSize);
169
+ font-weight: var(--typography-fontWeight-normal);
170
+ color: var(--color-neutral-900);
171
+ background: transparent;
172
+ border: none;
173
+ border-radius: var(--radius-md);
174
+ cursor: pointer;
175
+ text-align: left;
176
+ transition:
177
+ color var(--transition-duration-fast) var(--transition-easing-smooth),
178
+ background var(--transition-duration-fast) var(--transition-easing-smooth);
179
+ }
180
+
181
+ .bd-anchor-nav__dropdown-option:hover:not(.bd-anchor-nav__dropdown-option--active) {
182
+ color: var(--color-blue-500);
183
+ background: var(--color-neutral-25);
184
+ }
185
+
186
+ .bd-anchor-nav__dropdown-option--active {
187
+ font-weight: var(--typography-fontWeight-semibold);
188
+ background: var(--color-blue-50);
189
+ color: var(--color-blue-700);
190
+ }
191
+
192
+ .bd-anchor-nav__dropdown-option--active:hover {
193
+ color: var(--color-blue-700);
194
+ background: var(--color-blue-50);
195
+ }
196
+
197
+ /* ── Desktop links ── */
198
+
199
+ a {
200
+ position: relative;
201
+ text-decoration: none;
202
+ color: var(--color-neutral-900);
203
+ font-weight: var(--typography-fontWeight-normal);
204
+ padding: var(--spacing-10) var(--spacing-0);
205
+ display: inline-block;
206
+ font-size: var(--typography-body-regular-fontSize);
207
+ font-family: var(--typography-body-regular-fontFamily);
208
+ transition: color var(--transition-duration-fast) var(--transition-easing-smooth);
209
+ }
210
+
211
+ a.active {
212
+ font-weight: var(--typography-fontWeight-semibold);
213
+ color: var(--color-neutral-900);
214
+ }
215
+
216
+ a:hover:not(.active) {
217
+ color: var(--color-blue-500);
218
+ }
219
+
220
+ a.active:hover {
221
+ color: var(--color-neutral-900);
222
+ }
223
+
224
+ a::after {
225
+ content: "";
226
+ position: absolute;
227
+ left: var(--spacing-0);
228
+ bottom: calc(-1 * var(--spacing-14));
229
+ width: 0%;
230
+ height: var(--border-width-3);
231
+ background-color: var(--color-blue-500);
232
+ transition: width var(--transition-duration-slow) var(--transition-easing-ease-out);
233
+ }
234
+
235
+ a.active::after {
236
+ width: 100%;
237
+ }
238
+
239
+ /* ── CTA button ── */
240
+
241
+ .bd-anchor-nav__cta {
242
+ font-family: var(--typography-fontFamily-sans);
243
+ font-size: var(--typography-fontSize-lg);
244
+ font-weight: var(--typography-fontWeight-semibold);
245
+ line-height: var(--typography-lineHeight-normal);
246
+ padding: var(--spacing-10) var(--spacing-20);
247
+ border: none;
248
+ border-radius: var(--radius-md);
249
+ cursor: pointer;
250
+ background: var(--color-red-500);
251
+ color: var(--color-neutral-0);
252
+ transition: background var(--transition-duration-fast) var(--transition-easing-smooth);
253
+ }
254
+
255
+ .bd-anchor-nav__cta:hover {
256
+ background: var(--color-red-600);
257
+ }
258
+
259
+ .bd-anchor-nav__cta:active {
260
+ background: var(--color-red-700);
261
+ }
262
+
263
+ /* ── Animations ── */
264
+
265
+ @keyframes bd-anchor-nav-dropdown-label-swap {
266
+ from {
267
+ opacity: 0.35;
268
+ transform: translateY(var(--spacing-4));
269
+ }
270
+ to {
271
+ opacity: 1;
272
+ transform: translateY(var(--spacing-0));
273
+ }
274
+ }
275
+
276
+ @media (prefers-reduced-motion: reduce) {
277
+ a::after,
278
+ .bd-anchor-nav__dropdown-chevron,
279
+ .bd-cta,
280
+ .bd-anchor-nav__dropdown-label--swap {
281
+ animation: none !important;
282
+ }
283
+ }
284
+
285
+ /* ── Mobile ── */
286
+
287
+ @media (max-width: 768px) {
288
+ :host {
289
+ padding-block: var(--spacing-10);
290
+ padding-inline: var(--layout-ensemble-inline-padding);
291
+ }
292
+
293
+ .bd-anchor-nav__inner {
294
+ flex-direction: column;
295
+ align-items: stretch;
296
+ gap: var(--spacing-16);
297
+ }
298
+
299
+ .anchor-links--desktop {
300
+ display: none !important;
301
+ }
302
+
303
+ .bd-anchor-nav__dropdown {
304
+ display: block;
305
+ }
306
+
307
+ .bd-anchor-nav__dropdown-label.bd-anchor-nav__dropdown-label--swap {
308
+ animation: bd-anchor-nav-dropdown-label-swap var(--transition-duration-normal)
309
+ var(--transition-easing-smooth);
310
+ }
311
+
312
+ .bd-cta {
313
+ align-self: stretch;
314
+ display: block;
315
+ overflow: hidden;
316
+ max-height: var(--spacing-0);
317
+ opacity: 0;
318
+ transform: translateY(calc(-1 * var(--spacing-8)));
319
+ pointer-events: none;
320
+ margin-top: calc(-1 * var(--spacing-16));
321
+ transition:
322
+ max-height var(--transition-duration-slow) var(--transition-easing-ease-out),
323
+ opacity var(--transition-duration-normal) var(--transition-easing-smooth),
324
+ transform var(--transition-duration-normal) var(--transition-easing-smooth),
325
+ margin-top var(--transition-duration-normal) var(--transition-easing-smooth);
326
+ }
327
+
328
+ .bd-anchor-nav__inner[data-mobile-cta-visible] .bd-cta {
329
+ max-height: var(--spacing-128);
330
+ opacity: 1;
331
+ transform: translateY(var(--spacing-0));
332
+ pointer-events: auto;
333
+ margin-top: var(--spacing-0);
334
+ }
335
+
336
+ .bd-anchor-nav__cta {
337
+ width: 100%;
338
+ box-sizing: border-box;
339
+ }
91
340
  }
92
- `;
341
+ `;