@docsector/docsector-reader 3.5.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +11 -11
  2. package/bin/docsector.js +1 -283
  3. package/package.json +1 -1
  4. package/public/images/cards/getting-started-cover.svg +60 -0
  5. package/public/images/cards/quick-links-cover.svg +71 -0
  6. package/src/components/{DPageBlockquote.vue → DBlockBlockquote.vue} +4 -0
  7. package/src/components/DBlockCards.vue +223 -0
  8. package/src/components/{DPageEmbeddedUrl.vue → DBlockEmbeddedUrl.vue} +1 -1
  9. package/src/components/{DPageExpandable.vue → DBlockExpandable.vue} +4 -0
  10. package/src/components/{DPageFile.vue → DBlockFile.vue} +1 -1
  11. package/src/components/{DPageImage.vue → DBlockImage.vue} +1 -1
  12. package/src/components/{DMermaidDiagram.vue → DBlockMermaidDiagram.vue} +4 -0
  13. package/src/components/{DQuickLinks.vue → DBlockQuickLinks.vue} +4 -0
  14. package/src/components/{DPageSourceCode.vue → DBlockSourceCode.vue} +6 -1
  15. package/src/components/DBlockStepper.vue +210 -0
  16. package/src/components/DBlockTimeline.vue +319 -0
  17. package/src/components/DPageTokens.vue +51 -18
  18. package/src/components/page-section-tokens.js +334 -9
  19. package/src/i18n/languages/en-US.hjson +5 -0
  20. package/src/i18n/languages/pt-BR.hjson +5 -0
  21. package/src/pages/guide/i18n-and-markdown.overview.en-US.md +6 -6
  22. package/src/pages/guide/i18n-and-markdown.overview.pt-BR.md +6 -6
  23. package/src/pages/guide/theming.overview.en-US.md +1 -1
  24. package/src/pages/guide/theming.overview.pt-BR.md +1 -1
  25. package/src/pages/manual/content/blocks/cards.overview.en-US.md +32 -0
  26. package/src/pages/manual/content/blocks/cards.overview.pt-BR.md +32 -0
  27. package/src/pages/manual/content/blocks/cards.showcase.en-US.md +39 -0
  28. package/src/pages/manual/content/blocks/cards.showcase.pt-BR.md +39 -0
  29. package/src/pages/manual/content/blocks/embedded-urls.overview.en-US.md +3 -3
  30. package/src/pages/manual/content/blocks/embedded-urls.overview.pt-BR.md +3 -3
  31. package/src/pages/manual/content/blocks/embedded-urls.showcase.en-US.md +8 -8
  32. package/src/pages/manual/content/blocks/embedded-urls.showcase.pt-BR.md +8 -8
  33. package/src/pages/manual/content/blocks/expandable.overview.en-US.md +8 -8
  34. package/src/pages/manual/content/blocks/expandable.overview.pt-BR.md +8 -8
  35. package/src/pages/manual/content/blocks/expandable.showcase.en-US.md +6 -6
  36. package/src/pages/manual/content/blocks/expandable.showcase.pt-BR.md +6 -6
  37. package/src/pages/manual/content/blocks/files.overview.en-US.md +3 -3
  38. package/src/pages/manual/content/blocks/files.overview.pt-BR.md +3 -3
  39. package/src/pages/manual/content/blocks/files.showcase.en-US.md +5 -5
  40. package/src/pages/manual/content/blocks/files.showcase.pt-BR.md +5 -5
  41. package/src/pages/manual/content/blocks/quick-links.overview.en-US.md +4 -4
  42. package/src/pages/manual/content/blocks/quick-links.overview.pt-BR.md +4 -4
  43. package/src/pages/manual/content/blocks/quick-links.showcase.en-US.md +9 -9
  44. package/src/pages/manual/content/blocks/quick-links.showcase.pt-BR.md +9 -9
  45. package/src/pages/manual/content/blocks/stepper.overview.en-US.md +59 -0
  46. package/src/pages/manual/content/blocks/stepper.overview.pt-BR.md +59 -0
  47. package/src/pages/manual/content/blocks/stepper.showcase.en-US.md +115 -0
  48. package/src/pages/manual/content/blocks/stepper.showcase.pt-BR.md +115 -0
  49. package/src/pages/manual/content/blocks/timeline.overview.en-US.md +47 -0
  50. package/src/pages/manual/content/blocks/timeline.overview.pt-BR.md +47 -0
  51. package/src/pages/manual/content/blocks/timeline.showcase.en-US.md +170 -0
  52. package/src/pages/manual/content/blocks/timeline.showcase.pt-BR.md +170 -0
  53. package/src/pages/manual.index.js +84 -0
