@takazudo/zudo-doc 5.28.2 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -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/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 +28 -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 +2933 -2943
- 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 +70 -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 +1 -2
- package/dist/header-with-defaults/index.js +18 -8
- 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/index.d.ts +1 -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-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/index.ts +1 -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
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type ReadonlySignal, type Ref } from "@takazudo/zfb/zudo-react";
|
|
2
|
+
import type { SidebarNavNode, SidebarNavigationContext } from "../sidebar/types.js";
|
|
3
|
+
export interface ScopeControls {
|
|
4
|
+
focus: (node: SidebarNavNode) => void;
|
|
5
|
+
focusLabel: string;
|
|
6
|
+
expansion: {
|
|
7
|
+
value: Record<string, boolean>;
|
|
8
|
+
};
|
|
9
|
+
reveal: ReadonlySignal<number>;
|
|
10
|
+
save: () => void;
|
|
11
|
+
defaultOpen: (node: SidebarNavNode) => boolean;
|
|
12
|
+
defaultGroupOpen: (items: SidebarNavNode[]) => boolean;
|
|
13
|
+
}
|
|
14
|
+
/** One controller shared by the real desktop tree and mobile drawer. SSR always
|
|
15
|
+
* starts with configured roots; session state is applied only on activation. */
|
|
16
|
+
export declare function useSidebarScope({ nodes, navigation, activeSlug, query, locale }: {
|
|
17
|
+
nodes: SidebarNavNode[];
|
|
18
|
+
navigation?: SidebarNavigationContext;
|
|
19
|
+
activeSlug: ReadonlySignal<string | undefined>;
|
|
20
|
+
query: {
|
|
21
|
+
value: string;
|
|
22
|
+
};
|
|
23
|
+
locale: string;
|
|
24
|
+
}): {
|
|
25
|
+
selected: import("@takazudo/zfb/zudo-react").Signal<string | null>;
|
|
26
|
+
selectedNodes: ReadonlySignal<SidebarNavNode[]>;
|
|
27
|
+
broader: ReadonlySignal<string | null>;
|
|
28
|
+
labels: {
|
|
29
|
+
broaden: string;
|
|
30
|
+
restore: string;
|
|
31
|
+
focus: string;
|
|
32
|
+
};
|
|
33
|
+
canRestore: ReadonlySignal<boolean>;
|
|
34
|
+
changeScope: (id: string | null) => void;
|
|
35
|
+
save: () => void;
|
|
36
|
+
navRef: Ref<HTMLElement>;
|
|
37
|
+
scopeControls: ScopeControls | undefined;
|
|
38
|
+
};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { computed, getScope, signal } from "@takazudo/zfb/zudo-react";
|
|
2
|
+
import { broaderSidebarScope, sidebarScopeNodes, reconcileSidebarScope, indexSidebarOccurrences, sidebarInitialExpansion, sidebarBaselineOpen, SIDEBAR_FOREST_SCOPE } from "../sidebar-utils/index.js";
|
|
3
|
+
import { getNoteTrayItems, groupItems } from "../note-tray-model/index.js";
|
|
4
|
+
import { AFTER_NAVIGATE_EVENT } from "../transitions/index.js";
|
|
5
|
+
function useSidebarScope({ nodes, navigation, activeSlug, query, locale }) {
|
|
6
|
+
const selected = signal(null);
|
|
7
|
+
const expansion = signal({});
|
|
8
|
+
const reveal = signal(0);
|
|
9
|
+
let lastPage = activeSlug.value;
|
|
10
|
+
const navRef = { current: null };
|
|
11
|
+
const stateKey = "zd-sidebar-scope";
|
|
12
|
+
const syncEvent = "zd:sidebar-scope";
|
|
13
|
+
const labels = locale === "ja" ? {
|
|
14
|
+
broaden: "\u30C4\u30EA\u30FC\u3092\u5E83\u3052\u308B",
|
|
15
|
+
restore: "\u73FE\u5728\u306E\u30DA\u30FC\u30B8\u306E\u30C4\u30EA\u30FC\u306B\u623B\u3059",
|
|
16
|
+
focus: "\u3053\u306E\u679D\u3060\u3051\u3092\u8868\u793A"
|
|
17
|
+
} : {
|
|
18
|
+
broaden: "Broaden tree",
|
|
19
|
+
restore: "Restore current page\u2019s local tree",
|
|
20
|
+
focus: "Show only this branch"
|
|
21
|
+
};
|
|
22
|
+
const selectedNodes = computed(() => navigation ? sidebarScopeNodes(navigation, nodes, selected.value) : nodes);
|
|
23
|
+
const broader = computed(() => navigation ? broaderSidebarScope(navigation, nodes, selected.value) : null);
|
|
24
|
+
const occurrenceIndex = navigation ? indexSidebarOccurrences(navigation.roots) : /* @__PURE__ */ new Map();
|
|
25
|
+
const trayGroups = [...occurrenceIndex].flatMap(([id, node]) => {
|
|
26
|
+
const grouping = node.noteTraySidebar;
|
|
27
|
+
if (node.shape !== "note-tray" || !grouping || grouping === "index") return [];
|
|
28
|
+
return groupItems(getNoteTrayItems(node), grouping, node.sortOrder ?? "asc").map((group) => ({ key: `${id}#${group.key}`, items: group.items }));
|
|
29
|
+
});
|
|
30
|
+
const groupKeys = new Set(trayGroups.map((group) => group.key));
|
|
31
|
+
const defaultOpen = (node) => sidebarBaselineOpen(node, navigation ? sidebarInitialExpansion(navigation, activeSlug.value) : void 0, activeSlug.value);
|
|
32
|
+
const defaultGroupOpen = (items) => items.some((item) => item.slug === activeSlug.value) || !!navigation && sidebarInitialExpansion(navigation, activeSlug.value) === "expanded";
|
|
33
|
+
const canRestore = computed(() => {
|
|
34
|
+
if (JSON.stringify(selectedNodes.value) !== JSON.stringify(nodes)) return true;
|
|
35
|
+
for (const [id, node] of occurrenceIndex) {
|
|
36
|
+
if (node.children.length && (expansion.value[id] ?? defaultOpen(node)) !== defaultOpen(node)) return true;
|
|
37
|
+
}
|
|
38
|
+
return trayGroups.some((group) => (expansion.value[group.key] ?? defaultGroupOpen(group.items)) !== defaultGroupOpen(group.items));
|
|
39
|
+
});
|
|
40
|
+
const revealPath = (id) => {
|
|
41
|
+
if (!navigation) return;
|
|
42
|
+
const next = { ...expansion.value };
|
|
43
|
+
for (const [key, node] of occurrenceIndex) {
|
|
44
|
+
if (node.slug !== activeSlug.value && key !== id) continue;
|
|
45
|
+
let ancestor = key;
|
|
46
|
+
while (ancestor) {
|
|
47
|
+
next[ancestor] = true;
|
|
48
|
+
ancestor = navigation.parents[ancestor];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
for (const group of trayGroups) {
|
|
52
|
+
if (group.items.some((item) => item.slug === activeSlug.value)) next[group.key] = true;
|
|
53
|
+
}
|
|
54
|
+
expansion.value = next;
|
|
55
|
+
reveal.value++;
|
|
56
|
+
};
|
|
57
|
+
const save = () => {
|
|
58
|
+
if (!navigation) return;
|
|
59
|
+
try {
|
|
60
|
+
sessionStorage.setItem(stateKey, JSON.stringify({ context: navigation.id, page: activeSlug.value, selected: selected.value, query: query.value, expansion: expansion.value }));
|
|
61
|
+
} catch {
|
|
62
|
+
}
|
|
63
|
+
document.dispatchEvent(new CustomEvent(syncEvent, { detail: { context: navigation.id, page: activeSlug.value, selected: selected.value, query: query.value, expansion: expansion.value } }));
|
|
64
|
+
};
|
|
65
|
+
const changeScope = (id) => {
|
|
66
|
+
const previous = selected.value;
|
|
67
|
+
selected.value = navigation && JSON.stringify(sidebarScopeNodes(navigation, nodes, id)) === JSON.stringify(nodes) ? null : id;
|
|
68
|
+
if (id === null) {
|
|
69
|
+
expansion.value = {};
|
|
70
|
+
revealPath();
|
|
71
|
+
} else {
|
|
72
|
+
revealPath(previous);
|
|
73
|
+
revealPath(id);
|
|
74
|
+
}
|
|
75
|
+
save();
|
|
76
|
+
queueMicrotask(() => {
|
|
77
|
+
const nav = navRef.current;
|
|
78
|
+
const controls = [...nav?.querySelectorAll("[data-sidebar-focus]") ?? []];
|
|
79
|
+
const activeBranch = controls.reverse().find((button) => {
|
|
80
|
+
const node = occurrenceIndex.get(button.dataset.sidebarFocusScope ?? "");
|
|
81
|
+
const contains = (n) => n.slug === activeSlug.value || n.children.some(contains);
|
|
82
|
+
return node && contains(node);
|
|
83
|
+
});
|
|
84
|
+
const rootLink = id && id !== SIDEBAR_FOREST_SCOPE && broader.value !== null ? nav?.querySelector("[data-sidebar-tree-root] a") : null;
|
|
85
|
+
const currentLink = nav?.querySelector('[aria-current="page"]');
|
|
86
|
+
const control = (id === null ? currentLink : rootLink) ?? nav?.querySelector("[data-sidebar-broaden]") ?? activeBranch ?? currentLink ?? nav?.querySelector("[data-sidebar-focus], [data-sidebar-tree-root] a, input");
|
|
87
|
+
const target = control;
|
|
88
|
+
let viewport = nav?.parentElement;
|
|
89
|
+
while (viewport && viewport !== document.body && viewport.scrollHeight <= viewport.clientHeight) viewport = viewport.parentElement;
|
|
90
|
+
if (target && viewport && viewport !== document.body) {
|
|
91
|
+
const row = target.getBoundingClientRect();
|
|
92
|
+
const bounds = viewport.getBoundingClientRect();
|
|
93
|
+
if (row.top < bounds.top) viewport.scrollTop += row.top - bounds.top - 8;
|
|
94
|
+
else if (row.bottom > bounds.bottom) viewport.scrollTop += row.bottom - bounds.bottom + 8;
|
|
95
|
+
}
|
|
96
|
+
control?.focus({ preventScroll: true });
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
const scopeControls = navigation ? {
|
|
100
|
+
focus: (node) => {
|
|
101
|
+
if (node.occurrenceId) changeScope(node.occurrenceId);
|
|
102
|
+
},
|
|
103
|
+
focusLabel: labels.focus,
|
|
104
|
+
expansion,
|
|
105
|
+
reveal,
|
|
106
|
+
defaultOpen,
|
|
107
|
+
defaultGroupOpen,
|
|
108
|
+
save
|
|
109
|
+
} : void 0;
|
|
110
|
+
getScope().onActivate(() => {
|
|
111
|
+
if (!navigation) return;
|
|
112
|
+
lastPage = activeSlug.value;
|
|
113
|
+
try {
|
|
114
|
+
const stored = JSON.parse(sessionStorage.getItem(stateKey) ?? "null");
|
|
115
|
+
if (stored?.context === navigation.id) {
|
|
116
|
+
const candidate = typeof stored.selected === "string" ? stored.selected : null;
|
|
117
|
+
const valid = candidate === SIDEBAR_FOREST_SCOPE || candidate !== null && occurrenceIndex.has(candidate) ? candidate : null;
|
|
118
|
+
selected.value = stored.page === activeSlug.value ? valid : reconcileSidebarScope(navigation, nodes, valid, activeSlug.value);
|
|
119
|
+
query.value = typeof stored.query === "string" ? stored.query : "";
|
|
120
|
+
if (stored.expansion && typeof stored.expansion === "object") expansion.value = Object.fromEntries(Object.entries(stored.expansion).filter(([id, value]) => (occurrenceIndex.has(id) || groupKeys.has(id)) && typeof value === "boolean"));
|
|
121
|
+
if (stored.page !== activeSlug.value) revealPath(selected.value);
|
|
122
|
+
}
|
|
123
|
+
} catch {
|
|
124
|
+
}
|
|
125
|
+
save();
|
|
126
|
+
const sync = (event) => {
|
|
127
|
+
const state = event.detail;
|
|
128
|
+
if (state?.context !== navigation.id || state.page !== activeSlug.value) return;
|
|
129
|
+
selected.value = state.selected;
|
|
130
|
+
query.value = state.query;
|
|
131
|
+
expansion.value = state.expansion;
|
|
132
|
+
};
|
|
133
|
+
const navigate = () => {
|
|
134
|
+
if (lastPage === activeSlug.value) return;
|
|
135
|
+
lastPage = activeSlug.value;
|
|
136
|
+
selected.value = reconcileSidebarScope(navigation, nodes, selected.value, activeSlug.value);
|
|
137
|
+
revealPath(selected.value);
|
|
138
|
+
save();
|
|
139
|
+
};
|
|
140
|
+
document.addEventListener(syncEvent, sync);
|
|
141
|
+
document.addEventListener(AFTER_NAVIGATE_EVENT, navigate);
|
|
142
|
+
return () => {
|
|
143
|
+
document.removeEventListener(syncEvent, sync);
|
|
144
|
+
document.removeEventListener(AFTER_NAVIGATE_EVENT, navigate);
|
|
145
|
+
};
|
|
146
|
+
});
|
|
147
|
+
return { selected, selectedNodes, broader, labels, canRestore, changeScope, save, navRef, scopeControls };
|
|
148
|
+
}
|
|
149
|
+
export {
|
|
150
|
+
useSidebarScope
|
|
151
|
+
};
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
AFTER_NAVIGATE_EVENT,
|
|
3
|
+
BEFORE_NAVIGATE_EVENT
|
|
4
|
+
} from "../transitions/index.js";
|
|
2
5
|
const installedControllers = /* @__PURE__ */ new WeakMap();
|
|
3
6
|
function installSidebarScrollPreserve({
|
|
4
7
|
document: document2,
|
|
@@ -45,7 +48,8 @@ function ensureSidebarScrollPreserve(options) {
|
|
|
45
48
|
);
|
|
46
49
|
}
|
|
47
50
|
function resolveBrowserOptions() {
|
|
48
|
-
if (typeof document === "undefined" || typeof window === "undefined")
|
|
51
|
+
if (typeof document === "undefined" || typeof window === "undefined")
|
|
52
|
+
return void 0;
|
|
49
53
|
return {
|
|
50
54
|
document,
|
|
51
55
|
requestAnimationFrame: window.requestAnimationFrame.bind(window),
|
|
@@ -25,28 +25,20 @@ export interface SidebarAutogenerated {
|
|
|
25
25
|
* A sidebar item — string shorthand is equivalent to `{ type: "doc", id: slug }`.
|
|
26
26
|
*/
|
|
27
27
|
export type SidebarItem = SidebarDoc | SidebarLink | SidebarCategory | SidebarAutogenerated | string;
|
|
28
|
+
/** An explicit editorial tree with an optional local view of a category's children. */
|
|
29
|
+
export interface SidebarDefinition {
|
|
30
|
+
items: SidebarItem[];
|
|
31
|
+
/** Resolved occurrence indexes from the forest to a category (not URL segments). */
|
|
32
|
+
initialPath?: number[];
|
|
33
|
+
/** Share across sections using the same editorial tree. Locale/version are added by chrome. */
|
|
34
|
+
contextId?: string;
|
|
35
|
+
}
|
|
28
36
|
/** Sidebar config keyed by section (categoryMatch value). */
|
|
29
37
|
export type SidebarsConfig = {
|
|
30
|
-
[sectionKey: string]: SidebarItem[] | undefined;
|
|
38
|
+
[sectionKey: string]: SidebarItem[] | SidebarDefinition | undefined;
|
|
31
39
|
};
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
slug: string;
|
|
35
|
-
label: string;
|
|
36
|
-
description?: string;
|
|
37
|
-
position: number;
|
|
38
|
-
href?: string;
|
|
39
|
-
hasPage: boolean;
|
|
40
|
-
children: SidebarNavNode[];
|
|
41
|
-
sortOrder?: "asc" | "desc";
|
|
42
|
-
collapsed?: boolean;
|
|
43
|
-
shape?: "note-tray";
|
|
44
|
-
noteTrayDated?: boolean;
|
|
45
|
-
noteTraySidebar?: "index" | "year" | "month";
|
|
46
|
-
date?: string;
|
|
47
|
-
updated?: string;
|
|
48
|
-
rank?: number;
|
|
49
|
-
}
|
|
40
|
+
export type { SidebarNavNode, SidebarNavigationContext } from "../sidebar/types.js";
|
|
41
|
+
import type { SidebarNavNode, SidebarNavigationContext } from "../sidebar/types.js";
|
|
50
42
|
/** Category metadata shape (mirrors host's CategoryMeta). */
|
|
51
43
|
export interface SidebarCategoryMeta {
|
|
52
44
|
label?: string;
|
|
@@ -68,3 +60,9 @@ export interface SidebarCategoryMeta {
|
|
|
68
60
|
* values from headerNav, used for the `"!"` fallback category filter.
|
|
69
61
|
*/
|
|
70
62
|
export declare function buildSidebarForSection(docs: unknown[], lang: string, categoryMatch: string | undefined, categoryMeta: Map<string, SidebarCategoryMeta> | undefined, sidebars: SidebarsConfig, buildNavTree: (docs: unknown[], lang: string, categoryMeta?: Map<string, SidebarCategoryMeta>) => SidebarNavNode[], explicitCategoryPrefixes: string[]): SidebarNavNode[];
|
|
63
|
+
/** Builder-owned provenance keeps omitted autogenerated roots and duplicate links distinct. */
|
|
64
|
+
export declare function buildSidebarNavigation(...args: Parameters<typeof buildSidebarForSection>): {
|
|
65
|
+
nodes: SidebarNavNode[];
|
|
66
|
+
navigation: SidebarNavigationContext;
|
|
67
|
+
};
|
|
68
|
+
export { sidebarInitialExpansion, sidebarBaselineOpen, SIDEBAR_FOREST_SCOPE, indexSidebarOccurrences, sidebarScopeNodes, broaderSidebarScope, reconcileSidebarScope } from "./scope.js";
|
|
@@ -78,11 +78,108 @@ function buildSidebarForSection(docs, lang, categoryMatch, categoryMeta, sidebar
|
|
|
78
78
|
const tree = buildNavTree(docs, lang, categoryMeta);
|
|
79
79
|
const sectionKey = categoryMatch ?? "default";
|
|
80
80
|
const config = sidebars[sectionKey];
|
|
81
|
-
if (!config || config.length === 0) {
|
|
81
|
+
if (!config || (Array.isArray(config) ? config.length === 0 : config.items.length === 0)) {
|
|
82
82
|
return filterByCategory(tree, categoryMatch, explicitCategoryPrefixes);
|
|
83
83
|
}
|
|
84
|
-
return resolveItems(config, tree, lang);
|
|
84
|
+
if (Array.isArray(config)) return resolveItems(config, tree, lang);
|
|
85
|
+
let nodes = resolveItems(config.items, tree, lang);
|
|
86
|
+
for (const index of config.initialPath ?? []) {
|
|
87
|
+
if (!Number.isInteger(index) || index < 0 || !nodes[index]) throw new Error(`Invalid sidebar initialPath for ${sectionKey}`);
|
|
88
|
+
nodes = nodes[index].children;
|
|
89
|
+
}
|
|
90
|
+
return nodes;
|
|
91
|
+
}
|
|
92
|
+
function buildSidebarNavigation(...args) {
|
|
93
|
+
const [docs, lang, categoryMatch, meta, sidebars, buildTree, prefixes] = args;
|
|
94
|
+
const initialExpansion = {};
|
|
95
|
+
for (const entry of docs) {
|
|
96
|
+
const doc = entry;
|
|
97
|
+
const value = doc.data?.sidebar_initial_expansion;
|
|
98
|
+
if (typeof doc.slug === "string" && (value === "collapsed" || value === "expanded")) {
|
|
99
|
+
const slug = doc.data?.slug ?? (doc.slug === "index" ? "" : doc.slug.replace(/\/index$/, ""));
|
|
100
|
+
initialExpansion[slug] = value;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const tree = buildTree(docs, lang, meta);
|
|
104
|
+
const config = sidebars[categoryMatch ?? "default"];
|
|
105
|
+
const definition = config && !Array.isArray(config) ? config : void 0;
|
|
106
|
+
const items = Array.isArray(config) ? config : definition?.items;
|
|
107
|
+
const parents = {};
|
|
108
|
+
function identify(nodes2, prefix, parent) {
|
|
109
|
+
return nodes2.map((node, index) => {
|
|
110
|
+
const occurrenceId = `${prefix}/${index}`;
|
|
111
|
+
parents[occurrenceId] = parent;
|
|
112
|
+
return { ...node, occurrenceId, children: identify(node.children, occurrenceId, occurrenceId) };
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
const automatic = identify(tree, "auto", null);
|
|
116
|
+
let roots;
|
|
117
|
+
let nodes;
|
|
118
|
+
if (!items?.length) {
|
|
119
|
+
roots = automatic;
|
|
120
|
+
nodes = filterByCategory(roots, categoryMatch, prefixes);
|
|
121
|
+
} else if (items.length === 1 && typeof items[0] !== "string" && items[0]?.type === "autogenerated") {
|
|
122
|
+
roots = automatic;
|
|
123
|
+
nodes = items[0].dirName ? findNode(roots, items[0].dirName)?.children ?? [] : roots;
|
|
124
|
+
} else {
|
|
125
|
+
let resolve2 = function(entries, prefix, parent) {
|
|
126
|
+
const canonical = [];
|
|
127
|
+
const visible = [];
|
|
128
|
+
entries.forEach((item, index) => {
|
|
129
|
+
const id = `${prefix}/${index}`;
|
|
130
|
+
if (typeof item !== "string" && item.type === "category") {
|
|
131
|
+
const children = resolve2(item.items, id, id);
|
|
132
|
+
if (item.sortOrder === "desc") {
|
|
133
|
+
children.canonical.reverse();
|
|
134
|
+
children.visible.reverse();
|
|
135
|
+
}
|
|
136
|
+
const node = { occurrenceId: id, slug: `__category__${item.label}`, label: item.label, position: 0, hasPage: false, collapsed: item.collapsed, sortOrder: item.sortOrder, children: children.canonical };
|
|
137
|
+
parents[id] = parent;
|
|
138
|
+
canonical.push(node);
|
|
139
|
+
visible.push({ ...node, children: children.visible });
|
|
140
|
+
} else if (typeof item !== "string" && item.type === "autogenerated" && item.dirName) {
|
|
141
|
+
const source = findNode(tree, item.dirName);
|
|
142
|
+
if (source) {
|
|
143
|
+
const identified = identify([source], id, parent)[0];
|
|
144
|
+
canonical.push(identified);
|
|
145
|
+
visible.push(...identified.children);
|
|
146
|
+
}
|
|
147
|
+
} else {
|
|
148
|
+
const resolved = identify(resolveItem(item, tree, lang), id, parent);
|
|
149
|
+
canonical.push(...resolved);
|
|
150
|
+
visible.push(...resolved);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
return { canonical, visible };
|
|
154
|
+
};
|
|
155
|
+
var resolve = resolve2;
|
|
156
|
+
for (const id of Object.keys(parents)) delete parents[id];
|
|
157
|
+
const result = resolve2(items, "custom", null);
|
|
158
|
+
roots = result.canonical;
|
|
159
|
+
nodes = result.visible;
|
|
160
|
+
}
|
|
161
|
+
let localParentId;
|
|
162
|
+
for (const index of definition?.initialPath ?? []) {
|
|
163
|
+
const node = nodes[index];
|
|
164
|
+
if (!Number.isInteger(index) || index < 0 || !node) throw new Error(`Invalid sidebar initialPath for ${categoryMatch ?? "default"}`);
|
|
165
|
+
localParentId = node.occurrenceId;
|
|
166
|
+
nodes = node.children;
|
|
167
|
+
}
|
|
168
|
+
let hash = 2166136261;
|
|
169
|
+
const serialized = JSON.stringify(Object.keys(initialExpansion).length ? [roots, initialExpansion] : roots);
|
|
170
|
+
for (let i = 0; i < serialized.length; i++) hash = Math.imul(hash ^ serialized.charCodeAt(i), 16777619);
|
|
171
|
+
const kind = !items?.length || items.length === 1 && typeof items[0] !== "string" && items[0]?.type === "autogenerated" ? "automatic" : definition?.contextId ?? categoryMatch ?? "default";
|
|
172
|
+
return { nodes, navigation: { id: `${lang}:${kind}:${hash >>> 0}`, roots, parents, ...Object.keys(initialExpansion).length ? { initialExpansion } : {}, ...localParentId ? { localParentId } : {} } };
|
|
85
173
|
}
|
|
174
|
+
import { sidebarInitialExpansion, sidebarBaselineOpen, SIDEBAR_FOREST_SCOPE, indexSidebarOccurrences, sidebarScopeNodes, broaderSidebarScope, reconcileSidebarScope } from "./scope.js";
|
|
86
175
|
export {
|
|
87
|
-
|
|
176
|
+
SIDEBAR_FOREST_SCOPE,
|
|
177
|
+
broaderSidebarScope,
|
|
178
|
+
buildSidebarForSection,
|
|
179
|
+
buildSidebarNavigation,
|
|
180
|
+
indexSidebarOccurrences,
|
|
181
|
+
reconcileSidebarScope,
|
|
182
|
+
sidebarBaselineOpen,
|
|
183
|
+
sidebarInitialExpansion,
|
|
184
|
+
sidebarScopeNodes
|
|
88
185
|
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SidebarNavNode, SidebarNavigationContext } from "../sidebar/types.js";
|
|
2
|
+
export declare const SIDEBAR_FOREST_SCOPE = "@forest";
|
|
3
|
+
export declare function indexSidebarOccurrences(roots: SidebarNavNode[]): Map<string, SidebarNavNode>;
|
|
4
|
+
export declare function sidebarScopeNodes(context: SidebarNavigationContext, baseline: SidebarNavNode[], selected: string | null): SidebarNavNode[];
|
|
5
|
+
/** Only an actual shared parent can enclose a configured forest. */
|
|
6
|
+
export declare function broaderSidebarScope(context: SidebarNavigationContext, baseline: SidebarNavNode[], selected: string | null): string | null;
|
|
7
|
+
/** On navigation, widen only to the nearest common editorial ancestor. */
|
|
8
|
+
export declare function reconcileSidebarScope(context: SidebarNavigationContext, baseline: SidebarNavNode[], selected: string | null, slug?: string): string | null;
|
|
9
|
+
/** Leaf override, nearest index default, then legacy undefined behavior. */
|
|
10
|
+
export declare function sidebarInitialExpansion(context: SidebarNavigationContext, slug?: string): "collapsed" | "expanded" | undefined;
|
|
11
|
+
export declare function sidebarBaselineOpen(node: SidebarNavNode, mode: "collapsed" | "expanded" | undefined, currentSlug?: string): boolean;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const SIDEBAR_FOREST_SCOPE = "@forest";
|
|
2
|
+
function indexSidebarOccurrences(roots) {
|
|
3
|
+
const result = /* @__PURE__ */ new Map();
|
|
4
|
+
const visit = (nodes) => nodes.forEach((node) => {
|
|
5
|
+
if (node.occurrenceId) result.set(node.occurrenceId, node);
|
|
6
|
+
visit(node.children);
|
|
7
|
+
});
|
|
8
|
+
visit(roots);
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
function sidebarScopeNodes(context, baseline, selected) {
|
|
12
|
+
if (selected === null) return baseline;
|
|
13
|
+
if (selected === SIDEBAR_FOREST_SCOPE) return context.roots;
|
|
14
|
+
const node = indexSidebarOccurrences(context.roots).get(selected);
|
|
15
|
+
return node ? [node] : baseline;
|
|
16
|
+
}
|
|
17
|
+
function broaderSidebarScope(context, baseline, selected) {
|
|
18
|
+
if (selected === SIDEBAR_FOREST_SCOPE) return null;
|
|
19
|
+
if (selected !== null) {
|
|
20
|
+
const parent = context.parents[selected];
|
|
21
|
+
if (parent) return parent;
|
|
22
|
+
if (context.roots.length === 1 && context.roots[0]?.occurrenceId === selected) return null;
|
|
23
|
+
return SIDEBAR_FOREST_SCOPE;
|
|
24
|
+
}
|
|
25
|
+
if (!baseline.length) return null;
|
|
26
|
+
const parents = baseline.map((node) => node.occurrenceId ? context.parents[node.occurrenceId] : void 0);
|
|
27
|
+
if (parents.some((parent) => parent === void 0 || parent !== parents[0])) return context.localParentId ?? null;
|
|
28
|
+
if (parents[0]) return parents[0];
|
|
29
|
+
const rootIds = context.roots.map((node) => node.occurrenceId);
|
|
30
|
+
return baseline.length === rootIds.length && baseline.every((node, i) => node.occurrenceId === rootIds[i]) ? null : SIDEBAR_FOREST_SCOPE;
|
|
31
|
+
}
|
|
32
|
+
function reconcileSidebarScope(context, baseline, selected, slug) {
|
|
33
|
+
if (selected === null || slug === void 0) return selected;
|
|
34
|
+
const index = indexSidebarOccurrences(context.roots);
|
|
35
|
+
if (selected !== SIDEBAR_FOREST_SCOPE && !index.has(selected)) return null;
|
|
36
|
+
const contains = (nodes) => nodes.some((node) => node.slug === slug || contains(node.children));
|
|
37
|
+
if (!contains(context.roots)) return null;
|
|
38
|
+
let candidate = selected;
|
|
39
|
+
while (candidate !== null) {
|
|
40
|
+
if (contains(sidebarScopeNodes(context, baseline, candidate))) return candidate;
|
|
41
|
+
candidate = broaderSidebarScope(context, baseline, candidate);
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
function sidebarInitialExpansion(context, slug = "") {
|
|
46
|
+
let candidate = slug;
|
|
47
|
+
while (true) {
|
|
48
|
+
const value = context.initialExpansion?.[candidate];
|
|
49
|
+
if (value) return value;
|
|
50
|
+
if (!candidate) return void 0;
|
|
51
|
+
const slash = candidate.lastIndexOf("/");
|
|
52
|
+
candidate = slash < 0 ? "" : candidate.slice(0, slash);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function sidebarBaselineOpen(node, mode, currentSlug) {
|
|
56
|
+
const contains = (n) => currentSlug !== void 0 && (n.slug === currentSlug || n.children.some(contains));
|
|
57
|
+
return contains(node) || (node.collapsed !== void 0 ? !node.collapsed : mode !== "collapsed");
|
|
58
|
+
}
|
|
59
|
+
export {
|
|
60
|
+
SIDEBAR_FOREST_SCOPE,
|
|
61
|
+
broaderSidebarScope,
|
|
62
|
+
indexSidebarOccurrences,
|
|
63
|
+
reconcileSidebarScope,
|
|
64
|
+
sidebarBaselineOpen,
|
|
65
|
+
sidebarInitialExpansion,
|
|
66
|
+
sidebarScopeNodes
|
|
67
|
+
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/** @jsxRuntime automatic */
|
|
2
|
-
|
|
3
|
-
import type { JSX } from "preact";
|
|
2
|
+
import type { JSX } from "@takazudo/zfb/zudo-react/jsx-runtime";
|
|
4
3
|
import type { SidebarNavNode, SidebarRootMenuItem } from "../sidebar/types.js";
|
|
5
4
|
import type { ChromeContext } from "../factory-context/index.js";
|
|
6
5
|
import type { Settings } from "../settings.js";
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { jsx } from "
|
|
1
|
+
import { jsx } from "@takazudo/zfb/zudo-react/jsx-runtime";
|
|
2
2
|
import { Island } from "@takazudo/zfb";
|
|
3
3
|
import { SidebarTree } from "../sidebar-tree-island/index.js";
|
|
4
4
|
import { themeToggleLabels } from "../theme-toggle/labels.js";
|
|
5
5
|
import { deriveDateFormats, deriveNavDataPrep } from "../chrome/derive.js";
|
|
6
|
+
import { normalizeIslandData } from "../chrome/island-data.js";
|
|
6
7
|
import { assertChromeContext } from "../chrome/assert-chrome-context.js";
|
|
7
8
|
function createSidebarWithDefaults(ctx) {
|
|
8
9
|
assertChromeContext(ctx, "createSidebarWithDefaults");
|
|
9
10
|
const defaultLocale = ctx.defaultLocale;
|
|
10
11
|
const localeCount = ctx.locales.length;
|
|
11
12
|
const t = ctx.t;
|
|
12
|
-
const { buildRootMenuItems, buildLocaleLinksForNav,
|
|
13
|
+
const { buildRootMenuItems, buildLocaleLinksForNav, buildSidebarContext, getThemeDefaultMode } = deriveNavDataPrep(ctx);
|
|
13
14
|
const dateFormatsFor = deriveDateFormats(ctx);
|
|
14
15
|
function SidebarWithDefaults(props) {
|
|
15
16
|
const {
|
|
@@ -21,25 +22,25 @@ function createSidebarWithDefaults(ctx) {
|
|
|
21
22
|
} = props;
|
|
22
23
|
const rootMenuItems = buildRootMenuItems(lang, currentVersion);
|
|
23
24
|
const backToMenuLabel = navSection ? t("nav.backToMenu", lang) : void 0;
|
|
24
|
-
const nodes =
|
|
25
|
+
const { nodes, navigation } = buildSidebarContext(lang, navSection, currentVersion, false);
|
|
25
26
|
const localeLinks = buildLocaleLinksForNav(currentPath, lang, localeCount);
|
|
27
|
+
const themeDefaultMode = getThemeDefaultMode();
|
|
28
|
+
const treeProps = normalizeIslandData({
|
|
29
|
+
nodes,
|
|
30
|
+
navigation,
|
|
31
|
+
...currentSlug !== void 0 ? { currentSlug } : {},
|
|
32
|
+
rootMenuItems,
|
|
33
|
+
...backToMenuLabel !== void 0 ? { backToMenuLabel } : {},
|
|
34
|
+
locale: lang,
|
|
35
|
+
...localeLinks !== void 0 ? { localeLinks } : {},
|
|
36
|
+
...themeDefaultMode !== void 0 ? { themeDefaultMode } : {},
|
|
37
|
+
themeLabels: themeToggleLabels(t, lang),
|
|
38
|
+
themeRespectSystem: (ctx.settings.colorMode && ctx.settings.colorMode.respectPrefersColorScheme) ?? true,
|
|
39
|
+
dateFormats: dateFormatsFor(lang)
|
|
40
|
+
});
|
|
26
41
|
return Island({
|
|
27
42
|
when: "load",
|
|
28
|
-
children: /* @__PURE__ */ jsx(
|
|
29
|
-
SidebarTree,
|
|
30
|
-
{
|
|
31
|
-
nodes,
|
|
32
|
-
currentSlug,
|
|
33
|
-
rootMenuItems,
|
|
34
|
-
backToMenuLabel,
|
|
35
|
-
locale: lang,
|
|
36
|
-
localeLinks,
|
|
37
|
-
themeDefaultMode: getThemeDefaultMode(),
|
|
38
|
-
themeLabels: themeToggleLabels(t, lang),
|
|
39
|
-
themeRespectSystem: (ctx.settings.colorMode && ctx.settings.colorMode.respectPrefersColorScheme) ?? true,
|
|
40
|
-
dateFormats: dateFormatsFor(lang)
|
|
41
|
-
}
|
|
42
|
-
)
|
|
43
|
+
children: /* @__PURE__ */ jsx(SidebarTree, { ...treeProps })
|
|
43
44
|
});
|
|
44
45
|
}
|
|
45
46
|
return SidebarWithDefaults;
|
|
@@ -7,18 +7,18 @@ function toNavNode(node) {
|
|
|
7
7
|
return {
|
|
8
8
|
slug: node.id,
|
|
9
9
|
label: node.label,
|
|
10
|
-
description: node.description,
|
|
10
|
+
...node.description !== void 0 ? { description: node.description } : {},
|
|
11
11
|
position: node.sidebar_position ?? 999,
|
|
12
|
-
href: node.href,
|
|
12
|
+
...node.href !== void 0 ? { href: node.href } : {},
|
|
13
13
|
hasPage: node.hasPage,
|
|
14
14
|
children: node.children.map(toNavNode),
|
|
15
15
|
sortOrder: node.sortOrder ?? "asc",
|
|
16
|
-
shape: node.shape,
|
|
17
|
-
noteTrayDated: node.noteTrayDated,
|
|
18
|
-
noteTraySidebar: node.noteTraySidebar,
|
|
19
|
-
date: node.date,
|
|
20
|
-
updated: node.updated,
|
|
21
|
-
rank: node.rank
|
|
16
|
+
...node.shape !== void 0 ? { shape: node.shape } : {},
|
|
17
|
+
...node.noteTrayDated !== void 0 ? { noteTrayDated: node.noteTrayDated } : {},
|
|
18
|
+
...node.noteTraySidebar !== void 0 ? { noteTraySidebar: node.noteTraySidebar } : {},
|
|
19
|
+
...node.date !== void 0 ? { date: node.date } : {},
|
|
20
|
+
...node.updated !== void 0 ? { updated: node.updated } : {},
|
|
21
|
+
...node.rank !== void 0 ? { rank: node.rank } : {}
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
24
|
function findRootIndexDoc(docs) {
|
|
@@ -36,17 +36,17 @@ function toRootNavNode(doc, locale, buildHref, categoryMeta) {
|
|
|
36
36
|
return {
|
|
37
37
|
slug: "",
|
|
38
38
|
label: doc.data.sidebar_label ?? doc.data.title ?? meta?.label ?? "",
|
|
39
|
-
description: doc.data.description ?? meta?.description,
|
|
39
|
+
...(doc.data.description ?? meta?.description) !== void 0 ? { description: doc.data.description ?? meta?.description } : {},
|
|
40
40
|
position: doc.data.sidebar_position ?? meta?.position ?? 999,
|
|
41
|
-
|
|
41
|
+
...noPage ? {} : { href: buildHref("", locale) },
|
|
42
42
|
hasPage: noPage !== true,
|
|
43
43
|
children: [],
|
|
44
44
|
sortOrder,
|
|
45
|
-
shape: doc.data.category_shape,
|
|
46
|
-
noteTrayDated: doc.data.note_tray_dated,
|
|
47
|
-
noteTraySidebar: doc.data.note_tray_sidebar,
|
|
48
|
-
date: doc.data.date,
|
|
49
|
-
updated: doc.data.updated,
|
|
45
|
+
...doc.data.category_shape !== void 0 ? { shape: doc.data.category_shape } : {},
|
|
46
|
+
...doc.data.note_tray_dated !== void 0 ? { noteTrayDated: doc.data.note_tray_dated } : {},
|
|
47
|
+
...doc.data.note_tray_sidebar !== void 0 ? { noteTraySidebar: doc.data.note_tray_sidebar } : {},
|
|
48
|
+
...doc.data.date !== void 0 ? { date: doc.data.date } : {},
|
|
49
|
+
...doc.data.updated !== void 0 ? { updated: doc.data.updated } : {},
|
|
50
50
|
rank: 1
|
|
51
51
|
};
|
|
52
52
|
}
|
|
@@ -46,6 +46,7 @@ export interface DocPageFrontmatter {
|
|
|
46
46
|
standalone?: boolean;
|
|
47
47
|
sidebar_position?: number;
|
|
48
48
|
sidebar_label?: string;
|
|
49
|
+
sidebar_initial_expansion?: "collapsed" | "expanded";
|
|
49
50
|
category_no_page?: boolean;
|
|
50
51
|
category_sort_order?: "asc" | "desc";
|
|
51
52
|
category_shape?: "note-tray";
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/** @jsxRuntime automatic */
|
|
2
|
-
|
|
3
|
-
import type { JSX } from "preact";
|
|
2
|
+
import type { JSX } from "@takazudo/zfb/zudo-react/jsx-runtime";
|
|
4
3
|
import type { SidebarNavNode } from "../sidebar/types.js";
|
|
5
4
|
import type { DateFormatSetting } from "../settings.js";
|
|
6
5
|
/**
|
|
@@ -21,7 +20,7 @@ export interface SiteTreeNavWrapperProps {
|
|
|
21
20
|
lang?: string;
|
|
22
21
|
/**
|
|
23
22
|
* Optional aria-label for the wrapping <nav> element.
|
|
24
|
-
* Forwarded to the
|
|
23
|
+
* Forwarded to the interactive SiteTreeNav island.
|
|
25
24
|
*/
|
|
26
25
|
ariaLabel?: string;
|
|
27
26
|
/**
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { jsx } from "
|
|
1
|
+
import { jsx } from "@takazudo/zfb/zudo-react/jsx-runtime";
|
|
2
2
|
import { Island } from "@takazudo/zfb";
|
|
3
3
|
import { SiteTreeNav } from "../site-tree-nav-island/index.js";
|
|
4
4
|
import { remapVersionedHrefs } from "../nav-data-prep/index.js";
|
|
5
5
|
import { resolveDateFormats } from "../date-format-resolve/index.js";
|
|
6
|
+
import { normalizeSiteTreeNavProps } from "./normalize-island-props.js";
|
|
6
7
|
function createSiteTreeNavWrapper(deps) {
|
|
7
8
|
const {
|
|
8
9
|
defaultLocale,
|
|
@@ -38,19 +39,17 @@ function createSiteTreeNavWrapper(deps) {
|
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
41
|
if (tree.length === 0) return null;
|
|
42
|
+
const islandProps = normalizeSiteTreeNavProps({
|
|
43
|
+
tree,
|
|
44
|
+
categoryOrder,
|
|
45
|
+
...categoryIgnore !== void 0 ? { categoryIgnore } : {},
|
|
46
|
+
...ariaLabel !== void 0 ? { ariaLabel } : {},
|
|
47
|
+
locale,
|
|
48
|
+
dateFormats: resolveDateFormats(dateFormat, locale)
|
|
49
|
+
});
|
|
41
50
|
return Island({
|
|
42
51
|
when: "idle",
|
|
43
|
-
children: /* @__PURE__ */ jsx(
|
|
44
|
-
SiteTreeNav,
|
|
45
|
-
{
|
|
46
|
-
tree,
|
|
47
|
-
categoryOrder,
|
|
48
|
-
categoryIgnore,
|
|
49
|
-
ariaLabel,
|
|
50
|
-
locale,
|
|
51
|
-
dateFormats: resolveDateFormats(dateFormat, locale)
|
|
52
|
-
}
|
|
53
|
-
)
|
|
52
|
+
children: /* @__PURE__ */ jsx(SiteTreeNav, { ...islandProps })
|
|
54
53
|
});
|
|
55
54
|
}
|
|
56
55
|
return SiteTreeNavWrapper;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ResolvedDateFormats } from "../settings.js";
|
|
2
|
+
import type { SidebarNavNode } from "../sidebar/types.js";
|
|
3
|
+
export interface SiteTreeNavIslandProps {
|
|
4
|
+
tree: SidebarNavNode[];
|
|
5
|
+
categoryOrder: string[];
|
|
6
|
+
categoryIgnore?: string[];
|
|
7
|
+
ariaLabel?: string;
|
|
8
|
+
locale: string;
|
|
9
|
+
dateFormats: ResolvedDateFormats;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Copy the host nav payload through the island's finite JSON shape. Optional
|
|
13
|
+
* fields are added only when present, so neither node records nor top-level
|
|
14
|
+
* props carry own `undefined` values across SSR and hydration.
|
|
15
|
+
*/
|
|
16
|
+
export declare function normalizeSiteTreeNavProps(input: SiteTreeNavIslandProps): SiteTreeNavIslandProps;
|