@just-web/toolkits 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/dist/react/hooks/use-theme-by-class-name.cjs +1 -5
  2. package/dist/react/hooks/use-theme-by-class-name.cjs.map +1 -1
  3. package/dist/react/hooks/use-theme-by-class-name.d.cts.map +1 -1
  4. package/dist/react/hooks/use-theme-by-class-name.d.mts.map +1 -1
  5. package/dist/react/hooks/use-theme-by-class-name.mjs +1 -5
  6. package/dist/react/hooks/use-theme-by-class-name.mjs.map +1 -1
  7. package/dist/react/hooks/use-theme-by-data-attribute.cjs +1 -6
  8. package/dist/react/hooks/use-theme-by-data-attribute.cjs.map +1 -1
  9. package/dist/react/hooks/use-theme-by-data-attribute.d.cts.map +1 -1
  10. package/dist/react/hooks/use-theme-by-data-attribute.d.mts.map +1 -1
  11. package/dist/react/hooks/use-theme-by-data-attribute.mjs +1 -6
  12. package/dist/react/hooks/use-theme-by-data-attribute.mjs.map +1 -1
  13. package/dist/react/hooks/use-theme-by-local-storage.cjs +1 -5
  14. package/dist/react/hooks/use-theme-by-local-storage.cjs.map +1 -1
  15. package/dist/react/hooks/use-theme-by-local-storage.d.cts.map +1 -1
  16. package/dist/react/hooks/use-theme-by-local-storage.d.mts.map +1 -1
  17. package/dist/react/hooks/use-theme-by-local-storage.mjs +1 -5
  18. package/dist/react/hooks/use-theme-by-local-storage.mjs.map +1 -1
  19. package/dist/theme/_utils/match-attribute-value-to-theme.cjs +29 -0
  20. package/dist/theme/_utils/match-attribute-value-to-theme.cjs.map +1 -0
  21. package/dist/theme/_utils/match-attribute-value-to-theme.mjs +28 -0
  22. package/dist/theme/_utils/match-attribute-value-to-theme.mjs.map +1 -0
  23. package/dist/theme/_utils/parse-stored-theme.cjs +61 -7
  24. package/dist/theme/_utils/parse-stored-theme.cjs.map +1 -1
  25. package/dist/theme/_utils/parse-stored-theme.mjs +61 -7
  26. package/dist/theme/_utils/parse-stored-theme.mjs.map +1 -1
  27. package/dist/theme/_utils/resolve-theme-map-value.cjs +19 -0
  28. package/dist/theme/_utils/resolve-theme-map-value.cjs.map +1 -0
  29. package/dist/theme/_utils/resolve-theme-map-value.mjs +17 -0
  30. package/dist/theme/_utils/resolve-theme-map-value.mjs.map +1 -0
  31. package/dist/theme/class-name/parse-class-name.cjs +32 -0
  32. package/dist/theme/class-name/parse-class-name.cjs.map +1 -0
  33. package/dist/theme/class-name/parse-class-name.d.cts +20 -0
  34. package/dist/theme/class-name/parse-class-name.d.cts.map +1 -0
  35. package/dist/theme/class-name/parse-class-name.d.mts +20 -0
  36. package/dist/theme/class-name/parse-class-name.d.mts.map +1 -0
  37. package/dist/theme/class-name/parse-class-name.mjs +31 -0
  38. package/dist/theme/class-name/parse-class-name.mjs.map +1 -0
  39. package/dist/theme/class-name/read-class-name.cjs +20 -0
  40. package/dist/theme/class-name/read-class-name.cjs.map +1 -0
  41. package/dist/theme/class-name/read-class-name.d.cts +20 -0
  42. package/dist/theme/class-name/read-class-name.d.cts.map +1 -0
  43. package/dist/theme/class-name/read-class-name.d.mts +20 -0
  44. package/dist/theme/class-name/read-class-name.d.mts.map +1 -0
  45. package/dist/theme/class-name/read-class-name.mjs +20 -0
  46. package/dist/theme/class-name/read-class-name.mjs.map +1 -0
  47. package/dist/theme/class-name/stringify-class-name.cjs +31 -0
  48. package/dist/theme/class-name/stringify-class-name.cjs.map +1 -0
  49. package/dist/theme/class-name/stringify-class-name.d.cts +21 -0
  50. package/dist/theme/class-name/stringify-class-name.d.cts.map +1 -0
  51. package/dist/theme/class-name/stringify-class-name.d.mts +21 -0
  52. package/dist/theme/class-name/stringify-class-name.d.mts.map +1 -0
  53. package/dist/theme/class-name/stringify-class-name.mjs +31 -0
  54. package/dist/theme/class-name/stringify-class-name.mjs.map +1 -0
  55. package/dist/theme/class-name/subscribe-class-name.cjs +31 -0
  56. package/dist/theme/class-name/subscribe-class-name.cjs.map +1 -0
  57. package/dist/theme/class-name/subscribe-class-name.d.cts +21 -0
  58. package/dist/theme/class-name/subscribe-class-name.d.cts.map +1 -0
  59. package/dist/theme/class-name/subscribe-class-name.d.mts +21 -0
  60. package/dist/theme/class-name/subscribe-class-name.d.mts.map +1 -0
  61. package/dist/theme/class-name/subscribe-class-name.mjs +31 -0
  62. package/dist/theme/class-name/subscribe-class-name.mjs.map +1 -0
  63. package/dist/theme/class-name/write-class-name.cjs +20 -0
  64. package/dist/theme/class-name/write-class-name.cjs.map +1 -0
  65. package/dist/theme/class-name/write-class-name.d.cts +20 -0
  66. package/dist/theme/class-name/write-class-name.d.cts.map +1 -0
  67. package/dist/theme/class-name/write-class-name.d.mts +20 -0
  68. package/dist/theme/class-name/write-class-name.d.mts.map +1 -0
  69. package/dist/theme/class-name/write-class-name.mjs +20 -0
  70. package/dist/theme/class-name/write-class-name.mjs.map +1 -0
  71. package/dist/theme/cookie/_cookie-utils.cjs +37 -0
  72. package/dist/theme/cookie/_cookie-utils.cjs.map +1 -0
  73. package/dist/theme/cookie/_cookie-utils.mjs +33 -0
  74. package/dist/theme/cookie/_cookie-utils.mjs.map +1 -0
  75. package/dist/theme/cookie/read-cookie-theme.cjs +22 -0
  76. package/dist/theme/cookie/read-cookie-theme.cjs.map +1 -0
  77. package/dist/theme/cookie/read-cookie-theme.d.cts +22 -0
  78. package/dist/theme/cookie/read-cookie-theme.d.cts.map +1 -0
  79. package/dist/theme/cookie/read-cookie-theme.d.mts +22 -0
  80. package/dist/theme/cookie/read-cookie-theme.d.mts.map +1 -0
  81. package/dist/theme/cookie/read-cookie-theme.mjs +22 -0
  82. package/dist/theme/cookie/read-cookie-theme.mjs.map +1 -0
  83. package/dist/theme/cookie/write-cookie-theme.cjs +29 -0
  84. package/dist/theme/cookie/write-cookie-theme.cjs.map +1 -0
  85. package/dist/theme/cookie/write-cookie-theme.d.cts +24 -0
  86. package/dist/theme/cookie/write-cookie-theme.d.cts.map +1 -0
  87. package/dist/theme/cookie/write-cookie-theme.d.mts +24 -0
  88. package/dist/theme/cookie/write-cookie-theme.d.mts.map +1 -0
  89. package/dist/theme/cookie/write-cookie-theme.mjs +29 -0
  90. package/dist/theme/cookie/write-cookie-theme.mjs.map +1 -0
  91. package/dist/theme/data-attribute/_constant.cjs +7 -0
  92. package/dist/theme/data-attribute/_constant.cjs.map +1 -0
  93. package/dist/theme/data-attribute/_constant.mjs +6 -0
  94. package/dist/theme/data-attribute/_constant.mjs.map +1 -0
  95. package/dist/theme/data-attribute/parse-data-attribute.cjs +24 -0
  96. package/dist/theme/data-attribute/parse-data-attribute.cjs.map +1 -0
  97. package/dist/theme/data-attribute/parse-data-attribute.d.cts +21 -0
  98. package/dist/theme/data-attribute/parse-data-attribute.d.cts.map +1 -0
  99. package/dist/theme/data-attribute/parse-data-attribute.d.mts +21 -0
  100. package/dist/theme/data-attribute/parse-data-attribute.d.mts.map +1 -0
  101. package/dist/theme/data-attribute/parse-data-attribute.mjs +24 -0
  102. package/dist/theme/data-attribute/parse-data-attribute.mjs.map +1 -0
  103. package/dist/theme/data-attribute/read-data-attribute.cjs +23 -0
  104. package/dist/theme/data-attribute/read-data-attribute.cjs.map +1 -0
  105. package/dist/theme/data-attribute/read-data-attribute.d.cts +21 -0
  106. package/dist/theme/data-attribute/read-data-attribute.d.cts.map +1 -0
  107. package/dist/theme/data-attribute/read-data-attribute.d.mts +21 -0
  108. package/dist/theme/data-attribute/read-data-attribute.d.mts.map +1 -0
  109. package/dist/theme/data-attribute/read-data-attribute.mjs +23 -0
  110. package/dist/theme/data-attribute/read-data-attribute.mjs.map +1 -0
  111. package/dist/theme/data-attribute/stringify-data-attribute.cjs +33 -0
  112. package/dist/theme/data-attribute/stringify-data-attribute.cjs.map +1 -0
  113. package/dist/theme/data-attribute/stringify-data-attribute.d.cts +23 -0
  114. package/dist/theme/data-attribute/stringify-data-attribute.d.cts.map +1 -0
  115. package/dist/theme/data-attribute/stringify-data-attribute.d.mts +23 -0
  116. package/dist/theme/data-attribute/stringify-data-attribute.d.mts.map +1 -0
  117. package/dist/theme/data-attribute/stringify-data-attribute.mjs +33 -0
  118. package/dist/theme/data-attribute/stringify-data-attribute.mjs.map +1 -0
  119. package/dist/theme/data-attribute/subscribe-data-attribute.cjs +28 -0
  120. package/dist/theme/data-attribute/subscribe-data-attribute.cjs.map +1 -0
  121. package/dist/theme/data-attribute/subscribe-data-attribute.d.cts +22 -0
  122. package/dist/theme/data-attribute/subscribe-data-attribute.d.cts.map +1 -0
  123. package/dist/theme/data-attribute/subscribe-data-attribute.d.mts +22 -0
  124. package/dist/theme/data-attribute/subscribe-data-attribute.d.mts.map +1 -0
  125. package/dist/theme/data-attribute/subscribe-data-attribute.mjs +28 -0
  126. package/dist/theme/data-attribute/subscribe-data-attribute.mjs.map +1 -0
  127. package/dist/theme/data-attribute/write-data-attribute.cjs +30 -0
  128. package/dist/theme/data-attribute/write-data-attribute.cjs.map +1 -0
  129. package/dist/theme/data-attribute/write-data-attribute.d.cts +21 -0
  130. package/dist/theme/data-attribute/write-data-attribute.d.cts.map +1 -0
  131. package/dist/theme/data-attribute/write-data-attribute.d.mts +21 -0
  132. package/dist/theme/data-attribute/write-data-attribute.d.mts.map +1 -0
  133. package/dist/theme/data-attribute/write-data-attribute.mjs +30 -0
  134. package/dist/theme/data-attribute/write-data-attribute.mjs.map +1 -0
  135. package/dist/theme/local-storage/read-local-storage.cjs +22 -0
  136. package/dist/theme/local-storage/read-local-storage.cjs.map +1 -0
  137. package/dist/theme/local-storage/read-local-storage.d.cts +19 -0
  138. package/dist/theme/local-storage/read-local-storage.d.cts.map +1 -0
  139. package/dist/theme/local-storage/read-local-storage.d.mts +19 -0
  140. package/dist/theme/local-storage/read-local-storage.d.mts.map +1 -0
  141. package/dist/theme/local-storage/read-local-storage.mjs +22 -0
  142. package/dist/theme/local-storage/read-local-storage.mjs.map +1 -0
  143. package/dist/theme/local-storage/write-local-storage.cjs +26 -0
  144. package/dist/theme/local-storage/write-local-storage.cjs.map +1 -0
  145. package/dist/theme/local-storage/write-local-storage.d.cts +23 -0
  146. package/dist/theme/local-storage/write-local-storage.d.cts.map +1 -0
  147. package/dist/theme/local-storage/write-local-storage.d.mts +23 -0
  148. package/dist/theme/local-storage/write-local-storage.d.mts.map +1 -0
  149. package/dist/theme/local-storage/write-local-storage.mjs +26 -0
  150. package/dist/theme/local-storage/write-local-storage.mjs.map +1 -0
  151. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.cjs +20 -0
  152. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.cjs.map +1 -0
  153. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.d.cts +23 -0
  154. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.d.cts.map +1 -0
  155. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.d.mts +23 -0
  156. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.d.mts.map +1 -0
  157. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.mjs +20 -0
  158. package/dist/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.mjs.map +1 -0
  159. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.cjs +20 -0
  160. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.cjs.map +1 -0
  161. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.d.cts +20 -0
  162. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.d.cts.map +1 -0
  163. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.d.mts +20 -0
  164. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.d.mts.map +1 -0
  165. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.mjs +20 -0
  166. package/dist/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.mjs.map +1 -0
  167. package/dist/theme/session-storage/read-session-storage.cjs +22 -0
  168. package/dist/theme/session-storage/read-session-storage.cjs.map +1 -0
  169. package/dist/theme/session-storage/read-session-storage.d.cts +19 -0
  170. package/dist/theme/session-storage/read-session-storage.d.cts.map +1 -0
  171. package/dist/theme/session-storage/read-session-storage.d.mts +19 -0
  172. package/dist/theme/session-storage/read-session-storage.d.mts.map +1 -0
  173. package/dist/theme/session-storage/read-session-storage.mjs +22 -0
  174. package/dist/theme/session-storage/read-session-storage.mjs.map +1 -0
  175. package/dist/theme/session-storage/write-session-storage.cjs +26 -0
  176. package/dist/theme/session-storage/write-session-storage.cjs.map +1 -0
  177. package/dist/theme/session-storage/write-session-storage.d.cts +23 -0
  178. package/dist/theme/session-storage/write-session-storage.d.cts.map +1 -0
  179. package/dist/theme/session-storage/write-session-storage.d.mts +23 -0
  180. package/dist/theme/session-storage/write-session-storage.d.mts.map +1 -0
  181. package/dist/theme/session-storage/write-session-storage.mjs +26 -0
  182. package/dist/theme/session-storage/write-session-storage.mjs.map +1 -0
  183. package/dist/theme/theme-entry.types.d.cts +11 -1
  184. package/dist/theme/theme-entry.types.d.cts.map +1 -1
  185. package/dist/theme/theme-entry.types.d.mts +11 -1
  186. package/dist/theme/theme-entry.types.d.mts.map +1 -1
  187. package/dist/theme/theme-map.types.d.cts +11 -3
  188. package/dist/theme/theme-map.types.d.cts.map +1 -1
  189. package/dist/theme/theme-map.types.d.mts +11 -3
  190. package/dist/theme/theme-map.types.d.mts.map +1 -1
  191. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.cjs +21 -18
  192. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.cjs.map +1 -1
  193. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.d.cts +5 -0
  194. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.d.cts.map +1 -1
  195. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.d.mts +5 -0
  196. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.d.mts.map +1 -1
  197. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.mjs +21 -18
  198. package/dist/theme/theme-store/class-name-theme-store/class-name-theme-store.mjs.map +1 -1
  199. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.cjs +18 -36
  200. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.cjs.map +1 -1
  201. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.d.cts +5 -3
  202. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.d.cts.map +1 -1
  203. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.d.mts +5 -3
  204. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.d.mts.map +1 -1
  205. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.mjs +18 -36
  206. package/dist/theme/theme-store/cookie-theme-store/cookie-theme-store.mjs.map +1 -1
  207. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.cjs +39 -19
  208. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.cjs.map +1 -1
  209. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.cts +28 -5
  210. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.cts.map +1 -1
  211. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.mts +28 -5
  212. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.mts.map +1 -1
  213. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.mjs +39 -19
  214. package/dist/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.mjs.map +1 -1
  215. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.cjs +13 -12
  216. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.cjs.map +1 -1
  217. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.cts +7 -1
  218. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.cts.map +1 -1
  219. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.mts +7 -1
  220. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.mts.map +1 -1
  221. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.mjs +13 -12
  222. package/dist/theme/theme-store/local-storage-theme-store/local-storage-theme-store.mjs.map +1 -1
  223. package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.cjs +4 -5
  224. package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.cjs.map +1 -1
  225. package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.d.cts.map +1 -1
  226. package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.d.mts.map +1 -1
  227. package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.mjs +4 -5
  228. package/dist/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.mjs.map +1 -1
  229. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.cjs +13 -12
  230. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.cjs.map +1 -1
  231. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.d.cts +7 -1
  232. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.d.cts.map +1 -1
  233. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.d.mts +7 -1
  234. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.d.mts.map +1 -1
  235. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.mjs +13 -12
  236. package/dist/theme/theme-store/session-storage-theme-store/session-storage-theme-store.mjs.map +1 -1
  237. package/dist/theme/web-storage/read-web-storage.cjs +20 -0
  238. package/dist/theme/web-storage/read-web-storage.cjs.map +1 -0
  239. package/dist/theme/web-storage/read-web-storage.d.cts +21 -0
  240. package/dist/theme/web-storage/read-web-storage.d.cts.map +1 -0
  241. package/dist/theme/web-storage/read-web-storage.d.mts +21 -0
  242. package/dist/theme/web-storage/read-web-storage.d.mts.map +1 -0
  243. package/dist/theme/web-storage/read-web-storage.mjs +20 -0
  244. package/dist/theme/web-storage/read-web-storage.mjs.map +1 -0
  245. package/dist/theme/web-storage/write-web-storage.cjs +33 -0
  246. package/dist/theme/web-storage/write-web-storage.cjs.map +1 -0
  247. package/dist/theme/web-storage/write-web-storage.d.cts +25 -0
  248. package/dist/theme/web-storage/write-web-storage.d.cts.map +1 -0
  249. package/dist/theme/web-storage/write-web-storage.d.mts +25 -0
  250. package/dist/theme/web-storage/write-web-storage.d.mts.map +1 -0
  251. package/dist/theme/web-storage/write-web-storage.mjs +32 -0
  252. package/dist/theme/web-storage/write-web-storage.mjs.map +1 -0
  253. package/dist/theme.cjs +41 -1
  254. package/dist/theme.d.cts +23 -3
  255. package/dist/theme.d.mts +23 -3
  256. package/dist/theme.mjs +21 -1
  257. package/package.json +1 -1
  258. package/src/react/hooks/use-theme-by-class-name.ts +3 -8
  259. package/src/react/hooks/use-theme-by-data-attribute.ts +3 -10
  260. package/src/react/hooks/use-theme-by-local-storage.ts +3 -9
  261. package/src/testing/theme/theme-result-card.tsx +1 -0
  262. package/src/theme/_utils/match-attribute-value-to-theme.ts +36 -0
  263. package/src/theme/_utils/parse-stored-theme.ts +52 -12
  264. package/src/theme/_utils/resolve-theme-map-value.ts +15 -0
  265. package/src/theme/class-name/parse-class-name.ts +31 -0
  266. package/src/theme/class-name/read-class-name.ts +24 -0
  267. package/src/theme/class-name/stringify-class-name.ts +36 -0
  268. package/src/theme/class-name/subscribe-class-name.ts +39 -0
  269. package/src/theme/class-name/write-class-name.ts +24 -0
  270. package/src/theme/cookie/_cookie-utils.ts +45 -0
  271. package/src/theme/cookie/read-cookie-theme.ts +33 -0
  272. package/src/theme/cookie/write-cookie-theme.ts +48 -0
  273. package/src/theme/data-attribute/_constant.ts +1 -0
  274. package/src/theme/data-attribute/parse-data-attribute.ts +25 -0
  275. package/src/theme/data-attribute/read-data-attribute.ts +29 -0
  276. package/src/theme/data-attribute/stringify-data-attribute.ts +39 -0
  277. package/src/theme/data-attribute/subscribe-data-attribute.ts +39 -0
  278. package/src/theme/data-attribute/write-data-attribute.ts +40 -0
  279. package/src/theme/local-storage/read-local-storage.ts +23 -0
  280. package/src/theme/local-storage/write-local-storage.ts +31 -0
  281. package/src/theme/prefers-color-scheme-theme/read-prefers-color-scheme-theme.ts +30 -0
  282. package/src/theme/prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.ts +24 -0
  283. package/src/theme/session-storage/read-session-storage.ts +23 -0
  284. package/src/theme/session-storage/write-session-storage.ts +31 -0
  285. package/src/theme/theme-entry.types.ts +19 -0
  286. package/src/theme/theme-map.types.ts +9 -2
  287. package/src/theme/theme-store/class-name-theme-store/class-name-theme-store.ts +19 -25
  288. package/src/theme/theme-store/cookie-theme-store/cookie-theme-store.ts +18 -63
  289. package/src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.ts +41 -28
  290. package/src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.ts +17 -20
  291. package/src/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.ts +4 -5
  292. package/src/theme/theme-store/session-storage-theme-store/session-storage-theme-store.ts +17 -20
  293. package/src/theme/web-storage/read-web-storage.ts +22 -0
  294. package/src/theme/web-storage/write-web-storage.ts +46 -0
  295. package/src/theme.ts +20 -0
  296. package/dist/theme/class-name/apply-theme-to-class-name.cjs +0 -23
  297. package/dist/theme/class-name/apply-theme-to-class-name.cjs.map +0 -1
  298. package/dist/theme/class-name/apply-theme-to-class-name.mjs +0 -22
  299. package/dist/theme/class-name/apply-theme-to-class-name.mjs.map +0 -1
  300. package/dist/theme/class-name/resolve-theme-from-class-name.cjs +0 -23
  301. package/dist/theme/class-name/resolve-theme-from-class-name.cjs.map +0 -1
  302. package/dist/theme/class-name/resolve-theme-from-class-name.mjs +0 -22
  303. package/dist/theme/class-name/resolve-theme-from-class-name.mjs.map +0 -1
  304. package/dist/theme/data-attribute/apply-theme-to-data-attribute.cjs +0 -23
  305. package/dist/theme/data-attribute/apply-theme-to-data-attribute.cjs.map +0 -1
  306. package/dist/theme/data-attribute/apply-theme-to-data-attribute.mjs +0 -22
  307. package/dist/theme/data-attribute/apply-theme-to-data-attribute.mjs.map +0 -1
  308. package/dist/theme/data-attribute/resolve-theme-from-data-attribute.cjs +0 -23
  309. package/dist/theme/data-attribute/resolve-theme-from-data-attribute.cjs.map +0 -1
  310. package/dist/theme/data-attribute/resolve-theme-from-data-attribute.mjs +0 -22
  311. package/dist/theme/data-attribute/resolve-theme-from-data-attribute.mjs.map +0 -1
  312. package/src/theme/class-name/apply-theme-to-class-name.ts +0 -26
  313. package/src/theme/class-name/resolve-theme-from-class-name.ts +0 -22
  314. package/src/theme/data-attribute/apply-theme-to-data-attribute.ts +0 -27
  315. package/src/theme/data-attribute/resolve-theme-from-data-attribute.ts +0 -23