package/README.md CHANGED
@@ -64,17 +64,17 @@ Transform Markdown content into beautiful, navigable documentation sites — wit
64
64
  - 📅 **Last Updated Date** — Automatic per-page "last updated" date from git commit history, locale-formatted
65
65
  - 📊 **Translation Progress** — Automatic translation percentage based on header coverage
66
66
  - 🌐 **Accurate Available Translations** — Locale availability counter now uses actual localized page source presence, avoiding false negatives when metadata is equal
67
- - 🧠 **Markdown Negotiation** — Responds with Markdown when clients send `Accept: text/markdown`, while keeping HTML as browser default
68
- - 🔐 **Web Bot Auth** — Can publish a signed HTTP message signatures directory and includes helpers to sign outbound bot requests
69
- - 🧭 **Content Signals** — Injects `Content-Signal` policy in `robots.txt` with deterministic, idempotent build output
70
67
  - 🏠 **Markdown Home at Root** — Homepage is rendered from `src/pages/Homepage.{lang}.md` directly at `/`
71
68
  - 🌍 **Remote README as Home** — Optional build-time remote README source for homepage with automatic local fallback
72
69
  - 🔗 **GitHub-Compatible Heading Anchors** — Markdown headings use GitHub-style slugs so standard README Table of Contents links work inside Docsector
73
70
  - 🧬 **Scaffolded Homepage Override Wiring** — New consumer projects automatically wire `virtual:docsector-homepage-override` into i18n message building
74
- - 📖 **Expandable Markdown Sections** — Use `<d-expandable title="...">...</d-expandable>` to collapse secondary content while keeping rich Markdown support inside the body
75
- - 📎 **File Attachment Blocks** — Use `<d-file src="/files/...">...</d-file>` in Markdown to render downloadable file cards with automatic local size detection and support for external URLs
76
- - 🌐 **Embedded URL Blocks** — Use `<d-embedded-url url="https://...">...</d-embedded-url>` to render curated embeds for YouTube, Vimeo, Spotify, and CodePen with a safe link-card fallback for unsupported URLs
77
- - 🧭 **Quick Links Custom Element** — Use `<d-quick-links>` and `<d-quick-link>` in Markdown to render rich home navigation cards
71
+ - 📖 **Expandable Markdown Sections** — Use `<d-block-expandable title="...">...</d-block-expandable>` to collapse secondary content while keeping rich Markdown support inside the body
72
+ - 1️⃣ **Stepper Guides** — Use `<d-block-stepper>` with nested `<d-block-step title="...">...</d-block-step>` items to render native Quasar vertical steppers with rich Markdown and optional per-step icon overrides
73
+ - 🕒 **Timeline Updates** — Use `<d-block-timeline>` with nested `<d-block-timeline-item date="...">...</d-block-timeline-item>` entries and optional `<d-block-timeline-tag>` labels to publish GitBook-inspired changelog items with direct-link anchors, tag icons/colors, and rich Markdown bodies
74
+ - 📎 **File Attachment Blocks** — Use `<d-block-file src="/files/...">...</d-block-file>` in Markdown to render downloadable file cards with automatic local size detection and support for external URLs
75
+ - 🌐 **Embedded URL Blocks** — Use `<d-block-embedded-url url="https://...">...</d-block-embedded-url>` to render curated embeds for YouTube, Vimeo, Spotify, and CodePen with a safe link-card fallback for unsupported URLs
76
+ - 🧭 **Quick Links Custom Element** — Use `<d-block-quick-links>` and `<d-block-quick-link>` in Markdown to render rich home navigation cards
77
+ - 🗂️ **Cards Custom Element** — Use `<d-block-cards>` and `<d-block-card>` in Markdown to render linked content cards with optional cover images
78
78
  - 🗂️ **API Catalog Well-Known** — Auto-generates `/.well-known/api-catalog` as Linkset JSON for machine-readable API discovery
79
79
  - 🗃️ **Multi-Version History** — Archive older major versions under `src/pages/.old/<version>/` and expose them at prefixed routes (e.g. `/v0.x/guide/...`) while keeping the current docs at unprefixed routes
