admin-lte 4.0.0-rc7 → 4.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.
Files changed (102) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +43 -17
  3. package/dist/UI/general.html +303 -126
  4. package/dist/UI/icons.html +303 -126
  5. package/dist/UI/timeline.html +303 -126
  6. package/dist/css/adminlte.css +2798 -1167
  7. package/dist/css/adminlte.css.map +1 -1
  8. package/dist/css/adminlte.min.css +2 -2
  9. package/dist/css/adminlte.min.css.map +1 -1
  10. package/dist/css/adminlte.rtl.css +2798 -1167
  11. package/dist/css/adminlte.rtl.css.map +1 -1
  12. package/dist/css/adminlte.rtl.min.css +2 -2
  13. package/dist/css/adminlte.rtl.min.css.map +1 -1
  14. package/dist/docs/browser-support.html +261 -397
  15. package/dist/docs/color-mode.html +242 -382
  16. package/dist/docs/components/main-header.html +238 -374
  17. package/dist/docs/components/main-sidebar.html +253 -389
  18. package/dist/docs/customization.html +1056 -0
  19. package/dist/docs/deployment.html +1121 -0
  20. package/dist/docs/faq.html +857 -409
  21. package/dist/docs/getting-started.html +967 -0
  22. package/dist/docs/how-to-contribute.html +335 -462
  23. package/dist/docs/index.html +16 -0
  24. package/dist/docs/integrations.html +1207 -0
  25. package/dist/docs/introduction.html +453 -446
  26. package/dist/docs/javascript/accessibility.html +361 -491
  27. package/dist/docs/javascript/card-widget.html +446 -450
  28. package/dist/docs/javascript/direct-chat.html +324 -421
  29. package/dist/docs/javascript/fullscreen.html +348 -416
  30. package/dist/docs/javascript/layout.html +345 -436
  31. package/dist/docs/javascript/plugins-overview.html +1120 -0
  32. package/dist/docs/javascript/pushmenu.html +485 -492
  33. package/dist/docs/javascript/treeview.html +466 -400
  34. package/dist/docs/layout-blueprint.html +1063 -0
  35. package/dist/docs/layout.html +287 -415
  36. package/dist/docs/license.html +252 -387
  37. package/dist/docs/migration.html +1125 -0
  38. package/dist/docs/recipes.html +1161 -0
  39. package/dist/docs/rtl.html +933 -0
  40. package/dist/examples/lockscreen.html +65 -1
  41. package/dist/examples/login-v2.html +65 -1
  42. package/dist/examples/login.html +65 -1
  43. package/dist/examples/register-v2.html +65 -1
  44. package/dist/examples/register.html +65 -1
  45. package/dist/forms/{general.html → elements.html} +489 -463
  46. package/dist/forms/layout.html +1243 -0
  47. package/dist/forms/validation.html +1251 -0
  48. package/dist/forms/wizard.html +1386 -0
  49. package/dist/generate/theme.html +134 -4
  50. package/dist/index.html +303 -126
  51. package/dist/index2.html +306 -126
  52. package/dist/index3.html +303 -126
  53. package/dist/js/adminlte.js +5 -5
  54. package/dist/js/adminlte.js.map +1 -1
  55. package/dist/js/adminlte.min.js +2 -2
  56. package/dist/js/adminlte.min.js.map +1 -1
  57. package/dist/layout/collapsed-sidebar-without-hover.html +303 -126
  58. package/dist/layout/collapsed-sidebar.html +303 -126
  59. package/dist/layout/fixed-complete.html +303 -126
  60. package/dist/layout/fixed-footer.html +303 -126
  61. package/dist/layout/fixed-header.html +303 -126
  62. package/dist/layout/fixed-sidebar.html +303 -126
  63. package/dist/layout/layout-custom-area.html +303 -126
  64. package/dist/layout/layout-rtl.html +303 -126
  65. package/dist/layout/logo-switch.html +134 -4
  66. package/dist/layout/sidebar-mini.html +303 -126
  67. package/dist/layout/unfixed-sidebar.html +303 -126
  68. package/dist/mailbox/compose.html +1127 -0
  69. package/dist/mailbox/inbox.html +1477 -0
  70. package/dist/mailbox/read.html +1178 -0
  71. package/dist/pages/404.html +213 -0
  72. package/dist/pages/500.html +201 -0
  73. package/dist/pages/calendar.html +1242 -0
  74. package/dist/pages/chat.html +1403 -0
  75. package/dist/pages/faq.html +1359 -0
  76. package/dist/pages/file-manager.html +1811 -0
  77. package/dist/pages/invoice.html +1175 -0
  78. package/dist/pages/kanban.html +1415 -0
  79. package/dist/pages/maintenance.html +204 -0
  80. package/dist/pages/pricing.html +1255 -0
  81. package/dist/pages/profile.html +1358 -0
  82. package/dist/pages/projects.html +1620 -0
  83. package/dist/pages/settings.html +1363 -0
  84. package/dist/tables/data.html +1295 -0
  85. package/dist/tables/simple.html +303 -126
  86. package/dist/widgets/cards.html +303 -126
  87. package/dist/widgets/info-box.html +303 -126
  88. package/dist/widgets/small-box.html +303 -126
  89. package/netlify.toml +16 -0
  90. package/package.json +29 -23
  91. package/src/scss/_app-header.scss +27 -0
  92. package/src/scss/_app-sidebar.scss +24 -30
  93. package/src/scss/_bootstrap-variables.scss +11 -4
  94. package/src/scss/_docs.scss +816 -0
  95. package/src/scss/_table.scss +4 -4
  96. package/src/scss/adminlte.scss +4 -1
  97. package/src/ts/adminlte.ts +1 -1
  98. package/src/ts/fullscreen.ts +8 -4
  99. package/src/ts/push-menu.ts +66 -5
  100. package/.claude/settings.local.json +0 -37
  101. package/CLAUDE.md +0 -79
  102. package/release.md +0 -75
