docs-please 0.2.0-beta.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 (120) hide show
  1. package/README.md +63 -0
  2. package/app/app.config.ts +13 -0
  3. package/app/app.vue +17 -0
  4. package/app/assets/css/main.css +367 -0
  5. package/app/components/Icons.ts +163 -0
  6. package/app/components/app/AppFooter.vue +24 -0
  7. package/app/components/app/AppHeader.vue +58 -0
  8. package/app/components/content/BrowserFrame.vue +21 -0
  9. package/app/components/content/Callout.vue +80 -0
  10. package/app/components/content/Caution.vue +25 -0
  11. package/app/components/content/CodeBlockCommand.vue +92 -0
  12. package/app/components/content/CodeCollapsibleWrapper.vue +50 -0
  13. package/app/components/content/CodeTabs.vue +14 -0
  14. package/app/components/content/ComponentPreview.vue +71 -0
  15. package/app/components/content/ComponentsList.vue +24 -0
  16. package/app/components/content/CopyButton.vue +39 -0
  17. package/app/components/content/FeatureCard.vue +25 -0
  18. package/app/components/content/LinkedCard.vue +19 -0
  19. package/app/components/content/Note.vue +25 -0
  20. package/app/components/content/ProseA.vue +18 -0
  21. package/app/components/content/ProseBlockQuote.vue +8 -0
  22. package/app/components/content/ProseCode.vue +8 -0
  23. package/app/components/content/ProseH1.vue +7 -0
  24. package/app/components/content/ProseH2.vue +8 -0
  25. package/app/components/content/ProseH3.vue +9 -0
  26. package/app/components/content/ProseH4.vue +9 -0
  27. package/app/components/content/ProseH5.vue +7 -0
  28. package/app/components/content/ProseH6.vue +7 -0
  29. package/app/components/content/ProseHr.vue +6 -0
  30. package/app/components/content/ProseIcon.vue +32 -0
  31. package/app/components/content/ProseImg.vue +6 -0
  32. package/app/components/content/ProseLi.vue +8 -0
  33. package/app/components/content/ProseOl.vue +8 -0
  34. package/app/components/content/ProseP.vue +14 -0
  35. package/app/components/content/ProsePre.vue +80 -0
  36. package/app/components/content/ProseStrong.vue +8 -0
  37. package/app/components/content/ProseTable.vue +26 -0
  38. package/app/components/content/ProseTd.vue +8 -0
  39. package/app/components/content/ProseTh.vue +8 -0
  40. package/app/components/content/ProseTr.vue +8 -0
  41. package/app/components/content/ProseUl.vue +8 -0
  42. package/app/components/content/Step.vue +18 -0
  43. package/app/components/content/Steps.vue +18 -0
  44. package/app/components/content/Tabs.vue +129 -0
  45. package/app/components/content/TabsItem.vue +26 -0
  46. package/app/components/content/Tip.vue +25 -0
  47. package/app/components/content/UButton.vue +34 -0
  48. package/app/components/content/UColorModeImage.vue +48 -0
  49. package/app/components/content/UPageCard.vue +83 -0
  50. package/app/components/content/UPageGrid.vue +18 -0
  51. package/app/components/content/UPageHero.vue +92 -0
  52. package/app/components/content/UPageSection.vue +90 -0
  53. package/app/components/content/Warning.vue +25 -0
  54. package/app/components/docs/DocsPageHeader.vue +20 -0
  55. package/app/components/docs/DocsPageNav.vue +31 -0
  56. package/app/components/docs/DocsSidebar.vue +97 -0
  57. package/app/components/docs/DocsTableOfContents.vue +64 -0
  58. package/app/components/ui/accordion/Accordion.vue +22 -0
  59. package/app/components/ui/accordion/AccordionContent.vue +23 -0
  60. package/app/components/ui/accordion/AccordionItem.vue +24 -0
  61. package/app/components/ui/accordion/AccordionTrigger.vue +37 -0
  62. package/app/components/ui/accordion/index.ts +4 -0
  63. package/app/components/ui/alert/Alert.vue +21 -0
  64. package/app/components/ui/alert/AlertDescription.vue +17 -0
  65. package/app/components/ui/alert/AlertTitle.vue +17 -0
  66. package/app/components/ui/alert/index.ts +28 -0
  67. package/app/components/ui/button/Button.vue +29 -0
  68. package/app/components/ui/button/index.ts +38 -0
  69. package/app/components/ui/card/Card.vue +22 -0
  70. package/app/components/ui/card/CardAction.vue +17 -0
  71. package/app/components/ui/card/CardContent.vue +17 -0
  72. package/app/components/ui/card/CardDescription.vue +17 -0
  73. package/app/components/ui/card/CardFooter.vue +17 -0
  74. package/app/components/ui/card/CardHeader.vue +17 -0
  75. package/app/components/ui/card/CardTitle.vue +17 -0
  76. package/app/components/ui/card/index.ts +7 -0
  77. package/app/components/ui/collapsible/Collapsible.vue +19 -0
  78. package/app/components/ui/collapsible/CollapsibleContent.vue +15 -0
  79. package/app/components/ui/collapsible/CollapsibleTrigger.vue +15 -0
  80. package/app/components/ui/collapsible/index.ts +3 -0
  81. package/app/components/ui/separator/Separator.vue +29 -0
  82. package/app/components/ui/separator/index.ts +1 -0
  83. package/app/components/ui/switch/Switch.vue +35 -0
  84. package/app/components/ui/switch/index.ts +1 -0
  85. package/app/components/ui/table/Table.vue +16 -0
  86. package/app/components/ui/table/TableBody.vue +14 -0
  87. package/app/components/ui/table/TableCaption.vue +14 -0
  88. package/app/components/ui/table/TableCell.vue +21 -0
  89. package/app/components/ui/table/TableEmpty.vue +34 -0
  90. package/app/components/ui/table/TableFooter.vue +14 -0
  91. package/app/components/ui/table/TableHead.vue +14 -0
  92. package/app/components/ui/table/TableHeader.vue +14 -0
  93. package/app/components/ui/table/TableRow.vue +14 -0
  94. package/app/components/ui/table/index.ts +9 -0
  95. package/app/components/ui/tabs/Tabs.vue +15 -0
  96. package/app/components/ui/tabs/TabsContent.vue +20 -0
  97. package/app/components/ui/tabs/TabsList.vue +23 -0
  98. package/app/components/ui/tabs/TabsTrigger.vue +27 -0
  99. package/app/components/ui/tabs/index.ts +4 -0
  100. package/app/components/ui/tooltip/Tooltip.vue +19 -0
  101. package/app/components/ui/tooltip/TooltipContent.vue +34 -0
  102. package/app/components/ui/tooltip/TooltipProvider.vue +14 -0
  103. package/app/components/ui/tooltip/TooltipTrigger.vue +15 -0
  104. package/app/components/ui/tooltip/index.ts +4 -0
  105. package/app/composables/useConfig.ts +24 -0
  106. package/app/composables/useNavigation.ts +43 -0
  107. package/app/layouts/default.vue +12 -0
  108. package/app/layouts/docs.vue +27 -0
  109. package/app/lib/utils.ts +7 -0
  110. package/app/pages/[...slug].vue +97 -0
  111. package/app/pages/index.vue +29 -0
  112. package/app/plugins/ssr-width.ts +5 -0
  113. package/content.config.ts +36 -0
  114. package/i18n/locales/en.json +14 -0
  115. package/modules/config.ts +38 -0
  116. package/modules/css.ts +38 -0
  117. package/modules/shadcn.ts +116 -0
  118. package/nuxt.config.ts +125 -0
  119. package/nuxt.schema.ts +68 -0
  120. package/package.json +81 -0
