@work-rjkashyap/unified-ui 0.3.3 → 0.3.5
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 +105 -0
- package/LICENSE +21 -0
- package/dist/components/accordion.cjs +225 -0
- package/dist/components/accordion.d.cts +157 -0
- package/dist/components/accordion.d.ts +157 -0
- package/dist/components/accordion.mjs +199 -0
- package/dist/components/alert-dialog.cjs +246 -0
- package/dist/components/alert-dialog.d.cts +61 -0
- package/dist/components/alert-dialog.d.ts +61 -0
- package/dist/components/alert-dialog.mjs +218 -0
- package/dist/components/alert.cjs +401 -0
- package/dist/components/alert.d.cts +217 -0
- package/dist/components/alert.d.ts +217 -0
- package/dist/components/alert.mjs +374 -0
- package/dist/components/aspect-ratio.cjs +45 -0
- package/dist/components/aspect-ratio.d.cts +10 -0
- package/dist/components/aspect-ratio.d.ts +10 -0
- package/dist/components/aspect-ratio.mjs +23 -0
- package/dist/components/avatar.cjs +348 -0
- package/dist/components/avatar.d.cts +198 -0
- package/dist/components/avatar.d.ts +198 -0
- package/dist/components/avatar.mjs +329 -0
- package/dist/components/badge.cjs +325 -0
- package/dist/components/badge.d.cts +259 -0
- package/dist/components/badge.d.ts +259 -0
- package/dist/components/badge.mjs +298 -0
- package/dist/components/banner.cjs +147 -0
- package/dist/components/banner.d.cts +31 -0
- package/dist/components/banner.d.ts +31 -0
- package/dist/components/banner.mjs +122 -0
- package/dist/components/breadcrumb.cjs +266 -0
- package/dist/components/breadcrumb.d.cts +159 -0
- package/dist/components/breadcrumb.d.ts +159 -0
- package/dist/components/breadcrumb.mjs +235 -0
- package/dist/components/button.cjs +254 -0
- package/dist/components/button.d.cts +126 -0
- package/dist/components/button.d.ts +126 -0
- package/dist/components/button.mjs +229 -0
- package/dist/components/calendar.cjs +511 -0
- package/dist/components/calendar.d.cts +94 -0
- package/dist/components/calendar.d.ts +94 -0
- package/dist/components/calendar.mjs +492 -0
- package/dist/components/card.cjs +234 -0
- package/dist/components/card.d.cts +190 -0
- package/dist/components/card.d.ts +190 -0
- package/dist/components/card.mjs +210 -0
- package/dist/components/carousel.cjs +234 -0
- package/dist/components/carousel.d.cts +30 -0
- package/dist/components/carousel.d.ts +30 -0
- package/dist/components/carousel.mjs +217 -0
- package/dist/components/chart.cjs +122 -0
- package/dist/components/chart.d.cts +103 -0
- package/dist/components/chart.d.ts +103 -0
- package/dist/components/chart.mjs +96 -0
- package/dist/components/checkbox.cjs +318 -0
- package/dist/components/checkbox.d.cts +182 -0
- package/dist/components/checkbox.d.ts +182 -0
- package/dist/components/checkbox.mjs +296 -0
- package/dist/components/code-highlight.cjs +335 -0
- package/dist/components/code-highlight.d.cts +18 -0
- package/dist/components/code-highlight.d.ts +18 -0
- package/dist/components/code-highlight.mjs +308 -0
- package/dist/components/code.cjs +265 -0
- package/dist/components/code.d.cts +40 -0
- package/dist/components/code.d.ts +40 -0
- package/dist/components/code.mjs +243 -0
- package/dist/components/collapsible.cjs +143 -0
- package/dist/components/collapsible.d.cts +159 -0
- package/dist/components/collapsible.d.ts +159 -0
- package/dist/components/collapsible.mjs +123 -0
- package/dist/components/color-picker.cjs +348 -0
- package/dist/components/color-picker.d.cts +35 -0
- package/dist/components/color-picker.d.ts +35 -0
- package/dist/components/color-picker.mjs +331 -0
- package/dist/components/combobox.cjs +584 -0
- package/dist/components/combobox.d.cts +183 -0
- package/dist/components/combobox.d.ts +183 -0
- package/dist/components/combobox.mjs +571 -0
- package/dist/components/command.cjs +329 -0
- package/dist/components/command.d.cts +97 -0
- package/dist/components/command.d.ts +97 -0
- package/dist/components/command.mjs +311 -0
- package/dist/components/confirm-dialog.cjs +100 -0
- package/dist/components/confirm-dialog.d.cts +25 -0
- package/dist/components/confirm-dialog.d.ts +25 -0
- package/dist/components/confirm-dialog.mjs +86 -0
- package/dist/components/context-menu.cjs +325 -0
- package/dist/components/context-menu.d.cts +259 -0
- package/dist/components/context-menu.d.ts +259 -0
- package/dist/components/context-menu.mjs +290 -0
- package/dist/components/copy-button.cjs +203 -0
- package/dist/components/copy-button.d.cts +22 -0
- package/dist/components/copy-button.d.ts +22 -0
- package/dist/components/copy-button.mjs +178 -0
- package/dist/components/data-list.cjs +140 -0
- package/dist/components/data-list.d.cts +36 -0
- package/dist/components/data-list.d.ts +36 -0
- package/dist/components/data-list.mjs +113 -0
- package/dist/components/data-table-toolbar.cjs +338 -0
- package/dist/components/data-table-toolbar.d.cts +84 -0
- package/dist/components/data-table-toolbar.d.ts +84 -0
- package/dist/components/data-table-toolbar.mjs +320 -0
- package/dist/components/data-table.cjs +1324 -0
- package/dist/components/data-table.d.cts +349 -0
- package/dist/components/data-table.d.ts +349 -0
- package/dist/components/data-table.mjs +1323 -0
- package/dist/components/date-picker.cjs +282 -0
- package/dist/components/date-picker.d.cts +97 -0
- package/dist/components/date-picker.d.ts +97 -0
- package/dist/components/date-picker.mjs +258 -0
- package/dist/components/dialog.cjs +319 -0
- package/dist/components/dialog.d.cts +74 -0
- package/dist/components/dialog.d.ts +74 -0
- package/dist/components/dialog.mjs +292 -0
- package/dist/components/drawer.cjs +262 -0
- package/dist/components/drawer.d.cts +113 -0
- package/dist/components/drawer.d.ts +113 -0
- package/dist/components/drawer.mjs +230 -0
- package/dist/components/dropdown-menu.cjs +328 -0
- package/dist/components/dropdown-menu.d.cts +95 -0
- package/dist/components/dropdown-menu.d.ts +95 -0
- package/dist/components/dropdown-menu.mjs +293 -0
- package/dist/components/empty-state.cjs +123 -0
- package/dist/components/empty-state.d.cts +15 -0
- package/dist/components/empty-state.d.ts +15 -0
- package/dist/components/empty-state.mjs +99 -0
- package/dist/components/file-upload.cjs +442 -0
- package/dist/components/file-upload.d.cts +35 -0
- package/dist/components/file-upload.d.ts +35 -0
- package/dist/components/file-upload.mjs +423 -0
- package/dist/components/form-field.cjs +191 -0
- package/dist/components/form-field.d.cts +163 -0
- package/dist/components/form-field.d.ts +163 -0
- package/dist/components/form-field.mjs +167 -0
- package/dist/components/hover-card.cjs +99 -0
- package/dist/components/hover-card.d.cts +28 -0
- package/dist/components/hover-card.d.ts +28 -0
- package/dist/components/hover-card.mjs +75 -0
- package/dist/components/image-gallery.cjs +359 -0
- package/dist/components/image-gallery.d.cts +46 -0
- package/dist/components/image-gallery.d.ts +46 -0
- package/dist/components/image-gallery.mjs +340 -0
- package/dist/components/index.cjs +719 -0
- package/dist/components/index.d.cts +84 -0
- package/dist/components/index.d.ts +84 -0
- package/dist/components/index.mjs +771 -0
- package/dist/components/infinite-scroll.cjs +95 -0
- package/dist/components/infinite-scroll.d.cts +54 -0
- package/dist/components/infinite-scroll.d.ts +54 -0
- package/dist/components/infinite-scroll.mjs +71 -0
- package/dist/components/input-group.cjs +202 -0
- package/dist/components/input-group.d.cts +22 -0
- package/dist/components/input-group.d.ts +22 -0
- package/dist/components/input-group.mjs +178 -0
- package/dist/components/input.cjs +318 -0
- package/dist/components/input.d.cts +99 -0
- package/dist/components/input.d.ts +99 -0
- package/dist/components/input.mjs +296 -0
- package/dist/components/kbd.cjs +69 -0
- package/dist/components/kbd.d.cts +25 -0
- package/dist/components/kbd.d.ts +25 -0
- package/dist/components/kbd.mjs +44 -0
- package/dist/components/label.cjs +138 -0
- package/dist/components/label.d.cts +91 -0
- package/dist/components/label.d.ts +91 -0
- package/dist/components/label.mjs +113 -0
- package/dist/components/markdown.cjs +179 -0
- package/dist/components/markdown.d.cts +41 -0
- package/dist/components/markdown.d.ts +41 -0
- package/dist/components/markdown.mjs +155 -0
- package/dist/components/menubar.cjs +365 -0
- package/dist/components/menubar.d.cts +88 -0
- package/dist/components/menubar.d.ts +88 -0
- package/dist/components/menubar.mjs +329 -0
- package/dist/components/navigation-menu.cjs +280 -0
- package/dist/components/navigation-menu.d.cts +123 -0
- package/dist/components/navigation-menu.d.ts +123 -0
- package/dist/components/navigation-menu.mjs +250 -0
- package/dist/components/number-input.cjs +419 -0
- package/dist/components/number-input.d.cts +111 -0
- package/dist/components/number-input.d.ts +111 -0
- package/dist/components/number-input.mjs +400 -0
- package/dist/components/pagination.cjs +322 -0
- package/dist/components/pagination.d.cts +119 -0
- package/dist/components/pagination.d.ts +119 -0
- package/dist/components/pagination.mjs +297 -0
- package/dist/components/pin-input.cjs +321 -0
- package/dist/components/pin-input.d.cts +112 -0
- package/dist/components/pin-input.d.ts +112 -0
- package/dist/components/pin-input.mjs +303 -0
- package/dist/components/popover.cjs +194 -0
- package/dist/components/popover.d.cts +108 -0
- package/dist/components/popover.d.ts +108 -0
- package/dist/components/popover.mjs +168 -0
- package/dist/components/progress.cjs +237 -0
- package/dist/components/progress.d.cts +137 -0
- package/dist/components/progress.d.ts +137 -0
- package/dist/components/progress.mjs +211 -0
- package/dist/components/radio.cjs +344 -0
- package/dist/components/radio.d.cts +145 -0
- package/dist/components/radio.d.ts +145 -0
- package/dist/components/radio.mjs +320 -0
- package/dist/components/resizable.cjs +121 -0
- package/dist/components/resizable.d.cts +23 -0
- package/dist/components/resizable.d.ts +23 -0
- package/dist/components/resizable.mjs +99 -0
- package/dist/components/scroll-area.cjs +168 -0
- package/dist/components/scroll-area.d.cts +131 -0
- package/dist/components/scroll-area.d.ts +131 -0
- package/dist/components/scroll-area.mjs +143 -0
- package/dist/components/search-input.cjs +261 -0
- package/dist/components/search-input.d.cts +26 -0
- package/dist/components/search-input.d.ts +26 -0
- package/dist/components/search-input.mjs +243 -0
- package/dist/components/select.cjs +320 -0
- package/dist/components/select.d.cts +55 -0
- package/dist/components/select.d.ts +55 -0
- package/dist/components/select.mjs +288 -0
- package/dist/components/separator.cjs +193 -0
- package/dist/components/separator.d.cts +92 -0
- package/dist/components/separator.d.ts +92 -0
- package/dist/components/separator.mjs +170 -0
- package/dist/components/sheet.cjs +399 -0
- package/dist/components/sheet.d.cts +219 -0
- package/dist/components/sheet.d.ts +219 -0
- package/dist/components/sheet.mjs +379 -0
- package/dist/components/sidebar.cjs +1077 -0
- package/dist/components/sidebar.d.cts +733 -0
- package/dist/components/sidebar.d.ts +733 -0
- package/dist/components/sidebar.mjs +1033 -0
- package/dist/components/skeleton.cjs +210 -0
- package/dist/components/skeleton.d.cts +202 -0
- package/dist/components/skeleton.d.ts +202 -0
- package/dist/components/skeleton.mjs +182 -0
- package/dist/components/slider.cjs +319 -0
- package/dist/components/slider.d.cts +82 -0
- package/dist/components/slider.d.ts +82 -0
- package/dist/components/slider.mjs +296 -0
- package/dist/components/sonner.cjs +119 -0
- package/dist/components/sonner.d.cts +60 -0
- package/dist/components/sonner.d.ts +60 -0
- package/dist/components/sonner.mjs +94 -0
- package/dist/components/spinner.cjs +238 -0
- package/dist/components/spinner.d.cts +101 -0
- package/dist/components/spinner.d.ts +101 -0
- package/dist/components/spinner.mjs +213 -0
- package/dist/components/stat.cjs +180 -0
- package/dist/components/stat.d.cts +21 -0
- package/dist/components/stat.d.ts +21 -0
- package/dist/components/stat.mjs +161 -0
- package/dist/components/steps.cjs +228 -0
- package/dist/components/steps.d.cts +76 -0
- package/dist/components/steps.d.ts +76 -0
- package/dist/components/steps.mjs +207 -0
- package/dist/components/switch.cjs +243 -0
- package/dist/components/switch.d.cts +90 -0
- package/dist/components/switch.d.ts +90 -0
- package/dist/components/switch.mjs +228 -0
- package/dist/components/table.cjs +381 -0
- package/dist/components/table.d.cts +181 -0
- package/dist/components/table.d.ts +181 -0
- package/dist/components/table.mjs +349 -0
- package/dist/components/tabs.cjs +326 -0
- package/dist/components/tabs.d.cts +154 -0
- package/dist/components/tabs.d.ts +154 -0
- package/dist/components/tabs.mjs +304 -0
- package/dist/components/textarea.cjs +258 -0
- package/dist/components/textarea.d.cts +112 -0
- package/dist/components/textarea.d.ts +112 -0
- package/dist/components/textarea.mjs +233 -0
- package/dist/components/theme-toggle.cjs +282 -0
- package/dist/components/theme-toggle.d.cts +58 -0
- package/dist/components/theme-toggle.d.ts +58 -0
- package/dist/components/theme-toggle.mjs +258 -0
- package/dist/components/timeline.cjs +178 -0
- package/dist/components/timeline.d.cts +41 -0
- package/dist/components/timeline.d.ts +41 -0
- package/dist/components/timeline.mjs +157 -0
- package/dist/components/toast.cjs +546 -0
- package/dist/components/toast.d.cts +169 -0
- package/dist/components/toast.d.ts +169 -0
- package/dist/components/toast.mjs +528 -0
- package/dist/components/toggle-group.cjs +204 -0
- package/dist/components/toggle-group.d.cts +215 -0
- package/dist/components/toggle-group.d.ts +215 -0
- package/dist/components/toggle-group.mjs +180 -0
- package/dist/components/toggle.cjs +155 -0
- package/dist/components/toggle.d.cts +100 -0
- package/dist/components/toggle.d.ts +100 -0
- package/dist/components/toggle.mjs +130 -0
- package/dist/components/tooltip.cjs +155 -0
- package/dist/components/tooltip.d.cts +129 -0
- package/dist/components/tooltip.d.ts +129 -0
- package/dist/components/tooltip.mjs +132 -0
- package/dist/components/tree-view.cjs +450 -0
- package/dist/components/tree-view.d.cts +67 -0
- package/dist/components/tree-view.d.ts +67 -0
- package/dist/components/tree-view.mjs +433 -0
- package/dist/components/video-player.cjs +344 -0
- package/dist/components/video-player.d.cts +34 -0
- package/dist/components/video-player.d.ts +34 -0
- package/dist/components/video-player.mjs +320 -0
- package/dist/components/virtual-list.cjs +153 -0
- package/dist/components/virtual-list.d.cts +53 -0
- package/dist/components/virtual-list.d.ts +53 -0
- package/dist/components/virtual-list.mjs +136 -0
- package/dist/components/visually-hidden.cjs +43 -0
- package/dist/components/visually-hidden.d.cts +9 -0
- package/dist/components/visually-hidden.d.ts +9 -0
- package/dist/components/visually-hidden.mjs +21 -0
- package/dist/index.cjs +1081 -1933
- package/dist/index.d.cts +99 -11
- package/dist/index.d.ts +99 -11
- package/dist/index.mjs +1138 -16
- package/dist/motion/hooks.cjs +98 -0
- package/dist/motion/hooks.d.cts +32 -0
- package/dist/motion/hooks.d.ts +32 -0
- package/dist/motion/hooks.mjs +70 -0
- package/dist/motion/index.cjs +157 -0
- package/dist/motion/index.d.cts +5 -0
- package/dist/motion/index.d.ts +5 -0
- package/dist/motion/index.mjs +137 -0
- package/dist/motion/presets.cjs +609 -0
- package/dist/{motion.d.ts → motion/presets.d.cts} +1 -30
- package/dist/{motion.d.cts → motion/presets.d.ts} +1 -30
- package/dist/{chunk-PLRSH37T.mjs → motion/presets.mjs} +119 -126
- package/dist/primitives/container.cjs +88 -0
- package/dist/primitives/container.d.cts +82 -0
- package/dist/primitives/container.d.ts +82 -0
- package/dist/primitives/container.mjs +64 -0
- package/dist/primitives/divider.cjs +74 -0
- package/dist/primitives/divider.d.cts +30 -0
- package/dist/primitives/divider.d.ts +30 -0
- package/dist/primitives/divider.mjs +50 -0
- package/dist/primitives/index.cjs +54 -0
- package/dist/primitives/index.d.cts +6 -0
- package/dist/primitives/index.d.ts +6 -0
- package/dist/primitives/index.mjs +33 -0
- package/dist/primitives/stack.cjs +167 -0
- package/dist/primitives/stack.d.cts +132 -0
- package/dist/primitives/stack.d.ts +132 -0
- package/dist/primitives/stack.mjs +142 -0
- package/dist/primitives/typography.cjs +260 -0
- package/dist/primitives/typography.d.cts +157 -0
- package/dist/primitives/typography.d.ts +157 -0
- package/dist/primitives/typography.mjs +229 -0
- package/dist/theme/contract.cjs +246 -0
- package/dist/theme/contract.d.cts +76 -0
- package/dist/theme/contract.d.ts +76 -0
- package/dist/theme/contract.mjs +221 -0
- package/dist/theme/customizer-store.cjs +266 -0
- package/dist/theme/customizer-store.d.cts +76 -0
- package/dist/theme/customizer-store.d.ts +76 -0
- package/dist/theme/customizer-store.mjs +261 -0
- package/dist/theme/customizer.cjs +812 -0
- package/dist/theme/customizer.d.cts +13 -0
- package/dist/theme/customizer.d.ts +13 -0
- package/dist/theme/customizer.mjs +803 -0
- package/dist/theme/index.cjs +105 -0
- package/dist/theme/index.d.cts +13 -0
- package/dist/theme/index.d.ts +13 -0
- package/dist/theme/index.mjs +87 -0
- package/dist/theme/presets.cjs +1205 -0
- package/dist/theme/presets.d.cts +232 -0
- package/dist/theme/presets.d.ts +232 -0
- package/dist/theme/presets.mjs +1175 -0
- package/dist/theme/provider.cjs +122 -0
- package/dist/theme/provider.d.cts +57 -0
- package/dist/theme/provider.d.ts +57 -0
- package/dist/theme/provider.mjs +104 -0
- package/dist/{chunk-IVZAB7BV.mjs → tokens/colors.cjs} +212 -86
- package/dist/{z-index-Dd8IllRx.d.cts → tokens/colors.d.cts} +235 -72
- package/dist/{z-index-Dd8IllRx.d.ts → tokens/colors.d.ts} +235 -72
- package/dist/{chunk-ZBGR7MUW.cjs → tokens/colors.mjs} +165 -104
- package/dist/tokens/index.cjs +96 -0
- package/dist/tokens/index.d.cts +7 -0
- package/dist/tokens/index.d.ts +7 -0
- package/dist/tokens/index.mjs +71 -0
- package/dist/{chunk-XCKK6P46.cjs → tokens/motion.cjs} +46 -18
- package/dist/{motion-D9wQbcKL.d.cts → tokens/motion.d.cts} +1 -1
- package/dist/{motion-D9wQbcKL.d.ts → tokens/motion.d.ts} +1 -1
- package/dist/{chunk-EZ2L3XPS.mjs → tokens/motion.mjs} +16 -10
- package/dist/tokens/radius.cjs +41 -0
- package/dist/tokens/radius.d.cts +18 -0
- package/dist/tokens/radius.d.ts +18 -0
- package/dist/tokens/radius.mjs +17 -0
- package/dist/tokens/shadows.cjs +57 -0
- package/dist/tokens/shadows.d.cts +32 -0
- package/dist/tokens/shadows.d.ts +32 -0
- package/dist/tokens/shadows.mjs +32 -0
- package/dist/tokens/spacing.cjs +51 -0
- package/dist/tokens/spacing.d.cts +26 -0
- package/dist/tokens/spacing.d.ts +26 -0
- package/dist/{chunk-NMPHV6ZD.mjs → tokens/spacing.mjs} +4 -4
- package/dist/{chunk-ECIGDEAH.cjs → tokens/typography.cjs} +43 -16
- package/dist/{typography-DlvVjEdE.d.ts → tokens/typography.d.cts} +1 -1
- package/dist/{typography-DlvVjEdE.d.cts → tokens/typography.d.ts} +1 -1
- package/dist/{chunk-ITBG42M5.mjs → tokens/typography.mjs} +14 -9
- package/dist/tokens/z-index.cjs +47 -0
- package/dist/tokens/z-index.d.cts +24 -0
- package/dist/tokens/z-index.d.ts +24 -0
- package/dist/tokens/z-index.mjs +23 -0
- package/dist/utils/cn.cjs +102 -0
- package/dist/utils/cn.d.cts +84 -0
- package/dist/utils/cn.d.ts +84 -0
- package/dist/{chunk-ZT3PCXDF.mjs → utils/cn.mjs} +14 -7
- package/dist/{chunk-33QEKXRQ.cjs → utils/contrast.cjs} +68 -38
- package/dist/utils/contrast.d.cts +209 -0
- package/dist/utils/contrast.d.ts +209 -0
- package/dist/{chunk-5NZDQWRV.mjs → utils/contrast.mjs} +27 -18
- package/dist/utils/focus-ring.cjs +81 -0
- package/dist/utils/focus-ring.d.cts +80 -0
- package/dist/utils/focus-ring.d.ts +80 -0
- package/dist/utils/focus-ring.mjs +47 -0
- package/dist/utils/index.cjs +107 -0
- package/dist/utils/index.d.cts +6 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.mjs +88 -0
- package/dist/utils/types.cjs +38 -0
- package/dist/utils/types.d.cts +187 -0
- package/dist/utils/types.d.ts +187 -0
- package/dist/utils/types.mjs +13 -0
- package/package.json +191 -191
- package/dist/chunk-2JFREULQ.cjs +0 -29
- package/dist/chunk-3EHT6IOA.cjs +0 -49
- package/dist/chunk-4ON3M3OM.cjs +0 -73
- package/dist/chunk-5TP7J7T4.cjs +0 -1766
- package/dist/chunk-A2DGHQL2.cjs +0 -21808
- package/dist/chunk-EQWESXRH.mjs +0 -1735
- package/dist/chunk-F4JJFWWU.cjs +0 -604
- package/dist/chunk-FUWXGHWQ.cjs +0 -468
- package/dist/chunk-MBYCK2JJ.mjs +0 -37
- package/dist/chunk-OHEH57BV.mjs +0 -455
- package/dist/chunk-XAIUX2YS.mjs +0 -21477
- package/dist/components.cjs +0 -1247
- package/dist/components.d.cts +0 -7881
- package/dist/components.d.ts +0 -7881
- package/dist/components.mjs +0 -6
- package/dist/motion.cjs +0 -264
- package/dist/motion.mjs +0 -3
- package/dist/primitives.cjs +0 -57
- package/dist/primitives.d.cts +0 -390
- package/dist/primitives.d.ts +0 -390
- package/dist/primitives.mjs +0 -4
- package/dist/theme.cjs +0 -131
- package/dist/theme.d.cts +0 -414
- package/dist/theme.d.ts +0 -414
- package/dist/theme.mjs +0 -6
- package/dist/tokens.cjs +0 -137
- package/dist/tokens.d.cts +0 -30
- package/dist/tokens.d.ts +0 -30
- package/dist/tokens.mjs +0 -4
- package/dist/utils.cjs +0 -164
- package/dist/utils.d.cts +0 -525
- package/dist/utils.d.ts +0 -525
- package/dist/utils.mjs +0 -3
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var customizer_store_exports = {};
|
|
21
|
+
__export(customizer_store_exports, {
|
|
22
|
+
ThemeCustomizerContext: () => ThemeCustomizerContext,
|
|
23
|
+
ThemeCustomizerProvider: () => ThemeCustomizerProvider,
|
|
24
|
+
useThemeCustomizer: () => useThemeCustomizer
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(customizer_store_exports);
|
|
27
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
28
|
+
var import_react = require("react");
|
|
29
|
+
var import_presets = require("./presets");
|
|
30
|
+
const STORAGE_KEY = "ds-theme-customizer";
|
|
31
|
+
const STYLE_ELEMENT_ID = "ds-theme-customizer";
|
|
32
|
+
const ThemeCustomizerContext = (0, import_react.createContext)(null);
|
|
33
|
+
function useThemeCustomizer() {
|
|
34
|
+
const ctx = (0, import_react.useContext)(ThemeCustomizerContext);
|
|
35
|
+
if (!ctx) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
"useThemeCustomizer must be used within a <ThemeCustomizerProvider>. Wrap your application (or layout) with <ThemeCustomizerProvider>."
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
return ctx;
|
|
41
|
+
}
|
|
42
|
+
function loadConfig() {
|
|
43
|
+
if (typeof window === "undefined") return import_presets.DEFAULT_THEME_CONFIG;
|
|
44
|
+
try {
|
|
45
|
+
const raw = localStorage.getItem(STORAGE_KEY);
|
|
46
|
+
if (!raw) return import_presets.DEFAULT_THEME_CONFIG;
|
|
47
|
+
const parsed = JSON.parse(raw);
|
|
48
|
+
return {
|
|
49
|
+
style: import_presets.STYLE_PRESETS.some((s) => s.key === parsed.style) ? parsed.style : import_presets.DEFAULT_THEME_CONFIG.style,
|
|
50
|
+
colorPreset: import_presets.COLOR_PRESET_KEYS.includes(parsed.colorPreset ?? "") ? parsed.colorPreset : import_presets.DEFAULT_THEME_CONFIG.colorPreset,
|
|
51
|
+
radius: import_presets.RADIUS_PRESETS.some((r) => r.key === parsed.radius) ? parsed.radius : import_presets.DEFAULT_THEME_CONFIG.radius,
|
|
52
|
+
font: import_presets.FONT_PRESETS.some((f) => f.key === parsed.font) ? parsed.font : import_presets.DEFAULT_THEME_CONFIG.font,
|
|
53
|
+
shadow: import_presets.SHADOW_PRESETS.some((s) => s.key === parsed.shadow) ? parsed.shadow : import_presets.DEFAULT_THEME_CONFIG.shadow,
|
|
54
|
+
surfaceStyle: import_presets.SURFACE_STYLE_PRESETS.some(
|
|
55
|
+
(s) => s.key === parsed.surfaceStyle
|
|
56
|
+
) ? parsed.surfaceStyle : import_presets.DEFAULT_THEME_CONFIG.surfaceStyle,
|
|
57
|
+
menuColor: import_presets.MENU_COLOR_PRESETS.some((p) => p.key === parsed.menuColor) ? parsed.menuColor : import_presets.DEFAULT_THEME_CONFIG.menuColor,
|
|
58
|
+
menuAccent: import_presets.MENU_ACCENT_PRESETS.some((p) => p.key === parsed.menuAccent) ? parsed.menuAccent : import_presets.DEFAULT_THEME_CONFIG.menuAccent
|
|
59
|
+
};
|
|
60
|
+
} catch {
|
|
61
|
+
return import_presets.DEFAULT_THEME_CONFIG;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function saveConfig(config) {
|
|
65
|
+
if (typeof window === "undefined") return;
|
|
66
|
+
try {
|
|
67
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(config));
|
|
68
|
+
} catch {
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function getResolvedMode() {
|
|
72
|
+
if (typeof document === "undefined") return "light";
|
|
73
|
+
return document.documentElement.classList.contains("dark") ? "dark" : "light";
|
|
74
|
+
}
|
|
75
|
+
function injectStyles(config) {
|
|
76
|
+
if (typeof document === "undefined") return;
|
|
77
|
+
let styleEl = document.getElementById(
|
|
78
|
+
STYLE_ELEMENT_ID
|
|
79
|
+
);
|
|
80
|
+
if (!styleEl) {
|
|
81
|
+
styleEl = document.createElement("style");
|
|
82
|
+
styleEl.id = STYLE_ELEMENT_ID;
|
|
83
|
+
styleEl.setAttribute("data-ds-customizer", "");
|
|
84
|
+
document.head.appendChild(styleEl);
|
|
85
|
+
}
|
|
86
|
+
const lightVars = (0, import_presets.buildThemeOverrides)(config, "light");
|
|
87
|
+
const darkVars = (0, import_presets.buildThemeOverrides)(config, "dark");
|
|
88
|
+
const formatVars = (vars) => Object.entries(vars).map(([prop, value]) => `${prop}:${value}`).join(";");
|
|
89
|
+
styleEl.textContent = [
|
|
90
|
+
`:root:root{${formatVars(lightVars)}}`,
|
|
91
|
+
`.dark:root{${formatVars(darkVars)}}`
|
|
92
|
+
].join("\n");
|
|
93
|
+
}
|
|
94
|
+
function removeStyles() {
|
|
95
|
+
if (typeof document === "undefined") return;
|
|
96
|
+
const styleEl = document.getElementById(STYLE_ELEMENT_ID);
|
|
97
|
+
if (styleEl) {
|
|
98
|
+
styleEl.remove();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function configsEqual(a, b) {
|
|
102
|
+
return a.style === b.style && a.colorPreset === b.colorPreset && a.radius === b.radius && a.font === b.font && a.shadow === b.shadow && a.surfaceStyle === b.surfaceStyle && a.menuColor === b.menuColor && a.menuAccent === b.menuAccent;
|
|
103
|
+
}
|
|
104
|
+
function ThemeCustomizerProvider({
|
|
105
|
+
children,
|
|
106
|
+
defaultConfig,
|
|
107
|
+
applyStyles = true
|
|
108
|
+
}) {
|
|
109
|
+
const [config, setConfigState] = (0, import_react.useState)(
|
|
110
|
+
() => defaultConfig ?? loadConfig()
|
|
111
|
+
);
|
|
112
|
+
const [_resolvedMode, setResolvedMode] = (0, import_react.useState)("light");
|
|
113
|
+
const configRef = (0, import_react.useRef)(config);
|
|
114
|
+
configRef.current = config;
|
|
115
|
+
(0, import_react.useEffect)(() => {
|
|
116
|
+
setResolvedMode(getResolvedMode());
|
|
117
|
+
const observer = new MutationObserver(() => {
|
|
118
|
+
const newMode = getResolvedMode();
|
|
119
|
+
setResolvedMode((prev) => {
|
|
120
|
+
if (prev !== newMode) return newMode;
|
|
121
|
+
return prev;
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
observer.observe(document.documentElement, {
|
|
125
|
+
attributes: true,
|
|
126
|
+
attributeFilter: ["class"]
|
|
127
|
+
});
|
|
128
|
+
return () => observer.disconnect();
|
|
129
|
+
}, []);
|
|
130
|
+
(0, import_react.useEffect)(() => {
|
|
131
|
+
if (applyStyles) {
|
|
132
|
+
injectStyles(config);
|
|
133
|
+
}
|
|
134
|
+
}, [config, applyStyles]);
|
|
135
|
+
(0, import_react.useEffect)(() => {
|
|
136
|
+
saveConfig(config);
|
|
137
|
+
}, [config]);
|
|
138
|
+
(0, import_react.useEffect)(() => {
|
|
139
|
+
return () => {
|
|
140
|
+
if (applyStyles) {
|
|
141
|
+
removeStyles();
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
}, [applyStyles]);
|
|
145
|
+
(0, import_react.useEffect)(() => {
|
|
146
|
+
const handleStorage = (e) => {
|
|
147
|
+
if (e.key === STORAGE_KEY && e.newValue) {
|
|
148
|
+
try {
|
|
149
|
+
const parsed = JSON.parse(e.newValue);
|
|
150
|
+
setConfigState((prev) => {
|
|
151
|
+
if (configsEqual(prev, parsed)) return prev;
|
|
152
|
+
return parsed;
|
|
153
|
+
});
|
|
154
|
+
} catch {
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
window.addEventListener("storage", handleStorage);
|
|
159
|
+
return () => window.removeEventListener("storage", handleStorage);
|
|
160
|
+
}, []);
|
|
161
|
+
const setConfig = (0, import_react.useCallback)((newConfig) => {
|
|
162
|
+
setConfigState(newConfig);
|
|
163
|
+
}, []);
|
|
164
|
+
const setStyle = (0, import_react.useCallback)((key) => {
|
|
165
|
+
const preset = (0, import_presets.getStylePreset)(key);
|
|
166
|
+
setConfigState((prev) => {
|
|
167
|
+
if (prev.style === key) return prev;
|
|
168
|
+
return {
|
|
169
|
+
...prev,
|
|
170
|
+
style: key,
|
|
171
|
+
radius: preset.defaults.radius,
|
|
172
|
+
font: preset.defaults.font,
|
|
173
|
+
shadow: preset.defaults.shadow,
|
|
174
|
+
surfaceStyle: preset.defaults.surfaceStyle
|
|
175
|
+
};
|
|
176
|
+
});
|
|
177
|
+
}, []);
|
|
178
|
+
const setColorPreset = (0, import_react.useCallback)((key) => {
|
|
179
|
+
setConfigState((prev) => {
|
|
180
|
+
if (prev.colorPreset === key) return prev;
|
|
181
|
+
return { ...prev, colorPreset: key };
|
|
182
|
+
});
|
|
183
|
+
}, []);
|
|
184
|
+
const setRadius = (0, import_react.useCallback)((key) => {
|
|
185
|
+
setConfigState((prev) => {
|
|
186
|
+
if (prev.radius === key) return prev;
|
|
187
|
+
return { ...prev, radius: key };
|
|
188
|
+
});
|
|
189
|
+
}, []);
|
|
190
|
+
const setFont = (0, import_react.useCallback)((key) => {
|
|
191
|
+
setConfigState((prev) => {
|
|
192
|
+
if (prev.font === key) return prev;
|
|
193
|
+
return { ...prev, font: key };
|
|
194
|
+
});
|
|
195
|
+
}, []);
|
|
196
|
+
const setShadow = (0, import_react.useCallback)((key) => {
|
|
197
|
+
setConfigState((prev) => {
|
|
198
|
+
if (prev.shadow === key) return prev;
|
|
199
|
+
return { ...prev, shadow: key };
|
|
200
|
+
});
|
|
201
|
+
}, []);
|
|
202
|
+
const setSurfaceStyle = (0, import_react.useCallback)((key) => {
|
|
203
|
+
setConfigState((prev) => {
|
|
204
|
+
if (prev.surfaceStyle === key) return prev;
|
|
205
|
+
return { ...prev, surfaceStyle: key };
|
|
206
|
+
});
|
|
207
|
+
}, []);
|
|
208
|
+
const setMenuColor = (0, import_react.useCallback)((key) => {
|
|
209
|
+
setConfigState((prev) => {
|
|
210
|
+
if (prev.menuColor === key) return prev;
|
|
211
|
+
return { ...prev, menuColor: key };
|
|
212
|
+
});
|
|
213
|
+
}, []);
|
|
214
|
+
const setMenuAccent = (0, import_react.useCallback)((key) => {
|
|
215
|
+
setConfigState((prev) => {
|
|
216
|
+
if (prev.menuAccent === key) return prev;
|
|
217
|
+
return { ...prev, menuAccent: key };
|
|
218
|
+
});
|
|
219
|
+
}, []);
|
|
220
|
+
const resetConfig = (0, import_react.useCallback)(() => {
|
|
221
|
+
setConfigState(import_presets.DEFAULT_THEME_CONFIG);
|
|
222
|
+
}, []);
|
|
223
|
+
const isDefault = configsEqual(config, import_presets.DEFAULT_THEME_CONFIG);
|
|
224
|
+
const generateCSSFn = (0, import_react.useCallback)(() => {
|
|
225
|
+
return (0, import_presets.generateThemeCSS)(config);
|
|
226
|
+
}, [config]);
|
|
227
|
+
const value = (0, import_react.useMemo)(
|
|
228
|
+
() => ({
|
|
229
|
+
config,
|
|
230
|
+
setConfig,
|
|
231
|
+
setStyle,
|
|
232
|
+
setColorPreset,
|
|
233
|
+
setRadius,
|
|
234
|
+
setFont,
|
|
235
|
+
setShadow,
|
|
236
|
+
setSurfaceStyle,
|
|
237
|
+
setMenuColor,
|
|
238
|
+
setMenuAccent,
|
|
239
|
+
resetConfig,
|
|
240
|
+
isDefault,
|
|
241
|
+
generateCSS: generateCSSFn
|
|
242
|
+
}),
|
|
243
|
+
[
|
|
244
|
+
config,
|
|
245
|
+
setConfig,
|
|
246
|
+
setStyle,
|
|
247
|
+
setColorPreset,
|
|
248
|
+
setRadius,
|
|
249
|
+
setFont,
|
|
250
|
+
setShadow,
|
|
251
|
+
setSurfaceStyle,
|
|
252
|
+
setMenuColor,
|
|
253
|
+
setMenuAccent,
|
|
254
|
+
resetConfig,
|
|
255
|
+
isDefault,
|
|
256
|
+
generateCSSFn
|
|
257
|
+
]
|
|
258
|
+
);
|
|
259
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemeCustomizerContext.Provider, { value, children });
|
|
260
|
+
}
|
|
261
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
262
|
+
0 && (module.exports = {
|
|
263
|
+
ThemeCustomizerContext,
|
|
264
|
+
ThemeCustomizerProvider,
|
|
265
|
+
useThemeCustomizer
|
|
266
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
|
+
import { ThemeConfig } from './presets.cjs';
|
|
5
|
+
|
|
6
|
+
interface ThemeCustomizerContextValue {
|
|
7
|
+
/** The current full theme configuration */
|
|
8
|
+
config: ThemeConfig;
|
|
9
|
+
/** Replace the entire theme config at once */
|
|
10
|
+
setConfig: (config: ThemeConfig) => void;
|
|
11
|
+
/** Set the style preset (e.g. "vega", "nova", "maia", "lyra", "mira") and apply its defaults */
|
|
12
|
+
setStyle: (key: string) => void;
|
|
13
|
+
/** Set just the color preset (e.g. "zinc", "blue", "rose") */
|
|
14
|
+
setColorPreset: (key: string) => void;
|
|
15
|
+
/** Set just the radius preset (e.g. "0.5", "0.625") */
|
|
16
|
+
setRadius: (key: string) => void;
|
|
17
|
+
/** Set just the font preset (e.g. "outfit", "inter", "system") */
|
|
18
|
+
setFont: (key: string) => void;
|
|
19
|
+
/** Set just the shadow mode (e.g. "none", "subtle", "default", "heavy") */
|
|
20
|
+
setShadow: (key: string) => void;
|
|
21
|
+
/** Set just the surface style (e.g. "bordered", "elevated", "mixed") */
|
|
22
|
+
setSurfaceStyle: (key: string) => void;
|
|
23
|
+
/** Set just the menu color (e.g. "default", "muted", "inverted", "primary") */
|
|
24
|
+
setMenuColor: (key: string) => void;
|
|
25
|
+
/** Set just the menu accent (e.g. "none", "subtle", "bold") */
|
|
26
|
+
setMenuAccent: (key: string) => void;
|
|
27
|
+
/** Reset to the default theme configuration */
|
|
28
|
+
resetConfig: () => void;
|
|
29
|
+
/** Whether the current config matches the default config */
|
|
30
|
+
isDefault: boolean;
|
|
31
|
+
/** Generate a copyable CSS string for the current config */
|
|
32
|
+
generateCSS: () => string;
|
|
33
|
+
}
|
|
34
|
+
declare const ThemeCustomizerContext: react.Context<ThemeCustomizerContextValue | null>;
|
|
35
|
+
/**
|
|
36
|
+
* Access the theme customizer store.
|
|
37
|
+
*
|
|
38
|
+
* Must be used within a `<ThemeCustomizerProvider>`. Throws if used outside.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```tsx
|
|
42
|
+
* const { config, setColorPreset, setRadius, resetConfig } = useThemeCustomizer();
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
declare function useThemeCustomizer(): ThemeCustomizerContextValue;
|
|
46
|
+
interface ThemeCustomizerProviderProps {
|
|
47
|
+
children: ReactNode;
|
|
48
|
+
/** Override the initial config (useful for SSR or testing) */
|
|
49
|
+
defaultConfig?: ThemeConfig;
|
|
50
|
+
/**
|
|
51
|
+
* If false, the provider will not inject <style> overrides into the DOM.
|
|
52
|
+
* Useful if you only want to read the config without applying it.
|
|
53
|
+
* @default true
|
|
54
|
+
*/
|
|
55
|
+
applyStyles?: boolean;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Theme customizer provider.
|
|
59
|
+
*
|
|
60
|
+
* Manages the active theme configuration, persists it to localStorage,
|
|
61
|
+
* and injects CSS custom property overrides into the document head.
|
|
62
|
+
*
|
|
63
|
+
* Place this inside your theme/root provider but outside your main content:
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```tsx
|
|
67
|
+
* <RootProvider>
|
|
68
|
+
* <ThemeCustomizerProvider>
|
|
69
|
+
* {children}
|
|
70
|
+
* </ThemeCustomizerProvider>
|
|
71
|
+
* </RootProvider>
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
declare function ThemeCustomizerProvider({ children, defaultConfig, applyStyles, }: ThemeCustomizerProviderProps): react_jsx_runtime.JSX.Element;
|
|
75
|
+
|
|
76
|
+
export { ThemeCustomizerContext, type ThemeCustomizerContextValue, ThemeCustomizerProvider, type ThemeCustomizerProviderProps, useThemeCustomizer };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
|
+
import { ThemeConfig } from './presets.js';
|
|
5
|
+
|
|
6
|
+
interface ThemeCustomizerContextValue {
|
|
7
|
+
/** The current full theme configuration */
|
|
8
|
+
config: ThemeConfig;
|
|
9
|
+
/** Replace the entire theme config at once */
|
|
10
|
+
setConfig: (config: ThemeConfig) => void;
|
|
11
|
+
/** Set the style preset (e.g. "vega", "nova", "maia", "lyra", "mira") and apply its defaults */
|
|
12
|
+
setStyle: (key: string) => void;
|
|
13
|
+
/** Set just the color preset (e.g. "zinc", "blue", "rose") */
|
|
14
|
+
setColorPreset: (key: string) => void;
|
|
15
|
+
/** Set just the radius preset (e.g. "0.5", "0.625") */
|
|
16
|
+
setRadius: (key: string) => void;
|
|
17
|
+
/** Set just the font preset (e.g. "outfit", "inter", "system") */
|
|
18
|
+
setFont: (key: string) => void;
|
|
19
|
+
/** Set just the shadow mode (e.g. "none", "subtle", "default", "heavy") */
|
|
20
|
+
setShadow: (key: string) => void;
|
|
21
|
+
/** Set just the surface style (e.g. "bordered", "elevated", "mixed") */
|
|
22
|
+
setSurfaceStyle: (key: string) => void;
|
|
23
|
+
/** Set just the menu color (e.g. "default", "muted", "inverted", "primary") */
|
|
24
|
+
setMenuColor: (key: string) => void;
|
|
25
|
+
/** Set just the menu accent (e.g. "none", "subtle", "bold") */
|
|
26
|
+
setMenuAccent: (key: string) => void;
|
|
27
|
+
/** Reset to the default theme configuration */
|
|
28
|
+
resetConfig: () => void;
|
|
29
|
+
/** Whether the current config matches the default config */
|
|
30
|
+
isDefault: boolean;
|
|
31
|
+
/** Generate a copyable CSS string for the current config */
|
|
32
|
+
generateCSS: () => string;
|
|
33
|
+
}
|
|
34
|
+
declare const ThemeCustomizerContext: react.Context<ThemeCustomizerContextValue | null>;
|
|
35
|
+
/**
|
|
36
|
+
* Access the theme customizer store.
|
|
37
|
+
*
|
|
38
|
+
* Must be used within a `<ThemeCustomizerProvider>`. Throws if used outside.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```tsx
|
|
42
|
+
* const { config, setColorPreset, setRadius, resetConfig } = useThemeCustomizer();
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
declare function useThemeCustomizer(): ThemeCustomizerContextValue;
|
|
46
|
+
interface ThemeCustomizerProviderProps {
|
|
47
|
+
children: ReactNode;
|
|
48
|
+
/** Override the initial config (useful for SSR or testing) */
|
|
49
|
+
defaultConfig?: ThemeConfig;
|
|
50
|
+
/**
|
|
51
|
+
* If false, the provider will not inject <style> overrides into the DOM.
|
|
52
|
+
* Useful if you only want to read the config without applying it.
|
|
53
|
+
* @default true
|
|
54
|
+
*/
|
|
55
|
+
applyStyles?: boolean;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Theme customizer provider.
|
|
59
|
+
*
|
|
60
|
+
* Manages the active theme configuration, persists it to localStorage,
|
|
61
|
+
* and injects CSS custom property overrides into the document head.
|
|
62
|
+
*
|
|
63
|
+
* Place this inside your theme/root provider but outside your main content:
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```tsx
|
|
67
|
+
* <RootProvider>
|
|
68
|
+
* <ThemeCustomizerProvider>
|
|
69
|
+
* {children}
|
|
70
|
+
* </ThemeCustomizerProvider>
|
|
71
|
+
* </RootProvider>
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
declare function ThemeCustomizerProvider({ children, defaultConfig, applyStyles, }: ThemeCustomizerProviderProps): react_jsx_runtime.JSX.Element;
|
|
75
|
+
|
|
76
|
+
export { ThemeCustomizerContext, type ThemeCustomizerContextValue, ThemeCustomizerProvider, type ThemeCustomizerProviderProps, useThemeCustomizer };
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import {
|
|
4
|
+
createContext,
|
|
5
|
+
useCallback,
|
|
6
|
+
useContext,
|
|
7
|
+
useEffect,
|
|
8
|
+
useMemo,
|
|
9
|
+
useRef,
|
|
10
|
+
useState
|
|
11
|
+
} from "react";
|
|
12
|
+
import {
|
|
13
|
+
buildThemeOverrides,
|
|
14
|
+
COLOR_PRESET_KEYS,
|
|
15
|
+
DEFAULT_THEME_CONFIG,
|
|
16
|
+
FONT_PRESETS,
|
|
17
|
+
generateThemeCSS,
|
|
18
|
+
getStylePreset,
|
|
19
|
+
MENU_ACCENT_PRESETS,
|
|
20
|
+
MENU_COLOR_PRESETS,
|
|
21
|
+
RADIUS_PRESETS,
|
|
22
|
+
SHADOW_PRESETS,
|
|
23
|
+
STYLE_PRESETS,
|
|
24
|
+
SURFACE_STYLE_PRESETS
|
|
25
|
+
} from "./presets";
|
|
26
|
+
const STORAGE_KEY = "ds-theme-customizer";
|
|
27
|
+
const STYLE_ELEMENT_ID = "ds-theme-customizer";
|
|
28
|
+
const ThemeCustomizerContext = createContext(null);
|
|
29
|
+
function useThemeCustomizer() {
|
|
30
|
+
const ctx = useContext(ThemeCustomizerContext);
|
|
31
|
+
if (!ctx) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
"useThemeCustomizer must be used within a <ThemeCustomizerProvider>. Wrap your application (or layout) with <ThemeCustomizerProvider>."
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
return ctx;
|
|
37
|
+
}
|
|
38
|
+
function loadConfig() {
|
|
39
|
+
if (typeof window === "undefined") return DEFAULT_THEME_CONFIG;
|
|
40
|
+
try {
|
|
41
|
+
const raw = localStorage.getItem(STORAGE_KEY);
|
|
42
|
+
if (!raw) return DEFAULT_THEME_CONFIG;
|
|
43
|
+
const parsed = JSON.parse(raw);
|
|
44
|
+
return {
|
|
45
|
+
style: STYLE_PRESETS.some((s) => s.key === parsed.style) ? parsed.style : DEFAULT_THEME_CONFIG.style,
|
|
46
|
+
colorPreset: COLOR_PRESET_KEYS.includes(parsed.colorPreset ?? "") ? parsed.colorPreset : DEFAULT_THEME_CONFIG.colorPreset,
|
|
47
|
+
radius: RADIUS_PRESETS.some((r) => r.key === parsed.radius) ? parsed.radius : DEFAULT_THEME_CONFIG.radius,
|
|
48
|
+
font: FONT_PRESETS.some((f) => f.key === parsed.font) ? parsed.font : DEFAULT_THEME_CONFIG.font,
|
|
49
|
+
shadow: SHADOW_PRESETS.some((s) => s.key === parsed.shadow) ? parsed.shadow : DEFAULT_THEME_CONFIG.shadow,
|
|
50
|
+
surfaceStyle: SURFACE_STYLE_PRESETS.some(
|
|
51
|
+
(s) => s.key === parsed.surfaceStyle
|
|
52
|
+
) ? parsed.surfaceStyle : DEFAULT_THEME_CONFIG.surfaceStyle,
|
|
53
|
+
menuColor: MENU_COLOR_PRESETS.some((p) => p.key === parsed.menuColor) ? parsed.menuColor : DEFAULT_THEME_CONFIG.menuColor,
|
|
54
|
+
menuAccent: MENU_ACCENT_PRESETS.some((p) => p.key === parsed.menuAccent) ? parsed.menuAccent : DEFAULT_THEME_CONFIG.menuAccent
|
|
55
|
+
};
|
|
56
|
+
} catch {
|
|
57
|
+
return DEFAULT_THEME_CONFIG;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function saveConfig(config) {
|
|
61
|
+
if (typeof window === "undefined") return;
|
|
62
|
+
try {
|
|
63
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(config));
|
|
64
|
+
} catch {
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function getResolvedMode() {
|
|
68
|
+
if (typeof document === "undefined") return "light";
|
|
69
|
+
return document.documentElement.classList.contains("dark") ? "dark" : "light";
|
|
70
|
+
}
|
|
71
|
+
function injectStyles(config) {
|
|
72
|
+
if (typeof document === "undefined") return;
|
|
73
|
+
let styleEl = document.getElementById(
|
|
74
|
+
STYLE_ELEMENT_ID
|
|
75
|
+
);
|
|
76
|
+
if (!styleEl) {
|
|
77
|
+
styleEl = document.createElement("style");
|
|
78
|
+
styleEl.id = STYLE_ELEMENT_ID;
|
|
79
|
+
styleEl.setAttribute("data-ds-customizer", "");
|
|
80
|
+
document.head.appendChild(styleEl);
|
|
81
|
+
}
|
|
82
|
+
const lightVars = buildThemeOverrides(config, "light");
|
|
83
|
+
const darkVars = buildThemeOverrides(config, "dark");
|
|
84
|
+
const formatVars = (vars) => Object.entries(vars).map(([prop, value]) => `${prop}:${value}`).join(";");
|
|
85
|
+
styleEl.textContent = [
|
|
86
|
+
`:root:root{${formatVars(lightVars)}}`,
|
|
87
|
+
`.dark:root{${formatVars(darkVars)}}`
|
|
88
|
+
].join("\n");
|
|
89
|
+
}
|
|
90
|
+
function removeStyles() {
|
|
91
|
+
if (typeof document === "undefined") return;
|
|
92
|
+
const styleEl = document.getElementById(STYLE_ELEMENT_ID);
|
|
93
|
+
if (styleEl) {
|
|
94
|
+
styleEl.remove();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function configsEqual(a, b) {
|
|
98
|
+
return a.style === b.style && a.colorPreset === b.colorPreset && a.radius === b.radius && a.font === b.font && a.shadow === b.shadow && a.surfaceStyle === b.surfaceStyle && a.menuColor === b.menuColor && a.menuAccent === b.menuAccent;
|
|
99
|
+
}
|
|
100
|
+
function ThemeCustomizerProvider({
|
|
101
|
+
children,
|
|
102
|
+
defaultConfig,
|
|
103
|
+
applyStyles = true
|
|
104
|
+
}) {
|
|
105
|
+
const [config, setConfigState] = useState(
|
|
106
|
+
() => defaultConfig ?? loadConfig()
|
|
107
|
+
);
|
|
108
|
+
const [_resolvedMode, setResolvedMode] = useState("light");
|
|
109
|
+
const configRef = useRef(config);
|
|
110
|
+
configRef.current = config;
|
|
111
|
+
useEffect(() => {
|
|
112
|
+
setResolvedMode(getResolvedMode());
|
|
113
|
+
const observer = new MutationObserver(() => {
|
|
114
|
+
const newMode = getResolvedMode();
|
|
115
|
+
setResolvedMode((prev) => {
|
|
116
|
+
if (prev !== newMode) return newMode;
|
|
117
|
+
return prev;
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
observer.observe(document.documentElement, {
|
|
121
|
+
attributes: true,
|
|
122
|
+
attributeFilter: ["class"]
|
|
123
|
+
});
|
|
124
|
+
return () => observer.disconnect();
|
|
125
|
+
}, []);
|
|
126
|
+
useEffect(() => {
|
|
127
|
+
if (applyStyles) {
|
|
128
|
+
injectStyles(config);
|
|
129
|
+
}
|
|
130
|
+
}, [config, applyStyles]);
|
|
131
|
+
useEffect(() => {
|
|
132
|
+
saveConfig(config);
|
|
133
|
+
}, [config]);
|
|
134
|
+
useEffect(() => {
|
|
135
|
+
return () => {
|
|
136
|
+
if (applyStyles) {
|
|
137
|
+
removeStyles();
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
}, [applyStyles]);
|
|
141
|
+
useEffect(() => {
|
|
142
|
+
const handleStorage = (e) => {
|
|
143
|
+
if (e.key === STORAGE_KEY && e.newValue) {
|
|
144
|
+
try {
|
|
145
|
+
const parsed = JSON.parse(e.newValue);
|
|
146
|
+
setConfigState((prev) => {
|
|
147
|
+
if (configsEqual(prev, parsed)) return prev;
|
|
148
|
+
return parsed;
|
|
149
|
+
});
|
|
150
|
+
} catch {
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
window.addEventListener("storage", handleStorage);
|
|
155
|
+
return () => window.removeEventListener("storage", handleStorage);
|
|
156
|
+
}, []);
|
|
157
|
+
const setConfig = useCallback((newConfig) => {
|
|
158
|
+
setConfigState(newConfig);
|
|
159
|
+
}, []);
|
|
160
|
+
const setStyle = useCallback((key) => {
|
|
161
|
+
const preset = getStylePreset(key);
|
|
162
|
+
setConfigState((prev) => {
|
|
163
|
+
if (prev.style === key) return prev;
|
|
164
|
+
return {
|
|
165
|
+
...prev,
|
|
166
|
+
style: key,
|
|
167
|
+
radius: preset.defaults.radius,
|
|
168
|
+
font: preset.defaults.font,
|
|
169
|
+
shadow: preset.defaults.shadow,
|
|
170
|
+
surfaceStyle: preset.defaults.surfaceStyle
|
|
171
|
+
};
|
|
172
|
+
});
|
|
173
|
+
}, []);
|
|
174
|
+
const setColorPreset = useCallback((key) => {
|
|
175
|
+
setConfigState((prev) => {
|
|
176
|
+
if (prev.colorPreset === key) return prev;
|
|
177
|
+
return { ...prev, colorPreset: key };
|
|
178
|
+
});
|
|
179
|
+
}, []);
|
|
180
|
+
const setRadius = useCallback((key) => {
|
|
181
|
+
setConfigState((prev) => {
|
|
182
|
+
if (prev.radius === key) return prev;
|
|
183
|
+
return { ...prev, radius: key };
|
|
184
|
+
});
|
|
185
|
+
}, []);
|
|
186
|
+
const setFont = useCallback((key) => {
|
|
187
|
+
setConfigState((prev) => {
|
|
188
|
+
if (prev.font === key) return prev;
|
|
189
|
+
return { ...prev, font: key };
|
|
190
|
+
});
|
|
191
|
+
}, []);
|
|
192
|
+
const setShadow = useCallback((key) => {
|
|
193
|
+
setConfigState((prev) => {
|
|
194
|
+
if (prev.shadow === key) return prev;
|
|
195
|
+
return { ...prev, shadow: key };
|
|
196
|
+
});
|
|
197
|
+
}, []);
|
|
198
|
+
const setSurfaceStyle = useCallback((key) => {
|
|
199
|
+
setConfigState((prev) => {
|
|
200
|
+
if (prev.surfaceStyle === key) return prev;
|
|
201
|
+
return { ...prev, surfaceStyle: key };
|
|
202
|
+
});
|
|
203
|
+
}, []);
|
|
204
|
+
const setMenuColor = useCallback((key) => {
|
|
205
|
+
setConfigState((prev) => {
|
|
206
|
+
if (prev.menuColor === key) return prev;
|
|
207
|
+
return { ...prev, menuColor: key };
|
|
208
|
+
});
|
|
209
|
+
}, []);
|
|
210
|
+
const setMenuAccent = useCallback((key) => {
|
|
211
|
+
setConfigState((prev) => {
|
|
212
|
+
if (prev.menuAccent === key) return prev;
|
|
213
|
+
return { ...prev, menuAccent: key };
|
|
214
|
+
});
|
|
215
|
+
}, []);
|
|
216
|
+
const resetConfig = useCallback(() => {
|
|
217
|
+
setConfigState(DEFAULT_THEME_CONFIG);
|
|
218
|
+
}, []);
|
|
219
|
+
const isDefault = configsEqual(config, DEFAULT_THEME_CONFIG);
|
|
220
|
+
const generateCSSFn = useCallback(() => {
|
|
221
|
+
return generateThemeCSS(config);
|
|
222
|
+
}, [config]);
|
|
223
|
+
const value = useMemo(
|
|
224
|
+
() => ({
|
|
225
|
+
config,
|
|
226
|
+
setConfig,
|
|
227
|
+
setStyle,
|
|
228
|
+
setColorPreset,
|
|
229
|
+
setRadius,
|
|
230
|
+
setFont,
|
|
231
|
+
setShadow,
|
|
232
|
+
setSurfaceStyle,
|
|
233
|
+
setMenuColor,
|
|
234
|
+
setMenuAccent,
|
|
235
|
+
resetConfig,
|
|
236
|
+
isDefault,
|
|
237
|
+
generateCSS: generateCSSFn
|
|
238
|
+
}),
|
|
239
|
+
[
|
|
240
|
+
config,
|
|
241
|
+
setConfig,
|
|
242
|
+
setStyle,
|
|
243
|
+
setColorPreset,
|
|
244
|
+
setRadius,
|
|
245
|
+
setFont,
|
|
246
|
+
setShadow,
|
|
247
|
+
setSurfaceStyle,
|
|
248
|
+
setMenuColor,
|
|
249
|
+
setMenuAccent,
|
|
250
|
+
resetConfig,
|
|
251
|
+
isDefault,
|
|
252
|
+
generateCSSFn
|
|
253
|
+
]
|
|
254
|
+
);
|
|
255
|
+
return /* @__PURE__ */ jsx(ThemeCustomizerContext.Provider, { value, children });
|
|
256
|
+
}
|
|
257
|
+
export {
|
|
258
|
+
ThemeCustomizerContext,
|
|
259
|
+
ThemeCustomizerProvider,
|
|
260
|
+
useThemeCustomizer
|
|
261
|
+
};
|