@@ -1,4 +1,820 @@
1
+ //
2
+ // Component: Docs
3
+ //
4
+ // Visual treatment for documentation pages. Body class `.docs-page` opts in.
5
+ // Demo pages are not affected.
6
+ //
7
+
8
+ // Inline code blocks rendered by MDX (Astro highlight default class)
1
9
  .astro-code {
2
10
  padding: .75rem;
3
11
  @include border-radius($border-radius);
4
12
  }
13
+
14
+ .docs-page {
15
+ // Constrain the docs card to a comfortable reading width.
16
+ // Tables and code blocks inside can still scroll horizontally if needed.
17
+ .app-content > .container-fluid {
18
+ max-width: 60rem; // ~960px
19
+
20
+ @include media-breakpoint-up(xxl) {
21
+ max-width: 64rem;
22
+ }
23
+ }
24
+
25
+ //
26
+ // Card body — breathing room + prose typography.
27
+ // Only applied inside docs content cards so demo-page card content
28
+ // stays unchanged.
29
+ //
30
+ .card > .card-body {
31
+ padding: 1.5rem;
32
+ font-size: 1rem;
33
+ line-height: 1.7;
34
+ color: var(--#{$prefix}body-color);
35
+
36
+ @include media-breakpoint-up(md) {
37
+ padding: 2.5rem;
38
+ }
39
+
40
+ //
41
+ // Heading hierarchy. The MDX content in src/html/components/docs/ uses
42
+ // ##### (h5) as the dominant section heading and ###### (h6) as a
43
+ // sub-heading (most visible in FAQ.mdx, where h5 is a topic and h6 is
44
+ // a question). Style h5 as a major section and h6 as a sub-section so
45
+ // the visual hierarchy matches the semantic one.
46
+ //
47
+ h1,
48
+ h2,
49
+ h3,
50
+ h4,
51
+ h5,
52
+ h6,
53
+ .h1,
54
+ .h2,
55
+ .h3,
56
+ .h4,
57
+ .h5,
58
+ .h6 {
59
+ margin-top: 2em;
60
+ margin-bottom: .5em;
61
+ font-weight: 600;
62
+ line-height: 1.3;
63
+ color: var(--#{$prefix}emphasis-color);
64
+ scroll-margin-top: 4rem; // anchor-link friendly
65
+
66
+ &:first-child {
67
+ margin-top: 0;
68
+ }
69
+ }
70
+
71
+ h2,
72
+ .h2 {
73
+ padding-bottom: .35em;
74
+ font-size: 1.75rem;
75
+ border-bottom: 1px solid var(--#{$prefix}border-color);
76
+ }
77
+
78
+ h3,
79
+ .h3 {
80
+ font-size: 1.4rem;
81
+ }
82
+
83
+ h4,
84
+ .h4 {
85
+ font-size: 1.2rem;
86
+ }
87
+
88
+ // h5 is the dominant section heading across docs MDX files. Give it
89
+ // a visible separator above so sections are easy to scan.
90
+ h5,
91
+ .h5 {
92
+ padding-top: 1.5em;
93
+ margin-top: 2.5em;
94
+ font-size: 1.3rem;
95
+ border-top: 1px solid var(--#{$prefix}border-color);
96
+
97
+ &:first-child {
98
+ padding-top: 0;
99
+ border-top: 0;
100
+ }
101
+ }
102
+
103
+ // h6 is the sub-section / FAQ question style. Smaller than h5 but
104
+ // still distinctly heading-like, with a touch of accent colour to
105
+ // separate from body text.
106
+ h6,
107
+ .h6 {
108
+ margin-top: 1.75em;
109
+ font-size: 1.08rem;
110
+ color: var(--#{$prefix}emphasis-color);
111
+ }
112
+
113
+ //
114
+ // Paragraphs and lists.
115
+ //
116
+ p,
117
+ ul,
118
+ ol,
119
+ dl,
120
+ blockquote,
121
+ table {
122
+ margin-bottom: 1.1rem;
123
+ }
124
+
125
+ ul,
126
+ ol {
127
+ padding-left: 1.5rem;
128
+
129
+ li {
130
+ margin-bottom: .35rem;
131
+ }
132
+
133
+ // Tighter nested lists
134
+ ul,
135
+ ol {
136
+ margin-top: .35rem;
137
+ margin-bottom: 0;
138
+ }
139
+ }
140
+
141
+ // Lead-style first paragraph (just after a heading)
142
+ h2 + p,
143
+ h3 + p,
144
+ h5 + p {
145
+ margin-top: 0;
146
+ }
147
+
148
+ //
149
+ // Inline code — pill style that complements MDX's syntax-highlighted blocks.
150
+ //
151
+ p code,
152
+ li code,
153
+ td code,
154
+ th code,
155
+ h2 code,
156
+ h3 code,
157
+ h4 code,
158
+ h5 code,
159
+ h6 code {
160
+ padding: .15em .4em;
161
+ font-size: .875em;
162
+ color: var(--#{$prefix}emphasis-color);
163
+ background: var(--#{$prefix}tertiary-bg);
164
+ border: 1px solid var(--#{$prefix}border-color);
165
+ @include border-radius($border-radius-sm);
166
+ }
167
+
168
+ //
169
+ // Code blocks.
170
+ //
171
+ pre.astro-code,
172
+ pre {
173
+ padding: 1rem 1.25rem;
174
+ margin-top: 1.25rem;
175
+ margin-bottom: 1.5rem;
176
+ overflow-x: auto;
177
+ font-size: .875rem;
178
+ line-height: 1.6;
179
+ @include border-radius($border-radius);
180
+
181
+ code {
182
+ padding: 0;
183
+ background: transparent;
184
+ border: 0;
185
+ }
186
+ }
187
+
188
+ //
189
+ // Tables — reference-doc styling with hairline borders.
190
+ //
191
+ table {
192
+ width: 100%;
193
+ margin-top: 1.25rem;
194
+ margin-bottom: 1.5rem;
195
+ overflow: hidden;
196
+ font-size: .95rem;
197
+ border-collapse: collapse;
198
+ border: 1px solid var(--#{$prefix}border-color);
199
+ @include border-radius($border-radius-sm);
200
+
201
+ th,
202
+ td {
203
+ padding: .65rem .9rem;
204
+ text-align: left;
205
+ vertical-align: top;
206
+ border-bottom: 1px solid var(--#{$prefix}border-color);
207
+ }
208
+
209
+ th {
210
+ font-weight: 600;
211
+ color: var(--#{$prefix}emphasis-color);
212
+ background: var(--#{$prefix}tertiary-bg);
213
+ }
214
+
215
+ tr:last-child td {
216
+ border-bottom: 0;
217
+ }
218
+
219
+ code {
220
+ white-space: nowrap;
221
+ }
222
+ }
223
+
224
+ //
225
+ // Blockquotes used as info callouts.
226
+ //
227
+ blockquote {
228
+ padding: .85rem 1.1rem;
229
+ margin-top: 1.25rem;
230
+ color: var(--#{$prefix}emphasis-color);
231
+ background: var(--#{$prefix}info-bg-subtle);
232
+ border-left: 4px solid var(--#{$prefix}info-border-subtle);
233
+ @include border-radius($border-radius-sm);
234
+
235
+ p:last-child {
236
+ margin-bottom: 0;
237
+ }
238
+
239
+ code {
240
+ background: rgba(0, 0, 0, .05);
241
+ }
242
+ }
243
+
244
+ //
245
+ // Prose links — stand out more than Bootstrap defaults.
246
+ //
247
+ a:not(.btn):not(.nav-link) {
248
+ color: var(--#{$prefix}primary);
249
+ text-decoration: underline;
250
+ text-decoration-thickness: 1px;
251
+ text-underline-offset: 3px;
252
+
253
+ &:hover {
254
+ text-decoration-thickness: 2px;
255
+ }
256
+ }
257
+
258
+ //
259
+ // Horizontal rule — used as additional section separator.
260
+ //
261
+ hr {
262
+ margin: 2.5rem 0;
263
+ border: 0;
264
+ border-top: 1px solid var(--#{$prefix}border-color);
265
+ opacity: 1;
266
+ }
267
+
268
+ //
269
+ // Lead paragraph — the first paragraph in any doc is a summary.
270
+ // Visually heavier so it functions as a deck.
271
+ //
272
+ > p:first-child,
273
+ > p:first-of-type {
274
+ margin-bottom: 2rem;
275
+ font-size: 1.125rem;
276
+ line-height: 1.6;
277
+ color: var(--#{$prefix}body-color);
278
+ }
279
+
280
+ //
281
+ // FAQ / disclosure accordion — uses native <details>/<summary>.
282
+ // Add `.faq-item` to <details> to opt in.
283
+ //
284
+ details.faq-item {
285
+ margin-bottom: .5rem;
286
+ overflow: hidden;
287
+ background: var(--#{$prefix}body-bg);
288
+ border: 1px solid var(--#{$prefix}border-color);
289
+ @include border-radius($border-radius);
290
+ @include transition(border-color .15s ease, box-shadow .15s ease);
291
+
292
+ &:hover {
293
+ border-color: var(--#{$prefix}primary-border-subtle);
294
+ }
295
+
296
+ &[open] {
297
+ background: var(--#{$prefix}body-bg);
298
+ border-color: var(--#{$prefix}primary-border-subtle);
299
+ box-shadow: 0 1px 3px rgba(0, 0, 0, .04);
300
+ }
301
+
302
+ summary {
303
+ position: relative;
304
+ padding: .9rem 3rem .9rem 1.1rem;
305
+ font-size: 1rem;
306
+ font-weight: 600;
307
+ color: var(--#{$prefix}emphasis-color);
308
+ list-style: none;
309
+ cursor: pointer;
310
+ user-select: none;
311
+ @include transition(color .15s ease);
312
+
313
+ // Hide the default disclosure triangle in Webkit/Blink
314
+ &::-webkit-details-marker {
315
+ display: none;
316
+ }
317
+
318
+ // Hide the marker in modern Firefox too
319
+ &::marker {
320
+ content: "";
321
+ }
322
+
323
+ &:hover {
324
+ color: var(--#{$prefix}primary);
325
+ }
326
+
327
+ // Right-side chevron, rotates on open
328
+ &::after {
329
+ position: absolute;
330
+ top: 50%;
331
+ right: 1.1rem;
332
+ display: inline-block;
333
+ width: .55rem;
334
+ height: .55rem;
335
+ margin-top: -.4rem;
336
+ content: "";
337
+ border-right: 2px solid currentcolor;
338
+ border-bottom: 2px solid currentcolor;
339
+ opacity: .55;
340
+ transform: rotate(45deg);
341
+ @include transition(transform .2s ease);
342
+ }
343
+ }
344
+
345
+ &[open] > summary {
346
+ color: var(--#{$prefix}primary);
347
+ border-bottom: 1px solid var(--#{$prefix}border-color);
348
+
349
+ &::after {
350
+ margin-top: -.15rem;
351
+ opacity: 1;
352
+ transform: rotate(-135deg);
353
+ }
354
+ }
355
+
356
+ // Content (everything after <summary>) gets the inner padding
357
+ > *:not(summary) {
358
+ padding-right: 1.1rem;
359
+ padding-left: 1.1rem;
360
+ }
361
+
362
+ > *:not(summary):first-of-type {
363
+ padding-top: 1rem;
364
+ }
365
+
366
+ > *:not(summary):last-child {
367
+ padding-bottom: 1rem;
368
+ }
369
+
370
+ // Tighten paragraphs/lists inside an FAQ answer
371
+ p,
372
+ ul,
373
+ ol {
374
+ margin-bottom: .65rem;
375
+ }
376
+
377
+ > *:last-child p:last-child,
378
+ > p:last-child,
379
+ > ul:last-child,
380
+ > ol:last-child {
381
+ margin-bottom: 0;
382
+ }
383
+
384
+ // Code blocks inside an FAQ answer get a less-distracting bg
385
+ pre.astro-code,
386
+ pre {
387
+ margin-right: 0;
388
+ margin-left: 0;
389
+ }
390
+ }
391
+ }
392
+
393
+ // Dark-mode tweak: blockquote info bg needs more contrast on dark
394
+ &[data-bs-theme="dark"],
395
+ [data-bs-theme="dark"] & {
396
+ .card > .card-body blockquote code {
397
+ background: rgba(255, 255, 255, .08);
398
+ }
399
+ }
400
+ }
401
+
402
+ //
403
+ // FAQ page — custom layout that breaks out of the standard docs card
404
+ // to give the FAQ a more distinctive visual identity. Opt in via
405
+ // body.faq-page (set in pages/docs/faq.astro).
406
+ //
407
+
408
+ .faq-page {
409
+ // The FAQ doesn't use the standard card wrapper used by other docs,
410
+ // so the container can stretch wider for the chip strip and section
411
+ // grid.
412
+ .app-content > .container-fluid {
413
+ max-width: 64rem;
414
+
415
+ @include media-breakpoint-up(xxl) {
416
+ max-width: 72rem;
417
+ }
418
+ }
419
+
420
+ // --- Hero -------------------------------------------------------------
421
+ .faq-hero {
422
+ position: relative;
423
+ padding: 3rem 1.5rem 2.5rem;
424
+ margin-top: 1rem;
425
+ overflow: hidden;
426
+ background: radial-gradient(ellipse at top left, rgba(var(--#{$prefix}primary-rgb), .12), transparent 60%), radial-gradient(ellipse at bottom right, rgba(var(--#{$prefix}info-rgb), .1), transparent 65%), var(--#{$prefix}body-bg);
427
+ border: 1px solid var(--#{$prefix}border-color);
428
+ @include border-radius($border-radius-xl);
429
+ }
430
+
431
+ .faq-hero-eyebrow {
432
+ display: inline-flex;
433
+ gap: .4rem;
434
+ align-items: center;
435
+ padding: .35rem .85rem;
436
+ margin-bottom: 1rem;
437
+ font-size: .75rem;
438
+ font-weight: 600;
439
+ color: var(--#{$prefix}primary);
440
+ text-transform: uppercase;
441
+ letter-spacing: .08em;
442
+ background: var(--#{$prefix}primary-bg-subtle);
443
+ border: 1px solid var(--#{$prefix}primary-border-subtle);
444
+ @include border-radius(50rem);
445
+
446
+ .bi {
447
+ font-size: .9rem;
448
+ }
449
+ }
450
+
451
+ .faq-hero-title {
452
+ margin: 0 0 .5rem;
453
+ font-size: 2.25rem;
454
+ font-weight: 700;
455
+ line-height: 1.15;
456
+ color: var(--#{$prefix}emphasis-color);
457
+
458
+ @include media-breakpoint-up(md) {
459
+ font-size: 2.75rem;
460
+ }
461
+ }
462
+
463
+ .faq-hero-lead {
464
+ max-width: 36rem;
465
+ margin: 0 auto 1.75rem;
466
+ font-size: 1.05rem;
467
+ line-height: 1.55;
468
+ color: var(--#{$prefix}secondary-color);
469
+ }
470
+
471
+ .faq-search {
472
+ position: relative;
473
+ max-width: 32rem;
474
+ margin: 0 auto;
475
+
476
+ .form-control {
477
+ height: 3rem;
478
+ padding-right: 3rem;
479
+ padding-left: 3rem;
480
+ font-size: 1rem;
481
+ background: var(--#{$prefix}body-bg);
482
+ @include border-radius(50rem);
483
+ @include transition(box-shadow .15s ease, border-color .15s ease);
484
+
485
+ &:focus {
486
+ box-shadow: 0 0 0 .25rem rgba(var(--#{$prefix}primary-rgb), .15);
487
+ }
488
+ }
489
+ }
490
+
491
+ .faq-search-icon {
492
+ position: absolute;
493
+ top: 50%;
494
+ left: 1.2rem;
495
+ color: var(--#{$prefix}secondary-color);
496
+ pointer-events: none;
497
+ transform: translateY(-50%);
498
+ }
499
+
500
+ .faq-search-clear {
501
+ position: absolute;
502
+ top: 50%;
503
+ right: .65rem;
504
+ display: inline-flex;
505
+ align-items: center;
506
+ justify-content: center;
507
+ width: 2rem;
508
+ height: 2rem;
509
+ padding: 0;
510
+ color: var(--#{$prefix}secondary-color);
511
+ background: var(--#{$prefix}tertiary-bg);
512
+ border: 0;
513
+ transform: translateY(-50%);
514
+ @include border-radius(50%);
515
+ @include transition(background .15s ease, color .15s ease);
516
+
517
+ &:hover {
518
+ color: var(--#{$prefix}body-color);
519
+ background: var(--#{$prefix}secondary-bg);
520
+ }
521
+ }
522
+
523
+ .faq-empty-state {
524
+ max-width: 32rem;
525
+ padding: 1rem;
526
+ margin: 1.5rem auto 0;
527
+ font-size: .95rem;
528
+ color: var(--#{$prefix}secondary-color);
529
+ background: var(--#{$prefix}tertiary-bg);
530
+ @include border-radius($border-radius);
531
+
532
+ .bi {
533
+ margin-right: .35rem;
534
+ }
535
+ }
536
+
537
+ // --- Section nav chips ------------------------------------------------
538
+ .faq-chips {
539
+ display: flex;
540
+ flex-wrap: wrap;
541
+ gap: .5rem;
542
+ justify-content: center;
543
+ }
544
+
545
+ .faq-chip {
546
+ display: inline-flex;
547
+ gap: .45rem;
548
+ align-items: center;
549
+ padding: .45rem .85rem;
550
+ font-size: .875rem;
551
+ font-weight: 500;
552
+ color: var(--#{$prefix}body-color);
553
+ text-decoration: none;
554
+ background: var(--#{$prefix}body-bg);
555
+ border: 1px solid var(--#{$prefix}border-color);
556
+ @include border-radius(50rem);
557
+ @include transition(transform .15s ease, border-color .15s ease, background-color .15s ease, color .15s ease);
558
+
559
+ &:hover {
560
+ color: var(--#{$prefix}emphasis-color);
561
+ background: var(--#{$prefix}tertiary-bg);
562
+ transform: translateY(-1px);
563
+ }
564
+
565
+ .bi {
566
+ font-size: 1rem;
567
+ }
568
+ }
569
+
570
+ .faq-chip-count {
571
+ padding: 0 .45rem;
572
+ font-size: .7rem;
573
+ font-weight: 600;
574
+ color: var(--#{$prefix}secondary-color);
575
+ background: var(--#{$prefix}tertiary-bg);
576
+ @include border-radius(50rem);
577
+ }
578
+
579
+ // Per-section chip accent on hover/active
580
+ @each $tone in (primary, info, warning, success, danger, secondary) {
581
+ .faq-chip-#{$tone}:hover {
582
+ color: var(--#{$prefix}#{$tone}-text-emphasis);
583
+ background: var(--#{$prefix}#{$tone}-bg-subtle);
584
+ border-color: var(--#{$prefix}#{$tone}-border-subtle);
585
+
586
+ .faq-chip-count {
587
+ color: var(--#{$prefix}#{$tone}-text-emphasis);
588
+ background: rgba(0, 0, 0, .06);
589
+ }
590
+ }
591
+ }
592
+
593
+ // --- Sections ---------------------------------------------------------
594
+ .faq-section {
595
+ margin-bottom: 2.5rem;
596
+ scroll-margin-top: 5rem;
597
+ }
598
+
599
+ .faq-section-header {
600
+ display: flex;
601
+ gap: 1rem;
602
+ align-items: center;
603
+ padding: 1rem 1.25rem;
604
+ margin-bottom: 1rem;
605
+ background: var(--#{$prefix}body-bg);
606
+ border: 1px solid var(--#{$prefix}border-color);
607
+ border-left: 4px solid var(--#{$prefix}primary);
608
+ @include border-radius($border-radius);
609
+ }
610
+
611
+ .faq-section-icon {
612
+ display: inline-flex;
613
+ flex-shrink: 0;
614
+ align-items: center;
615
+ justify-content: center;
616
+ width: 2.75rem;
617
+ height: 2.75rem;
618
+ font-size: 1.35rem;
619
+ color: var(--#{$prefix}primary);
620
+ background: var(--#{$prefix}primary-bg-subtle);
621
+ @include border-radius($border-radius);
622
+ }
623
+
624
+ .faq-section-title {
625
+ margin: 0;
626
+ font-size: 1.4rem;
627
+ font-weight: 600;
628
+ line-height: 1.2;
629
+ color: var(--#{$prefix}emphasis-color);
630
+ }
631
+
632
+ .faq-section-count {
633
+ margin: .1rem 0 0;
634
+ font-size: .8rem;
635
+ color: var(--#{$prefix}secondary-color);
636
+ }
637
+
638
+ // Per-section tone accents
639
+ @each $tone in (primary, info, warning, success, danger, secondary) {
640
+ .faq-section-#{$tone} {
641
+ border-left-color: var(--#{$prefix}#{$tone});
642
+
643
+ .faq-section-icon {
644
+ color: var(--#{$prefix}#{$tone}-text-emphasis);
645
+ background: var(--#{$prefix}#{$tone}-bg-subtle);
646
+ }
647
+ }
648
+ }
649
+
650
+ // --- FAQ items (override the generic .docs-page details styling) ------
651
+ .faq-section-items .faq-item {
652
+ margin-bottom: .5rem;
653
+ overflow: hidden;
654
+ background: var(--#{$prefix}body-bg);
655
+ border: 1px solid var(--#{$prefix}border-color);
656
+ @include border-radius($border-radius);
657
+ @include transition(border-color .15s ease, box-shadow .15s ease, transform .15s ease);
658
+
659
+ &:hover {
660
+ border-color: var(--#{$prefix}primary-border-subtle);
661
+ transform: translateX(2px);
662
+ }
663
+
664
+ &[open] {
665
+ border-color: var(--#{$prefix}primary-border-subtle);
666
+ box-shadow: 0 2px 8px rgba(0, 0, 0, .04);
667
+ transform: none;
668
+ }
669
+
670
+ summary {
671
+ display: flex;
672
+ gap: .85rem;
673
+ align-items: center;
674
+ padding: 1rem 1.25rem;
675
+ font-size: 1rem;
676
+ font-weight: 500;
677
+ color: var(--#{$prefix}emphasis-color);
678
+ list-style: none;
679
+ cursor: pointer;
680
+ user-select: none;
681
+
682
+ &::-webkit-details-marker {
683
+ display: none;
684
+ }
685
+
686
+ &::marker {
687
+ content: "";
688
+ }
689
+
690
+ &::after {
691
+ content: none; // disable the generic chevron, we use our own
692
+ }
693
+ }
694
+
695
+ .faq-q-icon {
696
+ display: inline-flex;
697
+ flex-shrink: 0;
698
+ align-items: center;
699
+ justify-content: center;
700
+ width: 1.75rem;
701
+ height: 1.75rem;
702
+ font-size: .85rem;
703
+ color: var(--#{$prefix}primary);
704
+ background: var(--#{$prefix}primary-bg-subtle);
705
+ @include border-radius(50%);
706
+ }
707
+
708
+ .faq-q-text {
709
+ flex-grow: 1;
710
+ }
711
+
712
+ .faq-q-chevron {
713
+ flex-shrink: 0;
714
+ color: var(--#{$prefix}secondary-color);
715
+ @include transition(transform .2s ease, color .2s ease);
716
+ }
717
+
718
+ &[open] .faq-q-chevron {
719
+ color: var(--#{$prefix}primary);
720
+ transform: rotate(180deg);
721
+ }
722
+
723
+ &[open] summary {
724
+ color: var(--#{$prefix}primary);
725
+ border-bottom: 1px solid var(--#{$prefix}border-color);
726
+ }
727
+
728
+ .faq-answer {
729
+ padding: 1.1rem 1.25rem 1.1rem 3.85rem; // align with the question text (icon + gap)
730
+ font-size: .95rem;
731
+ line-height: 1.65;
732
+ color: var(--#{$prefix}body-color);
733
+
734
+ p:last-child,
735
+ ul:last-child,
736
+ ol:last-child,
737
+ pre:last-child {
738
+ margin-bottom: 0;
739
+ }
740
+
741
+ a {
742
+ color: var(--#{$prefix}primary);
743
+ text-decoration: underline;
744
+ text-underline-offset: 2px;
745
+
746
+ &:hover {
747
+ text-decoration-thickness: 2px;
748
+ }
749
+ }
750
+
751
+ code {
752
+ padding: .12em .35em;
753
+ font-size: .875em;
754
+ color: var(--#{$prefix}emphasis-color);
755
+ background: var(--#{$prefix}tertiary-bg);
756
+ border: 1px solid var(--#{$prefix}border-color);
757
+ @include border-radius($border-radius-sm);
758
+ }
759
+
760
+ pre.astro-code,
761
+ pre {
762
+ padding: .85rem 1rem;
763
+ margin-top: .75rem;
764
+ margin-bottom: .75rem;
765
+ overflow-x: auto;
766
+ font-size: .85rem;
767
+ line-height: 1.55;
768
+ @include border-radius($border-radius-sm);
769
+
770
+ code {
771
+ padding: 0;
772
+ background: transparent;
773
+ border: 0;
774
+ }
775
+ }
776
+ }
777
+ }
778
+
779
+ // --- CTA footer -------------------------------------------------------
780
+ .faq-cta {
781
+ padding: 2.5rem 1.5rem;
782
+ text-align: center;
783
+ background: radial-gradient(ellipse at top, rgba(var(--#{$prefix}primary-rgb), .08), transparent 60%), var(--#{$prefix}body-bg);
784
+ border: 1px solid var(--#{$prefix}border-color);
785
+ @include border-radius($border-radius-xl);
786
+ }
787
+
788
+ .faq-cta-icon {
789
+ display: inline-flex;
790
+ align-items: center;
791
+ justify-content: center;
792
+ width: 3.5rem;
793
+ height: 3.5rem;
794
+ margin-bottom: 1rem;
795
+ font-size: 1.6rem;
796
+ color: var(--#{$prefix}primary);
797
+ background: var(--#{$prefix}primary-bg-subtle);
798
+ @include border-radius(50%);
799
+ }
800
+
801
+ .faq-cta h2 {
802
+ margin: 0 0 .5rem;
803
+ font-size: 1.5rem;
804
+ font-weight: 600;
805
+ color: var(--#{$prefix}emphasis-color);
806
+ }
807
+
808
+ .faq-cta p {
809
+ max-width: 32rem;
810
+ margin: 0 auto 1.5rem;
811
+ color: var(--#{$prefix}secondary-color);
812
+ }
813
+
814
+ .faq-cta-actions {
815
+ display: inline-flex;
816
+ flex-wrap: wrap;
817
+ gap: .5rem;
818
+ justify-content: center;
819
+ }
820
+ }