@@ -1,47 +1,67 @@
1
- const require_get_data_attribute = require('../../../attributes/get-data-attribute.cjs');
2
- const require_observe_data_attribute = require('../../../attributes/observe-data-attribute.cjs');
3
- const require_theme_entry = require('../../theme-entry.cjs');
4
- const require_dummy_theme_store = require('../../../testing/theme/dummy-theme-store.cjs');
5
- const require_resolve_theme_from_data_attribute = require('../../data-attribute/resolve-theme-from-data-attribute.cjs');
6
- const require_apply_theme_to_data_attribute = require('../../data-attribute/apply-theme-to-data-attribute.cjs');
1
+ const require__constant = require('../../data-attribute/_constant.cjs');
2
+ const require_parse_data_attribute = require('../../data-attribute/parse-data-attribute.cjs');
3
+ const require_read_data_attribute = require('../../data-attribute/read-data-attribute.cjs');
4
+ const require_stringify_data_attribute = require('../../data-attribute/stringify-data-attribute.cjs');
5
+ const require_subscribe_data_attribute = require('../../data-attribute/subscribe-data-attribute.cjs');
6
+ const require_write_data_attribute = require('../../data-attribute/write-data-attribute.cjs');
7
7
 
8
8
  //#region src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.ts
9
9
  /**
10
10
  * Creates a theme store that reads and writes via a data attribute.
11
11
  *
12
+ * read: parse(themes, getDataAttribute(element, attribute)) → ThemeEntry
13
+ * write: setAttribute(attribute, stringify(themes, getDataAttribute(element, attribute), entry))
14
+ *
15
+ * Supports space-separated attribute values by default. Use `parse` and `stringify` to customize
16
+ * (e.g. comma-separated via curried parseDataAttribute/stringifyDataAttribute).
17
+ *
12
18
  * @param themes - Record mapping theme keys to attribute values
13
19
  * @param options.attributeName - Data attribute name (e.g. `data-theme`)
14
20
  * @param options.element - Element to operate on (defaults to document.documentElement)
21
+ * @param options.parse - Custom parser (default: parseDataAttribute with space separator)
22
+ * @param options.stringify - Custom serializer (default: stringifyDataAttribute with space separator)
15
23
  * @returns ThemeStore
16
24
  *
17
25
  * @example
18
26
  * ```ts
19
27
  * const themes = { current: 'current', grayscale: 'grayscale' }
20
28
  * const store = dataAttributeThemeStore(themes, { attributeName: 'data-theme' })
21
- * store.read() // returns themeResult from data attribute
29
+ * store.read() // returns ThemeEntry from data attribute
22
30
  * store.write(themeEntry(themes, 'grayscale'))
23
- * store.subscribe((themeResult) => {})
31
+ * store.subscribe((entry) => {})
32
+ * ```
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * // Comma-separated
37
+ * const store = dataAttributeThemeStore(themes, {
38
+ * attributeName: 'data-theme',
39
+ * parse: (t, v) => parseDataAttribute(t, v, { separator: ',' }),
40
+ * stringify: (t, x, e) => stringifyDataAttribute(t, x, e, { separator: ',' })
41
+ * })
24
42
  * ```
25
43
  */
