@nikala-ui/folio 0.13.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/LICENSE +20 -0
- package/README.md +221 -0
- package/dist/cli/commands/build.d.ts +5 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +28 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +7 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +33 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +359 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/preview.d.ts +7 -0
- package/dist/cli/commands/preview.d.ts.map +1 -0
- package/dist/cli/commands/preview.js +25 -0
- package/dist/cli/commands/preview.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +7 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +34 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +55 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/app-types.d.ts +18 -0
- package/dist/client/app-types.d.ts.map +1 -0
- package/dist/client/app-types.js +2 -0
- package/dist/client/app-types.js.map +1 -0
- package/dist/client/app.d.ts +5 -0
- package/dist/client/app.d.ts.map +1 -0
- package/dist/client/app.jsx +51 -0
- package/dist/client/app.jsx.map +1 -0
- package/dist/client/base.css +90 -0
- package/dist/client/components/docs-layout-shell.d.ts +23 -0
- package/dist/client/components/docs-layout-shell.d.ts.map +1 -0
- package/dist/client/components/docs-layout-shell.jsx +15 -0
- package/dist/client/components/docs-layout-shell.jsx.map +1 -0
- package/dist/client/components/docs-page-content.d.ts +9 -0
- package/dist/client/components/docs-page-content.d.ts.map +1 -0
- package/dist/client/components/docs-page-content.jsx +10 -0
- package/dist/client/components/docs-page-content.jsx.map +1 -0
- package/dist/client/entry.d.ts +2 -0
- package/dist/client/entry.d.ts.map +1 -0
- package/dist/client/entry.jsx +32 -0
- package/dist/client/entry.jsx.map +1 -0
- package/dist/client/index.html +23 -0
- package/dist/client/navigation/page-navigation.d.ts +9 -0
- package/dist/client/navigation/page-navigation.d.ts.map +1 -0
- package/dist/client/navigation/page-navigation.js +51 -0
- package/dist/client/navigation/page-navigation.js.map +1 -0
- package/dist/client/page-actions.d.ts +10 -0
- package/dist/client/page-actions.d.ts.map +1 -0
- package/dist/client/page-actions.js +63 -0
- package/dist/client/page-actions.js.map +1 -0
- package/dist/client/public/favicon.ico +0 -0
- package/dist/client/routing/use-docs-router.d.ts +17 -0
- package/dist/client/routing/use-docs-router.d.ts.map +1 -0
- package/dist/client/routing/use-docs-router.js +87 -0
- package/dist/client/routing/use-docs-router.js.map +1 -0
- package/dist/client/ssr-entry.d.ts +3 -0
- package/dist/client/ssr-entry.d.ts.map +1 -0
- package/dist/client/ssr-entry.jsx +13 -0
- package/dist/client/ssr-entry.jsx.map +1 -0
- package/dist/client/style.css +186 -0
- package/dist/client/utils/sidebar.d.ts +2 -0
- package/dist/client/utils/sidebar.d.ts.map +1 -0
- package/dist/client/utils/sidebar.js +2 -0
- package/dist/client/utils/sidebar.js.map +1 -0
- package/dist/components/mdx-components.d.ts +65 -0
- package/dist/components/mdx-components.d.ts.map +1 -0
- package/dist/components/mdx-components.jsx +133 -0
- package/dist/components/mdx-components.jsx.map +1 -0
- package/dist/components/ui/api-table.d.ts +29 -0
- package/dist/components/ui/api-table.d.ts.map +1 -0
- package/dist/components/ui/api-table.jsx +66 -0
- package/dist/components/ui/api-table.jsx.map +1 -0
- package/dist/components/ui/badge.d.ts +17 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/badge.jsx +33 -0
- package/dist/components/ui/badge.jsx.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts +51 -0
- package/dist/components/ui/breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb.jsx +62 -0
- package/dist/components/ui/breadcrumb.jsx.map +1 -0
- package/dist/components/ui/button.d.ts +19 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.jsx +54 -0
- package/dist/components/ui/button.jsx.map +1 -0
- package/dist/components/ui/callout.d.ts +21 -0
- package/dist/components/ui/callout.d.ts.map +1 -0
- package/dist/components/ui/callout.jsx +76 -0
- package/dist/components/ui/callout.jsx.map +1 -0
- package/dist/components/ui/card.d.ts +44 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/card.jsx +45 -0
- package/dist/components/ui/card.jsx.map +1 -0
- package/dist/components/ui/code-block.d.ts +23 -0
- package/dist/components/ui/code-block.d.ts.map +1 -0
- package/dist/components/ui/code-block.jsx +263 -0
- package/dist/components/ui/code-block.jsx.map +1 -0
- package/dist/components/ui/collapsible.d.ts +27 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/collapsible.jsx +29 -0
- package/dist/components/ui/collapsible.jsx.map +1 -0
- package/dist/components/ui/command.d.ts +57 -0
- package/dist/components/ui/command.d.ts.map +1 -0
- package/dist/components/ui/command.jsx +224 -0
- package/dist/components/ui/command.jsx.map +1 -0
- package/dist/components/ui/component-viewer.d.ts +33 -0
- package/dist/components/ui/component-viewer.d.ts.map +1 -0
- package/dist/components/ui/component-viewer.jsx +210 -0
- package/dist/components/ui/component-viewer.jsx.map +1 -0
- package/dist/components/ui/container.d.ts +13 -0
- package/dist/components/ui/container.d.ts.map +1 -0
- package/dist/components/ui/container.jsx +29 -0
- package/dist/components/ui/container.jsx.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +58 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/components/ui/dropdown-menu.jsx +112 -0
- package/dist/components/ui/dropdown-menu.jsx.map +1 -0
- package/dist/components/ui/input-group.d.ts +16 -0
- package/dist/components/ui/input-group.d.ts.map +1 -0
- package/dist/components/ui/input-group.jsx +33 -0
- package/dist/components/ui/input-group.jsx.map +1 -0
- package/dist/components/ui/kbd.d.ts +15 -0
- package/dist/components/ui/kbd.d.ts.map +1 -0
- package/dist/components/ui/kbd.jsx +42 -0
- package/dist/components/ui/kbd.jsx.map +1 -0
- package/dist/components/ui/list.d.ts +36 -0
- package/dist/components/ui/list.d.ts.map +1 -0
- package/dist/components/ui/list.jsx +131 -0
- package/dist/components/ui/list.jsx.map +1 -0
- package/dist/components/ui/logo.d.ts +9 -0
- package/dist/components/ui/logo.d.ts.map +1 -0
- package/dist/components/ui/logo.jsx +31 -0
- package/dist/components/ui/logo.jsx.map +1 -0
- package/dist/components/ui/navbar.d.ts +57 -0
- package/dist/components/ui/navbar.d.ts.map +1 -0
- package/dist/components/ui/navbar.jsx +174 -0
- package/dist/components/ui/navbar.jsx.map +1 -0
- package/dist/components/ui/package-manager-tabs.d.ts +21 -0
- package/dist/components/ui/package-manager-tabs.d.ts.map +1 -0
- package/dist/components/ui/package-manager-tabs.jsx +167 -0
- package/dist/components/ui/package-manager-tabs.jsx.map +1 -0
- package/dist/components/ui/pager.d.ts +27 -0
- package/dist/components/ui/pager.d.ts.map +1 -0
- package/dist/components/ui/pager.jsx +50 -0
- package/dist/components/ui/pager.jsx.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +9 -0
- package/dist/components/ui/scroll-area.d.ts.map +1 -0
- package/dist/components/ui/scroll-area.jsx +160 -0
- package/dist/components/ui/scroll-area.jsx.map +1 -0
- package/dist/components/ui/section-heading.d.ts +23 -0
- package/dist/components/ui/section-heading.d.ts.map +1 -0
- package/dist/components/ui/section-heading.jsx +82 -0
- package/dist/components/ui/section-heading.jsx.map +1 -0
- package/dist/components/ui/separator.d.ts +13 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/separator.jsx +16 -0
- package/dist/components/ui/separator.jsx.map +1 -0
- package/dist/components/ui/sidebar.d.ts +103 -0
- package/dist/components/ui/sidebar.d.ts.map +1 -0
- package/dist/components/ui/sidebar.jsx +315 -0
- package/dist/components/ui/sidebar.jsx.map +1 -0
- package/dist/components/ui/skeleton.d.ts +9 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeleton.jsx +11 -0
- package/dist/components/ui/skeleton.jsx.map +1 -0
- package/dist/components/ui/spinner.d.ts +11 -0
- package/dist/components/ui/spinner.d.ts.map +1 -0
- package/dist/components/ui/spinner.jsx +21 -0
- package/dist/components/ui/spinner.jsx.map +1 -0
- package/dist/components/ui/table-of-contents.d.ts +20 -0
- package/dist/components/ui/table-of-contents.d.ts.map +1 -0
- package/dist/components/ui/table-of-contents.jsx +77 -0
- package/dist/components/ui/table-of-contents.jsx.map +1 -0
- package/dist/components/ui/table.d.ts +58 -0
- package/dist/components/ui/table.d.ts.map +1 -0
- package/dist/components/ui/table.jsx +61 -0
- package/dist/components/ui/table.jsx.map +1 -0
- package/dist/components/ui/tabs.d.ts +42 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/tabs.jsx +93 -0
- package/dist/components/ui/tabs.jsx.map +1 -0
- package/dist/components/ui/theme-toggle.d.ts +19 -0
- package/dist/components/ui/theme-toggle.d.ts.map +1 -0
- package/dist/components/ui/theme-toggle.jsx +142 -0
- package/dist/components/ui/theme-toggle.jsx.map +1 -0
- package/dist/components/ui/tooltip.d.ts +10 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.jsx +18 -0
- package/dist/components/ui/tooltip.jsx.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +105 -0
- package/dist/config.js.map +1 -0
- package/dist/core/content-scanner.d.ts +10 -0
- package/dist/core/content-scanner.d.ts.map +1 -0
- package/dist/core/content-scanner.js +218 -0
- package/dist/core/content-scanner.js.map +1 -0
- package/dist/core/route-tree.d.ts +24 -0
- package/dist/core/route-tree.d.ts.map +1 -0
- package/dist/core/route-tree.js +221 -0
- package/dist/core/route-tree.js.map +1 -0
- package/dist/hooks/create-click-outside.d.ts +18 -0
- package/dist/hooks/create-click-outside.d.ts.map +1 -0
- package/dist/hooks/create-click-outside.js +55 -0
- package/dist/hooks/create-click-outside.js.map +1 -0
- package/dist/hooks/create-clipboard.d.ts +20 -0
- package/dist/hooks/create-clipboard.d.ts.map +1 -0
- package/dist/hooks/create-clipboard.js +48 -0
- package/dist/hooks/create-clipboard.js.map +1 -0
- package/dist/hooks/create-color-mode.d.ts +27 -0
- package/dist/hooks/create-color-mode.d.ts.map +1 -0
- package/dist/hooks/create-color-mode.js +86 -0
- package/dist/hooks/create-color-mode.js.map +1 -0
- package/dist/hooks/create-controllable-signal.d.ts +17 -0
- package/dist/hooks/create-controllable-signal.d.ts.map +1 -0
- package/dist/hooks/create-controllable-signal.js +35 -0
- package/dist/hooks/create-controllable-signal.js.map +1 -0
- package/dist/hooks/create-focus-trap.d.ts +15 -0
- package/dist/hooks/create-focus-trap.d.ts.map +1 -0
- package/dist/hooks/create-focus-trap.js +72 -0
- package/dist/hooks/create-focus-trap.js.map +1 -0
- package/dist/hooks/create-keybindings.d.ts +34 -0
- package/dist/hooks/create-keybindings.d.ts.map +1 -0
- package/dist/hooks/create-keybindings.js +113 -0
- package/dist/hooks/create-keybindings.js.map +1 -0
- package/dist/hooks/create-lock-scroll.d.ts +20 -0
- package/dist/hooks/create-lock-scroll.d.ts.map +1 -0
- package/dist/hooks/create-lock-scroll.js +77 -0
- package/dist/hooks/create-lock-scroll.js.map +1 -0
- package/dist/hooks/create-resize-observer.d.ts +27 -0
- package/dist/hooks/create-resize-observer.d.ts.map +1 -0
- package/dist/hooks/create-resize-observer.js +59 -0
- package/dist/hooks/create-resize-observer.js.map +1 -0
- package/dist/hooks/create-scroll-position.d.ts +29 -0
- package/dist/hooks/create-scroll-position.d.ts.map +1 -0
- package/dist/hooks/create-scroll-position.js +101 -0
- package/dist/hooks/create-scroll-position.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cn.d.ts +6 -0
- package/dist/lib/cn.d.ts.map +1 -0
- package/dist/lib/cn.js +9 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/mdx/compiler.d.ts +13 -0
- package/dist/mdx/compiler.d.ts.map +1 -0
- package/dist/mdx/compiler.js +38 -0
- package/dist/mdx/compiler.js.map +1 -0
- package/dist/mdx/highlighter.d.ts +22 -0
- package/dist/mdx/highlighter.d.ts.map +1 -0
- package/dist/mdx/highlighter.js +190 -0
- package/dist/mdx/highlighter.js.map +1 -0
- package/dist/mdx/rehype-shiki.d.ts +3 -0
- package/dist/mdx/rehype-shiki.d.ts.map +1 -0
- package/dist/mdx/rehype-shiki.js +83 -0
- package/dist/mdx/rehype-shiki.js.map +1 -0
- package/dist/navigation/index.d.ts +3 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +3 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/navigation/repository-links.d.ts +3 -0
- package/dist/navigation/repository-links.d.ts.map +1 -0
- package/dist/navigation/repository-links.js +35 -0
- package/dist/navigation/repository-links.js.map +1 -0
- package/dist/navigation/sidebar-state.d.ts +6 -0
- package/dist/navigation/sidebar-state.d.ts.map +1 -0
- package/dist/navigation/sidebar-state.js +20 -0
- package/dist/navigation/sidebar-state.js.map +1 -0
- package/dist/navigation/sidebar-tree.d.ts +7 -0
- package/dist/navigation/sidebar-tree.d.ts.map +1 -0
- package/dist/navigation/sidebar-tree.js +11 -0
- package/dist/navigation/sidebar-tree.js.map +1 -0
- package/dist/providers/theme-provider.d.ts +33 -0
- package/dist/providers/theme-provider.d.ts.map +1 -0
- package/dist/providers/theme-provider.jsx +158 -0
- package/dist/providers/theme-provider.jsx.map +1 -0
- package/dist/providers/theme-script.d.ts +16 -0
- package/dist/providers/theme-script.d.ts.map +1 -0
- package/dist/providers/theme-script.jsx +41 -0
- package/dist/providers/theme-script.jsx.map +1 -0
- package/dist/providers/theme-transitions.d.ts +12 -0
- package/dist/providers/theme-transitions.d.ts.map +1 -0
- package/dist/providers/theme-transitions.js +115 -0
- package/dist/providers/theme-transitions.js.map +1 -0
- package/dist/registry/api-table.json +21 -0
- package/dist/registry/badge.json +18 -0
- package/dist/registry/breadcrumb.json +17 -0
- package/dist/registry/button.json +21 -0
- package/dist/registry/callout.json +19 -0
- package/dist/registry/card.json +17 -0
- package/dist/registry/code-block.json +28 -0
- package/dist/registry/collapsible.json +18 -0
- package/dist/registry/command.json +27 -0
- package/dist/registry/component-viewer.json +25 -0
- package/dist/registry/container.json +18 -0
- package/dist/registry/create-click-outside.json +13 -0
- package/dist/registry/create-clipboard.json +13 -0
- package/dist/registry/create-color-mode.json +13 -0
- package/dist/registry/create-controllable-signal.json +13 -0
- package/dist/registry/create-focus-trap.json +13 -0
- package/dist/registry/create-keybindings.json +13 -0
- package/dist/registry/create-lock-scroll.json +13 -0
- package/dist/registry/create-resize-observer.json +13 -0
- package/dist/registry/create-scroll-position.json +13 -0
- package/dist/registry/dropdown-menu.json +22 -0
- package/dist/registry/input-group.json +21 -0
- package/dist/registry/kbd.json +18 -0
- package/dist/registry/list.json +20 -0
- package/dist/registry/logo.json +17 -0
- package/dist/registry/navbar.json +19 -0
- package/dist/registry/package-manager-tabs.json +24 -0
- package/dist/registry/pager.json +21 -0
- package/dist/registry/scroll-area.json +21 -0
- package/dist/registry/section-heading.json +21 -0
- package/dist/registry/separator.json +17 -0
- package/dist/registry/sidebar.json +24 -0
- package/dist/registry/skeleton.json +17 -0
- package/dist/registry/spinner.json +18 -0
- package/dist/registry/table-of-contents.json +23 -0
- package/dist/registry/table.json +17 -0
- package/dist/registry/tabs.json +20 -0
- package/dist/registry/theme-manager.json +39 -0
- package/dist/registry/tooltip.json +18 -0
- package/dist/search/provider.d.ts +14 -0
- package/dist/search/provider.d.ts.map +1 -0
- package/dist/search/provider.js +14 -0
- package/dist/search/provider.js.map +1 -0
- package/dist/server/index.d.ts +18 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +565 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/plugin.d.ts +10 -0
- package/dist/server/plugin.d.ts.map +1 -0
- package/dist/server/plugin.js +522 -0
- package/dist/server/plugin.js.map +1 -0
- package/dist/theme-accent.d.ts +8 -0
- package/dist/theme-accent.d.ts.map +1 -0
- package/dist/theme-accent.js +18 -0
- package/dist/theme-accent.js.map +1 -0
- package/dist/theme-mode.d.ts +4 -0
- package/dist/theme-mode.d.ts.map +1 -0
- package/dist/theme-mode.js +5 -0
- package/dist/theme-mode.js.map +1 -0
- package/dist/themes/default/content/breadcrumbs.d.ts +4 -0
- package/dist/themes/default/content/breadcrumbs.d.ts.map +1 -0
- package/dist/themes/default/content/breadcrumbs.jsx +31 -0
- package/dist/themes/default/content/breadcrumbs.jsx.map +1 -0
- package/dist/themes/default/content/pager.d.ts +5 -0
- package/dist/themes/default/content/pager.d.ts.map +1 -0
- package/dist/themes/default/content/pager.jsx +9 -0
- package/dist/themes/default/content/pager.jsx.map +1 -0
- package/dist/themes/default/content/table-of-contents.d.ts +4 -0
- package/dist/themes/default/content/table-of-contents.d.ts.map +1 -0
- package/dist/themes/default/content/table-of-contents.jsx +19 -0
- package/dist/themes/default/content/table-of-contents.jsx.map +1 -0
- package/dist/themes/default/icons.d.ts +3 -0
- package/dist/themes/default/icons.d.ts.map +1 -0
- package/dist/themes/default/icons.js +15 -0
- package/dist/themes/default/icons.js.map +1 -0
- package/dist/themes/default/index.d.ts +12 -0
- package/dist/themes/default/index.d.ts.map +1 -0
- package/dist/themes/default/index.js +30 -0
- package/dist/themes/default/index.js.map +1 -0
- package/dist/themes/default/layout.d.ts +4 -0
- package/dist/themes/default/layout.d.ts.map +1 -0
- package/dist/themes/default/layout.jsx +194 -0
- package/dist/themes/default/layout.jsx.map +1 -0
- package/dist/themes/default/navbar.d.ts +4 -0
- package/dist/themes/default/navbar.d.ts.map +1 -0
- package/dist/themes/default/navbar.jsx +83 -0
- package/dist/themes/default/navbar.jsx.map +1 -0
- package/dist/themes/default/navigation/mobile-table-of-contents.d.ts +4 -0
- package/dist/themes/default/navigation/mobile-table-of-contents.d.ts.map +1 -0
- package/dist/themes/default/navigation/mobile-table-of-contents.jsx +38 -0
- package/dist/themes/default/navigation/mobile-table-of-contents.jsx.map +1 -0
- package/dist/themes/default/navigation/sidebar-tree.d.ts +8 -0
- package/dist/themes/default/navigation/sidebar-tree.d.ts.map +1 -0
- package/dist/themes/default/navigation/sidebar-tree.jsx +124 -0
- package/dist/themes/default/navigation/sidebar-tree.jsx.map +1 -0
- package/dist/themes/default/overlays/search-dialog.d.ts +4 -0
- package/dist/themes/default/overlays/search-dialog.d.ts.map +1 -0
- package/dist/themes/default/overlays/search-dialog.jsx +52 -0
- package/dist/themes/default/overlays/search-dialog.jsx.map +1 -0
- package/dist/themes/default/sidebar.d.ts +4 -0
- package/dist/themes/default/sidebar.d.ts.map +1 -0
- package/dist/themes/default/sidebar.jsx +92 -0
- package/dist/themes/default/sidebar.jsx.map +1 -0
- package/dist/themes/index.d.ts +4 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +5 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/types.d.ts +91 -0
- package/dist/themes/types.d.ts.map +1 -0
- package/dist/themes/types.js +2 -0
- package/dist/themes/types.js.map +1 -0
- package/dist/types.d.ts +132 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/vendor/docs-src/components/mdx-components.tsx +144 -0
- package/dist/vendor/docs-src/components/ui/api-table.tsx +117 -0
- package/dist/vendor/docs-src/components/ui/badge.tsx +56 -0
- package/dist/vendor/docs-src/components/ui/breadcrumb.tsx +136 -0
- package/dist/vendor/docs-src/components/ui/button.tsx +82 -0
- package/dist/vendor/docs-src/components/ui/callout.tsx +137 -0
- package/dist/vendor/docs-src/components/ui/card.tsx +113 -0
- package/dist/vendor/docs-src/components/ui/code-block.tsx +347 -0
- package/dist/vendor/docs-src/components/ui/collapsible.tsx +73 -0
- package/dist/vendor/docs-src/components/ui/command.tsx +382 -0
- package/dist/vendor/docs-src/components/ui/component-viewer.tsx +363 -0
- package/dist/vendor/docs-src/components/ui/container.tsx +45 -0
- package/dist/vendor/docs-src/components/ui/dropdown-menu.tsx +298 -0
- package/dist/vendor/docs-src/components/ui/input-group.tsx +80 -0
- package/dist/vendor/docs-src/components/ui/kbd.tsx +73 -0
- package/dist/vendor/docs-src/components/ui/list.tsx +222 -0
- package/dist/vendor/docs-src/components/ui/logo.tsx +68 -0
- package/dist/vendor/docs-src/components/ui/navbar.tsx +375 -0
- package/dist/vendor/docs-src/components/ui/package-manager-tabs.tsx +226 -0
- package/dist/vendor/docs-src/components/ui/pager.tsx +102 -0
- package/dist/vendor/docs-src/components/ui/scroll-area.tsx +228 -0
- package/dist/vendor/docs-src/components/ui/section-heading.tsx +115 -0
- package/dist/vendor/docs-src/components/ui/separator.tsx +37 -0
- package/dist/vendor/docs-src/components/ui/sidebar.tsx +712 -0
- package/dist/vendor/docs-src/components/ui/skeleton.tsx +24 -0
- package/dist/vendor/docs-src/components/ui/spinner.tsx +41 -0
- package/dist/vendor/docs-src/components/ui/table-of-contents.tsx +131 -0
- package/dist/vendor/docs-src/components/ui/table.tsx +160 -0
- package/dist/vendor/docs-src/components/ui/tabs.tsx +204 -0
- package/dist/vendor/docs-src/components/ui/theme-toggle.tsx +238 -0
- package/dist/vendor/docs-src/components/ui/tooltip.tsx +41 -0
- package/dist/vendor/docs-src/hooks/create-click-outside.ts +82 -0
- package/dist/vendor/docs-src/hooks/create-clipboard.ts +69 -0
- package/dist/vendor/docs-src/hooks/create-color-mode.ts +115 -0
- package/dist/vendor/docs-src/hooks/create-controllable-signal.ts +56 -0
- package/dist/vendor/docs-src/hooks/create-focus-trap.ts +94 -0
- package/dist/vendor/docs-src/hooks/create-keybindings.ts +148 -0
- package/dist/vendor/docs-src/hooks/create-lock-scroll.ts +97 -0
- package/dist/vendor/docs-src/hooks/create-resize-observer.ts +89 -0
- package/dist/vendor/docs-src/hooks/create-scroll-position.ts +129 -0
- package/dist/vendor/docs-src/lib/cn.ts +9 -0
- package/dist/vendor/docs-src/providers/theme-provider.tsx +203 -0
- package/dist/vendor/docs-src/providers/theme-script.tsx +54 -0
- package/dist/vendor/docs-src/providers/theme-transitions.ts +139 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createSignal, onCleanup } from "solid-js";
|
|
2
|
+
/**
|
|
3
|
+
* SolidJS reactive primitive for copying text to clipboard with automatic reset state.
|
|
4
|
+
*
|
|
5
|
+
* @param options Configuration options including copied status reset timeout duration.
|
|
6
|
+
*/
|
|
7
|
+
export function createClipboard(options = {}) {
|
|
8
|
+
const timeoutDuration = options.timeout ?? 2000;
|
|
9
|
+
const [copied, setCopied] = createSignal(false);
|
|
10
|
+
const [error, setError] = createSignal(undefined);
|
|
11
|
+
let timer;
|
|
12
|
+
const clearTimer = () => {
|
|
13
|
+
if (timer) {
|
|
14
|
+
clearTimeout(timer);
|
|
15
|
+
timer = undefined;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const copy = async (text) => {
|
|
19
|
+
clearTimer();
|
|
20
|
+
setError(undefined);
|
|
21
|
+
try {
|
|
22
|
+
if (typeof window !== "undefined" && navigator.clipboard && navigator.clipboard.writeText) {
|
|
23
|
+
await navigator.clipboard.writeText(text);
|
|
24
|
+
setCopied(true);
|
|
25
|
+
timer = setTimeout(() => {
|
|
26
|
+
setCopied(false);
|
|
27
|
+
}, timeoutDuration);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
throw new Error("Clipboard API not supported");
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
const copyError = err instanceof Error ? err : new Error(String(err));
|
|
34
|
+
setError(copyError);
|
|
35
|
+
setCopied(false);
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
onCleanup(() => {
|
|
40
|
+
clearTimer();
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
copied,
|
|
44
|
+
copy,
|
|
45
|
+
error,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=create-clipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-clipboard.js","sourceRoot":"","sources":["../../src/hooks/create-clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAiB,MAAM,UAAU,CAAC;AAgBlE;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAO,GAA2B,EAAE;IAClE,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IAChD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAoB,SAAS,CAAC,CAAC;IACrE,IAAI,KAAgD,CAAC;IAErD,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,KAAK,EAAE,IAAY,EAAoB,EAAE;QACpD,UAAU,EAAE,CAAC;QACb,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEpB,IAAI,CAAC;YACH,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;gBAC1F,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC1C,SAAS,CAAC,IAAI,CAAC,CAAC;gBAEhB,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBACtB,SAAS,CAAC,KAAK,CAAC,CAAC;gBACnB,CAAC,EAAE,eAAe,CAAC,CAAC;gBAEpB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACtE,QAAQ,CAAC,SAAS,CAAC,CAAC;YACpB,SAAS,CAAC,KAAK,CAAC,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,MAAM;QACN,IAAI;QACJ,KAAK;KACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Accessor } from "solid-js";
|
|
2
|
+
export type ColorMode = "light" | "dark" | "system";
|
|
3
|
+
export interface CreateColorModeOptions {
|
|
4
|
+
/** Initial color mode fallback. Defaults to 'system'. */
|
|
5
|
+
initialValue?: ColorMode;
|
|
6
|
+
/** LocalStorage key for persisting color mode state. Defaults to 'nikala-color-mode'. */
|
|
7
|
+
storageKey?: string;
|
|
8
|
+
/** HTML attribute to apply dark mode class on document.documentElement. Defaults to 'class'. */
|
|
9
|
+
attribute?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface CreateColorModeReturn {
|
|
12
|
+
/** Accessor for current active color mode ('light', 'dark', 'system') */
|
|
13
|
+
mode: Accessor<ColorMode>;
|
|
14
|
+
/** Function to update current color mode */
|
|
15
|
+
setMode: (mode: ColorMode) => void;
|
|
16
|
+
/** Function to toggle color mode between 'light' and 'dark' */
|
|
17
|
+
toggleColorMode: () => void;
|
|
18
|
+
/** Accessor indicating if current resolved mode is dark */
|
|
19
|
+
isDark: Accessor<boolean>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* SolidJS reactive primitive for managing dark/light color mode themes and system preferences.
|
|
23
|
+
*
|
|
24
|
+
* @param options Configuration options including storage key and initial mode.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createColorMode(options?: CreateColorModeOptions): CreateColorModeReturn;
|
|
27
|
+
//# sourceMappingURL=create-color-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-color-mode.d.ts","sourceRoot":"","sources":["../../src/hooks/create-color-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkD,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzF,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEpD,MAAM,WAAW,sBAAsB;IACrC,yDAAyD;IACzD,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,yEAAyE;IACzE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1B,4CAA4C;IAC5C,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACnC,+DAA+D;IAC/D,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,2DAA2D;IAC3D,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CAmFvB"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { createEffect, createSignal, onCleanup, onMount } from "solid-js";
|
|
2
|
+
/**
|
|
3
|
+
* SolidJS reactive primitive for managing dark/light color mode themes and system preferences.
|
|
4
|
+
*
|
|
5
|
+
* @param options Configuration options including storage key and initial mode.
|
|
6
|
+
*/
|
|
7
|
+
export function createColorMode(options = {}) {
|
|
8
|
+
const initialMode = options.initialValue ?? "system";
|
|
9
|
+
const storageKey = options.storageKey ?? "nikala-color-mode";
|
|
10
|
+
const attribute = options.attribute ?? "class";
|
|
11
|
+
const [mode, setModeSignal] = createSignal(initialMode);
|
|
12
|
+
const [systemDark, setSystemDark] = createSignal(false);
|
|
13
|
+
const isDark = () => {
|
|
14
|
+
const currentMode = mode();
|
|
15
|
+
if (currentMode === "system")
|
|
16
|
+
return systemDark();
|
|
17
|
+
return currentMode === "dark";
|
|
18
|
+
};
|
|
19
|
+
const applyTheme = (dark) => {
|
|
20
|
+
if (typeof document === "undefined")
|
|
21
|
+
return;
|
|
22
|
+
const root = document.documentElement;
|
|
23
|
+
if (attribute === "class") {
|
|
24
|
+
if (dark)
|
|
25
|
+
root.classList.add("dark");
|
|
26
|
+
else
|
|
27
|
+
root.classList.remove("dark");
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
root.setAttribute(attribute, dark ? "dark" : "light");
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const setMode = (newMode) => {
|
|
34
|
+
setModeSignal(newMode);
|
|
35
|
+
if (typeof window !== "undefined") {
|
|
36
|
+
try {
|
|
37
|
+
localStorage.setItem(storageKey, newMode);
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
console.warn(`[nikala-ui/hooks] Error setting color mode storage:`, e);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const toggleColorMode = () => {
|
|
45
|
+
const next = isDark() ? "light" : "dark";
|
|
46
|
+
setMode(next);
|
|
47
|
+
};
|
|
48
|
+
createEffect(() => {
|
|
49
|
+
applyTheme(isDark());
|
|
50
|
+
});
|
|
51
|
+
onMount(() => {
|
|
52
|
+
if (typeof window === "undefined")
|
|
53
|
+
return;
|
|
54
|
+
// Check system preference
|
|
55
|
+
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
|
56
|
+
setSystemDark(mediaQuery.matches);
|
|
57
|
+
const handleMediaChange = (e) => {
|
|
58
|
+
setSystemDark(e.matches);
|
|
59
|
+
};
|
|
60
|
+
if (mediaQuery.addEventListener) {
|
|
61
|
+
mediaQuery.addEventListener("change", handleMediaChange);
|
|
62
|
+
}
|
|
63
|
+
// Check localStorage
|
|
64
|
+
try {
|
|
65
|
+
const stored = localStorage.getItem(storageKey);
|
|
66
|
+
if (stored && ["light", "dark", "system"].includes(stored)) {
|
|
67
|
+
setModeSignal(stored);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
console.warn(`[nikala-ui/hooks] Error reading color mode storage:`, e);
|
|
72
|
+
}
|
|
73
|
+
onCleanup(() => {
|
|
74
|
+
if (mediaQuery.removeEventListener) {
|
|
75
|
+
mediaQuery.removeEventListener("change", handleMediaChange);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
mode,
|
|
81
|
+
setMode,
|
|
82
|
+
toggleColorMode,
|
|
83
|
+
isDark,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=create-color-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-color-mode.js","sourceRoot":"","sources":["../../src/hooks/create-color-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Accessor } from "solid-js";
|
|
2
|
+
export interface CreateControllableSignalOptions<T> {
|
|
3
|
+
/** Controlled value accessor or raw value */
|
|
4
|
+
value?: Accessor<T | undefined> | T;
|
|
5
|
+
/** Uncontrolled default initial value */
|
|
6
|
+
defaultValue?: T;
|
|
7
|
+
/** Callback fired whenever the value changes */
|
|
8
|
+
onChange?: (value: T) => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* SolidJS reactive primitive for managing state supporting both controlled and uncontrolled modes.
|
|
12
|
+
*
|
|
13
|
+
* @param options Configuration options for value, defaultValue, and onChange callback.
|
|
14
|
+
* @returns A tuple containing [valueAccessor, setValueFunction].
|
|
15
|
+
*/
|
|
16
|
+
export declare function createControllableSignal<T>(options: CreateControllableSignalOptions<T>): [Accessor<T | undefined>, (nextValue: T | ((prev: T | undefined) => T)) => void];
|
|
17
|
+
//# sourceMappingURL=create-controllable-signal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-controllable-signal.d.ts","sourceRoot":"","sources":["../../src/hooks/create-controllable-signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEvD,MAAM,WAAW,+BAA+B,CAAC,CAAC;IAChD,6CAA6C;IAC7C,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IACpC,yCAAyC;IACzC,YAAY,CAAC,EAAE,CAAC,CAAC;IACjB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EACxC,OAAO,EAAE,+BAA+B,CAAC,CAAC,CAAC,GAC1C,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAoClF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createSignal } from "solid-js";
|
|
2
|
+
/**
|
|
3
|
+
* SolidJS reactive primitive for managing state supporting both controlled and uncontrolled modes.
|
|
4
|
+
*
|
|
5
|
+
* @param options Configuration options for value, defaultValue, and onChange callback.
|
|
6
|
+
* @returns A tuple containing [valueAccessor, setValueFunction].
|
|
7
|
+
*/
|
|
8
|
+
export function createControllableSignal(options) {
|
|
9
|
+
const [internalValue, setInternalValue] = createSignal(options.defaultValue);
|
|
10
|
+
const getValue = () => {
|
|
11
|
+
if (typeof options.value === "function") {
|
|
12
|
+
return options.value();
|
|
13
|
+
}
|
|
14
|
+
return options.value;
|
|
15
|
+
};
|
|
16
|
+
const isControlled = () => getValue() !== undefined;
|
|
17
|
+
const value = () => {
|
|
18
|
+
const controlledVal = getValue();
|
|
19
|
+
return controlledVal !== undefined ? controlledVal : internalValue();
|
|
20
|
+
};
|
|
21
|
+
const setValue = (nextValue) => {
|
|
22
|
+
const current = value();
|
|
23
|
+
const resolvedNext = typeof nextValue === "function"
|
|
24
|
+
? nextValue(current)
|
|
25
|
+
: nextValue;
|
|
26
|
+
if (!isControlled()) {
|
|
27
|
+
setInternalValue(resolvedNext);
|
|
28
|
+
}
|
|
29
|
+
if (typeof options.onChange === "function") {
|
|
30
|
+
options.onChange(resolvedNext);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
return [value, setValue];
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=create-controllable-signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-controllable-signal.js","sourceRoot":"","sources":["../../src/hooks/create-controllable-signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAiB,MAAM,UAAU,CAAC;AAWvD;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAA2C;IAE3C,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,YAAY,CACpD,OAAO,CAAC,YAAY,CACrB,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAkB,EAAE;QACnC,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACxC,OAAQ,OAAO,CAAC,KAAiC,EAAE,CAAC;QACtD,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,SAAS,CAAC;IAEpD,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,MAAM,aAAa,GAAG,QAAQ,EAAE,CAAC;QACjC,OAAO,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACvE,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,SAA2C,EAAE,EAAE;QAC/D,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;QACxB,MAAM,YAAY,GAChB,OAAO,SAAS,KAAK,UAAU;YAC7B,CAAC,CAAE,SAAwC,CAAC,OAAO,CAAC;YACpD,CAAC,CAAC,SAAS,CAAC;QAEhB,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACpB,gBAAgB,CAAC,YAAmB,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Accessor } from "solid-js";
|
|
2
|
+
export interface CreateFocusTrapOptions {
|
|
3
|
+
/** Whether focus trap is actively enabled. Defaults to true. */
|
|
4
|
+
enabled?: boolean | Accessor<boolean>;
|
|
5
|
+
/** Whether to return focus to previously focused element on cleanup. Defaults to true. */
|
|
6
|
+
returnFocusOnDeactivate?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* SolidJS reactive primitive for trapping keyboard focus inside target container element.
|
|
10
|
+
*
|
|
11
|
+
* @param target Target element or accessor returning HTML element.
|
|
12
|
+
* @param options Configuration options for focus trap behavior.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createFocusTrap(target: HTMLElement | Accessor<HTMLElement | undefined>, options?: CreateFocusTrapOptions): void;
|
|
15
|
+
//# sourceMappingURL=create-focus-trap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-focus-trap.d.ts","sourceRoot":"","sources":["../../src/hooks/create-focus-trap.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAElE,MAAM,WAAW,sBAAsB;IACrC,gEAAgE;IAChE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtC,0FAA0F;IAC1F,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAKD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,EACvD,OAAO,GAAE,sBAA2B,GACnC,IAAI,CAwEN"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createEffect, onCleanup } from "solid-js";
|
|
2
|
+
const FOCUSABLE_SELECTOR = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex]:not([tabindex="-1"]), [contenteditable]';
|
|
3
|
+
/**
|
|
4
|
+
* SolidJS reactive primitive for trapping keyboard focus inside target container element.
|
|
5
|
+
*
|
|
6
|
+
* @param target Target element or accessor returning HTML element.
|
|
7
|
+
* @param options Configuration options for focus trap behavior.
|
|
8
|
+
*/
|
|
9
|
+
export function createFocusTrap(target, options = {}) {
|
|
10
|
+
const getTarget = () => {
|
|
11
|
+
if (typeof target === "function") {
|
|
12
|
+
return target();
|
|
13
|
+
}
|
|
14
|
+
return target;
|
|
15
|
+
};
|
|
16
|
+
const isEnabled = () => {
|
|
17
|
+
if (typeof options.enabled === "function") {
|
|
18
|
+
return options.enabled();
|
|
19
|
+
}
|
|
20
|
+
return options.enabled ?? true;
|
|
21
|
+
};
|
|
22
|
+
createEffect(() => {
|
|
23
|
+
if (typeof window === "undefined" || !isEnabled())
|
|
24
|
+
return;
|
|
25
|
+
const container = getTarget();
|
|
26
|
+
if (!container)
|
|
27
|
+
return;
|
|
28
|
+
const previousActiveElement = document.activeElement;
|
|
29
|
+
const getFocusableElements = () => {
|
|
30
|
+
return Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR)).filter((el) => el.offsetWidth > 0 || el.offsetHeight > 0 || el.getClientRects().length > 0);
|
|
31
|
+
};
|
|
32
|
+
const focusable = getFocusableElements();
|
|
33
|
+
if (focusable.length > 0) {
|
|
34
|
+
focusable[0].focus();
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
container.focus();
|
|
38
|
+
}
|
|
39
|
+
const handleKeyDown = (event) => {
|
|
40
|
+
if (event.key !== "Tab")
|
|
41
|
+
return;
|
|
42
|
+
const elements = getFocusableElements();
|
|
43
|
+
if (elements.length === 0) {
|
|
44
|
+
event.preventDefault();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const firstElement = elements[0];
|
|
48
|
+
const lastElement = elements[elements.length - 1];
|
|
49
|
+
const activeElement = document.activeElement;
|
|
50
|
+
if (event.shiftKey) {
|
|
51
|
+
if (activeElement === firstElement || !container.contains(activeElement)) {
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
lastElement.focus();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
if (activeElement === lastElement || !container.contains(activeElement)) {
|
|
58
|
+
event.preventDefault();
|
|
59
|
+
firstElement.focus();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
64
|
+
onCleanup(() => {
|
|
65
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
66
|
+
if (options.returnFocusOnDeactivate !== false && previousActiveElement) {
|
|
67
|
+
previousActiveElement.focus?.();
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=create-focus-trap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-focus-trap.js","sourceRoot":"","sources":["../../src/hooks/create-focus-trap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type Accessor } from "solid-js";
|
|
2
|
+
export interface KeybindingDefinition {
|
|
3
|
+
/** Key combination string, e.g. "meta+k", "ctrl+k", "Escape", "Shift+Enter" */
|
|
4
|
+
key: string | string[];
|
|
5
|
+
/** Callback handler invoked when the key combination is triggered */
|
|
6
|
+
handler: (event: KeyboardEvent) => void;
|
|
7
|
+
/** Whether to prevent default browser action. Defaults to false. */
|
|
8
|
+
preventDefault?: boolean;
|
|
9
|
+
/** Whether to stop event propagation. Defaults to false. */
|
|
10
|
+
stopPropagation?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface CreateKeybindingsOptions {
|
|
13
|
+
/** Event target to attach listener to. Defaults to window. */
|
|
14
|
+
target?: HTMLElement | Window | Accessor<HTMLElement | Window | undefined>;
|
|
15
|
+
/** Event type: "keydown" (default) or "keyup" */
|
|
16
|
+
eventType?: "keydown" | "keyup";
|
|
17
|
+
/** Whether keybinding listeners are active. Defaults to true. */
|
|
18
|
+
enabled?: boolean | Accessor<boolean>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* SolidJS reactive primitive for listening to single or multiple keyboard shortcuts.
|
|
22
|
+
*
|
|
23
|
+
* @param bindings Array of keybinding definitions or single definition object.
|
|
24
|
+
* @param options Configuration options including target, event type, and enabled state.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createKeybindings(bindings: KeybindingDefinition | KeybindingDefinition[], options?: CreateKeybindingsOptions): void;
|
|
27
|
+
/**
|
|
28
|
+
* SolidJS primitive specialized for handling Escape key presses.
|
|
29
|
+
*
|
|
30
|
+
* @param handler Callback invoked when Escape key is pressed.
|
|
31
|
+
* @param options Keybindings options.
|
|
32
|
+
*/
|
|
33
|
+
export declare function createEscapeKey(handler: (event: KeyboardEvent) => void, options?: CreateKeybindingsOptions): void;
|
|
34
|
+
//# sourceMappingURL=create-keybindings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-keybindings.d.ts","sourceRoot":"","sources":["../../src/hooks/create-keybindings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACnC,+EAA+E;IAC/E,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,qEAAqE;IACrE,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACxC,oEAAoE;IACpE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4DAA4D;IAC5D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,8DAA8D;IAC9D,MAAM,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3E,iDAAiD;IACjD,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAChC,iEAAiE;IACjE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;CACvC;AA4CD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,oBAAoB,GAAG,oBAAoB,EAAE,EACvD,OAAO,GAAE,wBAA6B,GACrC,IAAI,CAsDN;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,EACvC,OAAO,GAAE,wBAA6B,GACrC,IAAI,CASN"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { onMount, onCleanup } from "solid-js";
|
|
2
|
+
/**
|
|
3
|
+
* Normalizes key string into standardized combination signature (e.g. "ctrl+meta+k").
|
|
4
|
+
*/
|
|
5
|
+
function normalizeKeyCombination(keyStr) {
|
|
6
|
+
const parts = keyStr.toLowerCase().split("+").map((p) => p.trim());
|
|
7
|
+
const modifiers = new Set();
|
|
8
|
+
let mainKey = "";
|
|
9
|
+
for (const part of parts) {
|
|
10
|
+
if (part === "meta" || part === "cmd" || part === "command" || part === "⌘") {
|
|
11
|
+
modifiers.add("meta");
|
|
12
|
+
}
|
|
13
|
+
else if (part === "ctrl" || part === "control") {
|
|
14
|
+
modifiers.add("ctrl");
|
|
15
|
+
}
|
|
16
|
+
else if (part === "alt" || part === "option" || part === "⌥") {
|
|
17
|
+
modifiers.add("alt");
|
|
18
|
+
}
|
|
19
|
+
else if (part === "shift" || part === "⇧") {
|
|
20
|
+
modifiers.add("shift");
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
mainKey = part;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const sortedMods = Array.from(modifiers).sort();
|
|
27
|
+
return [...sortedMods, mainKey].join("+");
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Checks if a KeyboardEvent matches a normalized key combination.
|
|
31
|
+
*/
|
|
32
|
+
function isEventMatch(event, targetCombination) {
|
|
33
|
+
const modifiers = new Set();
|
|
34
|
+
if (event.metaKey)
|
|
35
|
+
modifiers.add("meta");
|
|
36
|
+
if (event.ctrlKey)
|
|
37
|
+
modifiers.add("ctrl");
|
|
38
|
+
if (event.altKey)
|
|
39
|
+
modifiers.add("alt");
|
|
40
|
+
if (event.shiftKey)
|
|
41
|
+
modifiers.add("shift");
|
|
42
|
+
const mainKey = event.key.toLowerCase();
|
|
43
|
+
const eventCombination = [...Array.from(modifiers).sort(), mainKey].join("+");
|
|
44
|
+
return eventCombination === targetCombination;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* SolidJS reactive primitive for listening to single or multiple keyboard shortcuts.
|
|
48
|
+
*
|
|
49
|
+
* @param bindings Array of keybinding definitions or single definition object.
|
|
50
|
+
* @param options Configuration options including target, event type, and enabled state.
|
|
51
|
+
*/
|
|
52
|
+
export function createKeybindings(bindings, options = {}) {
|
|
53
|
+
const bindingList = Array.isArray(bindings) ? bindings : [bindings];
|
|
54
|
+
const isEnabled = () => {
|
|
55
|
+
if (typeof options.enabled === "function") {
|
|
56
|
+
return options.enabled();
|
|
57
|
+
}
|
|
58
|
+
return options.enabled ?? true;
|
|
59
|
+
};
|
|
60
|
+
const getTargetElement = () => {
|
|
61
|
+
if (!options.target) {
|
|
62
|
+
return typeof window !== "undefined" ? window : undefined;
|
|
63
|
+
}
|
|
64
|
+
if (typeof options.target === "function") {
|
|
65
|
+
return options.target();
|
|
66
|
+
}
|
|
67
|
+
return options.target;
|
|
68
|
+
};
|
|
69
|
+
const handleKeyboardEvent = (event) => {
|
|
70
|
+
if (!isEnabled())
|
|
71
|
+
return;
|
|
72
|
+
for (const binding of bindingList) {
|
|
73
|
+
const keys = Array.isArray(binding.key) ? binding.key : [binding.key];
|
|
74
|
+
for (const keyCombo of keys) {
|
|
75
|
+
const normalizedCombo = normalizeKeyCombination(keyCombo);
|
|
76
|
+
if (isEventMatch(event, normalizedCombo)) {
|
|
77
|
+
if (binding.preventDefault) {
|
|
78
|
+
event.preventDefault();
|
|
79
|
+
}
|
|
80
|
+
if (binding.stopPropagation) {
|
|
81
|
+
event.stopPropagation();
|
|
82
|
+
}
|
|
83
|
+
binding.handler(event);
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
onMount(() => {
|
|
90
|
+
const target = getTargetElement();
|
|
91
|
+
if (!target)
|
|
92
|
+
return;
|
|
93
|
+
const eventType = options.eventType || "keydown";
|
|
94
|
+
target.addEventListener(eventType, handleKeyboardEvent);
|
|
95
|
+
onCleanup(() => {
|
|
96
|
+
target.removeEventListener(eventType, handleKeyboardEvent);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* SolidJS primitive specialized for handling Escape key presses.
|
|
102
|
+
*
|
|
103
|
+
* @param handler Callback invoked when Escape key is pressed.
|
|
104
|
+
* @param options Keybindings options.
|
|
105
|
+
*/
|
|
106
|
+
export function createEscapeKey(handler, options = {}) {
|
|
107
|
+
createKeybindings({
|
|
108
|
+
key: "Escape",
|
|
109
|
+
handler,
|
|
110
|
+
preventDefault: true,
|
|
111
|
+
}, options);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=create-keybindings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-keybindings.js","sourceRoot":"","sources":["../../src/hooks/create-keybindings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Accessor } from "solid-js";
|
|
2
|
+
export interface CreateLockScrollOptions {
|
|
3
|
+
/** Target element to lock scroll for. Defaults to document.body. */
|
|
4
|
+
target?: HTMLElement | Accessor<HTMLElement | undefined>;
|
|
5
|
+
/** Initial lock state. Defaults to true. */
|
|
6
|
+
enabled?: boolean | Accessor<boolean>;
|
|
7
|
+
}
|
|
8
|
+
export interface CreateLockScrollReturn {
|
|
9
|
+
/** Accessor indicating whether scroll is currently locked */
|
|
10
|
+
isLocked: Accessor<boolean>;
|
|
11
|
+
/** Setter function to programmatically lock or unlock scroll */
|
|
12
|
+
setLocked: (locked: boolean) => void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* SolidJS reactive primitive for locking target element (or document.body) scroll.
|
|
16
|
+
*
|
|
17
|
+
* @param options Configuration options including target element and initial enabled state.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createLockScroll(options?: CreateLockScrollOptions): CreateLockScrollReturn;
|
|
20
|
+
//# sourceMappingURL=create-lock-scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-lock-scroll.d.ts","sourceRoot":"","sources":["../../src/hooks/create-lock-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEhF,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IACzD,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5B,gEAAgE;IAChE,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,sBAAsB,CA2E9F"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { createEffect, createSignal, onCleanup } from "solid-js";
|
|
2
|
+
/**
|
|
3
|
+
* SolidJS reactive primitive for locking target element (or document.body) scroll.
|
|
4
|
+
*
|
|
5
|
+
* @param options Configuration options including target element and initial enabled state.
|
|
6
|
+
*/
|
|
7
|
+
export function createLockScroll(options = {}) {
|
|
8
|
+
const [internalLocked, setInternalLocked] = createSignal(false);
|
|
9
|
+
const getTarget = () => {
|
|
10
|
+
if (typeof window === "undefined")
|
|
11
|
+
return undefined;
|
|
12
|
+
if (!options.target) {
|
|
13
|
+
return document.body;
|
|
14
|
+
}
|
|
15
|
+
if (typeof options.target === "function") {
|
|
16
|
+
return options.target();
|
|
17
|
+
}
|
|
18
|
+
return options.target;
|
|
19
|
+
};
|
|
20
|
+
const isEnabled = () => {
|
|
21
|
+
if (typeof options.enabled === "function") {
|
|
22
|
+
return options.enabled();
|
|
23
|
+
}
|
|
24
|
+
return options.enabled ?? true;
|
|
25
|
+
};
|
|
26
|
+
let originalOverflow;
|
|
27
|
+
const applyLock = (element) => {
|
|
28
|
+
if (originalOverflow === undefined) {
|
|
29
|
+
originalOverflow = element.style.overflow;
|
|
30
|
+
}
|
|
31
|
+
element.style.overflow = "hidden";
|
|
32
|
+
setInternalLocked(true);
|
|
33
|
+
};
|
|
34
|
+
const removeLock = (element) => {
|
|
35
|
+
if (originalOverflow !== undefined) {
|
|
36
|
+
element.style.overflow = originalOverflow;
|
|
37
|
+
originalOverflow = undefined;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
element.style.overflow = "";
|
|
41
|
+
}
|
|
42
|
+
setInternalLocked(false);
|
|
43
|
+
};
|
|
44
|
+
createEffect(() => {
|
|
45
|
+
const el = getTarget();
|
|
46
|
+
if (!el)
|
|
47
|
+
return;
|
|
48
|
+
if (isEnabled()) {
|
|
49
|
+
applyLock(el);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
removeLock(el);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
onCleanup(() => {
|
|
56
|
+
const el = getTarget();
|
|
57
|
+
if (el) {
|
|
58
|
+
removeLock(el);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
const setLocked = (locked) => {
|
|
62
|
+
const el = getTarget();
|
|
63
|
+
if (!el)
|
|
64
|
+
return;
|
|
65
|
+
if (locked) {
|
|
66
|
+
applyLock(el);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
removeLock(el);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
isLocked: internalLocked,
|
|
74
|
+
setLocked,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=create-lock-scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-lock-scroll.js","sourceRoot":"","sources":["../../src/hooks/create-lock-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAiB,MAAM,UAAU,CAAC;AAgBhF;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAO,GAA4B,EAAE;IACpE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAEhE,MAAM,SAAS,GAAG,GAA4B,EAAE;QAC9C,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,SAAS,CAAC;QAEpD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QACD,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACzC,OAAQ,OAAO,CAAC,MAA4C,EAAE,CAAC;QACjE,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAY,EAAE;QAC9B,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAC1C,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IACjC,CAAC,CAAC;IAEF,IAAI,gBAAoC,CAAC;IAEzC,MAAM,SAAS,GAAG,CAAC,OAAoB,EAAE,EAAE;QACzC,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAClC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAE,EAAE;QAC1C,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,gBAAgB,CAAC;YAC1C,gBAAgB,GAAG,SAAS,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;QAC9B,CAAC;QACD,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,YAAY,CAAC,GAAG,EAAE;QAChB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,IAAI,CAAC,EAAE;YAAE,OAAO;QAEhB,IAAI,SAAS,EAAE,EAAE,CAAC;YAChB,SAAS,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,IAAI,EAAE,EAAE,CAAC;YACP,UAAU,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,CAAC,MAAe,EAAE,EAAE;QACpC,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,IAAI,CAAC,EAAE;YAAE,OAAO;QAEhB,IAAI,MAAM,EAAE,CAAC;YACX,SAAS,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,cAAc;QACxB,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Accessor } from "solid-js";
|
|
2
|
+
export interface CreateResizeObserverOptions extends ResizeObserverOptions {
|
|
3
|
+
/** Whether the observer is active. Defaults to true. */
|
|
4
|
+
enabled?: boolean | Accessor<boolean>;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* SolidJS reactive primitive for observing element size changes via ResizeObserver.
|
|
8
|
+
*
|
|
9
|
+
* @param target Target element or accessor returning HTML element.
|
|
10
|
+
* @param callback Observer callback invoked on element resize events.
|
|
11
|
+
* @param options ResizeObserver options (box, enabled).
|
|
12
|
+
*/
|
|
13
|
+
export declare function createResizeObserver(target: HTMLElement | Accessor<HTMLElement | undefined>, callback: ResizeObserverCallback, options?: CreateResizeObserverOptions): void;
|
|
14
|
+
export interface CreateElementSizeReturn {
|
|
15
|
+
/** Accessor for element width in pixels */
|
|
16
|
+
width: Accessor<number>;
|
|
17
|
+
/** Accessor for element height in pixels */
|
|
18
|
+
height: Accessor<number>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* SolidJS reactive primitive returning width and height accessors for a target HTML element.
|
|
22
|
+
*
|
|
23
|
+
* @param target Target element or accessor returning HTML element.
|
|
24
|
+
* @param options ResizeObserver options.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createElementSize(target: HTMLElement | Accessor<HTMLElement | undefined>, options?: CreateResizeObserverOptions): CreateElementSizeReturn;
|
|
27
|
+
//# sourceMappingURL=create-resize-observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-resize-observer.d.ts","sourceRoot":"","sources":["../../src/hooks/create-resize-observer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEhF,MAAM,WAAW,2BAA4B,SAAQ,qBAAqB;IACxE,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;CACvC;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,EACvD,QAAQ,EAAE,sBAAsB,EAChC,OAAO,GAAE,2BAAgC,GACxC,IAAI,CAgCN;AAED,MAAM,WAAW,uBAAuB;IACtC,2CAA2C;IAC3C,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxB,4CAA4C;IAC5C,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,EACvD,OAAO,GAAE,2BAAgC,GACxC,uBAAuB,CAoBzB"}
|