imprensa 0.1.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 (44) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +51 -0
  3. package/default.css +239 -0
  4. package/dist/client-runtime-D7MhMWCo.d.mts +45 -0
  5. package/dist/components/doc.d.mts +2 -0
  6. package/dist/components/doc.mjs +2 -0
  7. package/dist/components/icons.d.mts +23 -0
  8. package/dist/components/icons.mjs +40 -0
  9. package/dist/components/index.d.mts +33 -0
  10. package/dist/components/index.mjs +253 -0
  11. package/dist/core/client-runtime.d.mts +2 -0
  12. package/dist/core/client-runtime.mjs +121 -0
  13. package/dist/core/prerender-core.d.mts +2 -0
  14. package/dist/core/prerender-core.mjs +2 -0
  15. package/dist/core/runtime.d.mts +3 -0
  16. package/dist/core/runtime.mjs +3 -0
  17. package/dist/core/shiki-build.d.mts +9 -0
  18. package/dist/core/shiki-build.mjs +34 -0
  19. package/dist/doc-pager-D-YhwEQN.d.mts +27 -0
  20. package/dist/doc-toolbar-DUQS2gnK.mjs +460 -0
  21. package/dist/docs/config.d.mts +13 -0
  22. package/dist/docs/config.mjs +10 -0
  23. package/dist/docs/landing-shiki.d.mts +7 -0
  24. package/dist/docs/landing-shiki.mjs +7 -0
  25. package/dist/docs/mdx.d.mts +79 -0
  26. package/dist/docs/mdx.mjs +293 -0
  27. package/dist/docs/rehype.d.mts +25 -0
  28. package/dist/docs/rehype.mjs +2 -0
  29. package/dist/frontmatter-DVneGjCO.mjs +16 -0
  30. package/dist/global-search-Dfv8DYN3.mjs +310 -0
  31. package/dist/index.d.mts +41 -0
  32. package/dist/index.mjs +668 -0
  33. package/dist/prerender-core-D4Li--RS.mjs +172 -0
  34. package/dist/prerender-core-DBi9ntWW.d.mts +48 -0
  35. package/dist/rehype-BWpGaBql.mjs +182 -0
  36. package/dist/search-store-DDGHRAKl.mjs +64 -0
  37. package/dist/shiki-gFey7C-z.d.mts +3289 -0
  38. package/dist/sidebar-layout-DsEhSkJS.mjs +43 -0
  39. package/dist/socials-BIszPk-A.d.mts +8 -0
  40. package/docs/architecture.md +26 -0
  41. package/docs/integration-notes.md +6 -0
  42. package/index.d.ts +49 -0
  43. package/package.json +128 -0
  44. package/tsconfig.json +28 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,15 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0-alpha.0