26
44
  function dataAttributeThemeStore(themes, options) {
27
45
  const element = options.element ?? document?.documentElement;
28
- const { attributeName } = options;
29
- if (!element) return require_dummy_theme_store.dummyThemeStore;
46
+ const { attributeName, parse = (t, v) => require_parse_data_attribute.parseDataAttribute(t, v, { separator: require__constant.SEPARATOR_SPACE }), stringify = (t, x, e) => require_stringify_data_attribute.stringifyDataAttribute(t, x, e, { separator: require__constant.SEPARATOR_SPACE }) } = options;
30
47
  return {
31
48
  read() {
32
- const theme = require_resolve_theme_from_data_attribute.resolveThemeFromDataAttribute(themes, require_get_data_attribute.getDataAttribute(attributeName, element));
33
- if (theme === void 0) return void 0;
34
- return require_theme_entry.themeEntry(themes, theme);
49
+ return require_read_data_attribute.readDataAttribute(themes, attributeName, {
50
+ element,
51
+ parse
52
+ });
35
53
  },
36
54
  write(entry) {
37
- require_apply_theme_to_data_attribute.applyThemeToDataAttribute(element, attributeName, entry);
55
+ require_write_data_attribute.writeDataAttribute(themes, attributeName, entry, {
56
+ element,
57
+ stringify
58
+ });
38
59
  },
39
60
  subscribe(handler) {
40
- const observer = require_observe_data_attribute.observeDataAttributes({ [attributeName]: (value) => {
41
- const theme = value ? require_resolve_theme_from_data_attribute.resolveThemeFromDataAttribute(themes, value) : void 0;
42
- handler(theme ? require_theme_entry.themeEntry(themes, theme) : void 0);
43
- } }, element);
44
- return () => observer.disconnect();
61
+ return require_subscribe_data_attribute.subscribeDataAttribute(themes, attributeName, handler, {
62
+ element,
63
+ parse
64
+ });
45
65
  }
46
66
  };
47
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"data-attribute-theme-store.cjs","names":["dummyThemeStore","resolveThemeFromDataAttribute","getDataAttribute","themeEntry","observeDataAttributes"],"sources":["../../../../src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.ts"],"sourcesContent":["import type { Required } from 'type-plus'\nimport { getDataAttribute } from '../../../attributes/get-data-attribute.ts'\nimport { observeDataAttributes } from '../../../attributes/observe-data-attribute.ts'\nimport { dummyThemeStore } from '../../../testing/theme/dummy-theme-store.ts'\nimport { applyThemeToDataAttribute } from '../../data-attribute/apply-theme-to-data-attribute.ts'\nimport { resolveThemeFromDataAttribute } from '../../data-attribute/resolve-theme-from-data-attribute.ts'\nimport { themeEntry } from '../../theme-entry.ts'\nimport type { ThemeMap } from '../../theme-map.types.ts'\nimport type { ThemeStore } from '../theme-store.types.ts'\n\n/**\n * Creates a theme store that reads and writes via a data attribute.\n *\n * @param themes - Record mapping theme keys to attribute values\n * @param options.attributeName - Data attribute name (e.g. `data-theme`)\n * @param options.element - Element to operate on (defaults to document.documentElement)\n * @returns ThemeStore\n *\n * @example\n * ```ts\n * const themes = { current: 'current', grayscale: 'grayscale' }\n * const store = dataAttributeThemeStore(themes, { attributeName: 'data-theme' })\n * store.read() // returns themeResult from data attribute\n * store.write(themeEntry(themes, 'grayscale'))\n * store.subscribe((themeResult) => {})\n * ```\n */\nexport function dataAttributeThemeStore<Themes extends ThemeMap>(\n\tthemes: Themes,\n\toptions: { attributeName: `data-${string}`; element?: Element | undefined }\n) {\n\tconst element = options.element ?? document?.documentElement\n\tconst { attributeName } = options\n\n\tif (!element) return dummyThemeStore as Required<ThemeStore<Themes>>\n\n\treturn {\n\t\tread() {\n\t\t\tconst value = getDataAttribute(attributeName, element)\n\t\t\tconst theme = resolveThemeFromDataAttribute(themes, value)\n\t\t\tif (theme === undefined) return undefined\n\t\t\treturn themeEntry(themes, theme)\n\t\t},\n\t\twrite(entry) {\n\t\t\tapplyThemeToDataAttribute(element, attributeName, entry)\n\t\t},\n\t\tsubscribe(handler) {\n\t\t\tconst observer = observeDataAttributes<string, `data-${string}`>(\n\t\t\t\t{\n\t\t\t\t\t[attributeName]: (value) => {\n\t\t\t\t\t\tconst theme = value ? resolveThemeFromDataAttribute(themes, value) : undefined\n\t\t\t\t\t\thandler(theme ? themeEntry(themes, theme) : undefined)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\telement\n\t\t\t)\n\t\t\treturn () => observer.disconnect()\n\t\t}\n\t} satisfies ThemeStore<Themes>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,SAAgB,wBACf,QACA,SACC;CACD,MAAM,UAAU,QAAQ,WAAW,UAAU;CAC7C,MAAM,EAAE,kBAAkB;AAE1B,KAAI,CAAC,QAAS,QAAOA;AAErB,QAAO;EACN,OAAO;GAEN,MAAM,QAAQC,wEAA8B,QAD9BC,4CAAiB,eAAe,QAAQ,CACI;AAC1D,OAAI,UAAU,OAAW,QAAO;AAChC,UAAOC,+BAAW,QAAQ,MAAM;;EAEjC,MAAM,OAAO;AACZ,mEAA0B,SAAS,eAAe,MAAM;;EAEzD,UAAU,SAAS;GAClB,MAAM,WAAWC,qDAChB,GACE,iBAAiB,UAAU;IAC3B,MAAM,QAAQ,QAAQH,wEAA8B,QAAQ,MAAM,GAAG;AACrE,YAAQ,QAAQE,+BAAW,QAAQ,MAAM,GAAG,OAAU;MAEvD,EACD,QACA;AACD,gBAAa,SAAS,YAAY;;EAEnC"}
1
+ {"version":3,"file":"data-attribute-theme-store.cjs","names":["parseDataAttribute","SEPARATOR_SPACE","stringifyDataAttribute","readDataAttribute","subscribeDataAttribute"],"sources":["../../../../src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.ts"],"sourcesContent":["import { SEPARATOR_SPACE } from '../../data-attribute/_constant.ts'\nimport { parseDataAttribute } from '../../data-attribute/parse-data-attribute.ts'\nimport { readDataAttribute } from '../../data-attribute/read-data-attribute.ts'\nimport { stringifyDataAttribute } from '../../data-attribute/stringify-data-attribute.ts'\nimport { subscribeDataAttribute } from '../../data-attribute/subscribe-data-attribute.ts'\nimport { writeDataAttribute } from '../../data-attribute/write-data-attribute.ts'\nimport type { ParseStoredTheme, StringifyStoredTheme } from '../../theme-entry.types.ts'\nimport type { ThemeMap } from '../../theme-map.types.ts'\nimport type { ThemeStore } from '../theme-store.types.ts'\n\n/**\n * Creates a theme store that reads and writes via a data attribute.\n *\n * read: parse(themes, getDataAttribute(element, attribute)) → ThemeEntry\n * write: setAttribute(attribute, stringify(themes, getDataAttribute(element, attribute), entry))\n *\n * Supports space-separated attribute values by default. Use `parse` and `stringify` to customize\n * (e.g. comma-separated via curried parseDataAttribute/stringifyDataAttribute).\n *\n * @param themes - Record mapping theme keys to attribute values\n * @param options.attributeName - Data attribute name (e.g. `data-theme`)\n * @param options.element - Element to operate on (defaults to document.documentElement)\n * @param options.parse - Custom parser (default: parseDataAttribute with space separator)\n * @param options.stringify - Custom serializer (default: stringifyDataAttribute with space separator)\n * @returns ThemeStore\n *\n * @example\n * ```ts\n * const themes = { current: 'current', grayscale: 'grayscale' }\n * const store = dataAttributeThemeStore(themes, { attributeName: 'data-theme' })\n * store.read() // returns ThemeEntry from data attribute\n * store.write(themeEntry(themes, 'grayscale'))\n * store.subscribe((entry) => {})\n * ```\n *\n * @example\n * ```ts\n * // Comma-separated\n * const store = dataAttributeThemeStore(themes, {\n * attributeName: 'data-theme',\n * parse: (t, v) => parseDataAttribute(t, v, { separator: ',' }),\n * stringify: (t, x, e) => stringifyDataAttribute(t, x, e, { separator: ',' })\n * })\n * ```\n */\nexport function dataAttributeThemeStore<Themes extends ThemeMap>(\n\tthemes: Themes,\n\toptions: {\n\t\tattributeName: `data-${string}`\n\t\telement?: Element | undefined\n\t\tparse?: ParseStoredTheme<Themes> | undefined\n\t\tstringify?: StringifyStoredTheme<Themes> | undefined\n\t}\n) {\n\tconst element = options.element ?? document?.documentElement\n\tconst {\n\t\tattributeName,\n\t\tparse = (t, v) => parseDataAttribute(t, v, { separator: SEPARATOR_SPACE }),\n\t\tstringify = (t, x, e) => stringifyDataAttribute(t, x, e, { separator: SEPARATOR_SPACE })\n\t} = options\n\n\treturn {\n\t\tread() {\n\t\t\treturn readDataAttribute(themes, attributeName, { element, parse })\n\t\t},\n\t\twrite(entry) {\n\t\t\twriteDataAttribute(themes, attributeName, entry, { element, stringify })\n\t\t},\n\t\tsubscribe(handler) {\n\t\t\treturn subscribeDataAttribute(themes, attributeName, handler, { element, parse })\n\t\t}\n\t} satisfies ThemeStore<Themes>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,SAAgB,wBACf,QACA,SAMC;CACD,MAAM,UAAU,QAAQ,WAAW,UAAU;CAC7C,MAAM,EACL,eACA,SAAS,GAAG,MAAMA,gDAAmB,GAAG,GAAG,EAAE,WAAWC,mCAAiB,CAAC,EAC1E,aAAa,GAAG,GAAG,MAAMC,wDAAuB,GAAG,GAAG,GAAG,EAAE,WAAWD,mCAAiB,CAAC,KACrF;AAEJ,QAAO;EACN,OAAO;AACN,UAAOE,8CAAkB,QAAQ,eAAe;IAAE;IAAS;IAAO,CAAC;;EAEpE,MAAM,OAAO;AACZ,mDAAmB,QAAQ,eAAe,OAAO;IAAE;IAAS;IAAW,CAAC;;EAEzE,UAAU,SAAS;AAClB,UAAOC,wDAAuB,QAAQ,eAAe,SAAS;IAAE;IAAS;IAAO,CAAC;;EAElF"}
@@ -1,30 +1,53 @@
1
1
  import { ThemeMap } from "../../theme-map.types.cjs";
2
- import { ThemeStore } from "../theme-store.types.cjs";
3
- import { Required } from "type-plus";
2
+ import { ParseStoredTheme, StringifyStoredTheme, ThemeEntry } from "../../theme-entry.types.cjs";
4
3
 
5
4
  //#region src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.ts
6
5
 
7
6
  /**
8
7
  * Creates a theme store that reads and writes via a data attribute.
9
8
  *
9
+ * read: parse(themes, getDataAttribute(element, attribute)) → ThemeEntry
10
+ * write: setAttribute(attribute, stringify(themes, getDataAttribute(element, attribute), entry))
11
+ *
12
+ * Supports space-separated attribute values by default. Use `parse` and `stringify` to customize
13
+ * (e.g. comma-separated via curried parseDataAttribute/stringifyDataAttribute).
14
+ *
10
15
  * @param themes - Record mapping theme keys to attribute values
11
16
  * @param options.attributeName - Data attribute name (e.g. `data-theme`)
12
17
  * @param options.element - Element to operate on (defaults to document.documentElement)
18
+ * @param options.parse - Custom parser (default: parseDataAttribute with space separator)
19
+ * @param options.stringify - Custom serializer (default: stringifyDataAttribute with space separator)
13
20
  * @returns ThemeStore
14
21
  *
15
22
  * @example
16
23
  * ```ts
17
24
  * const themes = { current: 'current', grayscale: 'grayscale' }
18
25
  * const store = dataAttributeThemeStore(themes, { attributeName: 'data-theme' })
19
- * store.read() // returns themeResult from data attribute
26
+ * store.read() // returns ThemeEntry from data attribute
20
27
  * store.write(themeEntry(themes, 'grayscale'))
21
- * store.subscribe((themeResult) => {})
28
+ * store.subscribe((entry) => {})
29
+ * ```
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * // Comma-separated
34
+ * const store = dataAttributeThemeStore(themes, {
35
+ * attributeName: 'data-theme',
36
+ * parse: (t, v) => parseDataAttribute(t, v, { separator: ',' }),
37
+ * stringify: (t, x, e) => stringifyDataAttribute(t, x, e, { separator: ',' })
38
+ * })
22
39
  * ```
23
40
  */
24
41
  declare function dataAttributeThemeStore<Themes extends ThemeMap>(themes: Themes, options: {
25
42
  attributeName: `data-${string}`;
26
43
  element?: Element | undefined;
27
- }): Required<ThemeStore<Themes>>;
44
+ parse?: ParseStoredTheme<Themes> | undefined;
45
+ stringify?: StringifyStoredTheme<Themes> | undefined;
46
+ }): {
47
+ read(): ThemeEntry<Themes> | undefined;
48
+ write(entry: ThemeEntry<Themes> | undefined): void;
49
+ subscribe(handler: (theme: ThemeEntry<Themes> | null | undefined) => void): () => void;
50
+ };
28
51
  //#endregion
