@just-web/toolkits 1.0.0 → 2.1.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 (421) 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 +1 -1
  18. package/dist/attributes/observe-attribute.cjs.map +1 -1
  19. package/dist/attributes/observe-attribute.d.cts +2 -2
  20. package/dist/attributes/observe-attribute.d.cts.map +1 -1
  21. package/dist/attributes/observe-attribute.d.mts +2 -2
  22. package/dist/attributes/observe-attribute.d.mts.map +1 -1
  23. package/dist/attributes/observe-attribute.mjs +1 -1
  24. package/dist/attributes/observe-attribute.mjs.map +1 -1
  25. package/dist/attributes/observe-data-attribute.cjs +1 -1
  26. package/dist/attributes/observe-data-attribute.cjs.map +1 -1
  27. package/dist/attributes/observe-data-attribute.d.cts +2 -2
  28. package/dist/attributes/observe-data-attribute.d.cts.map +1 -1
  29. package/dist/attributes/observe-data-attribute.d.mts +2 -2
  30. package/dist/attributes/observe-data-attribute.d.mts.map +1 -1
  31. package/dist/attributes/observe-data-attribute.mjs +1 -1
  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 +7 -7
  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 +7 -7
  58. package/dist/react/hooks/use-attribute.mjs.map +1 -1
  59. package/dist/react/hooks/use-theme-by-class-name.cjs +2 -6
  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.cts.map +1 -1
  63. package/dist/react/hooks/use-theme-by-class-name.d.mts +2 -2
  64. package/dist/react/hooks/use-theme-by-class-name.d.mts.map +1 -1
  65. package/dist/react/hooks/use-theme-by-class-name.mjs +2 -6
  66. package/dist/react/hooks/use-theme-by-class-name.mjs.map +1 -1
  67. package/dist/react/hooks/use-theme-by-data-attribute.cjs +2 -7
  68. package/dist/react/hooks/use-theme-by-data-attribute.cjs.map +1 -1
  69. package/dist/react/hooks/use-theme-by-data-attribute.d.cts +2 -2
  70. package/dist/react/hooks/use-theme-by-data-attribute.d.cts.map +1 -1
  71. package/dist/react/hooks/use-theme-by-data-attribute.d.mts +2 -2
  72. package/dist/react/hooks/use-theme-by-data-attribute.d.mts.map +1 -1
  73. package/dist/react/hooks/use-theme-by-data-attribute.mjs +2 -7
  74. package/dist/react/hooks/use-theme-by-data-attribute.mjs.map +1 -1
  75. package/dist/react/hooks/use-theme-by-local-storage.cjs +1 -5
  76. package/dist/react/hooks/use-theme-by-local-storage.cjs.map +1 -1
  77. package/dist/react/hooks/use-theme-by-local-storage.d.cts.map +1 -1
  78. package/dist/react/hooks/use-theme-by-local-storage.d.mts.map +1 -1
  79. package/dist/react/hooks/use-theme-by-local-storage.mjs +1 -5
  80. package/dist/react/hooks/use-theme-by-local-storage.mjs.map +1 -1
  81. package/dist/react/theme/create-theme-hook.cjs.map +1 -1
  82. package/dist/react/theme/create-theme-hook.mjs.map +1 -1
  83. package/dist/theme/_utils/match-attribute-value-to-theme.cjs +29 -0
  84. package/dist/theme/_utils/match-attribute-value-to-theme.cjs.map +1 -0
  85. package/dist/theme/_utils/match-attribute-value-to-theme.mjs +28 -0
  86. package/dist/theme/_utils/match-attribute-value-to-theme.mjs.map +1 -0
  87. package/dist/theme/_utils/parse-stored-theme.cjs +61 -7
  88. package/dist/theme/_utils/parse-stored-theme.cjs.map +1 -1
  89. package/dist/theme/_utils/parse-stored-theme.mjs +61 -7
  90. package/dist/theme/_utils/parse-stored-theme.mjs.map +1 -1
  91. package/dist/theme/_utils/resolve-theme-map-value.cjs +19 -0
  92. package/dist/theme/_utils/resolve-theme-map-value.cjs.map +1 -0
  93. package/dist/theme/_utils/resolve-theme-map-value.mjs +17 -0
  94. package/dist/theme/_utils/resolve-theme-map-value.mjs.map +1 -0
  95. package/dist/theme/_utils/set-theme-to-stores.cjs +1 -1
  96. package/dist/theme/_utils/set-theme-to-stores.cjs.map +1 -1
  97. package/dist/theme/_utils/set-theme-to-stores.mjs +1 -1
  98. package/dist/theme/_utils/set-theme-to-stores.mjs.map +1 -1
  99. package/dist/theme/class-name/parse-class-name.cjs +32 -0
  100. package/dist/theme/class-name/parse-class-name.cjs.map +1 -0
  101. package/dist/theme/class-name/parse-class-name.d.cts +20 -0
  102. package/dist/theme/class-name/parse-class-name.d.cts.map +1 -0
  103. package/dist/theme/class-name/parse-class-name.d.mts +20 -0
  104. package/dist/theme/class-name/parse-class-name.d.mts.map +1 -0
  105. package/dist/theme/class-name/parse-class-name.mjs +31 -0
  106. package/dist/theme/class-name/parse-class-name.mjs.map +1 -0
  107. package/dist/theme/class-name/read-class-name.cjs +20 -0
  108. package/dist/theme/class-name/read-class-name.cjs.map +1 -0
  109. package/dist/theme/class-name/read-class-name.d.cts +20 -0
  110. package/dist/theme/class-name/read-class-name.d.cts.map +1 -0
  111. package/dist/theme/class-name/read-class-name.d.mts +20 -0
  112. package/dist/theme/class-name/read-class-name.d.mts.map +1 -0
  113. package/dist/theme/class-name/read-class-name.mjs +20 -0
  114. package/dist/theme/class-name/read-class-name.mjs.map +1 -0
  115. package/dist/theme/class-name/stringify-class-name.cjs +31 -0
  116. package/dist/theme/class-name/stringify-class-name.cjs.map +1 -0
  117. package/dist/theme/class-name/stringify-class-name.d.cts +21 -0
  118. package/dist/theme/class-name/stringify-class-name.d.cts.map +1 -0
  119. package/dist/theme/class-name/stringify-class-name.d.mts +21 -0
  120. package/dist/theme/class-name/stringify-class-name.d.mts.map +1 -0
  121. package/dist/theme/class-name/stringify-class-name.mjs +31 -0
  122. package/dist/theme/class-name/stringify-class-name.mjs.map +1 -0
  123. package/dist/theme/class-name/subscribe-class-name.cjs +31 -0
  124. package/dist/theme/class-name/subscribe-class-name.cjs.map +1 -0
  125. package/dist/theme/class-name/subscribe-class-name.d.cts +21 -0
  126. package/dist/theme/class-name/subscribe-class-name.d.cts.map +1 -0
  127. package/dist/theme/class-name/subscribe-class-name.d.mts +21 -0
  128. package/dist/theme/class-name/subscribe-class-name.d.mts.map +1 -0
  129. package/dist/theme/class-name/subscribe-class-name.mjs +31 -0
  130. package/dist/theme/class-name/subscribe-class-name.mjs.map +1 -0
  131. package/dist/theme/class-name/write-class-name.cjs +20 -0
  132. package/dist/theme/class-name/write-class-name.cjs.map +1 -0
  133. package/dist/theme/class-name/write-class-name.d.cts +20 -0
  134. package/dist/theme/class-name/write-class-name.d.cts.map +1 -0
  135. package/dist/theme/class-name/write-class-name.d.mts +20 -0
  136. package/dist/theme/class-name/write-class-name.d.mts.map +1 -0
  137. package/dist/theme/class-name/write-class-name.mjs +20 -0
  138. package/dist/theme/class-name/write-class-name.mjs.map +1 -0
  139. package/dist/theme/compose-theme-stores.cjs.map +1 -1
  140. package/dist/theme/compose-theme-stores.mjs.map +1 -1
  141. package/dist/theme/cookie/_cookie-utils.cjs +37 -0
  142. package/dist/theme/cookie/_cookie-utils.cjs.map +1 -0
  143. package/dist/theme/cookie/_cookie-utils.mjs +33 -0
  144. package/dist/theme/cookie/_cookie-utils.mjs.map +1 -0
  145. package/dist/theme/cookie/read-cookie-theme.cjs +22 -0
  146. package/dist/theme/cookie/read-cookie-theme.cjs.map +1 -0
  147. package/dist/theme/cookie/read-cookie-theme.d.cts +22 -0
  148. package/dist/theme/cookie/read-cookie-theme.d.cts.map +1 -0
  149. package/dist/theme/cookie/read-cookie-theme.d.mts +22 -0
  150. package/dist/theme/cookie/read-cookie-theme.d.mts.map +1 -0
  151. package/dist/theme/cookie/read-cookie-theme.mjs +22 -0
  152. package/dist/theme/cookie/read-cookie-theme.mjs.map +1 -0
  153. package/dist/theme/cookie/write-cookie-theme.cjs +29 -0
  154. package/dist/theme/cookie/write-cookie-theme.cjs.map +1 -0
  155. package/dist/theme/cookie/write-cookie-theme.d.cts +24 -0
  156. package/dist/theme/cookie/write-cookie-theme.d.cts.map +1 -0
  157. package/dist/theme/cookie/write-cookie-theme.d.mts +24 -0
  158. package/dist/theme/cookie/write-cookie-theme.d.mts.map +1 -0
  159. package/dist/theme/cookie/write-cookie-theme.mjs +29 -0
  160. package/dist/theme/cookie/write-cookie-theme.mjs.map +1 -0
  161. package/dist/theme/data-attribute/_constant.cjs +7 -0
  162. package/dist/theme/data-attribute/_constant.cjs.map +1 -0
  163. package/dist/theme/data-attribute/_constant.mjs +6 -0
  164. package/dist/theme/data-attribute/_constant.mjs.map +1 -0
  165. package/dist/theme/data-attribute/parse-data-attribute.cjs +24 -0
  166. package/dist/theme/data-attribute/parse-data-attribute.cjs.map +1 -0
  167. package/dist/theme/data-attribute/parse-data-attribute.d.cts +21 -0
  168. package/dist/theme/data-attribute/parse-data-attribute.d.cts.map +1 -0
  169. package/dist/theme/data-attribute/parse-data-attribute.d.mts +21 -0
  170. package/dist/theme/data-attribute/parse-data-attribute.d.mts.map +1 -0
  171. package/dist/theme/data-attribute/parse-data-attribute.mjs +24 -0
  172. package/dist/theme/data-attribute/parse-data-attribute.mjs.map +1 -0
  173. package/dist/theme/data-attribute/read-data-attribute.cjs +23 -0
  174. package/dist/theme/data-attribute/read-data-attribute.cjs.map +1 -0
  175. package/dist/theme/data-attribute/read-data-attribute.d.cts +21 -0
  176. package/dist/theme/data-attribute/read-data-attribute.d.cts.map +1 -0
  177. package/dist/theme/data-attribute/read-data-attribute.d.mts +21 -0
  178. package/dist/theme/data-attribute/read-data-attribute.d.mts.map +1 -0
  179. package/dist/theme/data-attribute/read-data-attribute.mjs +23 -0
  180. package/dist/theme/data-attribute/read-data-attribute.mjs.map +1 -0
  181. package/dist/theme/data-attribute/stringify-data-attribute.cjs +33 -0
  182. package/dist/theme/data-attribute/stringify-data-attribute.cjs.map +1 -0
  183. package/dist/theme/data-attribute/stringify-data-attribute.d.cts +23 -0
  184. package/dist/theme/data-attribute/stringify-data-attribute.d.cts.map +1 -0
  185. package/dist/theme/data-attribute/stringify-data-attribute.d.mts +23 -0
  186. package/dist/theme/data-attribute/stringify-data-attribute.d.mts.map +1 -0
  187. package/dist/theme/data-attribute/stringify-data-attribute.mjs +33 -0
  188. package/dist/theme/data-attribute/stringify-data-attribute.mjs.map +1 -0
  189. package/dist/theme/data-attribute/subscribe-data-attribute.cjs +28 -0
  190. package/dist/theme/data-attribute/subscribe-data-attribute.cjs.map +1 -0
  191. package/dist/theme/data-attribute/subscribe-data-attribute.d.cts +22 -0
  192. package/dist/theme/data-attribute/subscribe-data-attribute.d.cts.map +1 -0
  193. package/dist/theme/data-attribute/subscribe-data-attribute.d.mts +22 -0
  194. package/dist/theme/data-attribute/subscribe-data-attribute.d.mts.map +1 -0
  195. package/dist/theme/data-attribute/subscribe-data-attribute.mjs +28 -0
  196. package/dist/theme/data-attribute/subscribe-data-attribute.mjs.map +1 -0
  197. package/dist/theme/data-attribute/write-data-attribute.cjs +30 -0
  198. package/dist/theme/data-attribute/write-data-attribute.cjs.map +1 -0
  199. package/dist/theme/data-attribute/write-data-attribute.d.cts +21 -0
  200. package/dist/theme/data-attribute/write-data-attribute.d.cts.map +1 -0
  201. package/dist/theme/data-attribute/write-data-attribute.d.mts +21 -0
  202. package/dist/theme/data-attribute/write-data-attribute.d.mts.map +1 -0
  203. package/dist/theme/data-attribute/write-data-attribute.mjs +30 -0
  204. package/dist/theme/data-attribute/write-data-attribute.mjs.map +1 -0
  205. package/dist/theme/local-storage/read-local-storage.cjs +22 -0
  206. package/dist/theme/local-storage/read-local-storage.cjs.map +1 -0
  207. package/dist/theme/local-storage/read-local-storage.d.cts +19 -0
  208. package/dist/theme/local-storage/read-local-storage.d.cts.map +1 -0
  209. package/dist/theme/local-storage/read-local-storage.d.mts +19 -0
  210. package/dist/theme/local-storage/read-local-storage.d.mts.map +1 -0
  211. package/dist/theme/local-storage/read-local-storage.mjs +22 -0
  212. package/dist/theme/local-storage/read-local-storage.mjs.map +1 -0
  213. package/dist/theme/local-storage/write-local-storage.cjs +26 -0
  214. package/dist/theme/local-storage/write-local-storage.cjs.map +1 -0
  215. package/dist/theme/local-storage/write-local-storage.d.cts +23 -0
  216. package/dist/theme/local-storage/write-local-storage.d.cts.map +1 -0
  217. package/dist/theme/local-storage/write-local-storage.d.mts +23 -0
  218. package/dist/theme/local-storage/write-local-storage.d.mts.map +1 -0
  219. package/dist/theme/local-storage/write-local-storage.mjs +26 -0
  220. package/dist/theme/local-storage/write-local-storage.mjs.map +1 -0
  221. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.cjs +20 -0
  222. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.cjs.map +1 -0
  223. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.d.cts +23 -0
  224. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.d.cts.map +1 -0
  225. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.d.mts +23 -0
  226. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.d.mts.map +1 -0
  227. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.mjs +20 -0
  228. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.mjs.map +1 -0
  229. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.cjs +20 -0
  230. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.cjs.map +1 -0
  231. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.d.cts +20 -0
  232. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.d.cts.map +1 -0
  233. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.d.mts +20 -0
  234. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.d.mts.map +1 -0
  235. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.mjs +20 -0
  236. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.mjs.map +1 -0
  237. package/dist/theme/session-storage/read-session-storage.cjs +22 -0
  238. package/dist/theme/session-storage/read-session-storage.cjs.map +1 -0
  239. package/dist/theme/session-storage/read-session-storage.d.cts +19 -0
  240. package/dist/theme/session-storage/read-session-storage.d.cts.map +1 -0
  241. package/dist/theme/session-storage/read-session-storage.d.mts +19 -0
  242. package/dist/theme/session-storage/read-session-storage.d.mts.map +1 -0
  243. package/dist/theme/session-storage/read-session-storage.mjs +22 -0
  244. package/dist/theme/session-storage/read-session-storage.mjs.map +1 -0
  245. package/dist/theme/session-storage/write-session-storage.cjs +26 -0
  246. package/dist/theme/session-storage/write-session-storage.cjs.map +1 -0
  247. package/dist/theme/session-storage/write-session-storage.d.cts +23 -0
  248. package/dist/theme/session-storage/write-session-storage.d.cts.map +1 -0
  249. package/dist/theme/session-storage/write-session-storage.d.mts +23 -0
  250. package/dist/theme/session-storage/write-session-storage.d.mts.map +1 -0
  251. package/dist/theme/session-storage/write-session-storage.mjs +26 -0
  252. package/dist/theme/session-storage/write-session-storage.mjs.map +1 -0
  253. package/dist/theme/theme-entry.types.d.cts +13 -1
  254. package/dist/theme/theme-entry.types.d.cts.map +1 -1
  255. package/dist/theme/theme-entry.types.d.mts +13 -1
  256. package/dist/theme/theme-entry.types.d.mts.map +1 -1
  257. package/dist/theme/theme-map.types.d.cts +11 -3
  258. package/dist/theme/theme-map.types.d.cts.map +1 -1
  259. package/dist/theme/theme-map.types.d.mts +11 -3
  260. package/dist/theme/theme-map.types.d.mts.map +1 -1
  261. package/dist/theme/theme-store/async-theme-store.types.d.cts +1 -1
  262. package/dist/theme/theme-store/async-theme-store.types.d.cts.map +1 -1
  263. package/dist/theme/theme-store/async-theme-store.types.d.mts +1 -1
  264. package/dist/theme/theme-store/async-theme-store.types.d.mts.map +1 -1
  265. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.cjs +22 -19
  266. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.cjs.map +1 -1
  267. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.d.cts +7 -2
  268. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.d.cts.map +1 -1
  269. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.d.mts +7 -2
  270. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.d.mts.map +1 -1
  271. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.mjs +22 -19
  272. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.mjs.map +1 -1
  273. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.cjs +18 -36
  274. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.cjs.map +1 -1
  275. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.d.cts +5 -3
  276. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.d.cts.map +1 -1
  277. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.d.mts +5 -3
  278. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.d.mts.map +1 -1
  279. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.mjs +18 -36
  280. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.mjs.map +1 -1
  281. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.cjs +40 -20
  282. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.cjs.map +1 -1
  283. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.cts +30 -7
  284. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.cts.map +1 -1
  285. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.mts +30 -7
  286. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.mts.map +1 -1
  287. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.mjs +40 -20
  288. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.mjs.map +1 -1
  289. package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.cjs +1 -1
  290. package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.cjs.map +1 -1
  291. package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.d.cts +1 -1
  292. package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.d.mts +1 -1
  293. package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.mjs +1 -1
  294. package/dist/theme/theme-store/in-memory-theme-store/in-memory-theme-store.mjs.map +1 -1
  295. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.cjs +13 -12
  296. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.cjs.map +1 -1
  297. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.cts +8 -2
  298. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.cts.map +1 -1
  299. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.mts +8 -2
  300. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.mts.map +1 -1
  301. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.mjs +13 -12
  302. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.mjs.map +1 -1
  303. package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.cjs +4 -5
  304. package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.cjs.map +1 -1
  305. package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.d.cts.map +1 -1
  306. package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.d.mts.map +1 -1
  307. package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.mjs +4 -5
  308. package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.mjs.map +1 -1
  309. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.cjs +13 -12
  310. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.cjs.map +1 -1
  311. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.d.cts +8 -2
  312. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.d.cts.map +1 -1
  313. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.d.mts +8 -2
  314. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.d.mts.map +1 -1
  315. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.mjs +13 -12
  316. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.mjs.map +1 -1
  317. package/dist/theme/theme-store/theme-store.types.d.cts +1 -1
  318. package/dist/theme/theme-store/theme-store.types.d.cts.map +1 -1
  319. package/dist/theme/theme-store/theme-store.types.d.mts +1 -1
  320. package/dist/theme/theme-store/theme-store.types.d.mts.map +1 -1
  321. package/dist/theme/web-storage/read-web-storage.cjs +20 -0
  322. package/dist/theme/web-storage/read-web-storage.cjs.map +1 -0
  323. package/dist/theme/web-storage/read-web-storage.d.cts +21 -0
  324. package/dist/theme/web-storage/read-web-storage.d.cts.map +1 -0
  325. package/dist/theme/web-storage/read-web-storage.d.mts +21 -0
  326. package/dist/theme/web-storage/read-web-storage.d.mts.map +1 -0
  327. package/dist/theme/web-storage/read-web-storage.mjs +20 -0
  328. package/dist/theme/web-storage/read-web-storage.mjs.map +1 -0
  329. package/dist/theme/web-storage/write-web-storage.cjs +33 -0
  330. package/dist/theme/web-storage/write-web-storage.cjs.map +1 -0
  331. package/dist/theme/web-storage/write-web-storage.d.cts +25 -0
  332. package/dist/theme/web-storage/write-web-storage.d.cts.map +1 -0
  333. package/dist/theme/web-storage/write-web-storage.d.mts +25 -0
  334. package/dist/theme/web-storage/write-web-storage.d.mts.map +1 -0
  335. package/dist/theme/web-storage/write-web-storage.mjs +32 -0
  336. package/dist/theme/web-storage/write-web-storage.mjs.map +1 -0
  337. package/dist/theme.cjs +41 -1
  338. package/dist/theme.d.cts +23 -3
  339. package/dist/theme.d.mts +23 -3
  340. package/dist/theme.mjs +21 -1
  341. package/dist/utils/append-id.cjs +2 -2
  342. package/dist/utils/append-id.cjs.map +1 -1
  343. package/dist/utils/append-id.d.cts +3 -3
  344. package/dist/utils/append-id.d.mts +3 -3
  345. package/dist/utils/append-id.mjs +2 -2
  346. package/dist/utils/append-id.mjs.map +1 -1
  347. package/package.json +1 -1
  348. package/src/attributes/get-attribute.ts +5 -2
  349. package/src/attributes/get-data-attribute.ts +5 -2
  350. package/src/attributes/observe-attribute.ts +2 -2
  351. package/src/attributes/observe-data-attribute.ts +2 -2
  352. package/src/color-scheme/color-scheme.types.ts +7 -0
  353. package/src/color-scheme/get-prefers-color-scheme.ts +6 -4
  354. package/src/color-scheme/observe-prefers-color-scheme.ts +3 -1
  355. package/src/index.ts +1 -0
  356. package/src/react/hooks/use-attribute.ts +11 -11
  357. package/src/react/hooks/use-theme-by-class-name.ts +5 -10
  358. package/src/react/hooks/use-theme-by-data-attribute.ts +5 -12
  359. package/src/react/hooks/use-theme-by-local-storage.ts +3 -9
  360. package/src/react/theme/create-theme-hook.ts +4 -6
  361. package/src/testing/theme/theme-result-card.tsx +1 -0
  362. package/src/theme/_utils/match-attribute-value-to-theme.ts +36 -0
  363. package/src/theme/_utils/parse-stored-theme.ts +51 -11
  364. package/src/theme/_utils/resolve-theme-map-value.ts +15 -0
  365. package/src/theme/_utils/set-theme-to-stores.ts +3 -3
  366. package/src/theme/class-name/parse-class-name.ts +31 -0
  367. package/src/theme/class-name/read-class-name.ts +24 -0
  368. package/src/theme/class-name/stringify-class-name.ts +36 -0
  369. package/src/theme/class-name/subscribe-class-name.ts +39 -0
  370. package/src/theme/class-name/write-class-name.ts +24 -0
  371. package/src/theme/compose-theme-stores.ts +1 -1
  372. package/src/theme/cookie/_cookie-utils.ts +45 -0
  373. package/src/theme/cookie/read-cookie-theme.ts +33 -0
  374. package/src/theme/cookie/write-cookie-theme.ts +48 -0
  375. package/src/theme/data-attribute/_constant.ts +1 -0
  376. package/src/theme/data-attribute/parse-data-attribute.ts +25 -0
  377. package/src/theme/data-attribute/read-data-attribute.ts +29 -0
  378. package/src/theme/data-attribute/stringify-data-attribute.ts +39 -0
  379. package/src/theme/data-attribute/subscribe-data-attribute.ts +39 -0
  380. package/src/theme/data-attribute/write-data-attribute.ts +40 -0
  381. package/src/theme/local-storage/read-local-storage.ts +23 -0
  382. package/src/theme/local-storage/write-local-storage.ts +31 -0
  383. package/src/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.ts +30 -0
  384. package/src/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.ts +24 -0
  385. package/src/theme/session-storage/read-session-storage.ts +23 -0
  386. package/src/theme/session-storage/write-session-storage.ts +31 -0
  387. package/src/theme/theme-entry.types.ts +21 -0
  388. package/src/theme/theme-map.types.ts +9 -2
  389. package/src/theme/theme-store/async-theme-store.types.ts +1 -3
  390. package/src/theme/theme-store/class-name-theme-store/class-name-theme-store.ts +20 -26
  391. package/src/theme/theme-store/cookie-theme-store/cookie-theme-store.ts +18 -63
  392. package/src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.ts +42 -29
  393. package/src/theme/theme-store/in-memory-theme-store/in-memory-theme-store.ts +1 -1
  394. package/src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.ts +17 -20
  395. package/src/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.ts +4 -5
  396. package/src/theme/theme-store/session-storage-theme-store/session-storage-theme-store.ts +17 -20
  397. package/src/theme/theme-store/theme-store.types.ts +1 -3
  398. package/src/theme/web-storage/read-web-storage.ts +22 -0
  399. package/src/theme/web-storage/write-web-storage.ts +46 -0
  400. package/src/theme.ts +20 -0
  401. package/src/utils/append-id.ts +3 -3
  402. package/dist/theme/class-name/apply-theme-to-class-name.cjs +0 -23
  403. package/dist/theme/class-name/apply-theme-to-class-name.cjs.map +0 -1
  404. package/dist/theme/class-name/apply-theme-to-class-name.mjs +0 -22
  405. package/dist/theme/class-name/apply-theme-to-class-name.mjs.map +0 -1
  406. package/dist/theme/class-name/resolve-theme-from-class-name.cjs +0 -23
  407. package/dist/theme/class-name/resolve-theme-from-class-name.cjs.map +0 -1
  408. package/dist/theme/class-name/resolve-theme-from-class-name.mjs +0 -22
  409. package/dist/theme/class-name/resolve-theme-from-class-name.mjs.map +0 -1
  410. package/dist/theme/data-attribute/apply-theme-to-data-attribute.cjs +0 -23
  411. package/dist/theme/data-attribute/apply-theme-to-data-attribute.cjs.map +0 -1
  412. package/dist/theme/data-attribute/apply-theme-to-data-attribute.mjs +0 -22
  413. package/dist/theme/data-attribute/apply-theme-to-data-attribute.mjs.map +0 -1
  414. package/dist/theme/data-attribute/resolve-theme-from-data-attribute.cjs +0 -23
  415. package/dist/theme/data-attribute/resolve-theme-from-data-attribute.cjs.map +0 -1
  416. package/dist/theme/data-attribute/resolve-theme-from-data-attribute.mjs +0 -22
  417. package/dist/theme/data-attribute/resolve-theme-from-data-attribute.mjs.map +0 -1
  418. package/src/theme/class-name/apply-theme-to-class-name.ts +0 -26
  419. package/src/theme/class-name/resolve-theme-from-class-name.ts +0 -22
  420. package/src/theme/data-attribute/apply-theme-to-data-attribute.ts +0 -27
  421. package/src/theme/data-attribute/resolve-theme-from-data-attribute.ts +0 -23
