@just-web/toolkits 2.0.0 → 3.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.
Files changed (263) hide show
  1. package/dist/attributes/get-attribute.cjs +1 -1
  2. package/dist/attributes/get-attribute.cjs.map +1 -1
  3. package/dist/attributes/get-attribute.d.cts +2 -2
  4. package/dist/attributes/get-attribute.d.cts.map +1 -1
  5. package/dist/attributes/get-attribute.d.mts +2 -2
  6. package/dist/attributes/get-attribute.d.mts.map +1 -1
  7. package/dist/attributes/get-attribute.mjs +1 -1
  8. package/dist/attributes/get-attribute.mjs.map +1 -1
  9. package/dist/attributes/get-data-attribute.cjs +1 -1
  10. package/dist/attributes/get-data-attribute.cjs.map +1 -1
  11. package/dist/attributes/get-data-attribute.d.cts +2 -2
  12. package/dist/attributes/get-data-attribute.d.cts.map +1 -1
  13. package/dist/attributes/get-data-attribute.d.mts +2 -2
  14. package/dist/attributes/get-data-attribute.d.mts.map +1 -1
  15. package/dist/attributes/get-data-attribute.mjs +1 -1
  16. package/dist/attributes/get-data-attribute.mjs.map +1 -1
  17. package/dist/attributes/observe-attribute.cjs +11 -8
  18. package/dist/attributes/observe-attribute.cjs.map +1 -1
  19. package/dist/attributes/observe-attribute.d.cts +7 -7
  20. package/dist/attributes/observe-attribute.d.cts.map +1 -1
  21. package/dist/attributes/observe-attribute.d.mts +7 -7
  22. package/dist/attributes/observe-attribute.d.mts.map +1 -1
  23. package/dist/attributes/observe-attribute.mjs +11 -8
  24. package/dist/attributes/observe-attribute.mjs.map +1 -1
  25. package/dist/attributes/observe-data-attribute.cjs +7 -10
  26. package/dist/attributes/observe-data-attribute.cjs.map +1 -1
  27. package/dist/attributes/observe-data-attribute.d.cts +8 -11
  28. package/dist/attributes/observe-data-attribute.d.cts.map +1 -1
  29. package/dist/attributes/observe-data-attribute.d.mts +8 -11
  30. package/dist/attributes/observe-data-attribute.d.mts.map +1 -1
  31. package/dist/attributes/observe-data-attribute.mjs +7 -10
  32. package/dist/attributes/observe-data-attribute.mjs.map +1 -1
  33. package/dist/color-scheme/color-scheme.types.d.cts +11 -0
  34. package/dist/color-scheme/color-scheme.types.d.cts.map +1 -0
  35. package/dist/color-scheme/color-scheme.types.d.mts +11 -0
  36. package/dist/color-scheme/color-scheme.types.d.mts.map +1 -0
  37. package/dist/color-scheme/get-prefers-color-scheme.cjs +3 -1
  38. package/dist/color-scheme/get-prefers-color-scheme.cjs.map +1 -1
  39. package/dist/color-scheme/get-prefers-color-scheme.d.cts +7 -2
  40. package/dist/color-scheme/get-prefers-color-scheme.d.cts.map +1 -1
  41. package/dist/color-scheme/get-prefers-color-scheme.d.mts +7 -2
  42. package/dist/color-scheme/get-prefers-color-scheme.d.mts.map +1 -1
  43. package/dist/color-scheme/get-prefers-color-scheme.mjs +3 -1
  44. package/dist/color-scheme/get-prefers-color-scheme.mjs.map +1 -1
  45. package/dist/color-scheme/observe-prefers-color-scheme.cjs.map +1 -1
  46. package/dist/color-scheme/observe-prefers-color-scheme.d.cts +4 -1
  47. package/dist/color-scheme/observe-prefers-color-scheme.d.cts.map +1 -1
  48. package/dist/color-scheme/observe-prefers-color-scheme.d.mts +4 -1
  49. package/dist/color-scheme/observe-prefers-color-scheme.d.mts.map +1 -1
  50. package/dist/color-scheme/observe-prefers-color-scheme.mjs.map +1 -1
  51. package/dist/index.d.cts +2 -1
  52. package/dist/index.d.mts +2 -1
  53. package/dist/react/hooks/use-attribute.cjs +8 -9
  54. package/dist/react/hooks/use-attribute.cjs.map +1 -1
  55. package/dist/react/hooks/use-attribute.d.cts +4 -4
  56. package/dist/react/hooks/use-attribute.d.mts +4 -4
  57. package/dist/react/hooks/use-attribute.mjs +8 -9
  58. package/dist/react/hooks/use-attribute.mjs.map +1 -1
  59. package/dist/react/hooks/use-theme-by-class-name.cjs +1 -1
  60. package/dist/react/hooks/use-theme-by-class-name.cjs.map +1 -1
  61. package/dist/react/hooks/use-theme-by-class-name.d.cts +2 -2
  62. package/dist/react/hooks/use-theme-by-class-name.d.mts +2 -2
  63. package/dist/react/hooks/use-theme-by-class-name.mjs +1 -1
  64. package/dist/react/hooks/use-theme-by-class-name.mjs.map +1 -1
  65. package/dist/react/hooks/use-theme-by-data-attribute.cjs +1 -1
  66. package/dist/react/hooks/use-theme-by-data-attribute.cjs.map +1 -1
  67. package/dist/react/hooks/use-theme-by-data-attribute.d.cts +2 -2
  68. package/dist/react/hooks/use-theme-by-data-attribute.d.mts +2 -2
  69. package/dist/react/hooks/use-theme-by-data-attribute.mjs +1 -1
  70. package/dist/react/hooks/use-theme-by-data-attribute.mjs.map +1 -1
  71. package/dist/react/theme/create-theme-hook.cjs.map +1 -1
  72. package/dist/react/theme/create-theme-hook.mjs.map +1 -1
  73. package/dist/theme/_utils/parse-stored-theme.cjs +1 -1
  74. package/dist/theme/_utils/parse-stored-theme.cjs.map +1 -1
  75. package/dist/theme/_utils/parse-stored-theme.mjs +1 -1
  76. package/dist/theme/_utils/parse-stored-theme.mjs.map +1 -1
  77. package/dist/theme/_utils/set-theme-to-stores.cjs +1 -1
  78. package/dist/theme/_utils/set-theme-to-stores.cjs.map +1 -1
  79. package/dist/theme/_utils/set-theme-to-stores.mjs +1 -1
  80. package/dist/theme/_utils/set-theme-to-stores.mjs.map +1 -1
  81. package/dist/theme/class-name/parse-class-name.cjs +1 -1
  82. package/dist/theme/class-name/parse-class-name.cjs.map +1 -1
  83. package/dist/theme/class-name/parse-class-name.d.cts +2 -2
  84. package/dist/theme/class-name/parse-class-name.d.cts.map +1 -1
  85. package/dist/theme/class-name/parse-class-name.d.mts +2 -2
  86. package/dist/theme/class-name/parse-class-name.d.mts.map +1 -1
  87. package/dist/theme/class-name/parse-class-name.mjs +1 -1
  88. package/dist/theme/class-name/parse-class-name.mjs.map +1 -1
  89. package/dist/theme/class-name/read-class-name.cjs +1 -1
  90. package/dist/theme/class-name/read-class-name.cjs.map +1 -1
  91. package/dist/theme/class-name/read-class-name.d.cts +2 -2
  92. package/dist/theme/class-name/read-class-name.d.cts.map +1 -1
  93. package/dist/theme/class-name/read-class-name.d.mts +2 -2
  94. package/dist/theme/class-name/read-class-name.d.mts.map +1 -1
  95. package/dist/theme/class-name/read-class-name.mjs +1 -1
  96. package/dist/theme/class-name/read-class-name.mjs.map +1 -1
  97. package/dist/theme/class-name/stringify-class-name.cjs +4 -4
  98. package/dist/theme/class-name/stringify-class-name.cjs.map +1 -1
  99. package/dist/theme/class-name/stringify-class-name.d.cts +3 -3
  100. package/dist/theme/class-name/stringify-class-name.d.cts.map +1 -1
  101. package/dist/theme/class-name/stringify-class-name.d.mts +3 -3
  102. package/dist/theme/class-name/stringify-class-name.d.mts.map +1 -1
  103. package/dist/theme/class-name/stringify-class-name.mjs +4 -4
  104. package/dist/theme/class-name/stringify-class-name.mjs.map +1 -1
  105. package/dist/theme/class-name/subscribe-class-name.cjs +2 -3
  106. package/dist/theme/class-name/subscribe-class-name.cjs.map +1 -1
  107. package/dist/theme/class-name/subscribe-class-name.d.cts +2 -2
  108. package/dist/theme/class-name/subscribe-class-name.d.cts.map +1 -1
  109. package/dist/theme/class-name/subscribe-class-name.d.mts +2 -2
  110. package/dist/theme/class-name/subscribe-class-name.d.mts.map +1 -1
  111. package/dist/theme/class-name/subscribe-class-name.mjs +2 -3
  112. package/dist/theme/class-name/subscribe-class-name.mjs.map +1 -1
  113. package/dist/theme/class-name/write-class-name.cjs +2 -2
  114. package/dist/theme/class-name/write-class-name.cjs.map +1 -1
  115. package/dist/theme/class-name/write-class-name.d.cts +4 -4
  116. package/dist/theme/class-name/write-class-name.d.cts.map +1 -1
  117. package/dist/theme/class-name/write-class-name.d.mts +4 -4
  118. package/dist/theme/class-name/write-class-name.d.mts.map +1 -1
  119. package/dist/theme/class-name/write-class-name.mjs +2 -2
  120. package/dist/theme/class-name/write-class-name.mjs.map +1 -1
  121. package/dist/theme/compose-theme-stores.cjs.map +1 -1
  122. package/dist/theme/compose-theme-stores.mjs.map +1 -1
  123. package/dist/theme/cookie/write-cookie-theme.cjs +2 -2
  124. package/dist/theme/cookie/write-cookie-theme.cjs.map +1 -1
  125. package/dist/theme/cookie/write-cookie-theme.d.cts +2 -2
  126. package/dist/theme/cookie/write-cookie-theme.d.cts.map +1 -1
  127. package/dist/theme/cookie/write-cookie-theme.d.mts +2 -2
  128. package/dist/theme/cookie/write-cookie-theme.d.mts.map +1 -1
  129. package/dist/theme/cookie/write-cookie-theme.mjs +2 -2
  130. package/dist/theme/cookie/write-cookie-theme.mjs.map +1 -1
  131. package/dist/theme/data-attribute/parse-data-attribute.cjs +1 -1
  132. package/dist/theme/data-attribute/parse-data-attribute.cjs.map +1 -1
  133. package/dist/theme/data-attribute/parse-data-attribute.d.cts +2 -2
  134. package/dist/theme/data-attribute/parse-data-attribute.d.mts +2 -2
  135. package/dist/theme/data-attribute/parse-data-attribute.mjs +1 -1
  136. package/dist/theme/data-attribute/parse-data-attribute.mjs.map +1 -1
  137. package/dist/theme/data-attribute/read-data-attribute.cjs +1 -1
  138. package/dist/theme/data-attribute/read-data-attribute.cjs.map +1 -1
  139. package/dist/theme/data-attribute/read-data-attribute.d.cts +2 -2
  140. package/dist/theme/data-attribute/read-data-attribute.d.cts.map +1 -1
  141. package/dist/theme/data-attribute/read-data-attribute.d.mts +2 -2
  142. package/dist/theme/data-attribute/read-data-attribute.d.mts.map +1 -1
  143. package/dist/theme/data-attribute/read-data-attribute.mjs +1 -1
  144. package/dist/theme/data-attribute/read-data-attribute.mjs.map +1 -1
  145. package/dist/theme/data-attribute/stringify-data-attribute.cjs +4 -4
  146. package/dist/theme/data-attribute/stringify-data-attribute.cjs.map +1 -1
  147. package/dist/theme/data-attribute/stringify-data-attribute.d.cts +3 -3
  148. package/dist/theme/data-attribute/stringify-data-attribute.d.cts.map +1 -1
  149. package/dist/theme/data-attribute/stringify-data-attribute.d.mts +3 -3
  150. package/dist/theme/data-attribute/stringify-data-attribute.d.mts.map +1 -1
  151. package/dist/theme/data-attribute/stringify-data-attribute.mjs +4 -4
  152. package/dist/theme/data-attribute/stringify-data-attribute.mjs.map +1 -1
  153. package/dist/theme/data-attribute/subscribe-data-attribute.cjs +2 -3
  154. package/dist/theme/data-attribute/subscribe-data-attribute.cjs.map +1 -1
  155. package/dist/theme/data-attribute/subscribe-data-attribute.d.cts +2 -2
  156. package/dist/theme/data-attribute/subscribe-data-attribute.d.cts.map +1 -1
  157. package/dist/theme/data-attribute/subscribe-data-attribute.d.mts +2 -2
  158. package/dist/theme/data-attribute/subscribe-data-attribute.d.mts.map +1 -1
  159. package/dist/theme/data-attribute/subscribe-data-attribute.mjs +2 -3
  160. package/dist/theme/data-attribute/subscribe-data-attribute.mjs.map +1 -1
  161. package/dist/theme/data-attribute/write-data-attribute.cjs +3 -3
  162. package/dist/theme/data-attribute/write-data-attribute.cjs.map +1 -1
  163. package/dist/theme/data-attribute/write-data-attribute.d.cts +4 -4
  164. package/dist/theme/data-attribute/write-data-attribute.d.cts.map +1 -1
  165. package/dist/theme/data-attribute/write-data-attribute.d.mts +4 -4
  166. package/dist/theme/data-attribute/write-data-attribute.d.mts.map +1 -1
  167. package/dist/theme/data-attribute/write-data-attribute.mjs +3 -3
  168. package/dist/theme/data-attribute/write-data-attribute.mjs.map +1 -1
  169. package/dist/theme/local-storage/write-local-storage.cjs +1 -1
  170. package/dist/theme/local-storage/write-local-storage.cjs.map +1 -1
  171. package/dist/theme/local-storage/write-local-storage.d.cts +2 -2
  172. package/dist/theme/local-storage/write-local-storage.d.mts +2 -2
  173. package/dist/theme/local-storage/write-local-storage.mjs +1 -1
  174. package/dist/theme/local-storage/write-local-storage.mjs.map +1 -1
  175. package/dist/theme/session-storage/write-session-storage.cjs +1 -1
  176. package/dist/theme/session-storage/write-session-storage.cjs.map +1 -1
  177. package/dist/theme/session-storage/write-session-storage.d.cts +2 -2
  178. package/dist/theme/session-storage/write-session-storage.d.mts +2 -2
  179. package/dist/theme/session-storage/write-session-storage.mjs +1 -1
  180. package/dist/theme/session-storage/write-session-storage.mjs.map +1 -1
  181. package/dist/theme/theme-entry.types.d.cts +4 -2
  182. package/dist/theme/theme-entry.types.d.cts.map +1 -1
  183. package/dist/theme/theme-entry.types.d.mts +4 -2
  184. package/dist/theme/theme-entry.types.d.mts.map +1 -1
  185. package/dist/theme/theme-store/async-theme-store.types.d.cts +1 -1
  186. package/dist/theme/theme-store/async-theme-store.types.d.cts.map +1 -1
  187. package/dist/theme/theme-store/async-theme-store.types.d.mts +1 -1
  188. package/dist/theme/theme-store/async-theme-store.types.d.mts.map +1 -1
  189. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.cjs +1 -1
  190. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.cjs.map +1 -1
  191. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.d.cts +2 -2
  192. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.d.mts +2 -2
  193. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.mjs +1 -1
  194. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.mjs.map +1 -1
  195. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.cjs +1 -1
  196. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.cjs.map +1 -1
  197. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.cts +3 -3
  198. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.mts +3 -3
  199. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.mjs +1 -1
  200. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.mjs.map +1 -1
  201. package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.cjs +1 -1
  202. package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.cjs.map +1 -1
  203. package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.d.cts +1 -1
  204. package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.d.mts +1 -1
  205. package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.mjs +1 -1
  206. package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.mjs.map +1 -1
  207. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.cts +1 -1
  208. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.mts +1 -1
  209. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.d.cts +1 -1
  210. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.d.mts +1 -1
  211. package/dist/theme/theme-store/theme-store.types.d.cts +1 -1
  212. package/dist/theme/theme-store/theme-store.types.d.cts.map +1 -1
  213. package/dist/theme/theme-store/theme-store.types.d.mts +1 -1
  214. package/dist/theme/theme-store/theme-store.types.d.mts.map +1 -1
  215. package/dist/theme/web-storage/write-web-storage.cjs +3 -3
  216. package/dist/theme/web-storage/write-web-storage.cjs.map +1 -1
  217. package/dist/theme/web-storage/write-web-storage.d.cts +2 -2
  218. package/dist/theme/web-storage/write-web-storage.d.mts +2 -2
  219. package/dist/theme/web-storage/write-web-storage.mjs +3 -3
  220. package/dist/theme/web-storage/write-web-storage.mjs.map +1 -1
  221. package/dist/utils/append-id.cjs +2 -2
  222. package/dist/utils/append-id.cjs.map +1 -1
  223. package/dist/utils/append-id.d.cts +3 -3
  224. package/dist/utils/append-id.d.mts +3 -3
  225. package/dist/utils/append-id.mjs +2 -2
  226. package/dist/utils/append-id.mjs.map +1 -1
  227. package/package.json +1 -1
  228. package/src/attributes/get-attribute.ts +5 -2
  229. package/src/attributes/get-data-attribute.ts +5 -2
  230. package/src/attributes/observe-attribute.ts +15 -10
  231. package/src/attributes/observe-data-attribute.ts +8 -11
  232. package/src/color-scheme/color-scheme.types.ts +7 -0
  233. package/src/color-scheme/get-prefers-color-scheme.ts +6 -4
  234. package/src/color-scheme/observe-prefers-color-scheme.ts +3 -1
  235. package/src/index.ts +1 -0
  236. package/src/react/hooks/use-attribute.ts +12 -13
  237. package/src/react/hooks/use-theme-by-class-name.ts +2 -2
  238. package/src/react/hooks/use-theme-by-data-attribute.ts +2 -2
  239. package/src/react/theme/create-theme-hook.ts +4 -6
  240. package/src/theme/_utils/parse-stored-theme.ts +2 -2
  241. package/src/theme/_utils/set-theme-to-stores.ts +3 -3
  242. package/src/theme/class-name/parse-class-name.ts +2 -2
  243. package/src/theme/class-name/read-class-name.ts +2 -2
  244. package/src/theme/class-name/stringify-class-name.ts +6 -6
  245. package/src/theme/class-name/subscribe-class-name.ts +3 -4
  246. package/src/theme/class-name/write-class-name.ts +4 -4
  247. package/src/theme/compose-theme-stores.ts +1 -1
  248. package/src/theme/cookie/write-cookie-theme.ts +3 -3
  249. package/src/theme/data-attribute/parse-data-attribute.ts +2 -2
  250. package/src/theme/data-attribute/read-data-attribute.ts +2 -2
  251. package/src/theme/data-attribute/stringify-data-attribute.ts +6 -6
  252. package/src/theme/data-attribute/subscribe-data-attribute.ts +3 -4
  253. package/src/theme/data-attribute/write-data-attribute.ts +5 -5
  254. package/src/theme/local-storage/write-local-storage.ts +2 -2
  255. package/src/theme/session-storage/write-session-storage.ts +2 -2
  256. package/src/theme/theme-entry.types.ts +5 -3
  257. package/src/theme/theme-store/async-theme-store.types.ts +1 -3
  258. package/src/theme/theme-store/class-name-theme-store/class-name-theme-store.ts +2 -2
  259. package/src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.ts +2 -2
  260. package/src/theme/theme-store/in-memory-theme-store/in-memory-theme-store.ts +1 -1
  261. package/src/theme/theme-store/theme-store.types.ts +1 -3
  262. package/src/theme/web-storage/write-web-storage.ts +5 -5
  263. package/src/utils/append-id.ts +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"write-class-name.cjs","names":["stringifyClassName"],"sources":["../../../src/theme/class-name/write-class-name.ts"],"sourcesContent":["import type { StringifyStoredTheme, ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { stringifyClassName } from './stringify-class-name.ts'\n\n/**\n * Writes a theme entry to the class attribute on an element.\n *\n * @param themes - Record mapping theme keys to class name(s)\n * @param entry - Theme entry to write, or undefined to remove the theme\n * @param options.element - Element to write to (defaults to document.documentElement)\n * @param options.stringify - Custom serializer (default: stringifyClassName)\n */\nexport function writeClassName<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tentry: ThemeEntry<Themes> | undefined,\n\toptions?:\n\t\t| { element?: Element | undefined; stringify?: StringifyStoredTheme<Themes> | undefined }\n\t\t| undefined\n): void {\n\tconst element = options?.element ?? document?.documentElement\n\tif (!element) return\n\tconst stringify = options?.stringify ?? stringifyClassName\n\telement.className = stringify(themes, element.className ?? undefined, entry)\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,eACf,QACA,OACA,SAGO;CACP,MAAM,UAAU,SAAS,WAAW,UAAU;AAC9C,KAAI,CAAC,QAAS;AAEd,SAAQ,aADU,SAAS,aAAaA,iDACV,QAAQ,QAAQ,aAAa,QAAW,MAAM"}
