@life-and-dev/mdsite 0.0.3

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 (133) hide show
  1. package/README.md +228 -0
  2. package/bin/mdsite.js +3 -0
  3. package/dist/commands/commands.test.d.ts +1 -0
  4. package/dist/commands/commands.test.js +302 -0
  5. package/dist/commands/commands.test.js.map +1 -0
  6. package/dist/commands/generate.d.ts +1 -0
  7. package/dist/commands/generate.js +20 -0
  8. package/dist/commands/generate.js.map +1 -0
  9. package/dist/commands/init.d.ts +1 -0
  10. package/dist/commands/init.js +16 -0
  11. package/dist/commands/init.js.map +1 -0
  12. package/dist/commands/prepare.d.ts +1 -0
  13. package/dist/commands/prepare.js +111 -0
  14. package/dist/commands/prepare.js.map +1 -0
  15. package/dist/commands/prepare.test.d.ts +1 -0
  16. package/dist/commands/prepare.test.js +131 -0
  17. package/dist/commands/prepare.test.js.map +1 -0
  18. package/dist/commands/preview.d.ts +5 -0
  19. package/dist/commands/preview.js +62 -0
  20. package/dist/commands/preview.js.map +1 -0
  21. package/dist/commands/start.d.ts +5 -0
  22. package/dist/commands/start.js +50 -0
  23. package/dist/commands/start.js.map +1 -0
  24. package/dist/commands/stop.d.ts +1 -0
  25. package/dist/commands/stop.js +26 -0
  26. package/dist/commands/stop.js.map +1 -0
  27. package/dist/commands/workflows.test.d.ts +1 -0
  28. package/dist/commands/workflows.test.js +183 -0
  29. package/dist/commands/workflows.test.js.map +1 -0
  30. package/dist/config/default-mdsite-config.d.ts +2 -0
  31. package/dist/config/default-mdsite-config.js +82 -0
  32. package/dist/config/default-mdsite-config.js.map +1 -0
  33. package/dist/config/default-mdsite-config.test.d.ts +1 -0
  34. package/dist/config/default-mdsite-config.test.js +42 -0
  35. package/dist/config/default-mdsite-config.test.js.map +1 -0
  36. package/dist/config/mdsite-config.d.ts +42 -0
  37. package/dist/config/mdsite-config.js +74 -0
  38. package/dist/config/mdsite-config.js.map +1 -0
  39. package/dist/config/mdsite-config.test.d.ts +1 -0
  40. package/dist/config/mdsite-config.test.js +115 -0
  41. package/dist/config/mdsite-config.test.js.map +1 -0
  42. package/dist/config/menu.d.ts +3 -0
  43. package/dist/config/menu.js +58 -0
  44. package/dist/config/menu.js.map +1 -0
  45. package/dist/config/menu.test.d.ts +1 -0
  46. package/dist/config/menu.test.js +53 -0
  47. package/dist/config/menu.test.js.map +1 -0
  48. package/dist/index.d.ts +2 -0
  49. package/dist/index.js +99 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/index.test.d.ts +1 -0
  52. package/dist/index.test.js +133 -0
  53. package/dist/index.test.js.map +1 -0
  54. package/dist/process/child-process.d.ts +9 -0
  55. package/dist/process/child-process.js +142 -0
  56. package/dist/process/child-process.js.map +1 -0
  57. package/dist/process/child-process.test.d.ts +1 -0
  58. package/dist/process/child-process.test.js +131 -0
  59. package/dist/process/child-process.test.js.map +1 -0
  60. package/dist/process/runtime-state.d.ts +16 -0
  61. package/dist/process/runtime-state.js +42 -0
  62. package/dist/process/runtime-state.js.map +1 -0
  63. package/dist/process/runtime-state.test.d.ts +1 -0
  64. package/dist/process/runtime-state.test.js +57 -0
  65. package/dist/process/runtime-state.test.js.map +1 -0
  66. package/dist/renderer/mdsite-nuxt.d.ts +22 -0
  67. package/dist/renderer/mdsite-nuxt.js +194 -0
  68. package/dist/renderer/mdsite-nuxt.js.map +1 -0
  69. package/dist/renderer/mdsite-nuxt.test.d.ts +1 -0
  70. package/dist/renderer/mdsite-nuxt.test.js +226 -0
  71. package/dist/renderer/mdsite-nuxt.test.js.map +1 -0
  72. package/mdsite-nuxt/app/app.vue +7 -0
  73. package/mdsite-nuxt/app/assets/css/bible-tooltips.css +87 -0
  74. package/mdsite-nuxt/app/assets/css/markdown.css +195 -0
  75. package/mdsite-nuxt/app/assets/css/print.css +133 -0
  76. package/mdsite-nuxt/app/components/AppBar.vue +138 -0
  77. package/mdsite-nuxt/app/components/AppFooter.vue +88 -0
  78. package/mdsite-nuxt/app/components/AppNavigation.vue +162 -0
  79. package/mdsite-nuxt/app/components/AppTableOfContents.vue +149 -0
  80. package/mdsite-nuxt/app/components/BreadcrumbNav.vue +139 -0
  81. package/mdsite-nuxt/app/components/NavigationTree.vue +169 -0
  82. package/mdsite-nuxt/app/components/SearchBox.vue +212 -0
  83. package/mdsite-nuxt/app/components/TocItem.vue +75 -0
  84. package/mdsite-nuxt/app/components/TreeNode.vue +264 -0
  85. package/mdsite-nuxt/app/components/content/MarkdownAlert.vue +42 -0
  86. package/mdsite-nuxt/app/components/content/Mermaid.vue +103 -0
  87. package/mdsite-nuxt/app/components/content/ProseA.vue +57 -0
  88. package/mdsite-nuxt/app/components/content/ProseBlockquote.vue +14 -0
  89. package/mdsite-nuxt/app/components/content/ProsePre.vue +49 -0
  90. package/mdsite-nuxt/app/components/content/ProseTable.vue +143 -0
  91. package/mdsite-nuxt/app/composables/useAppTheme.ts +89 -0
  92. package/mdsite-nuxt/app/composables/useBibleTooltips.ts +21 -0
  93. package/mdsite-nuxt/app/composables/useBreadcrumbs.ts +70 -0
  94. package/mdsite-nuxt/app/composables/useContentPostProcessing.ts +89 -0
  95. package/mdsite-nuxt/app/composables/useNavigationTree.ts +174 -0
  96. package/mdsite-nuxt/app/composables/useSearchIndex.ts +47 -0
  97. package/mdsite-nuxt/app/composables/useSearchRelevance.test.ts +255 -0
  98. package/mdsite-nuxt/app/composables/useSearchRelevance.ts +207 -0
  99. package/mdsite-nuxt/app/composables/useSidebarState.ts +62 -0
  100. package/mdsite-nuxt/app/composables/useSiteConfig.ts +37 -0
  101. package/mdsite-nuxt/app/composables/useSourceEdit.ts +69 -0
  102. package/mdsite-nuxt/app/composables/useTableOfContents.ts +141 -0
  103. package/mdsite-nuxt/app/composables/useTableParser.ts +106 -0
  104. package/mdsite-nuxt/app/composables/useTooltipConfig.ts +20 -0
  105. package/mdsite-nuxt/app/config/themes.ts +17 -0
  106. package/mdsite-nuxt/app/layouts/default.vue +376 -0
  107. package/mdsite-nuxt/app/pages/[...slug].vue +56 -0
  108. package/mdsite-nuxt/app/pages/index.vue +54 -0
  109. package/mdsite-nuxt/app/plugins/bible-tooltips.client.ts +401 -0
  110. package/mdsite-nuxt/app/plugins/bible-tooltips.test.ts +284 -0
  111. package/mdsite-nuxt/app/types/content.d.ts +10 -0
  112. package/mdsite-nuxt/app/types/table.ts +57 -0
  113. package/mdsite-nuxt/app/utils/bible-book-names.ts +37 -0
  114. package/mdsite-nuxt/app/utils/bible-verse-utils.test.ts +148 -0
  115. package/mdsite-nuxt/app/utils/bible-verse-utils.ts +236 -0
  116. package/mdsite-nuxt/content.config.ts +18 -0
  117. package/mdsite-nuxt/example.config.yml +67 -0
  118. package/mdsite-nuxt/nuxt.config.ts +247 -0
  119. package/mdsite-nuxt/package-lock.json +15922 -0
  120. package/mdsite-nuxt/package.json +50 -0
  121. package/mdsite-nuxt/playwright.config.js +47 -0
  122. package/mdsite-nuxt/public/robots.txt +2 -0
  123. package/mdsite-nuxt/scripts/generate-favicons.ts +192 -0
  124. package/mdsite-nuxt/scripts/generate-indices.ts +508 -0
  125. package/mdsite-nuxt/scripts/renderer-hooks.test.ts +277 -0
  126. package/mdsite-nuxt/scripts/renderer-hooks.ts +141 -0
  127. package/mdsite-nuxt/scripts/start.test.ts +164 -0
  128. package/mdsite-nuxt/scripts/start.ts +55 -0
  129. package/mdsite-nuxt/scripts/sync-content.ts +504 -0
  130. package/mdsite-nuxt/tsconfig.json +18 -0
  131. package/mdsite-nuxt/utils/mdsite-config.ts +240 -0
  132. package/mdsite-nuxt/vitest.config.ts +7 -0
  133. package/package.json +36 -0