package/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # docs-please
2
+
3
+ A Nuxt layer for documentation sites using **shadcn-vue** instead of nuxt-ui.
4
+
5
+ ## Overview
6
+
7
+ This layer provides a complete documentation theme built with:
8
+
9
+ - **shadcn-vue** - Beautiful, accessible UI components
10
+ - **Nuxt Content** - Markdown-based content management
11
+ - **Tailwind CSS v4** - Modern CSS with CSS variables
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ # Install the layer
17
+ pnpm add docs-please
18
+ ```
19
+
20
+ ```typescript
21
+ // nuxt.config.ts
22
+ export default defineNuxtConfig({
23
+ extends: ['docs-please']
24
+ })
25
+ ```
26
+
27
+ ## Features
28
+
29
+ - Documentation layout with sidebar navigation
30
+ - Command palette search
31
+ - Table of contents
32
+ - Dark/Light mode
33
+ - Mobile responsive
34
+ - MDC components (Callout, CodeBlock, etc.)
35
+
36
+ ## Configuration
37
+
38
+ ```typescript
39
+ // app.config.ts
40
+ export default defineAppConfig({
41
+ docs: {
42
+ title: 'My Docs',
43
+ description: 'Documentation site',
44
+ github: {
45
+ url: 'https://github.com/owner/repo'
46
+ }
47
+ }
48
+ })
49
+ ```
50
+
51
+ ## Development
52
+
53
+ ```bash
54
+ # Install dependencies
55
+ pnpm install
56
+
57
+ # Start development
58
+ pnpm dev
59
+ ```
60
+
61
+ ## License
62
+
63
+ MIT
@@ -0,0 +1,13 @@
1
+ export default defineAppConfig({
2
+ docs: {
3
+ title: 'Documentation',
4
+ description: 'Documentation site powered by @pleaseai/docs',
5
+ url: '',
6
+ github: {
7
+ owner: '',
8
+ name: '',
9
+ url: '',
10
+ branch: 'main',
11
+ },
12
+ },
13
+ })
package/app/app.vue ADDED
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ const appConfig = useAppConfig()
3
+
4
+ useSeoMeta({
5
+ title: appConfig.docs?.title,
6
+ description: appConfig.docs?.description,
7
+ })
8
+ </script>
9
+
10
+ <template>
11
+ <div>
12
+ <NuxtLoadingIndicator color="hsl(var(--primary))" />
13
+ <NuxtLayout>
14
+ <NuxtPage />
15
+ </NuxtLayout>
16
+ </div>
17
+ </template>
@@ -0,0 +1,367 @@
1
+ @import "tailwindcss";
2
+ @import 'tw-animate-css';
3
+
4
+ /* Tailwind CSS v4: Source detection for layer components */
5
+ @source "../../components/**/*.vue";
6
+ @source "../../components/**/*.ts";
7
+ @source "../../layouts/**/*.vue";
8
+ @source "../../pages/**/*.vue";
9
+
10
+ @custom-variant dark (&:is(.dark *));
11
+
12
+ @theme inline {
13
+ --radius-sm: calc(var(--radius) - 4px);
14
+ --radius-md: calc(var(--radius) - 2px);
15
+ --radius-lg: var(--radius);
16
+ --radius-xl: calc(var(--radius) + 4px);
17
+ --color-background: var(--background);
18
+ --color-foreground: var(--foreground);
19
+ --color-card: var(--card);
20
+ --color-card-foreground: var(--card-foreground);
21
+ --color-popover: var(--popover);
22
+ --color-popover-foreground: var(--popover-foreground);
23
+ --color-primary: var(--primary);
24
+ --color-primary-foreground: var(--primary-foreground);
25
+ --color-secondary: var(--secondary);
26
+ --color-secondary-foreground: var(--secondary-foreground);
27
+ --color-muted: var(--muted);
28
+ --color-muted-foreground: var(--muted-foreground);
29
+ --color-accent: var(--accent);
30
+ --color-accent-foreground: var(--accent-foreground);
31
+ --color-destructive: var(--destructive);
32
+ --color-border: var(--border);
33
+ --color-input: var(--input);
34
+ --color-ring: var(--ring);
35
+ --color-sidebar: var(--sidebar);
36
+ --color-sidebar-foreground: var(--sidebar-foreground);
37
+ --color-sidebar-primary: var(--sidebar-primary);
38
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
39
+ --color-sidebar-accent: var(--sidebar-accent);
40
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
41
+ --color-sidebar-border: var(--sidebar-border);
42
+ --color-sidebar-ring: var(--sidebar-ring);
43
+ --color-chart-5: var(--chart-5);
44
+ --color-chart-4: var(--chart-4);
45
+ --color-chart-3: var(--chart-3);
46
+ --color-chart-2: var(--chart-2);
47
+ --color-chart-1: var(--chart-1);
48
+ --color-code: var(--code);
49
+ --color-code-foreground: var(--code-foreground);
50
+ --color-code-highlight: var(--code-highlight);
51
+ --color-code-number: var(--code-number);
52
+ }
53
+
54
+ :root {
55
+ --radius: 0.625rem;
56
+ --card: oklch(1 0 0);
57
+ --card-foreground: oklch(0.145 0 0);
58
+ --popover: oklch(1 0 0);
59
+ --popover-foreground: oklch(0.145 0 0);
60
+ --primary: oklch(0.205 0 0);
61
+ --primary-foreground: oklch(0.985 0 0);
62
+ --secondary: oklch(0.97 0 0);
63
+ --secondary-foreground: oklch(0.205 0 0);
64
+ --muted: oklch(0.97 0 0);
65
+ --muted-foreground: oklch(0.556 0 0);
66
+ --accent: oklch(0.97 0 0);
67
+ --accent-foreground: oklch(0.205 0 0);
68
+ --destructive: oklch(0.577 0.245 27.325);
69
+ --border: oklch(0.922 0 0);
70
+ --input: oklch(0.922 0 0);
71
+ --ring: oklch(0.708 0 0);
72
+ --sidebar: oklch(0.985 0 0);
73
+ --sidebar-foreground: oklch(0.145 0 0);
74
+ --sidebar-primary: oklch(0.205 0 0);
75
+ --sidebar-primary-foreground: oklch(0.985 0 0);
76
+ --sidebar-accent: oklch(0.97 0 0);
77
+ --sidebar-accent-foreground: oklch(0.205 0 0);
78
+ --sidebar-border: oklch(0.922 0 0);
79
+ --sidebar-ring: oklch(0.708 0 0);
80
+ --chart-1: oklch(0.646 0.222 41.116);
81
+ --chart-2: oklch(0.6 0.118 184.704);
82
+ --chart-3: oklch(0.398 0.07 227.392);
83
+ --chart-4: oklch(0.828 0.189 84.429);
84
+ --chart-5: oklch(0.769 0.188 70.08);
85
+ --background: oklch(1 0 0);
86
+ --foreground: oklch(0.145 0 0);
87
+ --code: oklch(0.98 0 0);
88
+ --code-foreground: oklch(0.145 0 0);
89
+ --code-highlight: oklch(0.96 0 0);
90
+ --code-number: oklch(0.56 0 0);
91
+ }
92
+
93
+ .dark {
94
+ --background: oklch(0.145 0 0);
95
+ --foreground: oklch(0.985 0 0);
96
+ --card: oklch(0.205 0 0);
97
+ --card-foreground: oklch(0.985 0 0);
98
+ --popover: oklch(0.205 0 0);
99
+ --popover-foreground: oklch(0.985 0 0);
100
+ --primary: oklch(0.922 0 0);
101
+ --primary-foreground: oklch(0.205 0 0);
102
+ --secondary: oklch(0.269 0 0);
103
+ --secondary-foreground: oklch(0.985 0 0);
104
+ --muted: oklch(0.269 0 0);
105
+ --muted-foreground: oklch(0.708 0 0);
106
+ --accent: oklch(0.269 0 0);
107
+ --accent-foreground: oklch(0.985 0 0);
108
+ --destructive: oklch(0.704 0.191 22.216);
109
+ --border: oklch(1 0 0 / 10%);
110
+ --input: oklch(1 0 0 / 15%);
111
+ --ring: oklch(0.556 0 0);
112
+ --sidebar: oklch(0.205 0 0);
113
+ --sidebar-foreground: oklch(0.985 0 0);
114
+ --sidebar-primary: oklch(0.488 0.243 264.376);
115
+ --sidebar-primary-foreground: oklch(0.985 0 0);
116
+ --sidebar-accent: oklch(0.269 0 0);
117
+ --sidebar-accent-foreground: oklch(0.985 0 0);
118
+ --sidebar-border: oklch(1 0 0 / 10%);
119
+ --sidebar-ring: oklch(0.556 0 0);
120
+ --chart-1: oklch(0.488 0.243 264.376);
121
+ --chart-2: oklch(0.696 0.17 162.48);
122
+ --chart-3: oklch(0.769 0.188 70.08);
123
+ --chart-4: oklch(0.627 0.265 303.9);
124
+ --chart-5: oklch(0.645 0.246 16.439);
125
+ --code: oklch(0.2 0 0);
126
+ --code-foreground: oklch(0.708 0 0);
127
+ --code-highlight: oklch(0.27 0 0);
128
+ --code-number: oklch(0.72 0 0);
129
+ }
130
+
131
+ @layer base {
132
+ * {
133
+ @apply border-border outline-ring/50;
134
+ }
135
+
136
+ html {
137
+ @apply scroll-smooth;
138
+ color-scheme: light dark;
139
+ }
140
+
141
+ html.dark {
142
+ color-scheme: dark;
143
+ }
144
+
145
+ html.light {
146
+ color-scheme: light;
147
+ }
148
+
149
+ body {
150
+ @apply bg-background text-foreground;
151
+ font-synthesis-weight: none;
152
+ text-rendering: optimizeLegibility;
153
+ }
154
+ }
155
+
156
+ /* Utility classes */
157
+ @utility container {
158
+ @apply mx-auto w-full max-w-[1400px] px-4 lg:px-8;
159
+ }
160
+
161
+ @utility no-scrollbar {
162
+ -ms-overflow-style: none;
163
+ scrollbar-width: none;
164
+
165
+ &::-webkit-scrollbar {
166
+ display: none;
167
+ }
168
+ }
169
+
170
+ /* Code block styling */
171
+ @layer components {
172
+ [data-pretty-code-figure] {
173
+ background-color: var(--color-code);
174
+ color: var(--color-code-foreground);
175
+ border-radius: var(--radius-lg, 0.625rem);
176
+ margin-top: calc(var(--spacing, 0.25rem) * 6);
177
+ overflow: hidden;
178
+ font-size: var(--text-sm, 0.875rem);
179
+ outline: none;
180
+ position: relative;
181
+ @apply -mx-1 md:-mx-1;
182
+
183
+ &:has([data-pretty-code-title]) [data-slot="copy-button"] {
184
+ top: calc(var(--spacing) * 1.5) !important;
185
+ }
186
+
187
+ pre {
188
+ -ms-overflow-style: none;
189
+ scrollbar-width: none;
190
+ background: transparent !important;
191
+ border: none !important;
192
+ border-radius: 0 !important;
193
+ margin-top: 0 !important;
194
+
195
+ &::-webkit-scrollbar {
196
+ display: none;
197
+ }
198
+ }
199
+ }
200
+
201
+ [data-pretty-code-title] {
202
+ border-bottom: 1px solid color-mix(in oklab, var(--border) 30%, transparent);
203
+ padding-block: calc(var(--spacing) * 2.5);
204
+ padding-inline: calc(var(--spacing) * 4);
205
+ font-size: var(--text-sm);
206
+ font-family: var(--font-mono);
207
+ color: var(--color-code-foreground);
208
+ }
209
+
210
+ [data-line-numbers] {
211
+ display: grid;
212
+ min-width: 100%;
213
+ white-space: pre;
214
+ border: 0;
215
+ background: transparent;
216
+ padding: 0;
217
+ counter-reset: line;
218
+ box-decoration-break: clone;
219
+ }
220
+
221
+ [data-line-numbers] [data-line]::before {
222
+ font-size: var(--text-sm);
223
+ counter-increment: line;
224
+ content: counter(line);
225
+ display: inline-block;
226
+ width: calc(var(--spacing) * 16);
227
+ padding-right: calc(var(--spacing) * 6);
228
+ text-align: right;
229
+ color: var(--color-code-number);
230
+ background-color: var(--color-code);
231
+ position: sticky;
232
+ left: 0;
233
+ }
234
+
235
+ [data-line-numbers] [data-highlighted-line][data-line]::before {
236
+ background-color: var(--color-code-highlight);
237
+ }
238
+
239
+ [data-line],
240
+ .line {
241
+ padding-top: calc(var(--spacing, 0.25rem) * 0.5);
242
+ padding-bottom: calc(var(--spacing, 0.25rem) * 0.5);
243
+ min-height: calc(var(--spacing, 0.25rem) * 1);
244
+ width: 100%;
245
+ display: block;
246
+ }
247
+
248
+ /* Override Shiki inline styles - !important required for both modes
249
+ to ensure our theme colors take precedence over Shiki's inline styles */
250
+ [data-line] span,
251
+ .line span {
252
+ color: var(--shiki-light) !important;
253
+ }
254
+
255
+ .dark [data-line] span,
256
+ .dark .line span {
257
+ color: var(--shiki-dark) !important;
258
+ }
259
+
260
+ /* Shiki code block styling */
261
+ pre code .line {
262
+ display: block;
263
+ }
264
+
265
+ .shiki {
266
+ background-color: var(--color-code) !important;
267
+ }
268
+
269
+ [data-highlighted-line],
270
+ [data-highlighted-chars] {
271
+ position: relative;
272
+ background-color: var(--color-code-highlight);
273
+ }
274
+
275
+ [data-highlighted-line] {
276
+ &:after {
277
+ position: absolute;
278
+ top: 0;
279
+ left: 0;
280
+ width: 2px;
281
+ height: 100%;
282
+ content: "";
283
+ background-color: color-mix(
284
+ in oklab,
285
+ var(--muted-foreground) 50%,
286
+ transparent
287
+ );
288
+ }
289
+ }
290
+
291
+ [data-highlighted-chars] {
292
+ border-radius: var(--radius-sm);
293
+ padding-inline: 0.3rem;
294
+ padding-block: 0.1rem;
295
+ font-family: var(--font-mono);
296
+ font-size: 0.8rem;
297
+ }
298
+
299
+ /* Prose styles for documentation */
300
+ .prose {
301
+ @apply max-w-none;
302
+ }
303
+
304
+ .prose h1 {
305
+ @apply scroll-m-20 text-4xl font-bold tracking-tight;
306
+ }
307
+
308
+ .prose h2 {
309
+ @apply mt-10 scroll-m-20 border-b pb-2 text-3xl font-semibold tracking-tight first:mt-0;
310
+ }
311
+
312
+ .prose h3 {
313
+ @apply mt-8 scroll-m-20 text-2xl font-semibold tracking-tight;
314
+ }
315
+
316
+ .prose h4 {
317
+ @apply mt-6 scroll-m-20 text-xl font-semibold tracking-tight;
318
+ }
319
+
320
+ .prose p {
321
+ @apply leading-7 [&:not(:first-child)]:mt-6;
322
+ }
323
+
324
+ .prose a {
325
+ @apply font-medium text-primary underline underline-offset-4;
326
+ }
327
+
328
+ .prose blockquote {
329
+ @apply mt-6 border-l-2 pl-6 italic;
330
+ }
331
+
332
+ .prose ul {
333
+ @apply my-6 ml-6 list-disc [&>li]:mt-2;
334
+ }
335
+
336
+ .prose ol {
337
+ @apply my-6 ml-6 list-decimal [&>li]:mt-2;
338
+ }
339
+
340
+ .prose code {
341
+ @apply relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm;
342
+ }
343
+
344
+ .prose pre {
345
+ @apply mt-6 overflow-x-auto rounded-lg border bg-muted p-4;
346
+ }
347
+
348
+ .prose pre code {
349
+ @apply bg-transparent p-0;
350
+ }
351
+
352
+ .prose table {
353
+ @apply my-6 w-full;
354
+ }
355
+
356
+ .prose th {
357
+ @apply border px-4 py-2 text-left font-bold [&[align=center]]:text-center [&[align=right]]:text-right;
358
+ }
359
+
360
+ .prose td {
361
+ @apply border px-4 py-2 text-left [&[align=center]]:text-center [&[align=right]]:text-right;
362
+ }
363
+
364
+ .prose hr {
365
+ @apply my-8 border-border;
366
+ }
367
+ }
@@ -0,0 +1,163 @@
1
+ import type { VNode } from 'vue'
2
+ import { FileIcon } from 'lucide-vue-next'
3
+ import { defineComponent, h } from 'vue'
4
+
5
+ interface IconProps {
6
+ class?: string
7
+ style?: Record<string, unknown>
8
+ [key: string]: unknown
9
+ }
10
+
11
+ function createIcon(svgContent: (props: IconProps) => VNode) {
12
+ return defineComponent({
13
+ name: 'Icon',
14
+ props: {
15
+ class: {
16
+ type: String,
17
+ default: '',
18
+ },
19
+ },
20
+ setup(props, { attrs }) {
21
+ return () => svgContent({ ...props, ...attrs })
22
+ },
23
+ })
24
+ }
25
+
26
+ export const Icons = {
27
+ logo: createIcon((props: IconProps) =>
28
+ h('svg', {
29
+ xmlns: 'http://www.w3.org/2000/svg',
30
+ viewBox: '0 0 256 256',
31
+ style: {
32
+ color: '#41B883',
33
+ },
34
+ ...props,
35
+ }, [
36
+ h('rect', { width: '256', height: '256', fill: 'none' }),
37
+ h('line', {
38
+ 'x1': '208',
39
+ 'y1': '128',
40
+ 'x2': '128',
41
+ 'y2': '208',
42
+ 'fill': 'none',
43
+ 'stroke': 'currentColor',
44
+ 'stroke-linecap': 'round',
45
+ 'stroke-linejoin': 'round',
46
+ 'stroke-width': '32',
47
+ }),
48
+ h('line', {
49
+ 'x1': '192',
50
+ 'y1': '40',
51
+ 'x2': '40',
52
+ 'y2': '192',
53
+ 'fill': 'none',
54
+ 'stroke': 'currentColor',
55
+ 'stroke-linecap': 'round',
56
+ 'stroke-linejoin': 'round',
57
+ 'stroke-width': '32',
58
+ }),
59
+ ]),
60
+ ),
61
+
62
+ gitHub: createIcon((props: IconProps) =>
63
+ h('svg', {
64
+ viewBox: '0 0 438.549 438.549',
65
+ ...props,
66
+ }, [
67
+ h('path', {
68
+ fill: 'currentColor',
69
+ d: 'M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z',
70
+ }),
71
+ ]),
72
+ ),
73
+
74
+ json: createIcon((props: IconProps) =>
75
+ h('svg', {
76
+ xmlns: 'http://www.w3.org/2000/svg',
77
+ viewBox: '0 0 24 24',
78
+ ...props,
79
+ }, [
80
+ h('path', {
81
+ fill: 'currentColor',
82
+ d: 'M12.043 23.968c.479-.004.953-.029 1.426-.094a11.805 11.805 0 0 0 3.146-.863 12.404 12.404 0 0 0 3.793-2.542 11.977 11.977 0 0 0 2.44-3.427 11.794 11.794 0 0 0 1.02-3.476c.149-1.16.135-2.346-.045-3.499a11.96 11.96 0 0 0-.793-2.788 11.197 11.197 0 0 0-.854-1.617c-1.168-1.837-2.861-3.314-4.81-4.3a12.835 12.835 0 0 0-2.172-.87h-.005c.119.063.24.132.345.201.12.074.239.146.351.225a8.93 8.93 0 0 1 1.559 1.33c1.063 1.145 1.797 2.548 2.218 4.041.284.982.434 1.998.495 3.017.044.743.044 1.491-.047 2.229-.149 1.27-.554 2.51-1.228 3.596a7.475 7.475 0 0 1-1.903 2.084c-1.244.928-2.877 1.482-4.436 1.114a3.916 3.916 0 0 1-.748-.258 4.692 4.692 0 0 1-.779-.45 6.08 6.08 0 0 1-1.244-1.105 6.507 6.507 0 0 1-1.049-1.747 7.366 7.366 0 0 1-.494-2.54c-.03-1.273.225-2.553.854-3.67a6.43 6.43 0 0 1 1.663-1.918c.225-.178.464-.333.704-.479l.016-.007a5.121 5.121 0 0 0-1.441-.12 4.963 4.963 0 0 0-1.228.24c-.359.12-.704.27-1.019.45a6.146 6.146 0 0 0-.733.494c-.211.18-.42.36-.615.555-1.123 1.153-1.768 2.682-2.022 4.256-.15.973-.15 1.96-.091 2.95.105 1.395.391 2.787.945 4.062a8.518 8.518 0 0 0 1.348 2.173 8.14 8.14 0 0 0 3.132 2.23 7.934 7.934 0 0 0 2.113.54c.074.015.149.015.209.015zm-2.934-.398a4.102 4.102 0 0 1-.45-.228 8.5 8.5 0 0 1-2.038-1.534c-1.094-1.137-1.827-2.566-2.247-4.08a15.184 15.184 0 0 1-.495-3.172 12.14 12.14 0 0 1 .046-2.082c.135-1.257.495-2.501 1.124-3.58a6.889 6.889 0 0 1 1.783-2.053 6.23 6.23 0 0 1 1.633-.9 5.363 5.363 0 0 1 3.522-.045c.029 0 .029 0 .045.03.015.015.045.015.06.03.045.016.104.045.165.074.239.12.479.271.704.42a6.294 6.294 0 0 1 2.097 2.502c.42.914.615 1.934.631 2.938.014 1.079-.18 2.157-.645 3.146a6.42 6.42 0 0 1-2.638 2.832c.09.03.18.045.271.075.225.044.449.074.688.074 1.468.045 2.892-.66 3.94-1.647.195-.18.375-.375.54-.585.225-.27.435-.54.614-.823.239-.375.435-.75.614-1.154a8.112 8.112 0 0 0 .509-1.664c.196-1.004.211-2.022.149-3.026-.135-2.022-.673-4.045-1.842-5.724a9.054 9.054 0 0 0-.555-.719 9.868 9.868 0 0 0-1.063-1.034 8.477 8.477 0 0 0-1.363-.915 9.927 9.927 0 0 0-1.692-.598l-.3-.06c-.209-.03-.42-.044-.634-.06a8.453 8.453 0 0 0-1.015.016c-.704.045-1.412.16-2.112.337C5.799 1.227 2.863 3.566 1.3 6.67A11.834 11.834 0 0 0 .238 9.801a11.81 11.81 0 0 0-.104 3.775c.12 1.02.374 2.023.778 2.977.227.57.511 1.124.825 1.648 1.094 1.783 2.683 3.236 4.51 4.24.688.39 1.408.69 2.157.944.226.074.45.15.689.21z',
83
+ }),
84
+ ])),
85
+
86
+ ts: createIcon((props: IconProps) =>
87
+ h('svg', {
88
+ xmlns: 'http://www.w3.org/2000/svg',
89
+ viewBox: '0 0 24 24',
90
+ ...props,
91
+ }, [
92
+ h('path', {
93
+ fill: 'currentColor',
94
+ d: 'M1.125 0C.502 0 0 .502 0 1.125v21.75C0 23.498.502 24 1.125 24h21.75c.623 0 1.125-.502 1.125-1.125V1.125C24 .502 23.498 0 22.875 0zm17.363 9.75c.612 0 1.154.037 1.627.111a6.38 6.38 0 0 1 1.306.34v2.458a3.95 3.95 0 0 0-.643-.361 5.093 5.093 0 0 0-.717-.26 5.453 5.453 0 0 0-1.426-.2c-.3 0-.573.028-.819.086a2.1 2.1 0 0 0-.623.242c-.17.104-.3.229-.393.374a.888.888 0 0 0-.14.49c0 .196.053.373.156.529.104.156.252.304.443.444s.423.276.696.41c.273.135.582.274.926.416.47.197.892.407 1.266.628.374.222.695.473.963.753.268.279.472.598.614.957.142.359.214.776.214 1.253 0 .657-.125 1.21-.373 1.656a3.033 3.033 0 0 1-1.012 1.085 4.38 4.38 0 0 1-1.487.596c-.566.12-1.163.18-1.79.18a9.916 9.916 0 0 1-1.84-.164 5.544 5.544 0 0 1-1.512-.493v-2.63a5.033 5.033 0 0 0 3.237 1.2c.333 0 .624-.03.872-.09.249-.06.456-.144.623-.25.166-.108.29-.234.373-.38a1.023 1.023 0 0 0-.074-1.089 2.12 2.12 0 0 0-.537-.5 5.597 5.597 0 0 0-.807-.444 27.72 27.72 0 0 0-1.007-.436c-.918-.383-1.602-.852-2.053-1.405-.45-.553-.676-1.222-.676-2.005 0-.614.123-1.141.369-1.582.246-.441.58-.804 1.004-1.089a4.494 4.494 0 0 1 1.47-.629 7.536 7.536 0 0 1 1.77-.201zm-15.113.188h9.563v2.166H9.506v9.646H6.789v-9.646H3.375z',
95
+ }),
96
+ ])),
97
+
98
+ css: createIcon((props: IconProps) =>
99
+ h('svg', {
100
+ xmlns: 'http://www.w3.org/2000/svg',
101
+ viewBox: '0 0 24 24',
102
+ ...props,
103
+ }, [
104
+ h('path', {
105
+ fill: 'currentColor',
106
+ d: 'M0 0v20.16A3.84 3.84 0 0 0 3.84 24h16.32A3.84 3.84 0 0 0 24 20.16V3.84A3.84 3.84 0 0 0 20.16 0Zm14.256 13.08c1.56 0 2.28 1.08 2.304 2.64h-1.608c.024-.288-.048-.6-.144-.84-.096-.192-.288-.264-.552-.264-.456 0-.696.264-.696.84-.024.576.288.888.768 1.08.72.288 1.608.744 1.92 1.296q.432.648.432 1.656c0 1.608-.912 2.592-2.496 2.592-1.656 0-2.4-1.032-2.424-2.688h1.68c0 .792.264 1.176.792 1.176.264 0 .456-.072.552-.24.192-.312.24-1.176-.048-1.512-.312-.408-.912-.6-1.32-.816q-.828-.396-1.224-.936c-.24-.36-.36-.888-.36-1.536 0-1.44.936-2.472 2.424-2.448m5.4 0c1.584 0 2.304 1.08 2.328 2.64h-1.608c0-.288-.048-.6-.168-.84-.096-.192-.264-.264-.528-.264-.48 0-.72.264-.72.84s.288.888.792 1.08c.696.288 1.608.744 1.92 1.296.264.432.408.984.408 1.656.024 1.608-.888 2.592-2.472 2.592-1.68 0-2.424-1.056-2.448-2.688h1.68c0 .744.264 1.176.792 1.176.264 0 .456-.072.552-.24.216-.312.264-1.176-.048-1.512-.288-.408-.888-.6-1.32-.816-.552-.264-.96-.576-1.2-.936s-.36-.888-.36-1.536c-.024-1.44.912-2.472 2.4-2.448m-11.031.018c.711-.006 1.419.198 1.839.63.432.432.672 1.128.648 1.992H9.336c.024-.456-.096-.792-.432-.96-.312-.144-.768-.048-.888.24-.12.264-.192.576-.168.864v3.504c0 .744.264 1.128.768 1.128a.65.65 0 0 0 .552-.264c.168-.24.192-.552.168-.84h1.776c.096 1.632-.984 2.712-2.568 2.688-1.536 0-2.496-.864-2.472-2.472v-4.032c0-.816.24-1.44.696-1.848.432-.408 1.146-.624 1.857-.63',
107
+ }),
108
+ ])),
109
+
110
+ bash: createIcon((props: IconProps) =>
111
+ h('svg', {
112
+ xmlns: 'http://www.w3.org/2000/svg',
113
+ viewBox: '0 0 24 24',
114
+ ...props,
115
+ }, [
116
+ h('path', {
117
+ fill: 'currentColor',
118
+ d: 'M21.038 4.9 13.461.402a2.86 2.86 0 0 0-2.923.001L2.961 4.9A3.023 3.023 0 0 0 1.5 7.503v8.995c0 1.073.557 2.066 1.462 2.603l7.577 4.497a2.86 2.86 0 0 0 2.922 0l7.577-4.497a3.023 3.023 0 0 0 1.462-2.603V7.503A3.021 3.021 0 0 0 21.038 4.9zM15.17 18.946l.013.646c.001.078-.05.167-.111.198l-.383.22c-.061.031-.111-.007-.112-.085l-.007-.635c-.328.136-.66.169-.872.084-.04-.016-.057-.075-.041-.142l.139-.584a.24.24 0 0 1 .069-.121.163.163 0 0 1 .036-.026c.022-.011.043-.014.062-.006.229.077.521.041.802-.101.357-.181.596-.545.592-.907-.003-.328-.181-.465-.613-.468-.55.001-1.064-.107-1.072-.917-.007-.667.34-1.361.889-1.8l-.007-.652c-.001-.08.048-.168.111-.2l.37-.236c.061-.031.111.007.112.087l.006.653c.273-.109.511-.138.726-.088.047.012.067.076.048.151l-.144.578a.255.255 0 0 1-.065.116.161.161 0 0 1-.038.028.083.083 0 0 1-.057.009c-.098-.022-.332-.073-.699.113-.385.195-.52.53-.517.778.003.297.155.387.681.396.7.012 1.003.318 1.01 1.023.007.689-.362 1.433-.928 1.888zm3.973-1.087c0 .06-.008.116-.058.145l-1.916 1.164c-.05.029-.09.004-.09-.056v-.494c0-.06.037-.093.087-.122l1.887-1.129c.05-.029.09-.004.09.056v.436zm1.316-11.062-7.168 4.427c-.894.523-1.553 1.109-1.553 2.187v8.833c0 .645.26 1.063.66 1.184a2.304 2.304 0 0 1-.398.039c-.42 0-.833-.114-1.197-.33L3.226 18.64a2.494 2.494 0 0 1-1.201-2.142V7.503c0-.881.46-1.702 1.201-2.142L10.803.863a2.342 2.342 0 0 1 2.394 0l7.577 4.498a2.479 2.479 0 0 1 1.164 1.732c-.252-.536-.818-.682-1.479-.296z',
119
+ }),
120
+ ])),
121
+
122
+ vue: createIcon((props: IconProps) =>
123
+ h(
124
+ 'svg',
125
+ {
126
+ viewBox: '0 0 261.76 226.69',
127
+ xmlns: 'http://www.w3.org/2000/svg',
128
+ class: props.class,
129
+ style: props.style,
130
+ ...props,
131
+ },
132
+ [
133
+ h('path', {
134
+ d: 'M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z',
135
+ fill: 'currentColor',
136
+ }),
137
+ h('path', {
138
+ d: 'M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z',
139
+ fill: 'currentColor',
140
+ }),
141
+ ],
142
+ ),
143
+ ),
144
+ }
145
+
146
+ export function getIconForLanguageExtension(language: string) {
147
+ switch (language) {
148
+ case 'json':
149
+ return Icons.json
150
+ case 'css':
151
+ return Icons.css
152
+ case 'js':
153
+ case 'jsx':
154
+ case 'ts':
155
+ case 'tsx':
156
+ case 'typescript':
157
+ return Icons.ts
158
+ case 'vue':
159
+ return Icons.vue
160
+ default:
161
+ return FileIcon
162
+ }
163
+ }
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ const appConfig = useAppConfig()
3
+ const title = computed(() => appConfig.docs?.title || 'Docs')
4
+ </script>
5
+
6
+ <template>
7
+ <footer class="border-t py-6 md:py-0">
8
+ <div class="container flex flex-col items-center justify-between gap-4 md:h-14 md:flex-row">
9
+ <p class="text-center text-sm leading-loose text-muted-foreground md:text-left">
10
+ Built with
11
+ <NuxtLink
12
+ to="https://github.com/pleaseai/docs"
13
+ target="_blank"
14
+ class="font-medium underline underline-offset-4"
15
+ >
16
+ docs please
17
+ </NuxtLink>
18
+ </p>
19
+ <p class="text-center text-sm text-muted-foreground md:text-right">
20
+ {{ title }}
21
+ </p>
22
+ </div>
23
+ </footer>
24
+ </template>