29
52
  export { dataAttributeThemeStore };
30
53
  //# sourceMappingURL=data-attribute-theme-store.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-attribute-theme-store.d.cts","names":[],"sources":["../../../../src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA2BA;;;;;;;;;;;;;;;iBAAgB,uCAAuC,kBAC9C;;YAC8C;IAAqB,SAAA,WAAA"}
1
+ {"version":3,"file":"data-attribute-theme-store.d.cts","names":[],"sources":["../../../../src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.ts"],"sourcesContent":[],"mappings":";;;;;;;AA6CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,uCAAuC,kBAC9C;;YAGG;UACF,iBAAiB;cACb,qBAAqB"}
@@ -1,30 +1,53 @@
1
1
  import { ThemeMap } from "../../theme-map.types.mjs";
2
- import { ThemeStore } from "../theme-store.types.mjs";
3
- import { Required } from "type-plus";
2
+ import { ParseStoredTheme, StringifyStoredTheme, ThemeEntry } from "../../theme-entry.types.mjs";
4
3
 
5
4
  //#region src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.d.ts
6
5
 
7
6
  /**
8
7
  * Creates a theme store that reads and writes via a data attribute.
9
8
  *
9
+ * read: parse(themes, getDataAttribute(element, attribute)) → ThemeEntry
10
+ * write: setAttribute(attribute, stringify(themes, getDataAttribute(element, attribute), entry))
11
+ *
12
+ * Supports space-separated attribute values by default. Use `parse` and `stringify` to customize
13
+ * (e.g. comma-separated via curried parseDataAttribute/stringifyDataAttribute).
14
+ *
10
15
  * @param themes - Record mapping theme keys to attribute values
11
16
  * @param options.attributeName - Data attribute name (e.g. `data-theme`)
12
17
  * @param options.element - Element to operate on (defaults to document.documentElement)
18
+ * @param options.parse - Custom parser (default: parseDataAttribute with space separator)
19
+ * @param options.stringify - Custom serializer (default: stringifyDataAttribute with space separator)
13
20
  * @returns ThemeStore
14
21
  *
15
22
  * @example
16
23
  * ```ts
17
24
  * const themes = { current: 'current', grayscale: 'grayscale' }
18
25
  * const store = dataAttributeThemeStore(themes, { attributeName: 'data-theme' })
19
- * store.read() // returns themeResult from data attribute
26
+ * store.read() // returns ThemeEntry from data attribute
20
27
  * store.write(themeEntry(themes, 'grayscale'))
21
- * store.subscribe((themeResult) => {})
28
+ * store.subscribe((entry) => {})
29
+ * ```
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * // Comma-separated
34
+ * const store = dataAttributeThemeStore(themes, {
35
+ * attributeName: 'data-theme',
36
+ * parse: (t, v) => parseDataAttribute(t, v, { separator: ',' }),
37
+ * stringify: (t, x, e) => stringifyDataAttribute(t, x, e, { separator: ',' })
38
+ * })
22
39
  * ```
23
40
  */
24
41
  declare function dataAttributeThemeStore<Themes extends ThemeMap>(themes: Themes, options: {
25
42
  attributeName: `data-${string}`;
26
43
  element?: Element | undefined;
27
- }): Required<ThemeStore<Themes>>;
44
+ parse?: ParseStoredTheme<Themes> | undefined;
45
+ stringify?: StringifyStoredTheme<Themes> | undefined;
46
+ }): {
47
+ read(): ThemeEntry<Themes> | undefined;
48
+ write(entry: ThemeEntry<Themes> | undefined): void;
49
+ subscribe(handler: (theme: ThemeEntry<Themes> | null | undefined) => void): () => void;
50
+ };
28
51
  //#endregion
29
52
  export { dataAttributeThemeStore };
30
53
  //# sourceMappingURL=data-attribute-theme-store.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-attribute-theme-store.d.mts","names":[],"sources":["../../../../src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA2BA;;;;;;;;;;;;;;;iBAAgB,uCAAuC,kBAC9C;;YAC8C;IAAqB,SAAA,WAAA"}
1
+ {"version":3,"file":"data-attribute-theme-store.d.mts","names":[],"sources":["../../../../src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.ts"],"sourcesContent":[],"mappings":";;;;;;;AA6CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,uCAAuC,kBAC9C;;YAGG;UACF,iBAAiB;cACb,qBAAqB"}
@@ -1,47 +1,67 @@
1
- import { getDataAttribute } from "../../../attributes/get-data-attribute.mjs";
2
- import { observeDataAttributes } from "../../../attributes/observe-data-attribute.mjs";
3
- import { themeEntry } from "../../theme-entry.mjs";
4
- import { dummyThemeStore } from "../../../testing/theme/dummy-theme-store.mjs";
5
- import { resolveThemeFromDataAttribute } from "../../data-attribute/resolve-theme-from-data-attribute.mjs";
6
- import { applyThemeToDataAttribute } from "../../data-attribute/apply-theme-to-data-attribute.mjs";
1
+ import { SEPARATOR_SPACE } from "../../data-attribute/_constant.mjs";
2
+ import { parseDataAttribute } from "../../data-attribute/parse-data-attribute.mjs";
3
+ import { readDataAttribute } from "../../data-attribute/read-data-attribute.mjs";
4
+ import { stringifyDataAttribute } from "../../data-attribute/stringify-data-attribute.mjs";
5
+ import { subscribeDataAttribute } from "../../data-attribute/subscribe-data-attribute.mjs";
6
+ import { writeDataAttribute } from "../../data-attribute/write-data-attribute.mjs";
7
7
 
8
8
  //#region src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.ts
9
9
  /**
10
10
  * Creates a theme store that reads and writes via a data attribute.
11
11
  *
12
+ * read: parse(themes, getDataAttribute(element, attribute)) → ThemeEntry
13
+ * write: setAttribute(attribute, stringify(themes, getDataAttribute(element, attribute), entry))
14
+ *
15
+ * Supports space-separated attribute values by default. Use `parse` and `stringify` to customize
16
+ * (e.g. comma-separated via curried parseDataAttribute/stringifyDataAttribute).
17
+ *
12
18
  * @param themes - Record mapping theme keys to attribute values
13
19
  * @param options.attributeName - Data attribute name (e.g. `data-theme`)
14
20
  * @param options.element - Element to operate on (defaults to document.documentElement)
21
+ * @param options.parse - Custom parser (default: parseDataAttribute with space separator)
22
+ * @param options.stringify - Custom serializer (default: stringifyDataAttribute with space separator)
15
23
  * @returns ThemeStore
16
24
  *
17
25
  * @example
18
26
  * ```ts
19
27
  * const themes = { current: 'current', grayscale: 'grayscale' }
20
28
  * const store = dataAttributeThemeStore(themes, { attributeName: 'data-theme' })
21
- * store.read() // returns themeResult from data attribute
29
+ * store.read() // returns ThemeEntry from data attribute
22
30
  * store.write(themeEntry(themes, 'grayscale'))
23
- * store.subscribe((themeResult) => {})
31
+ * store.subscribe((entry) => {})
32
+ * ```
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * // Comma-separated
37
+ * const store = dataAttributeThemeStore(themes, {
38
+ * attributeName: 'data-theme',
39
+ * parse: (t, v) => parseDataAttribute(t, v, { separator: ',' }),
40
+ * stringify: (t, x, e) => stringifyDataAttribute(t, x, e, { separator: ',' })
41
+ * })
24
42
  * ```
25
43
  */