@@ -0,0 +1,20 @@
1
+ import { ThemeMap } from "../theme-map.types.cjs";
2
+ import { ParseStoredTheme, ThemeEntry } from "../theme-entry.types.cjs";
3
+
4
+ //#region src/theme/class-name/read-class-name.d.ts
5
+
6
+ /**
7
+ * Reads a theme entry from the class attribute on an element.
8
+ *
9
+ * @param themes - Record mapping theme keys to class name(s)
10
+ * @param options.element - Element to read from (accepts null e.g. from refs). Defaults to document.documentElement.
11
+ * @param options.parse - Custom parser (default: parseClassName)
12
+ * @returns ThemeEntry if found, undefined otherwise. Returns undefined when element is not available (e.g. SSR).
13
+ */
14
+ declare function readClassName<Themes extends ThemeMap>(themes: Themes, options?: {
15
+ element?: Element | null | undefined;
16
+ parse?: ParseStoredTheme<Themes> | undefined;
17
+ } | undefined): ThemeEntry<Themes> | undefined;
18
+ //#endregion
19
+ export { readClassName };
20
+ //# sourceMappingURL=read-class-name.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-class-name.d.cts","names":[],"sources":["../../../src/theme/class-name/read-class-name.ts"],"sourcesContent":[],"mappings":";;;;;;;AAYA;;;;;;AAKc,iBALE,aAKF,CAAA,eAL+B,QAK/B,CAAA,CAAA,MAAA,EAJL,MAIK,EAAA,QAAA,EAAA;EAAX,OAAA,CAAA,EAFa,OAEb,GAAA,IAAA,GAAA,SAAA;EAAU,KAAA,CAAA,EAFuC,gBAEvC,CAFwD,MAExD,CAAA,GAAA,SAAA;gBAAV,WAAW"}
@@ -0,0 +1,20 @@
1
+ import { ThemeMap } from "../theme-map.types.mjs";
2
+ import { ParseStoredTheme, ThemeEntry } from "../theme-entry.types.mjs";
3
+
4
+ //#region src/theme/class-name/read-class-name.d.ts
5
+
6
+ /**
7
+ * Reads a theme entry from the class attribute on an element.
8
+ *
9
+ * @param themes - Record mapping theme keys to class name(s)
10
+ * @param options.element - Element to read from (accepts null e.g. from refs). Defaults to document.documentElement.
11
+ * @param options.parse - Custom parser (default: parseClassName)
12
+ * @returns ThemeEntry if found, undefined otherwise. Returns undefined when element is not available (e.g. SSR).
13
+ */
14
+ declare function readClassName<Themes extends ThemeMap>(themes: Themes, options?: {
15
+ element?: Element | null | undefined;
16
+ parse?: ParseStoredTheme<Themes> | undefined;
17
+ } | undefined): ThemeEntry<Themes> | undefined;
18
+ //#endregion
19
+ export { readClassName };
20
+ //# sourceMappingURL=read-class-name.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-class-name.d.mts","names":[],"sources":["../../../src/theme/class-name/read-class-name.ts"],"sourcesContent":[],"mappings":";;;;;;;AAYA;;;;;;AAKc,iBALE,aAKF,CAAA,eAL+B,QAK/B,CAAA,CAAA,MAAA,EAJL,MAIK,EAAA,QAAA,EAAA;EAAX,OAAA,CAAA,EAFa,OAEb,GAAA,IAAA,GAAA,SAAA;EAAU,KAAA,CAAA,EAFuC,gBAEvC,CAFwD,MAExD,CAAA,GAAA,SAAA;gBAAV,WAAW"}
@@ -0,0 +1,20 @@
1
+ import { parseClassName } from "./parse-class-name.mjs";
2
+
3
+ //#region src/theme/class-name/read-class-name.ts
4
+ /**
5
+ * Reads a theme entry from the class attribute on an element.
6
+ *
7
+ * @param themes - Record mapping theme keys to class name(s)
8
+ * @param options.element - Element to read from (accepts null e.g. from refs). Defaults to document.documentElement.
9
+ * @param options.parse - Custom parser (default: parseClassName)
10
+ * @returns ThemeEntry if found, undefined otherwise. Returns undefined when element is not available (e.g. SSR).
11
+ */
12
+ function readClassName(themes, options) {
13
+ const element = options?.element ?? document?.documentElement;
14
+ if (!element) return void 0;
15
+ return (options?.parse ?? parseClassName)(themes, element.className ?? void 0);
16
+ }
17
+
18
+ //#endregion
19
+ export { readClassName };
20
+ //# sourceMappingURL=read-class-name.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-class-name.mjs","names":[],"sources":["../../../src/theme/class-name/read-class-name.ts"],"sourcesContent":["import type { ParseStoredTheme, ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { parseClassName } from './parse-class-name.ts'\n\n/**\n * Reads a theme entry from the class attribute on an element.\n *\n * @param themes - Record mapping theme keys to class name(s)\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: parseClassName)\n * @returns ThemeEntry if found, undefined otherwise. Returns undefined when element is not available (e.g. SSR).\n */\nexport function readClassName<Themes extends ThemeMap>(\n\tthemes: Themes,\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 = options?.parse ?? parseClassName\n\tconst raw = element.className ?? undefined\n\treturn parse(themes, raw)\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,cACf,QACA,SAGiC;CACjC,MAAM,UAAU,SAAS,WAAW,UAAU;AAC9C,KAAI,CAAC,QAAS,QAAO;AAGrB,SAFc,SAAS,SAAS,gBAEnB,QADD,QAAQ,aAAa,OACR"}
@@ -0,0 +1,31 @@
1
+ const require_resolve_theme_map_value = require('../_utils/resolve-theme-map-value.cjs');
2
+
3
+ //#region src/theme/class-name/stringify-class-name.ts
4
+ /**
5
+ * Stringifies a ThemeEntry for a class attribute value.
6
+ *
7
+ * Pure function: no DOM access. Removes all theme classes from existing, then
8
+ * adds entry's class(es). Applies all classes from entry when value is an array
9
+ * (unlike stringifyDataAttribute which uses first only).
10
+ *
11
+ * @param themes - Record mapping theme keys to class names (used to identify theme tokens)
12
+ * @param existing - Current class attribute value string (accepts null)
13
+ * @param entry - Theme entry to stringify, or null/undefined to clear theme (keeps non-theme classes)
14
+ * @returns Class attribute value string
15
+ */
16
+ function stringifyClassName(themes, existing, entry) {
17
+ const allThemeClasses = Object.values(themes).flatMap((v) => {
18
+ const resolved = require_resolve_theme_map_value.resolveThemeMapValue(v);
19
+ return Array.isArray(resolved) ? [...resolved] : [resolved];
20
+ });
21
+ const withoutThemes = ((existing ?? "")?.trim() ? (existing ?? "").trim().split(/\s+/) : []).filter((c) => !allThemeClasses.includes(c));
22
+ const activeClasses = entry != null ? (() => {
23
+ const resolved = require_resolve_theme_map_value.resolveThemeMapValue(entry.value);
24
+ return Array.isArray(resolved) ? [...resolved] : [resolved];
25
+ })() : [];
26
+ return [...withoutThemes, ...activeClasses].filter(Boolean).join(" ");
27
+ }
28
+
29
+ //#endregion
30
+ exports.stringifyClassName = stringifyClassName;
31
+ //# sourceMappingURL=stringify-class-name.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify-class-name.cjs","names":["resolveThemeMapValue"],"sources":["../../../src/theme/class-name/stringify-class-name.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'\n\n/**\n * Stringifies a ThemeEntry for a class attribute value.\n *\n * Pure function: no DOM access. Removes all theme classes from existing, then\n * adds entry's class(es). Applies all classes from entry when value is an array\n * (unlike stringifyDataAttribute which uses first only).\n *\n * @param themes - Record mapping theme keys to class names (used to identify theme tokens)\n * @param existing - Current class attribute value string (accepts null)\n * @param entry - Theme entry to stringify, or null/undefined to clear theme (keeps non-theme classes)\n * @returns Class attribute value string\n */\nexport function stringifyClassName<Themes extends ThemeMap>(\n\tthemes: Themes,\n\texisting: string | null | undefined,\n\tentry: ThemeEntry<Themes> | null | undefined\n): string {\n\tconst allThemeClasses = Object.values(themes).flatMap((v) => {\n\t\tconst resolved = resolveThemeMapValue(v)\n\t\treturn Array.isArray(resolved) ? [...resolved] : [resolved]\n\t})\n\tconst existingClasses = (existing ?? '')?.trim() ? (existing ?? '').trim().split(/\\s+/) : []\n\tconst withoutThemes = existingClasses.filter((c) => !allThemeClasses.includes(c))\n\tconst activeClasses =\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] : [resolved]\n\t\t\t\t})()\n\t\t\t: []\n\treturn [...withoutThemes, ...activeClasses].filter(Boolean).join(' ')\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,SAAgB,mBACf,QACA,UACA,OACS;CACT,MAAM,kBAAkB,OAAO,OAAO,OAAO,CAAC,SAAS,MAAM;EAC5D,MAAM,WAAWA,qDAAqB,EAAE;AACxC,SAAO,MAAM,QAAQ,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS;GAC1D;CAEF,MAAM,kBADmB,YAAY,KAAK,MAAM,IAAI,YAAY,IAAI,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,EACtD,QAAQ,MAAM,CAAC,gBAAgB,SAAS,EAAE,CAAC;CACjF,MAAM,gBACL,SAAS,cACC;EACP,MAAM,WAAWA,qDAAqB,MAAM,MAAM;AAClD,SAAO,MAAM,QAAQ,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS;KACxD,GACH,EAAE;AACN,QAAO,CAAC,GAAG,eAAe,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI"}
@@ -0,0 +1,21 @@
1
+ import { ThemeMap } from "../theme-map.types.cjs";
2
+ import { ThemeEntry } from "../theme-entry.types.cjs";
3
+
4
+ //#region src/theme/class-name/stringify-class-name.d.ts
5
+
6
+ /**
7
+ * Stringifies a ThemeEntry for a class attribute value.
8
+ *
9
+ * Pure function: no DOM access. Removes all theme classes from existing, then
10
+ * adds entry's class(es). Applies all classes from entry when value is an array
11
+ * (unlike stringifyDataAttribute which uses first only).
12
+ *
13
+ * @param themes - Record mapping theme keys to class names (used to identify theme tokens)
14
+ * @param existing - Current class attribute value string (accepts null)
15
+ * @param entry - Theme entry to stringify, or null/undefined to clear theme (keeps non-theme classes)
16
+ * @returns Class attribute value string
17
+ */
18
+ declare function stringifyClassName<Themes extends ThemeMap>(themes: Themes, existing: string | null | undefined, entry: ThemeEntry<Themes> | null | undefined): string;
19
+ //#endregion
20
+ export { stringifyClassName };
21
+ //# sourceMappingURL=stringify-class-name.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify-class-name.d.cts","names":[],"sources":["../../../src/theme/class-name/stringify-class-name.ts"],"sourcesContent":[],"mappings":";;;;;;;AAgBA;;;;;;;;;;iBAAgB,kCAAkC,kBACzC,oDAED,WAAW"}
@@ -0,0 +1,21 @@
1
+ import { ThemeMap } from "../theme-map.types.mjs";
2
+ import { ThemeEntry } from "../theme-entry.types.mjs";
3
+
4
+ //#region src/theme/class-name/stringify-class-name.d.ts
5
+
6
+ /**
7
+ * Stringifies a ThemeEntry for a class attribute value.
8
+ *
9
+ * Pure function: no DOM access. Removes all theme classes from existing, then
10
+ * adds entry's class(es). Applies all classes from entry when value is an array
11
+ * (unlike stringifyDataAttribute which uses first only).
12
+ *
13
+ * @param themes - Record mapping theme keys to class names (used to identify theme tokens)
14
+ * @param existing - Current class attribute value string (accepts null)
15
+ * @param entry - Theme entry to stringify, or null/undefined to clear theme (keeps non-theme classes)
16
+ * @returns Class attribute value string
17
+ */
18
+ declare function stringifyClassName<Themes extends ThemeMap>(themes: Themes, existing: string | null | undefined, entry: ThemeEntry<Themes> | null | undefined): string;
19
+ //#endregion
20
+ export { stringifyClassName };
21
+ //# sourceMappingURL=stringify-class-name.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify-class-name.d.mts","names":[],"sources":["../../../src/theme/class-name/stringify-class-name.ts"],"sourcesContent":[],"mappings":";;;;;;;AAgBA;;;;;;;;;;iBAAgB,kCAAkC,kBACzC,oDAED,WAAW"}
@@ -0,0 +1,31 @@
1
+ import { resolveThemeMapValue } from "../_utils/resolve-theme-map-value.mjs";
2
+
3
+ //#region src/theme/class-name/stringify-class-name.ts
4
+ /**
5
+ * Stringifies a ThemeEntry for a class attribute value.
6
+ *
7
+ * Pure function: no DOM access. Removes all theme classes from existing, then
8
+ * adds entry's class(es). Applies all classes from entry when value is an array
9
+ * (unlike stringifyDataAttribute which uses first only).
10
+ *
11
+ * @param themes - Record mapping theme keys to class names (used to identify theme tokens)
12
+ * @param existing - Current class attribute value string (accepts null)
13
+ * @param entry - Theme entry to stringify, or null/undefined to clear theme (keeps non-theme classes)
14
+ * @returns Class attribute value string
15
+ */
16
+ function stringifyClassName(themes, existing, entry) {
17
+ const allThemeClasses = Object.values(themes).flatMap((v) => {
18
+ const resolved = resolveThemeMapValue(v);
19
+ return Array.isArray(resolved) ? [...resolved] : [resolved];
20
+ });
21
+ const withoutThemes = ((existing ?? "")?.trim() ? (existing ?? "").trim().split(/\s+/) : []).filter((c) => !allThemeClasses.includes(c));
22
+ const activeClasses = entry != null ? (() => {
23
+ const resolved = resolveThemeMapValue(entry.value);
24
+ return Array.isArray(resolved) ? [...resolved] : [resolved];
25
+ })() : [];
26
+ return [...withoutThemes, ...activeClasses].filter(Boolean).join(" ");
27
+ }
28
+
29
+ //#endregion
30
+ export { stringifyClassName };
31
+ //# sourceMappingURL=stringify-class-name.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify-class-name.mjs","names":[],"sources":["../../../src/theme/class-name/stringify-class-name.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'\n\n/**\n * Stringifies a ThemeEntry for a class attribute value.\n *\n * Pure function: no DOM access. Removes all theme classes from existing, then\n * adds entry's class(es). Applies all classes from entry when value is an array\n * (unlike stringifyDataAttribute which uses first only).\n *\n * @param themes - Record mapping theme keys to class names (used to identify theme tokens)\n * @param existing - Current class attribute value string (accepts null)\n * @param entry - Theme entry to stringify, or null/undefined to clear theme (keeps non-theme classes)\n * @returns Class attribute value string\n */\nexport function stringifyClassName<Themes extends ThemeMap>(\n\tthemes: Themes,\n\texisting: string | null | undefined,\n\tentry: ThemeEntry<Themes> | null | undefined\n): string {\n\tconst allThemeClasses = Object.values(themes).flatMap((v) => {\n\t\tconst resolved = resolveThemeMapValue(v)\n\t\treturn Array.isArray(resolved) ? [...resolved] : [resolved]\n\t})\n\tconst existingClasses = (existing ?? '')?.trim() ? (existing ?? '').trim().split(/\\s+/) : []\n\tconst withoutThemes = existingClasses.filter((c) => !allThemeClasses.includes(c))\n\tconst activeClasses =\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] : [resolved]\n\t\t\t\t})()\n\t\t\t: []\n\treturn [...withoutThemes, ...activeClasses].filter(Boolean).join(' ')\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,SAAgB,mBACf,QACA,UACA,OACS;CACT,MAAM,kBAAkB,OAAO,OAAO,OAAO,CAAC,SAAS,MAAM;EAC5D,MAAM,WAAW,qBAAqB,EAAE;AACxC,SAAO,MAAM,QAAQ,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS;GAC1D;CAEF,MAAM,kBADmB,YAAY,KAAK,MAAM,IAAI,YAAY,IAAI,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,EACtD,QAAQ,MAAM,CAAC,gBAAgB,SAAS,EAAE,CAAC;CACjF,MAAM,gBACL,SAAS,cACC;EACP,MAAM,WAAW,qBAAqB,MAAM,MAAM;AAClD,SAAO,MAAM,QAAQ,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS;KACxD,GACH,EAAE;AACN,QAAO,CAAC,GAAG,eAAe,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI"}
@@ -0,0 +1,31 @@
1
+ const require_observe_attribute = require('../../attributes/observe-attribute.cjs');
2
+ const require_parse_class_name = require('./parse-class-name.cjs');
3
+
4
+ //#region src/theme/class-name/subscribe-class-name.ts
5
+ /**
6
+ * Subscribes to changes on the class attribute and invokes the handler with parsed theme entries.
7
+ *
8
+ * @param themes - Record mapping theme keys to class name(s)
9
+ * @param handler - Callback invoked when the class attribute changes
10
+ * @param options.element - Element to observe (accepts null e.g. from refs). Defaults to document.documentElement.
11
+ * @param options.parse - Custom parser (default: parseClassName)
12
+ * @returns Unsubscribe function. Returns a no-op function when element is not available (e.g. SSR).
13
+ */
14
+ function subscribeClassName(themes, handler, options) {
15
+ const element = options?.element ?? document?.documentElement;
16
+ if (!element) return () => {};
17
+ const parse = options?.parse ?? require_parse_class_name.parseClassName;
18
+ let lastEmitted = null;
19
+ const observer = require_observe_attribute.observeAttributes({ class: (value) => {
20
+ const entry = parse(themes, value ?? void 0);
21
+ const key = entry?.theme ?? void 0;
22
+ if (lastEmitted === key) return;
23
+ lastEmitted = key;
24
+ handler(entry);
25
+ } }, element);
26
+ return () => observer.disconnect();
27
+ }
28
+
29
+ //#endregion
30
+ exports.subscribeClassName = subscribeClassName;
31
+ //# sourceMappingURL=subscribe-class-name.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe-class-name.cjs","names":["parseClassName","lastEmitted: keyof Themes | undefined | null","observeAttributes"],"sources":["../../../src/theme/class-name/subscribe-class-name.ts"],"sourcesContent":["import { observeAttributes } from '../../attributes/observe-attribute.ts'\nimport type { ParseStoredTheme, ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { parseClassName } from './parse-class-name.ts'\n\n/**\n * Subscribes to changes on the class attribute and invokes the handler with parsed theme entries.\n *\n * @param themes - Record mapping theme keys to class name(s)\n * @param handler - Callback invoked when the class attribute changes\n * @param options.element - Element to observe (accepts null e.g. from refs). Defaults to document.documentElement.\n * @param options.parse - Custom parser (default: parseClassName)\n * @returns Unsubscribe function. Returns a no-op function when element is not available (e.g. SSR).\n */\nexport function subscribeClassName<Themes extends ThemeMap>(\n\tthemes: Themes,\n\thandler: (entry: ThemeEntry<Themes> | undefined) => void,\n\toptions?:\n\t\t| { element?: Element | null | undefined; parse?: ParseStoredTheme<Themes> | undefined }\n\t\t| undefined\n): () => void {\n\tconst element = options?.element ?? document?.documentElement\n\tif (!element) return () => {}\n\tconst parse = options?.parse ?? parseClassName\n\tlet lastEmitted: keyof Themes | undefined | null = null\n\tconst observer = observeAttributes(\n\t\t{\n\t\t\tclass: (value) => {\n\t\t\t\tconst entry = parse(themes, value ?? undefined)\n\t\t\t\tconst key = entry?.theme ?? undefined\n\t\t\t\tif (lastEmitted === key) return\n\t\t\t\tlastEmitted = key\n\t\t\t\thandler(entry)\n\t\t\t}\n\t\t},\n\t\telement\n\t)\n\treturn () => observer.disconnect()\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,SAAgB,mBACf,QACA,SACA,SAGa;CACb,MAAM,UAAU,SAAS,WAAW,UAAU;AAC9C,KAAI,CAAC,QAAS,cAAa;CAC3B,MAAM,QAAQ,SAAS,SAASA;CAChC,IAAIC,cAA+C;CACnD,MAAM,WAAWC,4CAChB,EACC,QAAQ,UAAU;EACjB,MAAM,QAAQ,MAAM,QAAQ,SAAS,OAAU;EAC/C,MAAM,MAAM,OAAO,SAAS;AAC5B,MAAI,gBAAgB,IAAK;AACzB,gBAAc;AACd,UAAQ,MAAM;IAEf,EACD,QACA;AACD,cAAa,SAAS,YAAY"}
@@ -0,0 +1,21 @@
1
+ import { ThemeMap } from "../theme-map.types.cjs";
2
+ import { ParseStoredTheme, ThemeEntry } from "../theme-entry.types.cjs";
3
+
4
+ //#region src/theme/class-name/subscribe-class-name.d.ts
5
+
6
+ /**
7
+ * Subscribes to changes on the class attribute and invokes the handler with parsed theme entries.
8
+ *
9
+ * @param themes - Record mapping theme keys to class name(s)
10
+ * @param handler - Callback invoked when the class attribute changes
11
+ * @param options.element - Element to observe (accepts null e.g. from refs). Defaults to document.documentElement.
12
+ * @param options.parse - Custom parser (default: parseClassName)
13
+ * @returns Unsubscribe function. Returns a no-op function when element is not available (e.g. SSR).
14
+ */
15
+ declare function subscribeClassName<Themes extends ThemeMap>(themes: Themes, handler: (entry: ThemeEntry<Themes> | undefined) => void, options?: {
16
+ element?: Element | null | undefined;
17
+ parse?: ParseStoredTheme<Themes> | undefined;
18
+ } | undefined): () => void;
19
+ //#endregion
20
+ export { subscribeClassName };
21
+ //# sourceMappingURL=subscribe-class-name.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe-class-name.d.cts","names":[],"sources":["../../../src/theme/class-name/subscribe-class-name.ts"],"sourcesContent":[],"mappings":";;;;;;;AAcA;;;;;;;AAIoD,iBAJpC,kBAIoC,CAAA,eAJF,QAIE,CAAA,CAAA,MAAA,EAH3C,MAG2C,EAAA,OAAA,EAAA,CAAA,KAAA,EAFlC,UAEkC,CAFvB,MAEuB,CAAA,GAAA,SAAA,EAAA,GAAA,IAAA,EAAA,QAAA,EAAA;EAAgB,OAAA,CAAA,EAApD,OAAoD,GAAA,IAAA,GAAA,SAAA;UAAhB,iBAAiB"}
@@ -0,0 +1,21 @@
1
+ import { ThemeMap } from "../theme-map.types.mjs";
2
+ import { ParseStoredTheme, ThemeEntry } from "../theme-entry.types.mjs";
3
+
4
+ //#region src/theme/class-name/subscribe-class-name.d.ts
5
+
6
+ /**
7
+ * Subscribes to changes on the class attribute and invokes the handler with parsed theme entries.
8
+ *
9
+ * @param themes - Record mapping theme keys to class name(s)
10
+ * @param handler - Callback invoked when the class attribute changes
11
+ * @param options.element - Element to observe (accepts null e.g. from refs). Defaults to document.documentElement.
12
+ * @param options.parse - Custom parser (default: parseClassName)
13
+ * @returns Unsubscribe function. Returns a no-op function when element is not available (e.g. SSR).
14
+ */
15
+ declare function subscribeClassName<Themes extends ThemeMap>(themes: Themes, handler: (entry: ThemeEntry<Themes> | undefined) => void, options?: {
16
+ element?: Element | null | undefined;
17
+ parse?: ParseStoredTheme<Themes> | undefined;
18
+ } | undefined): () => void;
19
+ //#endregion
20
+ export { subscribeClassName };
21
+ //# sourceMappingURL=subscribe-class-name.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe-class-name.d.mts","names":[],"sources":["../../../src/theme/class-name/subscribe-class-name.ts"],"sourcesContent":[],"mappings":";;;;;;;AAcA;;;;;;;AAIoD,iBAJpC,kBAIoC,CAAA,eAJF,QAIE,CAAA,CAAA,MAAA,EAH3C,MAG2C,EAAA,OAAA,EAAA,CAAA,KAAA,EAFlC,UAEkC,CAFvB,MAEuB,CAAA,GAAA,SAAA,EAAA,GAAA,IAAA,EAAA,QAAA,EAAA;EAAgB,OAAA,CAAA,EAApD,OAAoD,GAAA,IAAA,GAAA,SAAA;UAAhB,iBAAiB"}
@@ -0,0 +1,31 @@
1
+ import { observeAttributes } from "../../attributes/observe-attribute.mjs";
2
+ import { parseClassName } from "./parse-class-name.mjs";
3
+
4
+ //#region src/theme/class-name/subscribe-class-name.ts
5
+ /**
6
+ * Subscribes to changes on the class attribute and invokes the handler with parsed theme entries.
7
+ *
8
+ * @param themes - Record mapping theme keys to class name(s)
9
+ * @param handler - Callback invoked when the class attribute changes
10
+ * @param options.element - Element to observe (accepts null e.g. from refs). Defaults to document.documentElement.
11
+ * @param options.parse - Custom parser (default: parseClassName)
12
+ * @returns Unsubscribe function. Returns a no-op function when element is not available (e.g. SSR).
13
+ */
14
+ function subscribeClassName(themes, handler, options) {
15
+ const element = options?.element ?? document?.documentElement;
16
+ if (!element) return () => {};
17
+ const parse = options?.parse ?? parseClassName;
18
+ let lastEmitted = null;
19
+ const observer = observeAttributes({ class: (value) => {
20
+ const entry = parse(themes, value ?? void 0);
21
+ const key = entry?.theme ?? void 0;
22
+ if (lastEmitted === key) return;
23
+ lastEmitted = key;
24
+ handler(entry);
25
+ } }, element);
26
+ return () => observer.disconnect();
27
+ }
28
+
29
+ //#endregion
30
+ export { subscribeClassName };
31
+ //# sourceMappingURL=subscribe-class-name.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe-class-name.mjs","names":["lastEmitted: keyof Themes | undefined | null"],"sources":["../../../src/theme/class-name/subscribe-class-name.ts"],"sourcesContent":["import { observeAttributes } from '../../attributes/observe-attribute.ts'\nimport type { ParseStoredTheme, ThemeEntry } from '../theme-entry.types.ts'\nimport type { ThemeMap } from '../theme-map.types.ts'\nimport { parseClassName } from './parse-class-name.ts'\n\n/**\n * Subscribes to changes on the class attribute and invokes the handler with parsed theme entries.\n *\n * @param themes - Record mapping theme keys to class name(s)\n * @param handler - Callback invoked when the class attribute changes\n * @param options.element - Element to observe (accepts null e.g. from refs). Defaults to document.documentElement.\n * @param options.parse - Custom parser (default: parseClassName)\n * @returns Unsubscribe function. Returns a no-op function when element is not available (e.g. SSR).\n */\nexport function subscribeClassName<Themes extends ThemeMap>(\n\tthemes: Themes,\n\thandler: (entry: ThemeEntry<Themes> | undefined) => void,\n\toptions?:\n\t\t| { element?: Element | null | undefined; parse?: ParseStoredTheme<Themes> | undefined }\n\t\t| undefined\n): () => void {\n\tconst element = options?.element ?? document?.documentElement\n\tif (!element) return () => {}\n\tconst parse = options?.parse ?? parseClassName\n\tlet lastEmitted: keyof Themes | undefined | null = null\n\tconst observer = observeAttributes(\n\t\t{\n\t\t\tclass: (value) => {\n\t\t\t\tconst entry = parse(themes, value ?? undefined)\n\t\t\t\tconst key = entry?.theme ?? undefined\n\t\t\t\tif (lastEmitted === key) return\n\t\t\t\tlastEmitted = key\n\t\t\t\thandler(entry)\n\t\t\t}\n\t\t},\n\t\telement\n\t)\n\treturn () => observer.disconnect()\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,SAAgB,mBACf,QACA,SACA,SAGa;CACb,MAAM,UAAU,SAAS,WAAW,UAAU;AAC9C,KAAI,CAAC,QAAS,cAAa;CAC3B,MAAM,QAAQ,SAAS,SAAS;CAChC,IAAIA,cAA+C;CACnD,MAAM,WAAW,kBAChB,EACC,QAAQ,UAAU;EACjB,MAAM,QAAQ,MAAM,QAAQ,SAAS,OAAU;EAC/C,MAAM,MAAM,OAAO,SAAS;AAC5B,MAAI,gBAAgB,IAAK;AACzB,gBAAc;AACd,UAAQ,MAAM;IAEf,EACD,QACA;AACD,cAAa,SAAS,YAAY"}
@@ -0,0 +1,20 @@
1
+ const require_stringify_class_name = require('./stringify-class-name.cjs');
2
+
3
+ //#region src/theme/class-name/write-class-name.ts
4
+ /**
5
+ * Writes a theme entry to the class attribute on an element.
6
+ *
7
+ * @param themes - Record mapping theme keys to class name(s)
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
+ * @param options.stringify - Custom serializer (default: stringifyClassName)
11
+ */
12
+ function writeClassName(themes, entry, options) {
13
+ const element = options?.element ?? document?.documentElement;
14
+ if (!element) return;
15
+ element.className = (options?.stringify ?? require_stringify_class_name.stringifyClassName)(themes, element.className ?? void 0, entry);
16
+ }
17
+
18
+ //#endregion
19
+ exports.writeClassName = writeClassName;
20
+ //# sourceMappingURL=write-class-name.cjs.map
@@ -0,0 +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 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"}
@@ -0,0 +1,20 @@
1
+ import { ThemeMap } from "../theme-map.types.cjs";
2
+ import { StringifyStoredTheme, ThemeEntry } from "../theme-entry.types.cjs";
3
+
4
+ //#region src/theme/class-name/write-class-name.d.ts
5
+
6
+ /**
7
+ * Writes a theme entry to the class attribute on an element.
8
+ *
9
+ * @param themes - Record mapping theme keys to class name(s)
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
+ * @param options.stringify - Custom serializer (default: stringifyClassName)
13
+ */
14
+ declare function writeClassName<Themes extends ThemeMap>(themes: Themes, entry: ThemeEntry<Themes> | null | undefined, options?: {
15
+ element?: Element | null | undefined;
16
+ stringify?: StringifyStoredTheme<Themes> | undefined;
17
+ } | undefined): void;
18
+ //#endregion
19
+ export { writeClassName };
20
+ //# sourceMappingURL=write-class-name.d.cts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,20 @@
1
+ import { ThemeMap } from "../theme-map.types.mjs";
2
+ import { StringifyStoredTheme, ThemeEntry } from "../theme-entry.types.mjs";
3
+
4
+ //#region src/theme/class-name/write-class-name.d.ts
5
+
6
+ /**
7
+ * Writes a theme entry to the class attribute on an element.
8
+ *
9
+ * @param themes - Record mapping theme keys to class name(s)
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
+ * @param options.stringify - Custom serializer (default: stringifyClassName)
13
+ */
14
+ declare function writeClassName<Themes extends ThemeMap>(themes: Themes, entry: ThemeEntry<Themes> | null | undefined, options?: {
15
+ element?: Element | null | undefined;
16
+ stringify?: StringifyStoredTheme<Themes> | undefined;
17
+ } | undefined): void;
18
+ //#endregion
19
+ export { writeClassName };
20
+ //# sourceMappingURL=write-class-name.d.mts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,20 @@
1
+ import { stringifyClassName } from "./stringify-class-name.mjs";
2
+
3
+ //#region src/theme/class-name/write-class-name.ts
4
+ /**
5
+ * Writes a theme entry to the class attribute on an element.
6
+ *
7
+ * @param themes - Record mapping theme keys to class name(s)
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
+ * @param options.stringify - Custom serializer (default: stringifyClassName)
11
+ */
12
+ function writeClassName(themes, entry, options) {
13
+ const element = options?.element ?? document?.documentElement;
14
+ if (!element) return;
15
+ element.className = (options?.stringify ?? stringifyClassName)(themes, element.className ?? void 0, entry);
16
+ }
17
+
18
+ //#endregion
19
+ export { writeClassName };
20
+ //# sourceMappingURL=write-class-name.mjs.map
@@ -0,0 +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 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"}
@@ -0,0 +1,37 @@
1
+
2
+ //#region src/theme/cookie/_cookie-utils.ts
3
+ /**
4
+ * Internal cookie utilities for theme cookie storage.
5
+ * Cookie Store API has limited support; document.cookie is standard for theme persistence.
6
+ */
7
+ function getCookieValue(name) {
8
+ if (typeof document === "undefined" || !document.cookie) return null;
9
+ const value = document.cookie.match(/* @__PURE__ */ new RegExp(`(?:^|;\\s*)${name}=([^;]*)`))?.[1];
10
+ return value !== void 0 ? decodeURIComponent(value) : null;
11
+ }
12
+ function setCookie(name, value, options) {
13
+ const parts = [`${name}=${encodeURIComponent(value)}`];
14
+ parts.push(`path=${options.path ?? "/"}`);
15
+ if (options.maxAge !== void 0) parts.push(`max-age=${options.maxAge}`);
16
+ if (options.sameSite !== void 0) parts.push(`samesite=${options.sameSite}`);
17
+ if (options.secure) parts.push("secure");
18
+ document.cookie = parts.join("; ");
19
+ }
20
+ function deleteCookie(name, path = "/") {
21
+ document.cookie = `${name}=; path=${path}; max-age=0`;
22
+ }
23
+ /**
24
+ * Parses a cookie value from a raw Cookie header string.
25
+ * Used for SSR when reading from request headers or framework cookie APIs.
26
+ */
27
+ function getCookieFromHeader(cookieHeader, name) {
28
+ const value = cookieHeader.match(/* @__PURE__ */ new RegExp(`(?:^|;\\s*)${name}=([^;]*)`))?.[1];
29
+ return value !== void 0 ? decodeURIComponent(value.trim()) : null;
30
+ }
31
+
32
+ //#endregion
33
+ exports.deleteCookie = deleteCookie;
34
+ exports.getCookieFromHeader = getCookieFromHeader;
35
+ exports.getCookieValue = getCookieValue;
36
+ exports.setCookie = setCookie;
37
+ //# sourceMappingURL=_cookie-utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_cookie-utils.cjs","names":[],"sources":["../../../src/theme/cookie/_cookie-utils.ts"],"sourcesContent":["/**\n * Internal cookie utilities for theme cookie storage.\n * Cookie Store API has limited support; document.cookie is standard for theme persistence.\n */\n\nexport function getCookieValue(name: string): string | null {\n\tif (typeof document === 'undefined' || !document.cookie) return null\n\tconst match = document.cookie.match(new RegExp(`(?:^|;\\\\s*)${name}=([^;]*)`))\n\tconst value = match?.[1]\n\treturn value !== undefined ? decodeURIComponent(value) : null\n}\n\nexport function setCookie(\n\tname: string,\n\tvalue: string,\n\toptions: {\n\t\tpath?: string | undefined\n\t\tmaxAge?: number | undefined\n\t\tsameSite?: 'lax' | 'strict' | 'none' | undefined\n\t\tsecure?: boolean | undefined\n\t}\n) {\n\tconst parts = [`${name}=${encodeURIComponent(value)}`]\n\tparts.push(`path=${options.path ?? '/'}`)\n\tif (options.maxAge !== undefined) parts.push(`max-age=${options.maxAge}`)\n\tif (options.sameSite !== undefined) parts.push(`samesite=${options.sameSite}`)\n\tif (options.secure) parts.push('secure')\n\t// biome-ignore lint/suspicious/noDocumentCookie: Cookie Store API has limited support; document.cookie is standard for theme persistence\n\tdocument.cookie = parts.join('; ')\n}\n\nexport function deleteCookie(name: string, path = '/') {\n\t// biome-ignore lint/suspicious/noDocumentCookie: Cookie Store API has limited support; document.cookie is standard for theme persistence\n\tdocument.cookie = `${name}=; path=${path}; max-age=0`\n}\n\n/**\n * Parses a cookie value from a raw Cookie header string.\n * Used for SSR when reading from request headers or framework cookie APIs.\n */\nexport function getCookieFromHeader(cookieHeader: string, name: string): string | null {\n\tconst match = cookieHeader.match(new RegExp(`(?:^|;\\\\s*)${name}=([^;]*)`))\n\tconst value = match?.[1]\n\treturn value !== undefined ? decodeURIComponent(value.trim()) : null\n}\n"],"mappings":";;;;;;AAKA,SAAgB,eAAe,MAA6B;AAC3D,KAAI,OAAO,aAAa,eAAe,CAAC,SAAS,OAAQ,QAAO;CAEhE,MAAM,QADQ,SAAS,OAAO,sBAAM,IAAI,OAAO,cAAc,KAAK,UAAU,CAAC,GACvD;AACtB,QAAO,UAAU,SAAY,mBAAmB,MAAM,GAAG;;AAG1D,SAAgB,UACf,MACA,OACA,SAMC;CACD,MAAM,QAAQ,CAAC,GAAG,KAAK,GAAG,mBAAmB,MAAM,GAAG;AACtD,OAAM,KAAK,QAAQ,QAAQ,QAAQ,MAAM;AACzC,KAAI,QAAQ,WAAW,OAAW,OAAM,KAAK,WAAW,QAAQ,SAAS;AACzE,KAAI,QAAQ,aAAa,OAAW,OAAM,KAAK,YAAY,QAAQ,WAAW;AAC9E,KAAI,QAAQ,OAAQ,OAAM,KAAK,SAAS;AAExC,UAAS,SAAS,MAAM,KAAK,KAAK;;AAGnC,SAAgB,aAAa,MAAc,OAAO,KAAK;AAEtD,UAAS,SAAS,GAAG,KAAK,UAAU,KAAK;;;;;;AAO1C,SAAgB,oBAAoB,cAAsB,MAA6B;CAEtF,MAAM,QADQ,aAAa,sBAAM,IAAI,OAAO,cAAc,KAAK,UAAU,CAAC,GACpD;AACtB,QAAO,UAAU,SAAY,mBAAmB,MAAM,MAAM,CAAC,GAAG"}
@@ -0,0 +1,33 @@
1
+ //#region src/theme/cookie/_cookie-utils.ts
2
+ /**
3
+ * Internal cookie utilities for theme cookie storage.
4
+ * Cookie Store API has limited support; document.cookie is standard for theme persistence.
5
+ */
6
+ function getCookieValue(name) {
7
+ if (typeof document === "undefined" || !document.cookie) return null;
8
+ const value = document.cookie.match(/* @__PURE__ */ new RegExp(`(?:^|;\\s*)${name}=([^;]*)`))?.[1];
9
+ return value !== void 0 ? decodeURIComponent(value) : null;
10
+ }
11
+ function setCookie(name, value, options) {
12
+ const parts = [`${name}=${encodeURIComponent(value)}`];
13
+ parts.push(`path=${options.path ?? "/"}`);
14
+ if (options.maxAge !== void 0) parts.push(`max-age=${options.maxAge}`);
15
+ if (options.sameSite !== void 0) parts.push(`samesite=${options.sameSite}`);
16
+ if (options.secure) parts.push("secure");
17
+ document.cookie = parts.join("; ");
18
+ }
19
+ function deleteCookie(name, path = "/") {
20
+ document.cookie = `${name}=; path=${path}; max-age=0`;
21
+ }
22
+ /**
23
+ * Parses a cookie value from a raw Cookie header string.
24
+ * Used for SSR when reading from request headers or framework cookie APIs.
25
+ */
26
+ function getCookieFromHeader(cookieHeader, name) {
27
+ const value = cookieHeader.match(/* @__PURE__ */ new RegExp(`(?:^|;\\s*)${name}=([^;]*)`))?.[1];
28
+ return value !== void 0 ? decodeURIComponent(value.trim()) : null;
29
+ }
30
+
31
+ //#endregion
32
+ export { deleteCookie, getCookieFromHeader, getCookieValue, setCookie };
33
+ //# sourceMappingURL=_cookie-utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_cookie-utils.mjs","names":[],"sources":["../../../src/theme/cookie/_cookie-utils.ts"],"sourcesContent":["/**\n * Internal cookie utilities for theme cookie storage.\n * Cookie Store API has limited support; document.cookie is standard for theme persistence.\n */\n\nexport function getCookieValue(name: string): string | null {\n\tif (typeof document === 'undefined' || !document.cookie) return null\n\tconst match = document.cookie.match(new RegExp(`(?:^|;\\\\s*)${name}=([^;]*)`))\n\tconst value = match?.[1]\n\treturn value !== undefined ? decodeURIComponent(value) : null\n}\n\nexport function setCookie(\n\tname: string,\n\tvalue: string,\n\toptions: {\n\t\tpath?: string | undefined\n\t\tmaxAge?: number | undefined\n\t\tsameSite?: 'lax' | 'strict' | 'none' | undefined\n\t\tsecure?: boolean | undefined\n\t}\n) {\n\tconst parts = [`${name}=${encodeURIComponent(value)}`]\n\tparts.push(`path=${options.path ?? '/'}`)\n\tif (options.maxAge !== undefined) parts.push(`max-age=${options.maxAge}`)\n\tif (options.sameSite !== undefined) parts.push(`samesite=${options.sameSite}`)\n\tif (options.secure) parts.push('secure')\n\t// biome-ignore lint/suspicious/noDocumentCookie: Cookie Store API has limited support; document.cookie is standard for theme persistence\n\tdocument.cookie = parts.join('; ')\n}\n\nexport function deleteCookie(name: string, path = '/') {\n\t// biome-ignore lint/suspicious/noDocumentCookie: Cookie Store API has limited support; document.cookie is standard for theme persistence\n\tdocument.cookie = `${name}=; path=${path}; max-age=0`\n}\n\n/**\n * Parses a cookie value from a raw Cookie header string.\n * Used for SSR when reading from request headers or framework cookie APIs.\n */\nexport function getCookieFromHeader(cookieHeader: string, name: string): string | null {\n\tconst match = cookieHeader.match(new RegExp(`(?:^|;\\\\s*)${name}=([^;]*)`))\n\tconst value = match?.[1]\n\treturn value !== undefined ? decodeURIComponent(value.trim()) : null\n}\n"],"mappings":";;;;;AAKA,SAAgB,eAAe,MAA6B;AAC3D,KAAI,OAAO,aAAa,eAAe,CAAC,SAAS,OAAQ,QAAO;CAEhE,MAAM,QADQ,SAAS,OAAO,sBAAM,IAAI,OAAO,cAAc,KAAK,UAAU,CAAC,GACvD;AACtB,QAAO,UAAU,SAAY,mBAAmB,MAAM,GAAG;;AAG1D,SAAgB,UACf,MACA,OACA,SAMC;CACD,MAAM,QAAQ,CAAC,GAAG,KAAK,GAAG,mBAAmB,MAAM,GAAG;AACtD,OAAM,KAAK,QAAQ,QAAQ,QAAQ,MAAM;AACzC,KAAI,QAAQ,WAAW,OAAW,OAAM,KAAK,WAAW,QAAQ,SAAS;AACzE,KAAI,QAAQ,aAAa,OAAW,OAAM,KAAK,YAAY,QAAQ,WAAW;AAC9E,KAAI,QAAQ,OAAQ,OAAM,KAAK,SAAS;AAExC,UAAS,SAAS,MAAM,KAAK,KAAK;;AAGnC,SAAgB,aAAa,MAAc,OAAO,KAAK;AAEtD,UAAS,SAAS,GAAG,KAAK,UAAU,KAAK;;;;;;AAO1C,SAAgB,oBAAoB,cAAsB,MAA6B;CAEtF,MAAM,QADQ,aAAa,sBAAM,IAAI,OAAO,cAAc,KAAK,UAAU,CAAC,GACpD;AACtB,QAAO,UAAU,SAAY,mBAAmB,MAAM,MAAM,CAAC,GAAG"}