80
80
  - 🏷️ **Version Selector Badges** — Every version in the sidebar selector displays a color-coded badge: green for released, orange for draft, red for deprecated; fully customizable via `badge: { label, color, textColor }`
@@ -1025,9 +1025,9 @@ Regular blockquotes without `[!TYPE]` continue to work normally.
1025
1025
  ### File Attachment Blocks
1026
1026
 
1027
1027
  ```html
1028
- <d-file src="/files/manual/release-checklist.txt" title="Release checklist" size="1 KB">
1028
+ <d-block-file src="/files/manual/release-checklist.txt" title="Release checklist" size="1 KB">
1029
1029
  Download the example file bundled with the docs.
1030
- </d-file>
1030
+ </d-block-file>
1031
1031
  ```
1032
1032
 
1033
1033
  Notes:
@@ -1040,9 +1040,9 @@ Notes:
1040
1040
  ### Embedded URL Blocks
1041
1041
 
1042
1042
  ```html
1043
- <d-embedded-url url="https://www.youtube.com/watch?v=M7lc1UVf-VE" title="YouTube player demo">
1043
+ <d-block-embedded-url url="https://www.youtube.com/watch?v=M7lc1UVf-VE" title="YouTube player demo">
1044
1044
  Optional caption rendered as inline Markdown.
1045
- </d-embedded-url>
1045
+ </d-block-embedded-url>
1046
1046
  ```
1047
1047
 
1048
1048
  Notes:
package/bin/docsector.js CHANGED
@@ -23,7 +23,7 @@ const packageRoot = resolve(__dirname, '..')
23
23
  const args = process.argv.slice(2)
24
24
  const command = args[0]
25
25
 
26
- const VERSION = '3.5.0'
26
+ const VERSION = '4.0.0'
27
27
 
28
28
  const HELP = `
29
29
  Docsector Reader v${VERSION}
@@ -488,288 +488,6 @@ Docsector Reader is a markdown-first documentation engine.
488
488
  - Repository: [docsector/docsector-reader](https://github.com/docsector/docsector-reader)
489
489
  `
490
490
 