26
44
  function dataAttributeThemeStore(themes, options) {
27
45
  const element = options.element ?? document?.documentElement;
28
- const { attributeName } = options;
29
- if (!element) return dummyThemeStore;
46
+ const { attributeName, parse = (t, v) => parseDataAttribute(t, v, { separator: SEPARATOR_SPACE }), stringify = (t, x, e) => stringifyDataAttribute(t, x, e, { separator: SEPARATOR_SPACE }) } = options;
30
47
  return {
31
48
  read() {
32
- const theme = resolveThemeFromDataAttribute(themes, getDataAttribute(attributeName, element));
33
- if (theme === void 0) return void 0;
34
- return themeEntry(themes, theme);
49
+ return readDataAttribute(themes, attributeName, {
50
+ element,
51
+ parse
52
+ });
35
53
  },
36
54
  write(entry) {
37
- applyThemeToDataAttribute(element, attributeName, entry);
55
+ writeDataAttribute(themes, attributeName, entry, {
56
+ element,
57
+ stringify
58
+ });
38
59
  },
39
60
  subscribe(handler) {
40
- const observer = observeDataAttributes({ [attributeName]: (value) => {
41
- const theme = value ? resolveThemeFromDataAttribute(themes, value) : void 0;
42
- handler(theme ? themeEntry(themes, theme) : void 0);
43
- } }, element);
44
- return () => observer.disconnect();
61
+ return subscribeDataAttribute(themes, attributeName, handler, {
62
+ element,
63
+ parse
64
+ });
45
65
  }
46
66
  };
47
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"data-attribute-theme-store.mjs","names":[],"sources":["../../../../src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.ts"],"sourcesContent":["import type { Required } from 'type-plus'\nimport { getDataAttribute } from '../../../attributes/get-data-attribute.ts'\nimport { observeDataAttributes } from '../../../attributes/observe-data-attribute.ts'\nimport { dummyThemeStore } from '../../../testing/theme/dummy-theme-store.ts'\nimport { applyThemeToDataAttribute } from '../../data-attribute/apply-theme-to-data-attribute.ts'\nimport { resolveThemeFromDataAttribute } from '../../data-attribute/resolve-theme-from-data-attribute.ts'\nimport { themeEntry } from '../../theme-entry.ts'\nimport type { ThemeMap } from '../../theme-map.types.ts'\nimport type { ThemeStore } from '../theme-store.types.ts'\n\n/**\n * Creates a theme store that reads and writes via a data attribute.\n *\n * @param themes - Record mapping theme keys to attribute values\n * @param options.attributeName - Data attribute name (e.g. `data-theme`)\n * @param options.element - Element to operate on (defaults to document.documentElement)\n * @returns ThemeStore\n *\n * @example\n * ```ts\n * const themes = { current: 'current', grayscale: 'grayscale' }\n * const store = dataAttributeThemeStore(themes, { attributeName: 'data-theme' })\n * store.read() // returns themeResult from data attribute\n * store.write(themeEntry(themes, 'grayscale'))\n * store.subscribe((themeResult) => {})\n * ```\n */\nexport function dataAttributeThemeStore<Themes extends ThemeMap>(\n\tthemes: Themes,\n\toptions: { attributeName: `data-${string}`; element?: Element | undefined }\n) {\n\tconst element = options.element ?? document?.documentElement\n\tconst { attributeName } = options\n\n\tif (!element) return dummyThemeStore as Required<ThemeStore<Themes>>\n\n\treturn {\n\t\tread() {\n\t\t\tconst value = getDataAttribute(attributeName, element)\n\t\t\tconst theme = resolveThemeFromDataAttribute(themes, value)\n\t\t\tif (theme === undefined) return undefined\n\t\t\treturn themeEntry(themes, theme)\n\t\t},\n\t\twrite(entry) {\n\t\t\tapplyThemeToDataAttribute(element, attributeName, entry)\n\t\t},\n\t\tsubscribe(handler) {\n\t\t\tconst observer = observeDataAttributes<string, `data-${string}`>(\n\t\t\t\t{\n\t\t\t\t\t[attributeName]: (value) => {\n\t\t\t\t\t\tconst theme = value ? resolveThemeFromDataAttribute(themes, value) : undefined\n\t\t\t\t\t\thandler(theme ? themeEntry(themes, theme) : undefined)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\telement\n\t\t\t)\n\t\t\treturn () => observer.disconnect()\n\t\t}\n\t} satisfies ThemeStore<Themes>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,SAAgB,wBACf,QACA,SACC;CACD,MAAM,UAAU,QAAQ,WAAW,UAAU;CAC7C,MAAM,EAAE,kBAAkB;AAE1B,KAAI,CAAC,QAAS,QAAO;AAErB,QAAO;EACN,OAAO;GAEN,MAAM,QAAQ,8BAA8B,QAD9B,iBAAiB,eAAe,QAAQ,CACI;AAC1D,OAAI,UAAU,OAAW,QAAO;AAChC,UAAO,WAAW,QAAQ,MAAM;;EAEjC,MAAM,OAAO;AACZ,6BAA0B,SAAS,eAAe,MAAM;;EAEzD,UAAU,SAAS;GAClB,MAAM,WAAW,sBAChB,GACE,iBAAiB,UAAU;IAC3B,MAAM,QAAQ,QAAQ,8BAA8B,QAAQ,MAAM,GAAG;AACrE,YAAQ,QAAQ,WAAW,QAAQ,MAAM,GAAG,OAAU;MAEvD,EACD,QACA;AACD,gBAAa,SAAS,YAAY;;EAEnC"}
1
+ {"version":3,"file":"data-attribute-theme-store.mjs","names":[],"sources":["../../../../src/theme/theme-store/data-attribute-theme-store/data-attribute-theme-store.ts"],"sourcesContent":["import { SEPARATOR_SPACE } from '../../data-attribute/_constant.ts'\nimport { parseDataAttribute } from '../../data-attribute/parse-data-attribute.ts'\nimport { readDataAttribute } from '../../data-attribute/read-data-attribute.ts'\nimport { stringifyDataAttribute } from '../../data-attribute/stringify-data-attribute.ts'\nimport { subscribeDataAttribute } from '../../data-attribute/subscribe-data-attribute.ts'\nimport { writeDataAttribute } from '../../data-attribute/write-data-attribute.ts'\nimport type { ParseStoredTheme, StringifyStoredTheme } from '../../theme-entry.types.ts'\nimport type { ThemeMap } from '../../theme-map.types.ts'\nimport type { ThemeStore } from '../theme-store.types.ts'\n\n/**\n * Creates a theme store that reads and writes via a data attribute.\n *\n * read: parse(themes, getDataAttribute(element, attribute)) → ThemeEntry\n * write: setAttribute(attribute, stringify(themes, getDataAttribute(element, attribute), entry))\n *\n * Supports space-separated attribute values by default. Use `parse` and `stringify` to customize\n * (e.g. comma-separated via curried parseDataAttribute/stringifyDataAttribute).\n *\n * @param themes - Record mapping theme keys to attribute values\n * @param options.attributeName - Data attribute name (e.g. `data-theme`)\n * @param options.element - Element to operate on (defaults to document.documentElement)\n * @param options.parse - Custom parser (default: parseDataAttribute with space separator)\n * @param options.stringify - Custom serializer (default: stringifyDataAttribute with space separator)\n * @returns ThemeStore\n *\n * @example\n * ```ts\n * const themes = { current: 'current', grayscale: 'grayscale' }\n * const store = dataAttributeThemeStore(themes, { attributeName: 'data-theme' })\n * store.read() // returns ThemeEntry from data attribute\n * store.write(themeEntry(themes, 'grayscale'))\n * store.subscribe((entry) => {})\n * ```\n *\n * @example\n * ```ts\n * // Comma-separated\n * const store = dataAttributeThemeStore(themes, {\n * attributeName: 'data-theme',\n * parse: (t, v) => parseDataAttribute(t, v, { separator: ',' }),\n * stringify: (t, x, e) => stringifyDataAttribute(t, x, e, { separator: ',' })\n * })\n * ```\n */\nexport function dataAttributeThemeStore<Themes extends ThemeMap>(\n\tthemes: Themes,\n\toptions: {\n\t\tattributeName: `data-${string}`\n\t\telement?: Element | undefined\n\t\tparse?: ParseStoredTheme<Themes> | undefined\n\t\tstringify?: StringifyStoredTheme<Themes> | undefined\n\t}\n) {\n\tconst element = options.element ?? document?.documentElement\n\tconst {\n\t\tattributeName,\n\t\tparse = (t, v) => parseDataAttribute(t, v, { separator: SEPARATOR_SPACE }),\n\t\tstringify = (t, x, e) => stringifyDataAttribute(t, x, e, { separator: SEPARATOR_SPACE })\n\t} = options\n\n\treturn {\n\t\tread() {\n\t\t\treturn readDataAttribute(themes, attributeName, { element, parse })\n\t\t},\n\t\twrite(entry) {\n\t\t\twriteDataAttribute(themes, attributeName, entry, { element, stringify })\n\t\t},\n\t\tsubscribe(handler) {\n\t\t\treturn subscribeDataAttribute(themes, attributeName, handler, { element, parse })\n\t\t}\n\t} satisfies ThemeStore<Themes>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,SAAgB,wBACf,QACA,SAMC;CACD,MAAM,UAAU,QAAQ,WAAW,UAAU;CAC7C,MAAM,EACL,eACA,SAAS,GAAG,MAAM,mBAAmB,GAAG,GAAG,EAAE,WAAW,iBAAiB,CAAC,EAC1E,aAAa,GAAG,GAAG,MAAM,uBAAuB,GAAG,GAAG,GAAG,EAAE,WAAW,iBAAiB,CAAC,KACrF;AAEJ,QAAO;EACN,OAAO;AACN,UAAO,kBAAkB,QAAQ,eAAe;IAAE;IAAS;IAAO,CAAC;;EAEpE,MAAM,OAAO;AACZ,sBAAmB,QAAQ,eAAe,OAAO;IAAE;IAAS;IAAW,CAAC;;EAEzE,UAAU,SAAS;AAClB,UAAO,uBAAuB,QAAQ,eAAe,SAAS;IAAE;IAAS;IAAO,CAAC;;EAElF"}
@@ -1,6 +1,6 @@
1
- const require_theme_entry = require('../../theme-entry.cjs');
2
1
  const require_dummy_theme_store = require('../../../testing/theme/dummy-theme-store.cjs');
3
- const require_parse_stored_theme = require('../../_utils/parse-stored-theme.cjs');
2
+ const require_read_local_storage = require('../../local-storage/read-local-storage.cjs');
3
+ const require_write_local_storage = require('../../local-storage/write-local-storage.cjs');
4
4
 
5
5
  //#region src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.ts
6
6
  /**
@@ -11,6 +11,9 @@ const require_parse_stored_theme = require('../../_utils/parse-stored-theme.cjs'
11
11
  *
12
12
  * @param themes - Record mapping theme keys to values (for validation)
13
13
  * @param options.storageKey - localStorage key
14
+ * @param options.parse - Optional custom parser for stored string (default: parseStoredTheme)
15
+ * @param options.stringify - Optional custom serializer (default: JSON.stringify)
16
+ * @param options.onError - Optional callback invoked when storage write throws
14
17
  * @returns ThemeStore
15
18
  *
16
19
  * @example
@@ -23,14 +26,12 @@ const require_parse_stored_theme = require('../../_utils/parse-stored-theme.cjs'
23
26
  * ```
24
27
  */
25
28
  function localStorageThemeStore(themes, options) {
26
- const { storageKey } = options;
27
- if (typeof window === "undefined" || !window.localStorage) return require_dummy_theme_store.dummyThemeStore;
29
+ const { storageKey, parse, stringify, onError } = options;
30
+ if (!window?.localStorage) return require_dummy_theme_store.dummyThemeStore;
28
31
  const handlers = /* @__PURE__ */ new Set();
29
32
  let lastNotifiedKey = read()?.theme ?? void 0;
30
33
  function read() {
31
- const theme = require_parse_stored_theme.parseStoredTheme(themes, window.localStorage.getItem(storageKey));
32
- if (theme === void 0) return void 0;
33
- return require_theme_entry.themeEntry(themes, theme);
34
+ return require_read_local_storage.readLocalStorage(themes, storageKey, { parse });
34
35
  }
35
36
  function notify() {
36
37
  const result = read();
@@ -42,11 +43,11 @@ function localStorageThemeStore(themes, options) {
42
43
  return {
43
44
  read,
44
45
  write(entry) {
45
- try {
46
- if (entry === void 0) window.localStorage.removeItem(storageKey);
47
- else window.localStorage.setItem(storageKey, JSON.stringify(entry));
48
- notify();
49
- } catch {}
46
+ require_write_local_storage.writeLocalStorage(themes, storageKey, entry, {
47
+ stringify,
48
+ onError
49
+ });
50
+ notify();
50
51
  },
51
52
  subscribe(handler) {
52
53
  handlers.add(handler);
@@ -1 +1 @@
1
- {"version":3,"file":"local-storage-theme-store.cjs","names":["dummyThemeStore","lastNotifiedKey: keyof Themes | undefined","parseStoredTheme","themeEntry"],"sources":["../../../../src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.ts"],"sourcesContent":["import { dummyThemeStore } from '../../../testing/theme/dummy-theme-store.ts'\nimport { parseStoredTheme } from '../../_utils/parse-stored-theme.ts'\nimport { themeEntry } from '../../theme-entry.ts'\nimport type { ThemeEntry } from '../../theme-entry.types.ts'\nimport type { ThemeMap } from '../../theme-map.types.ts'\nimport type { ThemeStore } from '../theme-store.types.ts'\n\n/**\n * Creates a theme store backed by localStorage.\n *\n * Persists across sessions; cross-tab sync via StorageEvent.\n * Same-tab writes trigger manual notify (StorageEvent does not fire for same tab).\n *\n * @param themes - Record mapping theme keys to values (for validation)\n * @param options.storageKey - localStorage key\n * @returns ThemeStore\n *\n * @example\n * ```ts\n * const themes = { current: 'theme-current', grayscale: 'theme-grayscale' }\n * const store = localStorageThemeStore(themes, { storageKey: 'theme' })\n * store.read() // returns themeResult from localStorage\n * store.write(themeEntry(themes, 'grayscale'))\n * store.subscribe((themeResult) => {})\n * ```\n */\nexport function localStorageThemeStore<Themes extends ThemeMap>(\n\tthemes: Themes,\n\toptions: { storageKey: string }\n) {\n\tconst { storageKey } = options\n\n\tif (typeof window === 'undefined' || !window.localStorage) {\n\t\treturn dummyThemeStore satisfies ThemeStore<Themes>\n\t}\n\n\tconst handlers = new Set<(theme: ThemeEntry<Themes> | undefined) => void>()\n\tlet lastNotifiedKey: keyof Themes | undefined = read()?.theme ?? undefined\n\n\tfunction read() {\n\t\tconst stored = window.localStorage.getItem(storageKey)\n\t\tconst theme = parseStoredTheme(themes, stored)\n\t\tif (theme === undefined) return undefined\n\t\treturn themeEntry(themes, theme)\n\t}\n\n\tfunction notify() {\n\t\tconst result = read()\n\t\tconst key = result?.theme ?? undefined\n\t\tif (key === lastNotifiedKey) return\n\t\tlastNotifiedKey = key\n\t\tfor (const h of handlers) h(result)\n\t}\n\n\treturn {\n\t\tread,\n\t\twrite(entry) {\n\t\t\ttry {\n\t\t\t\tif (entry === undefined) {\n\t\t\t\t\twindow.localStorage.removeItem(storageKey)\n\t\t\t\t} else {\n\t\t\t\t\twindow.localStorage.setItem(storageKey, JSON.stringify(entry))\n\t\t\t\t}\n\t\t\t\tnotify()\n\t\t\t} catch {\n\t\t\t\t// Ignore quota or other errors\n\t\t\t}\n\t\t},\n\t\tsubscribe(handler) {\n\t\t\thandlers.add(handler)\n\n\t\t\tconst onStorage = (e: StorageEvent) => {\n\t\t\t\tif (e.key === storageKey && e.storageArea === window.localStorage) notify()\n\t\t\t}\n\t\t\twindow.addEventListener('storage', onStorage)\n\n\t\t\treturn () => {\n\t\t\t\thandlers.delete(handler)\n\t\t\t\twindow.removeEventListener('storage', onStorage)\n\t\t\t}\n\t\t}\n\t} satisfies ThemeStore<Themes>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA0BA,SAAgB,uBACf,QACA,SACC;CACD,MAAM,EAAE,eAAe;AAEvB,KAAI,OAAO,WAAW,eAAe,CAAC,OAAO,aAC5C,QAAOA;CAGR,MAAM,2BAAW,IAAI,KAAsD;CAC3E,IAAIC,kBAA4C,MAAM,EAAE,SAAS;CAEjE,SAAS,OAAO;EAEf,MAAM,QAAQC,4CAAiB,QADhB,OAAO,aAAa,QAAQ,WAAW,CACR;AAC9C,MAAI,UAAU,OAAW,QAAO;AAChC,SAAOC,+BAAW,QAAQ,MAAM;;CAGjC,SAAS,SAAS;EACjB,MAAM,SAAS,MAAM;EACrB,MAAM,MAAM,QAAQ,SAAS;AAC7B,MAAI,QAAQ,gBAAiB;AAC7B,oBAAkB;AAClB,OAAK,MAAM,KAAK,SAAU,GAAE,OAAO;;AAGpC,QAAO;EACN;EACA,MAAM,OAAO;AACZ,OAAI;AACH,QAAI,UAAU,OACb,QAAO,aAAa,WAAW,WAAW;QAE1C,QAAO,aAAa,QAAQ,YAAY,KAAK,UAAU,MAAM,CAAC;AAE/D,YAAQ;WACD;;EAIT,UAAU,SAAS;AAClB,YAAS,IAAI,QAAQ;GAErB,MAAM,aAAa,MAAoB;AACtC,QAAI,EAAE,QAAQ,cAAc,EAAE,gBAAgB,OAAO,aAAc,SAAQ;;AAE5E,UAAO,iBAAiB,WAAW,UAAU;AAE7C,gBAAa;AACZ,aAAS,OAAO,QAAQ;AACxB,WAAO,oBAAoB,WAAW,UAAU;;;EAGlD"}
1
+ {"version":3,"file":"local-storage-theme-store.cjs","names":["dummyThemeStore","lastNotifiedKey: keyof Themes | undefined","readLocalStorage"],"sources":["../../../../src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.ts"],"sourcesContent":["import { dummyThemeStore } from '../../../testing/theme/dummy-theme-store.ts'\nimport { readLocalStorage } from '../../local-storage/read-local-storage.ts'\nimport { writeLocalStorage } from '../../local-storage/write-local-storage.ts'\nimport type { ParseStoredTheme, StringifyStoredTheme, ThemeEntry } from '../../theme-entry.types.ts'\nimport type { ThemeMap } from '../../theme-map.types.ts'\nimport type { ThemeStore } from '../theme-store.types.ts'\n\n/**\n * Creates a theme store backed by localStorage.\n *\n * Persists across sessions; cross-tab sync via StorageEvent.\n * Same-tab writes trigger manual notify (StorageEvent does not fire for same tab).\n *\n * @param themes - Record mapping theme keys to values (for validation)\n * @param options.storageKey - localStorage key\n * @param options.parse - Optional custom parser for stored string (default: parseStoredTheme)\n * @param options.stringify - Optional custom serializer (default: JSON.stringify)\n * @param options.onError - Optional callback invoked when storage write throws\n * @returns ThemeStore\n *\n * @example\n * ```ts\n * const themes = { current: 'theme-current', grayscale: 'theme-grayscale' }\n * const store = localStorageThemeStore(themes, { storageKey: 'theme' })\n * store.read() // returns themeResult from localStorage\n * store.write(themeEntry(themes, 'grayscale'))\n * store.subscribe((themeResult) => {})\n * ```\n */\nexport function localStorageThemeStore<Themes extends ThemeMap>(\n\tthemes: Themes,\n\toptions: {\n\t\tstorageKey: string\n\t\tparse?: ParseStoredTheme<Themes> | undefined\n\t\tstringify?: StringifyStoredTheme<Themes> | undefined\n\t\tonError?: ((error: unknown) => void) | undefined\n\t}\n) {\n\tconst { storageKey, parse, stringify, onError } = options\n\n\tif (!window?.localStorage) {\n\t\treturn dummyThemeStore satisfies ThemeStore<Themes>\n\t}\n\n\tconst handlers = new Set<(theme: ThemeEntry<Themes> | undefined) => void>()\n\tlet lastNotifiedKey: keyof Themes | undefined = read()?.theme ?? undefined\n\n\tfunction read() {\n\t\treturn readLocalStorage(themes, storageKey, { parse })\n\t}\n\n\tfunction notify() {\n\t\tconst result = read()\n\t\tconst key = result?.theme ?? undefined\n\t\tif (key === lastNotifiedKey) return\n\t\tlastNotifiedKey = key\n\t\tfor (const h of handlers) h(result)\n\t}\n\n\treturn {\n\t\tread,\n\t\twrite(entry) {\n\t\t\twriteLocalStorage(themes, storageKey, entry, { stringify, onError })\n\t\t\tnotify()\n\t\t},\n\t\tsubscribe(handler) {\n\t\t\thandlers.add(handler)\n\n\t\t\tconst onStorage = (e: StorageEvent) => {\n\t\t\t\tif (e.key === storageKey && e.storageArea === window.localStorage) notify()\n\t\t\t}\n\t\t\twindow.addEventListener('storage', onStorage)\n\n\t\t\treturn () => {\n\t\t\t\thandlers.delete(handler)\n\t\t\t\twindow.removeEventListener('storage', onStorage)\n\t\t\t}\n\t\t}\n\t} satisfies ThemeStore<Themes>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAgB,uBACf,QACA,SAMC;CACD,MAAM,EAAE,YAAY,OAAO,WAAW,YAAY;AAElD,KAAI,CAAC,QAAQ,aACZ,QAAOA;CAGR,MAAM,2BAAW,IAAI,KAAsD;CAC3E,IAAIC,kBAA4C,MAAM,EAAE,SAAS;CAEjE,SAAS,OAAO;AACf,SAAOC,4CAAiB,QAAQ,YAAY,EAAE,OAAO,CAAC;;CAGvD,SAAS,SAAS;EACjB,MAAM,SAAS,MAAM;EACrB,MAAM,MAAM,QAAQ,SAAS;AAC7B,MAAI,QAAQ,gBAAiB;AAC7B,oBAAkB;AAClB,OAAK,MAAM,KAAK,SAAU,GAAE,OAAO;;AAGpC,QAAO;EACN;EACA,MAAM,OAAO;AACZ,iDAAkB,QAAQ,YAAY,OAAO;IAAE;IAAW;IAAS,CAAC;AACpE,WAAQ;;EAET,UAAU,SAAS;AAClB,YAAS,IAAI,QAAQ;GAErB,MAAM,aAAa,MAAoB;AACtC,QAAI,EAAE,QAAQ,cAAc,EAAE,gBAAgB,OAAO,aAAc,SAAQ;;AAE5E,UAAO,iBAAiB,WAAW,UAAU;AAE7C,gBAAa;AACZ,aAAS,OAAO,QAAQ;AACxB,WAAO,oBAAoB,WAAW,UAAU;;;EAGlD"}
@@ -1,5 +1,5 @@
1
1
  import { ThemeMap } from "../../theme-map.types.cjs";
2
- import { ThemeEntry } from "../../theme-entry.types.cjs";
2
+ import { ParseStoredTheme, StringifyStoredTheme, ThemeEntry } from "../../theme-entry.types.cjs";
3
3
 
4
4
  //#region src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.ts
5
5
 
@@ -11,6 +11,9 @@ import { ThemeEntry } from "../../theme-entry.types.cjs";
11
11
  *
12
12
  * @param themes - Record mapping theme keys to values (for validation)
13
13
  * @param options.storageKey - localStorage key
14
+ * @param options.parse - Optional custom parser for stored string (default: parseStoredTheme)
15
+ * @param options.stringify - Optional custom serializer (default: JSON.stringify)
16
+ * @param options.onError - Optional callback invoked when storage write throws
14
17
  * @returns ThemeStore
15
18
  *
16
19
  * @example
@@ -24,6 +27,9 @@ import { ThemeEntry } from "../../theme-entry.types.cjs";
24
27
  */
25
28
  declare function localStorageThemeStore<Themes extends ThemeMap>(themes: Themes, options: {
26
29
  storageKey: string;
30
+ parse?: ParseStoredTheme<Themes> | undefined;
31
+ stringify?: StringifyStoredTheme<Themes> | undefined;
32
+ onError?: ((error: unknown) => void) | undefined;
27
33
  }): {
28
34
  read: () => ThemeEntry<Themes> | undefined;
29
35
  write(entry: ThemeEntry<Themes> | undefined): void;
@@ -1 +1 @@
1
- {"version":3,"file":"local-storage-theme-store.d.cts","names":[],"sources":["../../../../src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.ts"],"sourcesContent":[],"mappings":";;;;;;;AA0BA;;;;;;;;;;;;;;;;;iBAAgB,sCAAsC,kBAC7C"}
1
+ {"version":3,"file":"local-storage-theme-store.d.cts","names":[],"sources":["../../../../src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.ts"],"sourcesContent":[],"mappings":";;;;;;;AA6BA;;;;;;;;;;;;;;;;;;;;iBAAgB,sCAAsC,kBAC7C;;UAGC,iBAAiB;cACb,qBAAqB"}
@@ -1,5 +1,5 @@
1
1
  import { ThemeMap } from "../../theme-map.types.mjs";
2
- import { ThemeEntry } from "../../theme-entry.types.mjs";
2
+ import { ParseStoredTheme, StringifyStoredTheme, ThemeEntry } from "../../theme-entry.types.mjs";
3
3
 
4
4
  //#region src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.d.ts
5
5
 
@@ -11,6 +11,9 @@ import { ThemeEntry } from "../../theme-entry.types.mjs";
11
11
  *
12
12
  * @param themes - Record mapping theme keys to values (for validation)
13
13
  * @param options.storageKey - localStorage key
14
+ * @param options.parse - Optional custom parser for stored string (default: parseStoredTheme)
15
+ * @param options.stringify - Optional custom serializer (default: JSON.stringify)
16
+ * @param options.onError - Optional callback invoked when storage write throws
14
17
  * @returns ThemeStore
15
18
  *
16
19
  * @example
@@ -24,6 +27,9 @@ import { ThemeEntry } from "../../theme-entry.types.mjs";
24
27
  */
25
28
  declare function localStorageThemeStore<Themes extends ThemeMap>(themes: Themes, options: {
26
29
  storageKey: string;
30
+ parse?: ParseStoredTheme<Themes> | undefined;
31
+ stringify?: StringifyStoredTheme<Themes> | undefined;
32
+ onError?: ((error: unknown) => void) | undefined;
27
33
  }): {
28
34
  read: () => ThemeEntry<Themes> | undefined;
29
35
  write(entry: ThemeEntry<Themes> | undefined): void;
@@ -1 +1 @@
1
- {"version":3,"file":"local-storage-theme-store.d.mts","names":[],"sources":["../../../../src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.ts"],"sourcesContent":[],"mappings":";;;;;;;AA0BA;;;;;;;;;;;;;;;;;iBAAgB,sCAAsC,kBAC7C"}
1
+ {"version":3,"file":"local-storage-theme-store.d.mts","names":[],"sources":["../../../../src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.ts"],"sourcesContent":[],"mappings":";;;;;;;AA6BA;;;;;;;;;;;;;;;;;;;;iBAAgB,sCAAsC,kBAC7C;;UAGC,iBAAiB;cACb,qBAAqB"}
@@ -1,6 +1,6 @@
1
- import { themeEntry } from "../../theme-entry.mjs";
2
1
  import { dummyThemeStore } from "../../../testing/theme/dummy-theme-store.mjs";
3
- import { parseStoredTheme } from "../../_utils/parse-stored-theme.mjs";
2
+ import { readLocalStorage } from "../../local-storage/read-local-storage.mjs";
3
+ import { writeLocalStorage } from "../../local-storage/write-local-storage.mjs";
4
4
 
5
5
  //#region src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.ts
6
6
  /**
@@ -11,6 +11,9 @@ import { parseStoredTheme } from "../../_utils/parse-stored-theme.mjs";
11
11
  *
12
12
  * @param themes - Record mapping theme keys to values (for validation)
13
13
  * @param options.storageKey - localStorage key
14
+ * @param options.parse - Optional custom parser for stored string (default: parseStoredTheme)
15
+ * @param options.stringify - Optional custom serializer (default: JSON.stringify)
16
+ * @param options.onError - Optional callback invoked when storage write throws
14
17
  * @returns ThemeStore
15
18
  *
16
19
  * @example
@@ -23,14 +26,12 @@ import { parseStoredTheme } from "../../_utils/parse-stored-theme.mjs";
23
26
  * ```
24
27
  */
25
28
  function localStorageThemeStore(themes, options) {
26
- const { storageKey } = options;
27
- if (typeof window === "undefined" || !window.localStorage) return dummyThemeStore;
29
+ const { storageKey, parse, stringify, onError } = options;
30
+ if (!window?.localStorage) return dummyThemeStore;
28
31
  const handlers = /* @__PURE__ */ new Set();
29
32
  let lastNotifiedKey = read()?.theme ?? void 0;
30
33
  function read() {
31
- const theme = parseStoredTheme(themes, window.localStorage.getItem(storageKey));
32
- if (theme === void 0) return void 0;
33
- return themeEntry(themes, theme);
34
+ return readLocalStorage(themes, storageKey, { parse });
34
35
  }
35
36
  function notify() {
36
37
  const result = read();
@@ -42,11 +43,11 @@ function localStorageThemeStore(themes, options) {
42
43
  return {
43
44
  read,
44
45
  write(entry) {
45
- try {
46
- if (entry === void 0) window.localStorage.removeItem(storageKey);
47
- else window.localStorage.setItem(storageKey, JSON.stringify(entry));
48
- notify();
49
- } catch {}
46
+ writeLocalStorage(themes, storageKey, entry, {
47
+ stringify,
48
+ onError
49
+ });
50
+ notify();
50
51
  },
51
52
  subscribe(handler) {
52
53
  handlers.add(handler);
@@ -1 +1 @@
1
- {"version":3,"file":"local-storage-theme-store.mjs","names":["lastNotifiedKey: keyof Themes | undefined"],"sources":["../../../../src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.ts"],"sourcesContent":["import { dummyThemeStore } from '../../../testing/theme/dummy-theme-store.ts'\nimport { parseStoredTheme } from '../../_utils/parse-stored-theme.ts'\nimport { themeEntry } from '../../theme-entry.ts'\nimport type { ThemeEntry } from '../../theme-entry.types.ts'\nimport type { ThemeMap } from '../../theme-map.types.ts'\nimport type { ThemeStore } from '../theme-store.types.ts'\n\n/**\n * Creates a theme store backed by localStorage.\n *\n * Persists across sessions; cross-tab sync via StorageEvent.\n * Same-tab writes trigger manual notify (StorageEvent does not fire for same tab).\n *\n * @param themes - Record mapping theme keys to values (for validation)\n * @param options.storageKey - localStorage key\n * @returns ThemeStore\n *\n * @example\n * ```ts\n * const themes = { current: 'theme-current', grayscale: 'theme-grayscale' }\n * const store = localStorageThemeStore(themes, { storageKey: 'theme' })\n * store.read() // returns themeResult from localStorage\n * store.write(themeEntry(themes, 'grayscale'))\n * store.subscribe((themeResult) => {})\n * ```\n */\nexport function localStorageThemeStore<Themes extends ThemeMap>(\n\tthemes: Themes,\n\toptions: { storageKey: string }\n) {\n\tconst { storageKey } = options\n\n\tif (typeof window === 'undefined' || !window.localStorage) {\n\t\treturn dummyThemeStore satisfies ThemeStore<Themes>\n\t}\n\n\tconst handlers = new Set<(theme: ThemeEntry<Themes> | undefined) => void>()\n\tlet lastNotifiedKey: keyof Themes | undefined = read()?.theme ?? undefined\n\n\tfunction read() {\n\t\tconst stored = window.localStorage.getItem(storageKey)\n\t\tconst theme = parseStoredTheme(themes, stored)\n\t\tif (theme === undefined) return undefined\n\t\treturn themeEntry(themes, theme)\n\t}\n\n\tfunction notify() {\n\t\tconst result = read()\n\t\tconst key = result?.theme ?? undefined\n\t\tif (key === lastNotifiedKey) return\n\t\tlastNotifiedKey = key\n\t\tfor (const h of handlers) h(result)\n\t}\n\n\treturn {\n\t\tread,\n\t\twrite(entry) {\n\t\t\ttry {\n\t\t\t\tif (entry === undefined) {\n\t\t\t\t\twindow.localStorage.removeItem(storageKey)\n\t\t\t\t} else {\n\t\t\t\t\twindow.localStorage.setItem(storageKey, JSON.stringify(entry))\n\t\t\t\t}\n\t\t\t\tnotify()\n\t\t\t} catch {\n\t\t\t\t// Ignore quota or other errors\n\t\t\t}\n\t\t},\n\t\tsubscribe(handler) {\n\t\t\thandlers.add(handler)\n\n\t\t\tconst onStorage = (e: StorageEvent) => {\n\t\t\t\tif (e.key === storageKey && e.storageArea === window.localStorage) notify()\n\t\t\t}\n\t\t\twindow.addEventListener('storage', onStorage)\n\n\t\t\treturn () => {\n\t\t\t\thandlers.delete(handler)\n\t\t\t\twindow.removeEventListener('storage', onStorage)\n\t\t\t}\n\t\t}\n\t} satisfies ThemeStore<Themes>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA0BA,SAAgB,uBACf,QACA,SACC;CACD,MAAM,EAAE,eAAe;AAEvB,KAAI,OAAO,WAAW,eAAe,CAAC,OAAO,aAC5C,QAAO;CAGR,MAAM,2BAAW,IAAI,KAAsD;CAC3E,IAAIA,kBAA4C,MAAM,EAAE,SAAS;CAEjE,SAAS,OAAO;EAEf,MAAM,QAAQ,iBAAiB,QADhB,OAAO,aAAa,QAAQ,WAAW,CACR;AAC9C,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,WAAW,QAAQ,MAAM;;CAGjC,SAAS,SAAS;EACjB,MAAM,SAAS,MAAM;EACrB,MAAM,MAAM,QAAQ,SAAS;AAC7B,MAAI,QAAQ,gBAAiB;AAC7B,oBAAkB;AAClB,OAAK,MAAM,KAAK,SAAU,GAAE,OAAO;;AAGpC,QAAO;EACN;EACA,MAAM,OAAO;AACZ,OAAI;AACH,QAAI,UAAU,OACb,QAAO,aAAa,WAAW,WAAW;QAE1C,QAAO,aAAa,QAAQ,YAAY,KAAK,UAAU,MAAM,CAAC;AAE/D,YAAQ;WACD;;EAIT,UAAU,SAAS;AAClB,YAAS,IAAI,QAAQ;GAErB,MAAM,aAAa,MAAoB;AACtC,QAAI,EAAE,QAAQ,cAAc,EAAE,gBAAgB,OAAO,aAAc,SAAQ;;AAE5E,UAAO,iBAAiB,WAAW,UAAU;AAE7C,gBAAa;AACZ,aAAS,OAAO,QAAQ;AACxB,WAAO,oBAAoB,WAAW,UAAU;;;EAGlD"}
1
+ {"version":3,"file":"local-storage-theme-store.mjs","names":["lastNotifiedKey: keyof Themes | undefined"],"sources":["../../../../src/theme/theme-store/local-storage-theme-store/local-storage-theme-store.ts"],"sourcesContent":["import { dummyThemeStore } from '../../../testing/theme/dummy-theme-store.ts'\nimport { readLocalStorage } from '../../local-storage/read-local-storage.ts'\nimport { writeLocalStorage } from '../../local-storage/write-local-storage.ts'\nimport type { ParseStoredTheme, StringifyStoredTheme, ThemeEntry } from '../../theme-entry.types.ts'\nimport type { ThemeMap } from '../../theme-map.types.ts'\nimport type { ThemeStore } from '../theme-store.types.ts'\n\n/**\n * Creates a theme store backed by localStorage.\n *\n * Persists across sessions; cross-tab sync via StorageEvent.\n * Same-tab writes trigger manual notify (StorageEvent does not fire for same tab).\n *\n * @param themes - Record mapping theme keys to values (for validation)\n * @param options.storageKey - localStorage key\n * @param options.parse - Optional custom parser for stored string (default: parseStoredTheme)\n * @param options.stringify - Optional custom serializer (default: JSON.stringify)\n * @param options.onError - Optional callback invoked when storage write throws\n * @returns ThemeStore\n *\n * @example\n * ```ts\n * const themes = { current: 'theme-current', grayscale: 'theme-grayscale' }\n * const store = localStorageThemeStore(themes, { storageKey: 'theme' })\n * store.read() // returns themeResult from localStorage\n * store.write(themeEntry(themes, 'grayscale'))\n * store.subscribe((themeResult) => {})\n * ```\n */\nexport function localStorageThemeStore<Themes extends ThemeMap>(\n\tthemes: Themes,\n\toptions: {\n\t\tstorageKey: string\n\t\tparse?: ParseStoredTheme<Themes> | undefined\n\t\tstringify?: StringifyStoredTheme<Themes> | undefined\n\t\tonError?: ((error: unknown) => void) | undefined\n\t}\n) {\n\tconst { storageKey, parse, stringify, onError } = options\n\n\tif (!window?.localStorage) {\n\t\treturn dummyThemeStore satisfies ThemeStore<Themes>\n\t}\n\n\tconst handlers = new Set<(theme: ThemeEntry<Themes> | undefined) => void>()\n\tlet lastNotifiedKey: keyof Themes | undefined = read()?.theme ?? undefined\n\n\tfunction read() {\n\t\treturn readLocalStorage(themes, storageKey, { parse })\n\t}\n\n\tfunction notify() {\n\t\tconst result = read()\n\t\tconst key = result?.theme ?? undefined\n\t\tif (key === lastNotifiedKey) return\n\t\tlastNotifiedKey = key\n\t\tfor (const h of handlers) h(result)\n\t}\n\n\treturn {\n\t\tread,\n\t\twrite(entry) {\n\t\t\twriteLocalStorage(themes, storageKey, entry, { stringify, onError })\n\t\t\tnotify()\n\t\t},\n\t\tsubscribe(handler) {\n\t\t\thandlers.add(handler)\n\n\t\t\tconst onStorage = (e: StorageEvent) => {\n\t\t\t\tif (e.key === storageKey && e.storageArea === window.localStorage) notify()\n\t\t\t}\n\t\t\twindow.addEventListener('storage', onStorage)\n\n\t\t\treturn () => {\n\t\t\t\thandlers.delete(handler)\n\t\t\t\twindow.removeEventListener('storage', onStorage)\n\t\t\t}\n\t\t}\n\t} satisfies ThemeStore<Themes>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAgB,uBACf,QACA,SAMC;CACD,MAAM,EAAE,YAAY,OAAO,WAAW,YAAY;AAElD,KAAI,CAAC,QAAQ,aACZ,QAAO;CAGR,MAAM,2BAAW,IAAI,KAAsD;CAC3E,IAAIA,kBAA4C,MAAM,EAAE,SAAS;CAEjE,SAAS,OAAO;AACf,SAAO,iBAAiB,QAAQ,YAAY,EAAE,OAAO,CAAC;;CAGvD,SAAS,SAAS;EACjB,MAAM,SAAS,MAAM;EACrB,MAAM,MAAM,QAAQ,SAAS;AAC7B,MAAI,QAAQ,gBAAiB;AAC7B,oBAAkB;AAClB,OAAK,MAAM,KAAK,SAAU,GAAE,OAAO;;AAGpC,QAAO;EACN;EACA,MAAM,OAAO;AACZ,qBAAkB,QAAQ,YAAY,OAAO;IAAE;IAAW;IAAS,CAAC;AACpE,WAAQ;;EAET,UAAU,SAAS;AAClB,YAAS,IAAI,QAAQ;GAErB,MAAM,aAAa,MAAoB;AACtC,QAAI,EAAE,QAAQ,cAAc,EAAE,gBAAgB,OAAO,aAAc,SAAQ;;AAE5E,UAAO,iBAAiB,WAAW,UAAU;AAE7C,gBAAa;AACZ,aAAS,OAAO,QAAQ;AACxB,WAAO,oBAAoB,WAAW,UAAU;;;EAGlD"}
@@ -1,6 +1,5 @@
1
- const require_get_prefers_color_scheme = require('../../../color-scheme/get-prefers-color-scheme.cjs');
2
- const require_observe_prefers_color_scheme = require('../../../color-scheme/observe-prefers-color-scheme.cjs');
3
- const require_theme_entry = require('../../theme-entry.cjs');
1
+ const require_read_prefers_color_scheme_theme = require('../../prefers-color-scheme-theme/read-prefers-color-scheme-theme.cjs');
2
+ const require_subscribe_prefers_color_scheme_theme = require('../../prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.cjs');
4
3
 
5
4
  //#region src/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.ts
6
5
  /**
@@ -26,10 +25,10 @@ const require_theme_entry = require('../../theme-entry.cjs');
26
25
  function prefersColorSchemeThemeStore(themes) {
27
26
  return {
28
27
  read() {
29
- return require_theme_entry.themeEntry(themes, require_get_prefers_color_scheme.getPrefersColorScheme());
28
+ return require_read_prefers_color_scheme_theme.readPrefersColorSchemeTheme(themes);
30
29
  },
31
30
  subscribe(handler) {
32
- return require_observe_prefers_color_scheme.observePrefersColorScheme((scheme) => handler(require_theme_entry.themeEntry(themes, scheme)));
31
+ return require_subscribe_prefers_color_scheme_theme.subscribePrefersColorSchemeTheme(themes, handler);
33
32
  }
34
33
  };
35
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prefers-color-scheme-theme-store.cjs","names":["themeEntry","getPrefersColorScheme","observePrefersColorScheme"],"sources":["../../../../src/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.ts"],"sourcesContent":["import type { RequiredPick } from 'type-plus'\nimport { getPrefersColorScheme } from '../../../color-scheme/get-prefers-color-scheme.ts'\nimport { observePrefersColorScheme } from '../../../color-scheme/observe-prefers-color-scheme.ts'\nimport { themeEntry } from '../../theme-entry.ts'\nimport type { ThemeStore } from '../theme-store.types.ts'\n\ntype PrefersColorSchemeThemes = {\n\tlight: string | readonly string[]\n\tdark: string | readonly string[]\n}\n\n/**\n * Creates a read-only theme store that reads from `prefers-color-scheme`.\n *\n * **Color-scheme specific:** Themes must only include `light` and `dark` keys—this store\n * mirrors the system preference which is always one of these.\n *\n * Returns `ThemeEntry` for `light` or `dark` based on system preference.\n * No write method—the value is controlled by the system.\n *\n * @param themes - Record with `light` and `dark` keys mapping to theme values\n * @returns ThemeStore with read and subscribe only\n *\n * @example\n * ```ts\n * const themes = { light: 'theme-light', dark: 'theme-dark' }\n * const store = prefersColorSchemeThemeStore(themes)\n * store.read() // ThemeEntry for current system preference\n * store.subscribe((entry) => {})\n * ```\n */\nexport function prefersColorSchemeThemeStore<Themes extends PrefersColorSchemeThemes>(\n\tthemes: Themes\n): RequiredPick<ThemeStore<Themes>, 'read' | 'subscribe'> {\n\treturn {\n\t\tread() {\n\t\t\treturn themeEntry(themes, getPrefersColorScheme())\n\t\t},\n\t\tsubscribe(handler) {\n\t\t\treturn observePrefersColorScheme((scheme) => handler(themeEntry(themes, scheme)))\n\t\t}\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,SAAgB,6BACf,QACyD;AACzD,QAAO;EACN,OAAO;AACN,UAAOA,+BAAW,QAAQC,wDAAuB,CAAC;;EAEnD,UAAU,SAAS;AAClB,UAAOC,gEAA2B,WAAW,QAAQF,+BAAW,QAAQ,OAAO,CAAC,CAAC;;EAElF"}
1
+ {"version":3,"file":"prefers-color-scheme-theme-store.cjs","names":["readPrefersColorSchemeTheme","subscribePrefersColorSchemeTheme"],"sources":["../../../../src/theme/theme-store/prefers-color-scheme-theme-store/prefers-color-scheme-theme-store.ts"],"sourcesContent":["import type { RequiredPick } from 'type-plus'\nimport { readPrefersColorSchemeTheme } from '../../prefers-color-scheme-theme/read-prefers-color-scheme-theme.ts'\nimport { subscribePrefersColorSchemeTheme } from '../../prefers-color-scheme-theme/subscribe-prefers-color-scheme-theme.ts'\nimport type { ThemeStore } from '../theme-store.types.ts'\n\ntype PrefersColorSchemeThemes = {\n\tlight: string | readonly string[]\n\tdark: string | readonly string[]\n}\n\n/**\n * Creates a read-only theme store that reads from `prefers-color-scheme`.\n *\n * **Color-scheme specific:** Themes must only include `light` and `dark` keys—this store\n * mirrors the system preference which is always one of these.\n *\n * Returns `ThemeEntry` for `light` or `dark` based on system preference.\n * No write method—the value is controlled by the system.\n *\n * @param themes - Record with `light` and `dark` keys mapping to theme values\n * @returns ThemeStore with read and subscribe only\n *\n * @example\n * ```ts\n * const themes = { light: 'theme-light', dark: 'theme-dark' }\n * const store = prefersColorSchemeThemeStore(themes)\n * store.read() // ThemeEntry for current system preference\n * store.subscribe((entry) => {})\n * ```\n */\nexport function prefersColorSchemeThemeStore<Themes extends PrefersColorSchemeThemes>(\n\tthemes: Themes\n): RequiredPick<ThemeStore<Themes>, 'read' | 'subscribe'> {\n\treturn {\n\t\tread() {\n\t\t\treturn readPrefersColorSchemeTheme(themes)\n\t\t},\n\t\tsubscribe(handler) {\n\t\t\treturn subscribePrefersColorSchemeTheme(themes, handler)\n\t\t}\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA8BA,SAAgB,6BACf,QACyD;AACzD,QAAO;EACN,OAAO;AACN,UAAOA,oEAA4B,OAAO;;EAE3C,UAAU,SAAS;AAClB,UAAOC,8EAAiC,QAAQ,QAAQ;;EAEzD"}