@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,9 +1,12 @@
|
|
|
1
|
-
import { jsx, jsxs } from "
|
|
2
|
-
import { useEffect, useRef, useState } from "preact/hooks";
|
|
3
|
-
import { HighlightedCode } from "./highlighted-code.js";
|
|
1
|
+
import { jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
|
|
4
2
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
computed,
|
|
4
|
+
getScope,
|
|
5
|
+
signal,
|
|
6
|
+
Show
|
|
7
|
+
} from "@takazudo/zfb/zudo-react";
|
|
8
|
+
import { HighlightedCode } from "./highlighted-code.js";
|
|
9
|
+
import { createPreviewAutoHeightController } from "./preview-auto-height.js";
|
|
7
10
|
const DEFAULT_LABELS = {
|
|
8
11
|
mobile: "Mobile",
|
|
9
12
|
tablet: "Tablet",
|
|
@@ -49,52 +52,44 @@ function PreviewBase({
|
|
|
49
52
|
const sourceVisible = showSource ?? true;
|
|
50
53
|
const viewportControlsVisible = showViewportControls ?? true;
|
|
51
54
|
const viewports = viewportControlsVisible ? buildViewports(resolvedLabels) : DEFAULT_VIEWPORTS;
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
);
|
|
56
|
-
const
|
|
57
|
-
const iframeRef = useRef(null);
|
|
58
|
-
const iframeHeightRef = useRef(iframeHeight);
|
|
59
|
-
const autoHeightControllerRef = useRef(
|
|
60
|
-
null
|
|
61
|
-
);
|
|
62
|
-
iframeHeightRef.current = iframeHeight;
|
|
55
|
+
const scope = getScope();
|
|
56
|
+
const activeViewport = signal(2);
|
|
57
|
+
const codeOpen = signal(sourceVisible && (defaultOpen ?? false));
|
|
58
|
+
const iframeHeight = signal(height ?? 200);
|
|
59
|
+
const iframeRef = { current: null };
|
|
63
60
|
const autoHeightEnabled = (autoHeight ?? true) && height == null;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
61
|
+
let controller = null;
|
|
62
|
+
scope.onActivate(() => {
|
|
63
|
+
const frame = iframeRef.current;
|
|
64
|
+
if (!frame || !autoHeightEnabled) return;
|
|
65
|
+
const nextController = createPreviewAutoHeightController({
|
|
66
|
+
iframe: frame,
|
|
69
67
|
syncDelay,
|
|
70
|
-
getCurrentHeight: () =>
|
|
68
|
+
getCurrentHeight: () => iframeHeight.value,
|
|
71
69
|
setHeight: (nextHeight) => {
|
|
72
|
-
|
|
73
|
-
setIframeHeight(nextHeight);
|
|
70
|
+
iframeHeight.value = nextHeight;
|
|
74
71
|
}
|
|
75
72
|
});
|
|
76
|
-
|
|
77
|
-
const onLoad = () =>
|
|
78
|
-
|
|
73
|
+
controller = nextController;
|
|
74
|
+
const onLoad = () => nextController.handleLoad();
|
|
75
|
+
frame.addEventListener("load", onLoad);
|
|
79
76
|
try {
|
|
80
|
-
if (
|
|
81
|
-
controller.handleLoad();
|
|
82
|
-
}
|
|
77
|
+
if (frame.contentDocument?.readyState === "complete") nextController.handleLoad();
|
|
83
78
|
} catch {
|
|
84
79
|
}
|
|
85
80
|
return () => {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
autoHeightControllerRef.current = null;
|
|
90
|
-
}
|
|
81
|
+
frame.removeEventListener("load", onLoad);
|
|
82
|
+
nextController.destroy();
|
|
83
|
+
controller = null;
|
|
91
84
|
};
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
const containerWidth =
|
|
85
|
+
});
|
|
86
|
+
scope.effect(() => {
|
|
87
|
+
activeViewport.value;
|
|
88
|
+
if (autoHeightEnabled) controller?.schedule();
|
|
89
|
+
});
|
|
90
|
+
const containerWidth = computed(
|
|
91
|
+
() => viewportControlsVisible ? viewports[activeViewport.value]?.width ?? "100%" : "100%"
|
|
92
|
+
);
|
|
98
93
|
return /* @__PURE__ */ jsxs("div", { class: "border border-muted rounded-lg overflow-hidden my-vsp-md", children: [
|
|
99
94
|
(viewportControlsVisible || title) && /* @__PURE__ */ jsxs("div", { class: "flex items-center justify-between px-hsp-md py-hsp-sm bg-surface border-b border-muted gap-hsp-sm flex-wrap", children: [
|
|
100
95
|
title && /* @__PURE__ */ jsx("span", { class: "text-caption font-semibold text-fg", children: title }),
|
|
@@ -108,12 +103,13 @@ function PreviewBase({
|
|
|
108
103
|
"button",
|
|
109
104
|
{
|
|
110
105
|
type: "button",
|
|
111
|
-
class: `min-h-[44px] min-w-[44px] px-hsp-sm py-hsp-2xs text-caption border rounded-full cursor-pointer transition-[background,color,border-color] duration-150 leading-snug ${i === activeViewport ? "bg-accent text-bg border-accent hover:bg-accent-hover hover:border-accent-hover" : "bg-transparent text-muted border-muted hover:bg-[color-mix(in_srgb,var(--color-surface)_80%,var(--color-fg)_20%)]"}
|
|
112
|
-
"aria-pressed": i === activeViewport,
|
|
113
|
-
|
|
106
|
+
class: computed(() => `min-h-[44px] min-w-[44px] px-hsp-sm py-hsp-2xs text-caption border rounded-full cursor-pointer transition-[background,color,border-color] duration-150 leading-snug ${i === activeViewport.value ? "bg-accent text-bg border-accent hover:bg-accent-hover hover:border-accent-hover" : "bg-transparent text-muted border-muted hover:bg-[color-mix(in_srgb,var(--color-surface)_80%,var(--color-fg)_20%)]"}`),
|
|
107
|
+
"aria-pressed": computed(() => i === activeViewport.value),
|
|
108
|
+
"on:click": () => {
|
|
109
|
+
activeViewport.value = i;
|
|
110
|
+
},
|
|
114
111
|
children: vp.label
|
|
115
|
-
}
|
|
116
|
-
vp.label
|
|
112
|
+
}
|
|
117
113
|
))
|
|
118
114
|
}
|
|
119
115
|
)
|
|
@@ -122,16 +118,16 @@ function PreviewBase({
|
|
|
122
118
|
"div",
|
|
123
119
|
{
|
|
124
120
|
class: "resize-x overflow-auto max-w-full mx-auto",
|
|
125
|
-
style: { width: containerWidth },
|
|
121
|
+
style: computed(() => ({ width: containerWidth.value })),
|
|
126
122
|
children: /* @__PURE__ */ jsx(
|
|
127
123
|
"iframe",
|
|
128
124
|
{
|
|
129
125
|
ref: iframeRef,
|
|
130
|
-
class: "block w-full border-none bg-[#fff] rounded
|
|
131
|
-
|
|
132
|
-
sandbox,
|
|
133
|
-
|
|
134
|
-
|
|
126
|
+
class: "block w-full border-none bg-[#fff] rounded zd-preview-shadow",
|
|
127
|
+
title: title ?? resolvedLabels.preview,
|
|
128
|
+
...sandbox !== void 0 ? { sandbox } : {},
|
|
129
|
+
srcdoc,
|
|
130
|
+
style: computed(() => ({ height: `${iframeHeight.value}px` }))
|
|
135
131
|
}
|
|
136
132
|
)
|
|
137
133
|
}
|
|
@@ -142,22 +138,24 @@ function PreviewBase({
|
|
|
142
138
|
{
|
|
143
139
|
type: "button",
|
|
144
140
|
class: "flex min-h-[44px] min-w-[44px] items-center w-full px-hsp-md py-hsp-sm text-caption font-medium text-muted bg-surface border-none cursor-pointer gap-hsp-xs hover:bg-[color-mix(in_srgb,var(--color-surface)_80%,var(--color-fg)_20%)]",
|
|
145
|
-
|
|
141
|
+
"on:click": () => {
|
|
142
|
+
codeOpen.value = !codeOpen.value;
|
|
143
|
+
},
|
|
146
144
|
"aria-expanded": codeOpen,
|
|
147
145
|
children: [
|
|
148
146
|
/* @__PURE__ */ jsx(
|
|
149
147
|
"span",
|
|
150
148
|
{
|
|
151
|
-
class: `text-caption transition-transform duration-200 ${codeOpen ? "rotate-90" : ""}
|
|
149
|
+
class: computed(() => `text-caption transition-transform duration-200 ${codeOpen.value ? "rotate-90" : ""}`),
|
|
152
150
|
"aria-hidden": "true",
|
|
153
151
|
children: "\u25B6"
|
|
154
152
|
}
|
|
155
153
|
),
|
|
156
|
-
codeOpen ? resolvedLabels.hideCode : resolvedLabels.showCode
|
|
154
|
+
computed(() => codeOpen.value ? resolvedLabels.hideCode : resolvedLabels.showCode)
|
|
157
155
|
]
|
|
158
156
|
}
|
|
159
157
|
),
|
|
160
|
-
codeOpen
|
|
158
|
+
/* @__PURE__ */ jsx(Show, { when: codeOpen, children: () => /* @__PURE__ */ jsx("div", { children: codeBlocks.map((block, idx) => /* @__PURE__ */ jsxs(
|
|
161
159
|
"div",
|
|
162
160
|
{
|
|
163
161
|
class: `overflow-x-auto ${idx > 0 ? "border-t border-muted" : ""}`,
|
|
@@ -165,9 +163,8 @@ function PreviewBase({
|
|
|
165
163
|
/* @__PURE__ */ jsx("span", { class: "block px-hsp-md py-hsp-xs text-caption font-semibold text-muted bg-surface border-b border-muted uppercase tracking-wider", children: block.title }),
|
|
166
164
|
/* @__PURE__ */ jsx(HighlightedCode, { code: block.code, language: block.language })
|
|
167
165
|
]
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
)) })
|
|
166
|
+
}
|
|
167
|
+
)) }) })
|
|
171
168
|
] })
|
|
172
169
|
] });
|
|
173
170
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** @jsxRuntime automatic */
|
|
2
|
+
import type { Child } from "@takazudo/zfb/zudo-react";
|
|
3
|
+
import { type HtmlPreviewWrapperProps } from "./html-preview-wrapper.js";
|
|
4
|
+
/**
|
|
5
|
+
* HTML preview wrapper component — the public MDX-registered binding
|
|
6
|
+
* (`HtmlPreview: HtmlPreviewWrapper`).
|
|
7
|
+
*
|
|
8
|
+
* Eager mode wraps the bare `HtmlPreviewWrapperInner` in
|
|
9
|
+
* `<Island when="visible">`, mirroring the legacy `client:visible` hydration
|
|
10
|
+
* timing while preserving the server-rendered controls and iframe. Visible mode
|
|
11
|
+
* uses zfb's skip-SSR fallback path: static output contains only an inert
|
|
12
|
+
* nonzero reservation, while the real serializable inner props remain on the
|
|
13
|
+
* island marker for native visible scheduling and client mount.
|
|
14
|
+
*
|
|
15
|
+
* The public export name and signature are unchanged from before the
|
|
16
|
+
* zudolab/zudo-doc#1925 fix, so existing consumers that register
|
|
17
|
+
* `HtmlPreview: HtmlPreviewWrapper` keep working (and now hydrate correctly)
|
|
18
|
+
* with no call-site change.
|
|
19
|
+
*/
|
|
20
|
+
export declare function HtmlPreviewWrapper(props: HtmlPreviewWrapperProps): Child;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx } from "@takazudo/zfb/zudo-react/jsx-runtime";
|
|
2
|
+
import { Island } from "@takazudo/zfb";
|
|
3
|
+
import { HtmlPreviewWrapperInner } from "./html-preview-wrapper.js";
|
|
4
|
+
function reservationHeight(height) {
|
|
5
|
+
return height != null && height > 0 ? height : 200;
|
|
6
|
+
}
|
|
7
|
+
function HtmlPreviewReservation({
|
|
8
|
+
height
|
|
9
|
+
}) {
|
|
10
|
+
return /* @__PURE__ */ jsx(
|
|
11
|
+
"div",
|
|
12
|
+
{
|
|
13
|
+
"aria-hidden": "true",
|
|
14
|
+
"data-zd-html-preview-reservation": true,
|
|
15
|
+
style: { height: `${reservationHeight(height)}px` }
|
|
16
|
+
}
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
function HtmlPreviewWrapper(props) {
|
|
20
|
+
const { loading = "eager", ...innerProps } = props;
|
|
21
|
+
if (loading === "visible") {
|
|
22
|
+
const rendered2 = Island({
|
|
23
|
+
when: "visible",
|
|
24
|
+
ssrFallback: /* @__PURE__ */ jsx(HtmlPreviewReservation, { height: innerProps.height }),
|
|
25
|
+
children: /* @__PURE__ */ jsx(HtmlPreviewWrapperInner, { ...innerProps })
|
|
26
|
+
});
|
|
27
|
+
return rendered2;
|
|
28
|
+
}
|
|
29
|
+
const rendered = Island({
|
|
30
|
+
when: "visible",
|
|
31
|
+
children: /* @__PURE__ */ jsx(HtmlPreviewWrapperInner, { ...innerProps })
|
|
32
|
+
});
|
|
33
|
+
return rendered;
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
HtmlPreviewWrapper
|
|
37
|
+
};
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
export declare function useHydrationPending(enabled: boolean): boolean;
|
|
1
|
+
import type { ReadonlySignal, Scope } from "@takazudo/zfb/zudo-react";
|
|
2
|
+
/** Keep SSR and the first client render pending, then release on activation. */
|
|
3
|
+
export declare function hydrationPending(scope: Scope, enabled: boolean): ReadonlySignal<boolean>;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
function
|
|
3
|
-
const
|
|
4
|
-
|
|
1
|
+
import { signal } from "@takazudo/zfb/zudo-react";
|
|
2
|
+
function hydrationPending(scope, enabled) {
|
|
3
|
+
const pending = signal(enabled);
|
|
4
|
+
scope.onActivate(() => {
|
|
5
|
+
pending.value = false;
|
|
6
|
+
});
|
|
5
7
|
return pending;
|
|
6
8
|
}
|
|
7
9
|
export {
|
|
8
|
-
|
|
10
|
+
hydrationPending
|
|
9
11
|
};
|
|
@@ -1,35 +1,8 @@
|
|
|
1
1
|
/** @jsxRuntime automatic */
|
|
2
|
-
|
|
3
|
-
import type { VNode } from "preact";
|
|
2
|
+
import type { Child } from "@takazudo/zfb/zudo-react";
|
|
4
3
|
import type { LocaleLink } from "./types.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
* `getPathForLocale`'s output from the live pathname. Emitted as `data-*`
|
|
8
|
-
* attributes on the switcher container so {@link LANGUAGE_SWITCHER_INIT_SCRIPT}
|
|
9
|
-
* can read it without any serialized props.
|
|
10
|
-
*/
|
|
11
|
-
export interface LanguageSwitcherConfig {
|
|
12
|
-
/** Normalized site base with no trailing slash (`""` for a root site). */
|
|
13
|
-
base: string;
|
|
14
|
-
/** The project's default locale (rendered without a locale prefix). */
|
|
15
|
-
defaultLocale: string;
|
|
16
|
-
/** Whether the project appends trailing slashes to page URLs. */
|
|
17
|
-
trailingSlash: boolean;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Client-side re-computation of a locale-switched href from the *current*
|
|
21
|
-
* pathname. This is a self-contained port of `getPathForLocale` (+ its
|
|
22
|
-
* `stripBase` / version-prefix split / `withBase` / `applyTrailingSlash`
|
|
23
|
-
* dependencies) from `url-helpers`. It MUST stay behaviourally identical to
|
|
24
|
-
* that function — pinned by the drift-guard test in
|
|
25
|
-
* `__tests__/language-switcher.test.tsx`, which asserts equality against the
|
|
26
|
-
* real `buildLocaleLinks` output across a case table.
|
|
27
|
-
*
|
|
28
|
-
* It is deliberately self-contained (no references to module-scope helpers)
|
|
29
|
-
* because {@link LANGUAGE_SWITCHER_INIT_SCRIPT} embeds it verbatim via
|
|
30
|
-
* `.toString()`, so it must be valid as a standalone function in the browser.
|
|
31
|
-
*/
|
|
32
|
-
export declare function switchLocaleHref(pathname: string, config: LanguageSwitcherConfig, currentLang: string, targetLang: string): string;
|
|
4
|
+
import type { LanguageSwitcherConfig } from "./switcher-url-state.js";
|
|
5
|
+
export { switchLocaleHref, type LanguageSwitcherConfig } from "./switcher-url-state.js";
|
|
33
6
|
/**
|
|
34
7
|
* Inline init script that keeps the switcher's per-page hrefs correct inside a
|
|
35
8
|
* persisted header. Mounted once wherever a header is rendered (see
|
|
@@ -48,7 +21,7 @@ export declare function switchLocaleHref(pathname: string, config: LanguageSwitc
|
|
|
48
21
|
* `nav-overflow-script.ts` / `sidebar-tree-island` / `version-switcher.tsx`
|
|
49
22
|
* use (zudolab/zudo-doc#3398, consolidated by #3408).
|
|
50
23
|
*/
|
|
51
|
-
export
|
|
24
|
+
export { LANGUAGE_SWITCHER_INIT_SCRIPT } from "./switcher-generated-scripts.js";
|
|
52
25
|
export interface LanguageSwitcherProps {
|
|
53
26
|
/**
|
|
54
27
|
* Pre-built locale links, ordered as they should appear in the bar.
|
|
@@ -81,5 +54,5 @@ export interface LanguageSwitcherProps {
|
|
|
81
54
|
* template's `localeLinks.length > 1 &&` guard so call-sites can mount
|
|
82
55
|
* the component unconditionally).
|
|
83
56
|
*/
|
|
84
|
-
export declare function LanguageSwitcher({ links, config, currentLocale, accessibleLabel, idSuffix, }: LanguageSwitcherProps):
|
|
57
|
+
export declare function LanguageSwitcher({ links, config, currentLocale, accessibleLabel, idSuffix, }: LanguageSwitcherProps): Child;
|
|
85
58
|
export type { LocaleLink };
|
|
@@ -1,106 +1,6 @@
|
|
|
1
|
-
import { jsx, jsxs } from "
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
function switchLocaleHref(pathname, config, currentLang, targetLang) {
|
|
5
|
-
const normalizedBase = config.base;
|
|
6
|
-
const defaultLocale = config.defaultLocale;
|
|
7
|
-
const trailingSlash = config.trailingSlash;
|
|
8
|
-
const stripBase = (path) => {
|
|
9
|
-
if (normalizedBase === "") return path;
|
|
10
|
-
if (path === normalizedBase) return "/";
|
|
11
|
-
return path.indexOf(normalizedBase + "/") === 0 ? path.slice(normalizedBase.length) : path;
|
|
12
|
-
};
|
|
13
|
-
const applyTrailingSlash = (url) => {
|
|
14
|
-
if (!trailingSlash) return url;
|
|
15
|
-
if (url.charAt(url.length - 1) === "/") return url;
|
|
16
|
-
const suffixIdx = url.search(/[?#]/);
|
|
17
|
-
const pathPart = suffixIdx >= 0 ? url.slice(0, suffixIdx) : url;
|
|
18
|
-
const suffix = suffixIdx >= 0 ? url.slice(suffixIdx) : "";
|
|
19
|
-
if (pathPart.charAt(pathPart.length - 1) === "/") return url;
|
|
20
|
-
const segments = pathPart.split("/");
|
|
21
|
-
const lastSegment = segments[segments.length - 1] || "";
|
|
22
|
-
if (/\.[a-zA-Z]\w*$/.test(lastSegment)) return url;
|
|
23
|
-
return pathPart + "/" + suffix;
|
|
24
|
-
};
|
|
25
|
-
const withBase = (path) => {
|
|
26
|
-
const raw = normalizedBase === "" ? path : normalizedBase + (path.charAt(0) === "/" ? path : "/" + path);
|
|
27
|
-
return applyTrailingSlash(raw);
|
|
28
|
-
};
|
|
29
|
-
const stripped = stripBase(pathname);
|
|
30
|
-
const versionMatch = stripped.match(/^(\/v\/[^/]+)(\/.*|$)/);
|
|
31
|
-
const versionPrefix = versionMatch ? versionMatch[1] || "" : "";
|
|
32
|
-
let relativePath = versionMatch ? versionMatch[2] || "/" : stripped;
|
|
33
|
-
if (currentLang !== defaultLocale) {
|
|
34
|
-
relativePath = relativePath.replace(
|
|
35
|
-
new RegExp("^/" + currentLang + "(?:/|$)"),
|
|
36
|
-
"/"
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
if (targetLang !== defaultLocale) {
|
|
40
|
-
relativePath = "/" + targetLang + relativePath;
|
|
41
|
-
}
|
|
42
|
-
return withBase(versionPrefix + relativePath);
|
|
43
|
-
}
|
|
44
|
-
const LANGUAGE_SWITCHER_INIT_SCRIPT = `(function(){
|
|
45
|
-
var FLAG="__zdLanguageSwitcherInit";
|
|
46
|
-
${CURRENT_PATH_SCRIPT_PRELUDE}
|
|
47
|
-
var switchLocaleHref=${switchLocaleHref.toString()};
|
|
48
|
-
function close(c,restoreFocus){
|
|
49
|
-
var toggle=c.querySelector("[data-language-toggle]");
|
|
50
|
-
var menu=c.querySelector("[data-language-menu]");
|
|
51
|
-
if(!toggle||!menu)return;
|
|
52
|
-
menu.classList.add("hidden");
|
|
53
|
-
toggle.setAttribute("aria-expanded","false");
|
|
54
|
-
if(restoreFocus)toggle.focus();
|
|
55
|
-
}
|
|
56
|
-
function refresh(){
|
|
57
|
-
var containers=document.querySelectorAll("[data-language-switcher]");
|
|
58
|
-
for(var i=0;i<containers.length;i++){
|
|
59
|
-
var c=containers[i];
|
|
60
|
-
close(c,false);
|
|
61
|
-
var menu=c.querySelector("[data-language-menu]");
|
|
62
|
-
if(menu){
|
|
63
|
-
menu.classList.remove("group-hover:block","group-focus-within:block");
|
|
64
|
-
}
|
|
65
|
-
if(!c.hasAttribute("data-default-locale"))continue;
|
|
66
|
-
var config={base:c.getAttribute("data-base")||"",defaultLocale:c.getAttribute("data-default-locale")||"",trailingSlash:c.getAttribute("data-trailing-slash")==="true"};
|
|
67
|
-
var currentLang=c.getAttribute("data-current-locale")||config.defaultLocale;
|
|
68
|
-
var anchors=c.querySelectorAll("a[lang]");
|
|
69
|
-
for(var j=0;j<anchors.length;j++){
|
|
70
|
-
var a=anchors[j];
|
|
71
|
-
var target=a.getAttribute("lang");
|
|
72
|
-
if(!target)continue;
|
|
73
|
-
a.setAttribute("href",switchLocaleHref(readCurrentPath(CURRENT_PATH_DATASET_KEY),config,currentLang,target));
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if(window[FLAG]){window[FLAG]();return;}
|
|
78
|
-
window[FLAG]=refresh;
|
|
79
|
-
document.addEventListener("click",function(e){
|
|
80
|
-
var target=e.target;
|
|
81
|
-
var toggle=target&&target.closest?target.closest("[data-language-toggle]"):null;
|
|
82
|
-
if(toggle){
|
|
83
|
-
var switcher=toggle.closest("[data-language-switcher]");
|
|
84
|
-
if(switcher){
|
|
85
|
-
var menu=switcher.querySelector("[data-language-menu]");
|
|
86
|
-
var willOpen=toggle.getAttribute("aria-expanded")!=="true";
|
|
87
|
-
document.querySelectorAll("[data-language-switcher]").forEach(function(c){if(c!==switcher)close(c,false);});
|
|
88
|
-
if(menu){menu.classList.toggle("hidden",!willOpen);toggle.setAttribute("aria-expanded",String(willOpen));}
|
|
89
|
-
}
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
document.querySelectorAll("[data-language-switcher]").forEach(function(c){if(!c.contains(target))close(c,false);});
|
|
93
|
-
});
|
|
94
|
-
document.addEventListener("keydown",function(e){
|
|
95
|
-
if(e.key!=="Escape")return;
|
|
96
|
-
document.querySelectorAll('[data-language-toggle][aria-expanded="true"]').forEach(function(toggle){
|
|
97
|
-
var switcher=toggle.closest("[data-language-switcher]");
|
|
98
|
-
if(switcher)close(switcher,true);
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
refresh();
|
|
102
|
-
document.addEventListener(${JSON.stringify(AFTER_NAVIGATE_EVENT)},refresh);
|
|
103
|
-
})();`;
|
|
1
|
+
import { jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
|
|
2
|
+
import { switchLocaleHref } from "./switcher-url-state.js";
|
|
3
|
+
import { LANGUAGE_SWITCHER_INIT_SCRIPT } from "./switcher-generated-scripts.js";
|
|
104
4
|
function LanguageSwitcher({
|
|
105
5
|
links,
|
|
106
6
|
config,
|
|
@@ -130,7 +30,7 @@ function LanguageSwitcher({
|
|
|
130
30
|
{
|
|
131
31
|
type: "button",
|
|
132
32
|
id: toggleId,
|
|
133
|
-
class: "flex max-w-[16rem] cursor-pointer items-center gap-hsp-2xs whitespace-nowrap rounded border border-muted px-hsp-sm py-vsp-3xs text-small text-muted transition-colors hover:border-accent hover:text-accent focus-visible:border-accent focus-visible:text-accent",
|
|
33
|
+
class: "flex max-w-[16rem] cursor-pointer items-center gap-hsp-2xs whitespace-nowrap rounded border border-muted px-hsp-sm py-vsp-3xs text-small text-muted transition-colors duration-0 hover:border-accent hover:text-accent focus-visible:border-accent focus-visible:text-accent",
|
|
134
34
|
"aria-label": accessibleLabel,
|
|
135
35
|
"aria-controls": menuId,
|
|
136
36
|
"aria-expanded": "false",
|
|
@@ -146,7 +46,7 @@ function LanguageSwitcher({
|
|
|
146
46
|
{
|
|
147
47
|
id: menuId,
|
|
148
48
|
"aria-labelledby": toggleId,
|
|
149
|
-
class: "absolute right-0 top-full z-dropdown mt-vsp-3xs hidden min-w-[8rem] max-w-[calc(
|
|
49
|
+
class: "absolute right-0 top-full z-dropdown mt-vsp-3xs hidden min-w-[8rem] max-w-[calc(100vw_-_var(--spacing-hsp-xl))] overflow-x-auto whitespace-nowrap rounded border border-muted bg-surface py-vsp-3xs shadow-lg group-hover:block group-focus-within:block",
|
|
150
50
|
"data-language-menu": true,
|
|
151
51
|
children: links.map((link) => /* @__PURE__ */ jsx("li", { children: link.active ? /* @__PURE__ */ jsx(
|
|
152
52
|
"span",
|
|
@@ -175,7 +75,6 @@ function ChevronDownIcon() {
|
|
|
175
75
|
return /* @__PURE__ */ jsx(
|
|
176
76
|
"svg",
|
|
177
77
|
{
|
|
178
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
179
78
|
class: "h-icon-xs w-icon-xs shrink-0",
|
|
180
79
|
fill: "none",
|
|
181
80
|
viewBox: "0 0 24 24",
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const LANGUAGE_SWITCHER_INIT_SCRIPT = "(function(){\nvar FLAG=\"__zdLanguageSwitcherInit\";\nvar CURRENT_PATH_DATASET_KEY=\"zdCurrentPath\";var readCurrentPath=function readCurrentPath(datasetKey, explicit) {\n const override = typeof document === \"undefined\" ? void 0 : document.documentElement.dataset[datasetKey];\n return explicit || override || (typeof window === \"undefined\" ? void 0 : window.location.pathname);\n};\nvar switchLocaleHref=function switchLocaleHref(pathname, config, currentLang, targetLang) {\n const normalizedBase = config.base;\n const defaultLocale = config.defaultLocale;\n const trailingSlash = config.trailingSlash;\n const stripBase = (path) => {\n if (normalizedBase === \"\") return path;\n if (path === normalizedBase) return \"/\";\n return path.indexOf(normalizedBase + \"/\") === 0 ? path.slice(normalizedBase.length) : path;\n };\n const applyTrailingSlash = (url) => {\n if (!trailingSlash) return url;\n if (url.charAt(url.length - 1) === \"/\") return url;\n const suffixIdx = url.search(/[?#]/);\n const pathPart = suffixIdx >= 0 ? url.slice(0, suffixIdx) : url;\n const suffix = suffixIdx >= 0 ? url.slice(suffixIdx) : \"\";\n if (pathPart.charAt(pathPart.length - 1) === \"/\") return url;\n const segments = pathPart.split(\"/\");\n const lastSegment = segments[segments.length - 1] || \"\";\n if (/\\.[a-zA-Z]\\w*$/.test(lastSegment)) return url;\n return pathPart + \"/\" + suffix;\n };\n const withBase = (path) => {\n const raw = normalizedBase === \"\" ? path : normalizedBase + (path.charAt(0) === \"/\" ? path : \"/\" + path);\n return applyTrailingSlash(raw);\n };\n const stripped = stripBase(pathname);\n const versionMatch = stripped.match(/^(\\/v\\/[^/]+)(\\/.*|$)/);\n const versionPrefix = versionMatch ? versionMatch[1] || \"\" : \"\";\n let relativePath = versionMatch ? versionMatch[2] || \"/\" : stripped;\n if (currentLang !== defaultLocale) {\n relativePath = relativePath.replace(\n new RegExp(\"^/\" + currentLang + \"(?:/|$)\"),\n \"/\"\n );\n }\n if (targetLang !== defaultLocale) {\n relativePath = \"/\" + targetLang + relativePath;\n }\n return withBase(versionPrefix + relativePath);\n};\nfunction close(c,restoreFocus){\nvar toggle=c.querySelector(\"[data-language-toggle]\");\nvar menu=c.querySelector(\"[data-language-menu]\");\nif(!toggle||!menu)return;\nmenu.classList.add(\"hidden\");\ntoggle.setAttribute(\"aria-expanded\",\"false\");\nif(restoreFocus)toggle.focus();\n}\nfunction refresh(){\nvar containers=document.querySelectorAll(\"[data-language-switcher]\");\nfor(var i=0;i<containers.length;i++){\nvar c=containers[i];\nclose(c,false);\nvar menu=c.querySelector(\"[data-language-menu]\");\nif(menu){\nmenu.classList.remove(\"group-hover:block\",\"group-focus-within:block\");\n}\nif(!c.hasAttribute(\"data-default-locale\"))continue;\nvar config={base:c.getAttribute(\"data-base\")||\"\",defaultLocale:c.getAttribute(\"data-default-locale\")||\"\",trailingSlash:c.getAttribute(\"data-trailing-slash\")===\"true\"};\nvar currentLang=c.getAttribute(\"data-current-locale\")||config.defaultLocale;\nvar anchors=c.querySelectorAll(\"a[lang]\");\nfor(var j=0;j<anchors.length;j++){\nvar a=anchors[j];\nvar target=a.getAttribute(\"lang\");\nif(!target)continue;\na.setAttribute(\"href\",switchLocaleHref(readCurrentPath(CURRENT_PATH_DATASET_KEY),config,currentLang,target));\n}\n}\n}\nif(window[FLAG]){window[FLAG]();return;}\nwindow[FLAG]=refresh;\ndocument.addEventListener(\"click\",function(e){\nvar target=e.target;\nvar toggle=target&&target.closest?target.closest(\"[data-language-toggle]\"):null;\nif(toggle){\nvar switcher=toggle.closest(\"[data-language-switcher]\");\nif(switcher){\nvar menu=switcher.querySelector(\"[data-language-menu]\");\nvar willOpen=toggle.getAttribute(\"aria-expanded\")!==\"true\";\ndocument.querySelectorAll(\"[data-language-switcher]\").forEach(function(c){if(c!==switcher)close(c,false);});\nif(menu){menu.classList.toggle(\"hidden\",!willOpen);toggle.setAttribute(\"aria-expanded\",String(willOpen));}\n}\nreturn;\n}\ndocument.querySelectorAll(\"[data-language-switcher]\").forEach(function(c){if(!c.contains(target))close(c,false);});\n});\ndocument.addEventListener(\"keydown\",function(e){\nif(e.key!==\"Escape\")return;\ndocument.querySelectorAll('[data-language-toggle][aria-expanded=\"true\"]').forEach(function(toggle){\nvar switcher=toggle.closest(\"[data-language-switcher]\");\nif(switcher)close(switcher,true);\n});\n});\nrefresh();\ndocument.addEventListener(\"zfb:after-swap\",refresh);\n})();";
|
|
2
|
+
export declare const VERSION_SWITCHER_REWIRE_SCRIPT = "(function(){\nvar FLAG=\"__zdVersionSwitcherRewire\";\nif(window[FLAG])return;\nwindow[FLAG]=true;\nvar ATTR=\"data-doc-unavailable-versions\";\nvar CURRENT_PATH_DATASET_KEY=\"zdCurrentPath\";var readCurrentPath=function readCurrentPath(datasetKey, explicit) {\n const override = typeof document === \"undefined\" ? void 0 : document.documentElement.dataset[datasetKey];\n return explicit || override || (typeof window === \"undefined\" ? void 0 : window.location.pathname);\n};\nvar computeVersionSwitcherState=function computeVersionSwitcherState(pathname, config, versionSlugs) {\n const normalizedBase = config.base;\n const defaultLocale = config.defaultLocale;\n const currentLocale = config.currentLocale;\n const trailingSlash = config.trailingSlash;\n const stripBase = (path) => {\n if (normalizedBase === \"\") return path;\n if (path === normalizedBase) return \"/\";\n return path.indexOf(normalizedBase + \"/\") === 0 ? path.slice(normalizedBase.length) : path;\n };\n const applyTrailingSlash = (url) => {\n if (!trailingSlash) return url;\n if (url.charAt(url.length - 1) === \"/\") return url;\n const suffixIdx = url.search(/[?#]/);\n const pathPart = suffixIdx >= 0 ? url.slice(0, suffixIdx) : url;\n const suffix = suffixIdx >= 0 ? url.slice(suffixIdx) : \"\";\n if (pathPart.charAt(pathPart.length - 1) === \"/\") return url;\n const segments = pathPart.split(\"/\");\n const lastSegment = segments[segments.length - 1] || \"\";\n if (/\\.[a-zA-Z]\\w*$/.test(lastSegment)) return url;\n return pathPart + \"/\" + suffix;\n };\n const withBase = (path) => {\n const raw = normalizedBase === \"\" ? path : normalizedBase + (path.charAt(0) === \"/\" ? path : \"/\" + path);\n return applyTrailingSlash(raw);\n };\n const versionsPageUrl = withBase(\n currentLocale === defaultLocale ? \"/docs/versions\" : \"/\" + currentLocale + \"/docs/versions\"\n );\n const stripped = stripBase(pathname);\n const versionMatch = stripped.match(/^\\/v\\/([^/]+)(\\/.*|$)/);\n const rest = versionMatch ? versionMatch[2] || \"/\" : stripped;\n let localeStripped = rest;\n if (currentLocale !== defaultLocale) {\n localeStripped = rest.replace(\n new RegExp(\"^/\" + currentLocale + \"(?:/|$)\"),\n \"/\"\n );\n }\n const isVersionsIndex = localeStripped === \"/docs/versions\" || localeStripped === \"/docs/versions/\";\n const isDocPage = /^\\/docs(\\/|$)/.test(localeStripped) && !isVersionsIndex;\n const activeVersion = isDocPage && versionMatch ? versionMatch[1] || null : null;\n const versionHrefs = {};\n let latestHref;\n if (isDocPage) {\n latestHref = withBase(rest);\n for (let i = 0; i < versionSlugs.length; i++) {\n const slug = versionSlugs[i];\n if (slug) versionHrefs[slug] = withBase(\"/v/\" + slug + rest);\n }\n } else {\n latestHref = versionsPageUrl;\n for (let i = 0; i < versionSlugs.length; i++) {\n const slug = versionSlugs[i];\n if (slug) versionHrefs[slug] = versionsPageUrl;\n }\n }\n return { latestHref, versionHrefs, activeVersion };\n};\nfunction setActive(a,active){\na.classList.toggle(\"font-bold\",active);\na.classList.toggle(\"text-accent\",active);\na.classList.toggle(\"text-fg\",!active);\nif(active){a.setAttribute(\"aria-current\",\"page\");}else{a.removeAttribute(\"aria-current\");}\n}\nfunction setDisabled(a,disabled,unavailableLabel){\na.classList.toggle(\"hover:bg-accent/10\",!disabled);\na.classList.toggle(\"hover:underline\",!disabled);\na.classList.toggle(\"focus-visible:underline\",!disabled);\na.classList.toggle(\"text-muted/50\",disabled);\na.classList.toggle(\"cursor-not-allowed\",disabled);\na.classList.toggle(\"pointer-events-none\",disabled);\nif(disabled){\na.setAttribute(\"aria-disabled\",\"true\");\na.setAttribute(\"tabindex\",\"-1\");\na.setAttribute(\"title\",unavailableLabel);\na.classList.remove(\"font-bold\",\"text-accent\",\"text-fg\");\na.removeAttribute(\"aria-current\");\n}else{\na.removeAttribute(\"aria-disabled\");\na.removeAttribute(\"tabindex\");\na.removeAttribute(\"title\");\n}\n}\nfunction rewire(){\nvar articleEl=document.querySelector(\"[\"+ATTR+\"]\");\nvar hasAvailabilityData=articleEl!==null;\nvar unavailableSlugs=hasAvailabilityData?(articleEl.getAttribute(ATTR)||\"\").split(\",\").filter(Boolean):[];\nvar containers=document.querySelectorAll(\"[data-version-rewire]\");\nfor(var i=0;i<containers.length;i++){\nvar c=containers[i];\nvar config={base:c.getAttribute(\"data-base\")||\"\",defaultLocale:c.getAttribute(\"data-default-locale\")||\"\",trailingSlash:c.getAttribute(\"data-trailing-slash\")===\"true\",currentLocale:c.getAttribute(\"data-current-locale\")||\"\"};\nvar unavailableLabel=c.getAttribute(\"data-unavailable-label\")||\"\";\nvar versionAnchors=c.querySelectorAll(\"[data-version-slug]\");\nvar slugs=[];\nfor(var j=0;j<versionAnchors.length;j++){\nvar s=versionAnchors[j].getAttribute(\"data-version-slug\");\nif(s)slugs.push(s);\n}\nvar state=computeVersionSwitcherState(readCurrentPath(CURRENT_PATH_DATASET_KEY),config,slugs);\nvar latest=c.querySelector(\"[data-version-latest]\");\nif(latest){\nlatest.setAttribute(\"href\",state.latestHref);\nsetActive(latest,state.activeVersion===null);\n}\nfor(var k=0;k<versionAnchors.length;k++){\nvar a=versionAnchors[k];\nvar slug=a.getAttribute(\"data-version-slug\");\nif(!slug)continue;\nvar href=state.versionHrefs[slug];\nif(href!=null)a.setAttribute(\"href\",href);\nif(hasAvailabilityData){\nvar disabled=unavailableSlugs.indexOf(slug)!==-1;\nsetDisabled(a,disabled,unavailableLabel);\nif(!disabled)setActive(a,state.activeVersion===slug);\n}else{\nvar alreadyDisabled=a.getAttribute(\"aria-disabled\")===\"true\";\nif(!alreadyDisabled)setActive(a,state.activeVersion===slug);\n}\n}\nvar label=c.querySelector(\"[data-version-trigger-label]\");\nif(label){\nif(state.activeVersion===null){\nif(latest)label.textContent=latest.textContent;\n}else{\nvar activeLabel=null;\nfor(var m=0;m<versionAnchors.length;m++){\nif(versionAnchors[m].getAttribute(\"data-version-slug\")===state.activeVersion){activeLabel=versionAnchors[m].textContent;break;}\n}\nlabel.textContent=activeLabel!=null?activeLabel:state.activeVersion;\n}\n}\n}\n}\n// The initial call is deferred to DOMContentLoaded when the script (inline in\n// <header>, which parses before <article>) would otherwise run before the\n// article element exists. Running early would read a missing ATTR as \"no\n// unavailable slugs\" and clobber the SSR-correct disabled state with\n// everything-enabled \u2014 a first-paint variant of the bug this rewire exists\n// to fix (see the doc comment above; SSR already rendered the right state for\n// this page, so a brief deferral loses nothing).\nif(document.readyState===\"loading\"){document.addEventListener(\"DOMContentLoaded\",rewire);}else{rewire();}\ndocument.addEventListener(\"zfb:after-swap\",rewire);\n})();";
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
const LANGUAGE_SWITCHER_INIT_SCRIPT = `(function(){
|
|
2
|
+
var FLAG="__zdLanguageSwitcherInit";
|
|
3
|
+
var CURRENT_PATH_DATASET_KEY="zdCurrentPath";var readCurrentPath=function readCurrentPath(datasetKey, explicit) {
|
|
4
|
+
const override = typeof document === "undefined" ? void 0 : document.documentElement.dataset[datasetKey];
|
|
5
|
+
return explicit || override || (typeof window === "undefined" ? void 0 : window.location.pathname);
|
|
6
|
+
};
|
|
7
|
+
var switchLocaleHref=function switchLocaleHref(pathname, config, currentLang, targetLang) {
|
|
8
|
+
const normalizedBase = config.base;
|
|
9
|
+
const defaultLocale = config.defaultLocale;
|
|
10
|
+
const trailingSlash = config.trailingSlash;
|
|
11
|
+
const stripBase = (path) => {
|
|
12
|
+
if (normalizedBase === "") return path;
|
|
13
|
+
if (path === normalizedBase) return "/";
|
|
14
|
+
return path.indexOf(normalizedBase + "/") === 0 ? path.slice(normalizedBase.length) : path;
|
|
15
|
+
};
|
|
16
|
+
const applyTrailingSlash = (url) => {
|
|
17
|
+
if (!trailingSlash) return url;
|
|
18
|
+
if (url.charAt(url.length - 1) === "/") return url;
|
|
19
|
+
const suffixIdx = url.search(/[?#]/);
|
|
20
|
+
const pathPart = suffixIdx >= 0 ? url.slice(0, suffixIdx) : url;
|
|
21
|
+
const suffix = suffixIdx >= 0 ? url.slice(suffixIdx) : "";
|
|
22
|
+
if (pathPart.charAt(pathPart.length - 1) === "/") return url;
|
|
23
|
+
const segments = pathPart.split("/");
|
|
24
|
+
const lastSegment = segments[segments.length - 1] || "";
|
|
25
|
+
if (/\\.[a-zA-Z]\\w*$/.test(lastSegment)) return url;
|
|
26
|
+
return pathPart + "/" + suffix;
|
|
27
|
+
};
|
|
28
|
+
const withBase = (path) => {
|
|
29
|
+
const raw = normalizedBase === "" ? path : normalizedBase + (path.charAt(0) === "/" ? path : "/" + path);
|
|
30
|
+
return applyTrailingSlash(raw);
|
|
31
|
+
};
|
|
32
|
+
const stripped = stripBase(pathname);
|
|
33
|
+
const versionMatch = stripped.match(/^(\\/v\\/[^/]+)(\\/.*|$)/);
|
|
34
|
+
const versionPrefix = versionMatch ? versionMatch[1] || "" : "";
|
|
35
|
+
let relativePath = versionMatch ? versionMatch[2] || "/" : stripped;
|
|
36
|
+
if (currentLang !== defaultLocale) {
|
|
37
|
+
relativePath = relativePath.replace(
|
|
38
|
+
new RegExp("^/" + currentLang + "(?:/|$)"),
|
|
39
|
+
"/"
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
if (targetLang !== defaultLocale) {
|
|
43
|
+
relativePath = "/" + targetLang + relativePath;
|
|
44
|
+
}
|
|
45
|
+
return withBase(versionPrefix + relativePath);
|
|
46
|
+
};
|
|
47
|
+
function close(c,restoreFocus){
|
|
48
|
+
var toggle=c.querySelector("[data-language-toggle]");
|
|
49
|
+
var menu=c.querySelector("[data-language-menu]");
|
|
50
|
+
if(!toggle||!menu)return;
|
|
51
|
+
menu.classList.add("hidden");
|
|
52
|
+
toggle.setAttribute("aria-expanded","false");
|
|
53
|
+
if(restoreFocus)toggle.focus();
|
|
54
|
+
}
|
|
55
|
+
function refresh(){
|
|
56
|
+
var containers=document.querySelectorAll("[data-language-switcher]");
|
|
57
|
+
for(var i=0;i<containers.length;i++){
|
|
58
|
+
var c=containers[i];
|
|
59
|
+
close(c,false);
|
|
60
|
+
var menu=c.querySelector("[data-language-menu]");
|
|
61
|
+
if(menu){
|
|
62
|
+
menu.classList.remove("group-hover:block","group-focus-within:block");
|
|
63
|
+
}
|
|
64
|
+
if(!c.hasAttribute("data-default-locale"))continue;
|
|
65
|
+
var config={base:c.getAttribute("data-base")||"",defaultLocale:c.getAttribute("data-default-locale")||"",trailingSlash:c.getAttribute("data-trailing-slash")==="true"};
|
|
66
|
+
var currentLang=c.getAttribute("data-current-locale")||config.defaultLocale;
|
|
67
|
+
var anchors=c.querySelectorAll("a[lang]");
|
|
68
|
+
for(var j=0;j<anchors.length;j++){
|
|
69
|
+
var a=anchors[j];
|
|
70
|
+
var target=a.getAttribute("lang");
|
|
71
|
+
if(!target)continue;
|
|
72
|
+
a.setAttribute("href",switchLocaleHref(readCurrentPath(CURRENT_PATH_DATASET_KEY),config,currentLang,target));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if(window[FLAG]){window[FLAG]();return;}
|
|
77
|
+
window[FLAG]=refresh;
|
|
78
|
+
document.addEventListener("click",function(e){
|
|
79
|
+
var target=e.target;
|
|
80
|
+
var toggle=target&&target.closest?target.closest("[data-language-toggle]"):null;
|
|
81
|
+
if(toggle){
|
|
82
|
+
var switcher=toggle.closest("[data-language-switcher]");
|
|
83
|
+
if(switcher){
|
|
84
|
+
var menu=switcher.querySelector("[data-language-menu]");
|
|
85
|
+
var willOpen=toggle.getAttribute("aria-expanded")!=="true";
|
|
86
|
+
document.querySelectorAll("[data-language-switcher]").forEach(function(c){if(c!==switcher)close(c,false);});
|
|
87
|
+
if(menu){menu.classList.toggle("hidden",!willOpen);toggle.setAttribute("aria-expanded",String(willOpen));}
|
|
88
|
+
}
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
document.querySelectorAll("[data-language-switcher]").forEach(function(c){if(!c.contains(target))close(c,false);});
|
|
92
|
+
});
|
|
93
|
+
document.addEventListener("keydown",function(e){
|
|
94
|
+
if(e.key!=="Escape")return;
|
|
95
|
+
document.querySelectorAll('[data-language-toggle][aria-expanded="true"]').forEach(function(toggle){
|
|
96
|
+
var switcher=toggle.closest("[data-language-switcher]");
|
|
97
|
+
if(switcher)close(switcher,true);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
refresh();
|
|
101
|
+
document.addEventListener("zfb:after-swap",refresh);
|
|
102
|
+
})();`;
|
|
103
|
+
const VERSION_SWITCHER_REWIRE_SCRIPT = '(function(){\nvar FLAG="__zdVersionSwitcherRewire";\nif(window[FLAG])return;\nwindow[FLAG]=true;\nvar ATTR="data-doc-unavailable-versions";\nvar CURRENT_PATH_DATASET_KEY="zdCurrentPath";var readCurrentPath=function readCurrentPath(datasetKey, explicit) {\n const override = typeof document === "undefined" ? void 0 : document.documentElement.dataset[datasetKey];\n return explicit || override || (typeof window === "undefined" ? void 0 : window.location.pathname);\n};\nvar computeVersionSwitcherState=function computeVersionSwitcherState(pathname, config, versionSlugs) {\n const normalizedBase = config.base;\n const defaultLocale = config.defaultLocale;\n const currentLocale = config.currentLocale;\n const trailingSlash = config.trailingSlash;\n const stripBase = (path) => {\n if (normalizedBase === "") return path;\n if (path === normalizedBase) return "/";\n return path.indexOf(normalizedBase + "/") === 0 ? path.slice(normalizedBase.length) : path;\n };\n const applyTrailingSlash = (url) => {\n if (!trailingSlash) return url;\n if (url.charAt(url.length - 1) === "/") return url;\n const suffixIdx = url.search(/[?#]/);\n const pathPart = suffixIdx >= 0 ? url.slice(0, suffixIdx) : url;\n const suffix = suffixIdx >= 0 ? url.slice(suffixIdx) : "";\n if (pathPart.charAt(pathPart.length - 1) === "/") return url;\n const segments = pathPart.split("/");\n const lastSegment = segments[segments.length - 1] || "";\n if (/\\.[a-zA-Z]\\w*$/.test(lastSegment)) return url;\n return pathPart + "/" + suffix;\n };\n const withBase = (path) => {\n const raw = normalizedBase === "" ? path : normalizedBase + (path.charAt(0) === "/" ? path : "/" + path);\n return applyTrailingSlash(raw);\n };\n const versionsPageUrl = withBase(\n currentLocale === defaultLocale ? "/docs/versions" : "/" + currentLocale + "/docs/versions"\n );\n const stripped = stripBase(pathname);\n const versionMatch = stripped.match(/^\\/v\\/([^/]+)(\\/.*|$)/);\n const rest = versionMatch ? versionMatch[2] || "/" : stripped;\n let localeStripped = rest;\n if (currentLocale !== defaultLocale) {\n localeStripped = rest.replace(\n new RegExp("^/" + currentLocale + "(?:/|$)"),\n "/"\n );\n }\n const isVersionsIndex = localeStripped === "/docs/versions" || localeStripped === "/docs/versions/";\n const isDocPage = /^\\/docs(\\/|$)/.test(localeStripped) && !isVersionsIndex;\n const activeVersion = isDocPage && versionMatch ? versionMatch[1] || null : null;\n const versionHrefs = {};\n let latestHref;\n if (isDocPage) {\n latestHref = withBase(rest);\n for (let i = 0; i < versionSlugs.length; i++) {\n const slug = versionSlugs[i];\n if (slug) versionHrefs[slug] = withBase("/v/" + slug + rest);\n }\n } else {\n latestHref = versionsPageUrl;\n for (let i = 0; i < versionSlugs.length; i++) {\n const slug = versionSlugs[i];\n if (slug) versionHrefs[slug] = versionsPageUrl;\n }\n }\n return { latestHref, versionHrefs, activeVersion };\n};\nfunction setActive(a,active){\na.classList.toggle("font-bold",active);\na.classList.toggle("text-accent",active);\na.classList.toggle("text-fg",!active);\nif(active){a.setAttribute("aria-current","page");}else{a.removeAttribute("aria-current");}\n}\nfunction setDisabled(a,disabled,unavailableLabel){\na.classList.toggle("hover:bg-accent/10",!disabled);\na.classList.toggle("hover:underline",!disabled);\na.classList.toggle("focus-visible:underline",!disabled);\na.classList.toggle("text-muted/50",disabled);\na.classList.toggle("cursor-not-allowed",disabled);\na.classList.toggle("pointer-events-none",disabled);\nif(disabled){\na.setAttribute("aria-disabled","true");\na.setAttribute("tabindex","-1");\na.setAttribute("title",unavailableLabel);\na.classList.remove("font-bold","text-accent","text-fg");\na.removeAttribute("aria-current");\n}else{\na.removeAttribute("aria-disabled");\na.removeAttribute("tabindex");\na.removeAttribute("title");\n}\n}\nfunction rewire(){\nvar articleEl=document.querySelector("["+ATTR+"]");\nvar hasAvailabilityData=articleEl!==null;\nvar unavailableSlugs=hasAvailabilityData?(articleEl.getAttribute(ATTR)||"").split(",").filter(Boolean):[];\nvar containers=document.querySelectorAll("[data-version-rewire]");\nfor(var i=0;i<containers.length;i++){\nvar c=containers[i];\nvar config={base:c.getAttribute("data-base")||"",defaultLocale:c.getAttribute("data-default-locale")||"",trailingSlash:c.getAttribute("data-trailing-slash")==="true",currentLocale:c.getAttribute("data-current-locale")||""};\nvar unavailableLabel=c.getAttribute("data-unavailable-label")||"";\nvar versionAnchors=c.querySelectorAll("[data-version-slug]");\nvar slugs=[];\nfor(var j=0;j<versionAnchors.length;j++){\nvar s=versionAnchors[j].getAttribute("data-version-slug");\nif(s)slugs.push(s);\n}\nvar state=computeVersionSwitcherState(readCurrentPath(CURRENT_PATH_DATASET_KEY),config,slugs);\nvar latest=c.querySelector("[data-version-latest]");\nif(latest){\nlatest.setAttribute("href",state.latestHref);\nsetActive(latest,state.activeVersion===null);\n}\nfor(var k=0;k<versionAnchors.length;k++){\nvar a=versionAnchors[k];\nvar slug=a.getAttribute("data-version-slug");\nif(!slug)continue;\nvar href=state.versionHrefs[slug];\nif(href!=null)a.setAttribute("href",href);\nif(hasAvailabilityData){\nvar disabled=unavailableSlugs.indexOf(slug)!==-1;\nsetDisabled(a,disabled,unavailableLabel);\nif(!disabled)setActive(a,state.activeVersion===slug);\n}else{\nvar alreadyDisabled=a.getAttribute("aria-disabled")==="true";\nif(!alreadyDisabled)setActive(a,state.activeVersion===slug);\n}\n}\nvar label=c.querySelector("[data-version-trigger-label]");\nif(label){\nif(state.activeVersion===null){\nif(latest)label.textContent=latest.textContent;\n}else{\nvar activeLabel=null;\nfor(var m=0;m<versionAnchors.length;m++){\nif(versionAnchors[m].getAttribute("data-version-slug")===state.activeVersion){activeLabel=versionAnchors[m].textContent;break;}\n}\nlabel.textContent=activeLabel!=null?activeLabel:state.activeVersion;\n}\n}\n}\n}\n// The initial call is deferred to DOMContentLoaded when the script (inline in\n// <header>, which parses before <article>) would otherwise run before the\n// article element exists. Running early would read a missing ATTR as "no\n// unavailable slugs" and clobber the SSR-correct disabled state with\n// everything-enabled \u2014 a first-paint variant of the bug this rewire exists\n// to fix (see the doc comment above; SSR already rendered the right state for\n// this page, so a brief deferral loses nothing).\nif(document.readyState==="loading"){document.addEventListener("DOMContentLoaded",rewire);}else{rewire();}\ndocument.addEventListener("zfb:after-swap",rewire);\n})();';
|
|
104
|
+
export {
|
|
105
|
+
LANGUAGE_SWITCHER_INIT_SCRIPT,
|
|
106
|
+
VERSION_SWITCHER_REWIRE_SCRIPT
|
|
107
|
+
};
|