domma-cms 0.12.0 → 0.13.2
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.
|
@@ -299,7 +299,9 @@ Content goes here.
|
|
|
299
299
|
<tbody>
|
|
300
300
|
<tr>
|
|
301
301
|
<td><code>[card title="..."]...[/card]</code></td>
|
|
302
|
-
<td>Styled card
|
|
302
|
+
<td>Styled card. Supports 6 variants, ~44 gradients and 33 layouts — see the
|
|
303
|
+
<strong>Cards</strong> subsection below.
|
|
304
|
+
</td>
|
|
303
305
|
</tr>
|
|
304
306
|
<tr>
|
|
305
307
|
<td><code>[tabs]...[/tabs]</code></td>
|
|
@@ -338,6 +340,530 @@ Content goes here.
|
|
|
338
340
|
</tbody>
|
|
339
341
|
</table>
|
|
340
342
|
|
|
343
|
+
<h3>Cards — variants, gradients & layouts</h3>
|
|
344
|
+
<p>The <code>[card]</code> shortcode is the most configurable component in the system. It has three
|
|
345
|
+
layers you can mix freely: <strong>variant</strong> (the overall visual style), <strong>gradient</strong>
|
|
346
|
+
(colour palette, used with <code>variant="gradient"</code> or any layout that accepts a gradient),
|
|
347
|
+
and <strong>layout</strong> (the internal structure — header/body/footer, image position, sub-tags,
|
|
348
|
+
etc.). Every layout accepts every variant, gradient and universal attribute listed below.</p>
|
|
349
|
+
<pre><code>[card variant="gradient" gradient="ocean" layout="icon-top" icon="star" title="Fast"]
|
|
350
|
+
Body content in **Markdown** is supported.
|
|
351
|
+
[/card]</code></pre>
|
|
352
|
+
|
|
353
|
+
<h4>Variants</h4>
|
|
354
|
+
<table class="table table-sm">
|
|
355
|
+
<thead>
|
|
356
|
+
<tr>
|
|
357
|
+
<th>Variant</th>
|
|
358
|
+
<th>Description</th>
|
|
359
|
+
</tr>
|
|
360
|
+
</thead>
|
|
361
|
+
<tbody>
|
|
362
|
+
<tr>
|
|
363
|
+
<td><code>clean</code></td>
|
|
364
|
+
<td>Flat, minimal chrome — no border, subtle background</td>
|
|
365
|
+
</tr>
|
|
366
|
+
<tr>
|
|
367
|
+
<td><code>gradient</code></td>
|
|
368
|
+
<td>Coloured gradient background (see Gradients below). Pair with <code>gradient="name"</code>
|
|
369
|
+
</td>
|
|
370
|
+
</tr>
|
|
371
|
+
<tr>
|
|
372
|
+
<td><code>glass</code></td>
|
|
373
|
+
<td>Frosted glass / backdrop-blur effect, translucent background</td>
|
|
374
|
+
</tr>
|
|
375
|
+
<tr>
|
|
376
|
+
<td><code>accent</code></td>
|
|
377
|
+
<td>Primary-colour accent border on the left edge</td>
|
|
378
|
+
</tr>
|
|
379
|
+
<tr>
|
|
380
|
+
<td><code>dark</code></td>
|
|
381
|
+
<td>Dark background with inverted text — good on light pages</td>
|
|
382
|
+
</tr>
|
|
383
|
+
<tr>
|
|
384
|
+
<td><code>glow</code></td>
|
|
385
|
+
<td>Subtle halo / outer glow effect</td>
|
|
386
|
+
</tr>
|
|
387
|
+
<tr>
|
|
388
|
+
<td><code>primary</code></td>
|
|
389
|
+
<td>Legacy alias — adds <code>card-primary</code> class for backwards compatibility</td>
|
|
390
|
+
</tr>
|
|
391
|
+
</tbody>
|
|
392
|
+
</table>
|
|
393
|
+
|
|
394
|
+
<h4>Built-in gradients</h4>
|
|
395
|
+
<p>Shipped in <code>public/css/</code> — available on every install. Default when
|
|
396
|
+
<code>gradient</code> is omitted: <code>indigo</code>.</p>
|
|
397
|
+
<p><code>arctic</code>, <code>aurora</code>, <code>dusk</code>, <code>fire</code>, <code>forest</code>,
|
|
398
|
+
<code>gold</code>, <code>indigo</code>, <code>lagoon</code>, <code>lime</code>,
|
|
399
|
+
<code>midnight</code>, <code>ocean</code>, <code>rose</code>, <code>slate</code>,
|
|
400
|
+
<code>sunset</code></p>
|
|
401
|
+
|
|
402
|
+
<h4>Project-specific gradients</h4>
|
|
403
|
+
<p>Defined in <code>content/custom.css</code> on this site only — fresh installs will not have
|
|
404
|
+
these unless the CSS is copied over.</p>
|
|
405
|
+
<p><strong>Single-tone:</strong> <code>purple</code>, <code>blue</code>, <code>green</code>,
|
|
406
|
+
<code>night</code></p>
|
|
407
|
+
<p><strong>Theme · light pairs:</strong> <code>ocean-light</code>, <code>forest-light</code>,
|
|
408
|
+
<code>sunset-light</code>, <code>royal-light</code>, <code>lemon-light</code>,
|
|
409
|
+
<code>silver-light</code>, <code>charcoal-light</code>, <code>christmas-light</code>,
|
|
410
|
+
<code>unicorn-light</code>, <code>dreamy-light</code>, <code>grayve-light</code>,
|
|
411
|
+
<code>mint-light</code>, <code>wedding-light</code></p>
|
|
412
|
+
<p><strong>Theme · dark pairs:</strong> <code>ocean-dark</code>, <code>forest-dark</code>,
|
|
413
|
+
<code>sunset-dark</code>, <code>royal-dark</code>, <code>lemon-dark</code>,
|
|
414
|
+
<code>silver-dark</code>, <code>charcoal-dark</code>, <code>christmas-dark</code>,
|
|
415
|
+
<code>unicorn-dark</code>, <code>dreamy-dark</code>, <code>grayve-dark</code>,
|
|
416
|
+
<code>mint-dark</code>, <code>wedding-dark</code></p>
|
|
417
|
+
<p class="text-muted"><small>Gradient names are not validated — a typo falls through to the
|
|
418
|
+
default background with no warning. Use <code>/test-card-gradients</code> to preview every
|
|
419
|
+
palette.</small></p>
|
|
420
|
+
|
|
421
|
+
<h4>Universal attributes</h4>
|
|
422
|
+
<p>These work on any layout and any variant.</p>
|
|
423
|
+
<table class="table table-sm">
|
|
424
|
+
<thead>
|
|
425
|
+
<tr>
|
|
426
|
+
<th>Attribute</th>
|
|
427
|
+
<th>Values</th>
|
|
428
|
+
<th>Purpose</th>
|
|
429
|
+
</tr>
|
|
430
|
+
</thead>
|
|
431
|
+
<tbody>
|
|
432
|
+
<tr>
|
|
433
|
+
<td><code>title</code></td>
|
|
434
|
+
<td>string</td>
|
|
435
|
+
<td>Card heading (most layouts)</td>
|
|
436
|
+
</tr>
|
|
437
|
+
<tr>
|
|
438
|
+
<td><code>subtitle</code></td>
|
|
439
|
+
<td>string</td>
|
|
440
|
+
<td>Secondary heading (many layouts re-use it as date / role / plan)</td>
|
|
441
|
+
</tr>
|
|
442
|
+
<tr>
|
|
443
|
+
<td><code>icon</code></td>
|
|
444
|
+
<td>icon name</td>
|
|
445
|
+
<td>Domma icon (see Icons view)</td>
|
|
446
|
+
</tr>
|
|
447
|
+
<tr>
|
|
448
|
+
<td><code>footer</code></td>
|
|
449
|
+
<td>string</td>
|
|
450
|
+
<td>Footer text (also used by <code>pricing</code> as the CTA label)</td>
|
|
451
|
+
</tr>
|
|
452
|
+
<tr>
|
|
453
|
+
<td><code>image</code></td>
|
|
454
|
+
<td>URL</td>
|
|
455
|
+
<td>Background image for image / media layouts</td>
|
|
456
|
+
</tr>
|
|
457
|
+
<tr>
|
|
458
|
+
<td><code>collapsible</code></td>
|
|
459
|
+
<td><code>true</code></td>
|
|
460
|
+
<td>Body toggles open/closed via click on the header</td>
|
|
461
|
+
</tr>
|
|
462
|
+
<tr>
|
|
463
|
+
<td><code>hover</code></td>
|
|
464
|
+
<td>boolean flag</td>
|
|
465
|
+
<td>Raises the card on mouse-over</td>
|
|
466
|
+
</tr>
|
|
467
|
+
<tr>
|
|
468
|
+
<td><code>borderless</code></td>
|
|
469
|
+
<td>boolean flag</td>
|
|
470
|
+
<td>Removes the card border</td>
|
|
471
|
+
</tr>
|
|
472
|
+
<tr>
|
|
473
|
+
<td><code>shadow</code></td>
|
|
474
|
+
<td><code>none</code> · <code>md</code> · <code>lg</code></td>
|
|
475
|
+
<td>Drop-shadow depth</td>
|
|
476
|
+
</tr>
|
|
477
|
+
<tr>
|
|
478
|
+
<td><code>rounded</code></td>
|
|
479
|
+
<td><code>none</code> · <code>sm</code> · <code>lg</code> ·
|
|
480
|
+
<code>full</code></td>
|
|
481
|
+
<td>Corner radius</td>
|
|
482
|
+
</tr>
|
|
483
|
+
<tr>
|
|
484
|
+
<td><code>padding</code></td>
|
|
485
|
+
<td><code>compact</code> · <code>spacious</code></td>
|
|
486
|
+
<td>Internal spacing</td>
|
|
487
|
+
</tr>
|
|
488
|
+
<tr>
|
|
489
|
+
<td><code>text-align</code></td>
|
|
490
|
+
<td><code>center</code> · <code>right</code></td>
|
|
491
|
+
<td>Body text alignment (default left)</td>
|
|
492
|
+
</tr>
|
|
493
|
+
<tr>
|
|
494
|
+
<td><code>font</code></td>
|
|
495
|
+
<td><code>serif</code> · <code>mono</code></td>
|
|
496
|
+
<td>Override card typeface</td>
|
|
497
|
+
</tr>
|
|
498
|
+
<tr>
|
|
499
|
+
<td><code>font-size</code></td>
|
|
500
|
+
<td><code>sm</code> · <code>lg</code> · <code>xl</code></td>
|
|
501
|
+
<td>Override card body text size</td>
|
|
502
|
+
</tr>
|
|
503
|
+
<tr>
|
|
504
|
+
<td><code>class</code></td>
|
|
505
|
+
<td>string</td>
|
|
506
|
+
<td>Extra CSS classes appended to the root element</td>
|
|
507
|
+
</tr>
|
|
508
|
+
<tr>
|
|
509
|
+
<td><code>id</code></td>
|
|
510
|
+
<td>string</td>
|
|
511
|
+
<td>DOM id (useful for anchor links / dconfig targets)</td>
|
|
512
|
+
</tr>
|
|
513
|
+
</tbody>
|
|
514
|
+
</table>
|
|
515
|
+
|
|
516
|
+
<h4>Layouts</h4>
|
|
517
|
+
<p>Select a layout with <code>layout="name"</code>. If omitted, the card uses a simple body-only
|
|
518
|
+
layout. Layouts marked <em>(needs sub-tags)</em> will render empty without their child tags.</p>
|
|
519
|
+
|
|
520
|
+
<h5>Structural</h5>
|
|
521
|
+
<table class="table table-sm">
|
|
522
|
+
<thead>
|
|
523
|
+
<tr>
|
|
524
|
+
<th>Layout</th>
|
|
525
|
+
<th>Attributes</th>
|
|
526
|
+
<th>Purpose</th>
|
|
527
|
+
</tr>
|
|
528
|
+
</thead>
|
|
529
|
+
<tbody>
|
|
530
|
+
<tr>
|
|
531
|
+
<td><code>basic</code></td>
|
|
532
|
+
<td><code>footer</code></td>
|
|
533
|
+
<td>Body-only card, optional footer</td>
|
|
534
|
+
</tr>
|
|
535
|
+
<tr>
|
|
536
|
+
<td><code>header-body</code></td>
|
|
537
|
+
<td><code>title</code></td>
|
|
538
|
+
<td>Header with title + body</td>
|
|
539
|
+
</tr>
|
|
540
|
+
<tr>
|
|
541
|
+
<td><code>header-body-footer</code></td>
|
|
542
|
+
<td><code>title</code>, <code>footer</code></td>
|
|
543
|
+
<td>Classic three-zone card</td>
|
|
544
|
+
</tr>
|
|
545
|
+
<tr>
|
|
546
|
+
<td><code>no-header-footer</code></td>
|
|
547
|
+
<td><code>footer</code></td>
|
|
548
|
+
<td>Body + footer only</td>
|
|
549
|
+
</tr>
|
|
550
|
+
</tbody>
|
|
551
|
+
</table>
|
|
552
|
+
|
|
553
|
+
<h5>Icon headers</h5>
|
|
554
|
+
<table class="table table-sm">
|
|
555
|
+
<thead>
|
|
556
|
+
<tr>
|
|
557
|
+
<th>Layout</th>
|
|
558
|
+
<th>Attributes</th>
|
|
559
|
+
<th>Purpose</th>
|
|
560
|
+
</tr>
|
|
561
|
+
</thead>
|
|
562
|
+
<tbody>
|
|
563
|
+
<tr>
|
|
564
|
+
<td><code>icon-top</code></td>
|
|
565
|
+
<td><code>icon</code>, <code>title</code>, <code>subtitle</code></td>
|
|
566
|
+
<td>Large centred icon above title — good for feature grids</td>
|
|
567
|
+
</tr>
|
|
568
|
+
<tr>
|
|
569
|
+
<td><code>icon-inline</code></td>
|
|
570
|
+
<td><code>icon</code>, <code>title</code>, <code>subtitle</code></td>
|
|
571
|
+
<td>Icon sits to the left of the title in the header row</td>
|
|
572
|
+
</tr>
|
|
573
|
+
</tbody>
|
|
574
|
+
</table>
|
|
575
|
+
|
|
576
|
+
<h5>Image</h5>
|
|
577
|
+
<table class="table table-sm">
|
|
578
|
+
<thead>
|
|
579
|
+
<tr>
|
|
580
|
+
<th>Layout</th>
|
|
581
|
+
<th>Attributes</th>
|
|
582
|
+
<th>Purpose</th>
|
|
583
|
+
</tr>
|
|
584
|
+
</thead>
|
|
585
|
+
<tbody>
|
|
586
|
+
<tr>
|
|
587
|
+
<td><code>image-top</code></td>
|
|
588
|
+
<td><code>image</code>, <code>title</code></td>
|
|
589
|
+
<td>Image banner above header + body</td>
|
|
590
|
+
</tr>
|
|
591
|
+
<tr>
|
|
592
|
+
<td><code>image-overlay</code></td>
|
|
593
|
+
<td><code>image</code>, <code>title</code></td>
|
|
594
|
+
<td>Title overlaid on the image with a tint</td>
|
|
595
|
+
</tr>
|
|
596
|
+
<tr>
|
|
597
|
+
<td><code>thumb-left</code></td>
|
|
598
|
+
<td><code>image</code>, <code>title</code></td>
|
|
599
|
+
<td>Square thumbnail on the left, body on the right</td>
|
|
600
|
+
</tr>
|
|
601
|
+
<tr>
|
|
602
|
+
<td><code>thumb-right</code></td>
|
|
603
|
+
<td><code>image</code>, <code>title</code></td>
|
|
604
|
+
<td>Mirror of <code>thumb-left</code></td>
|
|
605
|
+
</tr>
|
|
606
|
+
<tr>
|
|
607
|
+
<td><code>wide-left-image</code></td>
|
|
608
|
+
<td><code>image</code>, <code>title</code>, <code>footer</code></td>
|
|
609
|
+
<td>Horizontal card, wider image strip on the left</td>
|
|
610
|
+
</tr>
|
|
611
|
+
<tr>
|
|
612
|
+
<td><code>full-bg</code></td>
|
|
613
|
+
<td><code>image</code>, <code>title</code></td>
|
|
614
|
+
<td>Full-bleed image backdrop with body text over it</td>
|
|
615
|
+
</tr>
|
|
616
|
+
<tr>
|
|
617
|
+
<td><code>split-half</code></td>
|
|
618
|
+
<td><code>image</code>, <code>gradient</code>, <code>title</code></td>
|
|
619
|
+
<td>Half gradient (or image) on the left, content on the right</td>
|
|
620
|
+
</tr>
|
|
621
|
+
</tbody>
|
|
622
|
+
</table>
|
|
623
|
+
|
|
624
|
+
<h5>Media</h5>
|
|
625
|
+
<table class="table table-sm">
|
|
626
|
+
<thead>
|
|
627
|
+
<tr>
|
|
628
|
+
<th>Layout</th>
|
|
629
|
+
<th>Attributes</th>
|
|
630
|
+
<th>Purpose</th>
|
|
631
|
+
</tr>
|
|
632
|
+
</thead>
|
|
633
|
+
<tbody>
|
|
634
|
+
<tr>
|
|
635
|
+
<td><code>video-media</code></td>
|
|
636
|
+
<td><code>image</code> (poster), <code>duration</code>, <code>title</code></td>
|
|
637
|
+
<td>Video thumbnail with a play button and duration badge</td>
|
|
638
|
+
</tr>
|
|
639
|
+
<tr>
|
|
640
|
+
<td><code>location-map</code></td>
|
|
641
|
+
<td><code>address</code>, <code>title</code></td>
|
|
642
|
+
<td>Placeholder map panel + address block (static — no live map)</td>
|
|
643
|
+
</tr>
|
|
644
|
+
</tbody>
|
|
645
|
+
</table>
|
|
646
|
+
|
|
647
|
+
<h5>People & social proof</h5>
|
|
648
|
+
<table class="table table-sm">
|
|
649
|
+
<thead>
|
|
650
|
+
<tr>
|
|
651
|
+
<th>Layout</th>
|
|
652
|
+
<th>Attributes</th>
|
|
653
|
+
<th>Purpose</th>
|
|
654
|
+
</tr>
|
|
655
|
+
</thead>
|
|
656
|
+
<tbody>
|
|
657
|
+
<tr>
|
|
658
|
+
<td><code>avatar-profile</code></td>
|
|
659
|
+
<td><code>icon</code>, <code>title</code>, <code>subtitle</code>,
|
|
660
|
+
<code>tags</code> (comma-separated)
|
|
661
|
+
</td>
|
|
662
|
+
<td>Circular avatar + name + role + pill tags — team / author cards</td>
|
|
663
|
+
</tr>
|
|
664
|
+
<tr>
|
|
665
|
+
<td><code>quote-testimonial</code></td>
|
|
666
|
+
<td><code>title</code> (author), <code>subtitle</code> (role)</td>
|
|
667
|
+
<td>Quotation mark + body quote + author attribution row</td>
|
|
668
|
+
</tr>
|
|
669
|
+
<tr>
|
|
670
|
+
<td><code>rating-review</code></td>
|
|
671
|
+
<td><code>rating</code> (0–5), <code>title</code>, <code>subtitle</code>,
|
|
672
|
+
<code>verified</code> (flag)
|
|
673
|
+
</td>
|
|
674
|
+
<td>Star rating + review body + reviewer attribution</td>
|
|
675
|
+
</tr>
|
|
676
|
+
</tbody>
|
|
677
|
+
</table>
|
|
678
|
+
|
|
679
|
+
<h5>Metrics & data</h5>
|
|
680
|
+
<table class="table table-sm">
|
|
681
|
+
<thead>
|
|
682
|
+
<tr>
|
|
683
|
+
<th>Layout</th>
|
|
684
|
+
<th>Attributes</th>
|
|
685
|
+
<th>Purpose</th>
|
|
686
|
+
</tr>
|
|
687
|
+
</thead>
|
|
688
|
+
<tbody>
|
|
689
|
+
<tr>
|
|
690
|
+
<td><code>stat-metric</code></td>
|
|
691
|
+
<td><code>title</code> (label), <code>value</code>, <code>delta</code>,
|
|
692
|
+
<code>progress</code> (0–100)
|
|
693
|
+
</td>
|
|
694
|
+
<td>Big-number KPI tile with delta arrow and optional progress bar</td>
|
|
695
|
+
</tr>
|
|
696
|
+
<tr>
|
|
697
|
+
<td><code>progress-goal</code> <em>(needs sub-tags)</em></td>
|
|
698
|
+
<td><code>title</code>, <code>subtitle</code>, <code>progress</code>; child
|
|
699
|
+
<code>[milestone done]...[/milestone]</code>
|
|
700
|
+
</td>
|
|
701
|
+
<td>Progress bar + milestone checklist</td>
|
|
702
|
+
</tr>
|
|
703
|
+
<tr>
|
|
704
|
+
<td><code>activity-feed</code> <em>(needs sub-tags)</em></td>
|
|
705
|
+
<td><code>title</code>; child
|
|
706
|
+
<code>[activity user="..." action="..." time="..." /]</code>
|
|
707
|
+
</td>
|
|
708
|
+
<td>User activity list with initials avatars and timestamps</td>
|
|
709
|
+
</tr>
|
|
710
|
+
</tbody>
|
|
711
|
+
</table>
|
|
712
|
+
|
|
713
|
+
<h5>Markers & callouts</h5>
|
|
714
|
+
<table class="table table-sm">
|
|
715
|
+
<thead>
|
|
716
|
+
<tr>
|
|
717
|
+
<th>Layout</th>
|
|
718
|
+
<th>Attributes</th>
|
|
719
|
+
<th>Purpose</th>
|
|
720
|
+
</tr>
|
|
721
|
+
</thead>
|
|
722
|
+
<tbody>
|
|
723
|
+
<tr>
|
|
724
|
+
<td><code>callout</code></td>
|
|
725
|
+
<td><code>callout-type</code> (<code>info</code>/<code>warn</code>/<code>success</code>/<code>error</code>),
|
|
726
|
+
<code>icon</code>, <code>title</code>
|
|
727
|
+
</td>
|
|
728
|
+
<td>Coloured inline notice / tip box</td>
|
|
729
|
+
</tr>
|
|
730
|
+
<tr>
|
|
731
|
+
<td><code>step-numbered</code></td>
|
|
732
|
+
<td><code>step</code> (number), <code>title</code>, <code>gradient</code></td>
|
|
733
|
+
<td>Numbered step for tutorials / walkthroughs</td>
|
|
734
|
+
</tr>
|
|
735
|
+
<tr>
|
|
736
|
+
<td><code>corner-badge</code></td>
|
|
737
|
+
<td><code>badge</code> (label), <code>icon</code>, <code>title</code></td>
|
|
738
|
+
<td>Card with a ribbon-style badge in the top-right corner</td>
|
|
739
|
+
</tr>
|
|
740
|
+
<tr>
|
|
741
|
+
<td><code>badge-band</code></td>
|
|
742
|
+
<td><code>badge</code>, <code>icon</code>, <code>gradient</code>, <code>title</code></td>
|
|
743
|
+
<td>Full-width coloured band across the top with a label and icon</td>
|
|
744
|
+
</tr>
|
|
745
|
+
<tr>
|
|
746
|
+
<td><code>tag-cloud</code></td>
|
|
747
|
+
<td><code>title</code>, <code>tags</code> (comma-separated)</td>
|
|
748
|
+
<td>Coloured pill list — topic tags, skills, categories</td>
|
|
749
|
+
</tr>
|
|
750
|
+
<tr>
|
|
751
|
+
<td><code>timeline-entry</code></td>
|
|
752
|
+
<td><code>title</code>, <code>subtitle</code> (date), <code>badge</code> (tag)</td>
|
|
753
|
+
<td>Single dot-on-line timeline entry — stack several for a history list</td>
|
|
754
|
+
</tr>
|
|
755
|
+
</tbody>
|
|
756
|
+
</table>
|
|
757
|
+
|
|
758
|
+
<h5>Commerce & comparison</h5>
|
|
759
|
+
<table class="table table-sm">
|
|
760
|
+
<thead>
|
|
761
|
+
<tr>
|
|
762
|
+
<th>Layout</th>
|
|
763
|
+
<th>Attributes & sub-tags</th>
|
|
764
|
+
<th>Purpose</th>
|
|
765
|
+
</tr>
|
|
766
|
+
</thead>
|
|
767
|
+
<tbody>
|
|
768
|
+
<tr>
|
|
769
|
+
<td><code>pricing</code> <em>(needs sub-tags)</em></td>
|
|
770
|
+
<td><code>title</code>, <code>price</code>, <code>period</code>, <code>gradient</code>,
|
|
771
|
+
<code>footer</code> (CTA label); child <code>[feature]...[/feature]</code>
|
|
772
|
+
</td>
|
|
773
|
+
<td>Pricing tier card with gradient header, feature list and CTA link</td>
|
|
774
|
+
</tr>
|
|
775
|
+
<tr>
|
|
776
|
+
<td><code>feature-comparison</code> <em>(needs sub-tags)</em></td>
|
|
777
|
+
<td><code>title</code>, <code>subtitle</code> (plan), <code>gradient</code>; child
|
|
778
|
+
<code>[feature]text[/feature]</code> or <code>[feature excluded]text[/feature]</code>
|
|
779
|
+
</td>
|
|
780
|
+
<td>Plan comparison rows with tick / cross marks</td>
|
|
781
|
+
</tr>
|
|
782
|
+
<tr>
|
|
783
|
+
<td><code>before-after</code> <em>(needs sub-tags)</em></td>
|
|
784
|
+
<td><code>title</code>; children
|
|
785
|
+
<code>[before]item · item[/before]</code> and
|
|
786
|
+
<code>[after]item · item[/after]</code> (items split on <code>·</code> or
|
|
787
|
+
newline)
|
|
788
|
+
</td>
|
|
789
|
+
<td>Two-column before/after comparison list</td>
|
|
790
|
+
</tr>
|
|
791
|
+
</tbody>
|
|
792
|
+
</table>
|
|
793
|
+
|
|
794
|
+
<h5>Special & utility</h5>
|
|
795
|
+
<table class="table table-sm">
|
|
796
|
+
<thead>
|
|
797
|
+
<tr>
|
|
798
|
+
<th>Layout</th>
|
|
799
|
+
<th>Attributes</th>
|
|
800
|
+
<th>Purpose</th>
|
|
801
|
+
</tr>
|
|
802
|
+
</thead>
|
|
803
|
+
<tbody>
|
|
804
|
+
<tr>
|
|
805
|
+
<td><code>glass-gradient-border</code></td>
|
|
806
|
+
<td><code>title</code></td>
|
|
807
|
+
<td>Frosted glass card with a gradient border ring. <strong>Note:</strong> this layout
|
|
808
|
+
bypasses <code>cardVariantClasses</code>, so universal variant / gradient / shadow
|
|
809
|
+
attributes do not apply.
|
|
810
|
+
</td>
|
|
811
|
+
</tr>
|
|
812
|
+
<tr>
|
|
813
|
+
<td><code>code-snippet</code></td>
|
|
814
|
+
<td><code>lang</code> (label); body is rendered as escaped code</td>
|
|
815
|
+
<td>Code block with language label header</td>
|
|
816
|
+
</tr>
|
|
817
|
+
<tr>
|
|
818
|
+
<td><code>file-document</code></td>
|
|
819
|
+
<td><code>filename</code>, <code>filesize</code>, <code>filetype</code>, <code>title</code>
|
|
820
|
+
</td>
|
|
821
|
+
<td>File attachment row with type icon and download link (link href is placeholder)</td>
|
|
822
|
+
</tr>
|
|
823
|
+
</tbody>
|
|
824
|
+
</table>
|
|
825
|
+
|
|
826
|
+
<h4>Sub-tag reference</h4>
|
|
827
|
+
<p>These are child tags accepted by specific layouts — they are not shortcodes in their own right
|
|
828
|
+
and only render inside a matching parent card.</p>
|
|
829
|
+
<table class="table table-sm">
|
|
830
|
+
<thead>
|
|
831
|
+
<tr>
|
|
832
|
+
<th>Sub-tag</th>
|
|
833
|
+
<th>Parent layout</th>
|
|
834
|
+
<th>Attributes</th>
|
|
835
|
+
</tr>
|
|
836
|
+
</thead>
|
|
837
|
+
<tbody>
|
|
838
|
+
<tr>
|
|
839
|
+
<td><code>[feature]text[/feature]</code></td>
|
|
840
|
+
<td><code>pricing</code>, <code>feature-comparison</code></td>
|
|
841
|
+
<td><code>excluded</code> (flag, comparison only) — renders as a cross instead of a tick
|
|
842
|
+
</td>
|
|
843
|
+
</tr>
|
|
844
|
+
<tr>
|
|
845
|
+
<td><code>[before]a · b · c[/before]</code></td>
|
|
846
|
+
<td><code>before-after</code></td>
|
|
847
|
+
<td>Items split on <code>·</code> or newline</td>
|
|
848
|
+
</tr>
|
|
849
|
+
<tr>
|
|
850
|
+
<td><code>[after]a · b · c[/after]</code></td>
|
|
851
|
+
<td><code>before-after</code></td>
|
|
852
|
+
<td>Items split on <code>·</code> or newline</td>
|
|
853
|
+
</tr>
|
|
854
|
+
<tr>
|
|
855
|
+
<td><code>[activity user="..." action="..." time="..." /]</code></td>
|
|
856
|
+
<td><code>activity-feed</code></td>
|
|
857
|
+
<td>Self-closing; one row per tag</td>
|
|
858
|
+
</tr>
|
|
859
|
+
<tr>
|
|
860
|
+
<td><code>[milestone done]text[/milestone]</code></td>
|
|
861
|
+
<td><code>progress-goal</code></td>
|
|
862
|
+
<td><code>done</code> (flag) — filled dot if present, hollow otherwise</td>
|
|
863
|
+
</tr>
|
|
864
|
+
</tbody>
|
|
865
|
+
</table>
|
|
866
|
+
|
|
341
867
|
<h3>Content</h3>
|
|
342
868
|
<table class="table table-sm">
|
|
343
869
|
<thead>
|
|
@@ -362,7 +888,90 @@ Content goes here.
|
|
|
362
888
|
</tr>
|
|
363
889
|
<tr>
|
|
364
890
|
<td><code>[collection slug="..." display="table" /]</code></td>
|
|
365
|
-
<td>Renders collection entries inline (table, cards, or
|
|
891
|
+
<td>Renders collection entries inline (table, cards, list, accordion, or block)</td>
|
|
892
|
+
</tr>
|
|
893
|
+
</tbody>
|
|
894
|
+
</table>
|
|
895
|
+
|
|
896
|
+
<h4>Collection attributes</h4>
|
|
897
|
+
<table class="table table-sm">
|
|
898
|
+
<thead>
|
|
899
|
+
<tr>
|
|
900
|
+
<th>Attribute</th>
|
|
901
|
+
<th>Values</th>
|
|
902
|
+
<th>Purpose</th>
|
|
903
|
+
</tr>
|
|
904
|
+
</thead>
|
|
905
|
+
<tbody>
|
|
906
|
+
<tr>
|
|
907
|
+
<td><code>slug</code></td>
|
|
908
|
+
<td>collection slug</td>
|
|
909
|
+
<td>Required. Which collection to render.</td>
|
|
910
|
+
</tr>
|
|
911
|
+
<tr>
|
|
912
|
+
<td><code>display</code></td>
|
|
913
|
+
<td><code>table</code> · <code>cards</code> · <code>list</code> ·
|
|
914
|
+
<code>accordion</code> · <code>block</code></td>
|
|
915
|
+
<td>How to render each entry. Default <code>table</code>.</td>
|
|
916
|
+
</tr>
|
|
917
|
+
<tr>
|
|
918
|
+
<td><code>block</code></td>
|
|
919
|
+
<td>block template name</td>
|
|
920
|
+
<td>Required when <code>display="block"</code>. Names a template in
|
|
921
|
+
<code>content/blocks/<name>.html</code> whose
|
|
922
|
+
<code>{{field}}</code> placeholders get substituted per entry.
|
|
923
|
+
</td>
|
|
924
|
+
</tr>
|
|
925
|
+
<tr>
|
|
926
|
+
<td><code>cols</code></td>
|
|
927
|
+
<td><code>2</code> · <code>3</code> · <code>4</code> · <code>5</code>
|
|
928
|
+
· <code>6</code></td>
|
|
929
|
+
<td>Grid column count when <code>display="block"</code>.</td>
|
|
930
|
+
</tr>
|
|
931
|
+
<tr>
|
|
932
|
+
<td><code>where</code></td>
|
|
933
|
+
<td><code>field=value</code> or<br><code>f1=v1,f2=v2</code></td>
|
|
934
|
+
<td>Row filter (simple equality only, AND'd across comma-separated predicates). Example:
|
|
935
|
+
<code>where="tab=developers"</code> or
|
|
936
|
+
<code>where="tier=free,featured=true"</code>. No OR, no comparison operators —
|
|
937
|
+
use a saved View for anything more complex.
|
|
938
|
+
</td>
|
|
939
|
+
</tr>
|
|
940
|
+
<tr>
|
|
941
|
+
<td><code>sort</code></td>
|
|
942
|
+
<td>field name or <code>createdAt</code></td>
|
|
943
|
+
<td>Sort field. Default <code>createdAt</code>.</td>
|
|
944
|
+
</tr>
|
|
945
|
+
<tr>
|
|
946
|
+
<td><code>order</code></td>
|
|
947
|
+
<td><code>asc</code> · <code>desc</code></td>
|
|
948
|
+
<td>Sort direction. Default <code>desc</code>.</td>
|
|
949
|
+
</tr>
|
|
950
|
+
<tr>
|
|
951
|
+
<td><code>limit</code></td>
|
|
952
|
+
<td>integer</td>
|
|
953
|
+
<td>Maximum number of entries to render. 0 or omitted = all.</td>
|
|
954
|
+
</tr>
|
|
955
|
+
<tr>
|
|
956
|
+
<td><code>fields</code></td>
|
|
957
|
+
<td>comma-separated field names</td>
|
|
958
|
+
<td>Column filter — only these fields are shown (table/cards/list displays only).
|
|
959
|
+
</td>
|
|
960
|
+
</tr>
|
|
961
|
+
<tr>
|
|
962
|
+
<td><code>title-field</code></td>
|
|
963
|
+
<td>field name</td>
|
|
964
|
+
<td>Which field to use as the entry title (cards/accordion displays).</td>
|
|
965
|
+
</tr>
|
|
966
|
+
<tr>
|
|
967
|
+
<td><code>empty</code></td>
|
|
968
|
+
<td>string</td>
|
|
969
|
+
<td>Message shown when the filter matches no entries.</td>
|
|
970
|
+
</tr>
|
|
971
|
+
<tr>
|
|
972
|
+
<td><code>cta</code></td>
|
|
973
|
+
<td>action slug</td>
|
|
974
|
+
<td>Attach a CMS Action button to each rendered entry. See CTA attributes below.</td>
|
|
366
975
|
</tr>
|
|
367
976
|
</tbody>
|
|
368
977
|
</table>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "domma-cms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.2",
|
|
4
4
|
"description": "File-based CMS powered by Domma and Fastify. Run npx domma-cms my-site to create a new project.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "server/server.js",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"@fastify/rate-limit": "^10.3.0",
|
|
73
73
|
"@fastify/static": "^8.1.0",
|
|
74
74
|
"bcryptjs": "^3.0.3",
|
|
75
|
-
"domma-js": "^0.22.
|
|
75
|
+
"domma-js": "^0.22.2",
|
|
76
76
|
"dotenv": "^17.2.3",
|
|
77
77
|
"fastify": "5.8.1",
|
|
78
78
|
"gray-matter": "^4.0.3",
|
package/public/css/site.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
body,button,input,select,textarea{font-family:Roboto,sans-serif}#site-navbar.navbar-dark .navbar-brand,#site-navbar.navbar-dark .navbar-brand-text,#site-navbar.navbar-dark .navbar-brand-tagline{color:var(--dm-text-inverse, #fff)}#site-navbar.navbar-light .navbar-brand,#site-navbar.navbar-light .navbar-brand-text,#site-navbar.navbar-light .navbar-brand-tagline{color:var(--dm-text, #212529)}.navbar-brand-logo{height:32px;width:auto;display:inline-block;vertical-align:middle;margin-right:.4em}.navbar-brand-tagline{display:block;font-size:.65em;opacity:.75;line-height:1.2;letter-spacing:.02em}.navbar-brand-text.navbar-brand-sm{font-size:.85em}.navbar-brand-text.navbar-brand-lg{font-size:1.25em}.navbar-actions{order:4;margin-left:auto;display:flex;align-items:center;gap:.5rem}.navbar-dark .navbar-actions{color:var(--dm-text-inverse, rgba(255, 255, 255, .85))}.navbar-dark .site-search-shortcut-hint{color:#fff9;border-color:#ffffff40}.navbar-light .navbar-actions{color:var(--dm-text, #111)}.site-main{min-height:calc(100vh - 60px);padding-top:2rem;padding-bottom:4rem}.site-main.with-sidebar{display:grid;grid-template-columns:260px 1fr;gap:0}.site-sidebar{min-height:100%;border-right:1px solid var(--border-color, rgba(255,255,255,.08))}.site-content{overflow:hidden}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}.container{max-width:860px;margin:0 auto;padding:0 1.5rem}.page-title{font-size:clamp(1.5rem,4vw,2rem);font-weight:700;margin-bottom:1.5rem;line-height:1.2}.page-body{line-height:1.7;font-size:1rem}.page-body h1,.page-body h2,.page-body h3,.page-body h4{margin-top:2rem;margin-bottom:.75rem;font-weight:600}.page-body h2{font-size:clamp(1.2rem,3vw,1.5rem)}.page-body h3{font-size:clamp(1.1rem,2.5vw,1.25rem)}.page-body p{margin-bottom:1rem}.page-body ul,.page-body ol{margin-bottom:1rem;padding-left:1.5rem}.page-body a{color:var(--primary, #5b8cff)}.page-body a:hover{text-decoration:underline}.page-body code{font-family:Fira Code,Courier New,monospace;font-size:.9em;background:#ffffff0f;padding:.15em .35em;border-radius:3px}.page-body pre{background:#0000004d;border:1px solid rgba(255,255,255,.08);border-radius:6px;padding:1rem;overflow-x:auto;margin-bottom:1rem}.page-body pre code{background:none;padding:0}.page-body img{max-width:100%;border-radius:6px}.page-body blockquote{border-left:3px solid var(--primary, #5b8cff);margin:1.5rem 0;padding:.75rem 1rem;background:#5b8cff0f;border-radius:0 6px 6px 0}h3.accordion-header{margin:0}.accordion-button{all:unset;display:flex;align-items:center;justify-content:space-between;width:100%;cursor:pointer;font:inherit}.page-body .card-header h2{margin:0;font-size:1rem;font-weight:600;line-height:1.4}.card[data-collapsible] .card-header{cursor:pointer;user-select:none;display:flex;align-items:center;justify-content:space-between}.card[data-collapsible] .card-header:after{content:"\25be";font-size:1.1em;line-height:1;display:inline-block;transition:transform .25s ease;flex-shrink:0}.card[data-collapsible].is-collapsed .card-header:after{transform:rotate(-90deg)}.card[data-collapsible] .card-body{overflow:hidden;max-height:4000px;opacity:1;transition:max-height .3s ease,opacity .25s ease}.card[data-collapsible].is-collapsed .card-body{max-height:0;opacity:0}.navbar-link span[data-icon],.navbar-link svg,.navbar-dropdown-toggle span[data-icon],.navbar-dropdown-toggle svg,.navbar-dropdown-item span[data-icon],.navbar-dropdown-item svg{width:13px!important;height:13px!important;margin-right:10px!important}.navbar-dropdown-toggle{font-size:var(--dm-font-size-base)}@media(min-width:993px){.navbar-dropdown-toggle{font-size:var(--dm-font-size-sm)}}@media(min-width:1201px){.navbar-dropdown-toggle{font-size:var(--dm-font-size-xs)}}.dm-reduced-motion *,.dm-reduced-motion *:before,.dm-reduced-motion *:after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}.page-footer{border-top:1px solid var(--border-color, rgba(255,255,255,.08));padding:1.5rem 0}.footer-inner{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem}.footer-inner p{margin:0;color:var(--text-muted, #888);font-size:.875rem}.footer-links{display:flex;gap:1.25rem}.footer-links a{color:var(--text-muted, #888);font-size:.875rem;text-decoration:none}.footer-links a:hover{color:var(--text, #eee)}.footer-social{display:flex;gap:.5rem;align-items:center}.footer-social-link{display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;color:var(--text-muted, #888);transition:color .15s}.footer-social-link:hover{color:var(--text, #eee)}.footer-social-link svg{width:1rem;height:1rem}.footer-motion-switch{font-size:.8rem;color:var(--text-muted, #888);white-space:nowrap}.footer-motion-switch .form-switch-label{color:var(--text-muted, #888)}.footer-motion-switch .form-switch-input{width:2rem;height:1.125rem}.footer-motion-switch .form-switch-input:after{width:.875rem;height:.875rem}.footer-motion-switch .form-switch-input:checked:after{transform:translate(.875rem)}.dm-slideover-header{display:flex;align-items:center;justify-content:space-between;padding:.875rem 1.25rem;border-bottom:1px solid var(--border-color, rgba(255, 255, 255, .08));flex-shrink:0}.dm-slideover-title{margin:0;font-size:1rem;font-weight:600;line-height:1.4}.dm-slideover-body{padding:1.25rem;overflow-y:auto;flex:1}@media(max-width:768px){.site-main.with-sidebar{grid-template-columns:1fr}.site-sidebar{display:none}}.dm-spacer{display:block;width:100%}.hero-breakout{width:calc(100vw - 2rem);margin-left:calc(50% - 50vw + 1rem);margin-right:calc(50% - 50vw + 1rem)}.site-main:has(.page-body>.hero-breakout:first-child){padding-top:0}body[data-layout=landing]>.site-main{padding-top:0}body[data-layout=landing]>.site-main .container{max-width:none;padding:0}body[data-layout=landing] .page-body{padding-left:1.5rem;padding-right:1.5rem}body[data-layout=landing] .page-body>p,body[data-layout=landing] .page-body>h1,body[data-layout=landing] .page-body>h2,body[data-layout=landing] .page-body>h3,body[data-layout=landing] .page-body>ul,body[data-layout=landing] .page-body>ol,body[data-layout=landing] .page-body>blockquote{max-width:860px;margin-left:auto;margin-right:auto}.hero-breakout{width:100vw;margin-left:calc((100% - 100vw)/2);max-width:none}body[data-layout=landing] .page-body .hero-breakout{width:calc(100% + 3rem);margin-left:-1.5rem;margin-right:-1.5rem}body[data-layout=landing] .page-body .grid-breakout{width:calc(100% + 3rem);margin-left:-1.5rem;margin-right:-1.5rem;padding-left:1.5rem;padding-right:1.5rem}.page-body .card{transition:transform .2s ease,box-shadow .2s ease}.page-body .card:hover{transform:translateY(-3px);box-shadow:0 8px 24px #00000059}.page-body .card-header-icon-inline{display:flex;align-items:center;gap:.6rem}.page-body .card-header-icon-inline [data-icon]{flex-shrink:0;line-height:0}.page-body .card-header-icon-inline [data-icon] svg,.page-body .card-header-icon-inline>svg{display:block;width:1.25rem;height:1.25rem}.page-body .card-header-icon-stacked{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.35rem;padding-top:.25rem}.page-body .card-header-icon-stacked [data-icon],.page-body .card-header-icon-stacked svg{width:2rem;height:2rem}.page-body .dm-card-clean{background:var(--dm-surface);border:1px solid var(--dm-border);box-shadow:0 1px 4px #0000000f,0 2px 8px #0000000a;transition:transform .2s ease,box-shadow .2s ease}.page-body .dm-card-clean:hover{transform:translateY(-4px);box-shadow:0 8px 24px #0000001a,0 2px 8px #0000000f}.page-body .dm-card-clean .card-header{color:var(--dm-text)}.page-body .dm-card-clean .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-clean .card-footer{color:var(--dm-text-muted);border-top:1px solid var(--dm-border)}.page-body .dm-card-gradient{background:#fff;border:none;box-shadow:0 4px 20px #6366f124;transition:transform .2s ease,box-shadow .2s ease}.page-body .dm-card-gradient:hover{transform:translateY(-5px);box-shadow:0 16px 40px #6366f140}.page-body .dm-card-gradient .card-header{background:linear-gradient(135deg,var(--dm-card-g-start, #6366f1),var(--dm-card-g-end, #8b5cf6));color:#fff;border-bottom:none}.page-body .dm-card-gradient .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-gradient .card-footer{color:var(--dm-text-muted);border-top:1px solid var(--dm-border)}.page-body .dm-card-glass{background:#ffffff2e;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid rgba(255,255,255,.38);box-shadow:0 4px 24px #00000014;transition:transform .2s ease,box-shadow .2s ease,background .2s ease}.page-body .dm-card-glass:hover{transform:translateY(-4px);box-shadow:0 12px 36px #00000024;background:#ffffff42}.page-body .dm-card-glass .card-header{border-bottom:1px solid rgba(255,255,255,.25);color:var(--dm-text)}.page-body .dm-card-glass .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-glass .card-footer{color:var(--dm-text-muted)}.page-body .dm-card-accent{background:var(--dm-surface);border:1px solid var(--dm-border);border-left:4px solid #6366f1;box-shadow:0 1px 4px #0000000d;transition:transform .2s ease,box-shadow .2s ease,border-left-color .2s ease}.page-body .dm-card-accent:hover{transform:translateY(-3px);border-left-color:#4f46e5;box-shadow:0 8px 24px #6366f11f}.page-body .dm-card-accent .card-header{color:var(--dm-primary);border-bottom:none}.page-body .dm-card-accent .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-accent .card-footer{color:var(--dm-text-muted);border-top:1px solid var(--dm-border)}.page-body .dm-card-dark{background:linear-gradient(160deg,#1e293b,#0f172a);border:1px solid rgba(255,255,255,.06);box-shadow:0 4px 20px #0000004d;transition:transform .2s ease,box-shadow .2s ease}.page-body .dm-card-dark:hover{transform:translateY(-4px) scale(1.012);box-shadow:0 16px 40px #00000073}.page-body .dm-card-dark .card-header{color:#f1f5f9;border-bottom:1px solid rgba(255,255,255,.08)}.page-body .dm-card-dark .card-body{color:#94a3b8}.page-body .dm-card-dark .card-footer{color:#475569;border-top:1px solid rgba(255,255,255,.06)}.page-body .dm-card-glow{background:var(--dm-surface);border:1px solid #a5b4fc;box-shadow:0 0 #6366f100;transition:transform .2s ease,box-shadow .3s ease,border-color .2s ease}.page-body .dm-card-glow:hover{transform:translateY(-3px);border-color:#818cf8;box-shadow:0 0 0 4px #6366f124,0 0 28px #6366f138}.page-body .dm-card-glow .card-header{color:var(--dm-primary);border-bottom:1px solid #e0e7ff}.page-body .dm-card-glow .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-glow .card-footer{border-top:1px solid #e0e7ff;color:#818cf8}.page-body .card-hover{transition:transform .2s ease,box-shadow .2s ease}.page-body .card-hover:hover{transform:translateY(-3px);box-shadow:0 8px 20px #0000001a}.card-gradient-indigo{background:linear-gradient(135deg,#6366f1,#8b5cf6)}.card-gradient-ocean{background:linear-gradient(135deg,#0891b2,#2563eb)}.card-gradient-sunset{background:linear-gradient(135deg,#f59e0b,#ef4444,#ec4899)}.card-gradient-forest{background:linear-gradient(135deg,#10b981,#0d9488)}.card-gradient-rose{background:linear-gradient(135deg,#fb7185,#e11d48)}.card-gradient-midnight{background:linear-gradient(135deg,#1e1b4b,#4338ca)}.card-gradient-aurora{background:linear-gradient(135deg,#06b6d4,#6366f1,#a855f7)}.card-gradient-fire{background:linear-gradient(135deg,#ef4444,#f97316,#fbbf24)}.card-gradient-lagoon{background:linear-gradient(135deg,#06b6d4,#0e7490)}.card-gradient-dusk{background:linear-gradient(135deg,#7c3aed,#db2777)}.card-gradient-lime{background:linear-gradient(135deg,#84cc16,#10b981)}.card-gradient-gold{background:linear-gradient(135deg,#f59e0b,#b45309)}.card-gradient-arctic{background:linear-gradient(135deg,#bae6fd,#e0f2fe);color:#1e293b}.card-gradient-slate{background:linear-gradient(135deg,#475569,#1e293b)}[class*=card-gradient-]:not(.card-gradient-arctic){color:#fff}.page-body .card-font-serif{font-family:Georgia,Times New Roman,serif}.page-body .card-font-mono{font-family:SF Mono,Fira Code,Courier New,monospace}.page-body .card-text-sm{font-size:.85rem}.page-body .card-text-lg{font-size:1.1rem}.page-body .card-text-xl{font-size:1.25rem}.page-body .card-borderless{border:none!important}.page-body .card-shadow-none{box-shadow:none!important}.page-body .card-shadow-md{box-shadow:0 4px 12px #0000001a}.page-body .card-shadow-lg{box-shadow:0 10px 30px #0000002e}.page-body .card-rounded-none{border-radius:0}.page-body .card-rounded-sm{border-radius:4px}.page-body .card-rounded-lg{border-radius:20px}.page-body .card-rounded-full{border-radius:9999px}.page-body .card-align-center{text-align:center}.page-body .card-align-right{text-align:right}.page-body .card-pad-compact .card-body,.page-body .card-pad-compact .card-header,.page-body .card-pad-compact .card-footer{padding:8px 12px}.page-body .card-pad-spacious .card-body,.page-body .card-pad-spacious .card-header,.page-body .card-pad-spacious .card-footer{padding:24px 28px}.card-img-top{width:100%;height:180px;background-size:cover;background-position:center;background-color:var(--dm-border,#e2e8f0);display:flex;align-items:center;justify-content:center;font-size:2.5rem;color:#00000026}.card-img-left,.card-img-right{width:90px;flex-shrink:0;background-size:cover;background-position:center;background-color:var(--dm-border,#e2e8f0);display:flex;align-items:center;justify-content:center;font-size:1.75rem;color:#0003}.card-img-wide{width:130px;flex-shrink:0;background-size:cover;background-position:center;background-color:var(--dm-border,#e2e8f0);display:flex;align-items:center;justify-content:center;font-size:2rem;color:#0003}.card-layout-horizontal,.card-layout-thumb-left,.card-layout-thumb-right{display:flex}.card-layout-thumb-left .card-body,.card-layout-thumb-right .card-body,.card-layout-horizontal .card-body{flex:1;min-width:0}.card-layout-split{display:flex;min-height:140px}.card-split-left{width:50%;display:flex;align-items:center;justify-content:center;font-size:2.25rem;flex-shrink:0;background:linear-gradient(160deg,#6366f1,#8b5cf6)}.card-split-right{flex:1;background:#1e293b;display:flex;flex-direction:column;justify-content:center}.card-split-right .card-body{color:#94a3b8}.card-split-right .card-title{color:#f1f5f9}.card-img-overlay{position:relative;height:180px;overflow:hidden;background-size:cover;background-position:center;background-color:#1e293b;display:flex;align-items:flex-end}.card-overlay-text{width:100%;padding:40px 16px 14px;background:linear-gradient(to top,rgba(0,0,0,.75),transparent)}.card-overlay-text .card-title{color:#fff}.dm-card-dark .card-img-top,.dm-card-dark .card-img-left,.dm-card-dark .card-img-right,.dm-card-dark .card-img-wide{filter:brightness(.7)}.card-stat-value{font-size:2.4rem;font-weight:800;color:var(--dm-text);line-height:1.1}.card-stat-delta{font-size:.8rem;font-weight:600;margin-top:2px}.card-stat-delta.positive{color:#10b981}.card-stat-delta.negative{color:#ef4444}.card-stat-bar{height:5px;background:var(--dm-border);border-radius:3px;margin-top:14px;overflow:hidden}.card-stat-fill{height:100%;border-radius:3px;background:linear-gradient(90deg,#6366f1,#8b5cf6)}.card-progress-bar{height:8px;background:var(--dm-border);border-radius:4px;overflow:hidden;margin:8px 0}.card-progress-fill{height:100%;border-radius:4px;background:linear-gradient(90deg,#6366f1,#8b5cf6)}.card-milestone{display:flex;align-items:center;gap:8px;font-size:.8rem;color:var(--dm-text-secondary);padding:3px 0}.card-milestone-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.card-milestone-dot.done{background:#10b981}.card-milestone-dot.pending{background:#e5e7eb}.card-header-icon-stacked{text-align:center;padding:20px 16px 12px}.card-header-icon-stacked [data-icon],.card-header-icon-stacked .card-icon{font-size:2rem;display:block;margin-bottom:8px}.card-step-bg{position:relative;overflow:hidden;min-height:60px;display:flex;align-items:center;padding:14px 16px}.card-step-ghost{position:absolute;right:8px;top:-10px;font-size:5rem;font-weight:900;color:#6366f11f;line-height:1;pointer-events:none}.card-step-badge{width:32px;height:32px;border-radius:50%;background:#6366f1;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.85rem;z-index:1;flex-shrink:0}.card-corner-badge-wrap{position:relative}.card-corner-badge{position:absolute;top:10px;right:10px;background:#ef4444;color:#fff;font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:2px 8px;border-radius:20px}.card-callout{border-left:4px solid #6366f1}.card-callout.warn{border-left-color:#f59e0b}.card-callout.success{border-left-color:#10b981}.card-callout.error{border-left-color:#ef4444}.card-callout-inner{display:flex;gap:12px;align-items:flex-start}.card-callout-icon{font-size:1.2rem;flex-shrink:0;margin-top:1px}.card-quote-mark{font-size:3.5rem;color:#ede9fe;line-height:.8;padding:14px 16px 0;font-family:Georgia,serif;display:block}.card-quote-text{padding:4px 16px 14px;font-style:italic;color:var(--dm-text-secondary);line-height:1.7}.card-quote-attr{display:flex;align-items:center;gap:10px}.card-quote-avatar{width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:.85rem;color:#fff;flex-shrink:0}.card-video-thumb{position:relative;height:160px;background:#1e293b;display:flex;align-items:center;justify-content:center;background-size:cover;background-position:center}.card-play-btn{width:52px;height:52px;border-radius:50%;background:#ffffffe6;display:flex;align-items:center;justify-content:center;font-size:1.2rem;box-shadow:0 4px 16px #0000004d}.card-video-duration{position:absolute;bottom:8px;right:10px;background:#000000b3;color:#fff;font-size:.65rem;font-weight:600;padding:2px 7px;border-radius:4px}.card-map-placeholder{height:130px;background:linear-gradient(160deg,#bfdbfe,#dbeafe);position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden}.card-map-grid{position:absolute;inset:0;background-image:repeating-linear-gradient(0deg,rgba(59,130,246,.08) 0,rgba(59,130,246,.08) 1px,transparent 1px,transparent 32px),repeating-linear-gradient(90deg,rgba(59,130,246,.08) 0,rgba(59,130,246,.08) 1px,transparent 1px,transparent 32px)}.card-map-pin{font-size:2rem;z-index:1}.card-avatar{width:64px;height:64px;border-radius:50%;background:linear-gradient(135deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:1.8rem;color:#fff;margin:0 auto 12px}.card-avatar-wrap{text-align:center;padding:24px 16px 16px}.card-tag-pills{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;margin-top:10px}.card-pill{background:#ede9fe;color:#7c3aed;font-size:.7rem;font-weight:700;padding:3px 9px;border-radius:20px}.card-tag-cloud{padding:14px 16px;display:flex;flex-wrap:wrap;gap:7px}.card-tag{padding:4px 11px;border-radius:20px;font-size:.78rem;font-weight:600}.card-file-row{display:flex;gap:14px;align-items:center;padding:16px}.card-file-icon{width:48px;height:58px;border-radius:7px;background:linear-gradient(160deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:1.4rem;color:#fff;flex-shrink:0;position:relative}.card-file-ext{position:absolute;bottom:4px;left:0;right:0;text-align:center;font-size:.55rem;font-weight:800;color:#ffffffe6;letter-spacing:.05em}.card-file-dl{font-size:.78rem;font-weight:700;color:#6366f1;display:inline-block;margin-top:4px}.card-stars{color:#f59e0b;letter-spacing:2px;padding:14px 16px 0;display:block}.card-verified{display:inline-block;background:#d1fae5;color:#065f46;font-size:.6rem;font-weight:700;padding:1px 5px;border-radius:3px;margin-left:6px}.card-activity-item{display:flex;gap:10px;align-items:flex-start;padding:8px 14px;border-bottom:1px solid var(--dm-border)}.card-activity-item:last-child{border-bottom:none}.card-activity-avatar{width:30px;height:30px;border-radius:50%;flex-shrink:0;background:linear-gradient(135deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:.8rem;color:#fff}.card-compare-grid{display:grid;grid-template-columns:1fr 1fr}.card-compare-col{padding:12px 14px}.card-compare-col+.card-compare-col{border-left:1px solid var(--dm-border)}.card-compare-label{font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.07em;margin-bottom:8px;display:block}.card-compare-label.before{color:#ef4444}.card-compare-label.after{color:#10b981}.card-compare-item{display:flex;gap:7px;align-items:flex-start;font-size:.78rem;color:var(--dm-text-secondary);padding:3px 0;line-height:1.4}.card-compare-x{color:#ef4444;flex-shrink:0}.card-compare-check{color:#10b981;flex-shrink:0}.card-pricing-features{padding:14px 16px}.card-pricing-feature{display:flex;align-items:center;gap:8px;font-size:.82rem;color:var(--dm-text-secondary);padding:4px 0}.card-pricing-check{color:#10b981}.card-pricing-cta{display:block;text-align:center;background:#6366f1;color:#fff;font-size:.82rem;font-weight:700;padding:9px;border-radius:8px;text-decoration:none;margin:0 16px 14px}.card-timeline-row{display:flex}.card-timeline-side{width:44px;flex-shrink:0;display:flex;flex-direction:column;align-items:center;padding-top:14px}.card-timeline-dot{width:12px;height:12px;border-radius:50%;background:#6366f1;flex-shrink:0}.card-timeline-line{width:2px;background:#e5e7eb;flex:1;margin-top:4px}.card-timeline-body{flex:1;padding:12px 14px 12px 0}.card-timeline-date{font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--dm-text-muted)}.card-timeline-tag{display:inline-block;background:#d1fae5;color:#065f46;font-size:.65rem;font-weight:700;padding:2px 6px;border-radius:4px;margin-top:6px}.card-code-header{background:#1e293b;display:flex;justify-content:space-between;align-items:center;padding:8px 14px}.card-code-lang{font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#6366f1}.card-code-body{background:#0f172a;padding:14px;font-family:Courier New,monospace;font-size:.78rem;line-height:1.8;color:#94a3b8;overflow-x:auto}.card-glass-outer{background:linear-gradient(135deg,#6366f1,#8b5cf6,#ec4899);border-radius:12px;padding:2px}.card-glass-inner{background:#ffffffeb;backdrop-filter:blur(10px);border-radius:10px;padding:16px}.card-badge-band{display:flex;align-items:center;justify-content:space-between;padding:12px 16px}.card-badge-band-label{background:#fff3;color:#fff;font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;padding:3px 8px;border-radius:4px}.card-badge-band-icon{font-size:1.4rem}.dm-card-full-bg{background:linear-gradient(160deg,#1e293b,#0f172a);color:#cbd5e1}.dm-card-full-bg .card-body{color:#94a3b8}.dm-card-full-bg .card-title{color:#f1f5f9;font-size:1rem}.dm-card-full-bg .card-footer{border-top-color:#ffffff14;color:#64748b}.card-fc-row{display:flex;justify-content:space-between;align-items:center;padding:8px 16px;border-bottom:1px solid var(--dm-border);font-size:.82rem;color:var(--dm-text-secondary)}.card-fc-row:last-child{border-bottom:none}.card-fc-yes{color:#10b981}.card-fc-no{color:#d1d5db}@media(max-width:480px){.card-layout-thumb-left,.card-layout-thumb-right,.card-layout-horizontal{flex-direction:column}.card-img-left,.card-img-right,.card-img-wide{width:100%;height:120px}.card-layout-split{flex-direction:column}.card-split-left{width:100%;height:100px}}.hero.hero-dark{background:linear-gradient(135deg,#1f2937,#111827);color:#e2e8f0}.hero .hero-content{position:relative;z-index:2}.hero.hero-left .hero-content{text-align:left;align-items:flex-start;max-width:62%}@media(max-width:768px){.hero.hero-left .hero-content{max-width:100%}}.hero .hero-cta{display:flex;gap:.85rem;flex-wrap:wrap;margin-top:1.75rem}.hero .hero-cta a{display:inline-flex;align-items:center;gap:.4rem;padding:.55rem 1.35rem;border-radius:6px;font-size:.95rem;font-weight:500;text-decoration:none;transition:background .2s ease,border-color .2s ease,transform .15s ease,box-shadow .2s ease}.hero .hero-cta a:first-child{background:#ffffffeb;color:#111;border:1px solid transparent}.hero .hero-cta a:first-child:hover{background:#fff;box-shadow:0 4px 16px #00000040;transform:translateY(-2px)}.hero .hero-cta a:last-child{background:transparent;color:#fff;border:1px solid rgba(255,255,255,.4)}.hero .hero-cta a:last-child:hover{border-color:#ffffffbf;background:#ffffff14;transform:translateY(-2px)}.hero .hero-label{display:inline-block;margin-bottom:.9rem;padding:.2rem .8rem;border-radius:999px;font-size:.72rem;font-weight:600;letter-spacing:.07em;text-transform:uppercase;color:#ffffffb3;border:1px solid rgba(255,255,255,.22)}.grid-breakout{width:calc(100vw - 2rem);margin-left:calc(50% - 50vw + 1rem);margin-right:calc(50% - 50vw + 1rem)}.dm-breadcrumbs{position:fixed;z-index:200;display:inline-flex;align-items:center;gap:.2rem;padding:.3rem .8rem;border-radius:999px;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);background:#00000047;border:1px solid rgba(255,255,255,.11);box-shadow:0 2px 10px #00000038;font-size:.72rem;font-weight:500;letter-spacing:.01em;line-height:1.4;max-width:calc(100vw - 2rem);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dm-breadcrumbs .dm-breadcrumbs-item{color:#ffffffa6}.dm-breadcrumbs .dm-breadcrumbs-link{display:inline-flex;align-items:center;gap:.25rem;color:#ffffff8c;text-decoration:none;transition:color .15s}.dm-breadcrumbs .dm-breadcrumbs-home-icon{flex-shrink:0;vertical-align:middle}.dm-breadcrumbs .dm-breadcrumbs-link:hover{color:#fffffff2}.dm-breadcrumbs .dm-breadcrumbs-current{color:#ffffffeb;font-weight:600}.dm-breadcrumbs .dm-breadcrumbs-separator{color:#ffffff47;font-size:.8em;line-height:1;margin:0 .05rem}[data-mode=light] .dm-breadcrumbs{background:#ffffff8c;border-color:#00000012;box-shadow:0 2px 10px #00000014}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-item,[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-link{color:#0000008c}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-link:hover{color:#000000e6}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-current{color:#000000d9}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-separator{color:#00000040}.dm-collection-display{margin:1.5rem 0}.dm-collection-list{display:flex;flex-direction:column;gap:0}.dm-collection-list-item{padding:1rem 0;border-bottom:1px solid var(--border-color, rgba(255, 255, 255, .08))}.dm-collection-list-item:last-child{border-bottom:none}.dm-collection-list-item strong{display:block;font-size:1rem;margin-bottom:.25rem}.dm-collection-list-item p{margin:0;color:var(--text-muted, #888);font-size:.9rem}.dm-collection-empty p{color:var(--text-muted, #888);font-style:italic}.hero-gradient-purple{background:linear-gradient(135deg,#ede9fe,#ddd6fe);color:#1e1b4b}.hero-gradient-blue{background:linear-gradient(135deg,#dbeafe,#bfdbfe);color:#1e3a5f}.hero-gradient-green{background:linear-gradient(135deg,#d1fae5,#a7f3d0);color:#064e3b}.hero-gradient-sunset{background:linear-gradient(135deg,#fef3c7,#fde68a);color:#78350f}.hero-gradient-ocean{background:linear-gradient(135deg,#e0f2fe,#bae6fd);color:#0c4a6e}.hero-gradient-rose{background:linear-gradient(135deg,#fce7f3,#fbcfe8);color:#831843}.hero-gradient-forest{background:linear-gradient(135deg,#dcfce7,#bbf7d0);color:#14532d}.hero-gradient-night{background:linear-gradient(135deg,#334155,#1e293b);color:#e2e8f0}.hero-gradient-ocean-light{background:linear-gradient(135deg,#e0f2fe,#caf0f8);color:#1e293b}.hero-gradient-ocean-dark{background:linear-gradient(135deg,#0c4a6e,#164e63);color:#e2e8f0}.hero-gradient-forest-light{background:linear-gradient(135deg,#d1fae5,#c6f6dc);color:#1e293b}.hero-gradient-forest-dark{background:linear-gradient(135deg,#1a4731,#166534);color:#e2e8f0}.hero-gradient-sunset-light{background:linear-gradient(135deg,#fde8d8,#fddcc9);color:#1e293b}.hero-gradient-sunset-dark{background:linear-gradient(135deg,#6b3727,#7c4036);color:#f5ede8}.hero-gradient-royal-light{background:linear-gradient(135deg,#e8f0fd,#dce8fc);color:#1e293b}.hero-gradient-royal-dark{background:linear-gradient(135deg,#1e3465,#263d7a);color:#e2e8f0}.hero-gradient-lemon-light{background:linear-gradient(135deg,#fefce8,#fef9c3);color:#1e293b}.hero-gradient-lemon-dark{background:linear-gradient(135deg,#5c4d1a,#6b5920);color:#fefce8}.hero-gradient-silver-light{background:linear-gradient(135deg,#f1f5f9,#e2e8f0);color:#1e293b}.hero-gradient-silver-dark{background:linear-gradient(135deg,#2d3748,#374151);color:#e2e8f0}.hero-gradient-charcoal-light{background:linear-gradient(135deg,#eceff1,#e1e7eb);color:#1e293b}.hero-gradient-charcoal-dark{background:linear-gradient(135deg,#2c3843,#374451);color:#e2e8f0}.hero-gradient-christmas-light{background:linear-gradient(135deg,#fde8ea,#fdd5d8);color:#1e293b}.hero-gradient-christmas-dark{background:linear-gradient(135deg,#5c0f1d,#7a1525);color:#fde8ea}.hero-gradient-unicorn-light{background:linear-gradient(135deg,#f5e8fd,#edd6fb);color:#1e293b}.hero-gradient-unicorn-dark{background:linear-gradient(135deg,#3d1a5a,#4a2068);color:#f5e8fd}.hero-gradient-dreamy-light{background:linear-gradient(135deg,#f5ede8,#eeddd4);color:#1e293b}.hero-gradient-dreamy-dark{background:linear-gradient(135deg,#3d2820,#503328);color:#f5ede8}.hero-gradient-grayve-light{background:linear-gradient(135deg,#e0f7f9,#cbf2f5);color:#1e293b}.hero-gradient-grayve-dark{background:linear-gradient(135deg,#00363d,#00444d);color:#e0f7f9}.hero-gradient-mint-light{background:linear-gradient(135deg,#d8f5ea,#c5efdd);color:#1e293b}.hero-gradient-mint-dark{background:linear-gradient(135deg,#134d33,#195f3f);color:#d8f5ea}.hero-gradient-wedding-light{background:linear-gradient(135deg,#faf3e0,#f5e9c7);color:#1e293b}.hero-gradient-wedding-dark{background:linear-gradient(135deg,#5c4418,#6f5320);color:#faf3e0}.tabs-centered{text-align:center}.tabs-centered .tab-list{display:inline-flex}.tabs-centered .tab-content{text-align:left}.site-main{overflow-x:hidden}@media(max-width:768px){.hero .hero-cta a,.dm-so-trigger,.dm-cta-trigger{min-height:44px;padding:.6rem 1.25rem}}.dm-banner{position:relative;display:flex;flex-direction:row;align-items:flex-start;gap:.75rem;padding:.85rem 2.5rem .85rem 1rem;border-radius:var(--dm-radius, 6px);border-left:4px solid transparent;margin-bottom:1rem}.dm-banner__icon{flex-shrink:0;margin-top:.1rem;width:1.15rem;height:1.15rem}.dm-banner__icon svg{width:1.15rem;height:1.15rem}.dm-banner__body{flex:1;min-width:0}.dm-banner__title{display:block;margin-bottom:.2rem;font-size:.9em;font-weight:600}.dm-banner__dismiss{position:absolute;top:.5rem;right:.5rem;background:transparent;border:none;cursor:pointer;font-size:1.1rem;line-height:1;padding:.1rem .3rem;opacity:.6}.dm-banner__dismiss:hover{opacity:1}.dm-banner--info{background:color-mix(in srgb,var(--dm-info, #3b82f6) 12%,transparent);border-left-color:var(--dm-info, #3b82f6);color:inherit}.dm-banner--success{background:color-mix(in srgb,var(--dm-success, #22c55e) 12%,transparent);border-left-color:var(--dm-success, #22c55e);color:inherit}.dm-banner--warning{background:color-mix(in srgb,var(--dm-warning, #f59e0b) 12%,transparent);border-left-color:var(--dm-warning, #f59e0b);color:inherit}.dm-banner--danger{background:color-mix(in srgb,var(--dm-danger, #ef4444) 12%,transparent);border-left-color:var(--dm-danger, #ef4444);color:inherit}.dm-banner--neutral{background:color-mix(in srgb,var(--dm-text-muted, #888) 12%,transparent);border-left-color:var(--dm-text-muted, #888);color:inherit}body.dm-layout-narrow .page-body{max-width:768px;margin-inline:auto}body.dm-layout-normal .page-body{max-width:1100px;margin-inline:auto}body.dm-layout-wide .page-body{max-width:1280px;margin-inline:auto}body.dm-layout-full .page-body{max-width:none}
|
|
1
|
+
body,button,input,select,textarea{font-family:Roboto,sans-serif}#site-navbar.navbar-dark .navbar-brand,#site-navbar.navbar-dark .navbar-brand-text,#site-navbar.navbar-dark .navbar-brand-tagline{color:var(--dm-text-inverse, #fff)}#site-navbar.navbar-light .navbar-brand,#site-navbar.navbar-light .navbar-brand-text,#site-navbar.navbar-light .navbar-brand-tagline{color:var(--dm-text, #212529)}.navbar-brand-logo{height:32px;width:auto;display:inline-block;vertical-align:middle;margin-right:.4em}.navbar-brand-tagline{display:block;font-size:.65em;opacity:.75;line-height:1.2;letter-spacing:.02em}.navbar-brand-text.navbar-brand-sm{font-size:.85em}.navbar-brand-text.navbar-brand-lg{font-size:1.25em}.navbar-actions{order:4;margin-left:auto;display:flex;align-items:center;gap:.5rem}.navbar-dark .navbar-actions{color:var(--dm-text-inverse, rgba(255, 255, 255, .85))}.navbar-dark .site-search-shortcut-hint{color:#fff9;border-color:#ffffff40}.navbar-light .navbar-actions{color:var(--dm-text, #111)}.site-main{min-height:calc(100vh - 60px);padding-top:2rem;padding-bottom:4rem}.site-main.with-sidebar{display:grid;grid-template-columns:260px 1fr;gap:0}.site-sidebar{min-height:100%;border-right:1px solid var(--border-color, rgba(255,255,255,.08))}.site-content{overflow:hidden}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}.container{max-width:860px;margin:0 auto;padding:0 1.5rem}.page-title{font-size:clamp(1.5rem,4vw,2rem);font-weight:700;margin-bottom:1.5rem;line-height:1.2}.page-body{line-height:1.7;font-size:1rem}.page-body h1,.page-body h2,.page-body h3,.page-body h4{margin-top:2rem;margin-bottom:.75rem;font-weight:600}.page-body h2{font-size:clamp(1.2rem,3vw,1.5rem)}.page-body h3{font-size:clamp(1.1rem,2.5vw,1.25rem)}.page-body p{margin-bottom:1rem}.page-body ul,.page-body ol{margin-bottom:1rem;padding-left:1.5rem}.page-body a{color:var(--primary, #5b8cff)}.page-body a:hover{text-decoration:underline}.page-body code{font-family:Fira Code,Courier New,monospace;font-size:.9em;background:#ffffff0f;padding:.15em .35em;border-radius:3px}.page-body pre{background:#0000004d;border:1px solid rgba(255,255,255,.08);border-radius:6px;padding:1rem;overflow-x:auto;margin-bottom:1rem}.page-body pre code{background:none;padding:0}.page-body img{max-width:100%;border-radius:6px}.page-body blockquote{border-left:3px solid var(--primary, #5b8cff);margin:1.5rem 0;padding:.75rem 1rem;background:#5b8cff0f;border-radius:0 6px 6px 0}h3.accordion-header{margin:0}.accordion-button{all:unset;display:flex;align-items:center;justify-content:space-between;width:100%;cursor:pointer;font:inherit}.page-body .card-header h2{margin:0;font-size:1rem;font-weight:600;line-height:1.4}.card[data-collapsible] .card-header{cursor:pointer;user-select:none;display:flex;align-items:center;justify-content:space-between}.card[data-collapsible] .card-header:after{content:"\25be";font-size:1.1em;line-height:1;display:inline-block;transition:transform .25s ease;flex-shrink:0}.card[data-collapsible].is-collapsed .card-header:after{transform:rotate(-90deg)}.card[data-collapsible] .card-body{overflow:hidden;max-height:4000px;opacity:1;transition:max-height .3s ease,opacity .25s ease}.card[data-collapsible].is-collapsed .card-body{max-height:0;opacity:0}.navbar-link span[data-icon],.navbar-link svg,.navbar-dropdown-toggle span[data-icon],.navbar-dropdown-toggle svg,.navbar-dropdown-item span[data-icon],.navbar-dropdown-item svg{width:13px!important;height:13px!important;margin-right:10px!important}.navbar-dropdown-toggle{font-size:var(--dm-font-size-base)}@media(min-width:993px){.navbar-dropdown-toggle{font-size:var(--dm-font-size-sm)}}@media(min-width:1201px){.navbar-dropdown-toggle{font-size:var(--dm-font-size-xs)}}.dm-reduced-motion *,.dm-reduced-motion *:before,.dm-reduced-motion *:after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}.page-footer{border-top:1px solid var(--border-color, rgba(255,255,255,.08));padding:1.5rem 0}.footer-inner{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem}.footer-inner p{margin:0;color:var(--text-muted, #888);font-size:.875rem}.footer-links{display:flex;gap:1.25rem}.footer-links a{color:var(--text-muted, #888);font-size:.875rem;text-decoration:none}.footer-links a:hover{color:var(--text, #eee)}.footer-social{display:flex;gap:.5rem;align-items:center}.footer-social-link{display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;color:var(--text-muted, #888);transition:color .15s}.footer-social-link:hover{color:var(--text, #eee)}.footer-social-link svg{width:1rem;height:1rem}.footer-motion-switch{font-size:.8rem;color:var(--text-muted, #888);white-space:nowrap}.footer-motion-switch .form-switch-label{color:var(--text-muted, #888)}.footer-motion-switch .form-switch-input{width:2rem;height:1.125rem}.footer-motion-switch .form-switch-input:after{width:.875rem;height:.875rem}.footer-motion-switch .form-switch-input:checked:after{transform:translate(.875rem)}.dm-slideover-header{display:flex;align-items:center;justify-content:space-between;padding:.875rem 1.25rem;border-bottom:1px solid var(--border-color, rgba(255, 255, 255, .08));flex-shrink:0}.dm-slideover-title{margin:0;font-size:1rem;font-weight:600;line-height:1.4}.dm-slideover-body{padding:1.25rem;overflow-y:auto;flex:1}@media(max-width:768px){.site-main.with-sidebar{grid-template-columns:1fr}.site-sidebar{display:none}}.dm-spacer{display:block;width:100%}.hero-breakout{width:calc(100vw - 2rem);margin-left:calc(50% - 50vw + 1rem);margin-right:calc(50% - 50vw + 1rem)}.site-main:has(.page-body>.hero-breakout:first-child){padding-top:0}body[data-layout=landing]>.site-main{padding-top:0}body[data-layout=landing]>.site-main .container{max-width:none;padding:0}body[data-layout=landing] .page-body{padding-left:1.5rem;padding-right:1.5rem}body[data-layout=landing] .page-body>p,body[data-layout=landing] .page-body>h1,body[data-layout=landing] .page-body>h2,body[data-layout=landing] .page-body>h3,body[data-layout=landing] .page-body>ul,body[data-layout=landing] .page-body>ol,body[data-layout=landing] .page-body>blockquote{max-width:860px;margin-left:auto;margin-right:auto}.hero-breakout{width:100vw;margin-left:calc((100% - 100vw)/2);max-width:none}body[data-layout=landing] .page-body .hero-breakout{width:calc(100% + 3rem);margin-left:-1.5rem;margin-right:-1.5rem}body[data-layout=landing] .page-body .grid-breakout{width:calc(100% + 3rem);margin-left:-1.5rem;margin-right:-1.5rem;padding-left:1.5rem;padding-right:1.5rem}.page-body .card{transition:transform .2s ease,box-shadow .2s ease}.page-body .card:hover{transform:translateY(-3px);box-shadow:0 8px 24px #00000059}.page-body .card-header-icon-inline{display:flex;align-items:center;gap:.6rem}.page-body .card-header-icon-inline [data-icon]{flex-shrink:0;line-height:0}.page-body .card-header-icon-inline [data-icon] svg,.page-body .card-header-icon-inline>svg{display:block;width:1.25rem;height:1.25rem}.page-body .card-header-icon-stacked{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.35rem;padding-top:.25rem}.page-body .card-header-icon-stacked [data-icon],.page-body .card-header-icon-stacked svg{width:2rem;height:2rem}.page-body .dm-card-clean{background:var(--dm-surface);border:1px solid var(--dm-border);box-shadow:0 1px 4px #0000000f,0 2px 8px #0000000a;transition:transform .2s ease,box-shadow .2s ease}.page-body .dm-card-clean:hover{transform:translateY(-4px);box-shadow:0 8px 24px #0000001a,0 2px 8px #0000000f}.page-body .dm-card-clean .card-header{color:var(--dm-text)}.page-body .dm-card-clean .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-clean .card-footer{color:var(--dm-text-muted);border-top:1px solid var(--dm-border)}.page-body .dm-card-gradient{background:#fff;border:none;box-shadow:0 4px 20px #6366f124;transition:transform .2s ease,box-shadow .2s ease}.page-body .dm-card-gradient:hover{transform:translateY(-5px);box-shadow:0 16px 40px #6366f140}.page-body .dm-card-gradient .card-header{background:linear-gradient(135deg,var(--dm-card-g-start, #6366f1),var(--dm-card-g-end, #8b5cf6));color:#fff;border-bottom:none}.page-body .dm-card-gradient .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-gradient .card-footer{color:var(--dm-text-muted);border-top:1px solid var(--dm-border)}.page-body .dm-card-glass{background:#ffffff2e;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid rgba(255,255,255,.38);box-shadow:0 4px 24px #00000014;transition:transform .2s ease,box-shadow .2s ease,background .2s ease}.page-body .dm-card-glass:hover{transform:translateY(-4px);box-shadow:0 12px 36px #00000024;background:#ffffff42}.page-body .dm-card-glass .card-header{border-bottom:1px solid rgba(255,255,255,.25);color:var(--dm-text)}.page-body .dm-card-glass .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-glass .card-footer{color:var(--dm-text-muted)}.page-body .dm-card-accent{background:var(--dm-surface);border:1px solid var(--dm-border);border-left:4px solid #6366f1;box-shadow:0 1px 4px #0000000d;transition:transform .2s ease,box-shadow .2s ease,border-left-color .2s ease}.page-body .dm-card-accent:hover{transform:translateY(-3px);border-left-color:#4f46e5;box-shadow:0 8px 24px #6366f11f}.page-body .dm-card-accent .card-header{color:var(--dm-primary);border-bottom:none}.page-body .dm-card-accent .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-accent .card-footer{color:var(--dm-text-muted);border-top:1px solid var(--dm-border)}.page-body .dm-card-dark{background:linear-gradient(160deg,#1e293b,#0f172a);border:1px solid rgba(255,255,255,.06);box-shadow:0 4px 20px #0000004d;transition:transform .2s ease,box-shadow .2s ease}.page-body .dm-card-dark:hover{transform:translateY(-4px) scale(1.012);box-shadow:0 16px 40px #00000073}.page-body .dm-card-dark .card-header{color:#f1f5f9;border-bottom:1px solid rgba(255,255,255,.08)}.page-body .dm-card-dark .card-body{color:#94a3b8}.page-body .dm-card-dark .card-footer{color:#475569;border-top:1px solid rgba(255,255,255,.06)}.page-body .dm-card-glow{background:var(--dm-surface);border:1px solid #a5b4fc;box-shadow:0 0 #6366f100;transition:transform .2s ease,box-shadow .3s ease,border-color .2s ease}.page-body .dm-card-glow:hover{transform:translateY(-3px);border-color:#818cf8;box-shadow:0 0 0 4px #6366f124,0 0 28px #6366f138}.page-body .dm-card-glow .card-header{color:var(--dm-primary);border-bottom:1px solid #e0e7ff}.page-body .dm-card-glow .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-glow .card-footer{border-top:1px solid #e0e7ff;color:#818cf8}.page-body .card-hover{transition:transform .2s ease,box-shadow .2s ease}.page-body .card-hover:hover{transform:translateY(-3px);box-shadow:0 8px 20px #0000001a}.card-gradient-indigo{background:linear-gradient(135deg,#6366f1,#8b5cf6)}.card-gradient-ocean{background:linear-gradient(135deg,#0891b2,#2563eb)}.card-gradient-sunset{background:linear-gradient(135deg,#f59e0b,#ef4444,#ec4899)}.card-gradient-forest{background:linear-gradient(135deg,#10b981,#0d9488)}.card-gradient-rose{background:linear-gradient(135deg,#fb7185,#e11d48)}.card-gradient-midnight{background:linear-gradient(135deg,#1e1b4b,#4338ca)}.card-gradient-aurora{background:linear-gradient(135deg,#06b6d4,#6366f1,#a855f7)}.card-gradient-fire{background:linear-gradient(135deg,#ef4444,#f97316,#fbbf24)}.card-gradient-lagoon{background:linear-gradient(135deg,#06b6d4,#0e7490)}.card-gradient-dusk{background:linear-gradient(135deg,#7c3aed,#db2777)}.card-gradient-lime{background:linear-gradient(135deg,#84cc16,#10b981)}.card-gradient-gold{background:linear-gradient(135deg,#f59e0b,#b45309)}.card-gradient-arctic{background:linear-gradient(135deg,#bae6fd,#e0f2fe);color:#1e293b}.card-gradient-slate{background:linear-gradient(135deg,#475569,#1e293b)}[class*=card-gradient-]:not(.card-gradient-arctic){color:#fff}.page-body .card-font-serif{font-family:Georgia,Times New Roman,serif}.page-body .card-font-mono{font-family:SF Mono,Fira Code,Courier New,monospace}.page-body .card-text-sm{font-size:.85rem}.page-body .card-text-lg{font-size:1.1rem}.page-body .card-text-xl{font-size:1.25rem}.page-body .card-borderless{border:none!important}.page-body .card-shadow-none{box-shadow:none!important}.page-body .card-shadow-md{box-shadow:0 4px 12px #0000001a}.page-body .card-shadow-lg{box-shadow:0 10px 30px #0000002e}.page-body .card-rounded-none{border-radius:0}.page-body .card-rounded-sm{border-radius:4px}.page-body .card-rounded-lg{border-radius:20px}.page-body .card-rounded-full{border-radius:9999px}.page-body .card-align-center{text-align:center}.page-body .card-align-right{text-align:right}.page-body .card-pad-compact .card-body,.page-body .card-pad-compact .card-header,.page-body .card-pad-compact .card-footer{padding:8px 12px}.page-body .card-pad-spacious .card-body,.page-body .card-pad-spacious .card-header,.page-body .card-pad-spacious .card-footer{padding:24px 28px}.card-img-top{width:100%;height:180px;background-size:cover;background-position:center;background-color:var(--dm-border,#e2e8f0);display:flex;align-items:center;justify-content:center;font-size:2.5rem;color:#00000026}.card-img-left,.card-img-right{width:90px;flex-shrink:0;background-size:cover;background-position:center;background-color:var(--dm-border,#e2e8f0);display:flex;align-items:center;justify-content:center;font-size:1.75rem;color:#0003}.card-img-wide{width:130px;flex-shrink:0;background-size:cover;background-position:center;background-color:var(--dm-border,#e2e8f0);display:flex;align-items:center;justify-content:center;font-size:2rem;color:#0003}.card-layout-horizontal,.card-layout-thumb-left,.card-layout-thumb-right{display:flex}.card-layout-thumb-left .card-body,.card-layout-thumb-right .card-body,.card-layout-horizontal .card-body{flex:1;min-width:0}.card-layout-split{display:flex;min-height:140px}.card-split-left{width:50%;display:flex;align-items:center;justify-content:center;font-size:2.25rem;flex-shrink:0;background:linear-gradient(160deg,#6366f1,#8b5cf6)}.card-split-right{flex:1;background:#1e293b;display:flex;flex-direction:column;justify-content:center}.card-split-right .card-body{color:#94a3b8}.card-split-right .card-title{color:#f1f5f9}.card-img-overlay{position:relative;height:180px;overflow:hidden;background-size:cover;background-position:center;background-color:#1e293b;display:flex;align-items:flex-end}.card-overlay-text{width:100%;padding:40px 16px 14px;background:linear-gradient(to top,rgba(0,0,0,.75),transparent)}.card-overlay-text .card-title{color:#fff}.dm-card-dark .card-img-top,.dm-card-dark .card-img-left,.dm-card-dark .card-img-right,.dm-card-dark .card-img-wide{filter:brightness(.7)}.card-stat-value{font-size:2.4rem;font-weight:800;color:var(--dm-text);line-height:1.1}.card-stat-delta{font-size:.8rem;font-weight:600;margin-top:2px}.card-stat-delta.positive{color:#10b981}.card-stat-delta.negative{color:#ef4444}.card-stat-bar{height:5px;background:var(--dm-border);border-radius:3px;margin-top:14px;overflow:hidden}.card-stat-fill{height:100%;border-radius:3px;background:linear-gradient(90deg,#6366f1,#8b5cf6)}.card-progress-bar{height:8px;background:var(--dm-border);border-radius:4px;overflow:hidden;margin:8px 0}.card-progress-fill{height:100%;border-radius:4px;background:linear-gradient(90deg,#6366f1,#8b5cf6)}.card-milestone{display:flex;align-items:center;gap:8px;font-size:.8rem;color:var(--dm-text-secondary);padding:3px 0}.card-milestone-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.card-milestone-dot.done{background:#10b981}.card-milestone-dot.pending{background:#e5e7eb}.card-header-icon-stacked{text-align:center;padding:20px 16px 12px}.card-header-icon-stacked [data-icon],.card-header-icon-stacked .card-icon{font-size:2rem;display:block;margin-bottom:8px}.card-step-bg{position:relative;overflow:hidden;min-height:60px;display:flex;align-items:center;padding:14px 16px}.card-step-ghost{position:absolute;right:8px;top:-10px;font-size:5rem;font-weight:900;color:#6366f11f;line-height:1;pointer-events:none}.card-step-badge{width:32px;height:32px;border-radius:50%;background:#6366f1;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.85rem;z-index:1;flex-shrink:0}.card-corner-badge-wrap{position:relative}.card-corner-badge{position:absolute;top:10px;right:10px;background:#ef4444;color:#fff;font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:2px 8px;border-radius:20px}.card-callout{border-left:4px solid #6366f1}.card-callout.warn{border-left-color:#f59e0b}.card-callout.success{border-left-color:#10b981}.card-callout.error{border-left-color:#ef4444}.card-callout-inner{display:flex;gap:12px;align-items:flex-start}.card-callout-icon{font-size:1.2rem;flex-shrink:0;margin-top:1px}.card-quote-mark{font-size:3.5rem;color:#ede9fe;line-height:.8;padding:14px 16px 0;font-family:Georgia,serif;display:block}.card-quote-text{padding:4px 16px 14px;font-style:italic;color:var(--dm-text-secondary);line-height:1.7}.card-quote-attr{display:flex;align-items:center;gap:10px}.card-quote-avatar{width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:.85rem;color:#fff;flex-shrink:0}.card-video-thumb{position:relative;height:160px;background:#1e293b;display:flex;align-items:center;justify-content:center;background-size:cover;background-position:center}.card-play-btn{width:52px;height:52px;border-radius:50%;background:#ffffffe6;display:flex;align-items:center;justify-content:center;font-size:1.2rem;box-shadow:0 4px 16px #0000004d}.card-video-duration{position:absolute;bottom:8px;right:10px;background:#000000b3;color:#fff;font-size:.65rem;font-weight:600;padding:2px 7px;border-radius:4px}.card-map-placeholder{height:130px;background:linear-gradient(160deg,#bfdbfe,#dbeafe);position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden}.card-map-grid{position:absolute;inset:0;background-image:repeating-linear-gradient(0deg,rgba(59,130,246,.08) 0,rgba(59,130,246,.08) 1px,transparent 1px,transparent 32px),repeating-linear-gradient(90deg,rgba(59,130,246,.08) 0,rgba(59,130,246,.08) 1px,transparent 1px,transparent 32px)}.card-map-pin{font-size:2rem;z-index:1}.card-avatar{width:64px;height:64px;border-radius:50%;background:linear-gradient(135deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:1.8rem;color:#fff;margin:0 auto 12px}.card-avatar-wrap{text-align:center;padding:24px 16px 16px}.card-tag-pills{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;margin-top:10px}.card-pill{background:#ede9fe;color:#7c3aed;font-size:.7rem;font-weight:700;padding:3px 9px;border-radius:20px}.card-tag-cloud{padding:14px 16px;display:flex;flex-wrap:wrap;gap:7px}.card-tag{padding:4px 11px;border-radius:20px;font-size:.78rem;font-weight:600}.card-file-row{display:flex;gap:14px;align-items:center;padding:16px}.card-file-icon{width:48px;height:58px;border-radius:7px;background:linear-gradient(160deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:1.4rem;color:#fff;flex-shrink:0;position:relative}.card-file-ext{position:absolute;bottom:4px;left:0;right:0;text-align:center;font-size:.55rem;font-weight:800;color:#ffffffe6;letter-spacing:.05em}.card-file-dl{font-size:.78rem;font-weight:700;color:#6366f1;display:inline-block;margin-top:4px}.card-stars{color:#f59e0b;letter-spacing:2px;padding:14px 16px 0;display:block}.card-verified{display:inline-block;background:#d1fae5;color:#065f46;font-size:.6rem;font-weight:700;padding:1px 5px;border-radius:3px;margin-left:6px}.card-activity-item{display:flex;gap:10px;align-items:flex-start;padding:8px 14px;border-bottom:1px solid var(--dm-border)}.card-activity-item:last-child{border-bottom:none}.card-activity-avatar{width:30px;height:30px;border-radius:50%;flex-shrink:0;background:linear-gradient(135deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:.8rem;color:#fff}.card-compare-grid{display:grid;grid-template-columns:1fr 1fr}.card-compare-col{padding:12px 14px}.card-compare-col+.card-compare-col{border-left:1px solid var(--dm-border)}.card-compare-label{font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.07em;margin-bottom:8px;display:block}.card-compare-label.before{color:#ef4444}.card-compare-label.after{color:#10b981}.card-compare-item{display:flex;gap:7px;align-items:flex-start;font-size:.78rem;color:var(--dm-text-secondary);padding:3px 0;line-height:1.4}.card-compare-x{color:#ef4444;flex-shrink:0}.card-compare-check{color:#10b981;flex-shrink:0}.card-pricing-features{padding:14px 16px}.card-pricing-feature{display:flex;align-items:center;gap:8px;font-size:.82rem;color:var(--dm-text-secondary);padding:4px 0}.card-pricing-check{color:#10b981}.card-pricing-cta{display:block;text-align:center;background:#6366f1;color:#fff;font-size:.82rem;font-weight:700;padding:9px;border-radius:8px;text-decoration:none;margin:0 16px 14px}.card-timeline-row{display:flex}.card-timeline-side{width:44px;flex-shrink:0;display:flex;flex-direction:column;align-items:center;padding-top:14px}.card-timeline-dot{width:12px;height:12px;border-radius:50%;background:#6366f1;flex-shrink:0}.card-timeline-line{width:2px;background:#e5e7eb;flex:1;margin-top:4px}.card-timeline-body{flex:1;padding:12px 14px 12px 0}.card-timeline-date{font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--dm-text-muted)}.card-timeline-tag{display:inline-block;background:#d1fae5;color:#065f46;font-size:.65rem;font-weight:700;padding:2px 6px;border-radius:4px;margin-top:6px}.card-code-header{background:#1e293b;display:flex;justify-content:space-between;align-items:center;padding:8px 14px}.card-code-lang{font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#6366f1}.card-code-body{background:#0f172a;padding:14px;font-family:Courier New,monospace;font-size:.78rem;line-height:1.8;color:#94a3b8;overflow-x:auto}.card-glass-outer{background:linear-gradient(135deg,#6366f1,#8b5cf6,#ec4899);border-radius:12px;padding:2px}.card-glass-inner{background:#ffffffeb;backdrop-filter:blur(10px);border-radius:10px;padding:16px}.card-badge-band{display:flex;align-items:center;justify-content:space-between;padding:12px 16px}.card-badge-band-label{background:#fff3;color:#fff;font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;padding:3px 8px;border-radius:4px}.card-badge-band-icon{font-size:1.4rem}.dm-card-full-bg{background:linear-gradient(160deg,#1e293b,#0f172a);color:#cbd5e1}.dm-card-full-bg .card-body{color:#94a3b8}.dm-card-full-bg .card-title{color:#f1f5f9;font-size:1rem}.dm-card-full-bg .card-footer{border-top-color:#ffffff14;color:#64748b}.card-fc-row{display:flex;justify-content:space-between;align-items:center;padding:8px 16px;border-bottom:1px solid var(--dm-border);font-size:.82rem;color:var(--dm-text-secondary)}.card-fc-row:last-child{border-bottom:none}.card-fc-yes{color:#10b981}.card-fc-no{color:#d1d5db}@media(max-width:480px){.card-layout-thumb-left,.card-layout-thumb-right,.card-layout-horizontal{flex-direction:column}.card-img-left,.card-img-right,.card-img-wide{width:100%;height:120px}.card-layout-split{flex-direction:column}.card-split-left{width:100%;height:100px}}.hero.hero-dark{background:linear-gradient(135deg,#1f2937,#111827);color:#e2e8f0}.hero .hero-content{position:relative;z-index:2}.hero.hero-left .hero-content{text-align:left;align-items:flex-start;max-width:62%}@media(max-width:768px){.hero.hero-left .hero-content{max-width:100%}}.hero .hero-cta{display:flex;gap:.85rem;flex-wrap:wrap;margin-top:1.75rem}.hero .hero-cta a{display:inline-flex;align-items:center;gap:.4rem;padding:.55rem 1.35rem;border-radius:6px;font-size:.95rem;font-weight:500;text-decoration:none;transition:background .2s ease,border-color .2s ease,transform .15s ease,box-shadow .2s ease}.hero .hero-cta a:first-child{background:#ffffffeb;color:#111;border:1px solid transparent}.hero .hero-cta a:first-child:hover{background:#fff;box-shadow:0 4px 16px #00000040;transform:translateY(-2px)}.hero .hero-cta a:last-child{background:transparent;color:#fff;border:1px solid rgba(255,255,255,.4)}.hero .hero-cta a:last-child:hover{border-color:#ffffffbf;background:#ffffff14;transform:translateY(-2px)}.hero .hero-label{display:inline-block;margin-bottom:.9rem;padding:.2rem .8rem;border-radius:999px;font-size:.72rem;font-weight:600;letter-spacing:.07em;text-transform:uppercase;color:#ffffffb3;border:1px solid rgba(255,255,255,.22)}.grid-breakout{width:calc(100vw - 2rem);margin-left:calc(50% - 50vw + 1rem);margin-right:calc(50% - 50vw + 1rem)}.dm-breadcrumbs{position:fixed;z-index:200;display:inline-flex;align-items:center;gap:.2rem;padding:.3rem .8rem;border-radius:999px;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);background:#00000047;border:1px solid rgba(255,255,255,.11);box-shadow:0 2px 10px #00000038;font-size:.72rem;font-weight:500;letter-spacing:.01em;line-height:1.4;max-width:calc(100vw - 2rem);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dm-breadcrumbs .dm-breadcrumbs-item{color:#ffffffa6}.dm-breadcrumbs .dm-breadcrumbs-link{display:inline-flex;align-items:center;gap:.25rem;color:#ffffff8c;text-decoration:none;transition:color .15s}.dm-breadcrumbs .dm-breadcrumbs-home-icon{flex-shrink:0;vertical-align:middle}.dm-breadcrumbs .dm-breadcrumbs-link:hover{color:#fffffff2}.dm-breadcrumbs .dm-breadcrumbs-current{color:#ffffffeb;font-weight:600}.dm-breadcrumbs .dm-breadcrumbs-separator{color:#ffffff47;font-size:.8em;line-height:1;margin:0 .05rem}[data-mode=light] .dm-breadcrumbs{background:#ffffff8c;border-color:#00000012;box-shadow:0 2px 10px #00000014}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-item,[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-link{color:#0000008c}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-link:hover{color:#000000e6}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-current{color:#000000d9}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-separator{color:#00000040}.dm-collection-display{margin:1.5rem 0}.dm-collection-list{display:flex;flex-direction:column;gap:0}.dm-collection-list-item{padding:1rem 0;border-bottom:1px solid var(--border-color, rgba(255, 255, 255, .08))}.dm-collection-list-item:last-child{border-bottom:none}.dm-collection-list-item strong{display:block;font-size:1rem;margin-bottom:.25rem}.dm-collection-list-item p{margin:0;color:var(--text-muted, #888);font-size:.9rem}.dm-collection-empty p{color:var(--text-muted, #888);font-style:italic}.hero-gradient-purple{background:linear-gradient(135deg,#ede9fe,#ddd6fe);color:#1e1b4b}.hero-gradient-blue{background:linear-gradient(135deg,#dbeafe,#bfdbfe);color:#1e3a5f}.hero-gradient-green{background:linear-gradient(135deg,#d1fae5,#a7f3d0);color:#064e3b}.hero-gradient-sunset{background:linear-gradient(135deg,#fef3c7,#fde68a);color:#78350f}.hero-gradient-ocean{background:linear-gradient(135deg,#e0f2fe,#bae6fd);color:#0c4a6e}.hero-gradient-rose{background:linear-gradient(135deg,#fce7f3,#fbcfe8);color:#831843}.hero-gradient-forest{background:linear-gradient(135deg,#dcfce7,#bbf7d0);color:#14532d}.hero-gradient-night{background:linear-gradient(135deg,#334155,#1e293b);color:#e2e8f0}.hero-gradient-ocean-light{background:linear-gradient(135deg,#e0f2fe,#caf0f8);color:#1e293b}.hero-gradient-ocean-dark{background:linear-gradient(135deg,#0c4a6e,#164e63);color:#e2e8f0}.hero-gradient-forest-light{background:linear-gradient(135deg,#d1fae5,#c6f6dc);color:#1e293b}.hero-gradient-forest-dark{background:linear-gradient(135deg,#1a4731,#166534);color:#e2e8f0}.hero-gradient-sunset-light{background:linear-gradient(135deg,#fde8d8,#fddcc9);color:#1e293b}.hero-gradient-sunset-dark{background:linear-gradient(135deg,#6b3727,#7c4036);color:#f5ede8}.hero-gradient-royal-light{background:linear-gradient(135deg,#e8f0fd,#dce8fc);color:#1e293b}.hero-gradient-royal-dark{background:linear-gradient(135deg,#1e3465,#263d7a);color:#e2e8f0}.hero-gradient-lemon-light{background:linear-gradient(135deg,#fefce8,#fef9c3);color:#1e293b}.hero-gradient-lemon-dark{background:linear-gradient(135deg,#5c4d1a,#6b5920);color:#fefce8}.hero-gradient-silver-light{background:linear-gradient(135deg,#f1f5f9,#e2e8f0);color:#1e293b}.hero-gradient-silver-dark{background:linear-gradient(135deg,#2d3748,#374151);color:#e2e8f0}.hero-gradient-charcoal-light{background:linear-gradient(135deg,#eceff1,#e1e7eb);color:#1e293b}.hero-gradient-charcoal-dark{background:linear-gradient(135deg,#2c3843,#374451);color:#e2e8f0}.hero-gradient-christmas-light{background:linear-gradient(135deg,#fde8ea,#fdd5d8);color:#1e293b}.hero-gradient-christmas-dark{background:linear-gradient(135deg,#5c0f1d,#7a1525);color:#fde8ea}.hero-gradient-unicorn-light{background:linear-gradient(135deg,#f5e8fd,#edd6fb);color:#1e293b}.hero-gradient-unicorn-dark{background:linear-gradient(135deg,#3d1a5a,#4a2068);color:#f5e8fd}.hero-gradient-dreamy-light{background:linear-gradient(135deg,#f5ede8,#eeddd4);color:#1e293b}.hero-gradient-dreamy-dark{background:linear-gradient(135deg,#3d2820,#503328);color:#f5ede8}.hero-gradient-grayve-light{background:linear-gradient(135deg,#e0f7f9,#cbf2f5);color:#1e293b}.hero-gradient-grayve-dark{background:linear-gradient(135deg,#00363d,#00444d);color:#e0f7f9}.hero-gradient-mint-light{background:linear-gradient(135deg,#d8f5ea,#c5efdd);color:#1e293b}.hero-gradient-mint-dark{background:linear-gradient(135deg,#134d33,#195f3f);color:#d8f5ea}.hero-gradient-wedding-light{background:linear-gradient(135deg,#faf3e0,#f5e9c7);color:#1e293b}.hero-gradient-wedding-dark{background:linear-gradient(135deg,#5c4418,#6f5320);color:#faf3e0}.tabs-centered{text-align:center}.tabs-centered .tab-list{display:inline-flex}.tabs-centered .tab-content{text-align:left}.site-main{overflow-x:hidden}@media(max-width:768px){.hero .hero-cta a,.dm-so-trigger,.dm-cta-trigger{min-height:44px;padding:.6rem 1.25rem}}.dm-banner{position:relative;display:flex;flex-direction:row;align-items:flex-start;gap:.75rem;padding:.85rem 2.5rem .85rem 1rem;border-radius:var(--dm-radius, 6px);border-left:4px solid transparent;margin-bottom:1rem}.dm-banner__icon{flex-shrink:0;margin-top:.1rem;width:1.15rem;height:1.15rem}.dm-banner__icon svg{width:1.15rem;height:1.15rem}.dm-banner__body{flex:1;min-width:0}.dm-banner__title{display:block;margin-bottom:.2rem;font-size:.9em;font-weight:600}.dm-banner__dismiss{position:absolute;top:.5rem;right:.5rem;background:transparent;border:none;cursor:pointer;font-size:1.1rem;line-height:1;padding:.1rem .3rem;opacity:.6}.dm-banner__dismiss:hover{opacity:1}.dm-banner--info{background:color-mix(in srgb,var(--dm-info, #3b82f6) 12%,transparent);border-left-color:var(--dm-info, #3b82f6);color:inherit}.dm-banner--success{background:color-mix(in srgb,var(--dm-success, #22c55e) 12%,transparent);border-left-color:var(--dm-success, #22c55e);color:inherit}.dm-banner--warning{background:color-mix(in srgb,var(--dm-warning, #f59e0b) 12%,transparent);border-left-color:var(--dm-warning, #f59e0b);color:inherit}.dm-banner--danger{background:color-mix(in srgb,var(--dm-danger, #ef4444) 12%,transparent);border-left-color:var(--dm-danger, #ef4444);color:inherit}.dm-banner--neutral{background:color-mix(in srgb,var(--dm-text-muted, #888) 12%,transparent);border-left-color:var(--dm-text-muted, #888);color:inherit}body.dm-layout-narrow .page-body{max-width:768px;margin-inline:auto}body.dm-layout-normal .page-body{max-width:1100px;margin-inline:auto}body.dm-layout-wide .page-body{max-width:1280px;margin-inline:auto}body.dm-layout-full .page-body{max-width:none}.hero h1{font-size:clamp(2.4rem,4.5vw,3.75rem);font-weight:900;line-height:1.08;letter-spacing:-.03em}.hero-gradient-dreamy-light h1{color:#1e293b}.hero-gradient-dreamy-light p{font-size:1.125rem;line-height:1.7;color:#1e293bcc;max-width:48ch}.page-body h2{font-weight:800;letter-spacing:-.025em}.page-body h3{font-weight:700;letter-spacing:-.015em}.hero-gradient-dreamy-light .hero-cta a:first-child{background:#1e293b!important;color:#f5ede8!important;border-color:#1e293b!important}.hero-gradient-dreamy-light .hero-cta a:first-child:hover{background:#0f172a!important;color:#fff!important}.hero-gradient-dreamy-light .hero-cta a:last-child{background:transparent!important;color:#1e293b!important;border:1px solid rgba(30,41,59,.45)!important}.hero-gradient-dreamy-light .hero-cta a:last-child:hover{background:#1e293b14!important;border-color:#1e293bb3!important}.card[data-hover=true]{transition:transform .22s ease,box-shadow .22s ease!important;will-change:transform}.card[data-hover=true]:hover{transform:translateY(-5px)!important;box-shadow:0 24px 64px #0003,0 8px 24px #0000001f!important}.card-icon{font-size:2.5rem!important;margin-bottom:12px!important;opacity:.95}.card-avatar-wrap{padding:20px 16px 12px!important;gap:.5rem}.mk-card-icon-wrap,.card-icon-wrap{width:3rem;height:3rem;border-radius:.75rem;background:#ffffff2e;display:flex;align-items:center;justify-content:center;margin-bottom:1.125rem;font-size:1.3rem;flex-shrink:0;box-shadow:0 2px 8px #0000001f}.mk-card-corner-badge,.card-corner-badge{position:absolute;top:1rem;right:1rem;background:linear-gradient(135deg,#f59e0b,#d97706);color:#fff;font-size:.6875rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;padding:.25rem .7rem;border-radius:99px;box-shadow:0 2px 10px #f59e0b73}.card-premium .card-subtitle{display:inline-block!important;font-size:.6875rem!important;font-weight:700!important;letter-spacing:.07em!important;text-transform:uppercase!important;opacity:1!important;color:#fff!important;background:linear-gradient(135deg,#f59e0b,#d97706)!important;padding:.2rem .65rem!important;border-radius:99px!important;box-shadow:0 2px 8px #f59e0b66!important;margin-bottom:.75rem!important}.mk-card-badge-band,.card-badge-band{display:inline-flex;align-items:center;gap:.35rem;font-size:.6875rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;padding:.2rem .6rem;border-radius:99px;margin-bottom:.875rem;background:#fff3;border:1px solid rgba(255,255,255,.3)}.mk-card-stars,.card-stars{color:#f59e0b;font-size:1rem;letter-spacing:.12em;margin-bottom:.75rem}.mk-card-reviewer,.card-reviewer{display:flex;flex-direction:column;gap:.15rem;margin-top:1rem;padding-top:1rem;border-top:1px solid rgba(255,255,255,.15)}.mk-card-reviewer-name,.card-reviewer-name{font-weight:700;font-size:.9375rem}.mk-card-reviewer-role,.card-reviewer-role{font-size:.8125rem;opacity:.65}.mk-banner.type-info,[class*=banner-info],.mk-banner[data-type=info]{border-left:4px solid #5c3d2e}.mk-banner.type-success,[class*=banner-success],.mk-banner[data-type=success]{border-left:4px solid #22c55e}.mk-banner.type-warning,[class*=banner-warning],.mk-banner[data-type=warning]{border-left:4px solid #f59e0b}.mk-stat-number{font-size:5rem;font-weight:900;line-height:1;letter-spacing:-.03em;color:#5c3d2e}.mk-stat-label{font-size:.9375rem;font-weight:600;opacity:.65;margin-top:.5rem;letter-spacing:.02em;text-transform:uppercase}.mk-footer-inner{max-width:1200px;margin:0 auto;padding:3rem 2rem 1.5rem}.mk-footer-columns{display:grid;grid-template-columns:repeat(4,1fr);gap:2rem;margin-bottom:2.5rem}@media(max-width:900px){.mk-footer-columns{grid-template-columns:repeat(2,1fr)}}@media(max-width:480px){.mk-footer-columns{grid-template-columns:1fr}}.mk-footer-col-title{font-size:.75rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;opacity:.5;margin:0 0 .75rem}.mk-footer-col-links{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.4rem}.mk-footer-col-links a{font-size:.875rem;opacity:.75;text-decoration:none;transition:opacity .15s}.mk-footer-col-links a:hover{opacity:1}.mk-footer-bottom{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem;padding-top:1.5rem;border-top:1px solid rgba(0,0,0,.08)}.mk-footer-copyright{font-size:.8125rem;opacity:.5;margin:0}.mk-footer-bottom-right{display:flex;align-items:center;gap:1.25rem}.mk-footer-social{display:flex;gap:.75rem}.mk-footer-social-link{opacity:.5;transition:opacity .15s;font-size:1.125rem}.mk-footer-social-link:hover{opacity:1}.mk-motion-label{display:flex;align-items:center;gap:.4rem;font-size:.75rem;opacity:.5;cursor:pointer;user-select:none}.mk-motion-label:hover{opacity:.75}.dm-static-block{display:contents}.mk-window{border-radius:10px;overflow:hidden;box-shadow:0 16px 56px #0000002e,0 4px 16px #0000001a;background:#fff;border:1px solid rgba(0,0,0,.06)}.mk-window-bar{background:#e8e8e8;padding:10px 16px;display:flex;gap:7px;align-items:center}.mk-dot{width:12px;height:12px;border-radius:50%;flex-shrink:0}.mk-dot-red{background:#ff5f57}.mk-dot-amber{background:#febc2e}.mk-dot-green{background:#28c840}.mk-window-body img{width:100%;display:block;max-height:480px;object-fit:cover;object-position:top}.dm-static-block+p{margin-top:.5rem}.navbar-link.active{opacity:1!important;font-weight:700!important;position:relative}.navbar-link.active:after{content:"";position:absolute;bottom:-3px;left:0;right:0;height:2px;background:currentColor;border-radius:2px;opacity:.6}.mk-divider{border:none;border-top:1px solid rgba(0,0,0,.07);margin:0}.page-body .mk-tabs,.page-body .tabs-wrapper,.page-body>.tabs{padding-left:1.5rem;padding-right:1.5rem}.mk-section-label,.section-label{display:inline-block;font-size:.75rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;padding:.3rem .875rem;border-radius:99px;margin-bottom:1.125rem;background:#5c3d2e1a;color:#5c3d2e;border:1px solid rgba(92,61,46,.2)}.page-body .btn-primary,.page-body a.btn-primary{background-color:var(--dm-primary, #8d6e63)!important;color:var(--dm-text-inverse, #ffffff)!important;border:1px solid var(--dm-primary, #8d6e63)!important;text-decoration:none!important;transition:background-color .15s ease,border-color .15s ease,color .15s ease}.page-body .btn-primary:hover,.page-body a.btn-primary:hover{background-color:var(--dm-primary-hover, #6d4c41)!important;color:var(--dm-text-inverse, #ffffff)!important;border-color:var(--dm-primary-hover, #6d4c41)!important;text-decoration:none!important}.page-body .btn-outline,.page-body a.btn-outline{background-color:transparent!important;color:var(--dm-primary, #8d6e63)!important;border:1.5px solid var(--dm-primary, #8d6e63)!important;text-decoration:none!important;transition:background-color .15s ease,border-color .15s ease,color .15s ease}.page-body .btn-outline:hover,.page-body a.btn-outline:hover{background-color:var(--dm-primary, #8d6e63)!important;color:var(--dm-text-inverse, #ffffff)!important;border-color:var(--dm-primary, #8d6e63)!important;text-decoration:none!important}.page-body .btn-ghost,.page-body a.btn-ghost{background-color:transparent!important;color:var(--dm-primary, #8d6e63)!important;border:1px solid transparent!important;text-decoration:none!important;transition:background-color .15s ease,color .15s ease}.page-body .btn-ghost:hover,.page-body a.btn-ghost:hover{background-color:var(--dm-primary-light, rgba(141, 110, 99, .1))!important;color:var(--dm-primary-hover, #6d4c41)!important;text-decoration:none!important}.mk-card-step-number,.card-step-number{font-size:3rem;font-weight:900;line-height:1;letter-spacing:-.04em;opacity:.25;margin-bottom:.75rem}.mk-card-step-title,.card-step-title{font-size:1rem;font-weight:700;margin-bottom:.5rem}.card[data-badge=Enterprise] .mk-card-corner-badge,.card[data-badge=Enterprise] .card-corner-badge{background:linear-gradient(135deg,#1e293b,#334155);box-shadow:0 2px 10px #1e293b80}.card-badge-band-icon{font-size:1.75rem!important}.card-badge-band{padding:14px 18px!important;gap:.5rem}.card-badge-band-label{font-size:.7rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.card-title{font-size:1.2rem!important;font-weight:800!important;letter-spacing:-.015em!important;line-height:1.25!important;margin-bottom:.4rem!important;color:#f1f5f9!important}.card-subtitle{font-size:.8125rem!important;opacity:.7!important;margin-bottom:.5rem!important;font-weight:500!important;color:#f1f5f9!important}.mk-card-body p,.card-body p,.card>p{font-size:.9375rem;line-height:1.65;opacity:.88}.card-gradient-purple{background:linear-gradient(135deg,#ede9fe,#ddd6fe)!important;color:#1e1b4b!important}.card-gradient-blue{background:linear-gradient(135deg,#dbeafe,#bfdbfe)!important;color:#1e3a5f!important}.card-gradient-green{background:linear-gradient(135deg,#d1fae5,#a7f3d0)!important;color:#064e3b!important}.card-gradient-night{background:linear-gradient(135deg,#334155,#1e293b)!important;color:#e2e8f0!important}.card-gradient-ocean-light{background:linear-gradient(135deg,#e0f2fe,#caf0f8)!important;color:#1e293b!important}.card-gradient-ocean-dark{background:linear-gradient(135deg,#0c4a6e,#164e63)!important;color:#e2e8f0!important}.card-gradient-forest-light{background:linear-gradient(135deg,#d1fae5,#c6f6dc)!important;color:#1e293b!important}.card-gradient-forest-dark{background:linear-gradient(135deg,#1a4731,#166534)!important;color:#e2e8f0!important}.card-gradient-sunset-light{background:linear-gradient(135deg,#fde8d8,#fddcc9)!important;color:#1e293b!important}.card-gradient-sunset-dark{background:linear-gradient(135deg,#6b3727,#7c4036)!important;color:#f5ede8!important}.card-gradient-royal-light{background:linear-gradient(135deg,#e8f0fd,#dce8fc)!important;color:#1e293b!important}.card-gradient-royal-dark{background:linear-gradient(135deg,#1e3465,#263d7a)!important;color:#e2e8f0!important}.card-gradient-lemon-light{background:linear-gradient(135deg,#fefce8,#fef9c3)!important;color:#1e293b!important}.card-gradient-lemon-dark{background:linear-gradient(135deg,#5c4d1a,#6b5920)!important;color:#fefce8!important}.card-gradient-silver-light{background:linear-gradient(135deg,#f1f5f9,#e2e8f0)!important;color:#1e293b!important}.card-gradient-silver-dark{background:linear-gradient(135deg,#2d3748,#374151)!important;color:#e2e8f0!important}.card-gradient-charcoal-light{background:linear-gradient(135deg,#eceff1,#e1e7eb)!important;color:#1e293b!important}.card-gradient-charcoal-dark{background:linear-gradient(135deg,#2c3843,#374451)!important;color:#e2e8f0!important}.card-gradient-christmas-light{background:linear-gradient(135deg,#fde8ea,#fdd5d8)!important;color:#1e293b!important}.card-gradient-christmas-dark{background:linear-gradient(135deg,#5c0f1d,#7a1525)!important;color:#fde8ea!important}.card-gradient-unicorn-light{background:linear-gradient(135deg,#f5e8fd,#edd6fb)!important;color:#1e293b!important}.card-gradient-unicorn-dark{background:linear-gradient(135deg,#3d1a5a,#4a2068)!important;color:#f5e8fd!important}.card-gradient-dreamy-light{background:linear-gradient(135deg,#f5ede8,#eeddd4)!important;color:#1e293b!important}.card-gradient-dreamy-dark{background:linear-gradient(135deg,#3d2820,#503328)!important;color:#f5ede8!important}.card-gradient-grayve-light{background:linear-gradient(135deg,#e0f7f9,#cbf2f5)!important;color:#1e293b!important}.card-gradient-grayve-dark{background:linear-gradient(135deg,#00363d,#00444d)!important;color:#e0f7f9!important}.card-gradient-mint-light{background:linear-gradient(135deg,#d8f5ea,#c5efdd)!important;color:#1e293b!important}.card-gradient-mint-dark{background:linear-gradient(135deg,#134d33,#195f3f)!important;color:#d8f5ea!important}.card-gradient-wedding-light{background:linear-gradient(135deg,#faf3e0,#f5e9c7)!important;color:#1e293b!important}.card-gradient-wedding-dark{background:linear-gradient(135deg,#5c4418,#6f5320)!important;color:#faf3e0!important}.card-gradient-slate{--dm-card-g-start: #475569;--dm-card-g-end: #1e293b}.card-gradient-dusk{--dm-card-g-start: #7c3aed;--dm-card-g-end: #db2777}.card-gradient-sunset{--dm-card-g-start: #f59e0b;--dm-card-g-end: #ec4899}.card-gradient-rose{--dm-card-g-start: #fb7185;--dm-card-g-end: #e11d48}.card-gradient-gold{--dm-card-g-start: #f59e0b;--dm-card-g-end: #b45309}.card-gradient-fire{--dm-card-g-start: #ef4444;--dm-card-g-end: #fbbf24}.page-body .card.dm-card-gradient.card-gradient-sunset .card-header,.page-body .card.dm-card-gradient.card-gradient-rose .card-header,.page-body .card.dm-card-gradient.card-gradient-gold .card-header,.page-body .card.dm-card-gradient.card-gradient-fire .card-header{color:#1e293b!important}.page-body .card.dm-card-gradient[class*=-light] .card-header,.page-body .card.dm-card-gradient[class*=-dark] .card-header,.page-body .card.dm-card-gradient.card-gradient-purple .card-header,.page-body .card.dm-card-gradient.card-gradient-blue .card-header,.page-body .card.dm-card-gradient.card-gradient-green .card-header,.page-body .card.dm-card-gradient.card-gradient-night .card-header{background:transparent!important;color:inherit!important;border-bottom:1px solid rgba(0,0,0,.08)}.card[class*=card-gradient-] .card-title,.card[class*=card-gradient-] .card-subtitle{color:inherit!important}.card[class*=gradient] .mk-window-bar,.card[data-gradient] .mk-window-bar{background:#00000040}.card[class*=gradient] .mk-dot-red{background:#ff5f57b3}.card[class*=gradient] .mk-dot-amber{background:#febc2eb3}.card[class*=gradient] .mk-dot-green{background:#28c840b3}.hero .card .mk-listgroup-item,.hero .card .list-group-item{padding-top:.45rem;padding-bottom:.45rem;font-size:.9rem}.card .dm-static-block{display:block;width:100%}.card .mk-window{margin-bottom:0}.wf-feature{display:flex;align-items:center;gap:14px;padding:14px 16px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 1px 3px #0f172a0a;transition:border-color .15s ease,box-shadow .15s ease,transform .15s ease}.wf-feature:hover{border-color:#475569;box-shadow:0 6px 18px #0f172a14;transform:translateY(-1px)}.wf-feature-icon{flex-shrink:0;width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#475569,#1e293b);color:#f1f5f9;border-radius:8px;font-size:1.1rem}.wf-feature-text{font-size:.9rem;font-weight:500;color:#1e293b;line-height:1.4;flex:1 1 auto}.plugin-card{display:flex;flex-direction:column;background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;box-shadow:0 2px 6px #0f172a0d;text-decoration:none!important;color:inherit!important;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease;height:100%;min-height:340px}.plugin-card:hover{transform:translateY(-3px);box-shadow:0 18px 40px #0f172a1f;border-color:#475569}.plugin-card-cover{position:relative;width:100%;height:150px;background-size:cover;background-position:center;background-color:#e2e8f0;flex-shrink:0}.plugin-card-cover:after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,#0000001a,#0f172a8c)}.plugin-card-tier-badge{position:absolute;top:12px;right:12px;z-index:2;font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;padding:4px 10px;border-radius:20px;color:#1e293b;background:#fff;box-shadow:0 2px 8px #0f172a40}.plugin-card[data-tier=free] .plugin-card-tier-badge:before{content:"Free"}.plugin-card[data-tier=premium] .plugin-card-tier-badge:before{content:"Premium"}.plugin-card[data-tier=premium] .plugin-card-tier-badge{color:#f1f5f9;background:linear-gradient(135deg,#475569,#1e293b)}.plugin-card-body{flex:1 1 auto;padding:20px;display:flex;flex-direction:column;gap:10px;background:#fff;color:#1e293b}.plugin-card-head{display:flex;align-items:center;gap:12px}.plugin-card-icon{flex-shrink:0;width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#475569,#1e293b);color:#f1f5f9;border-radius:10px;font-size:1.3rem;box-shadow:0 2px 6px #0f172a2e}.plugin-card-title{font-size:1.15rem!important;font-weight:700!important;color:#1e293b!important;line-height:1.2!important;margin:0!important}.plugin-card-desc{font-size:.88rem!important;color:#475569!important;line-height:1.5!important;margin:0!important;flex:1 1 auto}.plugin-card-cta{display:inline-flex;align-items:center;gap:4px;font-size:.82rem;font-weight:600;color:#475569;margin-top:8px;transition:color .15s ease,gap .15s ease}.plugin-card:hover .plugin-card-cta{color:#1e293b;gap:8px}.page-body a:not([class*=btn]):not(.plugin-card):not([class*=nav]):not([class*=footer]){color:var(--dm-primary, var(--dm-text, #5d4037))!important;text-decoration:underline;text-decoration-color:var(--dm-border, rgba(0, 0, 0, .2));text-underline-offset:3px;text-decoration-thickness:1.5px;transition:color .15s ease,text-decoration-color .15s ease}.page-body a:not([class*=btn]):not(.plugin-card):not([class*=nav]):not([class*=footer]):hover{color:var(--dm-primary-hover, var(--dm-text, #3e2723))!important;text-decoration-color:var(--dm-primary, currentColor)}.page-body .dm-card-gradient .card-body a:not([class*=btn]){color:var(--dm-primary, var(--dm-text, #5d4037))!important}.page-body .dm-card-gradient .card-body a:not([class*=btn]):hover{color:var(--dm-primary-hover, var(--dm-text, #3e2723))!important}html body .page-body a[href]:not([class*=btn]):not(.plugin-card):not([class*=nav]):not([class*=footer]):not(.dm-breadcrumbs-link){color:var(--dm-primary, #8d6e63)!important}html body .page-body a[href]:not([class*=btn]):not(.plugin-card):not([class*=nav]):not([class*=footer]):not(.dm-breadcrumbs-link):hover{color:var(--dm-primary-hover, #6d4c41)!important}.page-body .hero-cta:not(.hero .hero-cta) a:not([class*=btn]),.page-body>* .hero-cta a:not([class*=btn]){color:var(--dm-primary, #8d6e63)!important;text-decoration:none!important;background:transparent;border:1px solid var(--dm-border, rgba(141, 110, 99, .35));padding:.55rem 1.35rem;border-radius:6px;font-weight:500;display:inline-flex;align-items:center;gap:.4rem;transition:background .15s ease,border-color .15s ease,color .15s ease}.page-body .hero-cta:not(.hero .hero-cta) a:not([class*=btn]):hover,.page-body>* .hero-cta a:not([class*=btn]):hover{color:var(--dm-primary-hover, #6d4c41)!important;background:var(--dm-primary-light, rgba(141, 110, 99, .08));border-color:var(--dm-primary, #8d6e63)}.feature-image{width:100%;max-height:420px;object-fit:cover;border-radius:12px;box-shadow:0 12px 36px #0f172a26;display:block}.page-body .grid>.col:has(>.feature-image),.page-body .grid>.col:has(.reveal>.feature-image),.page-body .grid>.col:has(.feature-image){display:flex;flex-direction:column;justify-content:center}.code-label{display:inline-flex;align-items:center;gap:8px;font-family:Fira Code,Consolas,Monaco,monospace;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#f1f5f9bf;background:#0f172a8c;padding:6px 12px;border-radius:6px 6px 0 0;border-bottom:1px solid rgba(241,245,249,.12)}.code-label+.code-block{margin-top:0!important;border-top-left-radius:0;border-top-right-radius:0}.code-block{display:block;background:#0f172a!important;color:#e2e8f0!important;padding:18px 20px!important;border-radius:8px;overflow-x:auto;font-size:.85rem;line-height:1.55;margin:0 0 20px;box-shadow:inset 0 0 0 1px #f1f5f914;white-space:pre;font-family:Fira Code,Consolas,Monaco,Courier New,monospace}.code-block code{background:transparent!important;color:inherit!important;padding:0!important;font-family:inherit!important;font-size:inherit;white-space:pre;display:block}.page-body .card-body>pre>code,.page-body .card-body pre.code-block>code{color:#e2e8f0!important}.run-option-card{display:flex;flex-direction:column;background:#fff;border:1px solid #e2e8f0;border-radius:14px;overflow:hidden;box-shadow:0 4px 14px #0f172a14;height:100%;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease}.run-option-card:hover{transform:translateY(-3px);box-shadow:0 20px 48px #0f172a24;border-color:#475569}.run-option-banner{position:relative;width:100%;height:180px;background-size:cover;background-position:center;background-color:#e2e8f0;flex-shrink:0}.run-option-banner:after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,#0f172a1a,#0f172ab3)}.run-option-icon-chip{position:absolute;bottom:-26px;left:24px;z-index:2;width:56px;height:56px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#475569,#1e293b);color:#f1f5f9;border-radius:14px;font-size:1.6rem;box-shadow:0 8px 20px #0f172a4d;border:3px solid #fff}.run-option-card-body{flex:1 1 auto;padding:40px 24px 24px;display:flex;flex-direction:column;gap:10px}.run-option-title{font-size:1.5rem!important;font-weight:800!important;color:#1e293b!important;margin:0!important;line-height:1.15!important;letter-spacing:-.01em!important}.run-option-sub{font-size:.9rem!important;font-weight:600!important;color:var(--dm-primary, #5d4037)!important;margin:0 0 8px!important;text-transform:uppercase;letter-spacing:.06em}.run-option-content{flex:1 1 auto;font-size:.92rem;line-height:1.55;color:#475569}.run-option-content p{margin:0 0 12px}.run-option-content .run-option-intro{font-size:.98rem;color:#1e293b;font-weight:500;margin-bottom:16px}.run-option-content .run-option-body-label{font-size:.82rem;text-transform:uppercase;letter-spacing:.08em;color:var(--dm-primary, #5d4037);margin-bottom:8px}.run-option-content .run-option-req{font-size:.82rem;color:#64748b;margin-top:14px}.run-option-content .code-block{margin:8px 0 14px}.run-option-list{list-style:none;padding:0;margin:0 0 14px;display:flex;flex-direction:column;gap:8px}.run-option-list li{display:flex;align-items:center;gap:10px;font-size:.9rem;color:#1e293b}.run-option-list li [data-icon]{color:var(--dm-primary, #5d4037);flex-shrink:0}.run-option-ctas{display:flex;flex-wrap:wrap;gap:10px;margin-top:20px;padding-top:20px;border-top:1px solid #e2e8f0}.run-option-ctas .btn{flex:1 1 auto;text-align:center;white-space:nowrap;min-width:fit-content}.quickstart-step{position:relative;padding:28px 22px 24px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 2px 8px #0f172a0d;overflow:hidden;height:100%;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease}.quickstart-step:hover{transform:translateY(-3px);box-shadow:0 16px 36px #0f172a1f;border-color:#475569}.quickstart-step-number{position:absolute;top:8px;right:14px;font-size:5rem;font-weight:900;line-height:1;color:#47556914;font-variant-numeric:tabular-nums;pointer-events:none;user-select:none}.quickstart-step-icon{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;background:linear-gradient(135deg,#475569,#1e293b);color:#f1f5f9;border-radius:10px;font-size:1.3rem;margin-bottom:14px;box-shadow:0 4px 12px #0f172a2e;position:relative;z-index:1}.quickstart-step-title{font-size:1.1rem!important;font-weight:800!important;color:#1e293b!important;margin:0 0 8px!important;line-height:1.2!important;letter-spacing:-.01em!important;position:relative;z-index:1}.quickstart-step-desc{font-size:.86rem;line-height:1.55;color:#475569;margin:0;position:relative;z-index:1}
|
|
@@ -80,7 +80,16 @@ function renderCollectionBlocks(entries, blockTemplate, emptyMsg, ctaOpts, cols)
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
const items = entries.map(e => {
|
|
83
|
-
|
|
83
|
+
// Triple-brace `{{{field}}}` — raw HTML pass-through (no escape).
|
|
84
|
+
// Use for fields that contain pre-rendered HTML (bullet lists, code
|
|
85
|
+
// blocks, embedded elements). Must be processed BEFORE double-brace
|
|
86
|
+
// so the outer `{` and `}` of a triple match aren't consumed by the
|
|
87
|
+
// double-brace regex.
|
|
88
|
+
let html = blockTemplate.replace(/\{\{\{(\w+)\}\}\}/g, (_, key) => {
|
|
89
|
+
return String(e.data?.[key] ?? '');
|
|
90
|
+
});
|
|
91
|
+
// Double-brace `{{field}}` — HTML-escaped (default, safe).
|
|
92
|
+
html = html.replace(/\{\{([\w_]+)\}\}/g, (_, key) => {
|
|
84
93
|
if (key === '_id') return escapeHtmlText(e.id ?? '');
|
|
85
94
|
if (key === '_createdAt') return escapeHtmlText(e.meta?.createdAt ?? '');
|
|
86
95
|
if (key === '_updatedAt') return escapeHtmlText(e.meta?.updatedAt ?? '');
|
|
@@ -107,7 +116,9 @@ function renderCollectionBlocks(entries, blockTemplate, emptyMsg, ctaOpts, cols)
|
|
|
107
116
|
}
|
|
108
117
|
|
|
109
118
|
function renderBlockFromAttrs(tmpl, attrs) {
|
|
110
|
-
|
|
119
|
+
// Triple-brace raw pass-through first, then double-brace escaped.
|
|
120
|
+
let rendered = tmpl.replace(/\{\{\{(\w+)\}\}\}/g, (_, key) => String(attrs[key] ?? ''));
|
|
121
|
+
rendered = rendered.replace(/\{\{([\w_]+)\}\}/g, (_, key) => escapeHtmlText(attrs[key] ?? ''));
|
|
111
122
|
const extraClass = attrs.class ? ` ${escapeAttr(attrs.class)}` : '';
|
|
112
123
|
const idAttr = attrs.id ? ` id="${escapeAttr(attrs.id)}"` : '';
|
|
113
124
|
return `<div class="dm-static-block${extraClass}"${idAttr}>${rendered}</div>`;
|
|
@@ -442,6 +453,22 @@ async function processCollectionBlocks(markdown) {
|
|
|
442
453
|
if (!schema) throw new Error('not found');
|
|
443
454
|
|
|
444
455
|
let {entries} = await listEntries(slug);
|
|
456
|
+
|
|
457
|
+
// Row-level filter: where="field=value" (simple equality only).
|
|
458
|
+
// Comma-separate multiple predicates, all AND'd together.
|
|
459
|
+
// Example: where="tab=developers" or where="tab=developers,status=live"
|
|
460
|
+
const whereAttr = typeof attrs.where === 'string' ? attrs.where.trim() : '';
|
|
461
|
+
if (whereAttr) {
|
|
462
|
+
const predicates = whereAttr.split(',').map(p => p.trim()).filter(Boolean).map(p => {
|
|
463
|
+
const eq = p.indexOf('=');
|
|
464
|
+
if (eq === -1) return null;
|
|
465
|
+
return { key: p.slice(0, eq).trim(), val: p.slice(eq + 1).trim() };
|
|
466
|
+
}).filter(Boolean);
|
|
467
|
+
if (predicates.length) {
|
|
468
|
+
entries = entries.filter(e => predicates.every(({key, val}) => String(e.data?.[key] ?? '') === val));
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
445
472
|
entries = sortEntries(entries, sort, order);
|
|
446
473
|
if (limitAttr > 0) entries = entries.slice(0, limitAttr);
|
|
447
474
|
|
|
@@ -755,7 +782,12 @@ function processGridBlocks(markdown) {
|
|
|
755
782
|
const attrs = parseShortcodeAttrs(attrStr);
|
|
756
783
|
const cls = attrs.span ? ` class="col-span-${attrs.span}"` : ' class="col"';
|
|
757
784
|
const id = attrs.id ? ` id="${escapeAttr(attrs.id)}"` : '';
|
|
758
|
-
|
|
785
|
+
// Restore the col body before passing it downstream — otherwise the
|
|
786
|
+
// scrub placeholders from this processor's store get carried into
|
|
787
|
+
// processCardBlocks, which creates its own empty store and fails to
|
|
788
|
+
// decode them, producing the literal string "undefined" in place of
|
|
789
|
+
// whatever was in <pre>, ``` fences, or `inline code`.
|
|
790
|
+
return `<div${cls}${id}>${marked.parse(processCardBlocks(restore(body.trim())))}</div>`;
|
|
759
791
|
}
|
|
760
792
|
);
|
|
761
793
|
|
|
@@ -1345,16 +1377,14 @@ function renderLegacyCard(attrs, body, markedInstance, escAttr) {
|
|
|
1345
1377
|
const icon = strAttr('icon');
|
|
1346
1378
|
const footer = strAttr('footer');
|
|
1347
1379
|
const collapsible = attrs.collapsible === 'true';
|
|
1348
|
-
const hover = 'hover' in attrs;
|
|
1349
1380
|
const variant = strAttr('variant');
|
|
1350
|
-
const extraClass = strAttr('class');
|
|
1351
1381
|
|
|
1352
|
-
// Root class list
|
|
1353
|
-
|
|
1382
|
+
// Root class list — delegate to the shared helper so variant="gradient",
|
|
1383
|
+
// gradient="<name>", glass/accent/dark/glow, font, shadow, rounded, etc.
|
|
1384
|
+
// all work on legacy cards (cards without a `layout` attribute).
|
|
1385
|
+
const classes = cardVariantClasses(attrs);
|
|
1386
|
+
// Preserve legacy support for variant="primary" (not handled by cardVariantClasses).
|
|
1354
1387
|
if (variant === 'primary') classes.push('card-primary');
|
|
1355
|
-
if (hover) classes.push('card-hover');
|
|
1356
|
-
if (collapsible) classes.push('card-collapsible');
|
|
1357
|
-
if (extraClass) classes.push(extraClass);
|
|
1358
1388
|
|
|
1359
1389
|
const id = attrs.id ? ` id="${escAttr(attrs.id)}"` : '';
|
|
1360
1390
|
const coll = collapsible ? ' data-collapsible="true"' : '';
|
|
@@ -1440,9 +1470,16 @@ function processCardBlocks(markdown) {
|
|
|
1440
1470
|
const attrs = parseShortcodeAttrs(attrStr);
|
|
1441
1471
|
const layout = typeof attrs.layout === 'string' ? attrs.layout.trim() : '';
|
|
1442
1472
|
const renderer = LAYOUT_RENDERERS[layout];
|
|
1473
|
+
// Restore code regions INSIDE the card body before rendering so
|
|
1474
|
+
// marked can process fenced code blocks (```lang ... ```) normally.
|
|
1475
|
+
// Without this, the body contains placeholder tokens that marked
|
|
1476
|
+
// wraps in <p>, and the outer restore() call then substitutes raw
|
|
1477
|
+
// backticks into the <p>, producing literal '```json' text and
|
|
1478
|
+
// collapsing the HTML on any inline-backtick template literal.
|
|
1479
|
+
const restoredBody = restore(body);
|
|
1443
1480
|
return renderer
|
|
1444
|
-
? renderer(attrs,
|
|
1445
|
-
: renderLegacyCard(attrs,
|
|
1481
|
+
? renderer(attrs, restoredBody, marked, escapeAttr)
|
|
1482
|
+
: renderLegacyCard(attrs, restoredBody, marked, escapeAttr);
|
|
1446
1483
|
}
|
|
1447
1484
|
));
|
|
1448
1485
|
}
|
|
@@ -1865,8 +1902,9 @@ function processTextBlocks(markdown) {
|
|
|
1865
1902
|
styles.push('font-style:italic');
|
|
1866
1903
|
}
|
|
1867
1904
|
|
|
1868
|
-
|
|
1869
|
-
|
|
1905
|
+
const colourVal = attrs.colour || attrs.color;
|
|
1906
|
+
if (colourVal) {
|
|
1907
|
+
styles.push(`color:${COLOR_TOKENS[colourVal] || colourVal}`);
|
|
1870
1908
|
}
|
|
1871
1909
|
|
|
1872
1910
|
if (attrs.font && FONT_MAP[attrs.font]) {
|