@just-web/toolkits 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_internal/utils/try-parse-json.cjs +14 -0
- package/dist/_internal/utils/try-parse-json.cjs.map +1 -0
- package/dist/_internal/utils/try-parse-json.mjs +13 -0
- package/dist/_internal/utils/try-parse-json.mjs.map +1 -0
- package/dist/_virtual/rolldown_runtime.cjs +29 -0
- package/dist/attributes/data-attribute.d.cts +17 -0
- package/dist/attributes/data-attribute.d.cts.map +1 -0
- package/dist/attributes/data-attribute.d.mts +17 -0
- package/dist/attributes/data-attribute.d.mts.map +1 -0
- package/dist/attributes/get-attribute.cjs +26 -0
- package/dist/attributes/get-attribute.cjs.map +1 -0
- package/dist/attributes/get-attribute.d.cts +21 -0
- package/dist/attributes/get-attribute.d.cts.map +1 -0
- package/dist/attributes/get-attribute.d.mts +21 -0
- package/dist/attributes/get-attribute.d.mts.map +1 -0
- package/dist/attributes/get-attribute.mjs +25 -0
- package/dist/attributes/get-attribute.mjs.map +1 -0
- package/dist/attributes/get-data-attribute.cjs +19 -0
- package/dist/attributes/get-data-attribute.cjs.map +1 -0
- package/dist/attributes/get-data-attribute.d.cts +17 -0
- package/dist/attributes/get-data-attribute.d.cts.map +1 -0
- package/dist/attributes/get-data-attribute.d.mts +17 -0
- package/dist/attributes/get-data-attribute.d.mts.map +1 -0
- package/dist/attributes/get-data-attribute.mjs +19 -0
- package/dist/attributes/get-data-attribute.mjs.map +1 -0
- package/dist/attributes/observe-attribute.cjs +40 -0
- package/dist/attributes/observe-attribute.cjs.map +1 -0
- package/dist/attributes/observe-attribute.d.cts +23 -0
- package/dist/attributes/observe-attribute.d.cts.map +1 -0
- package/dist/attributes/observe-attribute.d.mts +23 -0
- package/dist/attributes/observe-attribute.d.mts.map +1 -0
- package/dist/attributes/observe-attribute.mjs +39 -0
- package/dist/attributes/observe-attribute.mjs.map +1 -0
- package/dist/attributes/observe-data-attribute.cjs +31 -0
- package/dist/attributes/observe-data-attribute.cjs.map +1 -0
- package/dist/attributes/observe-data-attribute.d.cts +26 -0
- package/dist/attributes/observe-data-attribute.d.cts.map +1 -0
- package/dist/attributes/observe-data-attribute.d.mts +26 -0
- package/dist/attributes/observe-data-attribute.d.mts.map +1 -0
- package/dist/attributes/observe-data-attribute.mjs +31 -0
- package/dist/attributes/observe-data-attribute.mjs.map +1 -0
- package/dist/children/just-children.d.cts +37 -0
- package/dist/children/just-children.d.cts.map +1 -0
- package/dist/children/just-children.d.mts +37 -0
- package/dist/children/just-children.d.mts.map +1 -0
- package/dist/children/resolve-children.cjs +11 -0
- package/dist/children/resolve-children.cjs.map +1 -0
- package/dist/children/resolve-children.d.cts +9 -0
- package/dist/children/resolve-children.d.cts.map +1 -0
- package/dist/children/resolve-children.d.mts +9 -0
- package/dist/children/resolve-children.d.mts.map +1 -0
- package/dist/children/resolve-children.mjs +10 -0
- package/dist/children/resolve-children.mjs.map +1 -0
- package/dist/class-name/class-name-props.d.cts +11 -0
- package/dist/class-name/class-name-props.d.cts.map +1 -0
- package/dist/class-name/class-name-props.d.mts +11 -0
- package/dist/class-name/class-name-props.d.mts.map +1 -0
- package/dist/class-name/clsx.cjs +3 -0
- package/dist/class-name/clsx.d.cts +2 -0
- package/dist/class-name/clsx.d.mts +2 -0
- package/dist/class-name/clsx.mjs +3 -0
- package/dist/class-name/just-class-name.d.cts +36 -0
- package/dist/class-name/just-class-name.d.cts.map +1 -0
- package/dist/class-name/just-class-name.d.mts +36 -0
- package/dist/class-name/just-class-name.d.mts.map +1 -0
- package/dist/class-name/resolve-class-name.cjs +12 -0
- package/dist/class-name/resolve-class-name.cjs.map +1 -0
- package/dist/class-name/resolve-class-name.d.cts +8 -0
- package/dist/class-name/resolve-class-name.d.cts.map +1 -0
- package/dist/class-name/resolve-class-name.d.mts +8 -0
- package/dist/class-name/resolve-class-name.d.mts.map +1 -0
- package/dist/class-name/resolve-class-name.mjs +10 -0
- package/dist/class-name/resolve-class-name.mjs.map +1 -0
- package/dist/color-scheme/get-prefers-color-scheme.cjs +21 -0
- package/dist/color-scheme/get-prefers-color-scheme.cjs.map +1 -0
- package/dist/color-scheme/get-prefers-color-scheme.d.cts +16 -0
- package/dist/color-scheme/get-prefers-color-scheme.d.cts.map +1 -0
- package/dist/color-scheme/get-prefers-color-scheme.d.mts +16 -0
- package/dist/color-scheme/get-prefers-color-scheme.d.mts.map +1 -0
- package/dist/color-scheme/get-prefers-color-scheme.mjs +20 -0
- package/dist/color-scheme/get-prefers-color-scheme.mjs.map +1 -0
- package/dist/color-scheme/observe-prefers-color-scheme.cjs +29 -0
- package/dist/color-scheme/observe-prefers-color-scheme.cjs.map +1 -0
- package/dist/color-scheme/observe-prefers-color-scheme.d.cts +20 -0
- package/dist/color-scheme/observe-prefers-color-scheme.d.cts.map +1 -0
- package/dist/color-scheme/observe-prefers-color-scheme.d.mts +20 -0
- package/dist/color-scheme/observe-prefers-color-scheme.d.mts.map +1 -0
- package/dist/color-scheme/observe-prefers-color-scheme.mjs +28 -0
- package/dist/color-scheme/observe-prefers-color-scheme.mjs.map +1 -0
- package/dist/index.cjs +39 -0
- package/dist/index.d.cts +26 -0
- package/dist/index.d.mts +26 -0
- package/dist/index.mjs +20 -0
- package/dist/react/hooks/use-attribute.cjs +41 -0
- package/dist/react/hooks/use-attribute.cjs.map +1 -0
- package/dist/react/hooks/use-attribute.d.cts +21 -0
- package/dist/react/hooks/use-attribute.d.cts.map +1 -0
- package/dist/react/hooks/use-attribute.d.mts +21 -0
- package/dist/react/hooks/use-attribute.d.mts.map +1 -0
- package/dist/react/hooks/use-attribute.mjs +40 -0
- package/dist/react/hooks/use-attribute.mjs.map +1 -0
- package/dist/react/hooks/use-prefers-color-scheme.cjs +42 -0
- package/dist/react/hooks/use-prefers-color-scheme.cjs.map +1 -0
- package/dist/react/hooks/use-prefers-color-scheme.d.cts +29 -0
- package/dist/react/hooks/use-prefers-color-scheme.d.cts.map +1 -0
- package/dist/react/hooks/use-prefers-color-scheme.d.mts +29 -0
- package/dist/react/hooks/use-prefers-color-scheme.d.mts.map +1 -0
- package/dist/react/hooks/use-prefers-color-scheme.mjs +41 -0
- package/dist/react/hooks/use-prefers-color-scheme.mjs.map +1 -0
- package/dist/react/hooks/use-theme-by-class-name.cjs +60 -0
- package/dist/react/hooks/use-theme-by-class-name.cjs.map +1 -0
- package/dist/react/hooks/use-theme-by-class-name.d.cts +34 -0
- package/dist/react/hooks/use-theme-by-class-name.d.cts.map +1 -0
- package/dist/react/hooks/use-theme-by-class-name.d.mts +34 -0
- package/dist/react/hooks/use-theme-by-class-name.d.mts.map +1 -0
- package/dist/react/hooks/use-theme-by-class-name.mjs +59 -0
- package/dist/react/hooks/use-theme-by-class-name.mjs.map +1 -0
- package/dist/react/hooks/use-theme-by-data-attribute.cjs +73 -0
- package/dist/react/hooks/use-theme-by-data-attribute.cjs.map +1 -0
- package/dist/react/hooks/use-theme-by-data-attribute.d.cts +39 -0
- package/dist/react/hooks/use-theme-by-data-attribute.d.cts.map +1 -0
- package/dist/react/hooks/use-theme-by-data-attribute.d.mts +39 -0
- package/dist/react/hooks/use-theme-by-data-attribute.d.mts.map +1 -0
- package/dist/react/hooks/use-theme-by-data-attribute.mjs +72 -0
- package/dist/react/hooks/use-theme-by-data-attribute.mjs.map +1 -0
- package/dist/react/hooks/use-theme-by-local-storage.cjs +53 -0
- package/dist/react/hooks/use-theme-by-local-storage.cjs.map +1 -0
- package/dist/react/hooks/use-theme-by-local-storage.d.cts +37 -0
- package/dist/react/hooks/use-theme-by-local-storage.d.cts.map +1 -0
- package/dist/react/hooks/use-theme-by-local-storage.d.mts +37 -0
- package/dist/react/hooks/use-theme-by-local-storage.d.mts.map +1 -0
- package/dist/react/hooks/use-theme-by-local-storage.mjs +52 -0
- package/dist/react/hooks/use-theme-by-local-storage.mjs.map +1 -0
- package/dist/react/hooks/use-theme-stores.cjs +40 -0
- package/dist/react/hooks/use-theme-stores.cjs.map +1 -0
- package/dist/react/hooks/use-theme-stores.d.cts +38 -0
- package/dist/react/hooks/use-theme-stores.d.cts.map +1 -0
- package/dist/react/hooks/use-theme-stores.d.mts +38 -0
- package/dist/react/hooks/use-theme-stores.d.mts.map +1 -0
- package/dist/react/hooks/use-theme-stores.mjs +39 -0
- package/dist/react/hooks/use-theme-stores.mjs.map +1 -0
- package/dist/react/theme/create-theme-hook.cjs +105 -0
- package/dist/react/theme/create-theme-hook.cjs.map +1 -0
- package/dist/react/theme/create-theme-hook.d.cts +29 -0
- package/dist/react/theme/create-theme-hook.d.cts.map +1 -0
- package/dist/react/theme/create-theme-hook.d.mts +29 -0
- package/dist/react/theme/create-theme-hook.d.mts.map +1 -0
- package/dist/react/theme/create-theme-hook.mjs +104 -0
- package/dist/react/theme/create-theme-hook.mjs.map +1 -0
- package/dist/react.cjs +15 -0
- package/dist/react.d.cts +8 -0
- package/dist/react.d.mts +8 -0
- package/dist/react.mjs +9 -0
- package/dist/style/css-properties.d.cts +20 -0
- package/dist/style/css-properties.d.cts.map +1 -0
- package/dist/style/css-properties.d.mts +20 -0
- package/dist/style/css-properties.d.mts.map +1 -0
- package/dist/style/define-css-properties.cjs +25 -0
- package/dist/style/define-css-properties.cjs.map +1 -0
- package/dist/style/define-css-properties.d.cts +24 -0
- package/dist/style/define-css-properties.d.cts.map +1 -0
- package/dist/style/define-css-properties.d.mts +24 -0
- package/dist/style/define-css-properties.d.mts.map +1 -0
- package/dist/style/define-css-properties.mjs +24 -0
- package/dist/style/define-css-properties.mjs.map +1 -0
- package/dist/style/get-css-variable-value.cjs +11 -0
- package/dist/style/get-css-variable-value.cjs.map +1 -0
- package/dist/style/get-css-variable-value.d.cts +22 -0
- package/dist/style/get-css-variable-value.d.cts.map +1 -0
- package/dist/style/get-css-variable-value.d.mts +22 -0
- package/dist/style/get-css-variable-value.d.mts.map +1 -0
- package/dist/style/get-css-variable-value.mjs +10 -0
- package/dist/style/get-css-variable-value.mjs.map +1 -0
- package/dist/style/just-style.d.cts +44 -0
- package/dist/style/just-style.d.cts.map +1 -0
- package/dist/style/just-style.d.mts +44 -0
- package/dist/style/just-style.d.mts.map +1 -0
- package/dist/style/resolve-style.cjs +14 -0
- package/dist/style/resolve-style.cjs.map +1 -0
- package/dist/style/resolve-style.d.cts +11 -0
- package/dist/style/resolve-style.d.cts.map +1 -0
- package/dist/style/resolve-style.d.mts +11 -0
- package/dist/style/resolve-style.d.mts.map +1 -0
- package/dist/style/resolve-style.mjs +13 -0
- package/dist/style/resolve-style.mjs.map +1 -0
- package/dist/style/style-props.d.cts +13 -0
- package/dist/style/style-props.d.cts.map +1 -0
- package/dist/style/style-props.d.mts +13 -0
- package/dist/style/style-props.d.mts.map +1 -0
- package/dist/style/to-dom-style.cjs +33 -0
- package/dist/style/to-dom-style.cjs.map +1 -0
- package/dist/style/to-dom-style.d.cts +29 -0
- package/dist/style/to-dom-style.d.cts.map +1 -0
- package/dist/style/to-dom-style.d.mts +29 -0
- package/dist/style/to-dom-style.d.mts.map +1 -0
- package/dist/style/to-dom-style.mjs +32 -0
- package/dist/style/to-dom-style.mjs.map +1 -0
- package/dist/testing/theme/dummy-theme-store.cjs +11 -0
- package/dist/testing/theme/dummy-theme-store.cjs.map +1 -0
- package/dist/testing/theme/dummy-theme-store.mjs +10 -0
- package/dist/testing/theme/dummy-theme-store.mjs.map +1 -0
- package/dist/theme/_utils/get-theme-from-stores.cjs +24 -0
- package/dist/theme/_utils/get-theme-from-stores.cjs.map +1 -0
- package/dist/theme/_utils/get-theme-from-stores.mjs +23 -0
- package/dist/theme/_utils/get-theme-from-stores.mjs.map +1 -0
- package/dist/theme/_utils/observe-theme-from-stores.cjs +39 -0
- package/dist/theme/_utils/observe-theme-from-stores.cjs.map +1 -0
- package/dist/theme/_utils/observe-theme-from-stores.mjs +39 -0
- package/dist/theme/_utils/observe-theme-from-stores.mjs.map +1 -0
- package/dist/theme/_utils/parse-stored-theme.cjs +22 -0
- package/dist/theme/_utils/parse-stored-theme.cjs.map +1 -0
- package/dist/theme/_utils/parse-stored-theme.mjs +22 -0
- package/dist/theme/_utils/parse-stored-theme.mjs.map +1 -0
- package/dist/theme/_utils/set-theme-to-stores.cjs +16 -0
- package/dist/theme/_utils/set-theme-to-stores.cjs.map +1 -0
- package/dist/theme/_utils/set-theme-to-stores.mjs +15 -0
- package/dist/theme/_utils/set-theme-to-stores.mjs.map +1 -0
- package/dist/theme/class-name/apply-theme-to-class-name.cjs +23 -0
- package/dist/theme/class-name/apply-theme-to-class-name.cjs.map +1 -0
- package/dist/theme/class-name/apply-theme-to-class-name.mjs +22 -0
- package/dist/theme/class-name/apply-theme-to-class-name.mjs.map +1 -0
- package/dist/theme/class-name/resolve-theme-from-class-name.cjs +23 -0
- package/dist/theme/class-name/resolve-theme-from-class-name.cjs.map +1 -0
- package/dist/theme/class-name/resolve-theme-from-class-name.mjs +22 -0
- package/dist/theme/class-name/resolve-theme-from-class-name.mjs.map +1 -0
- package/dist/theme/compose-theme-stores.cjs +74 -0
- package/dist/theme/compose-theme-stores.cjs.map +1 -0
- package/dist/theme/compose-theme-stores.d.cts +33 -0
- package/dist/theme/compose-theme-stores.d.cts.map +1 -0
- package/dist/theme/compose-theme-stores.d.mts +33 -0
- package/dist/theme/compose-theme-stores.d.mts.map +1 -0
- package/dist/theme/compose-theme-stores.mjs +74 -0
- package/dist/theme/compose-theme-stores.mjs.map +1 -0
- package/dist/theme/data-attribute/apply-theme-to-data-attribute.cjs +23 -0
- package/dist/theme/data-attribute/apply-theme-to-data-attribute.cjs.map +1 -0
- package/dist/theme/data-attribute/apply-theme-to-data-attribute.mjs +22 -0
- package/dist/theme/data-attribute/apply-theme-to-data-attribute.mjs.map +1 -0
- package/dist/theme/data-attribute/resolve-theme-from-data-attribute.cjs +23 -0
- package/dist/theme/data-attribute/resolve-theme-from-data-attribute.cjs.map +1 -0
- package/dist/theme/data-attribute/resolve-theme-from-data-attribute.mjs +22 -0
- package/dist/theme/data-attribute/resolve-theme-from-data-attribute.mjs.map +1 -0
- package/dist/theme/theme-entry.cjs +13 -0
- package/dist/theme/theme-entry.cjs.map +1 -0
- package/dist/theme/theme-entry.d.cts +9 -0
- package/dist/theme/theme-entry.d.cts.map +1 -0
- package/dist/theme/theme-entry.d.mts +9 -0
- package/dist/theme/theme-entry.d.mts.map +1 -0
- package/dist/theme/theme-entry.mjs +12 -0
- package/dist/theme/theme-entry.mjs.map +1 -0
- package/dist/theme/theme-entry.types.d.cts +16 -0
- package/dist/theme/theme-entry.types.d.cts.map +1 -0
- package/dist/theme/theme-entry.types.d.mts +16 -0
- package/dist/theme/theme-entry.types.d.mts.map +1 -0
- package/dist/theme/theme-map.types.d.cts +10 -0
- package/dist/theme/theme-map.types.d.cts.map +1 -0
- package/dist/theme/theme-map.types.d.mts +10 -0
- package/dist/theme/theme-map.types.d.mts.map +1 -0
- package/dist/theme/theme-store/async-theme-store.types.d.cts +25 -0
- package/dist/theme/theme-store/async-theme-store.types.d.cts.map +1 -0
- package/dist/theme/theme-store/async-theme-store.types.d.mts +25 -0
- package/dist/theme/theme-store/async-theme-store.types.d.mts.map +1 -0
- package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.cjs +53 -0
- package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.cjs.map +1 -0
- package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.d.cts +28 -0
- package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.d.cts.map +1 -0
- package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.d.mts +28 -0
- package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.d.mts.map +1 -0
- package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.mjs +53 -0
- package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.mjs.map +1 -0
- package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.cjs +121 -0
- package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.cjs.map +1 -0
- package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.d.cts +65 -0
- package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.d.cts.map +1 -0
- package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.d.mts +65 -0
- package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.d.mts.map +1 -0
- package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.mjs +120 -0
- package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.mjs.map +1 -0
- package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.cjs +51 -0
- package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.cjs.map +1 -0
- package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.cts +30 -0
- package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.cts.map +1 -0
- package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.mts +30 -0
- package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.mts.map +1 -0
- package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.mjs +51 -0
- package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.mjs.map +1 -0
- package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.cjs +54 -0
- package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.cjs.map +1 -0
- package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.d.cts +31 -0
- package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.d.cts.map +1 -0
- package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.d.mts +31 -0
- package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.d.mts.map +1 -0
- package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.mjs +54 -0
- package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.mjs.map +1 -0
- package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.cjs +67 -0
- package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.cjs.map +1 -0
- package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.cts +34 -0
- package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.cts.map +1 -0
- package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.mts +34 -0
- package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.mts.map +1 -0
- package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.mjs +67 -0
- package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.mjs.map +1 -0
- package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.cjs +39 -0
- package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.cjs.map +1 -0
- package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.d.cts +32 -0
- package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.d.cts.map +1 -0
- package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.d.mts +32 -0
- package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.d.mts.map +1 -0
- package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.mjs +39 -0
- package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.mjs.map +1 -0
- package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.cjs +67 -0
- package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.cjs.map +1 -0
- package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.d.cts +34 -0
- package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.d.cts.map +1 -0
- package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.d.mts +34 -0
- package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.d.mts.map +1 -0
- package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.mjs +67 -0
- package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.mjs.map +1 -0
- package/dist/theme/theme-store/theme-store-factory.types.d.cts +10 -0
- package/dist/theme/theme-store/theme-store-factory.types.d.cts.map +1 -0
- package/dist/theme/theme-store/theme-store-factory.types.d.mts +10 -0
- package/dist/theme/theme-store/theme-store-factory.types.d.mts.map +1 -0
- package/dist/theme/theme-store/theme-store.types.d.cts +33 -0
- package/dist/theme/theme-store/theme-store.types.d.cts.map +1 -0
- package/dist/theme/theme-store/theme-store.types.d.mts +33 -0
- package/dist/theme/theme-store/theme-store.types.d.mts.map +1 -0
- package/dist/theme.cjs +20 -0
- package/dist/theme.d.cts +15 -0
- package/dist/theme.d.mts +15 -0
- package/dist/theme.mjs +11 -0
- package/dist/units/get-rem-to-px-scale.cjs +30 -0
- package/dist/units/get-rem-to-px-scale.cjs.map +1 -0
- package/dist/units/get-rem-to-px-scale.d.cts +21 -0
- package/dist/units/get-rem-to-px-scale.d.cts.map +1 -0
- package/dist/units/get-rem-to-px-scale.d.mts +21 -0
- package/dist/units/get-rem-to-px-scale.d.mts.map +1 -0
- package/dist/units/get-rem-to-px-scale.mjs +29 -0
- package/dist/units/get-rem-to-px-scale.mjs.map +1 -0
- package/dist/units/px-2-num.cjs +23 -0
- package/dist/units/px-2-num.cjs.map +1 -0
- package/dist/units/px-2-num.d.cts +19 -0
- package/dist/units/px-2-num.d.cts.map +1 -0
- package/dist/units/px-2-num.d.mts +19 -0
- package/dist/units/px-2-num.d.mts.map +1 -0
- package/dist/units/px-2-num.mjs +22 -0
- package/dist/units/px-2-num.mjs.map +1 -0
- package/dist/units/px-2-rem.cjs +31 -0
- package/dist/units/px-2-rem.cjs.map +1 -0
- package/dist/units/px-2-rem.d.cts +25 -0
- package/dist/units/px-2-rem.d.cts.map +1 -0
- package/dist/units/px-2-rem.d.mts +25 -0
- package/dist/units/px-2-rem.d.mts.map +1 -0
- package/dist/units/px-2-rem.mjs +30 -0
- package/dist/units/px-2-rem.mjs.map +1 -0
- package/dist/units/rem-2-px.cjs +31 -0
- package/dist/units/rem-2-px.cjs.map +1 -0
- package/dist/units/rem-2-px.d.cts +25 -0
- package/dist/units/rem-2-px.d.cts.map +1 -0
- package/dist/units/rem-2-px.d.mts +25 -0
- package/dist/units/rem-2-px.d.mts.map +1 -0
- package/dist/units/rem-2-px.mjs +30 -0
- package/dist/units/rem-2-px.mjs.map +1 -0
- package/dist/utils/append-id.cjs +16 -0
- package/dist/utils/append-id.cjs.map +1 -0
- package/dist/utils/append-id.d.cts +12 -0
- package/dist/utils/append-id.d.cts.map +1 -0
- package/dist/utils/append-id.d.mts +12 -0
- package/dist/utils/append-id.d.mts.map +1 -0
- package/dist/utils/append-id.mjs +15 -0
- package/dist/utils/append-id.mjs.map +1 -0
- package/package.json +120 -0
- package/readme.md +15 -0
- package/src/_internal/utils/try-parse-json.ts +8 -0
- package/src/attributes/data-attribute.ts +49 -0
- package/src/attributes/get-attribute.ts +20 -0
- package/src/attributes/get-data-attribute.ts +15 -0
- package/src/attributes/observe-attribute.ts +37 -0
- package/src/attributes/observe-data-attribute.ts +29 -0
- package/src/children/just-children-fn-props.editor.default.tsx +29 -0
- package/src/children/just-children-props.editor.default.tsx +17 -0
- package/src/children/just-children.editor.default.tsx +11 -0
- package/src/children/just-children.ts +37 -0
- package/src/children/resolve-children.ts +16 -0
- package/src/class-name/class-name-props.editor.tsx +13 -0
- package/src/class-name/class-name-props.ts +7 -0
- package/src/class-name/clsx.ts +3 -0
- package/src/class-name/just-class-name-props.editor.default.tsx +23 -0
- package/src/class-name/just-class-name-resolver-state.editor.default.tsx +18 -0
- package/src/class-name/just-class-name.editor.default-class-name.tsx +28 -0
- package/src/class-name/just-class-name.editor.default.tsx +14 -0
- package/src/class-name/just-class-name.editor.type-param.tsx +25 -0
- package/src/class-name/just-class-name.ts +36 -0
- package/src/class-name/resolve-class-name.ts +12 -0
- package/src/color-scheme/get-prefers-color-scheme.ts +17 -0
- package/src/color-scheme/observe-prefers-color-scheme.ts +24 -0
- package/src/index.ts +25 -0
- package/src/react/hooks/use-attribute.ts +59 -0
- package/src/react/hooks/use-prefers-color-scheme.ts +42 -0
- package/src/react/hooks/use-theme-by-class-name.ts +69 -0
- package/src/react/hooks/use-theme-by-data-attribute.ts +84 -0
- package/src/react/hooks/use-theme-by-local-storage.ts +68 -0
- package/src/react/hooks/use-theme-stores.ts +83 -0
- package/src/react/theme/create-theme-hook.ts +197 -0
- package/src/react.ts +7 -0
- package/src/style/css-properties.ts +20 -0
- package/src/style/define-css-properties.ts +23 -0
- package/src/style/get-css-variable-value.ts +32 -0
- package/src/style/just-style-props.editor.default.tsx +17 -0
- package/src/style/just-style-resolver-state.editor.default.tsx +22 -0
- package/src/style/just-style.editor.default.tsx +17 -0
- package/src/style/just-style.editor.type-param.tsx +31 -0
- package/src/style/just-style.ts +60 -0
- package/src/style/resolve-style.ts +23 -0
- package/src/style/style-props.editor.tsx +13 -0
- package/src/style/style-props.ts +8 -0
- package/src/style/to-dom-style.ts +36 -0
- package/src/testing/button.theme.ts +21 -0
- package/src/testing/button.tsx +11 -0
- package/src/testing/log-panel.tsx +14 -0
- package/src/testing/theme/dummy-theme-store.ts +7 -0
- package/src/testing/theme/theme-result-card.tsx +43 -0
- package/src/testing/theme/theme-store-demo.tsx +87 -0
- package/src/theme/_utils/get-theme-from-stores.ts +34 -0
- package/src/theme/_utils/observe-theme-from-stores.ts +57 -0
- package/src/theme/_utils/parse-stored-theme.ts +21 -0
- package/src/theme/_utils/set-theme-to-stores.ts +23 -0
- package/src/theme/class-name/apply-theme-to-class-name.ts +26 -0
- package/src/theme/class-name/resolve-theme-from-class-name.ts +22 -0
- package/src/theme/compose-theme-stores.ts +139 -0
- package/src/theme/data-attribute/apply-theme-to-data-attribute.ts +27 -0
- package/src/theme/data-attribute/resolve-theme-from-data-attribute.ts +23 -0
- package/src/theme/theme-entry.ts +10 -0
- package/src/theme/theme-entry.types.ts +11 -0
- package/src/theme/theme-map.types.ts +6 -0
- package/src/theme/theme-store/async-theme-store.types.ts +24 -0
- package/src/theme/theme-store/class-name-theme-store/class-name-theme-store.ts +62 -0
- package/src/theme/theme-store/cookie-theme-store/cookie-theme-store.ts +174 -0
- package/src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.ts +60 -0
- package/src/theme/theme-store/in-memory-theme-store/in-memory-theme-store.ts +54 -0
- package/src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.ts +83 -0
- package/src/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.ts +43 -0
- package/src/theme/theme-store/session-storage-theme-store/session-storage-theme-store.ts +83 -0
- package/src/theme/theme-store/theme-store-factory.types.ts +9 -0
- package/src/theme/theme-store/theme-store.types.ts +30 -0
- package/src/theme.ts +14 -0
- package/src/units/get-rem-to-px-scale.ts +27 -0
- package/src/units/px-2-num.ts +17 -0
- package/src/units/px-2-rem.ts +30 -0
- package/src/units/rem-2-px.ts +30 -0
- package/src/utils/append-id.ts +10 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createThemeHook } from "../theme/create-theme-hook.mjs";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/react/hooks/use-theme-stores.ts
|
|
5
|
+
/**
|
|
6
|
+
* React hook that returns the current theme and a setter for composed theme stores.
|
|
7
|
+
* Delegates to createThemeHook internally.
|
|
8
|
+
*
|
|
9
|
+
* Accepts `stores` in two forms:
|
|
10
|
+
* - **Factory (recommended):** `() => [store1, store2, ...]` — run once on mount; no memoization needed.
|
|
11
|
+
* - **Array:** `[store1, store2, ...]` — must be memoized or ref-stable; recreating the array each render breaks subscriptions.
|
|
12
|
+
*
|
|
13
|
+
* @param themes - ThemeMap mapping theme keys to their values (e.g. CSS class names)
|
|
14
|
+
* @param stores - Array or factory returning 1–8 theme stores (see ComposeThemeStoreEntry)
|
|
15
|
+
* @param options.defaultTheme - Fallback theme key when stores return empty; also used for SSR
|
|
16
|
+
* @returns Tuple of [currentTheme, setTheme]
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* // Factory form — no memoization needed
|
|
21
|
+
* const [theme, setTheme] = useThemeStores(
|
|
22
|
+
* themes,
|
|
23
|
+
* () => [inMemoryThemeStore(themes)],
|
|
24
|
+
* { defaultTheme: 'light' }
|
|
25
|
+
* )
|
|
26
|
+
*
|
|
27
|
+
* // Array form — must be memoized
|
|
28
|
+
* const stores = useMemo(() => [localStorageStore], [])
|
|
29
|
+
* const [theme, setTheme] = useThemeStores(themes, stores, { defaultTheme: 'light' })
|
|
30
|
+
* setTheme('dark')
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
function useThemeStores(themes, stores, options) {
|
|
34
|
+
return createThemeHook(themes, useMemo(() => typeof stores === "function" ? stores() : stores, []), options)(options?.defaultTheme);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
//#endregion
|
|
38
|
+
export { useThemeStores };
|
|
39
|
+
//# sourceMappingURL=use-theme-stores.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-theme-stores.mjs","names":[],"sources":["../../../src/react/hooks/use-theme-stores.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport type {\n\tComposeThemeStoreEntry,\n\tComposeThemeStoresOptions\n} from '../../theme/compose-theme-stores.ts'\nimport type { ThemeMap } from '../../theme/theme-map.types.ts'\nimport type { ThemeStoreFactory } from '../../theme/theme-store/theme-store-factory.types.ts'\nimport { createThemeHook } from '../theme/create-theme-hook.ts'\n\ntype ThemeStoresTuple<\n\tThemes extends ThemeMap,\n\tA extends ThemeStoreFactory<Themes> = never,\n\tB extends ThemeStoreFactory<Themes> = never,\n\tC extends ThemeStoreFactory<Themes> = never,\n\tD extends ThemeStoreFactory<Themes> = never,\n\tE extends ThemeStoreFactory<Themes> = never,\n\tF extends ThemeStoreFactory<Themes> = never,\n\tG extends ThemeStoreFactory<Themes> = never,\n\tH extends ThemeStoreFactory<Themes> = never\n> = readonly [\n\tstore1: ComposeThemeStoreEntry<Themes, A>,\n\tstore2?: ComposeThemeStoreEntry<Themes, B>,\n\tstore3?: ComposeThemeStoreEntry<Themes, C>,\n\tstore4?: ComposeThemeStoreEntry<Themes, D>,\n\tstore5?: ComposeThemeStoreEntry<Themes, E>,\n\tstore6?: ComposeThemeStoreEntry<Themes, F>,\n\tstore7?: ComposeThemeStoreEntry<Themes, G>,\n\tstore8?: ComposeThemeStoreEntry<Themes, H>\n]\n\n/**\n * React hook that returns the current theme and a setter for composed theme stores.\n * Delegates to createThemeHook internally.\n *\n * Accepts `stores` in two forms:\n * - **Factory (recommended):** `() => [store1, store2, ...]` — run once on mount; no memoization needed.\n * - **Array:** `[store1, store2, ...]` — must be memoized or ref-stable; recreating the array each render breaks subscriptions.\n *\n * @param themes - ThemeMap mapping theme keys to their values (e.g. CSS class names)\n * @param stores - Array or factory returning 1–8 theme stores (see ComposeThemeStoreEntry)\n * @param options.defaultTheme - Fallback theme key when stores return empty; also used for SSR\n * @returns Tuple of [currentTheme, setTheme]\n *\n * @example\n * ```tsx\n * // Factory form — no memoization needed\n * const [theme, setTheme] = useThemeStores(\n * themes,\n * () => [inMemoryThemeStore(themes)],\n * { defaultTheme: 'light' }\n * )\n *\n * // Array form — must be memoized\n * const stores = useMemo(() => [localStorageStore], [])\n * const [theme, setTheme] = useThemeStores(themes, stores, { defaultTheme: 'light' })\n * setTheme('dark')\n * ```\n */\nexport function useThemeStores<\n\tThemes extends ThemeMap,\n\tA extends ThemeStoreFactory<Themes> = never,\n\tB extends ThemeStoreFactory<Themes> = never,\n\tC extends ThemeStoreFactory<Themes> = never,\n\tD extends ThemeStoreFactory<Themes> = never,\n\tE extends ThemeStoreFactory<Themes> = never,\n\tF extends ThemeStoreFactory<Themes> = never,\n\tG extends ThemeStoreFactory<Themes> = never,\n\tH extends ThemeStoreFactory<Themes> = never\n>(\n\tthemes: Themes,\n\tstores:\n\t\t| ThemeStoresTuple<Themes, A, B, C, D, E, F, G, H>\n\t\t| (() => ThemeStoresTuple<Themes, A, B, C, D, E, F, G, H>),\n\toptions?: ComposeThemeStoresOptions<Themes>\n): [keyof Themes | undefined, (theme: keyof Themes) => void] {\n\tconst resolvedStores = useMemo(\n\t\t() => (typeof stores === 'function' ? stores() : stores),\n\t\t// Empty deps: factory runs once on mount; array form must be ref-stable (user memoizes)\n\t\t[]\n\t)\n\tconst useTheme = createThemeHook<Themes, A, B, C, D, E, F, G, H>(themes, resolvedStores, options)\n\treturn useTheme(options?.defaultTheme)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DA,SAAgB,eAWf,QACA,QAGA,SAC4D;AAO5D,QADiB,gBAAgD,QAL1C,cACf,OAAO,WAAW,aAAa,QAAQ,GAAG,QAEjD,EAAE,CACF,EACwF,QAAQ,CACjF,SAAS,aAAa"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_theme_entry = require('../../theme/theme-entry.cjs');
|
|
3
|
+
const require_compose_theme_stores = require('../../theme/compose-theme-stores.cjs');
|
|
4
|
+
let react = require("react");
|
|
5
|
+
|
|
6
|
+
//#region src/react/theme/create-theme-hook.ts
|
|
7
|
+
/**
|
|
8
|
+
* Creates a React hook for theme selection that reads from and writes to composed theme stores.
|
|
9
|
+
*
|
|
10
|
+
* The returned hook subscribes to store changes via `useSyncExternalStore`, supports SSR
|
|
11
|
+
* (uses `defaultTheme` for server snapshot), and returns a `[theme, setTheme]` tuple.
|
|
12
|
+
* Channels are cached per store configuration and default theme for efficient reuse.
|
|
13
|
+
*
|
|
14
|
+
* @param themes - ThemeMap mapping theme keys to their values (e.g. CSS class names)
|
|
15
|
+
* @param stores - Array of 1–8 theme stores or factory configs (see ComposeThemeStoreEntry)
|
|
16
|
+
* @param options.defaultTheme - Fallback theme key when stores return empty; also used for SSR
|
|
17
|
+
* @returns A `useTheme` hook that returns `[currentTheme, setTheme]` tuple
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const useTheme = createThemeHook(themes, [localStorageStore], { defaultTheme: 'light' })
|
|
22
|
+
* const [theme, setTheme] = useTheme()
|
|
23
|
+
* setTheme('dark')
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
function createThemeHook(themes, stores, options) {
|
|
27
|
+
const { defaultTheme } = options ?? {};
|
|
28
|
+
return function useTheme(overrideDefaultTheme) {
|
|
29
|
+
const channel = getOrCreateChannel(themes, stores, { defaultTheme: overrideDefaultTheme ?? defaultTheme });
|
|
30
|
+
return [(0, react.useSyncExternalStore)(channel.subscribe, channel.getSnapshot, channel.getServerSnapshot), (0, react.useCallback)(async (newTheme) => {
|
|
31
|
+
await channel.setTheme(newTheme);
|
|
32
|
+
}, [channel])];
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Creates a subscription channel bridging a composed theme store to React's useSyncExternalStore.
|
|
37
|
+
* Manages listeners, initial async read from store, and delegates setTheme to store.write.
|
|
38
|
+
*
|
|
39
|
+
* @internal
|
|
40
|
+
*/
|
|
41
|
+
function createSharedChannel(themes, composedStore, defaultTheme) {
|
|
42
|
+
let lastTheme = defaultTheme;
|
|
43
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
44
|
+
const notify = (theme) => {
|
|
45
|
+
lastTheme = theme;
|
|
46
|
+
for (const fn of listeners) fn(theme);
|
|
47
|
+
};
|
|
48
|
+
const handleStoreUpdate = (entry) => {
|
|
49
|
+
notify(entry?.theme ?? defaultTheme);
|
|
50
|
+
};
|
|
51
|
+
Promise.resolve(composedStore.read()).then((entry) => {
|
|
52
|
+
notify(entry?.theme ?? defaultTheme);
|
|
53
|
+
});
|
|
54
|
+
let unobserve = composedStore.subscribe(handleStoreUpdate);
|
|
55
|
+
let isSubscribedToStore = true;
|
|
56
|
+
const subscribe = (listener) => {
|
|
57
|
+
if (!isSubscribedToStore) {
|
|
58
|
+
unobserve = composedStore.subscribe(handleStoreUpdate);
|
|
59
|
+
isSubscribedToStore = true;
|
|
60
|
+
}
|
|
61
|
+
listeners.add(listener);
|
|
62
|
+
listener(lastTheme);
|
|
63
|
+
return () => {
|
|
64
|
+
listeners.delete(listener);
|
|
65
|
+
if (listeners.size === 0) {
|
|
66
|
+
unobserve();
|
|
67
|
+
isSubscribedToStore = false;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
const getSnapshot = () => lastTheme;
|
|
72
|
+
const getServerSnapshot = () => defaultTheme;
|
|
73
|
+
return {
|
|
74
|
+
subscribe,
|
|
75
|
+
getSnapshot,
|
|
76
|
+
getServerSnapshot,
|
|
77
|
+
setTheme: (theme) => composedStore.write(require_theme_entry.themeEntry(themes, theme))
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const channelsByStores = /* @__PURE__ */ new WeakMap();
|
|
81
|
+
/**
|
|
82
|
+
* Returns a cached shared channel for the given themes, stores, and defaultTheme.
|
|
83
|
+
* Channels are keyed by stores (WeakMap) and defaultTheme to avoid duplicate subscriptions.
|
|
84
|
+
*
|
|
85
|
+
* @internal
|
|
86
|
+
*/
|
|
87
|
+
function getOrCreateChannel(themes, stores, options) {
|
|
88
|
+
const { defaultTheme } = options ?? {};
|
|
89
|
+
const storesKey = stores;
|
|
90
|
+
let byDefault = channelsByStores.get(storesKey);
|
|
91
|
+
if (!byDefault) {
|
|
92
|
+
byDefault = /* @__PURE__ */ new Map();
|
|
93
|
+
channelsByStores.set(storesKey, byDefault);
|
|
94
|
+
}
|
|
95
|
+
let channel = byDefault.get(defaultTheme);
|
|
96
|
+
if (!channel) {
|
|
97
|
+
channel = createSharedChannel(themes, require_compose_theme_stores.composeThemeStores(themes, stores, { defaultTheme }), defaultTheme);
|
|
98
|
+
byDefault.set(defaultTheme, channel);
|
|
99
|
+
}
|
|
100
|
+
return channel;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
//#endregion
|
|
104
|
+
exports.createThemeHook = createThemeHook;
|
|
105
|
+
//# sourceMappingURL=create-theme-hook.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-theme-hook.cjs","names":["lastTheme: keyof Themes | undefined","unobserve: () => void","themeEntry","composeThemeStores"],"sources":["../../../src/react/theme/create-theme-hook.ts"],"sourcesContent":["import { useCallback, useSyncExternalStore } from 'react'\nimport type { Required } from 'type-plus'\nimport {\n\ttype ComposeThemeStoreEntry,\n\ttype ComposeThemeStoresOptions,\n\tcomposeThemeStores\n} from '../../theme/compose-theme-stores.ts'\nimport { themeEntry } from '../../theme/theme-entry.ts'\nimport type { ThemeEntry } from '../../theme/theme-entry.types.ts'\nimport type { ThemeMap } from '../../theme/theme-map.types.ts'\nimport type { AsyncThemeStore } from '../../theme/theme-store/async-theme-store.types.ts'\nimport type { ThemeStoreFactory } from '../../theme/theme-store/theme-store-factory.types.ts'\n\n/**\n * Creates a React hook for theme selection that reads from and writes to composed theme stores.\n *\n * The returned hook subscribes to store changes via `useSyncExternalStore`, supports SSR\n * (uses `defaultTheme` for server snapshot), and returns a `[theme, setTheme]` tuple.\n * Channels are cached per store configuration and default theme for efficient reuse.\n *\n * @param themes - ThemeMap mapping theme keys to their values (e.g. CSS class names)\n * @param stores - Array of 1–8 theme stores or factory configs (see ComposeThemeStoreEntry)\n * @param options.defaultTheme - Fallback theme key when stores return empty; also used for SSR\n * @returns A `useTheme` hook that returns `[currentTheme, setTheme]` tuple\n *\n * @example\n * ```ts\n * const useTheme = createThemeHook(themes, [localStorageStore], { defaultTheme: 'light' })\n * const [theme, setTheme] = useTheme()\n * setTheme('dark')\n * ```\n */\nexport function createThemeHook<\n\tThemes extends ThemeMap,\n\tA extends ThemeStoreFactory<Themes> = never,\n\tB extends ThemeStoreFactory<Themes> = never,\n\tC extends ThemeStoreFactory<Themes> = never,\n\tD extends ThemeStoreFactory<Themes> = never,\n\tE extends ThemeStoreFactory<Themes> = never,\n\tF extends ThemeStoreFactory<Themes> = never,\n\tG extends ThemeStoreFactory<Themes> = never,\n\tH extends ThemeStoreFactory<Themes> = never\n>(\n\tthemes: Themes,\n\tstores: readonly [\n\t\tstore1: ComposeThemeStoreEntry<Themes, A>,\n\t\tstore2?: ComposeThemeStoreEntry<Themes, B>,\n\t\tstore3?: ComposeThemeStoreEntry<Themes, C>,\n\t\tstore4?: ComposeThemeStoreEntry<Themes, D>,\n\t\tstore5?: ComposeThemeStoreEntry<Themes, E>,\n\t\tstore6?: ComposeThemeStoreEntry<Themes, F>,\n\t\tstore7?: ComposeThemeStoreEntry<Themes, G>,\n\t\tstore8?: ComposeThemeStoreEntry<Themes, H>\n\t],\n\toptions?: ComposeThemeStoresOptions<Themes>\n): (\n\toverrideDefaultTheme?: keyof Themes | undefined\n) => [keyof Themes | undefined, (theme: keyof Themes) => void] {\n\tconst { defaultTheme } = options ?? {}\n\treturn function useTheme(overrideDefaultTheme?: keyof Themes | undefined) {\n\t\tconst effectiveDefault = overrideDefaultTheme ?? defaultTheme\n\t\tconst channel = getOrCreateChannel<Themes, A, B, C, D, E, F, G, H>(themes, stores, {\n\t\t\tdefaultTheme: effectiveDefault\n\t\t})\n\n\t\tconst theme = useSyncExternalStore<keyof Themes | undefined>(\n\t\t\tchannel.subscribe,\n\t\t\tchannel.getSnapshot,\n\t\t\tchannel.getServerSnapshot\n\t\t)\n\n\t\tconst setTheme = useCallback(\n\t\t\tasync (newTheme: keyof Themes) => {\n\t\t\t\tawait channel.setTheme(newTheme)\n\t\t\t},\n\t\t\t[channel]\n\t\t)\n\n\t\treturn [theme, setTheme]\n\t}\n}\n\n/**\n * Creates a subscription channel bridging a composed theme store to React's useSyncExternalStore.\n * Manages listeners, initial async read from store, and delegates setTheme to store.write.\n *\n * @internal\n */\nfunction createSharedChannel<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tcomposedStore: Required<AsyncThemeStore<Themes>>,\n\tdefaultTheme: keyof Themes | undefined\n) {\n\tlet lastTheme: keyof Themes | undefined = defaultTheme\n\tconst listeners = new Set<(theme: keyof Themes | undefined) => void>()\n\n\tconst notify = (theme: keyof Themes | undefined) => {\n\t\tlastTheme = theme\n\t\tfor (const fn of listeners) {\n\t\t\tfn(theme)\n\t\t}\n\t}\n\n\tconst handleStoreUpdate = (entry: ThemeEntry<Themes> | undefined | null) => {\n\t\tnotify(entry?.theme ?? defaultTheme)\n\t}\n\n\t// Initial read to populate lastTheme (compose store subscribe has no initial notify)\n\tvoid Promise.resolve(composedStore.read()).then(\n\t\t(entry: ThemeEntry<Themes> | undefined | null) => {\n\t\t\tnotify(entry?.theme ?? defaultTheme)\n\t\t}\n\t)\n\n\tlet unobserve: () => void = composedStore.subscribe(handleStoreUpdate)\n\tlet isSubscribedToStore = true\n\n\tconst subscribe = (listener: (theme: keyof Themes | undefined) => void) => {\n\t\tif (!isSubscribedToStore) {\n\t\t\tunobserve = composedStore.subscribe(handleStoreUpdate)\n\t\t\tisSubscribedToStore = true\n\t\t}\n\t\tlisteners.add(listener)\n\t\tlistener(lastTheme)\n\t\treturn () => {\n\t\t\tlisteners.delete(listener)\n\t\t\tif (listeners.size === 0) {\n\t\t\t\tunobserve()\n\t\t\t\tisSubscribedToStore = false\n\t\t\t}\n\t\t}\n\t}\n\n\tconst getSnapshot = (): keyof Themes | undefined => lastTheme\n\tconst getServerSnapshot = (): keyof Themes | undefined => defaultTheme\n\n\treturn {\n\t\tsubscribe,\n\t\tgetSnapshot,\n\t\tgetServerSnapshot,\n\t\tsetTheme: (theme: keyof Themes) => composedStore.write(themeEntry(themes, theme))\n\t}\n}\n\nconst channelsByStores = new WeakMap<\n\tobject,\n\tMap<string | undefined, ReturnType<typeof createSharedChannel<any>>>\n>()\n\n/**\n * Returns a cached shared channel for the given themes, stores, and defaultTheme.\n * Channels are keyed by stores (WeakMap) and defaultTheme to avoid duplicate subscriptions.\n *\n * @internal\n */\nfunction getOrCreateChannel<\n\tThemes extends ThemeMap,\n\tA extends ThemeStoreFactory<Themes> = never,\n\tB extends ThemeStoreFactory<Themes> = never,\n\tC extends ThemeStoreFactory<Themes> = never,\n\tD extends ThemeStoreFactory<Themes> = never,\n\tE extends ThemeStoreFactory<Themes> = never,\n\tF extends ThemeStoreFactory<Themes> = never,\n\tG extends ThemeStoreFactory<Themes> = never,\n\tH extends ThemeStoreFactory<Themes> = never\n>(\n\tthemes: Themes,\n\tstores: readonly [\n\t\tstore1: ComposeThemeStoreEntry<Themes, A>,\n\t\tstore2?: ComposeThemeStoreEntry<Themes, B>,\n\t\tstore3?: ComposeThemeStoreEntry<Themes, C>,\n\t\tstore4?: ComposeThemeStoreEntry<Themes, D>,\n\t\tstore5?: ComposeThemeStoreEntry<Themes, E>,\n\t\tstore6?: ComposeThemeStoreEntry<Themes, F>,\n\t\tstore7?: ComposeThemeStoreEntry<Themes, G>,\n\t\tstore8?: ComposeThemeStoreEntry<Themes, H>\n\t],\n\toptions?: ComposeThemeStoresOptions<Themes> | undefined\n) {\n\tconst { defaultTheme } = options ?? {}\n\tconst storesKey = stores as unknown as object\n\tlet byDefault = channelsByStores.get(storesKey) as Map<\n\t\tkeyof Themes | undefined,\n\t\tReturnType<typeof createSharedChannel<Themes>>\n\t>\n\tif (!byDefault) {\n\t\tbyDefault = new Map<keyof Themes | undefined, ReturnType<typeof createSharedChannel<Themes>>>()\n\t\tchannelsByStores.set(storesKey, byDefault as any)\n\t}\n\tlet channel = byDefault.get(defaultTheme) as ReturnType<typeof createSharedChannel<Themes>>\n\tif (!channel) {\n\t\tconst composedStore = composeThemeStores(themes, stores, { defaultTheme })\n\t\tchannel = createSharedChannel<Themes>(themes, composedStore, defaultTheme)\n\t\tbyDefault.set(defaultTheme, channel)\n\t}\n\treturn channel\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,SAAgB,gBAWf,QACA,QAUA,SAG8D;CAC9D,MAAM,EAAE,iBAAiB,WAAW,EAAE;AACtC,QAAO,SAAS,SAAS,sBAAiD;EAEzE,MAAM,UAAU,mBAAmD,QAAQ,QAAQ,EAClF,cAFwB,wBAAwB,cAGhD,CAAC;AAeF,SAAO,iCAZN,QAAQ,WACR,QAAQ,aACR,QAAQ,kBACR,yBAGA,OAAO,aAA2B;AACjC,SAAM,QAAQ,SAAS,SAAS;KAEjC,CAAC,QAAQ,CACT,CAEuB;;;;;;;;;AAU1B,SAAS,oBACR,QACA,eACA,cACC;CACD,IAAIA,YAAsC;CAC1C,MAAM,4BAAY,IAAI,KAAgD;CAEtE,MAAM,UAAU,UAAoC;AACnD,cAAY;AACZ,OAAK,MAAM,MAAM,UAChB,IAAG,MAAM;;CAIX,MAAM,qBAAqB,UAAiD;AAC3E,SAAO,OAAO,SAAS,aAAa;;AAIrC,CAAK,QAAQ,QAAQ,cAAc,MAAM,CAAC,CAAC,MACzC,UAAiD;AACjD,SAAO,OAAO,SAAS,aAAa;GAErC;CAED,IAAIC,YAAwB,cAAc,UAAU,kBAAkB;CACtE,IAAI,sBAAsB;CAE1B,MAAM,aAAa,aAAwD;AAC1E,MAAI,CAAC,qBAAqB;AACzB,eAAY,cAAc,UAAU,kBAAkB;AACtD,yBAAsB;;AAEvB,YAAU,IAAI,SAAS;AACvB,WAAS,UAAU;AACnB,eAAa;AACZ,aAAU,OAAO,SAAS;AAC1B,OAAI,UAAU,SAAS,GAAG;AACzB,eAAW;AACX,0BAAsB;;;;CAKzB,MAAM,oBAA8C;CACpD,MAAM,0BAAoD;AAE1D,QAAO;EACN;EACA;EACA;EACA,WAAW,UAAwB,cAAc,MAAMC,+BAAW,QAAQ,MAAM,CAAC;EACjF;;AAGF,MAAM,mCAAmB,IAAI,SAG1B;;;;;;;AAQH,SAAS,mBAWR,QACA,QAUA,SACC;CACD,MAAM,EAAE,iBAAiB,WAAW,EAAE;CACtC,MAAM,YAAY;CAClB,IAAI,YAAY,iBAAiB,IAAI,UAAU;AAI/C,KAAI,CAAC,WAAW;AACf,8BAAY,IAAI,KAA+E;AAC/F,mBAAiB,IAAI,WAAW,UAAiB;;CAElD,IAAI,UAAU,UAAU,IAAI,aAAa;AACzC,KAAI,CAAC,SAAS;AAEb,YAAU,oBAA4B,QADhBC,gDAAmB,QAAQ,QAAQ,EAAE,cAAc,CAAC,EACb,aAAa;AAC1E,YAAU,IAAI,cAAc,QAAQ;;AAErC,QAAO"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ThemeMap } from "../../theme/theme-map.types.cjs";
|
|
2
|
+
import { ThemeStoreFactory } from "../../theme/theme-store/theme-store-factory.types.cjs";
|
|
3
|
+
import { ComposeThemeStoreEntry, ComposeThemeStoresOptions } from "../../theme/compose-theme-stores.cjs";
|
|
4
|
+
|
|
5
|
+
//#region src/react/theme/create-theme-hook.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Creates a React hook for theme selection that reads from and writes to composed theme stores.
|
|
9
|
+
*
|
|
10
|
+
* The returned hook subscribes to store changes via `useSyncExternalStore`, supports SSR
|
|
11
|
+
* (uses `defaultTheme` for server snapshot), and returns a `[theme, setTheme]` tuple.
|
|
12
|
+
* Channels are cached per store configuration and default theme for efficient reuse.
|
|
13
|
+
*
|
|
14
|
+
* @param themes - ThemeMap mapping theme keys to their values (e.g. CSS class names)
|
|
15
|
+
* @param stores - Array of 1–8 theme stores or factory configs (see ComposeThemeStoreEntry)
|
|
16
|
+
* @param options.defaultTheme - Fallback theme key when stores return empty; also used for SSR
|
|
17
|
+
* @returns A `useTheme` hook that returns `[currentTheme, setTheme]` tuple
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const useTheme = createThemeHook(themes, [localStorageStore], { defaultTheme: 'light' })
|
|
22
|
+
* const [theme, setTheme] = useTheme()
|
|
23
|
+
* setTheme('dark')
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
declare function createThemeHook<Themes extends ThemeMap, A extends ThemeStoreFactory<Themes> = never, B extends ThemeStoreFactory<Themes> = never, C extends ThemeStoreFactory<Themes> = never, D extends ThemeStoreFactory<Themes> = never, E extends ThemeStoreFactory<Themes> = never, F extends ThemeStoreFactory<Themes> = never, G extends ThemeStoreFactory<Themes> = never, H extends ThemeStoreFactory<Themes> = never>(themes: Themes, stores: readonly [store1: ComposeThemeStoreEntry<Themes, A>, store2?: ComposeThemeStoreEntry<Themes, B>, store3?: ComposeThemeStoreEntry<Themes, C>, store4?: ComposeThemeStoreEntry<Themes, D>, store5?: ComposeThemeStoreEntry<Themes, E>, store6?: ComposeThemeStoreEntry<Themes, F>, store7?: ComposeThemeStoreEntry<Themes, G>, store8?: ComposeThemeStoreEntry<Themes, H>], options?: ComposeThemeStoresOptions<Themes>): (overrideDefaultTheme?: keyof Themes | undefined) => [keyof Themes | undefined, (theme: keyof Themes) => void];
|
|
27
|
+
//#endregion
|
|
28
|
+
export { createThemeHook };
|
|
29
|
+
//# sourceMappingURL=create-theme-hook.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-theme-hook.d.cts","names":[],"sources":["../../../src/react/theme/create-theme-hook.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAgCA;;;;;;;;;;;;;;;;;AASW,iBATK,eASL,CAAA,eARK,QAQL,EAAA,UAPA,iBAOA,CAPkB,MAOlB,CAAA,GAAA,KAAA,EAAA,UANA,iBAMA,CANkB,MAMlB,CAAA,GAAA,KAAA,EAAA,UALA,iBAKA,CALkB,MAKlB,CAAA,GAAA,KAAA,EAAA,UAJA,iBAIA,CAJkB,MAIlB,CAAA,GAAA,KAAA,EAAA,UAHA,iBAGA,CAHkB,MAGlB,CAAA,GAAA,KAAA,EAAA,UAFA,iBAEA,CAFkB,MAElB,CAAA,GAAA,KAAA,EAAA,UADA,iBACA,CADkB,MAClB,CAAA,GAAA,KAAA,EAAA,UAAA,iBAAA,CAAkB,MAAlB,CAAA,GAAA,KAAA,CAAA,CAAA,MAAA,EAEF,MAFE,EAAA,MAAA,EAAA,SAAA,CAEF,MAAA,EAEC,sBAFD,CAEwB,MAFxB,EAEgC,CAFhC,CAAA,EAEwB,MAAA,GACtB,sBADsB,CACC,MADD,EACS,CADT,CAAA,EAAQ,MAAA,GAE9B,sBAF8B,CAEP,MAFO,EAEC,CAFD,CAAA,EAA/B,MAAA,GAGC,sBAHD,CAGwB,MAHxB,EAGgC,CAHhC,CAAA,EACwB,MAAA,GAGvB,sBAHuB,CAGA,MAHA,EAGQ,CAHR,CAAA,EAAQ,MAAA,GAI/B,sBAJ+B,CAIR,MAJQ,EAIA,CAJA,CAAA,EAA/B,MAAA,GAKA,sBALA,CAKuB,MALvB,EAK+B,CAL/B,CAAA,EACuB,MAAA,GAKvB,sBALuB,CAKA,MALA,EAKQ,CALR,CAAA,CAAQ,EAAA,OAAA,CAAA,EAO/B,yBAP+B,CAOL,MAPK,CAAA,CAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,MASZ,MATY,GAAA,SAAA,EAAA,GAAA,CAAA,MAU9B,MAV8B,GAAA,SAAA,EAAA,CAAA,KAAA,EAAA,MAUI,MAVJ,EAAA,GAAA,IAAA,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ThemeMap } from "../../theme/theme-map.types.mjs";
|
|
2
|
+
import { ThemeStoreFactory } from "../../theme/theme-store/theme-store-factory.types.mjs";
|
|
3
|
+
import { ComposeThemeStoreEntry, ComposeThemeStoresOptions } from "../../theme/compose-theme-stores.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/react/theme/create-theme-hook.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Creates a React hook for theme selection that reads from and writes to composed theme stores.
|
|
9
|
+
*
|
|
10
|
+
* The returned hook subscribes to store changes via `useSyncExternalStore`, supports SSR
|
|
11
|
+
* (uses `defaultTheme` for server snapshot), and returns a `[theme, setTheme]` tuple.
|
|
12
|
+
* Channels are cached per store configuration and default theme for efficient reuse.
|
|
13
|
+
*
|
|
14
|
+
* @param themes - ThemeMap mapping theme keys to their values (e.g. CSS class names)
|
|
15
|
+
* @param stores - Array of 1–8 theme stores or factory configs (see ComposeThemeStoreEntry)
|
|
16
|
+
* @param options.defaultTheme - Fallback theme key when stores return empty; also used for SSR
|
|
17
|
+
* @returns A `useTheme` hook that returns `[currentTheme, setTheme]` tuple
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const useTheme = createThemeHook(themes, [localStorageStore], { defaultTheme: 'light' })
|
|
22
|
+
* const [theme, setTheme] = useTheme()
|
|
23
|
+
* setTheme('dark')
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
declare function createThemeHook<Themes extends ThemeMap, A extends ThemeStoreFactory<Themes> = never, B extends ThemeStoreFactory<Themes> = never, C extends ThemeStoreFactory<Themes> = never, D extends ThemeStoreFactory<Themes> = never, E extends ThemeStoreFactory<Themes> = never, F extends ThemeStoreFactory<Themes> = never, G extends ThemeStoreFactory<Themes> = never, H extends ThemeStoreFactory<Themes> = never>(themes: Themes, stores: readonly [store1: ComposeThemeStoreEntry<Themes, A>, store2?: ComposeThemeStoreEntry<Themes, B>, store3?: ComposeThemeStoreEntry<Themes, C>, store4?: ComposeThemeStoreEntry<Themes, D>, store5?: ComposeThemeStoreEntry<Themes, E>, store6?: ComposeThemeStoreEntry<Themes, F>, store7?: ComposeThemeStoreEntry<Themes, G>, store8?: ComposeThemeStoreEntry<Themes, H>], options?: ComposeThemeStoresOptions<Themes>): (overrideDefaultTheme?: keyof Themes | undefined) => [keyof Themes | undefined, (theme: keyof Themes) => void];
|
|
27
|
+
//#endregion
|
|
28
|
+
export { createThemeHook };
|
|
29
|
+
//# sourceMappingURL=create-theme-hook.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-theme-hook.d.mts","names":[],"sources":["../../../src/react/theme/create-theme-hook.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAgCA;;;;;;;;;;;;;;;;;AASW,iBATK,eASL,CAAA,eARK,QAQL,EAAA,UAPA,iBAOA,CAPkB,MAOlB,CAAA,GAAA,KAAA,EAAA,UANA,iBAMA,CANkB,MAMlB,CAAA,GAAA,KAAA,EAAA,UALA,iBAKA,CALkB,MAKlB,CAAA,GAAA,KAAA,EAAA,UAJA,iBAIA,CAJkB,MAIlB,CAAA,GAAA,KAAA,EAAA,UAHA,iBAGA,CAHkB,MAGlB,CAAA,GAAA,KAAA,EAAA,UAFA,iBAEA,CAFkB,MAElB,CAAA,GAAA,KAAA,EAAA,UADA,iBACA,CADkB,MAClB,CAAA,GAAA,KAAA,EAAA,UAAA,iBAAA,CAAkB,MAAlB,CAAA,GAAA,KAAA,CAAA,CAAA,MAAA,EAEF,MAFE,EAAA,MAAA,EAAA,SAAA,CAEF,MAAA,EAEC,sBAFD,CAEwB,MAFxB,EAEgC,CAFhC,CAAA,EAEwB,MAAA,GACtB,sBADsB,CACC,MADD,EACS,CADT,CAAA,EAAQ,MAAA,GAE9B,sBAF8B,CAEP,MAFO,EAEC,CAFD,CAAA,EAA/B,MAAA,GAGC,sBAHD,CAGwB,MAHxB,EAGgC,CAHhC,CAAA,EACwB,MAAA,GAGvB,sBAHuB,CAGA,MAHA,EAGQ,CAHR,CAAA,EAAQ,MAAA,GAI/B,sBAJ+B,CAIR,MAJQ,EAIA,CAJA,CAAA,EAA/B,MAAA,GAKA,sBALA,CAKuB,MALvB,EAK+B,CAL/B,CAAA,EACuB,MAAA,GAKvB,sBALuB,CAKA,MALA,EAKQ,CALR,CAAA,CAAQ,EAAA,OAAA,CAAA,EAO/B,yBAP+B,CAOL,MAPK,CAAA,CAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,MASZ,MATY,GAAA,SAAA,EAAA,GAAA,CAAA,MAU9B,MAV8B,GAAA,SAAA,EAAA,CAAA,KAAA,EAAA,MAUI,MAVJ,EAAA,GAAA,IAAA,CAAA"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { themeEntry } from "../../theme/theme-entry.mjs";
|
|
2
|
+
import { composeThemeStores } from "../../theme/compose-theme-stores.mjs";
|
|
3
|
+
import { useCallback, useSyncExternalStore } from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/react/theme/create-theme-hook.ts
|
|
6
|
+
/**
|
|
7
|
+
* Creates a React hook for theme selection that reads from and writes to composed theme stores.
|
|
8
|
+
*
|
|
9
|
+
* The returned hook subscribes to store changes via `useSyncExternalStore`, supports SSR
|
|
10
|
+
* (uses `defaultTheme` for server snapshot), and returns a `[theme, setTheme]` tuple.
|
|
11
|
+
* Channels are cached per store configuration and default theme for efficient reuse.
|
|
12
|
+
*
|
|
13
|
+
* @param themes - ThemeMap mapping theme keys to their values (e.g. CSS class names)
|
|
14
|
+
* @param stores - Array of 1–8 theme stores or factory configs (see ComposeThemeStoreEntry)
|
|
15
|
+
* @param options.defaultTheme - Fallback theme key when stores return empty; also used for SSR
|
|
16
|
+
* @returns A `useTheme` hook that returns `[currentTheme, setTheme]` tuple
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const useTheme = createThemeHook(themes, [localStorageStore], { defaultTheme: 'light' })
|
|
21
|
+
* const [theme, setTheme] = useTheme()
|
|
22
|
+
* setTheme('dark')
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
function createThemeHook(themes, stores, options) {
|
|
26
|
+
const { defaultTheme } = options ?? {};
|
|
27
|
+
return function useTheme(overrideDefaultTheme) {
|
|
28
|
+
const channel = getOrCreateChannel(themes, stores, { defaultTheme: overrideDefaultTheme ?? defaultTheme });
|
|
29
|
+
return [useSyncExternalStore(channel.subscribe, channel.getSnapshot, channel.getServerSnapshot), useCallback(async (newTheme) => {
|
|
30
|
+
await channel.setTheme(newTheme);
|
|
31
|
+
}, [channel])];
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Creates a subscription channel bridging a composed theme store to React's useSyncExternalStore.
|
|
36
|
+
* Manages listeners, initial async read from store, and delegates setTheme to store.write.
|
|
37
|
+
*
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
function createSharedChannel(themes, composedStore, defaultTheme) {
|
|
41
|
+
let lastTheme = defaultTheme;
|
|
42
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
43
|
+
const notify = (theme) => {
|
|
44
|
+
lastTheme = theme;
|
|
45
|
+
for (const fn of listeners) fn(theme);
|
|
46
|
+
};
|
|
47
|
+
const handleStoreUpdate = (entry) => {
|
|
48
|
+
notify(entry?.theme ?? defaultTheme);
|
|
49
|
+
};
|
|
50
|
+
Promise.resolve(composedStore.read()).then((entry) => {
|
|
51
|
+
notify(entry?.theme ?? defaultTheme);
|
|
52
|
+
});
|
|
53
|
+
let unobserve = composedStore.subscribe(handleStoreUpdate);
|
|
54
|
+
let isSubscribedToStore = true;
|
|
55
|
+
const subscribe = (listener) => {
|
|
56
|
+
if (!isSubscribedToStore) {
|
|
57
|
+
unobserve = composedStore.subscribe(handleStoreUpdate);
|
|
58
|
+
isSubscribedToStore = true;
|
|
59
|
+
}
|
|
60
|
+
listeners.add(listener);
|
|
61
|
+
listener(lastTheme);
|
|
62
|
+
return () => {
|
|
63
|
+
listeners.delete(listener);
|
|
64
|
+
if (listeners.size === 0) {
|
|
65
|
+
unobserve();
|
|
66
|
+
isSubscribedToStore = false;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
const getSnapshot = () => lastTheme;
|
|
71
|
+
const getServerSnapshot = () => defaultTheme;
|
|
72
|
+
return {
|
|
73
|
+
subscribe,
|
|
74
|
+
getSnapshot,
|
|
75
|
+
getServerSnapshot,
|
|
76
|
+
setTheme: (theme) => composedStore.write(themeEntry(themes, theme))
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const channelsByStores = /* @__PURE__ */ new WeakMap();
|
|
80
|
+
/**
|
|
81
|
+
* Returns a cached shared channel for the given themes, stores, and defaultTheme.
|
|
82
|
+
* Channels are keyed by stores (WeakMap) and defaultTheme to avoid duplicate subscriptions.
|
|
83
|
+
*
|
|
84
|
+
* @internal
|
|
85
|
+
*/
|
|
86
|
+
function getOrCreateChannel(themes, stores, options) {
|
|
87
|
+
const { defaultTheme } = options ?? {};
|
|
88
|
+
const storesKey = stores;
|
|
89
|
+
let byDefault = channelsByStores.get(storesKey);
|
|
90
|
+
if (!byDefault) {
|
|
91
|
+
byDefault = /* @__PURE__ */ new Map();
|
|
92
|
+
channelsByStores.set(storesKey, byDefault);
|
|
93
|
+
}
|
|
94
|
+
let channel = byDefault.get(defaultTheme);
|
|
95
|
+
if (!channel) {
|
|
96
|
+
channel = createSharedChannel(themes, composeThemeStores(themes, stores, { defaultTheme }), defaultTheme);
|
|
97
|
+
byDefault.set(defaultTheme, channel);
|
|
98
|
+
}
|
|
99
|
+
return channel;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
//#endregion
|
|
103
|
+
export { createThemeHook };
|
|
104
|
+
//# sourceMappingURL=create-theme-hook.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-theme-hook.mjs","names":["lastTheme: keyof Themes | undefined","unobserve: () => void"],"sources":["../../../src/react/theme/create-theme-hook.ts"],"sourcesContent":["import { useCallback, useSyncExternalStore } from 'react'\nimport type { Required } from 'type-plus'\nimport {\n\ttype ComposeThemeStoreEntry,\n\ttype ComposeThemeStoresOptions,\n\tcomposeThemeStores\n} from '../../theme/compose-theme-stores.ts'\nimport { themeEntry } from '../../theme/theme-entry.ts'\nimport type { ThemeEntry } from '../../theme/theme-entry.types.ts'\nimport type { ThemeMap } from '../../theme/theme-map.types.ts'\nimport type { AsyncThemeStore } from '../../theme/theme-store/async-theme-store.types.ts'\nimport type { ThemeStoreFactory } from '../../theme/theme-store/theme-store-factory.types.ts'\n\n/**\n * Creates a React hook for theme selection that reads from and writes to composed theme stores.\n *\n * The returned hook subscribes to store changes via `useSyncExternalStore`, supports SSR\n * (uses `defaultTheme` for server snapshot), and returns a `[theme, setTheme]` tuple.\n * Channels are cached per store configuration and default theme for efficient reuse.\n *\n * @param themes - ThemeMap mapping theme keys to their values (e.g. CSS class names)\n * @param stores - Array of 1–8 theme stores or factory configs (see ComposeThemeStoreEntry)\n * @param options.defaultTheme - Fallback theme key when stores return empty; also used for SSR\n * @returns A `useTheme` hook that returns `[currentTheme, setTheme]` tuple\n *\n * @example\n * ```ts\n * const useTheme = createThemeHook(themes, [localStorageStore], { defaultTheme: 'light' })\n * const [theme, setTheme] = useTheme()\n * setTheme('dark')\n * ```\n */\nexport function createThemeHook<\n\tThemes extends ThemeMap,\n\tA extends ThemeStoreFactory<Themes> = never,\n\tB extends ThemeStoreFactory<Themes> = never,\n\tC extends ThemeStoreFactory<Themes> = never,\n\tD extends ThemeStoreFactory<Themes> = never,\n\tE extends ThemeStoreFactory<Themes> = never,\n\tF extends ThemeStoreFactory<Themes> = never,\n\tG extends ThemeStoreFactory<Themes> = never,\n\tH extends ThemeStoreFactory<Themes> = never\n>(\n\tthemes: Themes,\n\tstores: readonly [\n\t\tstore1: ComposeThemeStoreEntry<Themes, A>,\n\t\tstore2?: ComposeThemeStoreEntry<Themes, B>,\n\t\tstore3?: ComposeThemeStoreEntry<Themes, C>,\n\t\tstore4?: ComposeThemeStoreEntry<Themes, D>,\n\t\tstore5?: ComposeThemeStoreEntry<Themes, E>,\n\t\tstore6?: ComposeThemeStoreEntry<Themes, F>,\n\t\tstore7?: ComposeThemeStoreEntry<Themes, G>,\n\t\tstore8?: ComposeThemeStoreEntry<Themes, H>\n\t],\n\toptions?: ComposeThemeStoresOptions<Themes>\n): (\n\toverrideDefaultTheme?: keyof Themes | undefined\n) => [keyof Themes | undefined, (theme: keyof Themes) => void] {\n\tconst { defaultTheme } = options ?? {}\n\treturn function useTheme(overrideDefaultTheme?: keyof Themes | undefined) {\n\t\tconst effectiveDefault = overrideDefaultTheme ?? defaultTheme\n\t\tconst channel = getOrCreateChannel<Themes, A, B, C, D, E, F, G, H>(themes, stores, {\n\t\t\tdefaultTheme: effectiveDefault\n\t\t})\n\n\t\tconst theme = useSyncExternalStore<keyof Themes | undefined>(\n\t\t\tchannel.subscribe,\n\t\t\tchannel.getSnapshot,\n\t\t\tchannel.getServerSnapshot\n\t\t)\n\n\t\tconst setTheme = useCallback(\n\t\t\tasync (newTheme: keyof Themes) => {\n\t\t\t\tawait channel.setTheme(newTheme)\n\t\t\t},\n\t\t\t[channel]\n\t\t)\n\n\t\treturn [theme, setTheme]\n\t}\n}\n\n/**\n * Creates a subscription channel bridging a composed theme store to React's useSyncExternalStore.\n * Manages listeners, initial async read from store, and delegates setTheme to store.write.\n *\n * @internal\n */\nfunction createSharedChannel<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tcomposedStore: Required<AsyncThemeStore<Themes>>,\n\tdefaultTheme: keyof Themes | undefined\n) {\n\tlet lastTheme: keyof Themes | undefined = defaultTheme\n\tconst listeners = new Set<(theme: keyof Themes | undefined) => void>()\n\n\tconst notify = (theme: keyof Themes | undefined) => {\n\t\tlastTheme = theme\n\t\tfor (const fn of listeners) {\n\t\t\tfn(theme)\n\t\t}\n\t}\n\n\tconst handleStoreUpdate = (entry: ThemeEntry<Themes> | undefined | null) => {\n\t\tnotify(entry?.theme ?? defaultTheme)\n\t}\n\n\t// Initial read to populate lastTheme (compose store subscribe has no initial notify)\n\tvoid Promise.resolve(composedStore.read()).then(\n\t\t(entry: ThemeEntry<Themes> | undefined | null) => {\n\t\t\tnotify(entry?.theme ?? defaultTheme)\n\t\t}\n\t)\n\n\tlet unobserve: () => void = composedStore.subscribe(handleStoreUpdate)\n\tlet isSubscribedToStore = true\n\n\tconst subscribe = (listener: (theme: keyof Themes | undefined) => void) => {\n\t\tif (!isSubscribedToStore) {\n\t\t\tunobserve = composedStore.subscribe(handleStoreUpdate)\n\t\t\tisSubscribedToStore = true\n\t\t}\n\t\tlisteners.add(listener)\n\t\tlistener(lastTheme)\n\t\treturn () => {\n\t\t\tlisteners.delete(listener)\n\t\t\tif (listeners.size === 0) {\n\t\t\t\tunobserve()\n\t\t\t\tisSubscribedToStore = false\n\t\t\t}\n\t\t}\n\t}\n\n\tconst getSnapshot = (): keyof Themes | undefined => lastTheme\n\tconst getServerSnapshot = (): keyof Themes | undefined => defaultTheme\n\n\treturn {\n\t\tsubscribe,\n\t\tgetSnapshot,\n\t\tgetServerSnapshot,\n\t\tsetTheme: (theme: keyof Themes) => composedStore.write(themeEntry(themes, theme))\n\t}\n}\n\nconst channelsByStores = new WeakMap<\n\tobject,\n\tMap<string | undefined, ReturnType<typeof createSharedChannel<any>>>\n>()\n\n/**\n * Returns a cached shared channel for the given themes, stores, and defaultTheme.\n * Channels are keyed by stores (WeakMap) and defaultTheme to avoid duplicate subscriptions.\n *\n * @internal\n */\nfunction getOrCreateChannel<\n\tThemes extends ThemeMap,\n\tA extends ThemeStoreFactory<Themes> = never,\n\tB extends ThemeStoreFactory<Themes> = never,\n\tC extends ThemeStoreFactory<Themes> = never,\n\tD extends ThemeStoreFactory<Themes> = never,\n\tE extends ThemeStoreFactory<Themes> = never,\n\tF extends ThemeStoreFactory<Themes> = never,\n\tG extends ThemeStoreFactory<Themes> = never,\n\tH extends ThemeStoreFactory<Themes> = never\n>(\n\tthemes: Themes,\n\tstores: readonly [\n\t\tstore1: ComposeThemeStoreEntry<Themes, A>,\n\t\tstore2?: ComposeThemeStoreEntry<Themes, B>,\n\t\tstore3?: ComposeThemeStoreEntry<Themes, C>,\n\t\tstore4?: ComposeThemeStoreEntry<Themes, D>,\n\t\tstore5?: ComposeThemeStoreEntry<Themes, E>,\n\t\tstore6?: ComposeThemeStoreEntry<Themes, F>,\n\t\tstore7?: ComposeThemeStoreEntry<Themes, G>,\n\t\tstore8?: ComposeThemeStoreEntry<Themes, H>\n\t],\n\toptions?: ComposeThemeStoresOptions<Themes> | undefined\n) {\n\tconst { defaultTheme } = options ?? {}\n\tconst storesKey = stores as unknown as object\n\tlet byDefault = channelsByStores.get(storesKey) as Map<\n\t\tkeyof Themes | undefined,\n\t\tReturnType<typeof createSharedChannel<Themes>>\n\t>\n\tif (!byDefault) {\n\t\tbyDefault = new Map<keyof Themes | undefined, ReturnType<typeof createSharedChannel<Themes>>>()\n\t\tchannelsByStores.set(storesKey, byDefault as any)\n\t}\n\tlet channel = byDefault.get(defaultTheme) as ReturnType<typeof createSharedChannel<Themes>>\n\tif (!channel) {\n\t\tconst composedStore = composeThemeStores(themes, stores, { defaultTheme })\n\t\tchannel = createSharedChannel<Themes>(themes, composedStore, defaultTheme)\n\t\tbyDefault.set(defaultTheme, channel)\n\t}\n\treturn channel\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAgCA,SAAgB,gBAWf,QACA,QAUA,SAG8D;CAC9D,MAAM,EAAE,iBAAiB,WAAW,EAAE;AACtC,QAAO,SAAS,SAAS,sBAAiD;EAEzE,MAAM,UAAU,mBAAmD,QAAQ,QAAQ,EAClF,cAFwB,wBAAwB,cAGhD,CAAC;AAeF,SAAO,CAbO,qBACb,QAAQ,WACR,QAAQ,aACR,QAAQ,kBACR,EAEgB,YAChB,OAAO,aAA2B;AACjC,SAAM,QAAQ,SAAS,SAAS;KAEjC,CAAC,QAAQ,CACT,CAEuB;;;;;;;;;AAU1B,SAAS,oBACR,QACA,eACA,cACC;CACD,IAAIA,YAAsC;CAC1C,MAAM,4BAAY,IAAI,KAAgD;CAEtE,MAAM,UAAU,UAAoC;AACnD,cAAY;AACZ,OAAK,MAAM,MAAM,UAChB,IAAG,MAAM;;CAIX,MAAM,qBAAqB,UAAiD;AAC3E,SAAO,OAAO,SAAS,aAAa;;AAIrC,CAAK,QAAQ,QAAQ,cAAc,MAAM,CAAC,CAAC,MACzC,UAAiD;AACjD,SAAO,OAAO,SAAS,aAAa;GAErC;CAED,IAAIC,YAAwB,cAAc,UAAU,kBAAkB;CACtE,IAAI,sBAAsB;CAE1B,MAAM,aAAa,aAAwD;AAC1E,MAAI,CAAC,qBAAqB;AACzB,eAAY,cAAc,UAAU,kBAAkB;AACtD,yBAAsB;;AAEvB,YAAU,IAAI,SAAS;AACvB,WAAS,UAAU;AACnB,eAAa;AACZ,aAAU,OAAO,SAAS;AAC1B,OAAI,UAAU,SAAS,GAAG;AACzB,eAAW;AACX,0BAAsB;;;;CAKzB,MAAM,oBAA8C;CACpD,MAAM,0BAAoD;AAE1D,QAAO;EACN;EACA;EACA;EACA,WAAW,UAAwB,cAAc,MAAM,WAAW,QAAQ,MAAM,CAAC;EACjF;;AAGF,MAAM,mCAAmB,IAAI,SAG1B;;;;;;;AAQH,SAAS,mBAWR,QACA,QAUA,SACC;CACD,MAAM,EAAE,iBAAiB,WAAW,EAAE;CACtC,MAAM,YAAY;CAClB,IAAI,YAAY,iBAAiB,IAAI,UAAU;AAI/C,KAAI,CAAC,WAAW;AACf,8BAAY,IAAI,KAA+E;AAC/F,mBAAiB,IAAI,WAAW,UAAiB;;CAElD,IAAI,UAAU,UAAU,IAAI,aAAa;AACzC,KAAI,CAAC,SAAS;AAEb,YAAU,oBAA4B,QADhB,mBAAmB,QAAQ,QAAQ,EAAE,cAAc,CAAC,EACb,aAAa;AAC1E,YAAU,IAAI,cAAc,QAAQ;;AAErC,QAAO"}
|
package/dist/react.cjs
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const require_use_attribute = require('./react/hooks/use-attribute.cjs');
|
|
2
|
+
const require_use_prefers_color_scheme = require('./react/hooks/use-prefers-color-scheme.cjs');
|
|
3
|
+
const require_use_theme_by_class_name = require('./react/hooks/use-theme-by-class-name.cjs');
|
|
4
|
+
const require_use_theme_by_data_attribute = require('./react/hooks/use-theme-by-data-attribute.cjs');
|
|
5
|
+
const require_use_theme_by_local_storage = require('./react/hooks/use-theme-by-local-storage.cjs');
|
|
6
|
+
const require_create_theme_hook = require('./react/theme/create-theme-hook.cjs');
|
|
7
|
+
const require_use_theme_stores = require('./react/hooks/use-theme-stores.cjs');
|
|
8
|
+
|
|
9
|
+
exports.createThemeHook = require_create_theme_hook.createThemeHook;
|
|
10
|
+
exports.useAttribute = require_use_attribute.useAttribute;
|
|
11
|
+
exports.usePrefersColorScheme = require_use_prefers_color_scheme.usePrefersColorScheme;
|
|
12
|
+
exports.useThemeByClassName = require_use_theme_by_class_name.useThemeByClassName;
|
|
13
|
+
exports.useThemeByDataAttribute = require_use_theme_by_data_attribute.useThemeByDataAttribute;
|
|
14
|
+
exports.useThemeByLocalStorage = require_use_theme_by_local_storage.useThemeByLocalStorage;
|
|
15
|
+
exports.useThemeStores = require_use_theme_stores.useThemeStores;
|
package/dist/react.d.cts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { useAttribute } from "./react/hooks/use-attribute.cjs";
|
|
2
|
+
import { usePrefersColorScheme } from "./react/hooks/use-prefers-color-scheme.cjs";
|
|
3
|
+
import { useThemeByClassName } from "./react/hooks/use-theme-by-class-name.cjs";
|
|
4
|
+
import { useThemeByDataAttribute } from "./react/hooks/use-theme-by-data-attribute.cjs";
|
|
5
|
+
import { useThemeByLocalStorage } from "./react/hooks/use-theme-by-local-storage.cjs";
|
|
6
|
+
import { useThemeStores } from "./react/hooks/use-theme-stores.cjs";
|
|
7
|
+
import { createThemeHook } from "./react/theme/create-theme-hook.cjs";
|
|
8
|
+
export { createThemeHook, useAttribute, usePrefersColorScheme, useThemeByClassName, useThemeByDataAttribute, useThemeByLocalStorage, useThemeStores };
|
package/dist/react.d.mts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { useAttribute } from "./react/hooks/use-attribute.mjs";
|
|
2
|
+
import { usePrefersColorScheme } from "./react/hooks/use-prefers-color-scheme.mjs";
|
|
3
|
+
import { useThemeByClassName } from "./react/hooks/use-theme-by-class-name.mjs";
|
|
4
|
+
import { useThemeByDataAttribute } from "./react/hooks/use-theme-by-data-attribute.mjs";
|
|
5
|
+
import { useThemeByLocalStorage } from "./react/hooks/use-theme-by-local-storage.mjs";
|
|
6
|
+
import { useThemeStores } from "./react/hooks/use-theme-stores.mjs";
|
|
7
|
+
import { createThemeHook } from "./react/theme/create-theme-hook.mjs";
|
|
8
|
+
export { createThemeHook, useAttribute, usePrefersColorScheme, useThemeByClassName, useThemeByDataAttribute, useThemeByLocalStorage, useThemeStores };
|
package/dist/react.mjs
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { useAttribute } from "./react/hooks/use-attribute.mjs";
|
|
2
|
+
import { usePrefersColorScheme } from "./react/hooks/use-prefers-color-scheme.mjs";
|
|
3
|
+
import { useThemeByClassName } from "./react/hooks/use-theme-by-class-name.mjs";
|
|
4
|
+
import { useThemeByDataAttribute } from "./react/hooks/use-theme-by-data-attribute.mjs";
|
|
5
|
+
import { useThemeByLocalStorage } from "./react/hooks/use-theme-by-local-storage.mjs";
|
|
6
|
+
import { createThemeHook } from "./react/theme/create-theme-hook.mjs";
|
|
7
|
+
import { useThemeStores } from "./react/hooks/use-theme-stores.mjs";
|
|
8
|
+
|
|
9
|
+
export { createThemeHook, useAttribute, usePrefersColorScheme, useThemeByClassName, useThemeByDataAttribute, useThemeByLocalStorage, useThemeStores };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Properties } from "csstype";
|
|
2
|
+
|
|
3
|
+
//#region src/style/css-properties.d.ts
|
|
4
|
+
declare module 'csstype' {
|
|
5
|
+
interface Properties<TLength = (string & {}) | 0, TTime = string & {}> extends CustomProperties {}
|
|
6
|
+
}
|
|
7
|
+
/** Custom CSS properties (variables) with `--` prefix. */
|
|
8
|
+
interface CustomProperties {
|
|
9
|
+
[k: `--${string}`]: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Widens CSS properties to support custom properties.
|
|
13
|
+
* Allows for string or number values for standard properties,
|
|
14
|
+
* and string values for custom properties with '--' prefix.
|
|
15
|
+
* Defined as a union so plain Properties (e.g. from React) are assignable.
|
|
16
|
+
*/
|
|
17
|
+
interface CSSProperties<TLength = string | number, TTime = string & {}> extends Properties<TLength, TTime>, CustomProperties {}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { CSSProperties };
|
|
20
|
+
//# sourceMappingURL=css-properties.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-properties.d.cts","names":[],"sources":["../../src/style/css-properties.ts"],"sourcesContent":[],"mappings":";;;;iFAGgF,kBAHvC;;;UAO/B,gBAAA,CAJsF;EAAA,CAAA,CAAA,EAAA,KAAA,MAAA,EAAA,CAAA,EAAA,MAAA;AAAA;AAchG;;;;;;UAAiB,sEACR,WAAW,SAAS,QAC3B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Properties } from "csstype";
|
|
2
|
+
|
|
3
|
+
//#region src/style/css-properties.d.ts
|
|
4
|
+
declare module 'csstype' {
|
|
5
|
+
interface Properties<TLength = (string & {}) | 0, TTime = string & {}> extends CustomProperties {}
|
|
6
|
+
}
|
|
7
|
+
/** Custom CSS properties (variables) with `--` prefix. */
|
|
8
|
+
interface CustomProperties {
|
|
9
|
+
[k: `--${string}`]: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Widens CSS properties to support custom properties.
|
|
13
|
+
* Allows for string or number values for standard properties,
|
|
14
|
+
* and string values for custom properties with '--' prefix.
|
|
15
|
+
* Defined as a union so plain Properties (e.g. from React) are assignable.
|
|
16
|
+
*/
|
|
17
|
+
interface CSSProperties<TLength = string | number, TTime = string & {}> extends Properties<TLength, TTime>, CustomProperties {}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { CSSProperties };
|
|
20
|
+
//# sourceMappingURL=css-properties.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-properties.d.mts","names":[],"sources":["../../src/style/css-properties.ts"],"sourcesContent":[],"mappings":";;;;iFAGgF,kBAHvC;;;UAO/B,gBAAA,CAJsF;EAAA,CAAA,CAAA,EAAA,KAAA,MAAA,EAAA,CAAA,EAAA,MAAA;AAAA;AAchG;;;;;;UAAiB,sEACR,WAAW,SAAS,QAC3B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/style/define-css-properties.ts
|
|
3
|
+
/**
|
|
4
|
+
* Defines CSS properties including custom properties.
|
|
5
|
+
* This function is used to properly type CSS properties when defining styles,
|
|
6
|
+
* especially when using CSS custom properties (variables).
|
|
7
|
+
*
|
|
8
|
+
* @param style - CSS properties object that can include both standard and custom properties
|
|
9
|
+
* @returns The same style object with proper typing
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* defineCSSProperties({
|
|
14
|
+
* color: 'red',
|
|
15
|
+
* '--custom-color': '#ff0000'
|
|
16
|
+
* })
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
function defineCSSProperties(style) {
|
|
20
|
+
return style;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
exports.defineCSSProperties = defineCSSProperties;
|
|
25
|
+
//# sourceMappingURL=define-css-properties.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-css-properties.cjs","names":[],"sources":["../../src/style/define-css-properties.ts"],"sourcesContent":["import type { CSSProperties } from './css-properties.ts'\n\n/**\n * Defines CSS properties including custom properties.\n * This function is used to properly type CSS properties when defining styles,\n * especially when using CSS custom properties (variables).\n *\n * @param style - CSS properties object that can include both standard and custom properties\n * @returns The same style object with proper typing\n *\n * @example\n * ```ts\n * defineCSSProperties({\n * color: 'red',\n * '--custom-color': '#ff0000'\n * })\n * ```\n */\nexport function defineCSSProperties<TLength = 0 | (string & {}), TTime = string & {}>(\n\tstyle: CSSProperties<TLength, TTime>\n) {\n\treturn style as CSSProperties\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,SAAgB,oBACf,OACC;AACD,QAAO"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { CSSProperties } from "./css-properties.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/style/define-css-properties.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Defines CSS properties including custom properties.
|
|
7
|
+
* This function is used to properly type CSS properties when defining styles,
|
|
8
|
+
* especially when using CSS custom properties (variables).
|
|
9
|
+
*
|
|
10
|
+
* @param style - CSS properties object that can include both standard and custom properties
|
|
11
|
+
* @returns The same style object with proper typing
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* defineCSSProperties({
|
|
16
|
+
* color: 'red',
|
|
17
|
+
* '--custom-color': '#ff0000'
|
|
18
|
+
* })
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
declare function defineCSSProperties<TLength = 0 | (string & {}), TTime = string & {}>(style: CSSProperties<TLength, TTime>): CSSProperties;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { defineCSSProperties };
|
|
24
|
+
//# sourceMappingURL=define-css-properties.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-css-properties.d.cts","names":[],"sources":["../../src/style/define-css-properties.ts"],"sourcesContent":[],"mappings":";;;;;;AAkBA;;;;;;;;;;;;;;iBAAgB,6EACR,cAAc,SAAS,SAEd"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { CSSProperties } from "./css-properties.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/style/define-css-properties.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Defines CSS properties including custom properties.
|
|
7
|
+
* This function is used to properly type CSS properties when defining styles,
|
|
8
|
+
* especially when using CSS custom properties (variables).
|
|
9
|
+
*
|
|
10
|
+
* @param style - CSS properties object that can include both standard and custom properties
|
|
11
|
+
* @returns The same style object with proper typing
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* defineCSSProperties({
|
|
16
|
+
* color: 'red',
|
|
17
|
+
* '--custom-color': '#ff0000'
|
|
18
|
+
* })
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
declare function defineCSSProperties<TLength = 0 | (string & {}), TTime = string & {}>(style: CSSProperties<TLength, TTime>): CSSProperties;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { defineCSSProperties };
|
|
24
|
+
//# sourceMappingURL=define-css-properties.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-css-properties.d.mts","names":[],"sources":["../../src/style/define-css-properties.ts"],"sourcesContent":[],"mappings":";;;;;;AAkBA;;;;;;;;;;;;;;iBAAgB,6EACR,cAAc,SAAS,SAEd"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/style/define-css-properties.ts
|
|
2
|
+
/**
|
|
3
|
+
* Defines CSS properties including custom properties.
|
|
4
|
+
* This function is used to properly type CSS properties when defining styles,
|
|
5
|
+
* especially when using CSS custom properties (variables).
|
|
6
|
+
*
|
|
7
|
+
* @param style - CSS properties object that can include both standard and custom properties
|
|
8
|
+
* @returns The same style object with proper typing
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* defineCSSProperties({
|
|
13
|
+
* color: 'red',
|
|
14
|
+
* '--custom-color': '#ff0000'
|
|
15
|
+
* })
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
function defineCSSProperties(style) {
|
|
19
|
+
return style;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
export { defineCSSProperties };
|
|
24
|
+
//# sourceMappingURL=define-css-properties.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-css-properties.mjs","names":[],"sources":["../../src/style/define-css-properties.ts"],"sourcesContent":["import type { CSSProperties } from './css-properties.ts'\n\n/**\n * Defines CSS properties including custom properties.\n * This function is used to properly type CSS properties when defining styles,\n * especially when using CSS custom properties (variables).\n *\n * @param style - CSS properties object that can include both standard and custom properties\n * @returns The same style object with proper typing\n *\n * @example\n * ```ts\n * defineCSSProperties({\n * color: 'red',\n * '--custom-color': '#ff0000'\n * })\n * ```\n */\nexport function defineCSSProperties<TLength = 0 | (string & {}), TTime = string & {}>(\n\tstyle: CSSProperties<TLength, TTime>\n) {\n\treturn style as CSSProperties\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,SAAgB,oBACf,OACC;AACD,QAAO"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/style/get-css-variable-value.ts
|
|
3
|
+
function getCSSVariableValue(element, ...props) {
|
|
4
|
+
if (typeof element === "string") return getCSSVariableValue(globalThis.document.body, element, ...props);
|
|
5
|
+
const style = globalThis.getComputedStyle(element);
|
|
6
|
+
return props.map((v) => style.getPropertyValue(v));
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
//#endregion
|
|
10
|
+
exports.getCSSVariableValue = getCSSVariableValue;
|
|
11
|
+
//# sourceMappingURL=get-css-variable-value.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-css-variable-value.cjs","names":[],"sources":["../../src/style/get-css-variable-value.ts"],"sourcesContent":["import type { CreateTuple } from 'type-plus'\n\n/**\n * Retrieves CSS custom property values from the specified element.\n *\n * @param element - The HTML element to get property values from\n * @param props - CSS custom property names to retrieve, must be in the format `--property-name`\n * @returns Array of property values corresponding to the requested custom properties\n */\nexport function getCSSVariableValue<Props extends Array<`--${string}`>>(\n\telement: HTMLElement,\n\t...props: Props\n): CreateTuple<Props['length'], string>\n/**\n * Retrieves CSS custom property values from `document.body`.\n *\n * @param props - CSS custom property names to retrieve, must be in the format `--property-name`\n * @returns Array of property values corresponding to the requested custom properties\n */\nexport function getCSSVariableValue<Props extends Array<`--${string}`>>(\n\t...props: Props\n): CreateTuple<Props['length'], string>\nexport function getCSSVariableValue<Props extends Array<`--${string}`>>(\n\telement: unknown,\n\t...props: Props\n) {\n\tif (typeof element === 'string') {\n\t\treturn getCSSVariableValue(globalThis.document.body, element as `--${string}`, ...props)\n\t}\n\tconst style = globalThis.getComputedStyle(element as HTMLElement)\n\treturn props.map((v) => style.getPropertyValue(v)) as any\n}\n"],"mappings":";;AAsBA,SAAgB,oBACf,SACA,GAAG,OACF;AACD,KAAI,OAAO,YAAY,SACtB,QAAO,oBAAoB,WAAW,SAAS,MAAM,SAA0B,GAAG,MAAM;CAEzF,MAAM,QAAQ,WAAW,iBAAiB,QAAuB;AACjE,QAAO,MAAM,KAAK,MAAM,MAAM,iBAAiB,EAAE,CAAC"}
|