491
- const TEMPLATE_BOOT_PAGE = `\
492
- <template>
493
- <q-page-container>
494
- <q-page class="boot-page">
495
- <!-- Hero Section -->
496
- <div class="hero-section">
497
- <div class="hero-content">
498
- <div class="hero-icon-container">
499
- <q-icon name="auto_stories" size="64px" color="white" />
500
- </div>
501
- <h1 class="hero-title">{{ projectName }}</h1>
502
- <p class="hero-subtitle">{{ $t('_.home.texts[0]') }}{{ projectName }}</p>
503
- <p class="hero-description">{{ $t('_.home.texts[2]') }}</p>
504
- <div class="hero-actions">
505
- <q-btn
506
- unelevated
507
- color="white"
508
- text-color="primary"
509
- label="Get Started"
510
- icon="rocket_launch"
511
- to="/guide/getting-started/overview"
512
- class="hero-btn"
513
- size="lg"
514
- no-caps
515
- />
516
- <q-btn
517
- v-if="projectUrl !== '#'"
518
- outline
519
- color="white"
520
- label="GitHub"
521
- icon="fab fa-github"
522
- @click="openURL(projectUrl)"
523
- class="hero-btn"
524
- size="lg"
525
- no-caps
526
- />
527
- </div>
528
- </div>
529
- </div>
530
-
531
- <!-- Features Section -->
532
- <div class="features-section">
533
- <div class="features-grid">
534
- <div class="feature-card">
535
- <q-icon name="edit_note" size="40px" color="primary" />
536
- <h3>Markdown Powered</h3>
537
- <p>Write your documentation in Markdown. Pages are automatically converted into beautiful, navigable content.</p>
538
- </div>
539
- <div class="feature-card">
540
- <q-icon name="translate" size="40px" color="primary" />
541
- <h3>Multi-language</h3>
542
- <p>Built-in i18n support. Add translations by creating locale files — no extra configuration needed.</p>
543
- </div>
544
- <div class="feature-card">
545
- <q-icon name="palette" size="40px" color="primary" />
546
- <h3>Beautiful UI</h3>
547
- <p>Powered by Quasar Framework. Responsive, accessible, and production-ready out of the box.</p>
548
- </div>
549
- <div class="feature-card">
550
- <q-icon name="bolt" size="40px" color="primary" />
551
- <h3>Lightning Fast</h3>
552
- <p>Vite-powered dev server with hot-reload. See your changes instantly as you write.</p>
553
- </div>
554
- <div class="feature-card">
555
- <q-icon name="search" size="40px" color="primary" />
556
- <h3>Full-text Search</h3>
557
- <p>Instant client-side search across all your documentation pages and translations.</p>
558
- </div>
559
- <div class="feature-card">
560
- <q-icon name="settings" size="40px" color="primary" />
561
- <h3>Easy Configuration</h3>
562
- <p>One config file for branding, links, languages, and GitHub integration.</p>
563
- </div>
564
- </div>
565
- </div>
566
-
567
- <!-- Quick Start Section -->
568
- <div class="quickstart-section">
569
- <h2 class="section-title">Quick Links</h2>
570
- <div class="quickstart-grid">
571
- <q-card flat bordered class="quickstart-card" clickable @click="$router.push('/guide/getting-started/overview')">
572
- <q-card-section horizontal>
573
- <q-card-section class="flex flex-center" style="width: 60px;">
574
- <q-icon name="flag" size="28px" color="primary" />
575
- </q-card-section>
576
- <q-card-section>
577
- <div class="text-subtitle1 text-weight-bold">Getting Started</div>
578
- <div class="text-caption text-grey-7">Installation, setup, and your first page</div>
579
- </q-card-section>
580
- <q-space />
581
- <q-card-section class="flex flex-center">
582
- <q-icon name="chevron_right" color="grey-5" />
583
- </q-card-section>
584
- </q-card-section>
585
- </q-card>
586
- </div>
587
- </div>
588
-
589
- <!-- Footer -->
590
- <div class="boot-footer">
591
- <p>{{ $t('_.home.texts[1]') }}
592
- <a :href="projectUrl" target="_blank" class="footer-link">Docsector Reader</a>
593
- </p>
594
- </div>
595
- </q-page>
596
- </q-page-container>
597
- </template>
598
-
599
- <script setup>
600
- import { openURL } from 'quasar'
601
- import docsectorConfig from 'docsector.config.js'
602
-
603
- defineOptions({ name: 'BootPage' })
604
-
605
- const projectName = docsectorConfig.branding?.name || 'My Documentation'
606
- const projectUrl = docsectorConfig.links?.github || '#'
607
- </script>
608
-
609
- <style lang="sass" scoped>
610
- .boot-page
611
- padding: 0 !important
612
-
613
- // Hero
614
- .hero-section
615
- background: linear-gradient(135deg, #655529 0%, #8b7340 50%, #a08850 100%)
616
- color: white
617
- padding: 80px 24px 60px
618
- text-align: center
619
- position: relative
620
- overflow: hidden
621
-
622
- &::before
623
- content: ''
624
- position: absolute
625
- top: -50%
626
- left: -50%
627
- width: 200%
628
- height: 200%
629
- background: radial-gradient(circle, rgba(255,255,255,0.05) 0%, transparent 60%)
630
- animation: pulse 8s ease-in-out infinite
631
-
632
- @keyframes pulse
633
- 0%, 100%
634
- transform: scale(1)
635
- 50%
636
- transform: scale(1.1)
637
-
638
- .hero-content
639
- position: relative
640
- z-index: 1
641
- max-width: 700px
642
- margin: 0 auto
643
-
644
- .hero-icon-container
645
- margin-bottom: 24px
646
- .q-icon
647
- opacity: 0.9
648
-
649
- .hero-title
650
- font-size: 2.8rem
651
- font-weight: 700
652
- margin: 0 0 12px
653
- line-height: 1.2
654
- letter-spacing: -0.02em
655
-
656
- .hero-subtitle
657
- font-size: 1.2rem
658
- opacity: 0.9
659
- margin: 0 0 8px
660
- font-weight: 400
661
-
662
- .hero-description
663
- font-size: 1rem
664
- opacity: 0.7
665
- margin: 0 0 32px
666
-
667
- .hero-actions
668
- display: flex
669
- gap: 16px
670
- justify-content: center
671
- flex-wrap: wrap
672
-
673
- .hero-btn
674
- border-radius: 8px
675
- padding: 8px 28px
676
- font-weight: 600
677
-
678
- // Features
679
- .features-section
680
- padding: 60px 24px
681
- max-width: 1100px
682
- margin: 0 auto
683
-
684
- .features-grid
685
- display: grid
686
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr))
687
- gap: 24px
688
-
689
- .feature-card
690
- padding: 28px 24px
691
- border-radius: 12px
692
- border: 1px solid #e8e8e8
693
- transition: transform 0.2s, box-shadow 0.2s
694
- text-align: center
695
-
696
- &:hover
697
- transform: translateY(-4px)
698
- box-shadow: 0 8px 25px rgba(0,0,0,0.08)
699
-
700
- h3
701
- font-size: 1.1rem
702
- font-weight: 600
703
- margin: 16px 0 8px
704
- color: #333
705
-
706
- p
707
- font-size: 0.9rem
708
- color: #666
709
- line-height: 1.5
710
- margin: 0
711
-
712
- // Quick Start
713
- .quickstart-section
714
- padding: 40px 24px 60px
715
- max-width: 700px
716
- margin: 0 auto
717
-
718
- .section-title
719
- font-size: 1.6rem
720
- font-weight: 700
721
- text-align: center
722
- margin: 0 0 24px
723
- color: #333
724
-
725
- .quickstart-grid
726
- display: flex
727
- flex-direction: column
728
- gap: 12px
729
-
730
- .quickstart-card
731
- border-radius: 10px
732
- transition: box-shadow 0.2s
733
- cursor: pointer
734
-
735
- &:hover
736
- box-shadow: 0 4px 15px rgba(0,0,0,0.1)
737
-
738
- // Footer
739
- .boot-footer
740
- text-align: center
741
- padding: 24px
742
- border-top: 1px solid #e8e8e8
743
- color: #999
744
- font-size: 0.85rem
745
-
746
- .footer-link
747
- color: #655529
748
- text-decoration: none
749
- font-weight: 500
750
-
751
- &:hover
752
- text-decoration: underline
753
-
754
- // Dark mode
755
- body.body--dark
756
- .feature-card
757
- border-color: #333
758
- h3
759
- color: #e0e0e0
760
- p
761
- color: #aaa
762
-
763
- .section-title
764
- color: #e0e0e0
765
-
766
- .boot-footer
767
- border-color: #333
768
- .footer-link
769
- color: #c4a856
770
- </style>
771
- `
772
-
773
491
  const TEMPLATE_404_PAGE = `\
774
492
  <template>
775
493
  <q-page-container>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@docsector/docsector-reader",
3
- "version": "3.5.0",
3
+ "version": "4.0.0",
4
4
  "description": "A documentation rendering engine built with Vue 3, Quasar v2 and Vite. Transform Markdown into beautiful, navigable documentation sites.",
5
5
  "productName": "Docsector Reader",
6
6
  "author": "Rodrigo de Araujo Vieira",
@@ -0,0 +1,60 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" role="img" aria-labelledby="title desc">
2
+ <title id="title">Getting started cover</title>
3
+ <desc id="desc">Abstract cover with warm gradients and onboarding steps.</desc>
4
+ <defs>
5
+ <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
6
+ <stop offset="0%" stop-color="#12141c"/>
7
+ <stop offset="48%" stop-color="#1b2230"/>
8
+ <stop offset="100%" stop-color="#27384d"/>
9
+ </linearGradient>
10
+ <linearGradient id="panel" x1="0" y1="0" x2="1" y2="1">
11
+ <stop offset="0%" stop-color="#f1d8a1" stop-opacity="0.95"/>
12
+ <stop offset="100%" stop-color="#b78f41" stop-opacity="0.85"/>
13
+ </linearGradient>
14
+ <linearGradient id="accent" x1="0" y1="0" x2="1" y2="0">
15
+ <stop offset="0%" stop-color="#69d8c3"/>
16
+ <stop offset="100%" stop-color="#8ab6ff"/>
17
+ </linearGradient>
18
+ <filter id="blur" x="-20%" y="-20%" width="140%" height="140%">
19
+ <feGaussianBlur stdDeviation="24"/>
20
+ </filter>
21
+ </defs>
22
+
23
+ <rect width="1280" height="720" fill="url(#bg)"/>
24
+ <circle cx="1120" cy="132" r="136" fill="#69d8c3" opacity="0.16" filter="url(#blur)"/>
25
+ <circle cx="180" cy="640" r="170" fill="#8ab6ff" opacity="0.18" filter="url(#blur)"/>
26
+
27
+ <rect x="90" y="96" width="470" height="528" rx="34" fill="#0f141c" opacity="0.92" stroke="#3a4c63"/>
28
+ <rect x="126" y="140" width="398" height="18" rx="9" fill="url(#accent)" opacity="0.9"/>
29
+ <rect x="126" y="188" width="182" height="28" rx="14" fill="#f5efe1" opacity="0.92"/>
30
+ <rect x="126" y="242" width="300" height="16" rx="8" fill="#8da6c7" opacity="0.7"/>
31
+ <rect x="126" y="272" width="260" height="16" rx="8" fill="#8da6c7" opacity="0.55"/>
32
+
33
+ <g transform="translate(126 344)">
34
+ <rect width="318" height="68" rx="18" fill="#17212d" stroke="#32465d"/>
35
+ <circle cx="36" cy="34" r="15" fill="#69d8c3"/>
36
+ <path d="M29 34l5 5 10-12" fill="none" stroke="#0d1722" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
37
+ <rect x="72" y="22" width="110" height="12" rx="6" fill="#f1f5f9"/>
38
+ <rect x="72" y="42" width="160" height="10" rx="5" fill="#8da6c7" opacity="0.75"/>
39
+ </g>
40
+
41
+ <g transform="translate(126 430)">
42
+ <rect width="356" height="68" rx="18" fill="#17212d" stroke="#32465d"/>
43
+ <circle cx="36" cy="34" r="15" fill="#69d8c3" opacity="0.82"/>
44
+ <path d="M29 34l5 5 10-12" fill="none" stroke="#0d1722" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
45
+ <rect x="72" y="22" width="132" height="12" rx="6" fill="#f1f5f9"/>
46
+ <rect x="72" y="42" width="200" height="10" rx="5" fill="#8da6c7" opacity="0.75"/>
47
+ </g>
48
+
49
+ <g transform="translate(640 88)">
50
+ <rect width="548" height="548" rx="44" fill="url(#panel)"/>
51
+ <rect x="78" y="84" width="392" height="244" rx="26" fill="#0f141c" opacity="0.92"/>
52
+ <path d="M128 282c42-72 86-108 132-108 35 0 69 15 103 44 31 27 58 40 80 40 39 0 73-21 104-64l29 20c-42 63-87 94-136 94-33 0-67-13-102-39-32-24-60-36-84-36-34 0-67 28-98 84z" fill="#69d8c3"/>
53
+ <circle cx="272" cy="206" r="46" fill="#8ab6ff" opacity="0.92"/>
54
+ <rect x="78" y="372" width="188" height="22" rx="11" fill="#0f141c" opacity="0.88"/>
55
+ <rect x="78" y="414" width="300" height="16" rx="8" fill="#243447" opacity="0.6"/>
56
+ <rect x="78" y="444" width="262" height="16" rx="8" fill="#243447" opacity="0.44"/>
57
+ <rect x="78" y="484" width="164" height="56" rx="18" fill="#0f141c" opacity="0.88"/>
58
+ <rect x="102" y="506" width="114" height="12" rx="6" fill="#f5efe1" opacity="0.88"/>
59
+ </g>
60
+ </svg>
@@ -0,0 +1,71 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" role="img" aria-labelledby="title desc">
2
+ <title id="title">Quick links cover</title>
3
+ <desc id="desc">Abstract navigation cover with cards and directional accents.</desc>
4
+ <defs>
5
+ <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
6
+ <stop offset="0%" stop-color="#10261f"/>
7
+ <stop offset="45%" stop-color="#16372d"/>
8
+ <stop offset="100%" stop-color="#1e4d3e"/>
9
+ </linearGradient>
10
+ <linearGradient id="card" x1="0" y1="0" x2="1" y2="1">
11
+ <stop offset="0%" stop-color="#f3f0e7"/>
12
+ <stop offset="100%" stop-color="#d5ddd1"/>
13
+ </linearGradient>
14
+ <linearGradient id="accent" x1="0" y1="0" x2="1" y2="0">
15
+ <stop offset="0%" stop-color="#69d8c3"/>
16
+ <stop offset="100%" stop-color="#d3b874"/>
17
+ </linearGradient>
18
+ <filter id="blur" x="-20%" y="-20%" width="140%" height="140%">
19
+ <feGaussianBlur stdDeviation="26"/>
20
+ </filter>
21
+ </defs>
22
+
23
+ <rect width="1280" height="720" fill="url(#bg)"/>
24
+ <circle cx="154" cy="138" r="126" fill="#69d8c3" opacity="0.18" filter="url(#blur)"/>
25
+ <circle cx="1090" cy="598" r="170" fill="#d3b874" opacity="0.16" filter="url(#blur)"/>
26
+
27
+ <g transform="translate(98 112)">
28
+ <rect width="452" height="480" rx="42" fill="#0f1714" opacity="0.94" stroke="#385247"/>
29
+ <rect x="44" y="48" width="162" height="18" rx="9" fill="url(#accent)"/>
30
+ <rect x="44" y="100" width="278" height="18" rx="9" fill="#f3f0e7" opacity="0.94"/>
31
+ <rect x="44" y="136" width="212" height="14" rx="7" fill="#9cb5ac" opacity="0.58"/>
32
+
33
+ <g transform="translate(44 204)">
34
+ <rect width="364" height="86" rx="24" fill="#17231e" stroke="#33493f"/>
35
+ <rect x="28" y="24" width="116" height="12" rx="6" fill="#f3f0e7"/>
36
+ <rect x="28" y="46" width="176" height="10" rx="5" fill="#8aa196" opacity="0.82"/>
37
+ <circle cx="320" cy="43" r="20" fill="#22362d"/>
38
+ <path d="M311 43h18M321 34l9 9-9 9" fill="none" stroke="#69d8c3" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
39
+ </g>
40
+
41
+ <g transform="translate(44 310)">
42
+ <rect width="330" height="86" rx="24" fill="#17231e" stroke="#33493f"/>
43
+ <rect x="28" y="24" width="96" height="12" rx="6" fill="#f3f0e7"/>
44
+ <rect x="28" y="46" width="156" height="10" rx="5" fill="#8aa196" opacity="0.82"/>
45
+ <circle cx="286" cy="43" r="20" fill="#22362d"/>
46
+ <path d="M277 43h18M287 34l9 9-9 9" fill="none" stroke="#69d8c3" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
47
+ </g>
48
+ </g>
49
+
50
+ <g transform="translate(646 100)">
51
+ <rect width="536" height="520" rx="44" fill="url(#card)" opacity="0.98"/>
52
+ <rect x="58" y="56" width="420" height="248" rx="28" fill="#0f1714" opacity="0.94"/>
53
+ <g transform="translate(110 114)">
54
+ <rect width="116" height="116" rx="28" fill="#69d8c3"/>
55
+ <path d="M40 58h36M58 40l18 18-18 18" fill="none" stroke="#0f1714" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"/>
56
+ </g>
57
+ <g transform="translate(250 114)">
58
+ <rect width="116" height="116" rx="28" fill="#d3b874"/>
59
+ <path d="M40 58h36M58 40l18 18-18 18" fill="none" stroke="#0f1714" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"/>
60
+ </g>
61
+ <g transform="translate(180 272)">
62
+ <rect width="116" height="116" rx="28" fill="#8ab6ff"/>
63
+ <path d="M40 58h36M58 40l18 18-18 18" fill="none" stroke="#0f1714" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"/>
64
+ </g>
65
+ <rect x="58" y="360" width="204" height="18" rx="9" fill="#10261f" opacity="0.92"/>
66
+ <rect x="58" y="396" width="294" height="14" rx="7" fill="#425b52" opacity="0.6"/>
67
+ <rect x="58" y="424" width="248" height="14" rx="7" fill="#425b52" opacity="0.42"/>
68
+ <rect x="58" y="470" width="172" height="58" rx="18" fill="#10261f" opacity="0.92"/>
69
+ <rect x="84" y="493" width="120" height="12" rx="6" fill="#f3f0e7" opacity="0.92"/>
70
+ </g>
71
+ </svg>
@@ -2,6 +2,10 @@
2
2
  // defineProps is a compiler macro in <script setup>, no import needed
3
3
  import { computed } from 'vue'
4
4
 
5
+ defineOptions({
6
+ name: 'DBlockBlockquote'
7
+ })
8
+
5
9
  const props = defineProps({
6
10
  message: {
7
11
  type: String,