4
+
5
+ ### Added
6
+
7
+ - `imprensa()` Vite plugin: MDX, Ilha pages, Tailwind, prerender, sitemap, llms.txt
8
+ - Docs UI: resizable sidebar, theme toggle, global search (Areia Dialog + MiniSearch)
9
+ - `@ilha/store` for search `open` / `query` with `store.bind()` for `bind:open`
10
+ - Shiki / twoslash build pipeline, dead-link rehype (optional)
11
+
12
+ ### Notes
13
+
14
+ - Portaled search dialog uses a small DOM bridge (`search-portal-sync`) until Areia `portal={false}` or equivalent
15
+ - `SearchOverlay` island is a no-op registry stub; real UI is `GlobalSearch` on `document.body`
package/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # imprensa
2
+
3
+ Vite meta-plugin and runtime for **Ilha** + **Areia** documentation sites (MDX, Shiki, static prerender, docs chrome).
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ bun add imprensa areia ilha @ilha/store @ilha/router lucide
9
+ ```
10
+
11
+ Peer versions are listed in `package.json` — align `ilha`, `areia`, and `@ilha/store` with the starter template.
12
+
13
+ ## Use
14
+
15
+ ```ts
16
+ // vite.config.ts
17
+ import { imprensa } from "imprensa";
18
+
19
+ export default defineConfig({
20
+ plugins: [imprensa({ contentDir: "src/content", hostname: "https://example.com" })],
21
+ });
22
+ ```
23
+
24
+ ```ts
25
+ // src/main.ts
26
+ import { createImprensa } from "imprensa/runtime";
27
+
28
+ void createImprensa().init();
29
+ ```
30
+
31
+ See `templates/starter` in the [imprensa](https://github.com/ilhajs/imprensa) monorepo.
32
+
33
+ ## Exports
34
+
35
+ | Subpath | Role |
36
+ | ---------------------- | ---------------------------------------- |
37
+ | `imprensa` | Vite plugin |
38
+ | `imprensa/runtime` | `createImprensa`, theme, mount/hydrate |
39
+ | `imprensa/prerender` | Static prerender entry |
40
+ | `imprensa/mdx` | Routes, search index, MDX render helpers |
41
+ | `imprensa/components` | Layout, sidebar, search triggers |
42
+ | `imprensa/doc` | Doc toolbar, pager |
43
+ | `imprensa/default.css` | Docs theme + Tailwind layers |
44
+
45
+ ## Global search
46
+
47
+ Search mounts on `document.body` from `createImprensa().init()`. State lives in `@ilha/store` (`searchOpen`, `searchQuery`). Triggers use `data-search-trigger` or ⌘K.
48
+
49
+ ## Alpha
50
+
51
+ `0.1.x` is an **alpha** API — expect small breaking changes. Pin exact versions in production until `1.0`.
package/default.css ADDED
@@ -0,0 +1,239 @@
1
+ @import "tailwindcss";
2
+ @import "@shikijs/twoslash/style-rich.css";
3
+ @plugin "@tailwindcss/typography";
4
+ @plugin "areia";
5
+
6
+ @source "./src/**/*.{ts,tsx}";
7
+
8
+ @layer base {
9
+ * {
10
+ --areia-code-block-bg: var(--areia-surface-muted);
11
+ --shiki-dark-bg: var(--areia-code-block-bg) !important;
12
+ --twoslash-popup-bg: var(--areia-surface-elevated);
13
+ --twoslash-popup-color: var(--areia-text-default);
14
+ --twoslash-border-color: var(--areia-border);
15
+ --twoslash-docs-color: var(--areia-text-subtle);
16
+ --twoslash-popup-shadow: var(--areia-shadow-lg);
17
+ }
18
+
19
+ html,
20
+ body {
21
+ @apply m-0 bg-areia-background;
22
+ }
23
+
24
+ #app,
25
+ .imprensa-root,
26
+ .imprensa-root-main {
27
+ display: flex;
28
+ flex-direction: column;
29
+ min-height: 0;
30
+ width: 100%;
31
+ }
32
+
33
+ .imprensa-root {
34
+ flex: 1 1 auto;
35
+ }
36
+
37
+ .imprensa-root-main {
38
+ flex: 1 1 0;
39
+ margin: 0;
40
+ }
41
+
42
+ html:not([data-theme-ready]) body {
43
+ @apply invisible;
44
+ }
45
+
46
+ [data-ilha-slot],
47
+ [data-router-view] {
48
+ display: contents;
49
+ }
50
+
51
+ #imprensa-global-search-host[hidden] {
52
+ display: none;
53
+ }
54
+ }
55
+
56
+ @layer components {
57
+ /*
58
+ * Docs routes: one viewport (100dvh). Avoid 100vh min-height on body + 100dvh shell
59
+ * (mobile URL bar ≈ 50px page scroll under the sidebar).
60
+ */
61
+ html.imprensa-docs-layout {
62
+ height: 100dvh;
63
+ max-height: 100dvh;
64
+ overflow: hidden;
65
+ }
66
+
67
+ html.imprensa-docs-layout body {
68
+ height: 100dvh;
69
+ max-height: 100dvh;
70
+ min-height: 0 !important;
71
+ overflow: hidden;
72
+ }
73
+
74
+ html.imprensa-docs-layout #app {
75
+ height: 100dvh;
76
+ max-height: 100dvh;
77
+ min-height: 0;
78
+ overflow: hidden;
79
+ }
80
+
81
+ html.imprensa-docs-layout .imprensa-root {
82
+ flex: 1 1 0;
83
+ height: 100%;
84
+ max-height: 100%;
85
+ min-height: 0;
86
+ overflow: hidden;
87
+ }
88
+
89
+ html.imprensa-docs-layout .imprensa-root-main {
90
+ flex: 1 1 0;
91
+ min-height: 0;
92
+ overflow: hidden;
93
+ }
94
+
95
+ .imprensa-docs-shell [data-slot="resizable"] {
96
+ height: 100%;
97
+ min-height: 0;
98
+ }
99
+
100
+ /* Areia sets overflow:hidden on panels — scroll happens on inner wrappers only. */
101
+ .imprensa-docs-shell .imprensa-docs-sidebar-panel[data-slot="resizable-panel"],
102
+ .imprensa-docs-shell .imprensa-docs-main-panel[data-slot="resizable-panel"] {
103
+ min-height: 0 !important;
104
+ height: 100% !important;
105
+ max-height: 100% !important;
106
+ overflow: hidden !important;
107
+ }
108
+
109
+ .imprensa-docs-sidebar-panel {
110
+ @apply bg-areia-surface-elevated;
111
+ }
112
+
113
+ .imprensa-docs-sidebar-panel > * {
114
+ height: 100%;
115
+ min-height: 0;
116
+ }
117
+
118
+ .imprensa-docs-main-scroll {
119
+ height: 100%;
120
+ min-height: 0;
121
+ overflow-x: hidden;
122
+ overflow-y: auto;
123
+ overscroll-behavior-y: contain;
124
+ -webkit-overflow-scrolling: touch;
125
+ }
126
+
127
+ .imprensa-tree-indent-0 {
128
+ @apply ml-0;
129
+ }
130
+ .imprensa-tree-indent-1 {
131
+ @apply ml-2;
132
+ }
133
+ .imprensa-tree-indent-2 {
134
+ @apply ml-4;
135
+ }
136
+ .imprensa-tree-indent-3 {
137
+ @apply ml-6;
138
+ }
139
+ .imprensa-tree-indent-4 {
140
+ @apply ml-8;
141
+ }
142
+ .imprensa-tree-indent-5 {
143
+ @apply ml-10;
144
+ }
145
+ .imprensa-tree-indent-6 {
146
+ @apply ml-12;
147
+ }
148
+
149
+ .prose :where(h1, h2, h3, h4, h5, h6) {
150
+ @apply font-semibold scroll-mt-20;
151
+ }
152
+
153
+ .prose
154
+ :is(h1, h2, h3, h4, h5, h6)
155
+ :where(a.heading-anchor):not(:where(.not-prose, .not-prose *)) {
156
+ color: var(--areia-text-strong) !important;
157
+ text-decoration: none !important;
158
+ text-decoration-line: none !important;
159
+ }
160
+
161
+ .prose
162
+ :is(h1, h2, h3, h4, h5, h6)
163
+ :where(a.heading-anchor:hover):not(:where(.not-prose, .not-prose *)) {
164
+ color: var(--areia-text-strong) !important;
165
+ text-decoration: underline !important;
166
+ text-decoration-line: underline !important;
167
+ text-underline-offset: 0.25rem;
168
+ }
169
+
170
+ .prose :where(:not(pre) > code):not(:where(.not-prose, .not-prose *)) {
171
+ @apply rounded bg-areia-surface-muted px-1 py-0.5;
172
+ }
173
+
174
+ .prose :where(pre):not(:where(.not-prose, .not-prose *)) {
175
+ @apply my-5 h-auto max-w-full overflow-x-auto rounded-md border border-areia-border p-4 leading-snug;
176
+ background: var(--areia-code-block-bg) !important;
177
+ }
178
+
179
+ .prose :where(pre:not(.shiki) code):not(:where(.not-prose, .not-prose *)) {
180
+ @apply block min-w-max whitespace-pre bg-transparent leading-snug;
181
+ }
182
+
183
+ .prose :where(pre.shiki code, pre code span):not(:where(.not-prose, .not-prose *)) {
184
+ @apply bg-transparent leading-snug;
185
+ }
186
+
187
+ .prose :where(pre.shiki):not(:where(.not-prose, .not-prose *)),
188
+ .prose :where(pre.shiki):not(:where(.not-prose, .not-prose *)) code {
189
+ background-color: var(--areia-code-block-bg) !important;
190
+ }
191
+ }
192
+
193
+ @layer utilities {
194
+ .shiki {
195
+ @apply !overflow-x-auto !overflow-y-hidden !leading-snug;
196
+ }
197
+
198
+ .shiki code {
199
+ @apply block min-w-max overflow-visible border-0 bg-transparent p-0 leading-snug;
200
+ }
201
+
202
+ .shiki.twoslash,
203
+ .shiki.twoslash code {
204
+ overflow: visible !important;
205
+ }
206
+
207
+ .shiki .line {
208
+ @apply inline-block min-w-full leading-snug;
209
+ }
210
+
211
+ .shiki .highlighted,
212
+ .shiki .diff {
213
+ @apply -mx-4 px-4;
214
+ }
215
+
216
+ .twoslash-popup-code,
217
+ .twoslash-popup-code span {
218
+ @apply !bg-transparent;
219
+ }
220
+
221
+ html.dark .shiki,
222
+ html.dark .shiki span {
223
+ color: var(--shiki-dark) !important;
224
+ font-style: var(--shiki-dark-font-style) !important;
225
+ font-weight: var(--shiki-dark-font-weight) !important;
226
+ text-decoration: var(--shiki-dark-text-decoration) !important;
227
+ }
228
+
229
+ html.dark .shiki,
230
+ html.dark .prose :where(pre.shiki):not(:where(.not-prose, .not-prose *)) {
231
+ background-color: var(--areia-code-block-bg) !important;
232
+ }
233
+
234
+ /* night-owl-light blue (#4876d6) on #fbfbfb fails ~4.19:1 — darken for WCAG AA */
235
+ html:not(.dark) .shiki.shiki-themes span[style*="4876D6"],
236
+ html:not(.dark) .shiki.shiki-themes span[style*="4876d6"] {
237
+ color: #3558a8 !important;
238
+ }
239
+ }
@@ -0,0 +1,45 @@
1
+ import { a as ImprensaIslandRegistry, n as RouterLike } from "./prerender-core-DBi9ntWW.mjs";
2
+ import { PrerenderArguments } from "vite-prerender-plugin";
3
+
4
+ //#region src/core/shiki-types.d.ts
5
+ /** Browser Shiki instance from `imprensa/shiki` virtual module. */
6
+ type ImprensaShikiHighlighter = {
7
+ loadLanguage: (lang: string) => Promise<void>;
8
+ codeToHtml: (code: string, options: {
9
+ lang: string;
10
+ themes: {
11
+ light: string;
12
+ dark: string;
13
+ };
14
+ }) => string;
15
+ };
16
+ //#endregion
17
+ //#region src/core/client-runtime.d.ts
18
+ declare const shiki: Promise<ImprensaShikiHighlighter>;
19
+ /** Overridden at app build time by the imprensa Vite plugin from `imprensa()` shiki.themes. */
20
+ declare const shikiThemes: {
21
+ light: string;
22
+ dark: string;
23
+ };
24
+ declare const THEME_STORAGE_KEY = "imprensa:theme";
25
+ declare function getStoredTheme(): "light" | "dark" | "system";
26
+ declare function setStoredTheme(mode: "light" | "dark" | "system"): void;
27
+ declare function applyThemeToHtml(isDark: boolean): void;
28
+ declare function applyInitialTheme(): void;
29
+ declare function mountOrHydrate(options: {
30
+ pageRouter?: RouterLike;
31
+ registry: ImprensaIslandRegistry;
32
+ dev?: boolean;
33
+ target?: string;
34
+ static?: boolean;
35
+ }): (() => void) | undefined;
36
+ declare function createImprensa(options?: {
37
+ dev?: boolean;
38
+ target?: string;
39
+ static?: boolean;
40
+ }): {
41
+ init(): Promise<(() => void) | undefined>;
42
+ prerender(data?: PrerenderArguments): Promise<any>;
43
+ };
44
+ //#endregion
45
+ export { getStoredTheme as a, shiki as c, createImprensa as i, shikiThemes as l, applyInitialTheme as n, mountOrHydrate as o, applyThemeToHtml as r, setStoredTheme as s, THEME_STORAGE_KEY as t };
@@ -0,0 +1,2 @@
1
+ import { a as DocToolbar, i as DocArticle, n as DocPager, r as getAdjacentDocs, t as DocNavItem } from "../doc-pager-D-YhwEQN.mjs";
2
+ export { DocArticle, type DocNavItem, DocPager, DocToolbar, getAdjacentDocs };
@@ -0,0 +1,2 @@
1
+ import { i as getAdjacentDocs, n as DocToolbar, r as DocPager, t as DocArticle } from "../doc-toolbar-DUQS2gnK.mjs";
2
+ export { DocArticle, DocPager, DocToolbar, getAdjacentDocs };
@@ -0,0 +1,23 @@
1
+ import { n as ImprensaSocialService } from "../socials-BIszPk-A.mjs";
2
+ import { RawHtml } from "ilha";
3
+
4
+ //#region src/components/icons.d.ts
5
+ /** Social brand icon — `icon` matches `imprensa({ socials })` `service` values. */
6
+ declare function Icon(props: {
7
+ icon: ImprensaSocialService;
8
+ class?: string;
9
+ }): RawHtml;
10
+ /** @deprecated Use `<Icon icon="github" />` from `imprensa/icons`. */
11
+ declare function GithubIcon(props: {
12
+ class?: string;
13
+ }): RawHtml;
14
+ /** @deprecated Use `<Icon icon="x" />`. */
15
+ declare function XIcon(props: {
16
+ class?: string;
17
+ }): RawHtml;
18
+ /** @deprecated Use `<Icon icon="discord" />`. */
19
+ declare function DiscordIcon(props: {
20
+ class?: string;
21
+ }): RawHtml;
22
+ //#endregion
23
+ export { DiscordIcon, GithubIcon, Icon, type ImprensaSocialService, XIcon };
@@ -0,0 +1,40 @@
1
+ import { raw } from "ilha";
2
+ //#region src/components/icons.tsx
3
+ function escapeAttribute(value) {
4
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
5
+ }
6
+ function svg(className, path) {
7
+ return raw(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"${className ? ` class="${escapeAttribute(className)}"` : ""}><path d="${path}"/></svg>`);
8
+ }
9
+ const PATHS = {
10
+ github: "M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2z",
11
+ x: "M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.737-8.835L1.254 2.25H8.08l4.253 5.622 5.911-5.622zm-1.161 17.52h1.833L7.084 4.126H5.117z",
12
+ discord: "M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"
13
+ };
14
+ /** Social brand icon — `icon` matches `imprensa({ socials })` `service` values. */
15
+ function Icon(props) {
16
+ return svg(props.class, PATHS[props.icon]);
17
+ }
18
+ /** @deprecated Use `<Icon icon="github" />` from `imprensa/icons`. */
19
+ function GithubIcon(props) {
20
+ return Icon({
21
+ icon: "github",
22
+ class: props.class
23
+ });
24
+ }
25
+ /** @deprecated Use `<Icon icon="x" />`. */
26
+ function XIcon(props) {
27
+ return Icon({
28
+ icon: "x",
29
+ class: props.class
30
+ });
31
+ }
32
+ /** @deprecated Use `<Icon icon="discord" />`. */
33
+ function DiscordIcon(props) {
34
+ return Icon({
35
+ icon: "discord",
36
+ class: props.class
37
+ });
38
+ }
39
+ //#endregion
40
+ export { DiscordIcon, GithubIcon, Icon, XIcon };
@@ -0,0 +1,33 @@
1
+ import { a as DocToolbar, i as DocArticle, n as DocPager, r as getAdjacentDocs, t as DocNavItem } from "../doc-pager-D-YhwEQN.mjs";
2
+ import { searchDocuments } from "imprensa/mdx";
3
+
4
+ //#region src/components/search.d.ts
5
+ declare function LogoButton(): import("ilha/jsx-runtime").JSX.Element;
6
+ declare const ThemeToggle: import("ilha").Island<Record<string, unknown>, Omit<Record<never, never>, K> & Record<"mode", "system" | "light" | "dark">>;
7
+ /**
8
+ * @deprecated Replaced by `GlobalSearch` (body-mounted in `createImprensa().init()`).
9
+ * Kept so the vite plugin island registry stays stable.
10
+ */
11
+ declare const SearchOverlay: import("ilha").Island<Record<string, unknown>, Record<never, never>>;
12
+ declare function SearchSidebarTrigger(): import("ilha/jsx-runtime").JSX.Element;
13
+ declare function SearchNavbarTrigger(): import("ilha/jsx-runtime").JSX.Element;
14
+ //#endregion
15
+ //#region src/components/sidebar.d.ts
16
+ declare const Sidebar: import("ilha").Island<Record<string, unknown>, Record<never, never>>;
17
+ //#endregion
18
+ //#region src/components/layout.d.ts
19
+ declare const RootLayout: import("@ilha/router").LayoutHandler;
20
+ declare const ContentLayout: import("@ilha/router").LayoutHandler;
21
+ //#endregion
22
+ //#region src/components/preview.d.ts
23
+ declare const Preview: import("ilha").Island<{
24
+ code64: string;
25
+ }, Record<never, never>>;
26
+ //#endregion
27
+ //#region src/components/snippet.d.ts
28
+ declare const Snippet: import("ilha").Island<{
29
+ code: string;
30
+ lang: string;
31
+ }, Record<never, never>>;
32
+ //#endregion
33
+ export { ContentLayout, DocArticle, type DocNavItem, DocPager, DocToolbar, LogoButton, Preview, RootLayout, SearchNavbarTrigger, SearchOverlay, SearchSidebarTrigger, Sidebar, Snippet, ThemeToggle, getAdjacentDocs };