1
+ {"version":3,"file":"write-class-name.cjs","names":["stringifyClassName"],"sources":["../../../src/theme/class-name/write-class-name.ts"],"sourcesContent":["import type { StringifyStoredTheme, ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { stringifyClassName } from './stringify-class-name.ts'\n\n/**\n * Writes a theme entry to the class attribute on an element.\n *\n * @param themes - Record mapping theme keys to class name(s)\n * @param entry - Theme entry to write, or null/undefined to remove the theme\n * @param options.element - Element to write to (accepts null e.g. from refs). Defaults to document.documentElement.\n * @param options.stringify - Custom serializer (default: stringifyClassName)\n */\nexport function writeClassName<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tentry: ThemeEntry<Themes> | null | undefined,\n\toptions?:\n\t\t| { element?: Element | null | undefined; stringify?: StringifyStoredTheme<Themes> | undefined }\n\t\t| undefined\n): void {\n\tconst element = options?.element ?? document?.documentElement\n\tif (!element) return\n\tconst stringify = options?.stringify ?? stringifyClassName\n\telement.className = stringify(themes, element.className ?? undefined, entry)\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,eACf,QACA,OACA,SAGO;CACP,MAAM,UAAU,SAAS,WAAW,UAAU;AAC9C,KAAI,CAAC,QAAS;AAEd,SAAQ,aADU,SAAS,aAAaA,iDACV,QAAQ,QAAQ,aAAa,QAAW,MAAM"}
@@ -7,12 +7,12 @@ import { StringifyStoredTheme, ThemeEntry } from "../theme-entry.types.cjs";
7
7
  * Writes a theme entry to the class attribute on an element.
8
8
  *
9
9
  * @param themes - Record mapping theme keys to class name(s)
10
- * @param entry - Theme entry to write, or undefined to remove the theme
11
- * @param options.element - Element to write to (defaults to document.documentElement)
10
+ * @param entry - Theme entry to write, or null/undefined to remove the theme
11
+ * @param options.element - Element to write to (accepts null e.g. from refs). Defaults to document.documentElement.
12
12
  * @param options.stringify - Custom serializer (default: stringifyClassName)
13
13
  */
14
- declare function writeClassName<Themes extends ThemeMap>(themes: Themes, entry: ThemeEntry<Themes> | undefined, options?: {
15
- element?: Element | undefined;
14
+ declare function writeClassName<Themes extends ThemeMap>(themes: Themes, entry: ThemeEntry<Themes> | null | undefined, options?: {
15
+ element?: Element | null | undefined;
16
16
  stringify?: StringifyStoredTheme<Themes> | undefined;
17
17
  } | undefined): void;
18
18
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"write-class-name.d.cts","names":[],"sources":["../../../src/theme/class-name/write-class-name.ts"],"sourcesContent":[],"mappings":";;;;;;;AAYA;;;;;;AAIsE,iBAJtD,cAIsD,CAAA,eAJxB,QAIwB,CAAA,CAAA,MAAA,EAH7D,MAG6D,EAAA,KAAA,EAF9D,UAE8D,CAFnD,MAEmD,CAAA,GAAA,SAAA,EAAA,QAAA,EAAA;EAArB,OAAA,CAAA,EAAjC,OAAiC,GAAA,SAAA;EAAoB,SAAA,CAAA,EAApB,oBAAoB,CAAC,MAAD,CAAA,GAAA,SAAA"}
1
+ {"version":3,"file":"write-class-name.d.cts","names":[],"sources":["../../../src/theme/class-name/write-class-name.ts"],"sourcesContent":[],"mappings":";;;;;;;AAYA;;;;;;AAI6E,iBAJ7D,cAI6D,CAAA,eAJ/B,QAI+B,CAAA,CAAA,MAAA,EAHpE,MAGoE,EAAA,KAAA,EAFrE,UAEqE,CAF1D,MAE0D,CAAA,GAAA,IAAA,GAAA,SAAA,EAAA,QAAA,EAAA;EAArB,OAAA,CAAA,EAAxC,OAAwC,GAAA,IAAA,GAAA,SAAA;EAAoB,SAAA,CAAA,EAApB,oBAAoB,CAAC,MAAD,CAAA,GAAA,SAAA"}
@@ -7,12 +7,12 @@ import { StringifyStoredTheme, ThemeEntry } from "../theme-entry.types.mjs";
7
7
  * Writes a theme entry to the class attribute on an element.
8
8
  *
9
9
  * @param themes - Record mapping theme keys to class name(s)
10
- * @param entry - Theme entry to write, or undefined to remove the theme
11
- * @param options.element - Element to write to (defaults to document.documentElement)
10
+ * @param entry - Theme entry to write, or null/undefined to remove the theme
11
+ * @param options.element - Element to write to (accepts null e.g. from refs). Defaults to document.documentElement.
12
12
  * @param options.stringify - Custom serializer (default: stringifyClassName)
13
13
  */
14
- declare function writeClassName<Themes extends ThemeMap>(themes: Themes, entry: ThemeEntry<Themes> | undefined, options?: {
15
- element?: Element | undefined;
14
+ declare function writeClassName<Themes extends ThemeMap>(themes: Themes, entry: ThemeEntry<Themes> | null | undefined, options?: {
15
+ element?: Element | null | undefined;
16
16
  stringify?: StringifyStoredTheme<Themes> | undefined;
17
17
  } | undefined): void;
18
18
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"write-class-name.d.mts","names":[],"sources":["../../../src/theme/class-name/write-class-name.ts"],"sourcesContent":[],"mappings":";;;;;;;AAYA;;;;;;AAIsE,iBAJtD,cAIsD,CAAA,eAJxB,QAIwB,CAAA,CAAA,MAAA,EAH7D,MAG6D,EAAA,KAAA,EAF9D,UAE8D,CAFnD,MAEmD,CAAA,GAAA,SAAA,EAAA,QAAA,EAAA;EAArB,OAAA,CAAA,EAAjC,OAAiC,GAAA,SAAA;EAAoB,SAAA,CAAA,EAApB,oBAAoB,CAAC,MAAD,CAAA,GAAA,SAAA"}
1
+ {"version":3,"file":"write-class-name.d.mts","names":[],"sources":["../../../src/theme/class-name/write-class-name.ts"],"sourcesContent":[],"mappings":";;;;;;;AAYA;;;;;;AAI6E,iBAJ7D,cAI6D,CAAA,eAJ/B,QAI+B,CAAA,CAAA,MAAA,EAHpE,MAGoE,EAAA,KAAA,EAFrE,UAEqE,CAF1D,MAE0D,CAAA,GAAA,IAAA,GAAA,SAAA,EAAA,QAAA,EAAA;EAArB,OAAA,CAAA,EAAxC,OAAwC,GAAA,IAAA,GAAA,SAAA;EAAoB,SAAA,CAAA,EAApB,oBAAoB,CAAC,MAAD,CAAA,GAAA,SAAA"}
@@ -5,8 +5,8 @@ import { stringifyClassName } from "./stringify-class-name.mjs";
5
5
  * Writes a theme entry to the class attribute on an element.
6
6
  *
7
7
  * @param themes - Record mapping theme keys to class name(s)
8
- * @param entry - Theme entry to write, or undefined to remove the theme
9
- * @param options.element - Element to write to (defaults to document.documentElement)
8
+ * @param entry - Theme entry to write, or null/undefined to remove the theme
9
+ * @param options.element - Element to write to (accepts null e.g. from refs). Defaults to document.documentElement.
10
10
  * @param options.stringify - Custom serializer (default: stringifyClassName)
11
11
  */
12
12
  function writeClassName(themes, entry, options) {
@@ -1 +1 @@
1
- {"version":3,"file":"write-class-name.mjs","names":[],"sources":["../../../src/theme/class-name/write-class-name.ts"],"sourcesContent":["import type { StringifyStoredTheme, ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { stringifyClassName } from './stringify-class-name.ts'\n\n/**\n * Writes a theme entry to the class attribute on an element.\n *\n * @param themes - Record mapping theme keys to class name(s)\n * @param entry - Theme entry to write, or undefined to remove the theme\n * @param options.element - Element to write to (defaults to document.documentElement)\n * @param options.stringify - Custom serializer (default: stringifyClassName)\n */\nexport function writeClassName<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tentry: ThemeEntry<Themes> | undefined,\n\toptions?:\n\t\t| { element?: Element | undefined; stringify?: StringifyStoredTheme<Themes> | undefined }\n\t\t| undefined\n): void {\n\tconst element = options?.element ?? document?.documentElement\n\tif (!element) return\n\tconst stringify = options?.stringify ?? stringifyClassName\n\telement.className = stringify(themes, element.className ?? undefined, entry)\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,eACf,QACA,OACA,SAGO;CACP,MAAM,UAAU,SAAS,WAAW,UAAU;AAC9C,KAAI,CAAC,QAAS;AAEd,SAAQ,aADU,SAAS,aAAa,oBACV,QAAQ,QAAQ,aAAa,QAAW,MAAM"}
1
+ {"version":3,"file":"write-class-name.mjs","names":[],"sources":["../../../src/theme/class-name/write-class-name.ts"],"sourcesContent":["import type { StringifyStoredTheme, ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { stringifyClassName } from './stringify-class-name.ts'\n\n/**\n * Writes a theme entry to the class attribute on an element.\n *\n * @param themes - Record mapping theme keys to class name(s)\n * @param entry - Theme entry to write, or null/undefined to remove the theme\n * @param options.element - Element to write to (accepts null e.g. from refs). Defaults to document.documentElement.\n * @param options.stringify - Custom serializer (default: stringifyClassName)\n */\nexport function writeClassName<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tentry: ThemeEntry<Themes> | null | undefined,\n\toptions?:\n\t\t| { element?: Element | null | undefined; stringify?: StringifyStoredTheme<Themes> | undefined }\n\t\t| undefined\n): void {\n\tconst element = options?.element ?? document?.documentElement\n\tif (!element) return\n\tconst stringify = options?.stringify ?? stringifyClassName\n\telement.className = stringify(themes, element.className ?? undefined, entry)\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,eACf,QACA,OACA,SAGO;CACP,MAAM,UAAU,SAAS,WAAW,UAAU;AAC9C,KAAI,CAAC,QAAS;AAEd,SAAQ,aADU,SAAS,aAAa,oBACV,QAAQ,QAAQ,aAAa,QAAW,MAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"compose-theme-stores.cjs","names":["themeEntry","lastEmitted: keyof Themes | undefined","setThemeToStores"],"sources":["../../src/theme/compose-theme-stores.ts"],"sourcesContent":["import type { Required, RequiredPick } from 'type-plus'\nimport { setThemeToStores } from './_utils/set-theme-to-stores.ts'\nimport { themeEntry } from './theme-entry.ts'\nimport type { ThemeEntry } from './theme-entry.types.ts'\nimport type { ThemeMap } from './theme-map.types.ts'\nimport type { AsyncThemeStore } from './theme-store/async-theme-store.types.ts'\nimport type { ThemeStore } from './theme-store/theme-store.types.ts'\nimport type { ThemeStoreFactory } from './theme-store/theme-store-factory.types.ts'\n\n/** Input item for one position: concrete store or factory config [factory, options?]. */\nexport type ComposeThemeStoreEntry<\n\tThemes extends ThemeMap,\n\tF extends ThemeStoreFactory<Themes> = never\n> = ThemeStore<Themes> | AsyncThemeStore<Themes> | readonly [F] | readonly [F, Parameters<F>[1]]\n\nexport type ComposeThemeStoresOptions<Themes extends ThemeMap> = {\n\tdefaultTheme?: keyof Themes | undefined\n}\n\n/**\n * Composes multiple theme stores into a single store.\n *\n * Accepts concrete stores or store factory tuples `[factory]` or `[factory, options]`.\n * For factory tuples, calls `factory(themes)` or `factory(themes, options)` to create stores.\n *\n * - **read**: Returns first non-empty `ThemeEntry` from stores (waterfall). When all empty\n * and `defaultTheme` is defined, returns `themeEntry(themes, defaultTheme)`.\n * - **write**: Delegates to `setThemeToStores` (writes to all stores with write).\n * - **subscribe**: Aggregates child store subscriptions. No initial notify—handler is only\n * called when a child store emits.\n *\n * @param themes - ThemeMap for synthesizing fallback ThemeEntry\n * @param stores - Array of theme stores or factory configs [factory, options?]\n * @param options.defaultTheme - Fallback theme key when all stores return empty\n * @returns AsyncThemeStore\n */\nexport function composeThemeStores<\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): Required<AsyncThemeStore<Themes>> {\n\tconst { defaultTheme } = options ?? {}\n\tconst resolved = resolveStores(themes, stores)\n\tconst withRead = resolved.filter((s): s is StoreWithRead<Themes> => typeof s.read === 'function')\n\n\tasync function readFromStores(): Promise<ThemeEntry<Themes> | undefined> {\n\t\tfor (const store of withRead) {\n\t\t\tconst result = await Promise.resolve(store.read())\n\t\t\tif (result !== undefined) return result\n\t\t}\n\t\treturn defaultTheme !== undefined ? themeEntry(themes, defaultTheme) : undefined\n\t}\n\n\tconst withSubscribe = resolved.filter(\n\t\t(s): s is StoreWithSubscribe<Themes> => typeof s.subscribe === 'function'\n\t)\n\n\tfunction subscribe(handler: (theme: ThemeEntry<Themes> | undefined | null) => void): () => void {\n\t\tlet scheduled = false\n\t\tlet lastEmitted: keyof Themes | undefined\n\n\t\tconst scheduleNotify = () => {\n\t\t\tif (scheduled) return\n\t\t\tscheduled = true\n\t\t\tqueueMicrotask(async () => {\n\t\t\t\tscheduled = false\n\t\t\t\tconst entry = await readFromStores()\n\t\t\t\tconst key = entry?.theme ?? undefined\n\t\t\t\tif (key === lastEmitted) return\n\t\t\t\tlastEmitted = key\n\t\t\t\thandler(entry ?? undefined)\n\t\t\t})\n\t\t}\n\n\t\tconst unSubs = withSubscribe.map((s) => s.subscribe!((_result) => scheduleNotify()))\n\n\t\treturn () => {\n\t\t\tfor (const unSub of unSubs) {\n\t\t\t\tunSub()\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tread: readFromStores,\n\t\twrite(entry) {\n\t\t\treturn setThemeToStores(resolved, entry)\n\t\t},\n\t\tsubscribe: withSubscribe.length > 0 ? subscribe : () => () => {}\n\t}\n}\n\ntype StoreWithRead<Themes extends ThemeMap> = RequiredPick<AsyncThemeStore<Themes>, 'read'>\n\ntype StoreWithSubscribe<Themes extends ThemeMap> = RequiredPick<\n\tAsyncThemeStore<Themes>,\n\t'subscribe'\n>\n\nfunction resolveStores<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tstores: readonly [\n\t\tstore1: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore2?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore3?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore4?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore5?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore6?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore7?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore8?: ComposeThemeStoreEntry<Themes, any>\n\t]\n): (ThemeStore<Themes> | AsyncThemeStore<Themes>)[] {\n\treturn stores.map((item) => {\n\t\tif (Array.isArray(item)) {\n\t\t\tconst [factory, options] = item\n\t\t\treturn (factory as (t: Themes, o?: unknown) => ThemeStore<Themes>)(themes, options)\n\t\t}\n\t\treturn item as ThemeStore<Themes> | AsyncThemeStore<Themes>\n\t})\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,mBAWf,QACA,QAUA,SACoC;CACpC,MAAM,EAAE,iBAAiB,WAAW,EAAE;CACtC,MAAM,WAAW,cAAc,QAAQ,OAAO;CAC9C,MAAM,WAAW,SAAS,QAAQ,MAAkC,OAAO,EAAE,SAAS,WAAW;CAEjG,eAAe,iBAA0D;AACxE,OAAK,MAAM,SAAS,UAAU;GAC7B,MAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,MAAM,CAAC;AAClD,OAAI,WAAW,OAAW,QAAO;;AAElC,SAAO,iBAAiB,SAAYA,+BAAW,QAAQ,aAAa,GAAG;;CAGxE,MAAM,gBAAgB,SAAS,QAC7B,MAAuC,OAAO,EAAE,cAAc,WAC/D;CAED,SAAS,UAAU,SAA6E;EAC/F,IAAI,YAAY;EAChB,IAAIC;EAEJ,MAAM,uBAAuB;AAC5B,OAAI,UAAW;AACf,eAAY;AACZ,kBAAe,YAAY;AAC1B,gBAAY;IACZ,MAAM,QAAQ,MAAM,gBAAgB;IACpC,MAAM,MAAM,OAAO,SAAS;AAC5B,QAAI,QAAQ,YAAa;AACzB,kBAAc;AACd,YAAQ,SAAS,OAAU;KAC1B;;EAGH,MAAM,SAAS,cAAc,KAAK,MAAM,EAAE,WAAY,YAAY,gBAAgB,CAAC,CAAC;AAEpF,eAAa;AACZ,QAAK,MAAM,SAAS,OACnB,QAAO;;;AAKV,QAAO;EACN,MAAM;EACN,MAAM,OAAO;AACZ,UAAOC,6CAAiB,UAAU,MAAM;;EAEzC,WAAW,cAAc,SAAS,IAAI,wBAAwB;EAC9D;;AAUF,SAAS,cACR,QACA,QAUmD;AACnD,QAAO,OAAO,KAAK,SAAS;AAC3B,MAAI,MAAM,QAAQ,KAAK,EAAE;GACxB,MAAM,CAAC,SAAS,WAAW;AAC3B,UAAQ,QAA2D,QAAQ,QAAQ;;AAEpF,SAAO;GACN"}
1
+ {"version":3,"file":"compose-theme-stores.cjs","names":["themeEntry","lastEmitted: keyof Themes | undefined","setThemeToStores"],"sources":["../../src/theme/compose-theme-stores.ts"],"sourcesContent":["import type { Required, RequiredPick } from 'type-plus'\nimport { setThemeToStores } from './_utils/set-theme-to-stores.ts'\nimport { themeEntry } from './theme-entry.ts'\nimport type { ThemeEntry } from './theme-entry.types.ts'\nimport type { ThemeMap } from './theme-map.types.ts'\nimport type { AsyncThemeStore } from './theme-store/async-theme-store.types.ts'\nimport type { ThemeStore } from './theme-store/theme-store.types.ts'\nimport type { ThemeStoreFactory } from './theme-store/theme-store-factory.types.ts'\n\n/** Input item for one position: concrete store or factory config [factory, options?]. */\nexport type ComposeThemeStoreEntry<\n\tThemes extends ThemeMap,\n\tF extends ThemeStoreFactory<Themes> = never\n> = ThemeStore<Themes> | AsyncThemeStore<Themes> | readonly [F] | readonly [F, Parameters<F>[1]]\n\nexport type ComposeThemeStoresOptions<Themes extends ThemeMap> = {\n\tdefaultTheme?: keyof Themes | undefined\n}\n\n/**\n * Composes multiple theme stores into a single store.\n *\n * Accepts concrete stores or store factory tuples `[factory]` or `[factory, options]`.\n * For factory tuples, calls `factory(themes)` or `factory(themes, options)` to create stores.\n *\n * - **read**: Returns first non-empty `ThemeEntry` from stores (waterfall). When all empty\n * and `defaultTheme` is defined, returns `themeEntry(themes, defaultTheme)`.\n * - **write**: Delegates to `setThemeToStores` (writes to all stores with write).\n * - **subscribe**: Aggregates child store subscriptions. No initial notify—handler is only\n * called when a child store emits.\n *\n * @param themes - ThemeMap for synthesizing fallback ThemeEntry\n * @param stores - Array of theme stores or factory configs [factory, options?]\n * @param options.defaultTheme - Fallback theme key when all stores return empty\n * @returns AsyncThemeStore\n */\nexport function composeThemeStores<\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): Required<AsyncThemeStore<Themes>> {\n\tconst { defaultTheme } = options ?? {}\n\tconst resolved = resolveStores(themes, stores)\n\tconst withRead = resolved.filter((s): s is StoreWithRead<Themes> => typeof s.read === 'function')\n\n\tasync function readFromStores(): Promise<ThemeEntry<Themes> | undefined> {\n\t\tfor (const store of withRead) {\n\t\t\tconst result = await Promise.resolve(store.read())\n\t\t\tif (result !== undefined) return result\n\t\t}\n\t\treturn defaultTheme !== undefined ? themeEntry(themes, defaultTheme) : undefined\n\t}\n\n\tconst withSubscribe = resolved.filter(\n\t\t(s): s is StoreWithSubscribe<Themes> => typeof s.subscribe === 'function'\n\t)\n\n\tfunction subscribe(handler: (theme: ThemeEntry<Themes> | undefined) => void): () => void {\n\t\tlet scheduled = false\n\t\tlet lastEmitted: keyof Themes | undefined\n\n\t\tconst scheduleNotify = () => {\n\t\t\tif (scheduled) return\n\t\t\tscheduled = true\n\t\t\tqueueMicrotask(async () => {\n\t\t\t\tscheduled = false\n\t\t\t\tconst entry = await readFromStores()\n\t\t\t\tconst key = entry?.theme ?? undefined\n\t\t\t\tif (key === lastEmitted) return\n\t\t\t\tlastEmitted = key\n\t\t\t\thandler(entry ?? undefined)\n\t\t\t})\n\t\t}\n\n\t\tconst unSubs = withSubscribe.map((s) => s.subscribe!((_result) => scheduleNotify()))\n\n\t\treturn () => {\n\t\t\tfor (const unSub of unSubs) {\n\t\t\t\tunSub()\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tread: readFromStores,\n\t\twrite(entry) {\n\t\t\treturn setThemeToStores(resolved, entry)\n\t\t},\n\t\tsubscribe: withSubscribe.length > 0 ? subscribe : () => () => {}\n\t}\n}\n\ntype StoreWithRead<Themes extends ThemeMap> = RequiredPick<AsyncThemeStore<Themes>, 'read'>\n\ntype StoreWithSubscribe<Themes extends ThemeMap> = RequiredPick<\n\tAsyncThemeStore<Themes>,\n\t'subscribe'\n>\n\nfunction resolveStores<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tstores: readonly [\n\t\tstore1: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore2?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore3?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore4?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore5?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore6?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore7?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore8?: ComposeThemeStoreEntry<Themes, any>\n\t]\n): (ThemeStore<Themes> | AsyncThemeStore<Themes>)[] {\n\treturn stores.map((item) => {\n\t\tif (Array.isArray(item)) {\n\t\t\tconst [factory, options] = item\n\t\t\treturn (factory as (t: Themes, o?: unknown) => ThemeStore<Themes>)(themes, options)\n\t\t}\n\t\treturn item as ThemeStore<Themes> | AsyncThemeStore<Themes>\n\t})\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,mBAWf,QACA,QAUA,SACoC;CACpC,MAAM,EAAE,iBAAiB,WAAW,EAAE;CACtC,MAAM,WAAW,cAAc,QAAQ,OAAO;CAC9C,MAAM,WAAW,SAAS,QAAQ,MAAkC,OAAO,EAAE,SAAS,WAAW;CAEjG,eAAe,iBAA0D;AACxE,OAAK,MAAM,SAAS,UAAU;GAC7B,MAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,MAAM,CAAC;AAClD,OAAI,WAAW,OAAW,QAAO;;AAElC,SAAO,iBAAiB,SAAYA,+BAAW,QAAQ,aAAa,GAAG;;CAGxE,MAAM,gBAAgB,SAAS,QAC7B,MAAuC,OAAO,EAAE,cAAc,WAC/D;CAED,SAAS,UAAU,SAAsE;EACxF,IAAI,YAAY;EAChB,IAAIC;EAEJ,MAAM,uBAAuB;AAC5B,OAAI,UAAW;AACf,eAAY;AACZ,kBAAe,YAAY;AAC1B,gBAAY;IACZ,MAAM,QAAQ,MAAM,gBAAgB;IACpC,MAAM,MAAM,OAAO,SAAS;AAC5B,QAAI,QAAQ,YAAa;AACzB,kBAAc;AACd,YAAQ,SAAS,OAAU;KAC1B;;EAGH,MAAM,SAAS,cAAc,KAAK,MAAM,EAAE,WAAY,YAAY,gBAAgB,CAAC,CAAC;AAEpF,eAAa;AACZ,QAAK,MAAM,SAAS,OACnB,QAAO;;;AAKV,QAAO;EACN,MAAM;EACN,MAAM,OAAO;AACZ,UAAOC,6CAAiB,UAAU,MAAM;;EAEzC,WAAW,cAAc,SAAS,IAAI,wBAAwB;EAC9D;;AAUF,SAAS,cACR,QACA,QAUmD;AACnD,QAAO,OAAO,KAAK,SAAS;AAC3B,MAAI,MAAM,QAAQ,KAAK,EAAE;GACxB,MAAM,CAAC,SAAS,WAAW;AAC3B,UAAQ,QAA2D,QAAQ,QAAQ;;AAEpF,SAAO;GACN"}
@@ -1 +1 @@
1
- {"version":3,"file":"compose-theme-stores.mjs","names":["lastEmitted: keyof Themes | undefined"],"sources":["../../src/theme/compose-theme-stores.ts"],"sourcesContent":["import type { Required, RequiredPick } from 'type-plus'\nimport { setThemeToStores } from './_utils/set-theme-to-stores.ts'\nimport { themeEntry } from './theme-entry.ts'\nimport type { ThemeEntry } from './theme-entry.types.ts'\nimport type { ThemeMap } from './theme-map.types.ts'\nimport type { AsyncThemeStore } from './theme-store/async-theme-store.types.ts'\nimport type { ThemeStore } from './theme-store/theme-store.types.ts'\nimport type { ThemeStoreFactory } from './theme-store/theme-store-factory.types.ts'\n\n/** Input item for one position: concrete store or factory config [factory, options?]. */\nexport type ComposeThemeStoreEntry<\n\tThemes extends ThemeMap,\n\tF extends ThemeStoreFactory<Themes> = never\n> = ThemeStore<Themes> | AsyncThemeStore<Themes> | readonly [F] | readonly [F, Parameters<F>[1]]\n\nexport type ComposeThemeStoresOptions<Themes extends ThemeMap> = {\n\tdefaultTheme?: keyof Themes | undefined\n}\n\n/**\n * Composes multiple theme stores into a single store.\n *\n * Accepts concrete stores or store factory tuples `[factory]` or `[factory, options]`.\n * For factory tuples, calls `factory(themes)` or `factory(themes, options)` to create stores.\n *\n * - **read**: Returns first non-empty `ThemeEntry` from stores (waterfall). When all empty\n * and `defaultTheme` is defined, returns `themeEntry(themes, defaultTheme)`.\n * - **write**: Delegates to `setThemeToStores` (writes to all stores with write).\n * - **subscribe**: Aggregates child store subscriptions. No initial notify—handler is only\n * called when a child store emits.\n *\n * @param themes - ThemeMap for synthesizing fallback ThemeEntry\n * @param stores - Array of theme stores or factory configs [factory, options?]\n * @param options.defaultTheme - Fallback theme key when all stores return empty\n * @returns AsyncThemeStore\n */\nexport function composeThemeStores<\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): Required<AsyncThemeStore<Themes>> {\n\tconst { defaultTheme } = options ?? {}\n\tconst resolved = resolveStores(themes, stores)\n\tconst withRead = resolved.filter((s): s is StoreWithRead<Themes> => typeof s.read === 'function')\n\n\tasync function readFromStores(): Promise<ThemeEntry<Themes> | undefined> {\n\t\tfor (const store of withRead) {\n\t\t\tconst result = await Promise.resolve(store.read())\n\t\t\tif (result !== undefined) return result\n\t\t}\n\t\treturn defaultTheme !== undefined ? themeEntry(themes, defaultTheme) : undefined\n\t}\n\n\tconst withSubscribe = resolved.filter(\n\t\t(s): s is StoreWithSubscribe<Themes> => typeof s.subscribe === 'function'\n\t)\n\n\tfunction subscribe(handler: (theme: ThemeEntry<Themes> | undefined | null) => void): () => void {\n\t\tlet scheduled = false\n\t\tlet lastEmitted: keyof Themes | undefined\n\n\t\tconst scheduleNotify = () => {\n\t\t\tif (scheduled) return\n\t\t\tscheduled = true\n\t\t\tqueueMicrotask(async () => {\n\t\t\t\tscheduled = false\n\t\t\t\tconst entry = await readFromStores()\n\t\t\t\tconst key = entry?.theme ?? undefined\n\t\t\t\tif (key === lastEmitted) return\n\t\t\t\tlastEmitted = key\n\t\t\t\thandler(entry ?? undefined)\n\t\t\t})\n\t\t}\n\n\t\tconst unSubs = withSubscribe.map((s) => s.subscribe!((_result) => scheduleNotify()))\n\n\t\treturn () => {\n\t\t\tfor (const unSub of unSubs) {\n\t\t\t\tunSub()\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tread: readFromStores,\n\t\twrite(entry) {\n\t\t\treturn setThemeToStores(resolved, entry)\n\t\t},\n\t\tsubscribe: withSubscribe.length > 0 ? subscribe : () => () => {}\n\t}\n}\n\ntype StoreWithRead<Themes extends ThemeMap> = RequiredPick<AsyncThemeStore<Themes>, 'read'>\n\ntype StoreWithSubscribe<Themes extends ThemeMap> = RequiredPick<\n\tAsyncThemeStore<Themes>,\n\t'subscribe'\n>\n\nfunction resolveStores<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tstores: readonly [\n\t\tstore1: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore2?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore3?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore4?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore5?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore6?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore7?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore8?: ComposeThemeStoreEntry<Themes, any>\n\t]\n): (ThemeStore<Themes> | AsyncThemeStore<Themes>)[] {\n\treturn stores.map((item) => {\n\t\tif (Array.isArray(item)) {\n\t\t\tconst [factory, options] = item\n\t\t\treturn (factory as (t: Themes, o?: unknown) => ThemeStore<Themes>)(themes, options)\n\t\t}\n\t\treturn item as ThemeStore<Themes> | AsyncThemeStore<Themes>\n\t})\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,mBAWf,QACA,QAUA,SACoC;CACpC,MAAM,EAAE,iBAAiB,WAAW,EAAE;CACtC,MAAM,WAAW,cAAc,QAAQ,OAAO;CAC9C,MAAM,WAAW,SAAS,QAAQ,MAAkC,OAAO,EAAE,SAAS,WAAW;CAEjG,eAAe,iBAA0D;AACxE,OAAK,MAAM,SAAS,UAAU;GAC7B,MAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,MAAM,CAAC;AAClD,OAAI,WAAW,OAAW,QAAO;;AAElC,SAAO,iBAAiB,SAAY,WAAW,QAAQ,aAAa,GAAG;;CAGxE,MAAM,gBAAgB,SAAS,QAC7B,MAAuC,OAAO,EAAE,cAAc,WAC/D;CAED,SAAS,UAAU,SAA6E;EAC/F,IAAI,YAAY;EAChB,IAAIA;EAEJ,MAAM,uBAAuB;AAC5B,OAAI,UAAW;AACf,eAAY;AACZ,kBAAe,YAAY;AAC1B,gBAAY;IACZ,MAAM,QAAQ,MAAM,gBAAgB;IACpC,MAAM,MAAM,OAAO,SAAS;AAC5B,QAAI,QAAQ,YAAa;AACzB,kBAAc;AACd,YAAQ,SAAS,OAAU;KAC1B;;EAGH,MAAM,SAAS,cAAc,KAAK,MAAM,EAAE,WAAY,YAAY,gBAAgB,CAAC,CAAC;AAEpF,eAAa;AACZ,QAAK,MAAM,SAAS,OACnB,QAAO;;;AAKV,QAAO;EACN,MAAM;EACN,MAAM,OAAO;AACZ,UAAO,iBAAiB,UAAU,MAAM;;EAEzC,WAAW,cAAc,SAAS,IAAI,wBAAwB;EAC9D;;AAUF,SAAS,cACR,QACA,QAUmD;AACnD,QAAO,OAAO,KAAK,SAAS;AAC3B,MAAI,MAAM,QAAQ,KAAK,EAAE;GACxB,MAAM,CAAC,SAAS,WAAW;AAC3B,UAAQ,QAA2D,QAAQ,QAAQ;;AAEpF,SAAO;GACN"}
1
+ {"version":3,"file":"compose-theme-stores.mjs","names":["lastEmitted: keyof Themes | undefined"],"sources":["../../src/theme/compose-theme-stores.ts"],"sourcesContent":["import type { Required, RequiredPick } from 'type-plus'\nimport { setThemeToStores } from './_utils/set-theme-to-stores.ts'\nimport { themeEntry } from './theme-entry.ts'\nimport type { ThemeEntry } from './theme-entry.types.ts'\nimport type { ThemeMap } from './theme-map.types.ts'\nimport type { AsyncThemeStore } from './theme-store/async-theme-store.types.ts'\nimport type { ThemeStore } from './theme-store/theme-store.types.ts'\nimport type { ThemeStoreFactory } from './theme-store/theme-store-factory.types.ts'\n\n/** Input item for one position: concrete store or factory config [factory, options?]. */\nexport type ComposeThemeStoreEntry<\n\tThemes extends ThemeMap,\n\tF extends ThemeStoreFactory<Themes> = never\n> = ThemeStore<Themes> | AsyncThemeStore<Themes> | readonly [F] | readonly [F, Parameters<F>[1]]\n\nexport type ComposeThemeStoresOptions<Themes extends ThemeMap> = {\n\tdefaultTheme?: keyof Themes | undefined\n}\n\n/**\n * Composes multiple theme stores into a single store.\n *\n * Accepts concrete stores or store factory tuples `[factory]` or `[factory, options]`.\n * For factory tuples, calls `factory(themes)` or `factory(themes, options)` to create stores.\n *\n * - **read**: Returns first non-empty `ThemeEntry` from stores (waterfall). When all empty\n * and `defaultTheme` is defined, returns `themeEntry(themes, defaultTheme)`.\n * - **write**: Delegates to `setThemeToStores` (writes to all stores with write).\n * - **subscribe**: Aggregates child store subscriptions. No initial notify—handler is only\n * called when a child store emits.\n *\n * @param themes - ThemeMap for synthesizing fallback ThemeEntry\n * @param stores - Array of theme stores or factory configs [factory, options?]\n * @param options.defaultTheme - Fallback theme key when all stores return empty\n * @returns AsyncThemeStore\n */\nexport function composeThemeStores<\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): Required<AsyncThemeStore<Themes>> {\n\tconst { defaultTheme } = options ?? {}\n\tconst resolved = resolveStores(themes, stores)\n\tconst withRead = resolved.filter((s): s is StoreWithRead<Themes> => typeof s.read === 'function')\n\n\tasync function readFromStores(): Promise<ThemeEntry<Themes> | undefined> {\n\t\tfor (const store of withRead) {\n\t\t\tconst result = await Promise.resolve(store.read())\n\t\t\tif (result !== undefined) return result\n\t\t}\n\t\treturn defaultTheme !== undefined ? themeEntry(themes, defaultTheme) : undefined\n\t}\n\n\tconst withSubscribe = resolved.filter(\n\t\t(s): s is StoreWithSubscribe<Themes> => typeof s.subscribe === 'function'\n\t)\n\n\tfunction subscribe(handler: (theme: ThemeEntry<Themes> | undefined) => void): () => void {\n\t\tlet scheduled = false\n\t\tlet lastEmitted: keyof Themes | undefined\n\n\t\tconst scheduleNotify = () => {\n\t\t\tif (scheduled) return\n\t\t\tscheduled = true\n\t\t\tqueueMicrotask(async () => {\n\t\t\t\tscheduled = false\n\t\t\t\tconst entry = await readFromStores()\n\t\t\t\tconst key = entry?.theme ?? undefined\n\t\t\t\tif (key === lastEmitted) return\n\t\t\t\tlastEmitted = key\n\t\t\t\thandler(entry ?? undefined)\n\t\t\t})\n\t\t}\n\n\t\tconst unSubs = withSubscribe.map((s) => s.subscribe!((_result) => scheduleNotify()))\n\n\t\treturn () => {\n\t\t\tfor (const unSub of unSubs) {\n\t\t\t\tunSub()\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tread: readFromStores,\n\t\twrite(entry) {\n\t\t\treturn setThemeToStores(resolved, entry)\n\t\t},\n\t\tsubscribe: withSubscribe.length > 0 ? subscribe : () => () => {}\n\t}\n}\n\ntype StoreWithRead<Themes extends ThemeMap> = RequiredPick<AsyncThemeStore<Themes>, 'read'>\n\ntype StoreWithSubscribe<Themes extends ThemeMap> = RequiredPick<\n\tAsyncThemeStore<Themes>,\n\t'subscribe'\n>\n\nfunction resolveStores<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tstores: readonly [\n\t\tstore1: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore2?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore3?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore4?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore5?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore6?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore7?: ComposeThemeStoreEntry<Themes, any>,\n\t\tstore8?: ComposeThemeStoreEntry<Themes, any>\n\t]\n): (ThemeStore<Themes> | AsyncThemeStore<Themes>)[] {\n\treturn stores.map((item) => {\n\t\tif (Array.isArray(item)) {\n\t\t\tconst [factory, options] = item\n\t\t\treturn (factory as (t: Themes, o?: unknown) => ThemeStore<Themes>)(themes, options)\n\t\t}\n\t\treturn item as ThemeStore<Themes> | AsyncThemeStore<Themes>\n\t})\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,mBAWf,QACA,QAUA,SACoC;CACpC,MAAM,EAAE,iBAAiB,WAAW,EAAE;CACtC,MAAM,WAAW,cAAc,QAAQ,OAAO;CAC9C,MAAM,WAAW,SAAS,QAAQ,MAAkC,OAAO,EAAE,SAAS,WAAW;CAEjG,eAAe,iBAA0D;AACxE,OAAK,MAAM,SAAS,UAAU;GAC7B,MAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,MAAM,CAAC;AAClD,OAAI,WAAW,OAAW,QAAO;;AAElC,SAAO,iBAAiB,SAAY,WAAW,QAAQ,aAAa,GAAG;;CAGxE,MAAM,gBAAgB,SAAS,QAC7B,MAAuC,OAAO,EAAE,cAAc,WAC/D;CAED,SAAS,UAAU,SAAsE;EACxF,IAAI,YAAY;EAChB,IAAIA;EAEJ,MAAM,uBAAuB;AAC5B,OAAI,UAAW;AACf,eAAY;AACZ,kBAAe,YAAY;AAC1B,gBAAY;IACZ,MAAM,QAAQ,MAAM,gBAAgB;IACpC,MAAM,MAAM,OAAO,SAAS;AAC5B,QAAI,QAAQ,YAAa;AACzB,kBAAc;AACd,YAAQ,SAAS,OAAU;KAC1B;;EAGH,MAAM,SAAS,cAAc,KAAK,MAAM,EAAE,WAAY,YAAY,gBAAgB,CAAC,CAAC;AAEpF,eAAa;AACZ,QAAK,MAAM,SAAS,OACnB,QAAO;;;AAKV,QAAO;EACN,MAAM;EACN,MAAM,OAAO;AACZ,UAAO,iBAAiB,UAAU,MAAM;;EAEzC,WAAW,cAAc,SAAS,IAAI,wBAAwB;EAC9D;;AAUF,SAAS,cACR,QACA,QAUmD;AACnD,QAAO,OAAO,KAAK,SAAS;AAC3B,MAAI,MAAM,QAAQ,KAAK,EAAE;GACxB,MAAM,CAAC,SAAS,WAAW;AAC3B,UAAQ,QAA2D,QAAQ,QAAQ;;AAEpF,SAAO;GACN"}
@@ -7,13 +7,13 @@ const require__cookie_utils = require('./_cookie-utils.cjs');
7
7
  * Performs cookie set/delete only. Does not notify subscribers; the store must call notify() after this.
8
8
  *
9
9
  * @param themes - Record mapping theme keys to values (used for type validation)
10
- * @param entry - Theme entry to write, or undefined to remove
10
+ * @param entry - Theme entry to write, or null/undefined to remove
11
11
  * @param options - Cookie options
12
12
  */
13
13
  function writeCookieTheme(_themes, entry, options) {
14
14
  const { cookieName, path = "/", maxAge, sameSite, secure } = options;
15
15
  if (typeof document === "undefined" || document.cookie === void 0) return;
16
- if (entry === void 0) {
16
+ if (entry == null) {
17
17
  require__cookie_utils.deleteCookie(cookieName, path);
18
18
  return;
19
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"write-cookie-theme.cjs","names":["opts: {\n\t\tpath: string\n\t\tmaxAge?: number\n\t\tsameSite?: 'lax' | 'strict' | 'none'\n\t\tsecure?: boolean\n\t}"],"sources":["../../../src/theme/cookie/write-cookie-theme.ts"],"sourcesContent":["import type { ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { deleteCookie, setCookie } from './_cookie-utils.ts'\n\nexport interface WriteCookieThemeOptions<_Themes extends ThemeMap = ThemeMap> {\n\tcookieName: string\n\tpath?: string | undefined\n\tmaxAge?: number | undefined\n\tsameSite?: 'lax' | 'strict' | 'none' | undefined\n\tsecure?: boolean | undefined\n}\n\n/**\n * Writes a theme entry to a cookie.\n *\n * Performs cookie set/delete only. Does not notify subscribers; the store must call notify() after this.\n *\n * @param themes - Record mapping theme keys to values (used for type validation)\n * @param entry - Theme entry to write, or undefined to remove\n * @param options - Cookie options\n */\nexport function writeCookieTheme<Themes extends ThemeMap>(\n\t_themes: Themes,\n\tentry: ThemeEntry<Themes> | undefined,\n\toptions: WriteCookieThemeOptions<Themes>\n): void {\n\tconst { cookieName, path = '/', maxAge, sameSite, secure } = options\n\n\tif (typeof document === 'undefined' || document.cookie === undefined) {\n\t\treturn\n\t}\n\n\tif (entry === undefined) {\n\t\tdeleteCookie(cookieName, path)\n\t\treturn\n\t}\n\n\tconst opts: {\n\t\tpath: string\n\t\tmaxAge?: number\n\t\tsameSite?: 'lax' | 'strict' | 'none'\n\t\tsecure?: boolean\n\t} = { path }\n\tif (maxAge !== undefined) opts.maxAge = maxAge\n\tif (sameSite !== undefined) opts.sameSite = sameSite\n\tif (secure) opts.secure = true\n\tsetCookie(cookieName, JSON.stringify(entry), opts)\n}\n"],"mappings":";;;;;;;;;;;;AAqBA,SAAgB,iBACf,SACA,OACA,SACO;CACP,MAAM,EAAE,YAAY,OAAO,KAAK,QAAQ,UAAU,WAAW;AAE7D,KAAI,OAAO,aAAa,eAAe,SAAS,WAAW,OAC1D;AAGD,KAAI,UAAU,QAAW;AACxB,qCAAa,YAAY,KAAK;AAC9B;;CAGD,MAAMA,OAKF,EAAE,MAAM;AACZ,KAAI,WAAW,OAAW,MAAK,SAAS;AACxC,KAAI,aAAa,OAAW,MAAK,WAAW;AAC5C,KAAI,OAAQ,MAAK,SAAS;AAC1B,iCAAU,YAAY,KAAK,UAAU,MAAM,EAAE,KAAK"}
1
+ {"version":3,"file":"write-cookie-theme.cjs","names":["opts: {\n\t\tpath: string\n\t\tmaxAge?: number\n\t\tsameSite?: 'lax' | 'strict' | 'none'\n\t\tsecure?: boolean\n\t}"],"sources":["../../../src/theme/cookie/write-cookie-theme.ts"],"sourcesContent":["import type { ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { deleteCookie, setCookie } from './_cookie-utils.ts'\n\nexport interface WriteCookieThemeOptions<_Themes extends ThemeMap = ThemeMap> {\n\tcookieName: string\n\tpath?: string | undefined\n\tmaxAge?: number | undefined\n\tsameSite?: 'lax' | 'strict' | 'none' | undefined\n\tsecure?: boolean | undefined\n}\n\n/**\n * Writes a theme entry to a cookie.\n *\n * Performs cookie set/delete only. Does not notify subscribers; the store must call notify() after this.\n *\n * @param themes - Record mapping theme keys to values (used for type validation)\n * @param entry - Theme entry to write, or null/undefined to remove\n * @param options - Cookie options\n */\nexport function writeCookieTheme<Themes extends ThemeMap>(\n\t_themes: Themes,\n\tentry: ThemeEntry<Themes> | null | undefined,\n\toptions: WriteCookieThemeOptions<Themes>\n): void {\n\tconst { cookieName, path = '/', maxAge, sameSite, secure } = options\n\n\tif (typeof document === 'undefined' || document.cookie === undefined) {\n\t\treturn\n\t}\n\n\tif (entry == null) {\n\t\tdeleteCookie(cookieName, path)\n\t\treturn\n\t}\n\n\tconst opts: {\n\t\tpath: string\n\t\tmaxAge?: number\n\t\tsameSite?: 'lax' | 'strict' | 'none'\n\t\tsecure?: boolean\n\t} = { path }\n\tif (maxAge !== undefined) opts.maxAge = maxAge\n\tif (sameSite !== undefined) opts.sameSite = sameSite\n\tif (secure) opts.secure = true\n\tsetCookie(cookieName, JSON.stringify(entry), opts)\n}\n"],"mappings":";;;;;;;;;;;;AAqBA,SAAgB,iBACf,SACA,OACA,SACO;CACP,MAAM,EAAE,YAAY,OAAO,KAAK,QAAQ,UAAU,WAAW;AAE7D,KAAI,OAAO,aAAa,eAAe,SAAS,WAAW,OAC1D;AAGD,KAAI,SAAS,MAAM;AAClB,qCAAa,YAAY,KAAK;AAC9B;;CAGD,MAAMA,OAKF,EAAE,MAAM;AACZ,KAAI,WAAW,OAAW,MAAK,SAAS;AACxC,KAAI,aAAa,OAAW,MAAK,WAAW;AAC5C,KAAI,OAAQ,MAAK,SAAS;AAC1B,iCAAU,YAAY,KAAK,UAAU,MAAM,EAAE,KAAK"}
@@ -15,10 +15,10 @@ interface WriteCookieThemeOptions<_Themes extends ThemeMap = ThemeMap> {
15
15
  * Performs cookie set/delete only. Does not notify subscribers; the store must call notify() after this.
16
16
  *
17
17
  * @param themes - Record mapping theme keys to values (used for type validation)
18
- * @param entry - Theme entry to write, or undefined to remove
18
+ * @param entry - Theme entry to write, or null/undefined to remove
19
19
  * @param options - Cookie options
20
20
  */
21
- declare function writeCookieTheme<Themes extends ThemeMap>(_themes: Themes, entry: ThemeEntry<Themes> | undefined, options: WriteCookieThemeOptions<Themes>): void;
21
+ declare function writeCookieTheme<Themes extends ThemeMap>(_themes: Themes, entry: ThemeEntry<Themes> | null | undefined, options: WriteCookieThemeOptions<Themes>): void;
22
22
  //#endregion
23
23
  export { WriteCookieThemeOptions, writeCookieTheme };
24
24
  //# sourceMappingURL=write-cookie-theme.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"write-cookie-theme.d.cts","names":[],"sources":["../../../src/theme/cookie/write-cookie-theme.ts"],"sourcesContent":[],"mappings":";;;;UAIiB,wCAAwC,WAAW;;EAAnD,IAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAiBD,MAAA,CAAA,EAAA,MAAA,GAAA,SAAgB;EAAgB,QAAA,CAAA,EAAA,KAAA,GAAA,QAAA,GAAA,MAAA,GAAA,SAAA;EACtC,MAAA,CAAA,EAAA,OAAA,GAAA,SAAA;;;;;;;;;;;iBADM,gCAAgC,mBACtC,eACF,WAAW,8BACT,wBAAwB"}
1
+ {"version":3,"file":"write-cookie-theme.d.cts","names":[],"sources":["../../../src/theme/cookie/write-cookie-theme.ts"],"sourcesContent":[],"mappings":";;;;UAIiB,wCAAwC,WAAW;;EAAnD,IAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAiBD,MAAA,CAAA,EAAA,MAAA,GAAA,SAAgB;EAAgB,QAAA,CAAA,EAAA,KAAA,GAAA,QAAA,GAAA,MAAA,GAAA,SAAA;EACtC,MAAA,CAAA,EAAA,OAAA,GAAA,SAAA;;;;;;;;;;;iBADM,gCAAgC,mBACtC,eACF,WAAW,qCACT,wBAAwB"}
@@ -15,10 +15,10 @@ interface WriteCookieThemeOptions<_Themes extends ThemeMap = ThemeMap> {
15
15
  * Performs cookie set/delete only. Does not notify subscribers; the store must call notify() after this.
16
16
  *
17
17
  * @param themes - Record mapping theme keys to values (used for type validation)
18
- * @param entry - Theme entry to write, or undefined to remove
18
+ * @param entry - Theme entry to write, or null/undefined to remove
19
19
  * @param options - Cookie options
20
20
  */
21
- declare function writeCookieTheme<Themes extends ThemeMap>(_themes: Themes, entry: ThemeEntry<Themes> | undefined, options: WriteCookieThemeOptions<Themes>): void;
21
+ declare function writeCookieTheme<Themes extends ThemeMap>(_themes: Themes, entry: ThemeEntry<Themes> | null | undefined, options: WriteCookieThemeOptions<Themes>): void;
22
22
  //#endregion
23
23
  export { WriteCookieThemeOptions, writeCookieTheme };
24
24
  //# sourceMappingURL=write-cookie-theme.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"write-cookie-theme.d.mts","names":[],"sources":["../../../src/theme/cookie/write-cookie-theme.ts"],"sourcesContent":[],"mappings":";;;;UAIiB,wCAAwC,WAAW;;EAAnD,IAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAiBD,MAAA,CAAA,EAAA,MAAA,GAAA,SAAgB;EAAgB,QAAA,CAAA,EAAA,KAAA,GAAA,QAAA,GAAA,MAAA,GAAA,SAAA;EACtC,MAAA,CAAA,EAAA,OAAA,GAAA,SAAA;;;;;;;;;;;iBADM,gCAAgC,mBACtC,eACF,WAAW,8BACT,wBAAwB"}
1
+ {"version":3,"file":"write-cookie-theme.d.mts","names":[],"sources":["../../../src/theme/cookie/write-cookie-theme.ts"],"sourcesContent":[],"mappings":";;;;UAIiB,wCAAwC,WAAW;;EAAnD,IAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAiBD,MAAA,CAAA,EAAA,MAAA,GAAA,SAAgB;EAAgB,QAAA,CAAA,EAAA,KAAA,GAAA,QAAA,GAAA,MAAA,GAAA,SAAA;EACtC,MAAA,CAAA,EAAA,OAAA,GAAA,SAAA;;;;;;;;;;;iBADM,gCAAgC,mBACtC,eACF,WAAW,qCACT,wBAAwB"}
@@ -7,13 +7,13 @@ import { deleteCookie, setCookie } from "./_cookie-utils.mjs";
7
7
  * Performs cookie set/delete only. Does not notify subscribers; the store must call notify() after this.
8
8
  *
9
9
  * @param themes - Record mapping theme keys to values (used for type validation)
10
- * @param entry - Theme entry to write, or undefined to remove
10
+ * @param entry - Theme entry to write, or null/undefined to remove
11
11
  * @param options - Cookie options
12
12
  */
13
13
  function writeCookieTheme(_themes, entry, options) {
14
14
  const { cookieName, path = "/", maxAge, sameSite, secure } = options;
15
15
  if (typeof document === "undefined" || document.cookie === void 0) return;
16
- if (entry === void 0) {
16
+ if (entry == null) {
17
17
  deleteCookie(cookieName, path);
18
18
  return;
19
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"write-cookie-theme.mjs","names":["opts: {\n\t\tpath: string\n\t\tmaxAge?: number\n\t\tsameSite?: 'lax' | 'strict' | 'none'\n\t\tsecure?: boolean\n\t}"],"sources":["../../../src/theme/cookie/write-cookie-theme.ts"],"sourcesContent":["import type { ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { deleteCookie, setCookie } from './_cookie-utils.ts'\n\nexport interface WriteCookieThemeOptions<_Themes extends ThemeMap = ThemeMap> {\n\tcookieName: string\n\tpath?: string | undefined\n\tmaxAge?: number | undefined\n\tsameSite?: 'lax' | 'strict' | 'none' | undefined\n\tsecure?: boolean | undefined\n}\n\n/**\n * Writes a theme entry to a cookie.\n *\n * Performs cookie set/delete only. Does not notify subscribers; the store must call notify() after this.\n *\n * @param themes - Record mapping theme keys to values (used for type validation)\n * @param entry - Theme entry to write, or undefined to remove\n * @param options - Cookie options\n */\nexport function writeCookieTheme<Themes extends ThemeMap>(\n\t_themes: Themes,\n\tentry: ThemeEntry<Themes> | undefined,\n\toptions: WriteCookieThemeOptions<Themes>\n): void {\n\tconst { cookieName, path = '/', maxAge, sameSite, secure } = options\n\n\tif (typeof document === 'undefined' || document.cookie === undefined) {\n\t\treturn\n\t}\n\n\tif (entry === undefined) {\n\t\tdeleteCookie(cookieName, path)\n\t\treturn\n\t}\n\n\tconst opts: {\n\t\tpath: string\n\t\tmaxAge?: number\n\t\tsameSite?: 'lax' | 'strict' | 'none'\n\t\tsecure?: boolean\n\t} = { path }\n\tif (maxAge !== undefined) opts.maxAge = maxAge\n\tif (sameSite !== undefined) opts.sameSite = sameSite\n\tif (secure) opts.secure = true\n\tsetCookie(cookieName, JSON.stringify(entry), opts)\n}\n"],"mappings":";;;;;;;;;;;;AAqBA,SAAgB,iBACf,SACA,OACA,SACO;CACP,MAAM,EAAE,YAAY,OAAO,KAAK,QAAQ,UAAU,WAAW;AAE7D,KAAI,OAAO,aAAa,eAAe,SAAS,WAAW,OAC1D;AAGD,KAAI,UAAU,QAAW;AACxB,eAAa,YAAY,KAAK;AAC9B;;CAGD,MAAMA,OAKF,EAAE,MAAM;AACZ,KAAI,WAAW,OAAW,MAAK,SAAS;AACxC,KAAI,aAAa,OAAW,MAAK,WAAW;AAC5C,KAAI,OAAQ,MAAK,SAAS;AAC1B,WAAU,YAAY,KAAK,UAAU,MAAM,EAAE,KAAK"}
1
+ {"version":3,"file":"write-cookie-theme.mjs","names":["opts: {\n\t\tpath: string\n\t\tmaxAge?: number\n\t\tsameSite?: 'lax' | 'strict' | 'none'\n\t\tsecure?: boolean\n\t}"],"sources":["../../../src/theme/cookie/write-cookie-theme.ts"],"sourcesContent":["import type { ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { deleteCookie, setCookie } from './_cookie-utils.ts'\n\nexport interface WriteCookieThemeOptions<_Themes extends ThemeMap = ThemeMap> {\n\tcookieName: string\n\tpath?: string | undefined\n\tmaxAge?: number | undefined\n\tsameSite?: 'lax' | 'strict' | 'none' | undefined\n\tsecure?: boolean | undefined\n}\n\n/**\n * Writes a theme entry to a cookie.\n *\n * Performs cookie set/delete only. Does not notify subscribers; the store must call notify() after this.\n *\n * @param themes - Record mapping theme keys to values (used for type validation)\n * @param entry - Theme entry to write, or null/undefined to remove\n * @param options - Cookie options\n */\nexport function writeCookieTheme<Themes extends ThemeMap>(\n\t_themes: Themes,\n\tentry: ThemeEntry<Themes> | null | undefined,\n\toptions: WriteCookieThemeOptions<Themes>\n): void {\n\tconst { cookieName, path = '/', maxAge, sameSite, secure } = options\n\n\tif (typeof document === 'undefined' || document.cookie === undefined) {\n\t\treturn\n\t}\n\n\tif (entry == null) {\n\t\tdeleteCookie(cookieName, path)\n\t\treturn\n\t}\n\n\tconst opts: {\n\t\tpath: string\n\t\tmaxAge?: number\n\t\tsameSite?: 'lax' | 'strict' | 'none'\n\t\tsecure?: boolean\n\t} = { path }\n\tif (maxAge !== undefined) opts.maxAge = maxAge\n\tif (sameSite !== undefined) opts.sameSite = sameSite\n\tif (secure) opts.secure = true\n\tsetCookie(cookieName, JSON.stringify(entry), opts)\n}\n"],"mappings":";;;;;;;;;;;;AAqBA,SAAgB,iBACf,SACA,OACA,SACO;CACP,MAAM,EAAE,YAAY,OAAO,KAAK,QAAQ,UAAU,WAAW;AAE7D,KAAI,OAAO,aAAa,eAAe,SAAS,WAAW,OAC1D;AAGD,KAAI,SAAS,MAAM;AAClB,eAAa,YAAY,KAAK;AAC9B;;CAGD,MAAMA,OAKF,EAAE,MAAM;AACZ,KAAI,WAAW,OAAW,MAAK,SAAS;AACxC,KAAI,aAAa,OAAW,MAAK,WAAW;AAC5C,KAAI,OAAQ,MAAK,SAAS;AAC1B,WAAU,YAAY,KAAK,UAAU,MAAM,EAAE,KAAK"}
@@ -9,7 +9,7 @@ const require_match_attribute_value_to_theme = require('../_utils/match-attribut
9
9
  * Pure function: no DOM access. Uses first token when separator is defined.
10
10
  *
11
11
  * @param themes - Record mapping theme keys to attribute values
12
- * @param value - Raw attribute value string (e.g. from getAttribute)
12
+ * @param value - Raw attribute value string (e.g. from getAttribute; accepts null)
13
13
  * @param options.separator - When defined, split by separator and use first token (default: space)
14
14
  * @returns ThemeEntry if a match is found, otherwise undefined
15
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"parse-data-attribute.cjs","names":["SEPARATOR_SPACE","matchAttributeValueToTheme","themeEntry"],"sources":["../../../src/theme/data-attribute/parse-data-attribute.ts"],"sourcesContent":["import { matchAttributeValueToTheme } from '../_utils/match-attribute-value-to-theme.ts'\nimport { themeEntry } from '../theme-entry.ts'\nimport type { ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { SEPARATOR_SPACE } from './_constant.ts'\n\n/**\n * Parses a data attribute value string into a ThemeEntry.\n *\n * Pure function: no DOM access. Uses first token when separator is defined.\n *\n * @param themes - Record mapping theme keys to attribute values\n * @param value - Raw attribute value string (e.g. from getAttribute)\n * @param options.separator - When defined, split by separator and use first token (default: space)\n * @returns ThemeEntry if a match is found, otherwise undefined\n */\nexport function parseDataAttribute<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tvalue: string | undefined,\n\toptions?: { separator?: string | undefined } | undefined\n): ThemeEntry<Themes> | undefined {\n\tconst separator = options?.separator ?? SEPARATOR_SPACE\n\tconst theme = matchAttributeValueToTheme(themes, value ?? null, { separator })\n\treturn theme !== undefined ? themeEntry(themes, theme) : undefined\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,SAAgB,mBACf,QACA,OACA,SACiC;CACjC,MAAM,YAAY,SAAS,aAAaA;CACxC,MAAM,QAAQC,kEAA2B,QAAQ,SAAS,MAAM,EAAE,WAAW,CAAC;AAC9E,QAAO,UAAU,SAAYC,+BAAW,QAAQ,MAAM,GAAG"}
1
+ {"version":3,"file":"parse-data-attribute.cjs","names":["SEPARATOR_SPACE","matchAttributeValueToTheme","themeEntry"],"sources":["../../../src/theme/data-attribute/parse-data-attribute.ts"],"sourcesContent":["import { matchAttributeValueToTheme } from '../_utils/match-attribute-value-to-theme.ts'\nimport { themeEntry } from '../theme-entry.ts'\nimport type { ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { SEPARATOR_SPACE } from './_constant.ts'\n\n/**\n * Parses a data attribute value string into a ThemeEntry.\n *\n * Pure function: no DOM access. Uses first token when separator is defined.\n *\n * @param themes - Record mapping theme keys to attribute values\n * @param value - Raw attribute value string (e.g. from getAttribute; accepts null)\n * @param options.separator - When defined, split by separator and use first token (default: space)\n * @returns ThemeEntry if a match is found, otherwise undefined\n */\nexport function parseDataAttribute<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tvalue: string | null | undefined,\n\toptions?: { separator?: string | undefined } | undefined\n): ThemeEntry<Themes> | undefined {\n\tconst separator = options?.separator ?? SEPARATOR_SPACE\n\tconst theme = matchAttributeValueToTheme(themes, value ?? null, { separator })\n\treturn theme !== undefined ? themeEntry(themes, theme) : undefined\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,SAAgB,mBACf,QACA,OACA,SACiC;CACjC,MAAM,YAAY,SAAS,aAAaA;CACxC,MAAM,QAAQC,kEAA2B,QAAQ,SAAS,MAAM,EAAE,WAAW,CAAC;AAC9E,QAAO,UAAU,SAAYC,+BAAW,QAAQ,MAAM,GAAG"}
@@ -9,11 +9,11 @@ import { ThemeEntry } from "../theme-entry.types.cjs";
9
9
  * Pure function: no DOM access. Uses first token when separator is defined.
10
10
  *
11
11
  * @param themes - Record mapping theme keys to attribute values
12
- * @param value - Raw attribute value string (e.g. from getAttribute)
12
+ * @param value - Raw attribute value string (e.g. from getAttribute; accepts null)
13
13
  * @param options.separator - When defined, split by separator and use first token (default: space)
14
14
  * @returns ThemeEntry if a match is found, otherwise undefined
15
15
  */
16
- declare function parseDataAttribute<Themes extends ThemeMap>(themes: Themes, value: string | undefined, options?: {
16
+ declare function parseDataAttribute<Themes extends ThemeMap>(themes: Themes, value: string | null | undefined, options?: {
17
17
  separator?: string | undefined;
18
18
  } | undefined): ThemeEntry<Themes> | undefined;
19
19
  //#endregion
@@ -9,11 +9,11 @@ import { ThemeEntry } from "../theme-entry.types.mjs";
9
9
  * Pure function: no DOM access. Uses first token when separator is defined.
10
10
  *
11
11
  * @param themes - Record mapping theme keys to attribute values
12
- * @param value - Raw attribute value string (e.g. from getAttribute)
12
+ * @param value - Raw attribute value string (e.g. from getAttribute; accepts null)
13
13
  * @param options.separator - When defined, split by separator and use first token (default: space)
14
14
  * @returns ThemeEntry if a match is found, otherwise undefined
15
15
  */
16
- declare function parseDataAttribute<Themes extends ThemeMap>(themes: Themes, value: string | undefined, options?: {
16
+ declare function parseDataAttribute<Themes extends ThemeMap>(themes: Themes, value: string | null | undefined, options?: {
17
17
  separator?: string | undefined;
18
18
  } | undefined): ThemeEntry<Themes> | undefined;
19
19
  //#endregion
@@ -9,7 +9,7 @@ import { matchAttributeValueToTheme } from "../_utils/match-attribute-value-to-t
9
9
  * Pure function: no DOM access. Uses first token when separator is defined.
10
10
  *
11
11
  * @param themes - Record mapping theme keys to attribute values
12
- * @param value - Raw attribute value string (e.g. from getAttribute)
12
+ * @param value - Raw attribute value string (e.g. from getAttribute; accepts null)
13
13
  * @param options.separator - When defined, split by separator and use first token (default: space)
14
14
  * @returns ThemeEntry if a match is found, otherwise undefined
15
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"parse-data-attribute.mjs","names":[],"sources":["../../../src/theme/data-attribute/parse-data-attribute.ts"],"sourcesContent":["import { matchAttributeValueToTheme } from '../_utils/match-attribute-value-to-theme.ts'\nimport { themeEntry } from '../theme-entry.ts'\nimport type { ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { SEPARATOR_SPACE } from './_constant.ts'\n\n/**\n * Parses a data attribute value string into a ThemeEntry.\n *\n * Pure function: no DOM access. Uses first token when separator is defined.\n *\n * @param themes - Record mapping theme keys to attribute values\n * @param value - Raw attribute value string (e.g. from getAttribute)\n * @param options.separator - When defined, split by separator and use first token (default: space)\n * @returns ThemeEntry if a match is found, otherwise undefined\n */\nexport function parseDataAttribute<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tvalue: string | undefined,\n\toptions?: { separator?: string | undefined } | undefined\n): ThemeEntry<Themes> | undefined {\n\tconst separator = options?.separator ?? SEPARATOR_SPACE\n\tconst theme = matchAttributeValueToTheme(themes, value ?? null, { separator })\n\treturn theme !== undefined ? themeEntry(themes, theme) : undefined\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,SAAgB,mBACf,QACA,OACA,SACiC;CACjC,MAAM,YAAY,SAAS,aAAa;CACxC,MAAM,QAAQ,2BAA2B,QAAQ,SAAS,MAAM,EAAE,WAAW,CAAC;AAC9E,QAAO,UAAU,SAAY,WAAW,QAAQ,MAAM,GAAG"}
1
+ {"version":3,"file":"parse-data-attribute.mjs","names":[],"sources":["../../../src/theme/data-attribute/parse-data-attribute.ts"],"sourcesContent":["import { matchAttributeValueToTheme } from '../_utils/match-attribute-value-to-theme.ts'\nimport { themeEntry } from '../theme-entry.ts'\nimport type { ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { SEPARATOR_SPACE } from './_constant.ts'\n\n/**\n * Parses a data attribute value string into a ThemeEntry.\n *\n * Pure function: no DOM access. Uses first token when separator is defined.\n *\n * @param themes - Record mapping theme keys to attribute values\n * @param value - Raw attribute value string (e.g. from getAttribute; accepts null)\n * @param options.separator - When defined, split by separator and use first token (default: space)\n * @returns ThemeEntry if a match is found, otherwise undefined\n */\nexport function parseDataAttribute<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tvalue: string | null | undefined,\n\toptions?: { separator?: string | undefined } | undefined\n): ThemeEntry<Themes> | undefined {\n\tconst separator = options?.separator ?? SEPARATOR_SPACE\n\tconst theme = matchAttributeValueToTheme(themes, value ?? null, { separator })\n\treturn theme !== undefined ? themeEntry(themes, theme) : undefined\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,SAAgB,mBACf,QACA,OACA,SACiC;CACjC,MAAM,YAAY,SAAS,aAAa;CACxC,MAAM,QAAQ,2BAA2B,QAAQ,SAAS,MAAM,EAAE,WAAW,CAAC;AAC9E,QAAO,UAAU,SAAY,WAAW,QAAQ,MAAM,GAAG"}
@@ -8,7 +8,7 @@ const require_parse_data_attribute = require('./parse-data-attribute.cjs');
8
8
  *
9
9
  * @param themes - Record mapping theme keys to attribute values
10
10
  * @param attributeName - Data attribute name (e.g. `data-theme`)
11
- * @param options.element - Element to read from (defaults to document.documentElement)
11
+ * @param options.element - Element to read from (accepts null e.g. from refs). Defaults to document.documentElement.
12
12
  * @param options.parse - Custom parser (default: parseDataAttribute with space separator)
13
13
  * @returns ThemeEntry if found, undefined otherwise. Returns undefined when element is not available (e.g. SSR).
14
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"read-data-attribute.cjs","names":["parseDataAttribute","SEPARATOR_SPACE","getDataAttribute"],"sources":["../../../src/theme/data-attribute/read-data-attribute.ts"],"sourcesContent":["import { getDataAttribute } from '../../attributes/get-data-attribute.ts'\nimport type { ParseStoredTheme, ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { SEPARATOR_SPACE } from './_constant.ts'\nimport { parseDataAttribute } from './parse-data-attribute.ts'\n\n/**\n * Reads a theme entry from a data attribute on an element.\n *\n * @param themes - Record mapping theme keys to attribute values\n * @param attributeName - Data attribute name (e.g. `data-theme`)\n * @param options.element - Element to read from (defaults to document.documentElement)\n * @param options.parse - Custom parser (default: parseDataAttribute with space separator)\n * @returns ThemeEntry if found, undefined otherwise. Returns undefined when element is not available (e.g. SSR).\n */\nexport function readDataAttribute<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tattributeName: `data-${string}`,\n\toptions?:\n\t\t| { element?: Element | undefined; parse?: ParseStoredTheme<Themes> | undefined }\n\t\t| undefined\n): ThemeEntry<Themes> | undefined {\n\tconst element = options?.element ?? document?.documentElement\n\tif (!element) return undefined\n\tconst parse =\n\t\toptions?.parse ?? ((t, v) => parseDataAttribute(t, v, { separator: SEPARATOR_SPACE }))\n\tconst raw = getDataAttribute(attributeName, element) ?? undefined\n\treturn parse(themes, raw)\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,kBACf,QACA,eACA,SAGiC;CACjC,MAAM,UAAU,SAAS,WAAW,UAAU;AAC9C,KAAI,CAAC,QAAS,QAAO;AAIrB,SAFC,SAAS,WAAW,GAAG,MAAMA,gDAAmB,GAAG,GAAG,EAAE,WAAWC,mCAAiB,CAAC,GAEzE,QADDC,4CAAiB,eAAe,QAAQ,IAAI,OAC/B"}
1
+ {"version":3,"file":"read-data-attribute.cjs","names":["parseDataAttribute","SEPARATOR_SPACE","getDataAttribute"],"sources":["../../../src/theme/data-attribute/read-data-attribute.ts"],"sourcesContent":["import { getDataAttribute } from '../../attributes/get-data-attribute.ts'\nimport type { ParseStoredTheme, ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { SEPARATOR_SPACE } from './_constant.ts'\nimport { parseDataAttribute } from './parse-data-attribute.ts'\n\n/**\n * Reads a theme entry from a data attribute on an element.\n *\n * @param themes - Record mapping theme keys to attribute values\n * @param attributeName - Data attribute name (e.g. `data-theme`)\n * @param options.element - Element to read from (accepts null e.g. from refs). Defaults to document.documentElement.\n * @param options.parse - Custom parser (default: parseDataAttribute with space separator)\n * @returns ThemeEntry if found, undefined otherwise. Returns undefined when element is not available (e.g. SSR).\n */\nexport function readDataAttribute<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tattributeName: `data-${string}`,\n\toptions?:\n\t\t| { element?: Element | null | undefined; parse?: ParseStoredTheme<Themes> | undefined }\n\t\t| undefined\n): ThemeEntry<Themes> | undefined {\n\tconst element = options?.element ?? document?.documentElement\n\tif (!element) return undefined\n\tconst parse =\n\t\toptions?.parse ?? ((t, v) => parseDataAttribute(t, v, { separator: SEPARATOR_SPACE }))\n\tconst raw = getDataAttribute(attributeName, element) ?? undefined\n\treturn parse(themes, raw)\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,kBACf,QACA,eACA,SAGiC;CACjC,MAAM,UAAU,SAAS,WAAW,UAAU;AAC9C,KAAI,CAAC,QAAS,QAAO;AAIrB,SAFC,SAAS,WAAW,GAAG,MAAMA,gDAAmB,GAAG,GAAG,EAAE,WAAWC,mCAAiB,CAAC,GAEzE,QADDC,4CAAiB,eAAe,QAAQ,IAAI,OAC/B"}
@@ -8,12 +8,12 @@ import { ParseStoredTheme, ThemeEntry } from "../theme-entry.types.cjs";
8
8
  *
9
9
  * @param themes - Record mapping theme keys to attribute values
10
10
  * @param attributeName - Data attribute name (e.g. `data-theme`)
11
- * @param options.element - Element to read from (defaults to document.documentElement)
11
+ * @param options.element - Element to read from (accepts null e.g. from refs). Defaults to document.documentElement.
12
12
  * @param options.parse - Custom parser (default: parseDataAttribute with space separator)
13
13
  * @returns ThemeEntry if found, undefined otherwise. Returns undefined when element is not available (e.g. SSR).
14
14
  */
15
15
  declare function readDataAttribute<Themes extends ThemeMap>(themes: Themes, attributeName: `data-${string}`, options?: {
16
- element?: Element | undefined;
16
+ element?: Element | null | undefined;
17
17
  parse?: ParseStoredTheme<Themes> | undefined;
18
18
  } | undefined): ThemeEntry<Themes> | undefined;
19
19
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"read-data-attribute.d.cts","names":[],"sources":["../../../src/theme/data-attribute/read-data-attribute.ts"],"sourcesContent":[],"mappings":";;;;;;;AAeA;;;;;;;AAMG,iBANa,iBAMb,CAAA,eAN8C,QAM9C,CAAA,CAAA,MAAA,EALM,MAKN,EAAA,aAAA,EAAA,QAAA,MAAA,EAAA,EAAA,QAAA,EAAA;EAAU,OAAA,CAAA,EAFG,OAEH,GAAA,SAAA;UAFgC,iBAAiB;gBAE3D,WAAW"}
1
+ {"version":3,"file":"read-data-attribute.d.cts","names":[],"sources":["../../../src/theme/data-attribute/read-data-attribute.ts"],"sourcesContent":[],"mappings":";;;;;;;AAeA;;;;;;;AAMG,iBANa,iBAMb,CAAA,eAN8C,QAM9C,CAAA,CAAA,MAAA,EALM,MAKN,EAAA,aAAA,EAAA,QAAA,MAAA,EAAA,EAAA,QAAA,EAAA;EAAU,OAAA,CAAA,EAFG,OAEH,GAAA,IAAA,GAAA,SAAA;UAFuC,iBAAiB;gBAElE,WAAW"}
@@ -8,12 +8,12 @@ import { ParseStoredTheme, ThemeEntry } from "../theme-entry.types.mjs";
8
8
  *
9
9
  * @param themes - Record mapping theme keys to attribute values
10
10
  * @param attributeName - Data attribute name (e.g. `data-theme`)
11
- * @param options.element - Element to read from (defaults to document.documentElement)
11
+ * @param options.element - Element to read from (accepts null e.g. from refs). Defaults to document.documentElement.
12
12
  * @param options.parse - Custom parser (default: parseDataAttribute with space separator)
13
13
  * @returns ThemeEntry if found, undefined otherwise. Returns undefined when element is not available (e.g. SSR).
14
14
  */
15
15
  declare function readDataAttribute<Themes extends ThemeMap>(themes: Themes, attributeName: `data-${string}`, options?: {
16
- element?: Element | undefined;
16
+ element?: Element | null | undefined;
17
17
  parse?: ParseStoredTheme<Themes> | undefined;
18
18
  } | undefined): ThemeEntry<Themes> | undefined;
19
19
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"read-data-attribute.d.mts","names":[],"sources":["../../../src/theme/data-attribute/read-data-attribute.ts"],"sourcesContent":[],"mappings":";;;;;;;AAeA;;;;;;;AAMG,iBANa,iBAMb,CAAA,eAN8C,QAM9C,CAAA,CAAA,MAAA,EALM,MAKN,EAAA,aAAA,EAAA,QAAA,MAAA,EAAA,EAAA,QAAA,EAAA;EAAU,OAAA,CAAA,EAFG,OAEH,GAAA,SAAA;UAFgC,iBAAiB;gBAE3D,WAAW"}
1
+ {"version":3,"file":"read-data-attribute.d.mts","names":[],"sources":["../../../src/theme/data-attribute/read-data-attribute.ts"],"sourcesContent":[],"mappings":";;;;;;;AAeA;;;;;;;AAMG,iBANa,iBAMb,CAAA,eAN8C,QAM9C,CAAA,CAAA,MAAA,EALM,MAKN,EAAA,aAAA,EAAA,QAAA,MAAA,EAAA,EAAA,QAAA,EAAA;EAAU,OAAA,CAAA,EAFG,OAEH,GAAA,IAAA,GAAA,SAAA;UAFuC,iBAAiB;gBAElE,WAAW"}
@@ -8,7 +8,7 @@ import { parseDataAttribute } from "./parse-data-attribute.mjs";
8
8
  *
9
9
  * @param themes - Record mapping theme keys to attribute values
10
10
  * @param attributeName - Data attribute name (e.g. `data-theme`)
11
- * @param options.element - Element to read from (defaults to document.documentElement)
11
+ * @param options.element - Element to read from (accepts null e.g. from refs). Defaults to document.documentElement.
12
12
  * @param options.parse - Custom parser (default: parseDataAttribute with space separator)
13
13
  * @returns ThemeEntry if found, undefined otherwise. Returns undefined when element is not available (e.g. SSR).
14
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"read-data-attribute.mjs","names":[],"sources":["../../../src/theme/data-attribute/read-data-attribute.ts"],"sourcesContent":["import { getDataAttribute } from '../../attributes/get-data-attribute.ts'\nimport type { ParseStoredTheme, ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { SEPARATOR_SPACE } from './_constant.ts'\nimport { parseDataAttribute } from './parse-data-attribute.ts'\n\n/**\n * Reads a theme entry from a data attribute on an element.\n *\n * @param themes - Record mapping theme keys to attribute values\n * @param attributeName - Data attribute name (e.g. `data-theme`)\n * @param options.element - Element to read from (defaults to document.documentElement)\n * @param options.parse - Custom parser (default: parseDataAttribute with space separator)\n * @returns ThemeEntry if found, undefined otherwise. Returns undefined when element is not available (e.g. SSR).\n */\nexport function readDataAttribute<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tattributeName: `data-${string}`,\n\toptions?:\n\t\t| { element?: Element | undefined; parse?: ParseStoredTheme<Themes> | undefined }\n\t\t| undefined\n): ThemeEntry<Themes> | undefined {\n\tconst element = options?.element ?? document?.documentElement\n\tif (!element) return undefined\n\tconst parse =\n\t\toptions?.parse ?? ((t, v) => parseDataAttribute(t, v, { separator: SEPARATOR_SPACE }))\n\tconst raw = getDataAttribute(attributeName, element) ?? undefined\n\treturn parse(themes, raw)\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,kBACf,QACA,eACA,SAGiC;CACjC,MAAM,UAAU,SAAS,WAAW,UAAU;AAC9C,KAAI,CAAC,QAAS,QAAO;AAIrB,SAFC,SAAS,WAAW,GAAG,MAAM,mBAAmB,GAAG,GAAG,EAAE,WAAW,iBAAiB,CAAC,GAEzE,QADD,iBAAiB,eAAe,QAAQ,IAAI,OAC/B"}
1
+ {"version":3,"file":"read-data-attribute.mjs","names":[],"sources":["../../../src/theme/data-attribute/read-data-attribute.ts"],"sourcesContent":["import { getDataAttribute } from '../../attributes/get-data-attribute.ts'\nimport type { ParseStoredTheme, ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { SEPARATOR_SPACE } from './_constant.ts'\nimport { parseDataAttribute } from './parse-data-attribute.ts'\n\n/**\n * Reads a theme entry from a data attribute on an element.\n *\n * @param themes - Record mapping theme keys to attribute values\n * @param attributeName - Data attribute name (e.g. `data-theme`)\n * @param options.element - Element to read from (accepts null e.g. from refs). Defaults to document.documentElement.\n * @param options.parse - Custom parser (default: parseDataAttribute with space separator)\n * @returns ThemeEntry if found, undefined otherwise. Returns undefined when element is not available (e.g. SSR).\n */\nexport function readDataAttribute<Themes extends ThemeMap>(\n\tthemes: Themes,\n\tattributeName: `data-${string}`,\n\toptions?:\n\t\t| { element?: Element | null | undefined; parse?: ParseStoredTheme<Themes> | undefined }\n\t\t| undefined\n): ThemeEntry<Themes> | undefined {\n\tconst element = options?.element ?? document?.documentElement\n\tif (!element) return undefined\n\tconst parse =\n\t\toptions?.parse ?? ((t, v) => parseDataAttribute(t, v, { separator: SEPARATOR_SPACE }))\n\tconst raw = getDataAttribute(attributeName, element) ?? undefined\n\treturn parse(themes, raw)\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,kBACf,QACA,eACA,SAGiC;CACjC,MAAM,UAAU,SAAS,WAAW,UAAU;AAC9C,KAAI,CAAC,QAAS,QAAO;AAIrB,SAFC,SAAS,WAAW,GAAG,MAAM,mBAAmB,GAAG,GAAG,EAAE,WAAW,iBAAiB,CAAC,GAEzE,QADD,iBAAiB,eAAe,QAAQ,IAAI,OAC/B"}
@@ -9,8 +9,8 @@ const require__constant = require('./_constant.cjs');
9
9
  * Aligns with stringifyClassName logic.
10
10
  *
11
11
  * @param themes - Record mapping theme keys to attribute values (used to identify theme tokens)
12
- * @param existing - Current attribute value string
13
- * @param entry - Theme entry to stringify, or undefined to clear theme (keeps non-theme tokens)
12
+ * @param existing - Current attribute value string (accepts null e.g. from getAttribute)
13
+ * @param entry - Theme entry to stringify, or null/undefined to clear theme (keeps non-theme tokens)
14
14
  * @param options.separator - Token separator (default: space)
15
15
  * @returns Attribute value string
16
16
  */
@@ -20,8 +20,8 @@ function stringifyDataAttribute(themes, existing, entry, options) {
20
20
  const resolved = require_resolve_theme_map_value.resolveThemeMapValue(v);
21
21
  return Array.isArray(resolved) ? [...resolved] : [resolved];
22
22
  });
23
- const withoutThemeValues = (existing?.trim() ? existing.trim().split(separator) : []).filter((t) => !allThemeValues.includes(t.trim()));
24
- const newTokens = entry !== void 0 ? (() => {
23
+ const withoutThemeValues = ((existing ?? "")?.trim() ? (existing ?? "").trim().split(separator) : []).filter((t) => !allThemeValues.includes(t.trim()));
24
+ const newTokens = entry != null ? (() => {
25
25
  const resolved = require_resolve_theme_map_value.resolveThemeMapValue(entry.value);
26
26
  return Array.isArray(resolved) ? [resolved[0]] : [resolved];
27
27
  })() : [];
@@ -1 +1 @@
1
- {"version":3,"file":"stringify-data-attribute.cjs","names":["SEPARATOR_SPACE","resolveThemeMapValue"],"sources":["../../../src/theme/data-attribute/stringify-data-attribute.ts"],"sourcesContent":["import { resolveThemeMapValue } from '../_utils/resolve-theme-map-value.ts'\nimport type { ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { SEPARATOR_SPACE } from './_constant.ts'\n\n/**\n * Stringifies a ThemeEntry for a data attribute value.\n *\n * Pure function: no DOM access. Removes all theme values from existing, then adds entry's value(s).\n * Aligns with stringifyClassName logic.\n *\n * @param themes - Record mapping theme keys to attribute values (used to identify theme tokens)\n * @param existing - Current attribute value string\n * @param entry - Theme entry to stringify, or undefined to clear theme (keeps non-theme tokens)\n * @param options.separator - Token separator (default: space)\n * @returns Attribute value string\n */\nexport function stringifyDataAttribute<Themes extends ThemeMap>(\n\tthemes: Themes,\n\texisting: string | undefined,\n\tentry: ThemeEntry<Themes> | undefined,\n\toptions?: { separator?: string | undefined } | undefined\n): string {\n\tconst separator = options?.separator ?? SEPARATOR_SPACE\n\tconst allThemeValues = Object.values(themes).flatMap((v) => {\n\t\tconst resolved = resolveThemeMapValue(v)\n\t\treturn Array.isArray(resolved) ? [...resolved] : [resolved]\n\t})\n\tconst existingTokens = existing?.trim() ? existing.trim().split(separator) : []\n\tconst withoutThemeValues = existingTokens.filter((t) => !allThemeValues.includes(t.trim()))\n\tconst newTokens =\n\t\tentry !== undefined\n\t\t\t? (() => {\n\t\t\t\t\tconst resolved = resolveThemeMapValue(entry.value)\n\t\t\t\t\treturn Array.isArray(resolved) ? [resolved[0]] : [resolved]\n\t\t\t\t})()\n\t\t\t: []\n\treturn [...withoutThemeValues, ...newTokens].filter(Boolean).join(separator)\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,SAAgB,uBACf,QACA,UACA,OACA,SACS;CACT,MAAM,YAAY,SAAS,aAAaA;CACxC,MAAM,iBAAiB,OAAO,OAAO,OAAO,CAAC,SAAS,MAAM;EAC3D,MAAM,WAAWC,qDAAqB,EAAE;AACxC,SAAO,MAAM,QAAQ,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS;GAC1D;CAEF,MAAM,sBADiB,UAAU,MAAM,GAAG,SAAS,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,EACrC,QAAQ,MAAM,CAAC,eAAe,SAAS,EAAE,MAAM,CAAC,CAAC;CAC3F,MAAM,YACL,UAAU,gBACA;EACP,MAAM,WAAWA,qDAAqB,MAAM,MAAM;AAClD,SAAO,MAAM,QAAQ,SAAS,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS;KACxD,GACH,EAAE;AACN,QAAO,CAAC,GAAG,oBAAoB,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,UAAU"}
1
+ {"version":3,"file":"stringify-data-attribute.cjs","names":["SEPARATOR_SPACE","resolveThemeMapValue"],"sources":["../../../src/theme/data-attribute/stringify-data-attribute.ts"],"sourcesContent":["import { resolveThemeMapValue } from '../_utils/resolve-theme-map-value.ts'\nimport type { ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { SEPARATOR_SPACE } from './_constant.ts'\n\n/**\n * Stringifies a ThemeEntry for a data attribute value.\n *\n * Pure function: no DOM access. Removes all theme values from existing, then adds entry's value(s).\n * Aligns with stringifyClassName logic.\n *\n * @param themes - Record mapping theme keys to attribute values (used to identify theme tokens)\n * @param existing - Current attribute value string (accepts null e.g. from getAttribute)\n * @param entry - Theme entry to stringify, or null/undefined to clear theme (keeps non-theme tokens)\n * @param options.separator - Token separator (default: space)\n * @returns Attribute value string\n */\nexport function stringifyDataAttribute<Themes extends ThemeMap>(\n\tthemes: Themes,\n\texisting: string | null | undefined,\n\tentry: ThemeEntry<Themes> | null | undefined,\n\toptions?: { separator?: string | undefined } | undefined\n): string {\n\tconst separator = options?.separator ?? SEPARATOR_SPACE\n\tconst allThemeValues = Object.values(themes).flatMap((v) => {\n\t\tconst resolved = resolveThemeMapValue(v)\n\t\treturn Array.isArray(resolved) ? [...resolved] : [resolved]\n\t})\n\tconst existingTokens = (existing ?? '')?.trim() ? (existing ?? '').trim().split(separator) : []\n\tconst withoutThemeValues = existingTokens.filter((t) => !allThemeValues.includes(t.trim()))\n\tconst newTokens =\n\t\tentry != null\n\t\t\t? (() => {\n\t\t\t\t\tconst resolved = resolveThemeMapValue(entry.value)\n\t\t\t\t\treturn Array.isArray(resolved) ? [resolved[0]] : [resolved]\n\t\t\t\t})()\n\t\t\t: []\n\treturn [...withoutThemeValues, ...newTokens].filter(Boolean).join(separator)\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,SAAgB,uBACf,QACA,UACA,OACA,SACS;CACT,MAAM,YAAY,SAAS,aAAaA;CACxC,MAAM,iBAAiB,OAAO,OAAO,OAAO,CAAC,SAAS,MAAM;EAC3D,MAAM,WAAWC,qDAAqB,EAAE;AACxC,SAAO,MAAM,QAAQ,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS;GAC1D;CAEF,MAAM,uBADkB,YAAY,KAAK,MAAM,IAAI,YAAY,IAAI,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,EACrD,QAAQ,MAAM,CAAC,eAAe,SAAS,EAAE,MAAM,CAAC,CAAC;CAC3F,MAAM,YACL,SAAS,cACC;EACP,MAAM,WAAWA,qDAAqB,MAAM,MAAM;AAClD,SAAO,MAAM,QAAQ,SAAS,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS;KACxD,GACH,EAAE;AACN,QAAO,CAAC,GAAG,oBAAoB,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,UAAU"}
@@ -10,12 +10,12 @@ import { ThemeEntry } from "../theme-entry.types.cjs";
10
10
  * Aligns with stringifyClassName logic.
11
11
  *
12
12
  * @param themes - Record mapping theme keys to attribute values (used to identify theme tokens)
13
- * @param existing - Current attribute value string
14
- * @param entry - Theme entry to stringify, or undefined to clear theme (keeps non-theme tokens)
13
+ * @param existing - Current attribute value string (accepts null e.g. from getAttribute)
14
+ * @param entry - Theme entry to stringify, or null/undefined to clear theme (keeps non-theme tokens)
15
15
  * @param options.separator - Token separator (default: space)
16
16
  * @returns Attribute value string
17
17
  */
18
- declare function stringifyDataAttribute<Themes extends ThemeMap>(themes: Themes, existing: string | undefined, entry: ThemeEntry<Themes> | undefined, options?: {
18
+ declare function stringifyDataAttribute<Themes extends ThemeMap>(themes: Themes, existing: string | null | undefined, entry: ThemeEntry<Themes> | null | undefined, options?: {
19
19
  separator?: string | undefined;
20
20
  } | undefined): string;
21
21
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"stringify-data-attribute.d.cts","names":[],"sources":["../../../src/theme/data-attribute/stringify-data-attribute.ts"],"sourcesContent":[],"mappings":";;;;;;;AAiBA;;;;;;;;;;iBAAgB,sCAAsC,kBAC7C,6CAED,WAAW"}
1
+ {"version":3,"file":"stringify-data-attribute.d.cts","names":[],"sources":["../../../src/theme/data-attribute/stringify-data-attribute.ts"],"sourcesContent":[],"mappings":";;;;;;;AAiBA;;;;;;;;;;iBAAgB,sCAAsC,kBAC7C,oDAED,WAAW"}
@@ -10,12 +10,12 @@ import { ThemeEntry } from "../theme-entry.types.mjs";
10
10
  * Aligns with stringifyClassName logic.
11
11
  *
12
12
  * @param themes - Record mapping theme keys to attribute values (used to identify theme tokens)
13
- * @param existing - Current attribute value string
14
- * @param entry - Theme entry to stringify, or undefined to clear theme (keeps non-theme tokens)
13
+ * @param existing - Current attribute value string (accepts null e.g. from getAttribute)
14
+ * @param entry - Theme entry to stringify, or null/undefined to clear theme (keeps non-theme tokens)
15
15
  * @param options.separator - Token separator (default: space)
16
16
  * @returns Attribute value string
17
17
  */
18
- declare function stringifyDataAttribute<Themes extends ThemeMap>(themes: Themes, existing: string | undefined, entry: ThemeEntry<Themes> | undefined, options?: {
18
+ declare function stringifyDataAttribute<Themes extends ThemeMap>(themes: Themes, existing: string | null | undefined, entry: ThemeEntry<Themes> | null | undefined, options?: {
19
19
  separator?: string | undefined;
20
20
  } | undefined): string;
21
21
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"stringify-data-attribute.d.mts","names":[],"sources":["../../../src/theme/data-attribute/stringify-data-attribute.ts"],"sourcesContent":[],"mappings":";;;;;;;AAiBA;;;;;;;;;;iBAAgB,sCAAsC,kBAC7C,6CAED,WAAW"}
1
+ {"version":3,"file":"stringify-data-attribute.d.mts","names":[],"sources":["../../../src/theme/data-attribute/stringify-data-attribute.ts"],"sourcesContent":[],"mappings":";;;;;;;AAiBA;;;;;;;;;;iBAAgB,sCAAsC,kBAC7C,oDAED,WAAW"}
@@ -9,8 +9,8 @@ import { SEPARATOR_SPACE } from "./_constant.mjs";
9
9
  * Aligns with stringifyClassName logic.
10
10
  *
11
11
  * @param themes - Record mapping theme keys to attribute values (used to identify theme tokens)
12
- * @param existing - Current attribute value string
13
- * @param entry - Theme entry to stringify, or undefined to clear theme (keeps non-theme tokens)
12
+ * @param existing - Current attribute value string (accepts null e.g. from getAttribute)
13
+ * @param entry - Theme entry to stringify, or null/undefined to clear theme (keeps non-theme tokens)
14
14
  * @param options.separator - Token separator (default: space)
15
15
  * @returns Attribute value string
16
16
  */
@@ -20,8 +20,8 @@ function stringifyDataAttribute(themes, existing, entry, options) {
20
20
  const resolved = resolveThemeMapValue(v);
21
21
  return Array.isArray(resolved) ? [...resolved] : [resolved];
22
22
  });
23
- const withoutThemeValues = (existing?.trim() ? existing.trim().split(separator) : []).filter((t) => !allThemeValues.includes(t.trim()));
24
- const newTokens = entry !== void 0 ? (() => {
23
+ const withoutThemeValues = ((existing ?? "")?.trim() ? (existing ?? "").trim().split(separator) : []).filter((t) => !allThemeValues.includes(t.trim()));
24
+ const newTokens = entry != null ? (() => {
25
25
  const resolved = resolveThemeMapValue(entry.value);
26
26
  return Array.isArray(resolved) ? [resolved[0]] : [resolved];
27
27
  })() : [];
@@ -1 +1 @@
1
- {"version":3,"file":"stringify-data-attribute.mjs","names":[],"sources":["../../../src/theme/data-attribute/stringify-data-attribute.ts"],"sourcesContent":["import { resolveThemeMapValue } from '../_utils/resolve-theme-map-value.ts'\nimport type { ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { SEPARATOR_SPACE } from './_constant.ts'\n\n/**\n * Stringifies a ThemeEntry for a data attribute value.\n *\n * Pure function: no DOM access. Removes all theme values from existing, then adds entry's value(s).\n * Aligns with stringifyClassName logic.\n *\n * @param themes - Record mapping theme keys to attribute values (used to identify theme tokens)\n * @param existing - Current attribute value string\n * @param entry - Theme entry to stringify, or undefined to clear theme (keeps non-theme tokens)\n * @param options.separator - Token separator (default: space)\n * @returns Attribute value string\n */\nexport function stringifyDataAttribute<Themes extends ThemeMap>(\n\tthemes: Themes,\n\texisting: string | undefined,\n\tentry: ThemeEntry<Themes> | undefined,\n\toptions?: { separator?: string | undefined } | undefined\n): string {\n\tconst separator = options?.separator ?? SEPARATOR_SPACE\n\tconst allThemeValues = Object.values(themes).flatMap((v) => {\n\t\tconst resolved = resolveThemeMapValue(v)\n\t\treturn Array.isArray(resolved) ? [...resolved] : [resolved]\n\t})\n\tconst existingTokens = existing?.trim() ? existing.trim().split(separator) : []\n\tconst withoutThemeValues = existingTokens.filter((t) => !allThemeValues.includes(t.trim()))\n\tconst newTokens =\n\t\tentry !== undefined\n\t\t\t? (() => {\n\t\t\t\t\tconst resolved = resolveThemeMapValue(entry.value)\n\t\t\t\t\treturn Array.isArray(resolved) ? [resolved[0]] : [resolved]\n\t\t\t\t})()\n\t\t\t: []\n\treturn [...withoutThemeValues, ...newTokens].filter(Boolean).join(separator)\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,SAAgB,uBACf,QACA,UACA,OACA,SACS;CACT,MAAM,YAAY,SAAS,aAAa;CACxC,MAAM,iBAAiB,OAAO,OAAO,OAAO,CAAC,SAAS,MAAM;EAC3D,MAAM,WAAW,qBAAqB,EAAE;AACxC,SAAO,MAAM,QAAQ,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS;GAC1D;CAEF,MAAM,sBADiB,UAAU,MAAM,GAAG,SAAS,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,EACrC,QAAQ,MAAM,CAAC,eAAe,SAAS,EAAE,MAAM,CAAC,CAAC;CAC3F,MAAM,YACL,UAAU,gBACA;EACP,MAAM,WAAW,qBAAqB,MAAM,MAAM;AAClD,SAAO,MAAM,QAAQ,SAAS,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS;KACxD,GACH,EAAE;AACN,QAAO,CAAC,GAAG,oBAAoB,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,UAAU"}
1
+ {"version":3,"file":"stringify-data-attribute.mjs","names":[],"sources":["../../../src/theme/data-attribute/stringify-data-attribute.ts"],"sourcesContent":["import { resolveThemeMapValue } from '../_utils/resolve-theme-map-value.ts'\nimport type { ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { SEPARATOR_SPACE } from './_constant.ts'\n\n/**\n * Stringifies a ThemeEntry for a data attribute value.\n *\n * Pure function: no DOM access. Removes all theme values from existing, then adds entry's value(s).\n * Aligns with stringifyClassName logic.\n *\n * @param themes - Record mapping theme keys to attribute values (used to identify theme tokens)\n * @param existing - Current attribute value string (accepts null e.g. from getAttribute)\n * @param entry - Theme entry to stringify, or null/undefined to clear theme (keeps non-theme tokens)\n * @param options.separator - Token separator (default: space)\n * @returns Attribute value string\n */\nexport function stringifyDataAttribute<Themes extends ThemeMap>(\n\tthemes: Themes,\n\texisting: string | null | undefined,\n\tentry: ThemeEntry<Themes> | null | undefined,\n\toptions?: { separator?: string | undefined } | undefined\n): string {\n\tconst separator = options?.separator ?? SEPARATOR_SPACE\n\tconst allThemeValues = Object.values(themes).flatMap((v) => {\n\t\tconst resolved = resolveThemeMapValue(v)\n\t\treturn Array.isArray(resolved) ? [...resolved] : [resolved]\n\t})\n\tconst existingTokens = (existing ?? '')?.trim() ? (existing ?? '').trim().split(separator) : []\n\tconst withoutThemeValues = existingTokens.filter((t) => !allThemeValues.includes(t.trim()))\n\tconst newTokens =\n\t\tentry != null\n\t\t\t? (() => {\n\t\t\t\t\tconst resolved = resolveThemeMapValue(entry.value)\n\t\t\t\t\treturn Array.isArray(resolved) ? [resolved[0]] : [resolved]\n\t\t\t\t})()\n\t\t\t: []\n\treturn [...withoutThemeValues, ...newTokens].filter(Boolean).join(separator)\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,SAAgB,uBACf,QACA,UACA,OACA,SACS;CACT,MAAM,YAAY,SAAS,aAAa;CACxC,MAAM,iBAAiB,OAAO,OAAO,OAAO,CAAC,SAAS,MAAM;EAC3D,MAAM,WAAW,qBAAqB,EAAE;AACxC,SAAO,MAAM,QAAQ,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS;GAC1D;CAEF,MAAM,uBADkB,YAAY,KAAK,MAAM,IAAI,YAAY,IAAI,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,EACrD,QAAQ,MAAM,CAAC,eAAe,SAAS,EAAE,MAAM,CAAC,CAAC;CAC3F,MAAM,YACL,SAAS,cACC;EACP,MAAM,WAAW,qBAAqB,MAAM,MAAM;AAClD,SAAO,MAAM,QAAQ,SAAS,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS;KACxD,GACH,EAAE;AACN,QAAO,CAAC,GAAG,oBAAoB,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,UAAU"}
@@ -9,7 +9,7 @@ const require_parse_data_attribute = require('./parse-data-attribute.cjs');
9
9
  * @param themes - Record mapping theme keys to attribute values
10
10
  * @param attributeName - Data attribute name (e.g. `data-theme`)
11
11
  * @param handler - Callback invoked when the attribute changes
12
- * @param options.element - Element to observe (defaults to document.documentElement)
12
+ * @param options.element - Element to observe (accepts null e.g. from refs). Defaults to document.documentElement.
13
13
  * @param options.parse - Custom parser (default: parseDataAttribute with space separator)
14
14
  * @returns Unsubscribe function. Returns a no-op function when element is not available (e.g. SSR).
15
15
  */
@@ -17,10 +17,9 @@ function subscribeDataAttribute(themes, attributeName, handler, options) {
17
17
  const element = options?.element ?? document?.documentElement;
18
18
  if (!element) return () => {};
19
19
  const parse = options?.parse ?? ((t, v) => require_parse_data_attribute.parseDataAttribute(t, v, { separator: require__constant.SEPARATOR_SPACE }));
20
- const observer = require_observe_data_attribute.observeDataAttributes({ [attributeName]: (value) => {
20
+ return require_observe_data_attribute.observeDataAttributes({ [attributeName]: (value) => {
21
21
  handler(parse(themes, value ?? void 0));
22
22
  } }, element);
23
- return () => observer.disconnect();
24
23
  }
25
24
 
26
25
  //#endregion