@@ -0,0 +1,87 @@
1
+ /* Bible Tooltip Overlay */
2
+ .bible-tooltip-overlay {
3
+ position: fixed;
4
+ top: 0;
5
+ left: 0;
6
+ right: 0;
7
+ bottom: 0;
8
+ z-index: 9999;
9
+ display: none;
10
+ background: transparent;
11
+ pointer-events: auto;
12
+ touch-action: none;
13
+ }
14
+
15
+ /* Bible Tooltip Container */
16
+ .bible-tooltip {
17
+ position: fixed;
18
+ background: rgb(var(--v-theme-surface-appbar));
19
+ color: rgb(var(--v-theme-on-surface-appbar));
20
+ padding: 0.75rem 1rem;
21
+ border-radius: 0.5rem;
22
+ font-size: 0.875rem;
23
+ line-height: 1.4;
24
+ max-width: 25rem;
25
+ z-index: 10000;
26
+ box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.3);
27
+ display: none;
28
+ }
29
+
30
+ /* Bible Tooltip Title */
31
+ .bible-tooltip-title {
32
+ font-weight: 600;
33
+ margin-bottom: 0.25rem;
34
+ }
35
+
36
+ /* Bible Tooltip Translation Badge */
37
+ .bible-tooltip-translation {
38
+ color: rgb(var(--v-theme-on-surface-rail));
39
+ font-weight: 500;
40
+ }
41
+
42
+ /* Bible Tooltip Verse Text */
43
+ .bible-tooltip-text {
44
+ line-height: 1.5;
45
+ margin-bottom: 0.75rem;
46
+ }
47
+
48
+ /* Bible Tooltip Footer */
49
+ .bible-tooltip-footer {
50
+ border-top: 1px solid rgb(var(--v-theme-outline));
51
+ padding-top: 0.5rem;
52
+ display: flex;
53
+ flex-wrap: wrap;
54
+ gap: 0.75rem;
55
+ }
56
+
57
+ /* Bible Tooltip Links */
58
+ .bible-tooltip-link {
59
+ color: rgb(var(--v-theme-primary));
60
+ text-decoration: none;
61
+ font-size: 0.8125rem;
62
+ display: inline-flex;
63
+ align-items: center;
64
+ gap: 0.25rem;
65
+ }
66
+
67
+ /* Bible Tooltip Link Icons (Material Design Icons) */
68
+ .bible-tooltip-link i.mdi {
69
+ font-size: 1.25rem;
70
+ }
71
+
72
+ /* Bible Tooltip Hebrew/Greek Characters with Font Fallback */
73
+ .bible-tooltip-hebrew-greek {
74
+ font-family: 'Noto Sans', sans-serif;
75
+ font-size: 1.5em;
76
+ }
77
+
78
+ .bible-tooltip-link-text:hover {
79
+ text-decoration: underline;
80
+ }
81
+
82
+ /* Bible Reference Spans (in content) */
83
+ .bible-ref {
84
+ color: rgb(var(--v-theme-primary));
85
+ text-decoration: underline;
86
+ cursor: help;
87
+ }
@@ -0,0 +1,195 @@
1
+ /* Content Body Styles - Used by @nuxt/content ContentRenderer */
2
+
3
+ /* Headings */
4
+ .content-body h1 {
5
+ font-size: 2.6rem;
6
+ margin-top: 0; /* This is the first line of text, there should be no other text above it */
7
+ margin-bottom: 1rem;
8
+ font-weight: 600;
9
+ }
10
+
11
+ .content-body h2 {
12
+ font-size: 1.8rem;
13
+ margin-top: 1.5rem;
14
+ margin-bottom: 0.75rem;
15
+ font-weight: 600;
16
+ }
17
+
18
+ .content-body h3 {
19
+ font-size: 1.4rem;
20
+ margin-top: 1rem;
21
+ margin-bottom: 0.5rem;
22
+ font-weight: 600;
23
+ }
24
+
25
+ .content-body h4 {
26
+ font-size: 1.2rem;
27
+ margin-top: 1rem;
28
+ margin-bottom: 0.5rem;
29
+ font-weight: 600;
30
+ }
31
+
32
+ .content-body h5 {
33
+ font-size: 1.1rem;
34
+ margin-top: 1rem;
35
+ margin-bottom: 0.5rem;
36
+ font-weight: 600;
37
+ }
38
+
39
+ /* Paragraphs */
40
+ .content-body p {
41
+ margin: 0.8rem 0;
42
+ }
43
+
44
+ /* Blockquotes - rendered as VCards via ProseBlockquote.vue */
45
+ .content-body .blockquote-content {
46
+ font-family: Georgia, 'Times New Roman', serif;
47
+ color: rgb(var(--v-theme-on-surface));
48
+ font-size: 1.05rem;
49
+ }
50
+
51
+ /* Nested blockquotes - create visual hierarchy */
52
+ .content-body .blockquote-content .v-card {
53
+ margin-left: 1rem;
54
+ margin-right: 0;
55
+ margin-top: 0.75rem;
56
+ margin-bottom: 0.75rem;
57
+ border-left: 0.25rem solid rgb(var(--v-theme-secondary));
58
+ background-color: transparent !important;
59
+ box-shadow: none !important;
60
+ }
61
+
62
+ .content-body .blockquote-content .v-card .v-card-text {
63
+ padding: 0.75rem 1rem;
64
+ }
65
+
66
+ /* Nested blockquote text slightly smaller */
67
+ .content-body .blockquote-content .blockquote-content {
68
+ font-size: 1rem;
69
+ color: rgb(var(--v-theme-on-surface-rail));
70
+ }
71
+
72
+ /* Links */
73
+ .content-body a {
74
+ color: rgb(var(--v-theme-primary));
75
+ text-decoration: none;
76
+ }
77
+
78
+ .content-body a:hover {
79
+ text-decoration: underline;
80
+ }
81
+
82
+ /* Text formatting */
83
+ .content-body strong {
84
+ font-weight: 600;
85
+ }
86
+
87
+ .content-body em {
88
+ font-style: italic;
89
+ }
90
+
91
+ /* Lists */
92
+ .content-body ul,
93
+ .content-body ol {
94
+ margin: 0.8rem 0;
95
+ padding-left: 2rem;
96
+ }
97
+
98
+ .content-body ul {
99
+ list-style-type: disc;
100
+ }
101
+
102
+ .content-body ol {
103
+ list-style-type: decimal;
104
+ }
105
+
106
+ .content-body ul ul {
107
+ margin: 0.4rem 0;
108
+ list-style-type: circle;
109
+ }
110
+
111
+ .content-body ul ul ul {
112
+ list-style-type: square;
113
+ }
114
+
115
+ .content-body ol ol {
116
+ margin: 0.4rem 0;
117
+ list-style-type: lower-alpha;
118
+ }
119
+
120
+ .content-body ol ol ol {
121
+ list-style-type: lower-roman;
122
+ }
123
+
124
+ .content-body li {
125
+ margin: 0.4rem 0;
126
+ line-height: 1.6;
127
+ }
128
+
129
+ /* Lists inside blockquotes (VCard) need extra padding */
130
+ .content-body .blockquote-content ul,
131
+ .content-body .blockquote-content ol {
132
+ padding-left: 2.5rem;
133
+ }
134
+
135
+ /* GFM Alerts (GitHub Flavored Markdown) */
136
+ .content-body .markdown-alert {
137
+ margin: 1rem 0;
138
+ padding: 0.5rem 1rem;
139
+ border-left: 0.25rem solid;
140
+ border-radius: 0.25rem;
141
+ background-color: rgb(var(--v-theme-surface));
142
+ }
143
+
144
+ .content-body .markdown-alert-title {
145
+ display: flex;
146
+ align-items: center;
147
+ font-weight: 600;
148
+ margin-top: 0 !important;
149
+ margin-bottom: 0.5rem !important;
150
+ font-size: 1rem;
151
+ }
152
+
153
+ .content-body .markdown-alert-note {
154
+ border-color: rgb(var(--v-theme-info));
155
+ background-color: rgba(var(--v-theme-info), 0.05);
156
+ }
157
+ .content-body .markdown-alert-note .markdown-alert-title {
158
+ color: rgb(var(--v-theme-info));
159
+ }
160
+
161
+ .content-body .markdown-alert-tip {
162
+ border-color: rgb(var(--v-theme-success));
163
+ background-color: rgba(var(--v-theme-success), 0.05);
164
+ }
165
+ .content-body .markdown-alert-tip .markdown-alert-title {
166
+ color: rgb(var(--v-theme-success));
167
+ }
168
+
169
+ .content-body .markdown-alert-important {
170
+ border-color: rgb(var(--v-theme-primary));
171
+ background-color: rgba(var(--v-theme-primary), 0.05);
172
+ }
173
+ .content-body .markdown-alert-important .markdown-alert-title {
174
+ color: rgb(var(--v-theme-primary));
175
+ }
176
+
177
+ .content-body .markdown-alert-warning {
178
+ border-color: rgb(var(--v-theme-warning));
179
+ background-color: rgba(var(--v-theme-warning), 0.05);
180
+ }
181
+ .content-body .markdown-alert-warning .markdown-alert-title {
182
+ color: rgb(var(--v-theme-warning));
183
+ }
184
+
185
+ .content-body .markdown-alert-caution {
186
+ border-color: rgb(var(--v-theme-error));
187
+ background-color: rgba(var(--v-theme-error), 0.05);
188
+ }
189
+ .content-body .markdown-alert-caution .markdown-alert-title {
190
+ color: rgb(var(--v-theme-error));
191
+ }
192
+
193
+ .content-body .markdown-alert p:last-child {
194
+ margin-bottom: 0;
195
+ }
@@ -0,0 +1,133 @@
1
+ /* Print-friendly styles */
2
+ @media print {
3
+
4
+ /* Hide navigation elements */
5
+ .v-app-bar,
6
+ .v-navigation-drawer,
7
+ .app-bar,
8
+ .app-navigation,
9
+ header,
10
+ nav {
11
+ display: none !important;
12
+ }
13
+
14
+ /* Remove margins and padding for navigation rail */
15
+ .v-main {
16
+ margin: 0 !important;
17
+ padding: 0 !important;
18
+ max-width: 100% !important;
19
+ }
20
+
21
+ /* Reset layout for printing */
22
+ .v-application {
23
+ background: white !important;
24
+ }
25
+
26
+ /* Ensure content takes full width */
27
+ .v-container {
28
+ max-width: none !important;
29
+ padding: 0 !important;
30
+ }
31
+
32
+ /* Optimize text for printing */
33
+ body {
34
+ color: black !important;
35
+ background: white !important;
36
+ font-size: 10pt;
37
+ line-height: 1.5;
38
+ }
39
+
40
+ /* Force standard text to pure black, but allow code colors */
41
+ .v-application p,
42
+ .v-application h1,
43
+ .v-application h2,
44
+ .v-application h3,
45
+ .v-application h4,
46
+ .v-application h5,
47
+ .v-application h6,
48
+ .v-application li,
49
+ .v-application blockquote,
50
+ .v-application dt,
51
+ .v-application dd,
52
+ .v-application th,
53
+ .v-application td {
54
+ color: black !important;
55
+ }
56
+
57
+ /* Render links as plain text */
58
+ a {
59
+ color: black !important;
60
+ text-decoration: none !important;
61
+ }
62
+
63
+ /* Don't print URLs after links */
64
+ a[href]::after {
65
+ content: "" !important;
66
+ }
67
+
68
+ /* Ensure images fit on page, but can take full width */
69
+ img {
70
+ max-width: 100% !important;
71
+ width: auto !important;
72
+ height: auto !important;
73
+ page-break-inside: avoid;
74
+ }
75
+
76
+ /* Avoid breaking inside elements */
77
+ h1,
78
+ h2,
79
+ h3,
80
+ h4,
81
+ h5,
82
+ h6 {
83
+ page-break-after: avoid;
84
+ page-break-inside: avoid;
85
+ }
86
+
87
+ /* Blockquotes and cards */
88
+ blockquote,
89
+ .v-card {
90
+ page-break-inside: avoid;
91
+ border: 2px solid #ccc !important;
92
+ border-radius: 1rem !important;
93
+ padding: 0 !important;
94
+ }
95
+
96
+ /* Nested blockquotes - create visual hierarchy in print */
97
+ .content-body .blockquote-content .v-card {
98
+ margin-left: 0.75rem !important;
99
+ margin-right: 0 !important;
100
+ margin-top: 0.75rem !important;
101
+ margin-bottom: 0.75rem !important;
102
+ border: none !important;
103
+ border-left: 0.25rem solid grey !important;
104
+ background-color: white !important;
105
+ padding: 0 !important;
106
+ }
107
+
108
+ /* Nested blockquote text slightly smaller */
109
+ .content-body .blockquote-content .blockquote-content {
110
+ font-size: 11pt !important;
111
+ }
112
+
113
+ /* Hide interactive elements that don't make sense in print */
114
+ .v-btn,
115
+ .v-chip,
116
+ .v-menu,
117
+ button {
118
+ display: none !important;
119
+ }
120
+
121
+ /* Show Bible verse content as plain text */
122
+ .bible-reference,
123
+ .bible-ref {
124
+ text-decoration: none !important;
125
+ color: inherit !important;
126
+ }
127
+
128
+ /* Remove shadows and elevations */
129
+ * {
130
+ box-shadow: none !important;
131
+ text-shadow: none !important;
132
+ }
133
+ }
@@ -0,0 +1,138 @@
1
+ <template>
2
+ <v-app-bar
3
+ height="56"
4
+ :class="['app-bar', { 'sidebars-visible': sidebarsVisible }]"
5
+ flat
6
+ >
7
+ <!-- Hamburger menu (always visible) -->
8
+ <v-tooltip text="Toggle menu" location="bottom">
9
+ <template v-slot:activator="{ props }">
10
+ <v-app-bar-nav-icon
11
+ v-bind="props"
12
+ icon="mdi-menu"
13
+ @click="$emit('toggle-menu')"
14
+ />
15
+ </template>
16
+ </v-tooltip>
17
+
18
+ <!-- Breadcrumb navigation -->
19
+ <BreadcrumbNav :breadcrumbs="breadcrumbs" class="flex-grow-1" />
20
+
21
+ <!-- Action buttons (right-aligned) -->
22
+
23
+ <v-tooltip text="Toggle theme" location="bottom">
24
+ <template v-slot:activator="{ props }">
25
+ <v-btn v-bind="props" icon="mdi-brightness-6" @click="toggleTheme" />
26
+ </template>
27
+ </v-tooltip>
28
+
29
+ <v-tooltip text="Print page" location="bottom">
30
+ <template v-slot:activator="{ props }">
31
+ <v-btn v-bind="props" icon="mdi-printer" @click="handlePrint" />
32
+ </template>
33
+ </v-tooltip>
34
+
35
+ <v-tooltip v-if="editUrl" text="Edit on GitHub" location="bottom">
36
+ <template v-slot:activator="{ props }">
37
+ <v-btn
38
+ v-bind="props"
39
+ icon="mdi-pencil"
40
+ :href="editUrl"
41
+ target="_blank"
42
+ rel="noopener noreferrer"
43
+ />
44
+ </template>
45
+ </v-tooltip>
46
+
47
+ </v-app-bar>
48
+ </template>
49
+
50
+ <script setup lang="ts">
51
+ import { generateBreadcrumbs } from '~/composables/useBreadcrumbs'
52
+ import type { BreadcrumbItem } from '~/composables/useBreadcrumbs'
53
+ import { useSourceEdit } from '~/composables/useSourceEdit';
54
+
55
+ const props = defineProps<{
56
+ sidebarsVisible?: boolean
57
+ }>()
58
+
59
+ const emit = defineEmits<{
60
+ 'toggle-menu': []
61
+ }>()
62
+
63
+ const route = useRoute()
64
+ const { toggleTheme } = useAppTheme()
65
+ const { getEditUrl } = useSourceEdit()
66
+
67
+ // Generate breadcrumbs for current route
68
+ const breadcrumbs = ref<BreadcrumbItem[]>([])
69
+
70
+ async function loadBreadcrumbs() {
71
+ breadcrumbs.value = await generateBreadcrumbs(route.path)
72
+ }
73
+
74
+ // Generate GitHub edit URL
75
+ const editUrl = computed(() => getEditUrl())
76
+
77
+ // Watch for route changes
78
+ watch(() => route.path, () => {
79
+ loadBreadcrumbs()
80
+ }, { immediate: true })
81
+
82
+ const triggerPrint = inject('triggerPrint', () => {
83
+ // Fallback if not provided
84
+ window.print()
85
+ })
86
+
87
+ const handlePrint = () => {
88
+ triggerPrint()
89
+ }
90
+ </script>
91
+
92
+ <style scoped>
93
+ .app-bar {
94
+ z-index: 1000 !important;
95
+ }
96
+
97
+ /* Desktop: Add margins to prevent sidebar overlap */
98
+ @media (min-width: 960px) {
99
+ .app-bar :deep(.v-toolbar__content) {
100
+ padding-left: 0.5rem;
101
+ padding-right: 0.5rem;
102
+ margin-left: 0;
103
+ margin-right: 0;
104
+ max-width: 100vw;
105
+ transition: margin-left 0.3s ease, margin-right 0.3s ease, max-width 0.3s ease;
106
+ }
107
+
108
+ /* When sidebars are visible, add margins */
109
+ .app-bar.sidebars-visible :deep(.v-toolbar__content) {
110
+ margin-left: 320px;
111
+ margin-right: 320px;
112
+ max-width: calc(100vw - 320px - 320px);
113
+ }
114
+
115
+ /* Adjust left icon margin when sidebars are visible */
116
+ .app-bar.sidebars-visible :deep(.v-app-bar-nav-icon) {
117
+ margin-left: 0.5rem;
118
+ }
119
+
120
+ /* Adjust right icon margins when sidebars are visible */
121
+ .app-bar.sidebars-visible :deep(.v-btn:last-child) {
122
+ margin-right: 0.5rem;
123
+ }
124
+ }
125
+
126
+ /* Ensure breadcrumbs don't overlap with buttons */
127
+ .flex-grow-1 {
128
+ flex-grow: 1;
129
+ min-width: 0;
130
+ }
131
+
132
+ /* Print: Hide AppBar */
133
+ @media print {
134
+ .app-bar {
135
+ display: none !important;
136
+ }
137
+ }
138
+ </style>
@@ -0,0 +1,88 @@
1
+ <template>
2
+ <v-app-bar
3
+ location="bottom"
4
+ height="56"
5
+ class="app-footer"
6
+ flat
7
+ >
8
+ <v-container class="d-flex justify-center align-center">
9
+ <div class="footer-links">
10
+ <v-btn
11
+ :to="aboutLink"
12
+ variant="text"
13
+ color="on-surface-appbar"
14
+ class="footer-link"
15
+ >
16
+ About
17
+ </v-btn>
18
+
19
+ <v-divider vertical class="mx-2" />
20
+
21
+ <v-btn
22
+ :to="disclaimerLink"
23
+ variant="text"
24
+ color="on-surface-appbar"
25
+ class="footer-link"
26
+ >
27
+ Disclaimer
28
+ </v-btn>
29
+
30
+ <v-divider v-if="editUrl" vertical class="mx-2" />
31
+
32
+ <v-btn
33
+ v-if="editUrl"
34
+ :href="editUrl"
35
+ variant="text"
36
+ color="on-surface-appbar"
37
+ class="footer-link"
38
+ target="_blank"
39
+ rel="noopener noreferrer"
40
+ >
41
+ Edit
42
+ </v-btn>
43
+ </div>
44
+ </v-container>
45
+ </v-app-bar>
46
+ </template>
47
+
48
+ <script setup lang="ts">
49
+ import { useSourceEdit } from '~/composables/useSourceEdit';
50
+
51
+ const { getEditUrl } = useSourceEdit()
52
+
53
+ // Generate links to root content files
54
+ const aboutLink = computed(() => '/about')
55
+ const disclaimerLink = computed(() => '/disclaimer')
56
+ const editUrl = computed(() => getEditUrl())
57
+ </script>
58
+
59
+ <style scoped>
60
+ .app-footer {
61
+ z-index: 1000 !important;
62
+ }
63
+
64
+ .footer-links {
65
+ display: flex;
66
+ align-items: center;
67
+ gap: 0.5rem;
68
+ }
69
+
70
+ .footer-link {
71
+ text-transform: none;
72
+ letter-spacing: normal;
73
+ font-weight: 400;
74
+ }
75
+
76
+ /* Make dividers visible with theme colors */
77
+ :deep(.v-divider) {
78
+ opacity: 0.3;
79
+ height: 1.5rem;
80
+ }
81
+
82
+ /* Print: Hide Footer */
83
+ @media print {
84
+ .app-footer {
85
+ display: none !important;
86
+ }
87
+ }
88
+ </style>