@takazudo/zudo-doc 5.28.2 → 6.0.1
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.
- package/CHANGELOG.md +33 -0
- package/README.md +49 -16
- package/bin/gen-z-index.mjs +18 -18
- package/dist/agent-docs/identity.d.ts +4 -0
- package/dist/agent-docs/identity.js +24 -0
- package/dist/agent-docs/index.d.ts +5 -0
- package/dist/agent-docs/index.js +5 -0
- package/dist/agent-docs/limits.d.ts +11 -0
- package/dist/agent-docs/limits.js +24 -0
- package/dist/agent-docs/search.d.ts +14 -0
- package/dist/agent-docs/search.js +82 -0
- package/dist/agent-docs/tokenize.d.ts +2 -0
- package/dist/agent-docs/tokenize.js +22 -0
- package/dist/agent-docs/types.d.ts +68 -0
- package/dist/agent-docs/types.js +0 -0
- package/dist/ai-chat-modal/index.d.ts +1 -4
- package/dist/ai-chat-modal/index.js +183 -123
- package/dist/asset-components/asset-card.d.ts +1 -2
- package/dist/asset-components/asset-card.js +12 -12
- package/dist/asset-components/asset-code.d.ts +1 -2
- package/dist/asset-components/asset-code.js +10 -10
- package/dist/asset-components/shared.d.ts +3 -4
- package/dist/asset-components/shared.js +4 -4
- package/dist/asset-index-page/body.d.ts +5 -6
- package/dist/asset-index-page/body.js +6 -6
- package/dist/asset-index-page/index.d.ts +1 -2
- package/dist/asset-index-page/index.js +1 -1
- package/dist/asset-page/body.d.ts +5 -9
- package/dist/asset-page/body.js +3 -3
- package/dist/asset-page/components.d.ts +16 -17
- package/dist/asset-page/components.js +10 -9
- package/dist/asset-page/index.d.ts +1 -2
- package/dist/asset-page/index.js +1 -1
- package/dist/auto-logo/index.d.ts +1 -2
- package/dist/auto-logo/index.js +2 -2
- package/dist/body-foot-util/body-foot-util-area.d.ts +3 -4
- package/dist/body-foot-util/body-foot-util-area.js +1 -2
- package/dist/body-foot-util/edit-link.d.ts +2 -3
- package/dist/body-foot-util/edit-link.js +1 -2
- package/dist/breadcrumb/breadcrumb.d.ts +6 -6
- package/dist/breadcrumb/breadcrumb.js +3 -4
- package/dist/catalog.js +1 -1
- package/dist/category-nav/index.d.ts +1 -2
- package/dist/category-nav/index.js +11 -5
- package/dist/category-tree-nav/index.d.ts +1 -2
- package/dist/category-tree-nav/index.js +3 -3
- package/dist/chrome/derive.d.ts +18 -27
- package/dist/chrome/derive.js +47 -29
- package/dist/chrome/index.d.ts +5 -5
- package/dist/chrome/index.js +1 -1
- package/dist/chrome/island-data.d.ts +4 -0
- package/dist/chrome/island-data.js +52 -0
- package/dist/chrome/primary-slots.d.ts +2 -3
- package/dist/chrome-bindings.d.ts +30 -22
- package/dist/code-group/index.d.ts +3 -4
- package/dist/code-group/index.js +3 -7
- package/dist/code-syntax/code-block-enhancer.d.ts +1 -2
- package/dist/code-syntax/code-block-enhancer.js +2 -2
- package/dist/code-syntax/mermaid-init.d.ts +1 -2
- package/dist/code-syntax/mermaid-init.js +5 -2
- package/dist/code-syntax/tabs-init-script.js +1 -1
- package/dist/code-syntax/tabs-init.d.ts +1 -2
- package/dist/code-syntax/tabs-init.js +2 -2
- package/dist/code-syntax/tabs.d.ts +6 -6
- package/dist/code-syntax/tabs.js +8 -8
- package/dist/compiled.css +2937 -2942
- package/dist/config/component-tokens.d.ts +1 -1
- package/dist/config/component-tokens.js +22 -0
- package/dist/config-assertions/index.d.ts +13 -0
- package/dist/config-assertions/index.js +14 -0
- package/dist/config.d.ts +36 -17
- package/dist/config.js +23 -95
- package/dist/content/content-blockquote.d.ts +2 -3
- package/dist/content/content-blockquote.js +3 -3
- package/dist/content/content-code.d.ts +3 -4
- package/dist/content/content-code.js +5 -5
- package/dist/content/content-link.d.ts +3 -4
- package/dist/content/content-link.js +10 -10
- package/dist/content/content-ol.d.ts +2 -3
- package/dist/content/content-ol.js +5 -4
- package/dist/content/content-paragraph.d.ts +2 -3
- package/dist/content/content-paragraph.js +1 -1
- package/dist/content/content-strong.d.ts +2 -3
- package/dist/content/content-strong.js +3 -3
- package/dist/content/content-table.d.ts +2 -3
- package/dist/content/content-table.js +4 -4
- package/dist/content/content-ul.d.ts +2 -3
- package/dist/content/content-ul.js +4 -4
- package/dist/content/heading-h2.d.ts +2 -3
- package/dist/content/heading-h2.js +4 -4
- package/dist/content/heading-h3.d.ts +2 -3
- package/dist/content/heading-h3.js +4 -4
- package/dist/content/heading-h4.d.ts +2 -3
- package/dist/content/heading-h4.js +4 -4
- package/dist/content-admonition/index.d.ts +3 -4
- package/dist/content-admonition/index.js +2 -2
- package/dist/content.css +35 -33
- package/dist/design-token-panel-bootstrap-controller.d.ts +178 -0
- package/dist/design-token-panel-bootstrap-controller.js +359 -0
- package/dist/design-token-panel-bootstrap-island.d.ts +5 -0
- package/dist/design-token-panel-bootstrap-island.js +19 -0
- package/dist/design-token-panel-bootstrap.d.ts +5 -195
- package/dist/design-token-panel-bootstrap.js +3 -288
- package/dist/desktop-sidebar-toggle-island/index.d.ts +2 -7
- package/dist/desktop-sidebar-toggle-island/index.js +2 -58
- package/dist/desktop-sidebar-toggle-island/island.d.ts +4 -0
- package/dist/desktop-sidebar-toggle-island/island.js +43 -0
- package/dist/desktop-sidebar-toggle-island/storage.d.ts +4 -0
- package/dist/desktop-sidebar-toggle-island/storage.js +29 -0
- package/dist/desktop-toc-toggle-island/index.d.ts +2 -7
- package/dist/desktop-toc-toggle-island/index.js +2 -58
- package/dist/desktop-toc-toggle-island/island.d.ts +4 -0
- package/dist/desktop-toc-toggle-island/island.js +43 -0
- package/dist/desktop-toc-toggle-island/storage.d.ts +4 -0
- package/dist/desktop-toc-toggle-island/storage.js +29 -0
- package/dist/details/details.d.ts +3 -4
- package/dist/details/details.js +1 -1
- package/dist/doc-body-end/index.d.ts +1 -2
- package/dist/doc-body-end/index.js +1 -1
- package/dist/doc-body-end-islands/design-token-panel-island.d.ts +2 -2
- package/dist/doc-body-end-islands/design-token-panel-island.js +3 -7
- package/dist/doc-body-end-islands/index.d.ts +4 -21
- package/dist/doc-body-end-islands/index.js +5 -3
- package/dist/doc-body-end-islands/theme-pack-switcher-island.d.ts +3 -13
- package/dist/doc-body-end-islands/theme-pack-switcher-island.js +11 -13
- package/dist/doc-content-header/index.d.ts +1 -2
- package/dist/doc-content-header/index.js +1 -1
- package/dist/doc-history/index.d.ts +1 -1
- package/dist/doc-history/index.js +166 -141
- package/dist/doc-history-area/index.d.ts +6 -4
- package/dist/doc-history-area/index.js +17 -16
- package/dist/doc-metainfo-area/index.d.ts +2 -3
- package/dist/doc-metainfo-area/index.js +1 -1
- package/dist/doc-page-renderer/index.d.ts +13 -7
- package/dist/doc-page-renderer/index.js +10 -1
- package/dist/doc-page-shell/index.d.ts +20 -7
- package/dist/doc-page-shell/index.js +17 -6
- package/dist/doc-pager/index.d.ts +1 -2
- package/dist/doc-pager/index.js +3 -3
- package/dist/doc-tags-area/index.d.ts +2 -3
- package/dist/doc-tags-area/index.js +1 -1
- package/dist/doclayout/doc-layout-with-defaults.d.ts +9 -9
- package/dist/doclayout/doc-layout-with-defaults.js +5 -15
- package/dist/doclayout/doc-layout.d.ts +26 -27
- package/dist/doclayout/doc-layout.js +23 -14
- package/dist/docs-schema/index.d.ts +4 -0
- package/dist/docs-schema/index.js +1 -0
- package/dist/extract-headings/index.js +43 -12
- package/dist/factory-context/index.d.ts +22 -19
- package/dist/features.css +75 -8
- package/dist/find-in-page/find-bar.d.ts +4 -2
- package/dist/find-in-page/find-bar.js +58 -69
- package/dist/find-in-page/index.d.ts +2 -8
- package/dist/find-in-page/index.js +33 -30
- package/dist/footer/footer.d.ts +3 -4
- package/dist/footer/footer.js +3 -3
- package/dist/footer-with-defaults/index.d.ts +2 -3
- package/dist/footer-with-defaults/index.js +1 -1
- package/dist/frontmatter-preview-defaults/index.js +1 -0
- package/dist/head/doc-head.d.ts +1 -1
- package/dist/head/doc-head.js +24 -32
- package/dist/head/og-tags.d.ts +1 -1
- package/dist/head/og-tags.js +8 -7
- package/dist/head/twitter-card.d.ts +1 -1
- package/dist/head/twitter-card.js +1 -1
- package/dist/head-with-defaults/index.d.ts +7 -2
- package/dist/head-with-defaults/index.js +46 -32
- package/dist/header/header.d.ts +8 -8
- package/dist/header/header.js +9 -11
- package/dist/header/types.d.ts +7 -7
- package/dist/header-with-defaults/index.d.ts +3 -4
- package/dist/header-with-defaults/index.js +27 -14
- package/dist/home-intro/index.d.ts +2 -5
- package/dist/home-intro/index.js +7 -5
- package/dist/home-intro/prepare.js +4 -3
- package/dist/home-page/index.d.ts +3 -3
- package/dist/home-page/index.js +19 -17
- package/dist/html-preview-wrapper/highlighted-code.d.ts +3 -4
- package/dist/html-preview-wrapper/highlighted-code.js +19 -17
- package/dist/html-preview-wrapper/html-preview-wrapper.d.ts +4 -25
- package/dist/html-preview-wrapper/html-preview-wrapper.js +2 -87
- package/dist/html-preview-wrapper/html-preview.d.ts +3 -10
- package/dist/html-preview-wrapper/html-preview.js +13 -37
- package/dist/html-preview-wrapper/index.d.ts +2 -1
- package/dist/html-preview-wrapper/index.js +1 -1
- package/dist/html-preview-wrapper/preview-base.d.ts +3 -5
- package/dist/html-preview-wrapper/preview-base.js +56 -59
- package/dist/html-preview-wrapper/wrapper.d.ts +20 -0
- package/dist/html-preview-wrapper/wrapper.js +37 -0
- package/dist/hydration-pending.d.ts +3 -5
- package/dist/hydration-pending.js +7 -5
- package/dist/i18n-version/language-switcher.d.ts +5 -32
- package/dist/i18n-version/language-switcher.js +5 -106
- package/dist/i18n-version/switcher-generated-scripts.d.ts +2 -0
- package/dist/i18n-version/switcher-generated-scripts.js +107 -0
- package/dist/i18n-version/switcher-url-state.d.ts +76 -0
- package/dist/i18n-version/switcher-url-state.js +103 -0
- package/dist/i18n-version/version-banner.d.ts +2 -3
- package/dist/i18n-version/version-banner.js +1 -1
- package/dist/i18n-version/version-switcher.d.ts +5 -50
- package/dist/i18n-version/version-switcher.js +5 -157
- package/dist/icons/index.d.ts +18 -19
- package/dist/icons/index.js +17 -33
- package/dist/image-enlarge/index.d.ts +1 -10
- package/dist/image-enlarge/index.js +80 -55
- package/dist/image-enlarge/public.d.ts +2 -0
- package/dist/image-enlarge/public.js +6 -0
- package/dist/image-enlarge/ssr-fallback.d.ts +2 -0
- package/dist/image-enlarge/ssr-fallback.js +8 -0
- package/dist/index.d.ts +11 -4
- package/dist/inline-version-switcher/index.d.ts +1 -2
- package/dist/inline-version-switcher/index.js +1 -1
- package/dist/island-types/index.d.ts +2 -2
- package/dist/island-types/index.js +1 -5
- package/dist/math-block/index.d.ts +4 -7
- package/dist/math-block/index.js +5 -5
- package/dist/mcp/handler.d.ts +8 -0
- package/dist/mcp/handler.js +129 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/loader.d.ts +19 -0
- package/dist/mcp/loader.js +202 -0
- package/dist/mdx-components/index.js +40 -108
- package/dist/mermaid-enlarge/index.d.ts +1 -8
- package/dist/mermaid-enlarge/index.js +174 -158
- package/dist/mermaid-enlarge/public.d.ts +2 -0
- package/dist/mermaid-enlarge/public.js +6 -0
- package/dist/mermaid-enlarge/ssr-fallback.d.ts +2 -0
- package/dist/mermaid-enlarge/ssr-fallback.js +8 -0
- package/dist/metainfo/doc-metainfo.d.ts +2 -3
- package/dist/metainfo/doc-metainfo.js +1 -4
- package/dist/metainfo/doc-tags.d.ts +2 -3
- package/dist/metainfo/doc-tags.js +1 -1
- package/dist/metainfo/frontmatter-preview.d.ts +3 -4
- package/dist/metainfo/frontmatter-preview.js +1 -1
- package/dist/nav-data-prep/index.js +6 -4
- package/dist/nav-indexing/category-nav.d.ts +2 -3
- package/dist/nav-indexing/category-nav.js +1 -2
- package/dist/nav-indexing/category-tree-nav.d.ts +2 -3
- package/dist/nav-indexing/category-tree-nav.js +1 -1
- package/dist/nav-indexing/doc-card-grid.d.ts +2 -3
- package/dist/nav-indexing/doc-card-grid.js +1 -2
- package/dist/nav-indexing/docs-sitemap.d.ts +2 -3
- package/dist/nav-indexing/docs-sitemap.js +2 -2
- package/dist/nav-indexing/index.d.ts +1 -1
- package/dist/nav-indexing/nav-card-grid.d.ts +2 -3
- package/dist/nav-indexing/nav-card-grid.js +1 -2
- package/dist/nav-indexing/note-tray-index-parts/card-list.d.ts +1 -2
- package/dist/nav-indexing/note-tray-index-parts/card-list.js +4 -4
- package/dist/nav-indexing/note-tray-index-parts/date-line.d.ts +2 -3
- package/dist/nav-indexing/note-tray-index-parts/date-line.js +1 -1
- package/dist/nav-indexing/note-tray-index-parts/index-list.d.ts +1 -2
- package/dist/nav-indexing/note-tray-index-parts/index-list.js +2 -2
- package/dist/nav-indexing/note-tray-index-parts/timeline.d.ts +1 -2
- package/dist/nav-indexing/note-tray-index-parts/timeline.js +2 -2
- package/dist/nav-indexing/note-tray-index.d.ts +1 -2
- package/dist/nav-indexing/note-tray-index.js +1 -1
- package/dist/nav-indexing/site-tree-nav-demo.d.ts +2 -3
- package/dist/nav-indexing/site-tree-nav-demo.js +2 -2
- package/dist/nav-indexing/tag-nav.d.ts +1 -2
- package/dist/nav-indexing/tag-nav.js +1 -1
- package/dist/nav-indexing/types.d.ts +2 -2
- package/dist/nav-indexing/versions-page-content.d.ts +2 -3
- package/dist/nav-indexing/versions-page-content.js +8 -8
- package/dist/note-tray-index/index.d.ts +1 -2
- package/dist/note-tray-index/index.js +1 -1
- package/dist/page-loading/page-loading-overlay.d.ts +1 -2
- package/dist/page-loading/page-loading-overlay.js +3 -5
- package/dist/plugins/agent-export.d.ts +3 -0
- package/dist/plugins/agent-export.js +34 -0
- package/dist/plugins/internal/agent-export/chunk.d.ts +5 -0
- package/dist/plugins/internal/agent-export/chunk.js +90 -0
- package/dist/plugins/internal/agent-export/index.d.ts +24 -0
- package/dist/plugins/internal/agent-export/index.js +123 -0
- package/dist/plugins/internal/agent-export/normalize.d.ts +5 -0
- package/dist/plugins/internal/agent-export/normalize.js +73 -0
- package/dist/plugins/internal/llms-txt/dev-middleware.d.ts +6 -0
- package/dist/plugins/internal/llms-txt/dev-middleware.js +8 -3
- package/dist/plugins/internal/llms-txt/emit.js +23 -6
- package/dist/plugins/internal/llms-txt/generate.d.ts +7 -1
- package/dist/plugins/internal/llms-txt/generate.js +9 -2
- package/dist/plugins/internal/llms-txt/load.d.ts +2 -0
- package/dist/plugins/internal/llms-txt/load.js +20 -4
- package/dist/plugins/internal/llms-txt/types.d.ts +10 -0
- package/dist/plugins/routes.js +4 -0
- package/dist/preset.d.ts +19 -9
- package/dist/preset.js +20 -1
- package/dist/route-context-payload/index.js +1 -1
- package/dist/routes/404.d.ts +2 -3
- package/dist/routes/404.js +1 -1
- package/dist/routes/_chrome.d.ts +5 -5
- package/dist/routes/_chrome.js +7 -2
- package/dist/routes/_context.d.ts +4 -4
- package/dist/routes/_design-token-panel-bootstrap.d.ts +1 -4
- package/dist/routes/_design-token-panel-bootstrap.js +9 -1
- package/dist/routes/docs-slug.d.ts +2 -3
- package/dist/routes/docs-tags-index.d.ts +2 -3
- package/dist/routes/docs-tags-index.js +1 -1
- package/dist/routes/docs-tags-tag.d.ts +2 -3
- package/dist/routes/docs-tags-tag.js +1 -1
- package/dist/routes/docs-versions.d.ts +2 -3
- package/dist/routes/docs-versions.js +1 -1
- package/dist/routes/files-path.d.ts +2 -3
- package/dist/routes/files-path.js +1 -1
- package/dist/routes/index.d.ts +2 -3
- package/dist/routes/index.js +1 -1
- package/dist/routes/locale-docs-slug.d.ts +2 -3
- package/dist/routes/locale-docs-tags-index.d.ts +2 -3
- package/dist/routes/locale-docs-tags-index.js +1 -1
- package/dist/routes/locale-docs-tags-tag.d.ts +2 -3
- package/dist/routes/locale-docs-tags-tag.js +1 -1
- package/dist/routes/locale-docs-versions.d.ts +2 -3
- package/dist/routes/locale-docs-versions.js +1 -1
- package/dist/routes/locale-files-path.d.ts +2 -3
- package/dist/routes/locale-files-path.js +1 -1
- package/dist/routes/locale-index.d.ts +2 -3
- package/dist/routes/locale-index.js +1 -1
- package/dist/routes/mcp.d.ts +5 -0
- package/dist/routes/mcp.js +25 -0
- package/dist/routes/v-docs-slug.d.ts +2 -3
- package/dist/routes/v-locale-docs-slug.d.ts +2 -3
- package/dist/search-widget/index.d.ts +1 -2
- package/dist/search-widget/index.js +4 -7
- package/dist/search-widget-script/generated-script.js +12 -5
- package/dist/settings-defaults.d.ts +2 -0
- package/dist/settings-defaults.js +93 -0
- package/dist/settings.d.ts +8 -2
- package/dist/sidebar/client-data.d.ts +18 -0
- package/dist/sidebar/client-data.js +47 -0
- package/dist/sidebar/index.d.ts +3 -1
- package/dist/sidebar/index.js +3 -1
- package/dist/sidebar/sidebar.d.ts +12 -44
- package/dist/sidebar/sidebar.js +4 -3
- package/dist/sidebar/types.d.ts +14 -0
- package/dist/sidebar-prepaint/index.d.ts +1 -2
- package/dist/sidebar-prepaint/index.js +4 -6
- package/dist/sidebar-resizer/sidebar-resizer-init.d.ts +2 -3
- package/dist/sidebar-resizer/sidebar-resizer-init.js +3 -3
- package/dist/sidebar-toggle-island/index.d.ts +8 -11
- package/dist/sidebar-toggle-island/index.js +75 -62
- package/dist/sidebar-tree/build-tree.js +5 -6
- package/dist/sidebar-tree/types.d.ts +2 -0
- package/dist/sidebar-tree-island/index.d.ts +4 -19
- package/dist/sidebar-tree-island/index.js +782 -436
- package/dist/sidebar-tree-island/scope-state.d.ts +38 -0
- package/dist/sidebar-tree-island/scope-state.js +151 -0
- package/dist/sidebar-tree-island/sidebar-scroll-preserve.js +6 -2
- package/dist/sidebar-utils/index.d.ts +17 -19
- package/dist/sidebar-utils/index.js +100 -3
- package/dist/sidebar-utils/scope.d.ts +11 -0
- package/dist/sidebar-utils/scope.js +67 -0
- package/dist/sidebar-with-defaults/index.d.ts +1 -2
- package/dist/sidebar-with-defaults/index.js +19 -18
- package/dist/site-schema/nav-tree.js +15 -15
- package/dist/site-schema/types.d.ts +1 -0
- package/dist/site-tree-nav/index.d.ts +2 -3
- package/dist/site-tree-nav/index.js +11 -12
- package/dist/site-tree-nav/normalize-island-props.d.ts +16 -0
- package/dist/site-tree-nav/normalize-island-props.js +122 -0
- package/dist/site-tree-nav-island/index.d.ts +3 -3
- package/dist/site-tree-nav-island/index.js +243 -144
- package/dist/smart-break/index.d.ts +3 -4
- package/dist/smart-break/index.js +1 -1
- package/dist/tab-item/tab-item.d.ts +3 -4
- package/dist/tab-item/tab-item.js +1 -1
- package/dist/tag-pages/index.d.ts +3 -3
- package/dist/tag-pages/index.js +10 -10
- package/dist/theme/color-scheme-provider.d.ts +3 -3
- package/dist/theme/color-scheme-provider.js +3 -3
- package/dist/theme/theme-pack-provider.d.ts +1 -1
- package/dist/theme/theme-pack-provider.js +3 -3
- package/dist/theme/theme-toggle.d.ts +2 -3
- package/dist/theme/theme-toggle.js +1 -1
- package/dist/theme-pack-dialog/index.d.ts +1 -1
- package/dist/theme-pack-dialog/index.js +69 -75
- package/dist/theme-pack-dialog/theme-pack-card.d.ts +3 -4
- package/dist/theme-pack-dialog/theme-pack-card.js +19 -17
- package/dist/theme-pack-switcher/index.d.ts +4 -5
- package/dist/theme-pack-switcher/index.js +52 -49
- package/dist/theme-packs/academia/meta.json +1 -1
- package/dist/theme-packs/academia/pack.css +1 -1
- package/dist/theme-packs/bauhaus/meta.json +1 -1
- package/dist/theme-packs/bauhaus/pack.css +2 -2
- package/dist/theme-packs/blueprint/meta.json +1 -1
- package/dist/theme-packs/blueprint/pack.css +2 -2
- package/dist/theme-packs/botanica/meta.json +1 -1
- package/dist/theme-packs/botanica/pack.css +2 -2
- package/dist/theme-packs/broadsheet/meta.json +1 -1
- package/dist/theme-packs/broadsheet/pack.css +2 -2
- package/dist/theme-packs/brutalist/meta.json +1 -1
- package/dist/theme-packs/brutalist/pack.css +2 -2
- package/dist/theme-packs/eink/meta.json +1 -1
- package/dist/theme-packs/eink/pack.css +1 -1
- package/dist/theme-packs/futura-editorial/meta.json +1 -1
- package/dist/theme-packs/futura-editorial/pack.css +2 -2
- package/dist/theme-packs/hearth/meta.json +1 -1
- package/dist/theme-packs/hearth/pack.css +2 -2
- package/dist/theme-packs/ledger/meta.json +1 -1
- package/dist/theme-packs/ledger/pack.css +1 -1
- package/dist/theme-packs/manuscript/meta.json +1 -1
- package/dist/theme-packs/manuscript/pack.css +1 -1
- package/dist/theme-packs/matcha/meta.json +1 -1
- package/dist/theme-packs/matcha/pack.css +2 -2
- package/dist/theme-packs/nocturne/meta.json +1 -1
- package/dist/theme-packs/nocturne/pack.css +2 -2
- package/dist/theme-packs/observatory/meta.json +1 -1
- package/dist/theme-packs/observatory/pack.css +2 -2
- package/dist/theme-packs/onyx/meta.json +1 -1
- package/dist/theme-packs/onyx/pack.css +2 -2
- package/dist/theme-packs/phosphor/meta.json +1 -1
- package/dist/theme-packs/phosphor/pack.css +2 -2
- package/dist/theme-packs/riso/meta.json +1 -1
- package/dist/theme-packs/riso/pack.css +2 -2
- package/dist/theme-packs/sakura/meta.json +1 -1
- package/dist/theme-packs/sakura/pack.css +2 -2
- package/dist/theme-packs/scandi/meta.json +1 -1
- package/dist/theme-packs/scandi/pack.css +1 -1
- package/dist/theme-packs/solar/meta.json +1 -1
- package/dist/theme-packs/solar/pack.css +1 -1
- package/dist/theme-packs/sumi/meta.json +1 -1
- package/dist/theme-packs/sumi/pack.css +2 -2
- package/dist/theme-packs/swissgrid/meta.json +1 -1
- package/dist/theme-packs/swissgrid/pack.css +1 -1
- package/dist/theme-packs/timberline/meta.json +1 -1
- package/dist/theme-packs/timberline/pack.css +2 -2
- package/dist/theme-packs/washi/meta.json +1 -1
- package/dist/theme-packs/washi/pack.css +2 -2
- package/dist/theme-toggle/index.d.ts +1 -1
- package/dist/theme-toggle/index.js +154 -167
- package/dist/theme.css +47 -121
- package/dist/toc/mobile-toc.d.ts +3 -5
- package/dist/toc/mobile-toc.js +29 -27
- package/dist/toc/toc.d.ts +3 -4
- package/dist/toc/toc.js +18 -18
- package/dist/toc/use-active-heading.d.ts +5 -4
- package/dist/toc/use-active-heading.js +36 -30
- package/dist/toc-prepaint/index.d.ts +1 -2
- package/dist/toc-prepaint/index.js +4 -6
- package/dist/transitions/nested-island-props-refresh.d.ts +3 -16
- package/dist/transitions/nested-island-props-refresh.js +133 -151
- package/dist/transitions/page-events.d.ts +8 -13
- package/dist/tree-nav-shared/index.d.ts +4 -5
- package/dist/tree-nav-shared/index.js +6 -7
- package/dist/use-modal-dialog/index.d.ts +9 -63
- package/dist/use-modal-dialog/index.js +41 -59
- package/dist/versions-page/index.d.ts +3 -3
- package/dist/versions-page/index.js +5 -5
- package/dist/wind/index.d.ts +5 -0
- package/dist/wind/index.js +169 -0
- package/dist/wind.json +498 -0
- package/dist/z-index-defaults/index.d.ts +4 -4
- package/dist/zdtp-loader.d.ts +7 -0
- package/dist/zdtp-loader.js +8 -0
- package/eject/asset-components/asset-card.tsx +14 -16
- package/eject/asset-components/asset-code.tsx +10 -12
- package/eject/asset-components/shared.tsx +5 -7
- package/eject/breadcrumb/breadcrumb.tsx +15 -16
- package/eject/code-group/index.tsx +4 -10
- package/eject/content-admonition/index.tsx +5 -6
- package/eject/desktop-sidebar-toggle-island/index.ts +4 -0
- package/eject/desktop-sidebar-toggle-island/island.tsx +50 -0
- package/eject/desktop-sidebar-toggle-island/storage.ts +27 -0
- package/eject/details/details.tsx +3 -5
- package/eject/doc-history/index.tsx +193 -179
- package/eject/doc-pager/index.tsx +3 -4
- package/eject/footer/footer.tsx +7 -9
- package/eject/header/header.tsx +42 -54
- package/eject/header/nav-overflow-script.ts +1 -1
- package/eject/header/types.ts +12 -13
- package/eject/image-enlarge/index.tsx +84 -69
- package/eject/image-enlarge/public.ts +2 -0
- package/eject/image-enlarge/ssr-fallback.tsx +7 -0
- package/eject/page-loading/page-loading-overlay.tsx +8 -15
- package/eject/sidebar/client-data.ts +68 -0
- package/eject/sidebar/index.ts +3 -0
- package/eject/sidebar/sidebar.tsx +16 -97
- package/eject/sidebar/types.ts +15 -0
- package/eject/sidebar-toggle-island/index.tsx +103 -102
- package/eject/sidebar-tree-island/index.tsx +827 -615
- package/eject/sidebar-tree-island/scope-state.ts +154 -0
- package/eject/sidebar-tree-island/sidebar-scroll-preserve.ts +8 -2
- package/eject/site-tree-nav-island/index.tsx +349 -222
- package/eject/tab-item/tab-item.tsx +2 -4
- package/eject/theme-toggle/hydration-pending.ts +6 -10
- package/eject/theme-toggle/index.tsx +133 -173
- package/eject/toc/mobile-toc.tsx +27 -31
- package/eject/toc/toc.tsx +21 -24
- package/eject/toc/use-active-heading.ts +43 -38
- package/package.json +40 -22
- package/routes-src/404.tsx +2 -3
- package/routes-src/_chrome.tsx +7 -2
- package/routes-src/_design-token-panel-bootstrap.tsx +1 -63
- package/routes-src/docs-slug.tsx +2 -3
- package/routes-src/docs-tags-index.tsx +2 -3
- package/routes-src/docs-tags-tag.tsx +2 -3
- package/routes-src/docs-versions.tsx +2 -3
- package/routes-src/files-path.tsx +2 -4
- package/routes-src/index.tsx +2 -3
- package/routes-src/locale-docs-slug.tsx +2 -3
- package/routes-src/locale-docs-tags-index.tsx +2 -3
- package/routes-src/locale-docs-tags-tag.tsx +2 -3
- package/routes-src/locale-docs-versions.tsx +2 -3
- package/routes-src/locale-files-path.tsx +2 -4
- package/routes-src/locale-index.tsx +2 -3
- package/routes-src/mcp.tsx +25 -0
- package/routes-src/v-docs-slug.tsx +2 -3
- package/routes-src/v-locale-docs-slug.tsx +2 -3
- package/tsconfig.base.json +1 -1
- package/dist/safelist.css +0 -2
- package/dist/theme-no-reset.css +0 -379
- package/eject/desktop-sidebar-toggle-island/index.tsx +0 -110
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
/** @jsxRuntime automatic */
|
|
4
|
-
/** @jsxImportSource preact */
|
|
5
|
-
|
|
6
4
|
// Image-enlarge island — relocated from src/components/image-enlarge.tsx
|
|
7
5
|
// (host showcase) into the package as part of Package-First Wave 3 (S3,
|
|
8
|
-
// epic #2344).
|
|
9
|
-
//
|
|
10
|
-
// - IMAGE_ENLARGE_DIALOG_CLASS / ENLARGE_DIALOG_STYLE from @takazudo/zudo-doc/island-types
|
|
6
|
+
// epic #2344). The browser-only observers and delegated listeners are owned
|
|
7
|
+
// by this island's activation scope.
|
|
11
8
|
//
|
|
12
9
|
// The `/api/ai-chat` endpoint stays host-side (showcase-only).
|
|
13
10
|
// CSS blocks (.zd-enlargeable, .zd-enlarge-btn, .zd-enlarge-dialog*) are
|
|
14
11
|
// shipped in @takazudo/zudo-doc/features.css (moved from src/styles/global.css).
|
|
15
12
|
|
|
16
|
-
import {
|
|
13
|
+
import { computed, getScope, Show, signal } from "@takazudo/zfb/zudo-react";
|
|
17
14
|
import { AFTER_NAVIGATE_EVENT } from "../transitions/index.js";
|
|
18
|
-
import {
|
|
15
|
+
import { modalDialog } from "../use-modal-dialog/index.js";
|
|
19
16
|
import {
|
|
20
17
|
IMAGE_ENLARGE_DIALOG_CLASS,
|
|
21
18
|
ENLARGE_DIALOG_STYLE,
|
|
@@ -32,12 +29,24 @@ interface ImageData {
|
|
|
32
29
|
}
|
|
33
30
|
|
|
34
31
|
export function ImageEnlarge() {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
const scope = getScope();
|
|
33
|
+
const imgData = signal<ImageData | null>(null);
|
|
34
|
+
const isOpen = computed(() => imgData.value !== null);
|
|
35
|
+
const imageSrc = computed(() => {
|
|
36
|
+
const current = imgData.value;
|
|
37
|
+
return current ? current.currentSrc || current.src : "";
|
|
38
|
+
});
|
|
39
|
+
const imageSrcset = computed(() => imgData.value?.srcset ?? "");
|
|
40
|
+
const imageHasSrcset = computed(() => Boolean(imgData.value?.srcset));
|
|
41
|
+
const imageAlt = computed(() => imgData.value?.alt ?? "");
|
|
42
|
+
|
|
43
|
+
// Eligibility detection and route-aware image scanning. All browser access
|
|
44
|
+
// starts at activation so SSR and hydration begin from the same closed shell.
|
|
45
|
+
scope.onActivate(() => {
|
|
46
|
+
let active = true;
|
|
39
47
|
const observedImages = new Set<HTMLImageElement>();
|
|
40
48
|
const sharedResizeObserver = new ResizeObserver((entries) => {
|
|
49
|
+
if (!active) return;
|
|
41
50
|
for (const entry of entries) {
|
|
42
51
|
evaluateEligibility(entry.target as HTMLImageElement);
|
|
43
52
|
}
|
|
@@ -49,7 +58,7 @@ export function ImageEnlarge() {
|
|
|
49
58
|
function evaluateEligibility(img: HTMLImageElement) {
|
|
50
59
|
const container = img.closest(".zd-enlargeable");
|
|
51
60
|
if (!container) return;
|
|
52
|
-
const btn = container.querySelector(".zd-enlarge-btn")
|
|
61
|
+
const btn = container.querySelector<HTMLElement>(".zd-enlarge-btn");
|
|
53
62
|
if (!btn) return;
|
|
54
63
|
const eligible = img.naturalWidth > img.clientWidth * window.devicePixelRatio;
|
|
55
64
|
if (eligible) {
|
|
@@ -75,26 +84,30 @@ export function ImageEnlarge() {
|
|
|
75
84
|
}
|
|
76
85
|
|
|
77
86
|
function scanContent() {
|
|
78
|
-
const
|
|
79
|
-
if (!
|
|
80
|
-
|
|
87
|
+
const content = document.querySelector("main .zd-content");
|
|
88
|
+
if (!content) return;
|
|
89
|
+
content.querySelectorAll<HTMLImageElement>(".zd-enlargeable img").forEach(observeImage);
|
|
81
90
|
}
|
|
82
91
|
|
|
83
92
|
function startObserving() {
|
|
84
|
-
const
|
|
85
|
-
if (
|
|
93
|
+
const content = document.querySelector("main .zd-content");
|
|
94
|
+
if (content) {
|
|
86
95
|
mutationObserver = new MutationObserver((mutations) => {
|
|
96
|
+
if (!active) return;
|
|
87
97
|
for (const mutation of mutations) {
|
|
88
98
|
for (const node of mutation.addedNodes) {
|
|
89
99
|
if (!(node instanceof Element)) continue;
|
|
90
100
|
if (node.matches(".zd-enlargeable")) {
|
|
91
101
|
node.querySelectorAll<HTMLImageElement>("img").forEach(observeImage);
|
|
92
102
|
}
|
|
103
|
+
if (node instanceof HTMLImageElement && node.closest(".zd-enlargeable")) {
|
|
104
|
+
observeImage(node);
|
|
105
|
+
}
|
|
93
106
|
node.querySelectorAll<HTMLImageElement>(".zd-enlargeable img").forEach(observeImage);
|
|
94
107
|
}
|
|
95
108
|
}
|
|
96
109
|
});
|
|
97
|
-
mutationObserver.observe(
|
|
110
|
+
mutationObserver.observe(content, { childList: true, subtree: true });
|
|
98
111
|
}
|
|
99
112
|
scanContent();
|
|
100
113
|
}
|
|
@@ -102,11 +115,13 @@ export function ImageEnlarge() {
|
|
|
102
115
|
function handleWindowResize() {
|
|
103
116
|
clearTimeout(resizeTimer);
|
|
104
117
|
resizeTimer = window.setTimeout(() => {
|
|
118
|
+
if (!active) return;
|
|
105
119
|
observedImages.forEach((img) => evaluateEligibility(img));
|
|
106
120
|
}, 150);
|
|
107
121
|
}
|
|
108
122
|
|
|
109
|
-
function
|
|
123
|
+
function handleAfterNavigate() {
|
|
124
|
+
if (!active) return;
|
|
110
125
|
sharedResizeObserver.disconnect();
|
|
111
126
|
observedImages.clear();
|
|
112
127
|
mutationObserver?.disconnect();
|
|
@@ -118,32 +133,36 @@ export function ImageEnlarge() {
|
|
|
118
133
|
|
|
119
134
|
startObserving();
|
|
120
135
|
window.addEventListener("resize", handleWindowResize);
|
|
121
|
-
document.addEventListener(AFTER_NAVIGATE_EVENT,
|
|
136
|
+
document.addEventListener(AFTER_NAVIGATE_EVENT, handleAfterNavigate);
|
|
122
137
|
|
|
123
138
|
return () => {
|
|
139
|
+
active = false;
|
|
124
140
|
sharedResizeObserver.disconnect();
|
|
125
141
|
observedImages.clear();
|
|
126
142
|
mutationObserver?.disconnect();
|
|
127
143
|
loadAbortController.abort();
|
|
128
144
|
window.removeEventListener("resize", handleWindowResize);
|
|
129
|
-
document.removeEventListener(AFTER_NAVIGATE_EVENT,
|
|
145
|
+
document.removeEventListener(AFTER_NAVIGATE_EVENT, handleAfterNavigate);
|
|
130
146
|
clearTimeout(resizeTimer);
|
|
131
147
|
};
|
|
132
|
-
}
|
|
148
|
+
});
|
|
133
149
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
150
|
+
// Click detection is delegated because the images live in authored MDX.
|
|
151
|
+
scope.onActivate(() => {
|
|
152
|
+
let active = true;
|
|
153
|
+
function handleDocumentClick(event: Event) {
|
|
154
|
+
if (!active || !(event.target instanceof Element)) return;
|
|
155
|
+
const target = event.target;
|
|
156
|
+
const selection = window.getSelection();
|
|
157
|
+
if (selection && !selection.isCollapsed) return;
|
|
139
158
|
const container = target.closest(".zd-enlargeable");
|
|
140
159
|
if (!container) return;
|
|
141
160
|
if (!target.closest(".zd-enlarge-btn") && !target.closest("img")) return;
|
|
142
|
-
const btn = container.querySelector(".zd-enlarge-btn")
|
|
161
|
+
const btn = container.querySelector<HTMLElement>(".zd-enlarge-btn");
|
|
143
162
|
if (!btn || btn.hasAttribute("hidden")) return;
|
|
144
|
-
const img = container.querySelector("img")
|
|
163
|
+
const img = container.querySelector<HTMLImageElement>("img");
|
|
145
164
|
if (!img) return;
|
|
146
|
-
|
|
165
|
+
imgData.value = {
|
|
147
166
|
src: img.src,
|
|
148
167
|
currentSrc: img.currentSrc,
|
|
149
168
|
srcset: img.srcset || undefined,
|
|
@@ -151,16 +170,20 @@ export function ImageEnlarge() {
|
|
|
151
170
|
alt: img.alt,
|
|
152
171
|
naturalWidth: img.naturalWidth,
|
|
153
172
|
naturalHeight: img.naturalHeight,
|
|
154
|
-
}
|
|
173
|
+
};
|
|
155
174
|
}
|
|
156
175
|
document.addEventListener("click", handleDocumentClick);
|
|
157
|
-
return () =>
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
176
|
+
return () => {
|
|
177
|
+
active = false;
|
|
178
|
+
document.removeEventListener("click", handleDocumentClick);
|
|
179
|
+
};
|
|
180
|
+
});
|
|
161
181
|
|
|
162
|
-
const
|
|
163
|
-
|
|
182
|
+
const handleClose = () => {
|
|
183
|
+
imgData.value = null;
|
|
184
|
+
};
|
|
185
|
+
const { dialogRef, handleBackdropClick } = modalDialog(scope, {
|
|
186
|
+
isOpen,
|
|
164
187
|
onClose: handleClose,
|
|
165
188
|
navigateEvent: AFTER_NAVIGATE_EVENT,
|
|
166
189
|
backdropClickClose: true,
|
|
@@ -169,51 +192,43 @@ export function ImageEnlarge() {
|
|
|
169
192
|
return (
|
|
170
193
|
<dialog
|
|
171
194
|
ref={dialogRef}
|
|
172
|
-
|
|
173
|
-
|
|
195
|
+
on:click={handleBackdropClick}
|
|
196
|
+
class={IMAGE_ENLARGE_DIALOG_CLASS}
|
|
174
197
|
style={ENLARGE_DIALOG_STYLE}
|
|
175
198
|
>
|
|
176
|
-
{
|
|
199
|
+
<Show when={isOpen}>{() => (
|
|
177
200
|
<>
|
|
178
|
-
<div
|
|
179
|
-
<
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
201
|
+
<div class="relative">
|
|
202
|
+
<Show when={imageHasSrcset}>{() => (
|
|
203
|
+
<img
|
|
204
|
+
src={imageSrc}
|
|
205
|
+
srcset={imageSrcset}
|
|
206
|
+
sizes="85vw"
|
|
207
|
+
alt={imageAlt}
|
|
208
|
+
class="block max-h-[85vh] max-w-[85vw] object-contain"
|
|
209
|
+
/>
|
|
210
|
+
)}</Show>
|
|
211
|
+
<Show when={computed(() => !imageHasSrcset.value)}>{() => (
|
|
212
|
+
<img
|
|
213
|
+
src={imageSrc}
|
|
214
|
+
alt={imageAlt}
|
|
215
|
+
class="block max-h-[85vh] max-w-[85vw] object-contain"
|
|
216
|
+
/>
|
|
217
|
+
)}</Show>
|
|
186
218
|
</div>
|
|
187
219
|
<button
|
|
188
220
|
type="button"
|
|
189
|
-
|
|
190
|
-
|
|
221
|
+
on:click={() => dialogRef.current?.close()}
|
|
222
|
+
class="zd-enlarge-dialog-close"
|
|
191
223
|
aria-label="Close enlarged image"
|
|
192
224
|
>
|
|
193
|
-
<svg viewBox="0 0 161.03 161.03" fill="currentColor" aria-hidden="true"
|
|
225
|
+
<svg viewBox="0 0 161.03 161.03" fill="currentColor" aria-hidden="true">
|
|
194
226
|
<polygon points="161.03 10.27 150.76 0 80.51 70.24 10.27 0 0 10.27 70.24 80.51 0 150.76 10.27 161.03 80.51 90.78 150.76 161.03 161.03 150.76 90.78 80.51 161.03 10.27" />
|
|
195
227
|
</svg>
|
|
196
228
|
</button>
|
|
197
229
|
</>
|
|
198
|
-
)}
|
|
230
|
+
)}</Show>
|
|
199
231
|
</dialog>
|
|
200
232
|
);
|
|
201
233
|
}
|
|
202
234
|
ImageEnlarge.displayName = "ImageEnlarge";
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Static SSR fallback for the {@link ImageEnlarge} island.
|
|
206
|
-
*
|
|
207
|
-
* Renders an empty, closed `<dialog class="zd-enlarge-dialog ...">` so the
|
|
208
|
-
* dist HTML carries the dialog shell even before hydration. Sources its
|
|
209
|
-
* class and inline style from the shared constants in island-types so the
|
|
210
|
-
* SSR fallback cannot drift from the hydrated dialog above.
|
|
211
|
-
*/
|
|
212
|
-
export function ImageEnlargeSsrFallback() {
|
|
213
|
-
return (
|
|
214
|
-
<dialog
|
|
215
|
-
className={IMAGE_ENLARGE_DIALOG_CLASS}
|
|
216
|
-
style={ENLARGE_DIALOG_STYLE}
|
|
217
|
-
/>
|
|
218
|
-
);
|
|
219
|
-
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** @jsxRuntime automatic */
|
|
2
|
+
import { IMAGE_ENLARGE_DIALOG_CLASS, ENLARGE_DIALOG_STYLE } from "../island-types/index.js";
|
|
3
|
+
|
|
4
|
+
/** Closed dialog shell rendered before island activation. */
|
|
5
|
+
export function ImageEnlargeSsrFallback() {
|
|
6
|
+
return <dialog class={IMAGE_ENLARGE_DIALOG_CLASS} style={ENLARGE_DIALOG_STYLE} />;
|
|
7
|
+
}
|
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
/** @jsxRuntime automatic */
|
|
2
|
-
/** @jsxImportSource preact */
|
|
3
|
-
|
|
4
2
|
// Server-rendered, zero-hydration full-page loading overlay.
|
|
5
3
|
//
|
|
6
|
-
// Renders
|
|
4
|
+
// Renders the overlay and its bootstrap into the document:
|
|
7
5
|
//
|
|
8
6
|
// 1. A fixed-position overlay `<div>` with a centered spinner. Hidden
|
|
9
7
|
// by default (`opacity: 0; pointer-events: none;`) and made
|
|
10
8
|
// visible by adding `data-visible` to it.
|
|
11
|
-
// 2. A `<
|
|
12
|
-
// `prefers-reduced-motion` fallback. Inlined via
|
|
13
|
-
// `dangerouslySetInnerHTML` (matching the ColorSchemeProvider
|
|
14
|
-
// pattern) so no separate stylesheet has to be wired up.
|
|
15
|
-
// 3. A small `<script>` that toggles the `data-visible` attribute on
|
|
9
|
+
// 2. A small `<script>` that toggles the `data-visible` attribute on
|
|
16
10
|
// navigation lifecycle events. The event names come from the
|
|
17
11
|
// `@takazudo/zudo-doc/transitions` module — this component does
|
|
18
12
|
// not reach for the underlying browser event names directly. Under
|
|
@@ -21,9 +15,8 @@
|
|
|
21
15
|
// `zfb:after-swap` (AFTER_NAVIGATE_EVENT); see
|
|
22
16
|
// `transitions/page-events.ts` for rationale.
|
|
23
17
|
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
// shipped a tiny imperative script — this port keeps that profile.
|
|
18
|
+
// Its CSS stays in the host's global stylesheet, and the component is not
|
|
19
|
+
// hydrated: the static script owns its navigation listeners.
|
|
27
20
|
|
|
28
21
|
import {
|
|
29
22
|
AFTER_NAVIGATE_EVENT,
|
|
@@ -52,7 +45,9 @@ export function buildPageLoadingOverlayBootstrap(overlayId: string): string {
|
|
|
52
45
|
// (see ColorSchemeProvider). Event names come from the transitions
|
|
53
46
|
// module's exported constants — no raw `astro:*` strings live in
|
|
54
47
|
// this file.
|
|
55
|
-
|
|
48
|
+
// JSON quoting protects JavaScript syntax, and escaping `<` additionally
|
|
49
|
+
// prevents a caller-controlled id from terminating the HTML script element.
|
|
50
|
+
const id = JSON.stringify(overlayId).replaceAll("<", "\\u003c");
|
|
56
51
|
const before = JSON.stringify(BEFORE_NAVIGATE_EVENT);
|
|
57
52
|
const after = JSON.stringify(AFTER_NAVIGATE_EVENT);
|
|
58
53
|
return `(function(){
|
|
@@ -94,9 +89,7 @@ export default function PageLoadingOverlay({
|
|
|
94
89
|
<span class="page-loading-spinner" />
|
|
95
90
|
</div>
|
|
96
91
|
<script
|
|
97
|
-
|
|
98
|
-
__html: buildPageLoadingOverlayBootstrap(id),
|
|
99
|
-
}}
|
|
92
|
+
rawHtml={buildPageLoadingOverlayBootstrap(id)}
|
|
100
93
|
/>
|
|
101
94
|
</>
|
|
102
95
|
);
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { normalizeIslandData } from "../chrome/island-data.js";
|
|
2
|
+
import type { SidebarNavNode, SidebarNavigationContext } from "./types.js";
|
|
3
|
+
|
|
4
|
+
/** Navigation data needed by the native sidebar islands, without server prose. */
|
|
5
|
+
export type SidebarClientNode = Omit<SidebarNavNode, "description" | "children"> & {
|
|
6
|
+
children: SidebarClientNode[];
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export type SidebarClientNavigation = Omit<SidebarNavigationContext, "roots"> & {
|
|
10
|
+
roots: SidebarClientNode[];
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// Exhaustive policy: new server fields require an explicit transport decision.
|
|
14
|
+
const nodeFields = {
|
|
15
|
+
occurrenceId: true,
|
|
16
|
+
slug: true,
|
|
17
|
+
label: true,
|
|
18
|
+
description: false,
|
|
19
|
+
position: true,
|
|
20
|
+
href: true,
|
|
21
|
+
hasPage: true,
|
|
22
|
+
children: true,
|
|
23
|
+
sortOrder: true,
|
|
24
|
+
collapsed: true,
|
|
25
|
+
shape: true,
|
|
26
|
+
noteTrayDated: true,
|
|
27
|
+
noteTraySidebar: true,
|
|
28
|
+
date: true,
|
|
29
|
+
updated: true,
|
|
30
|
+
rank: true,
|
|
31
|
+
} as const satisfies Record<keyof SidebarNavNode, boolean>;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Copy navigation for SSR and hydration at an island boundary. Server builders
|
|
35
|
+
* retain descriptions; custom island hosts can opt into this same projection.
|
|
36
|
+
* Validate before selecting fields so discarded data cannot conceal invalid
|
|
37
|
+
* transport values. Preserve the opaque scope ID and editorial topology.
|
|
38
|
+
*/
|
|
39
|
+
export function toSidebarClientData(
|
|
40
|
+
nodes: SidebarNavNode[],
|
|
41
|
+
navigation?: SidebarNavigationContext,
|
|
42
|
+
): { nodes: SidebarClientNode[]; navigation?: SidebarClientNavigation } {
|
|
43
|
+
const source = normalizeIslandData({ nodes, navigation });
|
|
44
|
+
function project(node: SidebarNavNode): SidebarClientNode {
|
|
45
|
+
const result: Record<string, unknown> = {};
|
|
46
|
+
for (const key of Object.keys(nodeFields) as Array<keyof SidebarNavNode>) {
|
|
47
|
+
if (nodeFields[key] && key !== "children" && node[key] !== undefined) {
|
|
48
|
+
result[key] = node[key];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
result.children = node.children.map(project);
|
|
52
|
+
return result as SidebarClientNode;
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
nodes: source.nodes.map(project),
|
|
56
|
+
...(source.navigation ? {
|
|
57
|
+
navigation: {
|
|
58
|
+
id: source.navigation.id,
|
|
59
|
+
roots: source.navigation.roots.map(project),
|
|
60
|
+
parents: source.navigation.parents,
|
|
61
|
+
...(source.navigation.initialExpansion !== undefined
|
|
62
|
+
? { initialExpansion: source.navigation.initialExpansion } : {}),
|
|
63
|
+
...(source.navigation.localParentId !== undefined
|
|
64
|
+
? { localParentId: source.navigation.localParentId } : {}),
|
|
65
|
+
},
|
|
66
|
+
} : {}),
|
|
67
|
+
};
|
|
68
|
+
}
|
package/eject/sidebar/index.ts
CHANGED
|
@@ -18,10 +18,13 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
export { Sidebar } from "./sidebar.js";
|
|
21
|
+
export { toSidebarClientData } from "./client-data.js";
|
|
22
|
+
export type { SidebarClientNode, SidebarClientNavigation } from "./client-data.js";
|
|
21
23
|
export type { SidebarProps } from "./sidebar.js";
|
|
22
24
|
export type {
|
|
23
25
|
SidebarLocaleLink,
|
|
24
26
|
SidebarNavNode,
|
|
27
|
+
SidebarNavigationContext,
|
|
25
28
|
SidebarRootMenuItem,
|
|
26
29
|
SidebarTreeIslandProps,
|
|
27
30
|
} from "./types.js";
|
|
@@ -1,108 +1,30 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
1
|
/** @jsxRuntime automatic */
|
|
4
|
-
/** @jsxImportSource preact */
|
|
5
|
-
|
|
6
|
-
// JSX port of src/components/sidebar.
|
|
7
|
-
//
|
|
8
|
-
// The original Astro template was almost entirely data assembly —
|
|
9
|
-
// build root-menu items from `settings.headerNav`, load the locale's
|
|
10
|
-
// docs collection, build the nav tree for the active section, optionally
|
|
11
|
-
// remap hrefs for versioned routes, and finally render the project's
|
|
12
|
-
// `<SidebarTree client:load .../>` Preact island.
|
|
13
|
-
//
|
|
14
|
-
// All of that data-prep depends on host-only helpers (`@/config/i18n`,
|
|
15
|
-
// `@/utils/sidebar`, `@/utils/locale-docs`, `@/utils/base`,
|
|
16
|
-
// `@/config/settings`) that v2 must not import. This shell therefore
|
|
17
|
-
// keeps the data-prep on the host side and only provides:
|
|
18
|
-
//
|
|
19
|
-
// - typed props that match the SidebarTree island's prop shape, so
|
|
20
|
-
// the host's prep code can be typed against v2's interface;
|
|
21
|
-
// - a `treeComponent` prop the host supplies (their existing Preact
|
|
22
|
-
// island) — the shell instantiates it with the typed props and
|
|
23
|
-
// forwards everything;
|
|
24
|
-
// - a `children` fallback for callers that want to render the tree
|
|
25
|
-
// themselves (useful for tests, fixtures, and downstream projects
|
|
26
|
-
// that swap the tree out wholesale).
|
|
27
|
-
//
|
|
28
|
-
// Wave 13 ("smoke-toc duplicate-nav regression follow-on", zudolab/zudo-doc#1355):
|
|
29
|
-
// before this refactor, this module exported a `Sidebar` wrapper that
|
|
30
|
-
// itself called `Island({when:"load", children:<SidebarInner/>})` and
|
|
31
|
-
// returned the wrapped div. The zfb island scanner picked the exported
|
|
32
|
-
// `Sidebar` (the wrapper) as the bundle's hydration target, so on the
|
|
33
|
-
// client `mountIslands` ran `hydrate(<Sidebar/>, dataIslandDiv)` where
|
|
34
|
-
// the rendered vnode itself emitted *another* `<div data-zfb-island=
|
|
35
|
-
// "Sidebar"><SidebarInner/></div>` inside the existing one. Unlike the
|
|
36
|
-
// `Toc` / `MobileToc` case (where the inner re-rendered identical
|
|
37
|
-
// content alongside the SSR'd content, producing a visible duplicate),
|
|
38
|
-
// the duplicate here was silent: the host passes `treeComponent` (a
|
|
39
|
-
// Preact component function) as a prop, and `island.ts`'s
|
|
40
|
-
// `captureSerializableProps` does `JSON.stringify` on the props bag,
|
|
41
|
-
// which silently drops function values. At hydrate time the
|
|
42
|
-
// deserialized props had no `treeComponent`, `SidebarInner` returned
|
|
43
|
-
// `null`, and the appended wrapper-div was empty. Net result: an extra
|
|
44
|
-
// dead-mount data-zfb-island Sidebar div alongside the SSR'd tree, with
|
|
45
|
-
// no observable content — but a wasted hydration slot, and the actual
|
|
46
|
-
// user-facing event-handler / state work was being done entirely by
|
|
47
|
-
// the host's `SidebarTree` island registration.
|
|
48
|
-
//
|
|
49
|
-
// Fix: same shape as Toc / MobileToc — drop the `Island`-wrapping
|
|
50
|
-
// outer, export the bare component (was `SidebarInner`) as `Sidebar`,
|
|
51
|
-
// pin `displayName` explicitly. The `<Island when="load">` wrapper is
|
|
52
|
-
// applied at the call site (`<DocLayoutWithDefaults>`).
|
|
53
2
|
|
|
54
|
-
import type {
|
|
3
|
+
import type { Child, Component } from "@takazudo/zfb/zudo-react";
|
|
55
4
|
|
|
56
5
|
import type { SidebarTreeIslandProps } from "./types.js";
|
|
57
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Props for the server-rendered Sidebar shell. Data preparation stays with the
|
|
9
|
+
* caller, which may supply a tree component or already-rendered children.
|
|
10
|
+
*/
|
|
58
11
|
export interface SidebarProps extends SidebarTreeIslandProps {
|
|
59
|
-
/**
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
* prop forwarding contract.
|
|
64
|
-
*/
|
|
65
|
-
treeComponent?: FunctionComponent<SidebarTreeIslandProps>;
|
|
66
|
-
/**
|
|
67
|
-
* Pre-rendered tree content — falls back to this when
|
|
68
|
-
* `treeComponent` is omitted. Useful for tests and for layouts that
|
|
69
|
-
* compose the tree separately (e.g. inside a host wrapper
|
|
70
|
-
* that needs `client:load` on the actual island element).
|
|
71
|
-
*/
|
|
72
|
-
children?: ComponentChildren;
|
|
12
|
+
/** Component used to render the prepared tree. */
|
|
13
|
+
treeComponent?: Component<SidebarTreeIslandProps>;
|
|
14
|
+
/** Pre-rendered tree content for callers that compose the tree separately. */
|
|
15
|
+
children?: Child;
|
|
73
16
|
}
|
|
74
17
|
|
|
75
18
|
/**
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* Two usage shapes (matching the breadcrumb shell's pattern):
|
|
79
|
-
*
|
|
80
|
-
* 1. Pass `treeComponent` plus the data props (`nodes`,
|
|
81
|
-
* `rootMenuItems`, `localeLinks`, …). The shell forwards them all
|
|
82
|
-
* to the supplied component.
|
|
83
|
-
*
|
|
84
|
-
* 2. Pass `children` (e.g. a pre-instantiated `<SidebarTree
|
|
85
|
-
* client:load … />` from an Astro wrapper). The shell renders
|
|
86
|
-
* them as-is — the typed island props are then unused but kept on
|
|
87
|
-
* the type signature so call-sites stay self-documenting.
|
|
88
|
-
*
|
|
89
|
-
* **The caller is responsible for wrapping this in `<Island when="load">`**
|
|
90
|
-
* so the SSG output emits the `data-zfb-island="Sidebar"` hydration
|
|
91
|
-
* marker around the rendered tree. `<DocLayoutWithDefaults>` does this
|
|
92
|
-
* for you; consumers who render `<Sidebar>` outside the default layout
|
|
93
|
-
* (e.g. via the `sidebarOverride` prop or in a custom layout) must
|
|
94
|
-
* apply the wrapper themselves — otherwise no hydration marker is
|
|
95
|
-
* emitted, and the runtime walks past the SSR'd tree without claiming
|
|
96
|
-
* it as an island. Either way the actual user-facing interactivity
|
|
97
|
-
* comes from the `treeComponent`'s own island registration; the
|
|
98
|
-
* `<Island>` wrapper here exists so the shell can host data-only
|
|
99
|
-
* variants in the future without losing the marker contract.
|
|
19
|
+
* Server-rendered shell around prepared navigation content. An empty node list
|
|
20
|
+
* has no sidebar output and returns null without creating an island boundary.
|
|
100
21
|
*/
|
|
101
|
-
export function Sidebar(props: SidebarProps):
|
|
22
|
+
export function Sidebar(props: SidebarProps): Child {
|
|
102
23
|
const {
|
|
103
24
|
treeComponent: TreeComponent,
|
|
104
25
|
children,
|
|
105
26
|
nodes,
|
|
27
|
+
navigation,
|
|
106
28
|
currentSlug,
|
|
107
29
|
rootMenuItems,
|
|
108
30
|
backToMenuLabel,
|
|
@@ -110,10 +32,13 @@ export function Sidebar(props: SidebarProps): VNode | null {
|
|
|
110
32
|
themeDefaultMode,
|
|
111
33
|
} = props;
|
|
112
34
|
|
|
35
|
+
if (nodes.length === 0) return null;
|
|
36
|
+
|
|
113
37
|
if (TreeComponent) {
|
|
114
38
|
return (
|
|
115
39
|
<TreeComponent
|
|
116
40
|
nodes={nodes}
|
|
41
|
+
navigation={navigation}
|
|
117
42
|
currentSlug={currentSlug}
|
|
118
43
|
rootMenuItems={rootMenuItems}
|
|
119
44
|
backToMenuLabel={backToMenuLabel}
|
|
@@ -129,9 +54,3 @@ export function Sidebar(props: SidebarProps): VNode | null {
|
|
|
129
54
|
|
|
130
55
|
return null;
|
|
131
56
|
}
|
|
132
|
-
// Pin the marker name to "Sidebar" regardless of how Preact's compat
|
|
133
|
-
// layer or esbuild minification renames the function. Island's SSR
|
|
134
|
-
// pass reads `displayName ?? name` to derive the marker string;
|
|
135
|
-
// pinning both means the SSG marker stays `data-zfb-island="Sidebar"`
|
|
136
|
-
// independent of the bundle's symbol-renaming.
|
|
137
|
-
Sidebar.displayName = "Sidebar";
|
package/eject/sidebar/types.ts
CHANGED
|
@@ -26,6 +26,8 @@
|
|
|
26
26
|
* Matches `NavNode` in the host project's `src/utils/docs.ts`.
|
|
27
27
|
*/
|
|
28
28
|
export interface SidebarNavNode {
|
|
29
|
+
/** Stable identity of this editorial occurrence, independent of the page slug. */
|
|
30
|
+
occurrenceId?: string;
|
|
29
31
|
slug: string;
|
|
30
32
|
label: string;
|
|
31
33
|
description?: string;
|
|
@@ -71,9 +73,22 @@ export interface SidebarLocaleLink {
|
|
|
71
73
|
*/
|
|
72
74
|
export interface SidebarTreeIslandProps {
|
|
73
75
|
nodes: SidebarNavNode[];
|
|
76
|
+
navigation?: SidebarNavigationContext;
|
|
74
77
|
currentSlug?: string;
|
|
75
78
|
rootMenuItems?: SidebarRootMenuItem[];
|
|
76
79
|
backToMenuLabel?: string;
|
|
77
80
|
localeLinks?: SidebarLocaleLink[];
|
|
78
81
|
themeDefaultMode?: "light" | "dark";
|
|
79
82
|
}
|
|
83
|
+
|
|
84
|
+
/** Complete editorial topology, captured before local scoping or filtering. */
|
|
85
|
+
export interface SidebarNavigationContext {
|
|
86
|
+
/** Locale/version/document-context identity including the topology revision. */
|
|
87
|
+
id: string;
|
|
88
|
+
roots: SidebarNavNode[];
|
|
89
|
+
/** Explicit page/index author defaults; resolved against the current destination. */
|
|
90
|
+
initialExpansion?: Record<string, "collapsed" | "expanded">;
|
|
91
|
+
parents: Record<string, string | null>;
|
|
92
|
+
/** Explicit enclosing occurrence for a local forest spanning emitted children. */
|
|
93
|
+
localParentId?: string;
|
|
94
|
+
}
|