@sirenodeck/sirenodeck 0.1.1-alpha.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 (485) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +69 -0
  3. package/bin/_wrapper-shared.js +42 -0
  4. package/bin/dev.js +95 -0
  5. package/bin/sirenodeck.js +42 -0
  6. package/config/default-config.yml +117 -0
  7. package/config/starter-config.yml +54 -0
  8. package/dist/main.mjs +64702 -0
  9. package/package.json +140 -0
  10. package/src/action/executor.ts +156 -0
  11. package/src/action/index.ts +7 -0
  12. package/src/addon/api-types.ts +15 -0
  13. package/src/addon/api.ts +461 -0
  14. package/src/addon/check-runner.ts +84 -0
  15. package/src/addon/index.ts +5 -0
  16. package/src/addon/loader.ts +441 -0
  17. package/src/addon/registry.ts +230 -0
  18. package/src/addon/spec.ts +69 -0
  19. package/src/api/addon.ts +33 -0
  20. package/src/api/asset-url.ts +24 -0
  21. package/src/api/index.ts +50 -0
  22. package/src/api/protocol-internal.ts +656 -0
  23. package/src/api/protocol.ts +2 -0
  24. package/src/api/react/index.ts +11 -0
  25. package/src/api/react/registry.ts +91 -0
  26. package/src/api/react/use-addon-channel.ts +26 -0
  27. package/src/api/react/use-button-state.tsx +23 -0
  28. package/src/api/react/use-deck.ts +24 -0
  29. package/src/assets/logo.png +0 -0
  30. package/src/assets/logo72x72.png +0 -0
  31. package/src/assets/logoFull.png +0 -0
  32. package/src/builtin-addons/brightness/README.md +51 -0
  33. package/src/builtin-addons/brightness/buttons/brightness/backend.ts +13 -0
  34. package/src/builtin-addons/brightness/buttons/brightness/config.ts +10 -0
  35. package/src/builtin-addons/brightness/buttons/brightness/frontend.tsx +50 -0
  36. package/src/builtin-addons/brightness/domain/macos.ts +46 -0
  37. package/src/builtin-addons/brightness/index.d.ts +5 -0
  38. package/src/builtin-addons/brightness/index.ts +20 -0
  39. package/src/builtin-addons/brightness/poller.ts +27 -0
  40. package/src/builtin-addons/brightness/providers/darwin.ts +107 -0
  41. package/src/builtin-addons/brightness/providers/index.ts +81 -0
  42. package/src/builtin-addons/brightness/providers/linux.ts +108 -0
  43. package/src/builtin-addons/brightness/providers/windows.ts +77 -0
  44. package/src/builtin-addons/brightness/sirenodeck.json +6 -0
  45. package/src/builtin-addons/coding-agents/assets/claude-code.svg +1 -0
  46. package/src/builtin-addons/coding-agents/assets/opencode-dark-square.svg +1 -0
  47. package/src/builtin-addons/coding-agents/buttons/agent/backend.ts +82 -0
  48. package/src/builtin-addons/coding-agents/buttons/agent/config.ts +13 -0
  49. package/src/builtin-addons/coding-agents/buttons/agent/frontend.tsx +130 -0
  50. package/src/builtin-addons/coding-agents/buttons/agent/pages.tsx +150 -0
  51. package/src/builtin-addons/coding-agents/buttons/summary/backend.ts +48 -0
  52. package/src/builtin-addons/coding-agents/buttons/summary/config.ts +11 -0
  53. package/src/builtin-addons/coding-agents/buttons/summary/frontend.tsx +254 -0
  54. package/src/builtin-addons/coding-agents/decks/agents.ts +69 -0
  55. package/src/builtin-addons/coding-agents/global/backend.ts +402 -0
  56. package/src/builtin-addons/coding-agents/global-entry.ts +7 -0
  57. package/src/builtin-addons/coding-agents/hook/script.ts +123 -0
  58. package/src/builtin-addons/coding-agents/index.ts +15 -0
  59. package/src/builtin-addons/coding-agents/manifest.ts +115 -0
  60. package/src/builtin-addons/coding-agents/providers/claude-code.ts +470 -0
  61. package/src/builtin-addons/coding-agents/providers/claude-instances.ts +184 -0
  62. package/src/builtin-addons/coding-agents/providers/opencode-instances.ts +108 -0
  63. package/src/builtin-addons/coding-agents/providers/opencode.ts +636 -0
  64. package/src/builtin-addons/coding-agents/providers/registry.ts +120 -0
  65. package/src/builtin-addons/coding-agents/providers/spawn.ts +112 -0
  66. package/src/builtin-addons/coding-agents/shared/claude-hook-events.ts +55 -0
  67. package/src/builtin-addons/coding-agents/shared/claude-status.ts +236 -0
  68. package/src/builtin-addons/coding-agents/shared/live-count.ts +39 -0
  69. package/src/builtin-addons/coding-agents/shared/notifier.ts +58 -0
  70. package/src/builtin-addons/coding-agents/shared/opencode-status.ts +82 -0
  71. package/src/builtin-addons/coding-agents/shared/snapshot.ts +66 -0
  72. package/src/builtin-addons/coding-agents/shared/state.ts +72 -0
  73. package/src/builtin-addons/coding-agents/sirenodeck.json +6 -0
  74. package/src/builtin-addons/coding-agents/types/types.ts +33 -0
  75. package/src/builtin-addons/core/README.md +89 -0
  76. package/src/builtin-addons/core/buttons/action/backend.ts +7 -0
  77. package/src/builtin-addons/core/buttons/action/config.ts +13 -0
  78. package/src/builtin-addons/core/buttons/action/frontend.tsx +16 -0
  79. package/src/builtin-addons/core/buttons/change-deck/backend.ts +18 -0
  80. package/src/builtin-addons/core/buttons/change-deck/config.ts +15 -0
  81. package/src/builtin-addons/core/buttons/change-deck/frontend.tsx +18 -0
  82. package/src/builtin-addons/core/buttons/media-sample/backend.ts +8 -0
  83. package/src/builtin-addons/core/buttons/media-sample/config.ts +7 -0
  84. package/src/builtin-addons/core/buttons/media-sample/frontend.tsx +2 -0
  85. package/src/builtin-addons/core/buttons/page-nav/backend.ts +28 -0
  86. package/src/builtin-addons/core/buttons/page-nav/config.ts +9 -0
  87. package/src/builtin-addons/core/buttons/page-nav/frontend.tsx +68 -0
  88. package/src/builtin-addons/core/buttons/toggle/backend.ts +119 -0
  89. package/src/builtin-addons/core/buttons/toggle/config.ts +57 -0
  90. package/src/builtin-addons/core/buttons/toggle/frontend.tsx +57 -0
  91. package/src/builtin-addons/core/buttons/toggle/global-service.ts +174 -0
  92. package/src/builtin-addons/core/index.ts +120 -0
  93. package/src/builtin-addons/core/sirenodeck.json +6 -0
  94. package/src/builtin-addons/date-time/README.md +73 -0
  95. package/src/builtin-addons/date-time/buttons/analog-clock/backend.ts +10 -0
  96. package/src/builtin-addons/date-time/buttons/analog-clock/config.ts +4 -0
  97. package/src/builtin-addons/date-time/buttons/analog-clock/frontend.tsx +88 -0
  98. package/src/builtin-addons/date-time/buttons/custom/backend.ts +10 -0
  99. package/src/builtin-addons/date-time/buttons/custom/config.ts +9 -0
  100. package/src/builtin-addons/date-time/buttons/custom/frontend.tsx +26 -0
  101. package/src/builtin-addons/date-time/buttons/date/backend.ts +10 -0
  102. package/src/builtin-addons/date-time/buttons/date/config.ts +10 -0
  103. package/src/builtin-addons/date-time/buttons/date/frontend.tsx +42 -0
  104. package/src/builtin-addons/date-time/buttons/time/backend.ts +10 -0
  105. package/src/builtin-addons/date-time/buttons/time/config.ts +9 -0
  106. package/src/builtin-addons/date-time/buttons/time/frontend.tsx +29 -0
  107. package/src/builtin-addons/date-time/index.d.ts +5 -0
  108. package/src/builtin-addons/date-time/index.ts +30 -0
  109. package/src/builtin-addons/date-time/poller.ts +11 -0
  110. package/src/builtin-addons/date-time/shared/format-date.ts +36 -0
  111. package/src/builtin-addons/date-time/shared/format.ts +105 -0
  112. package/src/builtin-addons/date-time/shared/use-now.ts +10 -0
  113. package/src/builtin-addons/date-time/sirenodeck.json +6 -0
  114. package/src/builtin-addons/emoji-selector/README.md +45 -0
  115. package/src/builtin-addons/emoji-selector/assets/launcher.svg +10 -0
  116. package/src/builtin-addons/emoji-selector/assets/smileys.svg +8 -0
  117. package/src/builtin-addons/emoji-selector/buttons/category/backend.ts +14 -0
  118. package/src/builtin-addons/emoji-selector/buttons/category/config.ts +8 -0
  119. package/src/builtin-addons/emoji-selector/buttons/category/frontend.tsx +19 -0
  120. package/src/builtin-addons/emoji-selector/buttons/emoji/backend.ts +7 -0
  121. package/src/builtin-addons/emoji-selector/buttons/emoji/config.ts +9 -0
  122. package/src/builtin-addons/emoji-selector/buttons/emoji/frontend.tsx +11 -0
  123. package/src/builtin-addons/emoji-selector/buttons/launcher/backend.ts +13 -0
  124. package/src/builtin-addons/emoji-selector/buttons/launcher/config.ts +6 -0
  125. package/src/builtin-addons/emoji-selector/buttons/launcher/frontend.tsx +31 -0
  126. package/src/builtin-addons/emoji-selector/data/categories.ts +1084 -0
  127. package/src/builtin-addons/emoji-selector/decks/index.ts +137 -0
  128. package/src/builtin-addons/emoji-selector/index.d.ts +5 -0
  129. package/src/builtin-addons/emoji-selector/index.ts +29 -0
  130. package/src/builtin-addons/emoji-selector/sirenodeck.json +6 -0
  131. package/src/builtin-addons/emoji-selector/support.ts +49 -0
  132. package/src/builtin-addons/index.ts +13 -0
  133. package/src/builtin-addons/internal-settings/README.md +26 -0
  134. package/src/builtin-addons/internal-settings/backend.ts +58 -0
  135. package/src/builtin-addons/internal-settings/buttons/app-info/backend.ts +7 -0
  136. package/src/builtin-addons/internal-settings/buttons/app-info/config.ts +13 -0
  137. package/src/builtin-addons/internal-settings/buttons/app-info/frontend.tsx +18 -0
  138. package/src/builtin-addons/internal-settings/buttons/brightness/common/frontend.tsx +50 -0
  139. package/src/builtin-addons/internal-settings/buttons/brightness-down/backend.ts +16 -0
  140. package/src/builtin-addons/internal-settings/buttons/brightness-down/config.ts +6 -0
  141. package/src/builtin-addons/internal-settings/buttons/brightness-down/frontend.tsx +8 -0
  142. package/src/builtin-addons/internal-settings/buttons/brightness-up/backend.ts +16 -0
  143. package/src/builtin-addons/internal-settings/buttons/brightness-up/config.ts +6 -0
  144. package/src/builtin-addons/internal-settings/buttons/brightness-up/frontend.tsx +8 -0
  145. package/src/builtin-addons/internal-settings/decks/settings.ts +25 -0
  146. package/src/builtin-addons/internal-settings/index.d.ts +4 -0
  147. package/src/builtin-addons/internal-settings/index.ts +53 -0
  148. package/src/builtin-addons/internal-settings/logo72x72.png +0 -0
  149. package/src/builtin-addons/internal-settings/sirenodeck.json +6 -0
  150. package/src/builtin-addons/media/README.md +45 -0
  151. package/src/builtin-addons/media/backend.ts +143 -0
  152. package/src/builtin-addons/media/buttons/media-player/backend.ts +19 -0
  153. package/src/builtin-addons/media/buttons/media-player/components/MediaStatus.tsx +25 -0
  154. package/src/builtin-addons/media/buttons/media-player/components/MediaSurface.tsx +52 -0
  155. package/src/builtin-addons/media/buttons/media-player/components/ProgressBar.tsx +21 -0
  156. package/src/builtin-addons/media/buttons/media-player/components/status-meta.ts +36 -0
  157. package/src/builtin-addons/media/buttons/media-player/config.ts +4 -0
  158. package/src/builtin-addons/media/buttons/media-player/frontend.tsx +29 -0
  159. package/src/builtin-addons/media/buttons/volume/common/frontend.tsx +52 -0
  160. package/src/builtin-addons/media/buttons/volume/mute/backend.ts +13 -0
  161. package/src/builtin-addons/media/buttons/volume/mute/config.ts +4 -0
  162. package/src/builtin-addons/media/buttons/volume/mute/frontend.tsx +26 -0
  163. package/src/builtin-addons/media/buttons/volume/volume-down/backend.ts +14 -0
  164. package/src/builtin-addons/media/buttons/volume/volume-down/config.ts +6 -0
  165. package/src/builtin-addons/media/buttons/volume/volume-down/frontend.tsx +10 -0
  166. package/src/builtin-addons/media/buttons/volume/volume-up/backend.ts +14 -0
  167. package/src/builtin-addons/media/buttons/volume/volume-up/config.ts +6 -0
  168. package/src/builtin-addons/media/buttons/volume/volume-up/frontend.tsx +8 -0
  169. package/src/builtin-addons/media/checks.ts +104 -0
  170. package/src/builtin-addons/media/executor.ts +36 -0
  171. package/src/builtin-addons/media/index.d.ts +5 -0
  172. package/src/builtin-addons/media/index.ts +53 -0
  173. package/src/builtin-addons/media/progress.ts +16 -0
  174. package/src/builtin-addons/media/providers/darwin.ts +391 -0
  175. package/src/builtin-addons/media/providers/index.ts +27 -0
  176. package/src/builtin-addons/media/providers/linux.ts +196 -0
  177. package/src/builtin-addons/media/providers/types.ts +48 -0
  178. package/src/builtin-addons/media/providers/windows.ts +121 -0
  179. package/src/builtin-addons/media/sirenodeck.json +6 -0
  180. package/src/builtin-addons/media/state.ts +19 -0
  181. package/src/builtin-addons/register-builtins.ts +65 -0
  182. package/src/builtin-addons/session/README.md +14 -0
  183. package/src/builtin-addons/session/buttons/session-info/backend.ts +8 -0
  184. package/src/builtin-addons/session/buttons/session-info/config.ts +4 -0
  185. package/src/builtin-addons/session/buttons/session-info/frontend.tsx +2 -0
  186. package/src/builtin-addons/session/buttons/time/backend.ts +7 -0
  187. package/src/builtin-addons/session/buttons/time/config.ts +6 -0
  188. package/src/builtin-addons/session/buttons/time/frontend.tsx +2 -0
  189. package/src/builtin-addons/session/index.d.ts +5 -0
  190. package/src/builtin-addons/session/index.ts +18 -0
  191. package/src/builtin-addons/session/sirenodeck.json +6 -0
  192. package/src/builtin-addons/system-status/README.md +169 -0
  193. package/src/builtin-addons/system-status/buttons/_shared.ts +131 -0
  194. package/src/builtin-addons/system-status/buttons/system-status/frontend.tsx +224 -0
  195. package/src/builtin-addons/system-status/buttons/system-status/schemas.ts +67 -0
  196. package/src/builtin-addons/system-status/domain/catalog.ts +53 -0
  197. package/src/builtin-addons/system-status/domain/chart-sampler.ts +58 -0
  198. package/src/builtin-addons/system-status/domain/display-metrics.ts +128 -0
  199. package/src/builtin-addons/system-status/domain/index.ts +10 -0
  200. package/src/builtin-addons/system-status/domain/live-metrics.ts +1021 -0
  201. package/src/builtin-addons/system-status/domain/metric-ids.ts +0 -0
  202. package/src/builtin-addons/system-status/index.ts +16 -0
  203. package/src/builtin-addons/system-status/manifest.ts +105 -0
  204. package/src/builtin-addons/system-status/shared/metrics-catalog.ts +316 -0
  205. package/src/builtin-addons/system-status/sirenodeck.json +6 -0
  206. package/src/builtin-addons/test-buildin/decks/action-buttons-test.ts +56 -0
  207. package/src/builtin-addons/test-buildin/index.d.ts +5 -0
  208. package/src/builtin-addons/test-buildin/index.ts +16 -0
  209. package/src/builtin-addons/value-display/README.md +59 -0
  210. package/src/builtin-addons/value-display/backend.ts +86 -0
  211. package/src/builtin-addons/value-display/buttons/value-display/backend.ts +17 -0
  212. package/src/builtin-addons/value-display/buttons/value-display/config.ts +36 -0
  213. package/src/builtin-addons/value-display/buttons/value-display/frontend.tsx +54 -0
  214. package/src/builtin-addons/value-display/index.d.ts +5 -0
  215. package/src/builtin-addons/value-display/index.ts +23 -0
  216. package/src/builtin-addons/value-display/sirenodeck.json +6 -0
  217. package/src/builtin-addons/weather/README.md +46 -0
  218. package/src/builtin-addons/weather/backend.ts +121 -0
  219. package/src/builtin-addons/weather/buttons/weather/backend.ts +27 -0
  220. package/src/builtin-addons/weather/buttons/weather/config.ts +29 -0
  221. package/src/builtin-addons/weather/buttons/weather/frontend.tsx +63 -0
  222. package/src/builtin-addons/weather/buttons/weather/icons.tsx +88 -0
  223. package/src/builtin-addons/weather/buttons/weather/pages.tsx +109 -0
  224. package/src/builtin-addons/weather/domain/codes.ts +35 -0
  225. package/src/builtin-addons/weather/domain/fetch.ts +47 -0
  226. package/src/builtin-addons/weather/index.d.ts +5 -0
  227. package/src/builtin-addons/weather/index.ts +23 -0
  228. package/src/builtin-addons/weather/poller.ts +70 -0
  229. package/src/builtin-addons/weather/provider/city-key.ts +9 -0
  230. package/src/builtin-addons/weather/provider/codes.ts +35 -0
  231. package/src/builtin-addons/weather/provider/fetch.ts +97 -0
  232. package/src/builtin-addons/weather/provider/geocode.ts +67 -0
  233. package/src/builtin-addons/weather/provider/types.ts +42 -0
  234. package/src/builtin-addons/weather/sirenodeck.json +6 -0
  235. package/src/cli/coding-agents-onboarding.ts +434 -0
  236. package/src/cli/commands/addon-decks.ts +441 -0
  237. package/src/cli/commands/addon-registry.ts +639 -0
  238. package/src/cli/commands/emulator-mode.ts +289 -0
  239. package/src/cli/commands/install.ts +128 -0
  240. package/src/cli/commands/logs.ts +74 -0
  241. package/src/cli/commands/network-bind.ts +111 -0
  242. package/src/cli/commands/pipeline/helpers.ts +75 -0
  243. package/src/cli/commands/pipeline/preflight.ts +20 -0
  244. package/src/cli/commands/port-identity.ts +152 -0
  245. package/src/cli/commands/reload.ts +37 -0
  246. package/src/cli/commands/restart.ts +139 -0
  247. package/src/cli/commands/run.ts +2270 -0
  248. package/src/cli/commands/service/install.ts +121 -0
  249. package/src/cli/commands/service/render-template.ts +158 -0
  250. package/src/cli/commands/service-manager.ts +184 -0
  251. package/src/cli/commands/spawn-daemon.ts +251 -0
  252. package/src/cli/commands/start.ts +1061 -0
  253. package/src/cli/commands/status.ts +110 -0
  254. package/src/cli/commands/stop.ts +121 -0
  255. package/src/cli/commands/subprocess-supervisor.ts +203 -0
  256. package/src/cli/commands/system-requirements.ts +699 -0
  257. package/src/cli/cwd.ts +28 -0
  258. package/src/cli/first-run.ts +149 -0
  259. package/src/cli/http-server.ts +244 -0
  260. package/src/cli/index.ts +355 -0
  261. package/src/cli/install-root.ts +26 -0
  262. package/src/cli/main.ts +194 -0
  263. package/src/cli/package-manager.ts +175 -0
  264. package/src/cli/probe-deps.ts +45 -0
  265. package/src/cli/prompt.ts +22 -0
  266. package/src/cli/startup-display.ts +452 -0
  267. package/src/config/builtin-icons.ts +57 -0
  268. package/src/config/config-diff.ts +54 -0
  269. package/src/config/discovery.ts +64 -0
  270. package/src/config/icon-resolver.ts +90 -0
  271. package/src/config/include-resolver.ts +202 -0
  272. package/src/config/index.ts +9 -0
  273. package/src/config/loader.ts +187 -0
  274. package/src/config/mutation.ts +514 -0
  275. package/src/config/reference-expander.ts +84 -0
  276. package/src/config/schemas.ts +223 -0
  277. package/src/config/validation.ts +254 -0
  278. package/src/core/asset-id.ts +21 -0
  279. package/src/core/gesture-state.ts +344 -0
  280. package/src/core/icon-asset-registry.ts +127 -0
  281. package/src/core/icon-source.ts +86 -0
  282. package/src/core/index.ts +30 -0
  283. package/src/core/mime.ts +16 -0
  284. package/src/core/pagination.ts +90 -0
  285. package/src/core/pub-sub.ts +126 -0
  286. package/src/core/settings.ts +153 -0
  287. package/src/core/store.ts +88 -0
  288. package/src/core/watcher.ts +73 -0
  289. package/src/deck/addon-handler-bridge.ts +516 -0
  290. package/src/deck/deck-config.ts +271 -0
  291. package/src/deck/editor-surfaces.ts +87 -0
  292. package/src/deck/host-context.ts +18 -0
  293. package/src/deck/index.ts +102 -0
  294. package/src/deck/macro-parse.ts +182 -0
  295. package/src/deck/methods.ts +348 -0
  296. package/src/deck/paginate-deck.ts +98 -0
  297. package/src/deck/position-buttons.ts +57 -0
  298. package/src/deck/runtime/index.ts +5 -0
  299. package/src/deck/runtime/runtime.ts +1060 -0
  300. package/src/deck/runtime-subscriptions.ts +45 -0
  301. package/src/deck/system-back-injection.ts +62 -0
  302. package/src/deck/system-buttons/registry.tsx +97 -0
  303. package/src/deck/system-buttons/types.ts +14 -0
  304. package/src/device/black-frame.ts +73 -0
  305. package/src/device/index.ts +13 -0
  306. package/src/device/linux-udev.ts +36 -0
  307. package/src/device/models.ts +89 -0
  308. package/src/device/reconnecting.ts +193 -0
  309. package/src/device/registry.ts +38 -0
  310. package/src/device/stream-deck.ts +155 -0
  311. package/src/index.ts +74 -0
  312. package/src/outputClient/emulator.ts +357 -0
  313. package/src/outputClient/index.ts +26 -0
  314. package/src/outputClient/open-browser.ts +26 -0
  315. package/src/outputClient/real.ts +393 -0
  316. package/src/outputClient/types.ts +83 -0
  317. package/src/render/browser-renderer.ts +240 -0
  318. package/src/render/buffer-hash.ts +20 -0
  319. package/src/render/editor-handler.ts +197 -0
  320. package/src/render/emulator-server.ts +128 -0
  321. package/src/render/icon-source-resolver.ts +69 -0
  322. package/src/render/index.ts +16 -0
  323. package/src/render/protocol.ts +61 -0
  324. package/src/render/push-raw-image.ts +100 -0
  325. package/src/render/screenshot-cadence.ts +87 -0
  326. package/src/render/state-publisher.ts +110 -0
  327. package/src/render/vite-server.ts +138 -0
  328. package/src/render/ws-bridge.ts +315 -0
  329. package/src/system/device-selection.ts +80 -0
  330. package/src/system/glob-match.ts +74 -0
  331. package/src/system/providers/active-app/darwin.ts +117 -0
  332. package/src/system/providers/active-app/linux.ts +245 -0
  333. package/src/system/providers/active-app/wayland-gnome.ts +303 -0
  334. package/src/system/providers/active-app/windows.ts +94 -0
  335. package/src/system/providers/active-app.ts +97 -0
  336. package/src/system/providers/clipboard/darwin.ts +65 -0
  337. package/src/system/providers/clipboard/linux.ts +163 -0
  338. package/src/system/providers/clipboard/windows.ts +94 -0
  339. package/src/system/providers/clipboard.ts +84 -0
  340. package/src/system/providers/error.ts +16 -0
  341. package/src/system/providers/key-macro/darwin.ts +221 -0
  342. package/src/system/providers/key-macro/linux.ts +651 -0
  343. package/src/system/providers/key-macro/parser.ts +215 -0
  344. package/src/system/providers/key-macro/windows.ts +476 -0
  345. package/src/system/providers/key-macro.ts +79 -0
  346. package/src/system/providers/notification/darwin.ts +36 -0
  347. package/src/system/providers/notification/linux.ts +115 -0
  348. package/src/system/providers/notification/windows.ts +72 -0
  349. package/src/system/providers/notification.ts +75 -0
  350. package/src/system/providers/session/darwin.ts +82 -0
  351. package/src/system/providers/session/linux.ts +175 -0
  352. package/src/system/providers/session/windows.ts +73 -0
  353. package/src/system/providers/session.ts +89 -0
  354. package/src/system/providers/shared.ts +65 -0
  355. package/src/system/requirements.ts +235 -0
  356. package/src/system/setup-wizard/config-seed.ts +30 -0
  357. package/src/system/setup-wizard/format.ts +275 -0
  358. package/src/system/setup-wizard/index.ts +45 -0
  359. package/src/system/setup-wizard/open-settings.ts +26 -0
  360. package/src/system/setup-wizard/plan.ts +230 -0
  361. package/src/system/setup-wizard/probe-cache.ts +34 -0
  362. package/src/system/setup-wizard/probe.ts +486 -0
  363. package/src/system/setup-wizard/runtime-features.ts +85 -0
  364. package/src/system/setup-wizard/sudo.ts +178 -0
  365. package/src/system/setup-wizard/types.ts +133 -0
  366. package/src/system/virtual-stream-deck.ts +67 -0
  367. package/src/themes/css.ts +210 -0
  368. package/src/themes/default/assets/IBMPlexSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  369. package/src/themes/default/assets/IBMPlexSans-VariableFont_wdth,wght.ttf +0 -0
  370. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Bold.ttf +0 -0
  371. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-BoldItalic.ttf +0 -0
  372. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-ExtraLight.ttf +0 -0
  373. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-ExtraLightItalic.ttf +0 -0
  374. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Italic.ttf +0 -0
  375. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Light.ttf +0 -0
  376. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-LightItalic.ttf +0 -0
  377. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Medium.ttf +0 -0
  378. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-MediumItalic.ttf +0 -0
  379. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Regular.ttf +0 -0
  380. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-SemiBold.ttf +0 -0
  381. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-SemiBoldItalic.ttf +0 -0
  382. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Thin.ttf +0 -0
  383. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-ThinItalic.ttf +0 -0
  384. package/src/themes/default/assets/IBM_Plex_Mono/OFL.txt +93 -0
  385. package/src/themes/default/assets/OFL.txt +93 -0
  386. package/src/themes/default/assets/README.txt +106 -0
  387. package/src/themes/default/assets/static/IBMPlexSans-Bold.ttf +0 -0
  388. package/src/themes/default/assets/static/IBMPlexSans-BoldItalic.ttf +0 -0
  389. package/src/themes/default/assets/static/IBMPlexSans-ExtraLight.ttf +0 -0
  390. package/src/themes/default/assets/static/IBMPlexSans-ExtraLightItalic.ttf +0 -0
  391. package/src/themes/default/assets/static/IBMPlexSans-Italic.ttf +0 -0
  392. package/src/themes/default/assets/static/IBMPlexSans-Light.ttf +0 -0
  393. package/src/themes/default/assets/static/IBMPlexSans-LightItalic.ttf +0 -0
  394. package/src/themes/default/assets/static/IBMPlexSans-Medium.ttf +0 -0
  395. package/src/themes/default/assets/static/IBMPlexSans-MediumItalic.ttf +0 -0
  396. package/src/themes/default/assets/static/IBMPlexSans-Regular.ttf +0 -0
  397. package/src/themes/default/assets/static/IBMPlexSans-SemiBold.ttf +0 -0
  398. package/src/themes/default/assets/static/IBMPlexSans-SemiBoldItalic.ttf +0 -0
  399. package/src/themes/default/assets/static/IBMPlexSans-Thin.ttf +0 -0
  400. package/src/themes/default/assets/static/IBMPlexSans-ThinItalic.ttf +0 -0
  401. package/src/themes/default/assets/static/IBMPlexSans_Condensed-Bold.ttf +0 -0
  402. package/src/themes/default/assets/static/IBMPlexSans_Condensed-BoldItalic.ttf +0 -0
  403. package/src/themes/default/assets/static/IBMPlexSans_Condensed-ExtraLight.ttf +0 -0
  404. package/src/themes/default/assets/static/IBMPlexSans_Condensed-ExtraLightItalic.ttf +0 -0
  405. package/src/themes/default/assets/static/IBMPlexSans_Condensed-Italic.ttf +0 -0
  406. package/src/themes/default/assets/static/IBMPlexSans_Condensed-Light.ttf +0 -0
  407. package/src/themes/default/assets/static/IBMPlexSans_Condensed-LightItalic.ttf +0 -0
  408. package/src/themes/default/assets/static/IBMPlexSans_Condensed-Medium.ttf +0 -0
  409. package/src/themes/default/assets/static/IBMPlexSans_Condensed-MediumItalic.ttf +0 -0
  410. package/src/themes/default/assets/static/IBMPlexSans_Condensed-Regular.ttf +0 -0
  411. package/src/themes/default/assets/static/IBMPlexSans_Condensed-SemiBold.ttf +0 -0
  412. package/src/themes/default/assets/static/IBMPlexSans_Condensed-SemiBoldItalic.ttf +0 -0
  413. package/src/themes/default/assets/static/IBMPlexSans_Condensed-Thin.ttf +0 -0
  414. package/src/themes/default/assets/static/IBMPlexSans_Condensed-ThinItalic.ttf +0 -0
  415. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Bold.ttf +0 -0
  416. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-BoldItalic.ttf +0 -0
  417. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-ExtraLight.ttf +0 -0
  418. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-ExtraLightItalic.ttf +0 -0
  419. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Italic.ttf +0 -0
  420. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Light.ttf +0 -0
  421. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-LightItalic.ttf +0 -0
  422. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Medium.ttf +0 -0
  423. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-MediumItalic.ttf +0 -0
  424. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Regular.ttf +0 -0
  425. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-SemiBold.ttf +0 -0
  426. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-SemiBoldItalic.ttf +0 -0
  427. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Thin.ttf +0 -0
  428. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-ThinItalic.ttf +0 -0
  429. package/src/themes/default/components.css +81 -0
  430. package/src/themes/default/sirenodeck.json +170 -0
  431. package/src/themes/index.ts +14 -0
  432. package/src/themes/light/assets/IBMPlexSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  433. package/src/themes/light/assets/IBMPlexSans-VariableFont_wdth,wght.ttf +0 -0
  434. package/src/themes/light/assets/IBM_Plex_Mono/IBMPlexMono-Bold.ttf +0 -0
  435. package/src/themes/light/assets/IBM_Plex_Mono/IBMPlexMono-Medium.ttf +0 -0
  436. package/src/themes/light/assets/IBM_Plex_Mono/IBMPlexMono-Regular.ttf +0 -0
  437. package/src/themes/light/assets/IBM_Plex_Mono/OFL.txt +93 -0
  438. package/src/themes/light/assets/OFL.txt +93 -0
  439. package/src/themes/light/assets/README.txt +106 -0
  440. package/src/themes/light/assets/static/IBMPlexSans-Light.ttf +0 -0
  441. package/src/themes/light/assets/static/IBMPlexSans-LightItalic.ttf +0 -0
  442. package/src/themes/light/assets/static/IBMPlexSans-Thin.ttf +0 -0
  443. package/src/themes/light/components.css +70 -0
  444. package/src/themes/light/sirenodeck.json +170 -0
  445. package/src/themes/loader.ts +343 -0
  446. package/src/themes/manifest.ts +164 -0
  447. package/src/themes/use-resolved-theme.tsx +32 -0
  448. package/src/ui/ButtonFrame.tsx +230 -0
  449. package/src/ui/contexts/AssetCacheContext.tsx +43 -0
  450. package/src/ui/index.ts +20 -0
  451. package/src/ui/primitives/Chip.tsx +53 -0
  452. package/src/ui/primitives/Icon.tsx +209 -0
  453. package/src/ui/primitives/Label.tsx +82 -0
  454. package/src/ui/primitives/ProgressBar.tsx +38 -0
  455. package/src/ui/primitives/TapIndicator.tsx +67 -0
  456. package/src/ui/primitives/Text.tsx +810 -0
  457. package/src/ui/primitives/index.ts +6 -0
  458. package/src/ui/surfaces/BarsSurface.tsx +211 -0
  459. package/src/ui/surfaces/IconLabelProgressSurface.tsx +133 -0
  460. package/src/ui/surfaces/IconLabelSurface.tsx +59 -0
  461. package/src/ui/surfaces/LabelValueListSurface.tsx +202 -0
  462. package/src/ui/surfaces/PaginatedSurface.tsx +164 -0
  463. package/src/ui/surfaces/SplitActionSurface.tsx +98 -0
  464. package/src/ui/surfaces/TemporaryErrorSurface.tsx +68 -0
  465. package/src/ui/surfaces/ValueChart.tsx +218 -0
  466. package/src/ui/surfaces/index.ts +32 -0
  467. package/src/ui/surfaces/paginated-schema.ts +22 -0
  468. package/src/ui/theme-presentation-builder.ts +184 -0
  469. package/src/ui/theme-presentation.tsx +146 -0
  470. package/src/ui/utils/cn.ts +12 -0
  471. package/src/util/cache-paths.ts +38 -0
  472. package/src/util/config-diff.ts +16 -0
  473. package/src/util/daemon-control.ts +85 -0
  474. package/src/util/daemon.ts +575 -0
  475. package/src/util/device-config.ts +56 -0
  476. package/src/util/errors.ts +13 -0
  477. package/src/util/log-reader.ts +114 -0
  478. package/src/util/log-tail.ts +103 -0
  479. package/src/util/logger.ts +417 -0
  480. package/src/util/process-title.ts +79 -0
  481. package/src/util/single-instance.ts +202 -0
  482. package/src/version.ts +10 -0
  483. package/src/vite/index.ts +6 -0
  484. package/src/vite/virtual-modules.ts +631 -0
  485. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1,36 @@
1
+ import { z } from "zod"
2
+
3
+ export const VALUE_DISPLAY_DEFAULT_POLL_MS = 5000
4
+ export const VALUE_DISPLAY_DEFAULT_TIMEOUT_MS = 5000
5
+
6
+ const ValueEntrySchema = z
7
+ .object({
8
+ label: z.string().min(1),
9
+ command: z.string().min(1),
10
+ formatter: z.enum(["raw", "strip", "line"]).optional().default("raw"),
11
+ units: z.string().optional(),
12
+ timeout_ms: z.number().int().positive().optional(),
13
+ icon: z.string().optional(),
14
+ })
15
+ .strict()
16
+
17
+ const ValueDisplayButtonSchema = z
18
+ .object({
19
+ values: z.array(ValueEntrySchema).min(1).max(4),
20
+ poll_interval_ms: z
21
+ .number()
22
+ .int()
23
+ .positive()
24
+ .optional()
25
+ .default(VALUE_DISPLAY_DEFAULT_POLL_MS),
26
+ timeout_ms: z
27
+ .number()
28
+ .int()
29
+ .positive()
30
+ .optional()
31
+ .default(VALUE_DISPLAY_DEFAULT_TIMEOUT_MS),
32
+ })
33
+ .strict()
34
+
35
+ export const configSchema = ValueDisplayButtonSchema
36
+ export type ConfigSchema = z.infer<typeof configSchema>
@@ -0,0 +1,54 @@
1
+ import { Text } from "@/ui/index"
2
+ import { useAddonChannel } from "@/api/react"
3
+ import type { AddonFrontendButton } from "@/addon/api"
4
+
5
+ import type { ConfigSchema } from "./config"
6
+
7
+ interface ValueEntry {
8
+ readonly label: string
9
+ readonly value: string
10
+ readonly units?: string
11
+ }
12
+
13
+ interface ValuesState {
14
+ readonly byButton: Record<string, ReadonlyArray<ValueEntry>>
15
+ }
16
+
17
+ const ValueDisplayButtonFrontend: AddonFrontendButton<ConfigSchema> = ({
18
+ buttonId,
19
+ }) => {
20
+ const { data } = useAddonChannel<ValuesState>("value-display:values")
21
+ const values = data?.byButton[buttonId] ?? []
22
+ if (values.length === 0) {
23
+ return (
24
+ <Text
25
+ size="xs"
26
+ tone="muted"
27
+ typography="mono"
28
+ className="flex h-full w-full items-center justify-center"
29
+ text="Loading…"
30
+ />
31
+ )
32
+ }
33
+ return (
34
+ <span className="flex h-full w-full flex-col items-stretch justify-center gap-0.5 p-1.5">
35
+ {values.slice(0, 4).map((v, i) => (
36
+ <span key={`${v.label}-${i}`} className="flex justify-between gap-2">
37
+ <Text size="xs" tone="muted" fit="ellipsis" text={v.label} />
38
+ <Text
39
+ size="xs"
40
+ tone="fg"
41
+ fit="ellipsis"
42
+ text={
43
+ v.units !== undefined && v.units.length > 0
44
+ ? `${v.value}${v.units}`
45
+ : v.value
46
+ }
47
+ />
48
+ </span>
49
+ ))}
50
+ </span>
51
+ )
52
+ }
53
+
54
+ export default ValueDisplayButtonFrontend
@@ -0,0 +1,5 @@
1
+ import type { NewAddonManifest } from "@/addon/api"
2
+
3
+ declare const manifest: NewAddonManifest
4
+ export default manifest
5
+ export { manifest }
@@ -0,0 +1,23 @@
1
+ import type { AddonManifestV1 } from "@/addon/api"
2
+
3
+ import { globalService } from "./backend"
4
+ import valueDisplayBackend from "./buttons/value-display/backend"
5
+ import valueDisplayFrontend from "./buttons/value-display/frontend"
6
+
7
+ export { globalService }
8
+
9
+ export const manifest: AddonManifestV1 = {
10
+ apiVersion: 1,
11
+ name: "value-display",
12
+ buttonTypes: {
13
+ "value-display:display": {
14
+ frontend: valueDisplayFrontend,
15
+ service: valueDisplayBackend,
16
+ },
17
+ },
18
+ publishIntervalMs: 5000,
19
+ globalService,
20
+ }
21
+
22
+ export const valueDisplayAddon = manifest
23
+ export default manifest
@@ -0,0 +1,6 @@
1
+ {
2
+ "kind": "addon",
3
+ "apiVersion": 1,
4
+ "name": "value-display",
5
+ "entry": "index.ts"
6
+ }
@@ -0,0 +1,46 @@
1
+ # weather
2
+
3
+ Current weather for a fixed location. Hits Open-Meteo (https://open-meteo.com/) every 10 minutes (configurable). No API key required.
4
+
5
+ ## Buttons
6
+
7
+ | Type | Description |
8
+ | ----------------- | -------------------------------------------------- |
9
+ | `weather:weather` | Single button: temperature, wind speed, conditions |
10
+
11
+ ## Config
12
+
13
+ ```yaml
14
+ - position: 4
15
+ type: weather:weather
16
+ config:
17
+ location:
18
+ latitude: 42.2304
19
+ longitude: -8.7256
20
+ name: Vigo # optional, shown in the button label
21
+ units: metric # "metric" (default) or "imperial"
22
+ poll_interval_ms: 600000 # optional, default 10 min
23
+ ```
24
+
25
+ If `location` is omitted, the button renders a "Configure weather" placeholder.
26
+
27
+ WMO weather codes (https://open-meteo.com/en/docs) are mapped to descriptions: clear sky, partly cloudy, overcast, fog, drizzle, rain, freezing rain, snow, thunderstorm, etc.
28
+
29
+ ## Example
30
+
31
+ ```yaml
32
+ - position: 4
33
+ type: weather:weather
34
+ config:
35
+ location:
36
+ latitude: 40.4168
37
+ longitude: -3.7038
38
+ name: Madrid
39
+ units: metric
40
+ ```
41
+
42
+ Run `curl "https://api.open-meteo.com/v1/forecast?latitude=40.4&longitude=-3.7&current=temperature_2m"` to verify the API is reachable from your network.
43
+
44
+ ## See also
45
+
46
+ - [value-display](../value-display/README.md) — `value-display:display` for arbitrary command output (no API)
@@ -0,0 +1,121 @@
1
+ import type { AddonServiceContext, AddonGlobalService } from "@/addon/api"
2
+
3
+ import type { WeatherSnapshot, WeatherStateSnapshot } from "./provider/types"
4
+ import { cityKey } from "./provider/city-key"
5
+ import { fetchWeather } from "./provider/fetch"
6
+ import { resolveLocation, type GeocodedLocation } from "./provider/geocode"
7
+ import type { CityEntry } from "./provider/types"
8
+
9
+ const POLL_INTERVAL_MS = 600_000
10
+
11
+ const cityRegistry = new Map<string, CityEntry>()
12
+ const resolvedCache = new Map<string, GeocodedLocation>()
13
+ let ctxRef: AddonServiceContext | undefined
14
+
15
+ const resolveEntryLocation = async (
16
+ entry: CityEntry,
17
+ signal: AbortSignal,
18
+ ): Promise<GeocodedLocation> => {
19
+ if (typeof entry.location === "string") {
20
+ const cached = resolvedCache.get(entry.location)
21
+ if (cached) return cached
22
+ const resolved = await resolveLocation(entry.location, signal)
23
+ resolvedCache.set(entry.location, resolved)
24
+ return resolved
25
+ }
26
+ return {
27
+ latitude: entry.location.latitude,
28
+ longitude: entry.location.longitude,
29
+ name: entry.location.name ?? "Unknown",
30
+ }
31
+ }
32
+
33
+ const uniqueCities = (): CityEntry[] => {
34
+ const byKey = new Map<string, CityEntry>()
35
+ for (const entry of cityRegistry.values()) {
36
+ const loc = entry.location
37
+ const key = typeof loc === "string" ? loc : cityKey(loc)
38
+ byKey.set(key, entry)
39
+ }
40
+ return [...byKey.values()]
41
+ }
42
+
43
+ const fetchAllCities = async (
44
+ cities: CityEntry[],
45
+ signal: AbortSignal,
46
+ ): Promise<WeatherStateSnapshot> => {
47
+ const byCity: Record<string, WeatherSnapshot> = {}
48
+ await Promise.all(
49
+ cities.map(async (entry) => {
50
+ const lookupKey =
51
+ typeof entry.location === "string"
52
+ ? entry.location
53
+ : cityKey(entry.location)
54
+ let resolved: GeocodedLocation
55
+ try {
56
+ resolved = await resolveEntryLocation(entry, signal)
57
+ } catch (err) {
58
+ byCity[lookupKey] = {
59
+ available: false,
60
+ units: entry.units,
61
+ description: err instanceof Error ? err.message : "geocoding failed",
62
+ }
63
+ return
64
+ }
65
+ try {
66
+ byCity[lookupKey] = await fetchWeather(resolved, entry.units, signal)
67
+ } catch (err) {
68
+ byCity[lookupKey] = {
69
+ available: false,
70
+ units: entry.units,
71
+ description: err instanceof Error ? err.message : "fetch failed",
72
+ }
73
+ }
74
+ }),
75
+ )
76
+ return { byCity }
77
+ }
78
+
79
+ export const globalService: AddonGlobalService = {
80
+ methods: {
81
+ registerCity: (
82
+ buttonId: unknown,
83
+ location: unknown,
84
+ units: unknown,
85
+ ): void => {
86
+ cityRegistry.set(String(buttonId), {
87
+ location: location as CityEntry["location"],
88
+ units: units as CityEntry["units"],
89
+ })
90
+ ctxRef?.poll("current")
91
+ },
92
+ refreshWeather: (): void => {
93
+ ctxRef?.poll("current")
94
+ },
95
+ unregisterCity: (buttonId: unknown): void => {
96
+ cityRegistry.delete(String(buttonId))
97
+ },
98
+ },
99
+ pollers: [
100
+ {
101
+ id: "current",
102
+ channel: "weather:current",
103
+ intervalMs: POLL_INTERVAL_MS,
104
+ poll: async (ctx: AddonServiceContext): Promise<WeatherStateSnapshot> => {
105
+ const cities = uniqueCities()
106
+ if (cities.length === 0) {
107
+ return { byCity: {} }
108
+ }
109
+ return fetchAllCities(cities, ctx.signal)
110
+ },
111
+ },
112
+ ],
113
+ onLoad: async (ctx: AddonServiceContext) => {
114
+ ctxRef = ctx
115
+ },
116
+ onUnload: () => {
117
+ ctxRef = undefined
118
+ cityRegistry.clear()
119
+ resolvedCache.clear()
120
+ },
121
+ }
@@ -0,0 +1,27 @@
1
+ import type {
2
+ AddonButtonServiceContext,
3
+ AddonButtonTypeService,
4
+ } from "@/addon/api"
5
+
6
+ import { configSchema, type ConfigSchema } from "./config"
7
+
8
+ const registerCity = (ctx: AddonButtonServiceContext<ConfigSchema>): void => {
9
+ const loc = ctx.config?.location
10
+ if (loc === undefined) return
11
+ ctx.methods["weather:registerCity"]?.(ctx.buttonId, loc, ctx.config.units)
12
+ }
13
+
14
+ const unregisterCity = (ctx: AddonButtonServiceContext<ConfigSchema>): void => {
15
+ ctx.methods["weather:unregisterCity"]?.(ctx.buttonId)
16
+ }
17
+
18
+ const refreshWeather = (ctx: AddonButtonServiceContext<ConfigSchema>): void => {
19
+ ctx.methods["weather:refreshWeather"]?.()
20
+ }
21
+
22
+ export default {
23
+ configSchema,
24
+ onMount: registerCity,
25
+ onTap: refreshWeather,
26
+ dispose: unregisterCity,
27
+ } satisfies AddonButtonTypeService<ConfigSchema>
@@ -0,0 +1,29 @@
1
+ import { z } from "zod"
2
+
3
+ export const WEATHER_DEFAULT_POLL_MS = 600_000
4
+
5
+ const WeatherLocationSchema = z
6
+ .object({
7
+ latitude: z.number().min(-90).max(90),
8
+ longitude: z.number().min(-180).max(180),
9
+ name: z.string().min(1).optional(),
10
+ })
11
+ .strict()
12
+
13
+ const WeatherButtonSchema = z
14
+ .object({
15
+ location: WeatherLocationSchema.optional(),
16
+ poll_interval_ms: z
17
+ .number()
18
+ .int()
19
+ .positive()
20
+ .optional()
21
+ .default(WEATHER_DEFAULT_POLL_MS),
22
+ units: z.enum(["metric", "imperial"]).optional().default("metric"),
23
+ })
24
+ .strict()
25
+
26
+ export const configSchema = WeatherButtonSchema
27
+ export type ConfigSchema = z.infer<typeof configSchema>
28
+ export type WeatherLocation = z.infer<typeof WeatherLocationSchema>
29
+ export type WeatherButtonConfig = z.infer<typeof WeatherButtonSchema>
@@ -0,0 +1,63 @@
1
+ import type { AddonFrontendButton } from "@/addon/api"
2
+ import { useAddonChannel } from "@/api/react"
3
+ import { IconLabelSurface, PaginatedSurface, type PaginatedPage } from "@/ui"
4
+ import { cityKey } from "../../provider/city-key"
5
+ import type {
6
+ WeatherSnapshot,
7
+ WeatherStateSnapshot,
8
+ } from "../../provider/types"
9
+ import type { ConfigSchema } from "./config"
10
+ import { type WeatherPageProps, weatherPageRenderers } from "./pages"
11
+
12
+ const AUTO_RETURN_MS = 10_000
13
+
14
+ const lookupKey = (loc: NonNullable<ConfigSchema["location"]>) =>
15
+ typeof loc === "string" ? loc : cityKey(loc)
16
+
17
+ const WeatherButtonFrontend: AddonFrontendButton<ConfigSchema> = ({
18
+ config,
19
+ gesture,
20
+ }) => {
21
+ const name =
22
+ typeof config?.location === "object"
23
+ ? config.location.name
24
+ : config?.location
25
+ const { data } = useAddonChannel<WeatherStateSnapshot>("weather:current")
26
+
27
+ const loc = config?.location
28
+ const snapshot: WeatherSnapshot | undefined =
29
+ loc !== undefined && data?.byCity !== undefined
30
+ ? data.byCity[lookupKey(loc)]
31
+ : undefined
32
+
33
+ if (!snapshot?.available) {
34
+ return <IconLabelSurface source="icon://cloud-off" label="---" />
35
+ }
36
+
37
+ const unitTemp = snapshot.units === "imperial" ? "°F" : "°C"
38
+ const unitWind = snapshot.units === "imperial" ? "mph" : "km/h"
39
+
40
+ const weatherProps: WeatherPageProps = {
41
+ snapshot,
42
+ unitTemp,
43
+ unitWind,
44
+ city: name,
45
+ }
46
+
47
+ const pages: PaginatedPage<WeatherPageProps>[] = weatherPageRenderers.map(
48
+ (render) => ({
49
+ render,
50
+ config: weatherProps,
51
+ }),
52
+ )
53
+
54
+ return (
55
+ <PaginatedSurface
56
+ pages={pages}
57
+ gesture={gesture}
58
+ autoReturnMs={AUTO_RETURN_MS}
59
+ />
60
+ )
61
+ }
62
+
63
+ export default WeatherButtonFrontend
@@ -0,0 +1,88 @@
1
+ // ponytail: SVG icons are inlined as data URIs to avoid .svg imports.
2
+ // The daemon (tsx runtime) evaluates this module via index.ts → frontend.tsx →
3
+ // pages.tsx → here, but it never reads ICON_URLS. Only the Vite frontend does,
4
+ // via React render — so we don't need any .svg imports at all.
5
+
6
+ type IconName =
7
+ | "clear-day"
8
+ | "mostly-clear-day"
9
+ | "partly-cloudy-day"
10
+ | "overcast"
11
+ | "fog"
12
+ | "drizzle"
13
+ | "rain"
14
+ | "sleet"
15
+ | "snow"
16
+ | "thunderstorms"
17
+ | "thunderstorms-hail"
18
+
19
+ const ICON_URLS: Record<IconName, string> = {
20
+ "clear-day":
21
+ "data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%20128%20128%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Cg%20id%3D%22clear-day%22%3E%0A%3Cg%20id%3D%22Sun%22%3E%0A%3Ccircle%20id%3D%22Core%22%20cx%3D%2264%22%20cy%3D%2263.9999%22%20r%3D%2219.5%22%20fill%3D%22url%28%23paint0_linear_1802_5186%29%22%20stroke%3D%22%23F8AF18%22%2F%3E%0A%3Cg%20id%3D%22Rays%22%3E%0A%3Cpath%20d%3D%22M61%2019C61%2017.3431%2062.3431%2016%2064%2016C65.6568%2016%2067%2017.3431%2067%2019V33C67%2034.6569%2065.6568%2036%2064%2036C62.3431%2036%2061%2034.6569%2061%2033V19Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M93.6985%2030.0589C94.87%2028.8873%2096.7696%2028.8873%2097.9411%2030.0589C99.1127%2031.2304%2099.1127%2033.1299%2097.9411%2034.3015L88.0416%2044.201C86.8701%2045.3726%2084.9706%2045.3726%2083.799%2044.201C82.6274%2043.0294%2082.6274%2041.1299%2083.799%2039.9584L93.6985%2030.0589Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M109%2061C110.657%2061%20112%2062.3432%20112%2064C112%2065.6569%20110.657%2067%20109%2067H95C93.3431%2067%2092%2065.6569%2092%2064C92%2062.3432%2093.3431%2061%2095%2061H109Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M97.9411%2093.6985C99.1127%2094.8701%2099.1127%2096.7696%2097.9411%2097.9411C96.7696%2099.1127%2094.8701%2099.1127%2093.6985%2097.9411L83.799%2088.0416C82.6274%2086.8701%2082.6274%2084.9706%2083.799%2083.799C84.9706%2082.6274%2086.8701%2082.6274%2088.0416%2083.799L97.9411%2093.6985Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M61%2095C61%2093.3431%2062.3431%2092%2064%2092C65.6568%2092%2067%2093.3431%2067%2095V109C67%20110.657%2065.6568%20112%2064%20112C62.3431%20112%2061%20110.657%2061%20109V95Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M39.9584%2083.799C41.1299%2082.6274%2043.0294%2082.6274%2044.201%2083.799C45.3726%2084.9706%2045.3726%2086.8701%2044.201%2088.0416L34.3015%2097.9411C33.1299%2099.1127%2031.2304%2099.1127%2030.0589%2097.9411C28.8873%2096.7696%2028.8873%2094.87%2030.0589%2093.6985L39.9584%2083.799Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M33%2061C34.6569%2061%2036%2062.3431%2036%2064C36%2065.6568%2034.6569%2067%2033%2067H19C17.3431%2067%2016%2065.6568%2016%2064C16%2062.3431%2017.3431%2061%2019%2061H33Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M44.201%2039.9584C45.3726%2041.1299%2045.3726%2043.0294%2044.201%2044.201C43.0294%2045.3726%2041.1299%2045.3726%2039.9584%2044.201L30.0589%2034.3015C28.8873%2033.1299%2028.8873%2031.2305%2030.0589%2030.0589C31.2305%2028.8873%2033.1299%2028.8873%2034.3015%2030.0589L44.201%2039.9584Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_1802_5186%22%20x1%3D%2264%22%20y1%3D%2243.9999%22%20x2%3D%2264%22%20y2%3D%2283.9999%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23FBBF24%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23F8AF18%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E",
22
+ "mostly-clear-day":
23
+ "data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%20128%20128%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Cg%20id%3D%22mostly-clear-day%22%20clip-path%3D%22url%28%23clip0_1858_8340%29%22%3E%0A%3Cg%20id%3D%22Sky%22%3E%0A%3Cg%20id%3D%22Sun%22%3E%0A%3Ccircle%20id%3D%22Core%22%20cx%3D%2250%22%20cy%3D%2262%22%20r%3D%2212.5%22%20fill%3D%22url%28%23paint0_linear_1858_8340%29%22%20stroke%3D%22%23F8AF18%22%2F%3E%0A%3Cg%20id%3D%22Rays%22%3E%0A%3Cpath%20d%3D%22M48%2032C48%2030.8954%2048.8954%2030%2050%2030C51.1046%2030%2052%2030.8954%2052%2032V41.3333C52%2042.4379%2051.1046%2043.3333%2050%2043.3333C48.8954%2043.3333%2048%2042.4379%2048%2041.3333V32Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M69.799%2039.3726C70.58%2038.5915%2071.8464%2038.5915%2072.6274%2039.3726C73.4085%2040.1536%2073.4085%2041.42%2072.6274%2042.201L66.0278%2048.8007C65.2467%2049.5817%2063.9804%2049.5817%2063.1993%2048.8007C62.4183%2048.0196%2062.4183%2046.7533%2063.1993%2045.9722L69.799%2039.3726Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M80%2060C81.1046%2060%2082%2060.8954%2082%2062C82%2063.1046%2081.1046%2064%2080%2064H70.6667C69.5621%2064%2068.6667%2063.1046%2068.6667%2062C68.6667%2060.8954%2069.5621%2060%2070.6667%2060H80Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M72.6274%2081.799C73.4085%2082.58%2073.4085%2083.8464%2072.6274%2084.6274C71.8464%2085.4085%2070.58%2085.4085%2069.799%2084.6274L63.1993%2078.0278C62.4183%2077.2467%2062.4183%2075.9804%2063.1993%2075.1993C63.9804%2074.4183%2065.2467%2074.4183%2066.0278%2075.1993L72.6274%2081.799Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M48%2082.6667C48%2081.5621%2048.8954%2080.6667%2050%2080.6667C51.1046%2080.6667%2052%2081.5621%2052%2082.6667V92C52%2093.1046%2051.1046%2094%2050%2094C48.8954%2094%2048%2093.1046%2048%2092V82.6667Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M33.9722%2075.1993C34.7533%2074.4183%2036.0196%2074.4183%2036.8007%2075.1993C37.5817%2075.9804%2037.5817%2077.2467%2036.8007%2078.0278L30.201%2084.6274C29.42%2085.4085%2028.1536%2085.4085%2027.3726%2084.6274C26.5915%2083.8464%2026.5915%2082.58%2027.3726%2081.799L33.9722%2075.1993Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M29.3333%2060C30.4379%2060%2031.3333%2060.8954%2031.3333%2062C31.3333%2063.1046%2030.4379%2064%2029.3333%2064H20C18.8954%2064%2018%2063.1046%2018%2062C18%2060.8954%2018.8954%2060%2020%2060H29.3333Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M36.8007%2045.9722C37.5817%2046.7533%2037.5817%2048.0196%2036.8007%2048.8007C36.0196%2049.5817%2034.7533%2049.5817%2033.9722%2048.8007L27.3726%2042.201C26.5915%2041.42%2026.5915%2040.1536%2027.3726%2039.3726C28.1536%2038.5915%2029.42%2038.5915%2030.201%2039.3726L36.8007%2045.9722Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cg%20id%3D%22Clouds%22%3E%0A%3Cg%20id%3D%22Cloud%22%3E%0A%3Cpath%20id%3D%22Cloud_2%22%20d%3D%22M58.0142%2059.8887C61.3363%2054.3602%2068.3655%2051.9679%2074.3082%2054.5254C80.2917%2057.1004%2083.5145%2063.9169%2081.9859%2070.2227L81.8297%2070.8701L82.4947%2070.8408C87.4096%2070.6202%2091.4996%2074.7706%2091.4996%2079.6602C91.4994%2084.3966%2087.6454%2088.499%2082.8834%2088.499C70.5117%2088.4877%2058.1362%2088.5%2045.7672%2088.5C40.9829%2088.5012%2036.9766%2084.6313%2036.5406%2079.8877C36.104%2075.1358%2039.3371%2070.5714%2044.0406%2069.6572L44.5181%2069.5635L44.438%2069.084C43.8797%2065.7473%2045.2907%2062.2583%2048.063%2060.3203C50.7976%2058.4089%2054.4855%2058.3015%2057.3228%2060.0566L57.7535%2060.3223L58.0142%2059.8887Z%22%20fill%3D%22url%28%23paint1_linear_1858_8340%29%22%20stroke%3D%22%23E6EFFC%22%20stroke-miterlimit%3D%2210%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_1858_8340%22%20x1%3D%2250%22%20y1%3D%2249%22%20x2%3D%2250%22%20y2%3D%2275%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23FBBF24%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23F8AF18%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3ClinearGradient%20id%3D%22paint1_linear_1858_8340%22%20x1%3D%2264.0008%22%20y1%3D%2253%22%20x2%3D%2264.0008%22%20y2%3D%2289%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23F3F7FE%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23E6EFFC%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CclipPath%20id%3D%22clip0_1858_8340%22%3E%0A%3Crect%20width%3D%22128%22%20height%3D%22128%22%20fill%3D%22white%22%2F%3E%0A%3C%2FclipPath%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E",
24
+ "partly-cloudy-day":
25
+ "data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%20128%20128%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Cg%20id%3D%22partly-cloudy-day%22%20clip-path%3D%22url%28%23clip0_1858_8241%29%22%3E%0A%3Cg%20id%3D%22Sky%22%3E%0A%3Cg%20id%3D%22Sun%22%3E%0A%3Ccircle%20id%3D%22Core%22%20cx%3D%2239%22%20cy%3D%2251%22%20r%3D%228.5%22%20fill%3D%22url%28%23paint0_linear_1858_8241%29%22%20stroke%3D%22%23F8AF18%22%2F%3E%0A%3Cg%20id%3D%22Rays%22%3E%0A%3Cpath%20d%3D%22M37.6875%2031.3125C37.6875%2030.5876%2038.2751%2030%2039%2030C39.7249%2030%2040.3125%2030.5876%2040.3125%2031.3125V37.4375C40.3125%2038.1624%2039.7249%2038.75%2039%2038.75C38.2751%2038.75%2037.6875%2038.1624%2037.6875%2037.4375V31.3125Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M51.9931%2036.1508C52.5056%2035.6382%2053.3367%2035.6382%2053.8492%2036.1508C54.3618%2036.6633%2054.3618%2037.4943%2053.8492%2038.0069L49.5182%2042.3379C49.0056%2042.8505%2048.1746%2042.8505%2047.6621%2042.3379C47.1495%2041.8254%2047.1495%2040.9944%2047.6621%2040.4818L51.9931%2036.1508Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M58.6875%2049.6875C59.4124%2049.6875%2060%2050.2751%2060%2051C60%2051.7249%2059.4124%2052.3125%2058.6875%2052.3125H52.5625C51.8376%2052.3125%2051.25%2051.7249%2051.25%2051C51.25%2050.2751%2051.8376%2049.6875%2052.5625%2049.6875H58.6875Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M53.8492%2063.9931C54.3618%2064.5057%2054.3618%2065.3367%2053.8492%2065.8492C53.3367%2066.3618%2052.5056%2066.3618%2051.9931%2065.8492L47.6621%2061.5182C47.1495%2061.0057%2047.1495%2060.1746%2047.6621%2059.6621C48.1746%2059.1495%2049.0057%2059.1495%2049.5182%2059.6621L53.8492%2063.9931Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M37.6875%2064.5625C37.6875%2063.8376%2038.2751%2063.25%2039%2063.25C39.7249%2063.25%2040.3125%2063.8376%2040.3125%2064.5625V70.6875C40.3125%2071.4124%2039.7249%2072%2039%2072C38.2751%2072%2037.6875%2071.4124%2037.6875%2070.6875V64.5625Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M28.4818%2059.6621C28.9943%2059.1495%2029.8254%2059.1495%2030.3379%2059.6621C30.8505%2060.1746%2030.8505%2061.0056%2030.3379%2061.5182L26.0069%2065.8492C25.4943%2066.3618%2024.6633%2066.3618%2024.1508%2065.8492C23.6382%2065.3367%2023.6382%2064.5056%2024.1508%2063.9931L28.4818%2059.6621Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M25.4375%2049.6875C26.1624%2049.6875%2026.75%2050.2751%2026.75%2051C26.75%2051.7249%2026.1624%2052.3125%2025.4375%2052.3125H19.3125C18.5876%2052.3125%2018%2051.7249%2018%2051C18%2050.2751%2018.5876%2049.6875%2019.3125%2049.6875H25.4375Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3Cpath%20d%3D%22M30.3379%2040.4818C30.8505%2040.9944%2030.8505%2041.8254%2030.3379%2042.3379C29.8254%2042.8505%2028.9944%2042.8505%2028.4818%2042.3379L24.1508%2038.0069C23.6382%2037.4944%2023.6382%2036.6633%2024.1508%2036.1508C24.6633%2035.6382%2025.4944%2035.6382%2026.0069%2036.1508L30.3379%2040.4818Z%22%20fill%3D%22%23F8AF18%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cg%20id%3D%22Clouds%22%3E%0A%3Cg%20id%3D%22Cloud%22%3E%0A%3Cpath%20id%3D%22Cloud_2%22%20d%3D%22M55.2623%2048.4746C60.1227%2040.6111%2070.2975%2037.38%2078.8151%2040.9434C87.3214%2044.5023%2092.138%2054.0026%2089.903%2062.9648L89.7418%2063.6143L90.4108%2063.585C97.4203%2063.2791%20103.5%2068.9917%20103.5%2076.0283C103.5%2082.8395%2097.7717%2088.4997%2090.9772%2088.5H37.9537C31.1275%2088.5018%2025.2029%2083.1709%2024.5592%2076.3604C23.9158%2069.5518%2028.7369%2063.2124%2035.443%2061.9453L35.9264%2061.8535L35.8424%2061.3691C35.0256%2056.6239%2037.1258%2051.7168%2041.1051%2049.0127C45.0951%2046.3014%2050.4459%2046.1537%2054.5797%2048.6396L55.0026%2048.8945L55.2623%2048.4746Z%22%20fill%3D%22url%28%23paint1_linear_1858_8241%29%22%20stroke%3D%22%23E6EFFC%22%20stroke-miterlimit%3D%2210%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_1858_8241%22%20x1%3D%2239%22%20y1%3D%2242%22%20x2%3D%2239%22%20y2%3D%2260%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23FBBF24%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23F8AF18%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3ClinearGradient%20id%3D%22paint1_linear_1858_8241%22%20x1%3D%2264.0008%22%20y1%3D%2239%22%20x2%3D%2264.0008%22%20y2%3D%2289%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23F3F7FE%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23E6EFFC%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CclipPath%20id%3D%22clip0_1858_8241%22%3E%0A%3Crect%20width%3D%22128%22%20height%3D%22128%22%20fill%3D%22white%22%2F%3E%0A%3C%2FclipPath%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E",
26
+ overcast:
27
+ "data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%20128%20128%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Cg%20id%3D%22overcast%22%20clip-path%3D%22url%28%23clip0_1858_8153%29%22%3E%0A%3Cg%20id%3D%22Sky%22%3E%0A%3Cg%20id%3D%22Clouds%22%3E%0A%3Cg%20id%3D%22Secondary%20Cloud%22%3E%0A%3Cpath%20id%3D%22Cloud%22%20d%3D%22M83.8392%2048.6934C86.2444%2044.9584%2091.2146%2043.529%2095.3177%2045.1768C99.3609%2046.8006%20101.814%2051.1888%20100.71%2055.4365L100.54%2056.0898L101.215%2056.0615C104.496%2055.924%20107.5%2058.4646%20107.5%2061.7744C107.5%2064.9759%20104.669%2067.4999%20101.489%2067.5H74.9769C71.7679%2067.5008%2068.8449%2065.1182%2068.5287%2061.9072C68.2136%2058.7068%2070.6168%2055.8414%2073.764%2055.2705L74.2552%2055.1816L74.1674%2054.6904C73.7734%2052.4931%2074.8117%2050.2493%2076.6849%2049.0273C78.6105%2047.7713%2081.177%2047.7069%2083.1683%2048.8564L83.5814%2049.0938L83.8392%2048.6934Z%22%20fill%3D%22url%28%23paint0_linear_1858_8153%29%22%20stroke%3D%22%2394A3B8%22%20stroke-miterlimit%3D%2210%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%20id%3D%22Cloud_2%22%3E%0A%3Cpath%20id%3D%22Cloud_3%22%20d%3D%22M55.2623%2048.4746C60.1227%2040.6111%2070.2975%2037.38%2078.8151%2040.9434C87.3214%2044.5023%2092.138%2054.0026%2089.903%2062.9648L89.7418%2063.6143L90.4108%2063.585C97.4203%2063.2791%20103.5%2068.9917%20103.5%2076.0283C103.5%2082.8395%2097.7717%2088.4997%2090.9772%2088.5H37.9537C31.1275%2088.5018%2025.2029%2083.1709%2024.5592%2076.3604C23.9158%2069.5518%2028.7369%2063.2124%2035.443%2061.9453L35.9264%2061.8535L35.8424%2061.3691C35.0256%2056.6239%2037.1258%2051.7168%2041.1051%2049.0127C45.0951%2046.3014%2050.4459%2046.1537%2054.5797%2048.6396L55.0026%2048.8945L55.2623%2048.4746Z%22%20fill%3D%22url%28%23paint1_linear_1858_8153%29%22%20stroke%3D%22%23E6EFFC%22%20stroke-miterlimit%3D%2210%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_1858_8153%22%20x1%3D%2288.0002%22%20y1%3D%2244%22%20x2%3D%2288.0002%22%20y2%3D%2268%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23B0BCCD%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2394A3B8%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3ClinearGradient%20id%3D%22paint1_linear_1858_8153%22%20x1%3D%2264.0008%22%20y1%3D%2239%22%20x2%3D%2264.0008%22%20y2%3D%2289%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23F3F7FE%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23E6EFFC%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CclipPath%20id%3D%22clip0_1858_8153%22%3E%0A%3Crect%20width%3D%22128%22%20height%3D%22128%22%20fill%3D%22white%22%2F%3E%0A%3C%2FclipPath%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E",
28
+ fog: "data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%20128%20128%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Cg%20id%3D%22fog%22%20clip-path%3D%22url%28%23clip0_1858_9374%29%22%3E%0A%3Cg%20id%3D%22Sky%22%3E%0A%3Cg%20id%3D%22Clouds%22%3E%0A%3Cg%20id%3D%22Cloud%22%3E%0A%3Cpath%20id%3D%22Cloud_2%22%20d%3D%22M55.2623%2048.4746C60.1227%2040.6111%2070.2975%2037.38%2078.8151%2040.9434C87.3214%2044.5023%2092.138%2054.0026%2089.903%2062.9648L89.7418%2063.6143L90.4108%2063.585C97.4203%2063.2791%20103.5%2068.9917%20103.5%2076.0283C103.5%2082.8395%2097.7717%2088.4997%2090.9772%2088.5H37.9537C31.1275%2088.5018%2025.2029%2083.1709%2024.5592%2076.3604C23.9158%2069.5518%2028.7369%2063.2124%2035.443%2061.9453L35.9264%2061.8535L35.8424%2061.3691C35.0256%2056.6239%2037.1258%2051.7168%2041.1051%2049.0127C45.0951%2046.3014%2050.4459%2046.1537%2054.5797%2048.6396L55.0026%2048.8945L55.2623%2048.4746Z%22%20fill%3D%22url%28%23paint0_linear_1858_9374%29%22%20stroke%3D%22%23E6EFFC%22%20stroke-miterlimit%3D%2210%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cg%20id%3D%22Precipitation%22%3E%0A%3Cpath%20id%3D%22Line%202%22%20d%3D%22M40%2095H88%22%20stroke%3D%22%23E2E8F0%22%20stroke-width%3D%223%22%20stroke-miterlimit%3D%2210%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20id%3D%22Line%201%22%20d%3D%22M40%20103H88%22%20stroke%3D%22%23E2E8F0%22%20stroke-width%3D%223%22%20stroke-miterlimit%3D%2210%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_1858_9374%22%20x1%3D%2264.0008%22%20y1%3D%2239%22%20x2%3D%2264.0008%22%20y2%3D%2289%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23F3F7FE%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23E6EFFC%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CclipPath%20id%3D%22clip0_1858_9374%22%3E%0A%3Crect%20width%3D%22128%22%20height%3D%22128%22%20fill%3D%22white%22%2F%3E%0A%3C%2FclipPath%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E",
29
+ drizzle:
30
+ "data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%20128%20128%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Cg%20id%3D%22drizzle%22%20clip-path%3D%22url%28%23clip0_1858_8512%29%22%3E%0A%3Cg%20id%3D%22Sky%22%3E%0A%3Cg%20id%3D%22Clouds%22%3E%0A%3Cg%20id%3D%22Cloud%22%3E%0A%3Cpath%20id%3D%22Cloud_2%22%20d%3D%22M55.2623%2048.4746C60.1227%2040.6111%2070.2975%2037.38%2078.8151%2040.9434C87.3214%2044.5023%2092.138%2054.0026%2089.903%2062.9648L89.7418%2063.6143L90.4108%2063.585C97.4203%2063.2791%20103.5%2068.9917%20103.5%2076.0283C103.5%2082.8395%2097.7717%2088.4997%2090.9772%2088.5H37.9537C31.1275%2088.5018%2025.2029%2083.1709%2024.5592%2076.3604C23.9158%2069.5518%2028.7369%2063.2124%2035.443%2061.9453L35.9264%2061.8535L35.8424%2061.3691C35.0256%2056.6239%2037.1258%2051.7168%2041.1051%2049.0127C45.0951%2046.3014%2050.4459%2046.1537%2054.5797%2048.6396L55.0026%2048.8945L55.2623%2048.4746Z%22%20fill%3D%22url%28%23paint0_linear_1858_8512%29%22%20stroke%3D%22%23E6EFFC%22%20stroke-miterlimit%3D%2210%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cg%20id%3D%22Precipitation%22%3E%0A%3Cg%20id%3D%22Raindrops%22%3E%0A%3Cpath%20id%3D%22Raindrop%201%22%20d%3D%22M52%2087V90%22%20stroke%3D%22%230A5AD4%22%20stroke-width%3D%224%22%20stroke-linecap%3D%22round%22%20transform%3D%22translate%280%2C%208%29%22%2F%3E%0A%3Cpath%20id%3D%22Raindrop%202%22%20d%3D%22M64%2087V90%22%20stroke%3D%22%230A5AD4%22%20stroke-width%3D%224%22%20stroke-linecap%3D%22round%22%20transform%3D%22translate%280%2C%200%29%22%2F%3E%0A%3Cpath%20id%3D%22Raindrop%203%22%20d%3D%22M76%2087V90%22%20stroke%3D%22%230A5AD4%22%20stroke-width%3D%224%22%20stroke-linecap%3D%22round%22%20transform%3D%22translate%280%2C%208%29%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_1858_8512%22%20x1%3D%2264.0008%22%20y1%3D%2239%22%20x2%3D%2264.0008%22%20y2%3D%2289%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23F3F7FE%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23E6EFFC%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CclipPath%20id%3D%22clip0_1858_8512%22%3E%0A%3Crect%20width%3D%22128%22%20height%3D%22128%22%20fill%3D%22white%22%2F%3E%0A%3C%2FclipPath%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E",
31
+ rain: "data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%20128%20128%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Cg%20id%3D%22rain%22%20clip-path%3D%22url%28%23clip0_1858_8370%29%22%3E%0A%3Cg%20id%3D%22Sky%22%3E%0A%3Cg%20id%3D%22Clouds%22%3E%0A%3Cg%20id%3D%22Cloud%22%3E%0A%3Cpath%20id%3D%22Cloud_2%22%20d%3D%22M55.2623%2048.4746C60.1227%2040.6111%2070.2975%2037.38%2078.8151%2040.9434C87.3214%2044.5023%2092.138%2054.0026%2089.903%2062.9648L89.7418%2063.6143L90.4108%2063.585C97.4203%2063.2791%20103.5%2068.9917%20103.5%2076.0283C103.5%2082.8395%2097.7717%2088.4997%2090.9772%2088.5H37.9537C31.1275%2088.5018%2025.2029%2083.1709%2024.5592%2076.3604C23.9158%2069.5518%2028.7369%2063.2124%2035.443%2061.9453L35.9264%2061.8535L35.8424%2061.3691C35.0256%2056.6239%2037.1258%2051.7168%2041.1051%2049.0127C45.0951%2046.3014%2050.4459%2046.1537%2054.5797%2048.6396L55.0026%2048.8945L55.2623%2048.4746Z%22%20fill%3D%22url%28%23paint0_linear_1858_8370%29%22%20stroke%3D%22%23E6EFFC%22%20stroke-miterlimit%3D%2210%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cg%20id%3D%22Precipitation%22%3E%0A%3Cg%20id%3D%22Raindrops%22%3E%0A%3Cpath%20id%3D%22Raindrop%201%22%20d%3D%22M52%2083V95%22%20stroke%3D%22%230A5AD4%22%20stroke-width%3D%224%22%20stroke-linecap%3D%22round%22%20transform%3D%22translate%280%2C%208%29%22%2F%3E%0A%3Cpath%20id%3D%22Raindrop%202%22%20d%3D%22M64%2083V95%22%20stroke%3D%22%230A5AD4%22%20stroke-width%3D%224%22%20stroke-linecap%3D%22round%22%20transform%3D%22translate%280%2C%200%29%22%2F%3E%0A%3Cpath%20id%3D%22Raindrop%203%22%20d%3D%22M76%2083V95%22%20stroke%3D%22%230A5AD4%22%20stroke-width%3D%224%22%20stroke-linecap%3D%22round%22%20transform%3D%22translate%280%2C%208%29%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_1858_8370%22%20x1%3D%2264.0008%22%20y1%3D%2239%22%20x2%3D%2264.0008%22%20y2%3D%2289%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23F3F7FE%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23E6EFFC%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CclipPath%20id%3D%22clip0_1858_8370%22%3E%0A%3Crect%20width%3D%22128%22%20height%3D%22128%22%20fill%3D%22white%22%2F%3E%0A%3C%2FclipPath%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E",
32
+ sleet:
33
+ "data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%20128%20128%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Cg%20id%3D%22sleet%22%20clip-path%3D%22url%28%23clip0_1858_9090%29%22%3E%0A%3Cg%20id%3D%22Sky%22%3E%0A%3Cg%20id%3D%22Clouds%22%3E%0A%3Cg%20id%3D%22Cloud%22%3E%0A%3Cpath%20id%3D%22Cloud_2%22%20d%3D%22M55.2623%2048.4746C60.1227%2040.6111%2070.2975%2037.38%2078.8151%2040.9434C87.3214%2044.5023%2092.138%2054.0026%2089.903%2062.9648L89.7418%2063.6143L90.4108%2063.585C97.4203%2063.2791%20103.5%2068.9917%20103.5%2076.0283C103.5%2082.8395%2097.7717%2088.4997%2090.9772%2088.5H37.9537C31.1275%2088.5018%2025.2029%2083.1709%2024.5592%2076.3604C23.9158%2069.5518%2028.7369%2063.2124%2035.443%2061.9453L35.9264%2061.8535L35.8424%2061.3691C35.0256%2056.6239%2037.1258%2051.7168%2041.1051%2049.0127C45.0951%2046.3014%2050.4459%2046.1537%2054.5797%2048.6396L55.0026%2048.8945L55.2623%2048.4746Z%22%20fill%3D%22url%28%23paint0_linear_1858_9090%29%22%20stroke%3D%22%23E6EFFC%22%20stroke-miterlimit%3D%2210%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cg%20id%3D%22Precipitation%22%3E%0A%3Cg%20id%3D%22Snowflakes%22%3E%0A%3Cpath%20id%3D%22Snowflake%201%22%20d%3D%22M52.5781%2090.366L51.3735%2089.6775C51.4794%2089.2326%2051.4786%2088.7687%2051.3708%2088.3241L52.5781%2087.6345C52.6738%2087.5805%2052.7577%2087.5079%2052.8252%2087.421C52.8926%2087.3342%2052.9423%2087.2347%2052.9711%2087.1284C52.9998%2087.0221%2053.0071%2086.9112%2052.9926%2086.802C52.9782%2086.6928%2052.9422%2086.5876%2052.8868%2086.4926C52.7732%2086.2998%2052.5886%2086.1597%2052.3728%2086.1025C52.157%2086.0452%2051.9276%2086.0754%2051.7339%2086.1866L50.5278%2086.8763C50.1931%2086.5586%2049.7868%2086.3264%2049.3437%2086.1995V84.8202C49.3368%2084.6003%2049.245%2084.3918%2049.0875%2084.2387C48.93%2084.0856%2048.7192%2084%2048.4998%2084C48.2805%2084%2048.0699%2084.0856%2047.9124%2084.2387C47.7548%2084.3918%2047.6628%2084.6003%2047.656%2084.8202V86.1995C47.214%2086.3289%2046.8081%2086.5598%2046.4706%2086.874L45.2662%2086.1853C45.0724%2086.0742%2044.8428%2086.044%2044.627%2086.1013C44.4113%2086.1585%2044.2267%2086.2986%2044.113%2086.4913C44.0576%2086.5864%2044.0217%2086.6916%2044.0072%2086.8007C43.9928%2086.9099%2044%2087.0209%2044.0288%2087.1271C44.0575%2087.2334%2044.1072%2087.3329%2044.1747%2087.4198C44.2421%2087.5067%2044.326%2087.5792%2044.4217%2087.6332L45.6264%2088.3216C45.5204%2088.7666%2045.5213%2089.2305%2045.629%2089.675L44.4217%2090.3647C44.326%2090.4187%2044.2421%2090.4912%2044.1747%2090.5781C44.1072%2090.665%2044.0575%2090.7645%2044.0288%2090.8708C44%2090.9771%2043.9928%2091.088%2044.0072%2091.1972C44.0217%2091.3063%2044.0576%2091.4115%2044.113%2091.5066C44.2267%2091.6992%2044.4113%2091.8392%2044.627%2091.8965C44.8428%2091.9537%2045.0724%2091.9236%2045.2662%2091.8126L46.4721%2091.1229C46.8063%2091.4409%2047.2128%2091.6726%2047.6562%2091.7979V93.1798C47.6631%2093.3997%2047.755%2093.6082%2047.9126%2093.7613C48.0701%2093.9144%2048.2807%2094%2048.5%2094C48.7194%2094%2048.9302%2093.9144%2049.0877%2093.7613C49.2452%2093.6082%2049.337%2093.3997%2049.3439%2093.1798V91.7975C49.7853%2091.6683%2050.1907%2091.4378%2050.5278%2091.1242L51.7341%2091.8138C51.9278%2091.9248%2052.1573%2091.955%2052.373%2091.8977C52.5888%2091.8405%2052.7733%2091.7005%2052.887%2091.5079C52.9424%2091.4128%2052.9784%2091.3076%2052.9928%2091.1984C53.0073%2091.0892%2052.9998%2090.9783%2052.9711%2090.872C52.9423%2090.7657%2052.8929%2090.6662%2052.8254%2090.5793C52.7579%2090.4925%2052.6738%2090.4199%2052.5781%2090.366ZM47.8664%2090.0861C47.7229%2090.005%2047.5968%2089.8961%2047.4956%2089.7657C47.3944%2089.6353%2047.3202%2089.486%2047.2771%2089.3266C47.2339%2089.1671%2047.2228%2089.0007%2047.2443%2088.8369C47.2658%2088.6731%2047.3197%2088.5152%2047.4026%2088.3724C47.5735%2088.084%2047.8503%2087.8743%2048.1736%2087.7883C48.497%2087.7023%2048.8411%2087.747%2049.1321%2087.9126C49.2756%2087.9938%2049.4016%2088.1027%2049.5028%2088.2331C49.604%2088.3635%2049.6782%2088.5127%2049.7214%2088.6722C49.7645%2088.8316%2049.7757%2088.9981%2049.7541%2089.1619C49.7326%2089.3257%2049.6787%2089.4836%2049.5958%2089.6263C49.425%2089.9149%2049.1482%2090.1247%2048.8248%2090.2108C48.5014%2090.2969%2048.1574%2090.2523%2047.8664%2090.0867V90.0861Z%22%20fill%3D%22%2386C3DB%22%20transform%3D%22translate%280%2C%200%29%22%2F%3E%0A%3Cpath%20id%3D%22Snowflake%202%22%20d%3D%22M67.5781%2090.366L66.3735%2089.6775C66.4794%2089.2326%2066.4786%2088.7687%2066.3708%2088.3241L67.5781%2087.6345C67.6738%2087.5805%2067.7577%2087.5079%2067.8252%2087.421C67.8926%2087.3342%2067.9423%2087.2347%2067.9711%2087.1284C67.9998%2087.0221%2068.0071%2086.9112%2067.9926%2086.802C67.9782%2086.6928%2067.9422%2086.5876%2067.8868%2086.4926C67.7732%2086.2998%2067.5886%2086.1597%2067.3728%2086.1025C67.157%2086.0452%2066.9276%2086.0754%2066.7339%2086.1866L65.5278%2086.8763C65.1931%2086.5586%2064.7868%2086.3264%2064.3437%2086.1995V84.8202C64.3368%2084.6003%2064.245%2084.3918%2064.0875%2084.2387C63.93%2084.0856%2063.7192%2084%2063.4998%2084C63.2805%2084%2063.0699%2084.0856%2062.9124%2084.2387C62.7548%2084.3918%2062.6628%2084.6003%2062.656%2084.8202V86.1995C62.214%2086.3289%2061.8081%2086.5598%2061.4706%2086.874L60.2662%2086.1853C60.0724%2086.0742%2059.8428%2086.044%2059.627%2086.1013C59.4113%2086.1585%2059.2267%2086.2986%2059.113%2086.4913C59.0576%2086.5864%2059.0217%2086.6916%2059.0072%2086.8007C58.9928%2086.9099%2059%2087.0209%2059.0288%2087.1271C59.0575%2087.2334%2059.1072%2087.3329%2059.1747%2087.4198C59.2421%2087.5067%2059.326%2087.5792%2059.4217%2087.6332L60.6264%2088.3216C60.5204%2088.7666%2060.5213%2089.2305%2060.629%2089.675L59.4217%2090.3647C59.326%2090.4187%2059.2421%2090.4912%2059.1747%2090.5781C59.1072%2090.665%2059.0575%2090.7645%2059.0288%2090.8708C59%2090.9771%2058.9928%2091.088%2059.0072%2091.1972C59.0217%2091.3063%2059.0576%2091.4115%2059.113%2091.5066C59.2267%2091.6992%2059.4113%2091.8392%2059.627%2091.8965C59.8428%2091.9537%2060.0724%2091.9236%2060.2662%2091.8126L61.4721%2091.1229C61.8063%2091.4409%2062.2128%2091.6726%2062.6562%2091.7979V93.1798C62.6631%2093.3997%2062.755%2093.6082%2062.9126%2093.7613C63.0701%2093.9144%2063.2807%2094%2063.5%2094C63.7194%2094%2063.9302%2093.9144%2064.0877%2093.7613C64.2452%2093.6082%2064.337%2093.3997%2064.3439%2093.1798V91.7975C64.7853%2091.6683%2065.1907%2091.4378%2065.5278%2091.1242L66.7341%2091.8138C66.9278%2091.9248%2067.1573%2091.955%2067.373%2091.8977C67.5888%2091.8405%2067.7733%2091.7005%2067.887%2091.5079C67.9424%2091.4128%2067.9784%2091.3076%2067.9928%2091.1984C68.0073%2091.0892%2067.9998%2090.9783%2067.9711%2090.872C67.9423%2090.7657%2067.8929%2090.6662%2067.8254%2090.5793C67.7579%2090.4925%2067.6738%2090.4199%2067.5781%2090.366ZM62.8664%2090.0861C62.7229%2090.005%2062.5968%2089.8961%2062.4956%2089.7657C62.3944%2089.6353%2062.3202%2089.486%2062.2771%2089.3266C62.2339%2089.1671%2062.2228%2089.0007%2062.2443%2088.8369C62.2658%2088.6731%2062.3197%2088.5152%2062.4026%2088.3724C62.5735%2088.084%2062.8503%2087.8743%2063.1736%2087.7883C63.497%2087.7023%2063.8411%2087.747%2064.1321%2087.9126C64.2756%2087.9938%2064.4016%2088.1027%2064.5028%2088.2331C64.604%2088.3635%2064.6782%2088.5127%2064.7214%2088.6722C64.7645%2088.8316%2064.7757%2088.9981%2064.7541%2089.1619C64.7326%2089.3257%2064.6787%2089.4836%2064.5958%2089.6263C64.425%2089.9149%2064.1482%2090.1247%2063.8248%2090.2108C63.5014%2090.2969%2063.1574%2090.2523%2062.8664%2090.0867V90.0861Z%22%20fill%3D%22%2386C3DB%22%20transform%3D%22translate%280%2C%2016%29%22%2F%3E%0A%3Cpath%20id%3D%22Snowflake%203%22%20d%3D%22M82.5781%2090.366L81.3735%2089.6775C81.4794%2089.2326%2081.4786%2088.7687%2081.3708%2088.3241L82.5781%2087.6345C82.6738%2087.5805%2082.7577%2087.5079%2082.8252%2087.421C82.8926%2087.3342%2082.9423%2087.2347%2082.9711%2087.1284C82.9998%2087.0221%2083.0071%2086.9112%2082.9926%2086.802C82.9782%2086.6928%2082.9422%2086.5876%2082.8868%2086.4926C82.7732%2086.2998%2082.5886%2086.1597%2082.3728%2086.1025C82.157%2086.0452%2081.9276%2086.0754%2081.7339%2086.1866L80.5278%2086.8763C80.1931%2086.5586%2079.7868%2086.3264%2079.3437%2086.1995V84.8202C79.3368%2084.6003%2079.245%2084.3918%2079.0875%2084.2387C78.93%2084.0856%2078.7192%2084%2078.4998%2084C78.2805%2084%2078.0699%2084.0856%2077.9124%2084.2387C77.7548%2084.3918%2077.6628%2084.6003%2077.656%2084.8202V86.1995C77.214%2086.3289%2076.8081%2086.5598%2076.4706%2086.874L75.2662%2086.1853C75.0724%2086.0742%2074.8428%2086.044%2074.627%2086.1013C74.4113%2086.1585%2074.2267%2086.2986%2074.113%2086.4913C74.0576%2086.5864%2074.0217%2086.6916%2074.0072%2086.8007C73.9928%2086.9099%2074%2087.0209%2074.0288%2087.1271C74.0575%2087.2334%2074.1072%2087.3329%2074.1747%2087.4198C74.2421%2087.5067%2074.326%2087.5792%2074.4217%2087.6332L75.6264%2088.3216C75.5204%2088.7666%2075.5213%2089.2305%2075.629%2089.675L74.4217%2090.3647C74.326%2090.4187%2074.2421%2090.4912%2074.1747%2090.5781C74.1072%2090.665%2074.0575%2090.7645%2074.0288%2090.8708C74%2090.9771%2073.9928%2091.088%2074.0072%2091.1972C74.0217%2091.3063%2074.0576%2091.4115%2074.113%2091.5066C74.2267%2091.6992%2074.4113%2091.8392%2074.627%2091.8965C74.8428%2091.9537%2075.0724%2091.9236%2075.2662%2091.8126L76.4721%2091.1229C76.8063%2091.4409%2077.2128%2091.6726%2077.6562%2091.7979V93.1798C77.6631%2093.3997%2077.755%2093.6082%2077.9126%2093.7613C78.0701%2093.9144%2078.2807%2094%2078.5%2094C78.7194%2094%2078.9302%2093.9144%2079.0877%2093.7613C79.2452%2093.6082%2079.337%2093.3997%2079.3439%2093.1798V91.7975C79.7853%2091.6683%2080.1907%2091.4378%2080.5278%2091.1242L81.7341%2091.8138C81.9278%2091.9248%2082.1573%2091.955%2082.373%2091.8977C82.5888%2091.8405%2082.7733%2091.7005%2082.887%2091.5079C82.9424%2091.4128%2082.9784%2091.3076%2082.9928%2091.1984C83.0073%2091.0892%2082.9998%2090.9783%2082.9711%2090.872C82.9423%2090.7657%2082.8929%2090.6662%2082.8254%2090.5793C82.7579%2090.4925%2082.6738%2090.4199%2082.5781%2090.366ZM77.8664%2090.0861C77.7229%2090.005%2077.5968%2089.8961%2077.4956%2089.7657C77.3944%2089.6353%2077.3202%2089.486%2077.2771%2089.3266C77.2339%2089.1671%2077.2228%2089.0007%2077.2443%2088.8369C77.2658%2088.6731%2077.3197%2088.5152%2077.4026%2088.3724C77.5735%2088.084%2077.8503%2087.8743%2078.1736%2087.7883C78.497%2087.7023%2078.8411%2087.747%2079.1321%2087.9126C79.2756%2087.9938%2079.4016%2088.1027%2079.5028%2088.2331C79.604%2088.3635%2079.6782%2088.5127%2079.7214%2088.6722C79.7645%2088.8316%2079.7757%2088.9981%2079.7541%2089.1619C79.7326%2089.3257%2079.6787%2089.4836%2079.5958%2089.6263C79.425%2089.9149%2079.1482%2090.1247%2078.8248%2090.2108C78.5014%2090.2969%2078.1574%2090.2523%2077.8664%2090.0867V90.0861Z%22%20fill%3D%22%2386C3DB%22%20transform%3D%22translate%280%2C%200%29%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%20id%3D%22Raindrops%22%3E%0A%3Cpath%20id%3D%22Raindrop%201%22%20d%3D%22M52%2088V91%22%20stroke%3D%22%230A5AD4%22%20stroke-width%3D%224%22%20stroke-linecap%3D%22round%22%20transform%3D%22translate%280%2C%2016%29%22%2F%3E%0A%3Cpath%20id%3D%22Raindrop%202%22%20d%3D%22M64%2088V91%22%20stroke%3D%22%230A5AD4%22%20stroke-width%3D%224%22%20stroke-linecap%3D%22round%22%20transform%3D%22translate%280%2C%200%29%22%2F%3E%0A%3Cpath%20id%3D%22Raindrop%203%22%20d%3D%22M76%2088V91%22%20stroke%3D%22%230A5AD4%22%20stroke-width%3D%224%22%20stroke-linecap%3D%22round%22%20transform%3D%22translate%280%2C%2016%29%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_1858_9090%22%20x1%3D%2264.0008%22%20y1%3D%2239%22%20x2%3D%2264.0008%22%20y2%3D%2289%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23F3F7FE%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23E6EFFC%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CclipPath%20id%3D%22clip0_1858_9090%22%3E%0A%3Crect%20width%3D%22128%22%20height%3D%22128%22%20fill%3D%22white%22%2F%3E%0A%3C%2FclipPath%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E",
34
+ snow: "data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%20128%20128%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Cg%20id%3D%22snow%22%20clip-path%3D%22url%28%23clip0_1858_8860%29%22%3E%0A%3Cg%20id%3D%22Sky%22%3E%0A%3Cg%20id%3D%22Clouds%22%3E%0A%3Cg%20id%3D%22Cloud%22%3E%0A%3Cpath%20id%3D%22Cloud_2%22%20d%3D%22M55.2623%2048.4746C60.1227%2040.6111%2070.2975%2037.38%2078.8151%2040.9434C87.3214%2044.5023%2092.138%2054.0026%2089.903%2062.9648L89.7418%2063.6143L90.4108%2063.585C97.4203%2063.2791%20103.5%2068.9917%20103.5%2076.0283C103.5%2082.8395%2097.7717%2088.4997%2090.9772%2088.5H37.9537C31.1275%2088.5018%2025.2029%2083.1709%2024.5592%2076.3604C23.9158%2069.5518%2028.7369%2063.2124%2035.443%2061.9453L35.9264%2061.8535L35.8424%2061.3691C35.0256%2056.6239%2037.1258%2051.7168%2041.1051%2049.0127C45.0951%2046.3014%2050.4459%2046.1537%2054.5797%2048.6396L55.0026%2048.8945L55.2623%2048.4746Z%22%20fill%3D%22url%28%23paint0_linear_1858_8860%29%22%20stroke%3D%22%23E6EFFC%22%20stroke-miterlimit%3D%2210%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cg%20id%3D%22Precipitation%22%3E%0A%3Cg%20id%3D%22Snowflakes%22%3E%0A%3Cpath%20id%3D%22Snowflake%201%22%20d%3D%22M52.5781%2090.366L51.3735%2089.6775C51.4794%2089.2326%2051.4786%2088.7687%2051.3708%2088.3241L52.5781%2087.6345C52.6738%2087.5805%2052.7577%2087.5079%2052.8252%2087.421C52.8926%2087.3342%2052.9423%2087.2347%2052.9711%2087.1284C52.9998%2087.0221%2053.0071%2086.9112%2052.9926%2086.802C52.9782%2086.6928%2052.9422%2086.5876%2052.8868%2086.4926C52.7732%2086.2998%2052.5886%2086.1597%2052.3728%2086.1025C52.157%2086.0452%2051.9276%2086.0754%2051.7339%2086.1866L50.5278%2086.8763C50.1931%2086.5586%2049.7868%2086.3264%2049.3437%2086.1995V84.8202C49.3368%2084.6003%2049.245%2084.3918%2049.0875%2084.2387C48.93%2084.0856%2048.7192%2084%2048.4998%2084C48.2805%2084%2048.0699%2084.0856%2047.9124%2084.2387C47.7548%2084.3918%2047.6628%2084.6003%2047.656%2084.8202V86.1995C47.214%2086.3289%2046.8081%2086.5598%2046.4706%2086.874L45.2662%2086.1853C45.0724%2086.0742%2044.8428%2086.044%2044.627%2086.1013C44.4113%2086.1585%2044.2267%2086.2986%2044.113%2086.4913C44.0576%2086.5864%2044.0217%2086.6916%2044.0072%2086.8007C43.9928%2086.9099%2044%2087.0209%2044.0288%2087.1271C44.0575%2087.2334%2044.1072%2087.3329%2044.1747%2087.4198C44.2421%2087.5067%2044.326%2087.5792%2044.4217%2087.6332L45.6264%2088.3216C45.5204%2088.7666%2045.5213%2089.2305%2045.629%2089.675L44.4217%2090.3647C44.326%2090.4187%2044.2421%2090.4912%2044.1747%2090.5781C44.1072%2090.665%2044.0575%2090.7645%2044.0288%2090.8708C44%2090.9771%2043.9928%2091.088%2044.0072%2091.1972C44.0217%2091.3063%2044.0576%2091.4115%2044.113%2091.5066C44.2267%2091.6992%2044.4113%2091.8392%2044.627%2091.8965C44.8428%2091.9537%2045.0724%2091.9236%2045.2662%2091.8126L46.4721%2091.1229C46.8063%2091.4409%2047.2128%2091.6726%2047.6562%2091.7979V93.1798C47.6631%2093.3997%2047.755%2093.6082%2047.9126%2093.7613C48.0701%2093.9144%2048.2807%2094%2048.5%2094C48.7194%2094%2048.9302%2093.9144%2049.0877%2093.7613C49.2452%2093.6082%2049.337%2093.3997%2049.3439%2093.1798V91.7975C49.7853%2091.6683%2050.1907%2091.4378%2050.5278%2091.1242L51.7341%2091.8138C51.9278%2091.9248%2052.1573%2091.955%2052.373%2091.8977C52.5888%2091.8405%2052.7733%2091.7005%2052.887%2091.5079C52.9424%2091.4128%2052.9784%2091.3076%2052.9928%2091.1984C53.0073%2091.0892%2052.9998%2090.9783%2052.9711%2090.872C52.9423%2090.7657%2052.8929%2090.6662%2052.8254%2090.5793C52.7579%2090.4925%2052.6738%2090.4199%2052.5781%2090.366ZM47.8664%2090.0861C47.7229%2090.005%2047.5968%2089.8961%2047.4956%2089.7657C47.3944%2089.6353%2047.3202%2089.486%2047.2771%2089.3266C47.2339%2089.1671%2047.2228%2089.0007%2047.2443%2088.8369C47.2658%2088.6731%2047.3197%2088.5152%2047.4026%2088.3724C47.5735%2088.084%2047.8503%2087.8743%2048.1736%2087.7883C48.497%2087.7023%2048.8411%2087.747%2049.1321%2087.9126C49.2756%2087.9938%2049.4016%2088.1027%2049.5028%2088.2331C49.604%2088.3635%2049.6782%2088.5127%2049.7214%2088.6722C49.7645%2088.8316%2049.7757%2088.9981%2049.7541%2089.1619C49.7326%2089.3257%2049.6787%2089.4836%2049.5958%2089.6263C49.425%2089.9149%2049.1482%2090.1247%2048.8248%2090.2108C48.5014%2090.2969%2048.1574%2090.2523%2047.8664%2090.0867V90.0861Z%22%20fill%3D%22%2386C3DB%22%20transform%3D%22translate%280%2C%208%29%22%2F%3E%0A%3Cpath%20id%3D%22Snowflake%202%22%20d%3D%22M67.5781%2090.366L66.3735%2089.6775C66.4794%2089.2326%2066.4786%2088.7687%2066.3708%2088.3241L67.5781%2087.6345C67.6738%2087.5805%2067.7577%2087.5079%2067.8252%2087.421C67.8926%2087.3342%2067.9423%2087.2347%2067.9711%2087.1284C67.9998%2087.0221%2068.0071%2086.9112%2067.9926%2086.802C67.9782%2086.6928%2067.9422%2086.5876%2067.8868%2086.4926C67.7732%2086.2998%2067.5886%2086.1597%2067.3728%2086.1025C67.157%2086.0452%2066.9276%2086.0754%2066.7339%2086.1866L65.5278%2086.8763C65.1931%2086.5586%2064.7868%2086.3264%2064.3437%2086.1995V84.8202C64.3368%2084.6003%2064.245%2084.3918%2064.0875%2084.2387C63.93%2084.0856%2063.7192%2084%2063.4998%2084C63.2805%2084%2063.0699%2084.0856%2062.9124%2084.2387C62.7548%2084.3918%2062.6628%2084.6003%2062.656%2084.8202V86.1995C62.214%2086.3289%2061.8081%2086.5598%2061.4706%2086.874L60.2662%2086.1853C60.0724%2086.0742%2059.8428%2086.044%2059.627%2086.1013C59.4113%2086.1585%2059.2267%2086.2986%2059.113%2086.4913C59.0576%2086.5864%2059.0217%2086.6916%2059.0072%2086.8007C58.9928%2086.9099%2059%2087.0209%2059.0288%2087.1271C59.0575%2087.2334%2059.1072%2087.3329%2059.1747%2087.4198C59.2421%2087.5067%2059.326%2087.5792%2059.4217%2087.6332L60.6264%2088.3216C60.5204%2088.7666%2060.5213%2089.2305%2060.629%2089.675L59.4217%2090.3647C59.326%2090.4187%2059.2421%2090.4912%2059.1747%2090.5781C59.1072%2090.665%2059.0575%2090.7645%2059.0288%2090.8708C59%2090.9771%2058.9928%2091.088%2059.0072%2091.1972C59.0217%2091.3063%2059.0576%2091.4115%2059.113%2091.5066C59.2267%2091.6992%2059.4113%2091.8392%2059.627%2091.8965C59.8428%2091.9537%2060.0724%2091.9236%2060.2662%2091.8126L61.4721%2091.1229C61.8063%2091.4409%2062.2128%2091.6726%2062.6562%2091.7979V93.1798C62.6631%2093.3997%2062.755%2093.6082%2062.9126%2093.7613C63.0701%2093.9144%2063.2807%2094%2063.5%2094C63.7194%2094%2063.9302%2093.9144%2064.0877%2093.7613C64.2452%2093.6082%2064.337%2093.3997%2064.3439%2093.1798V91.7975C64.7853%2091.6683%2065.1907%2091.4378%2065.5278%2091.1242L66.7341%2091.8138C66.9278%2091.9248%2067.1573%2091.955%2067.373%2091.8977C67.5888%2091.8405%2067.7733%2091.7005%2067.887%2091.5079C67.9424%2091.4128%2067.9784%2091.3076%2067.9928%2091.1984C68.0073%2091.0892%2067.9998%2090.9783%2067.9711%2090.872C67.9423%2090.7657%2067.8929%2090.6662%2067.8254%2090.5793C67.7579%2090.4925%2067.6738%2090.4199%2067.5781%2090.366ZM62.8664%2090.0861C62.7229%2090.005%2062.5968%2089.8961%2062.4956%2089.7657C62.3944%2089.6353%2062.3202%2089.486%2062.2771%2089.3266C62.2339%2089.1671%2062.2228%2089.0007%2062.2443%2088.8369C62.2658%2088.6731%2062.3197%2088.5152%2062.4026%2088.3724C62.5735%2088.084%2062.8503%2087.8743%2063.1736%2087.7883C63.497%2087.7023%2063.8411%2087.747%2064.1321%2087.9126C64.2756%2087.9938%2064.4016%2088.1027%2064.5028%2088.2331C64.604%2088.3635%2064.6782%2088.5127%2064.7214%2088.6722C64.7645%2088.8316%2064.7757%2088.9981%2064.7541%2089.1619C64.7326%2089.3257%2064.6787%2089.4836%2064.5958%2089.6263C64.425%2089.9149%2064.1482%2090.1247%2063.8248%2090.2108C63.5014%2090.2969%2063.1574%2090.2523%2062.8664%2090.0867V90.0861Z%22%20fill%3D%22%2386C3DB%22%20transform%3D%22translate%280%2C%200%29%22%2F%3E%0A%3Cpath%20id%3D%22Snowflake%203%22%20d%3D%22M82.5781%2090.366L81.3735%2089.6775C81.4794%2089.2326%2081.4786%2088.7687%2081.3708%2088.3241L82.5781%2087.6345C82.6738%2087.5805%2082.7577%2087.5079%2082.8252%2087.421C82.8926%2087.3342%2082.9423%2087.2347%2082.9711%2087.1284C82.9998%2087.0221%2083.0071%2086.9112%2082.9926%2086.802C82.9782%2086.6928%2082.9422%2086.5876%2082.8868%2086.4926C82.7732%2086.2998%2082.5886%2086.1597%2082.3728%2086.1025C82.157%2086.0452%2081.9276%2086.0754%2081.7339%2086.1866L80.5278%2086.8763C80.1931%2086.5586%2079.7868%2086.3264%2079.3437%2086.1995V84.8202C79.3368%2084.6003%2079.245%2084.3918%2079.0875%2084.2387C78.93%2084.0856%2078.7192%2084%2078.4998%2084C78.2805%2084%2078.0699%2084.0856%2077.9124%2084.2387C77.7548%2084.3918%2077.6628%2084.6003%2077.656%2084.8202V86.1995C77.214%2086.3289%2076.8081%2086.5598%2076.4706%2086.874L75.2662%2086.1853C75.0724%2086.0742%2074.8428%2086.044%2074.627%2086.1013C74.4113%2086.1585%2074.2267%2086.2986%2074.113%2086.4913C74.0576%2086.5864%2074.0217%2086.6916%2074.0072%2086.8007C73.9928%2086.9099%2074%2087.0209%2074.0288%2087.1271C74.0575%2087.2334%2074.1072%2087.3329%2074.1747%2087.4198C74.2421%2087.5067%2074.326%2087.5792%2074.4217%2087.6332L75.6264%2088.3216C75.5204%2088.7666%2075.5213%2089.2305%2075.629%2089.675L74.4217%2090.3647C74.326%2090.4187%2074.2421%2090.4912%2074.1747%2090.5781C74.1072%2090.665%2074.0575%2090.7645%2074.0288%2090.8708C74%2090.9771%2073.9928%2091.088%2074.0072%2091.1972C74.0217%2091.3063%2074.0576%2091.4115%2074.113%2091.5066C74.2267%2091.6992%2074.4113%2091.8392%2074.627%2091.8965C74.8428%2091.9537%2075.0724%2091.9236%2075.2662%2091.8126L76.4721%2091.1229C76.8063%2091.4409%2077.2128%2091.6726%2077.6562%2091.7979V93.1798C77.6631%2093.3997%2077.755%2093.6082%2077.9126%2093.7613C78.0701%2093.9144%2078.2807%2094%2078.5%2094C78.7194%2094%2078.9302%2093.9144%2079.0877%2093.7613C79.2452%2093.6082%2079.337%2093.3997%2079.3439%2093.1798V91.7975C79.7853%2091.6683%2080.1907%2091.4378%2080.5278%2091.1242L81.7341%2091.8138C81.9278%2091.9248%2082.1573%2091.955%2082.373%2091.8977C82.5888%2091.8405%2082.7733%2091.7005%2082.887%2091.5079C82.9424%2091.4128%2082.9784%2091.3076%2082.9928%2091.1984C83.0073%2091.0892%2082.9998%2090.9783%2082.9711%2090.872C82.9423%2090.7657%2082.8929%2090.6662%2082.8254%2090.5793C82.7579%2090.4925%2082.6738%2090.4199%2082.5781%2090.366ZM77.8664%2090.0861C77.7229%2090.005%2077.5968%2089.8961%2077.4956%2089.7657C77.3944%2089.6353%2077.3202%2089.486%2077.2771%2089.3266C77.2339%2089.1671%2077.2228%2089.0007%2077.2443%2088.8369C77.2658%2088.6731%2077.3197%2088.5152%2077.4026%2088.3724C77.5735%2088.084%2077.8503%2087.8743%2078.1736%2087.7883C78.497%2087.7023%2078.8411%2087.747%2079.1321%2087.9126C79.2756%2087.9938%2079.4016%2088.1027%2079.5028%2088.2331C79.604%2088.3635%2079.6782%2088.5127%2079.7214%2088.6722C79.7645%2088.8316%2079.7757%2088.9981%2079.7541%2089.1619C79.7326%2089.3257%2079.6787%2089.4836%2079.5958%2089.6263C79.425%2089.9149%2079.1482%2090.1247%2078.8248%2090.2108C78.5014%2090.2969%2078.1574%2090.2523%2077.8664%2090.0867V90.0861Z%22%20fill%3D%22%2386C3DB%22%20transform%3D%22translate%280%2C%208%29%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_1858_8860%22%20x1%3D%2264.0008%22%20y1%3D%2239%22%20x2%3D%2264.0008%22%20y2%3D%2289%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23F3F7FE%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23E6EFFC%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CclipPath%20id%3D%22clip0_1858_8860%22%3E%0A%3Crect%20width%3D%22128%22%20height%3D%22128%22%20fill%3D%22white%22%2F%3E%0A%3C%2FclipPath%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E",
35
+ thunderstorms:
36
+ "data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%20128%20128%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Cg%20id%3D%22thunderstorms%22%20clip-path%3D%22url%28%23clip0_1858_9911%29%22%3E%0A%3Cg%20id%3D%22Sky%22%3E%0A%3Cg%20id%3D%22Clouds%22%3E%0A%3Cg%20id%3D%22Cloud%22%3E%0A%3Cpath%20id%3D%22Cloud_2%22%20d%3D%22M55.2625%2048.4746C60.1228%2040.6111%2070.2976%2037.38%2078.8152%2040.9434C87.3215%2044.5023%2092.1381%2054.0026%2089.9031%2062.9648L89.7419%2063.6143L90.4109%2063.585C97.4205%2063.2791%20103.5%2068.9917%20103.5%2076.0283C103.5%2082.8395%2097.7719%2088.4997%2090.9773%2088.5H37.9539C31.1276%2088.5018%2025.203%2083.1709%2024.5593%2076.3604C23.9159%2069.5518%2028.7371%2063.2124%2035.4431%2061.9453L35.9265%2061.8535L35.8425%2061.3691C35.0258%2056.6239%2037.1259%2051.7168%2041.1052%2049.0127C45.0952%2046.3014%2050.4461%2046.1537%2054.5798%2048.6396L55.0027%2048.8945L55.2625%2048.4746Z%22%20fill%3D%22url%28%23paint0_linear_1858_9911%29%22%20stroke%3D%22%23E6EFFC%22%20stroke-miterlimit%3D%2210%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cg%20id%3D%22Lightning%22%3E%0A%3Cpath%20id%3D%22Lightning%20Bolt%22%20d%3D%22M71.1729%2068.5L63.5566%2083.041L63.1729%2083.7725H75.002L56.9521%20107.892L60.4893%2091.0117L60.6162%2090.4092H52.7041L60.3555%2068.5H71.1729Z%22%20fill%3D%22url%28%23paint1_linear_1858_9911%29%22%20stroke%3D%22%23F6A823%22%20stroke-miterlimit%3D%2210%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_1858_9911%22%20x1%3D%2264.0009%22%20y1%3D%2239%22%20x2%3D%2264.0009%22%20y2%3D%2289%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23F3F7FE%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23E6EFFC%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3ClinearGradient%20id%3D%22paint1_linear_1858_9911%22%20x1%3D%2264.528%22%20y1%3D%2266.0377%22%20x2%3D%2284.4144%22%20y2%3D%2277.4572%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23F7B23B%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23F6A823%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CclipPath%20id%3D%22clip0_1858_9911%22%3E%0A%3Crect%20width%3D%22128%22%20height%3D%22128%22%20fill%3D%22white%22%2F%3E%0A%3C%2FclipPath%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E",
37
+ "thunderstorms-hail":
38
+ "data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%20128%20128%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Cg%20id%3D%22thunderstorms-hail%22%20clip-path%3D%22url%28%23clip0_1858_9999%29%22%3E%0A%3Cg%20id%3D%22Sky%22%3E%0A%3Cg%20id%3D%22Clouds%22%3E%0A%3Cg%20id%3D%22Cloud%22%3E%0A%3Cpath%20id%3D%22Cloud_2%22%20d%3D%22M55.2625%2048.4746C60.1228%2040.6111%2070.2976%2037.38%2078.8152%2040.9434C87.3215%2044.5023%2092.1381%2054.0026%2089.9031%2062.9648L89.7419%2063.6143L90.4109%2063.585C97.4205%2063.2791%20103.5%2068.9917%20103.5%2076.0283C103.5%2082.8395%2097.7719%2088.4997%2090.9773%2088.5H37.9539C31.1276%2088.5018%2025.203%2083.1709%2024.5593%2076.3604C23.9159%2069.5518%2028.7371%2063.2124%2035.4431%2061.9453L35.9265%2061.8535L35.8425%2061.3691C35.0258%2056.6239%2037.1259%2051.7168%2041.1052%2049.0127C45.0952%2046.3014%2050.4461%2046.1537%2054.5798%2048.6396L55.0027%2048.8945L55.2625%2048.4746Z%22%20fill%3D%22url%28%23paint0_linear_1858_9999%29%22%20stroke%3D%22%23E6EFFC%22%20stroke-miterlimit%3D%2210%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cg%20id%3D%22Precipitation%22%3E%0A%3Cg%20id%3D%22Ice%20balls%22%3E%0A%3Cpath%20id%3D%22Ice%20Ball%201%22%20d%3D%22M52%2086C51.4067%2086%2050.8266%2086.1759%2050.3333%2086.5056C49.8399%2086.8352%2049.4554%2087.3038%2049.2283%2087.852C49.0013%2088.4001%2048.9419%2089.0033%2049.0577%2089.5853C49.1734%2090.1672%2049.4591%2090.7018%2049.8787%2091.1213C50.2983%2091.5409%2050.8329%2091.8266%2051.4148%2091.9424C51.9968%2092.0581%2052.5998%2091.9987%2053.148%2091.7716C53.6961%2091.5446%2054.1647%2091.1601%2054.4944%2090.6667C54.824%2090.1734%2055%2089.5933%2055%2089C55%2088.2044%2054.6839%2087.4413%2054.1213%2086.8787C53.5587%2086.3161%2052.7957%2086%2052%2086Z%22%20fill%3D%22%2386C3DB%22%20transform%3D%22translate%280%2C%208%29%22%2F%3E%0A%3Cpath%20id%3D%22Ice%20Ball%202%22%20d%3D%22M64%2086C63.4067%2086%2062.8266%2086.1759%2062.3333%2086.5056C61.8399%2086.8352%2061.4554%2087.3038%2061.2283%2087.852C61.0013%2088.4001%2060.9419%2089.0033%2061.0577%2089.5853C61.1734%2090.1672%2061.4591%2090.7018%2061.8787%2091.1213C62.2983%2091.5409%2062.8329%2091.8266%2063.4148%2091.9424C63.9968%2092.0581%2064.5998%2091.9987%2065.148%2091.7716C65.6961%2091.5446%2066.1647%2091.1601%2066.4944%2090.6667C66.824%2090.1734%2067%2089.5933%2067%2089C67%2088.2044%2066.6839%2087.4413%2066.1213%2086.8787C65.5587%2086.3161%2064.7957%2086%2064%2086Z%22%20fill%3D%22%2386C3DB%22%20transform%3D%22translate%280%2C%200%29%22%2F%3E%0A%3Cpath%20id%3D%22Ice%20Ball%203%22%20d%3D%22M76%2086C75.4067%2086%2074.8266%2086.1759%2074.3333%2086.5056C73.8399%2086.8352%2073.4554%2087.3038%2073.2283%2087.852C73.0013%2088.4001%2072.9419%2089.0033%2073.0577%2089.5853C73.1734%2090.1672%2073.4591%2090.7018%2073.8787%2091.1213C74.2983%2091.5409%2074.8329%2091.8266%2075.4148%2091.9424C75.9968%2092.0581%2076.5998%2091.9987%2077.148%2091.7716C77.6961%2091.5446%2078.1647%2091.1601%2078.4944%2090.6667C78.824%2090.1734%2079%2089.5933%2079%2089C79%2088.2044%2078.6839%2087.4413%2078.1213%2086.8787C77.5587%2086.3161%2076.7957%2086%2076%2086Z%22%20fill%3D%22%2386C3DB%22%20transform%3D%22translate%280%2C%208%29%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cg%20id%3D%22Lightning%22%3E%0A%3Cpath%20id%3D%22Lightning%20Bolt%22%20d%3D%22M71.1729%2068.5L63.5566%2083.041L63.1729%2083.7725H75.002L56.9521%20107.892L60.4893%2091.0117L60.6162%2090.4092H52.7041L60.3555%2068.5H71.1729Z%22%20fill%3D%22url%28%23paint1_linear_1858_9999%29%22%20stroke%3D%22%23F6A823%22%20stroke-miterlimit%3D%2210%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_1858_9999%22%20x1%3D%2264.0009%22%20y1%3D%2239%22%20x2%3D%2264.0009%22%20y2%3D%2289%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23F3F7FE%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23E6EFFC%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3ClinearGradient%20id%3D%22paint1_linear_1858_9999%22%20x1%3D%2264.528%22%20y1%3D%2266.0377%22%20x2%3D%2284.4144%22%20y2%3D%2277.4572%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23F7B23B%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23F6A823%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CclipPath%20id%3D%22clip0_1858_9999%22%3E%0A%3Crect%20width%3D%22128%22%20height%3D%22128%22%20fill%3D%22white%22%2F%3E%0A%3C%2FclipPath%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E",
39
+ }
40
+
41
+ const WMO_TO_ICON: Record<number, IconName> = {
42
+ 0: "clear-day",
43
+ 1: "mostly-clear-day",
44
+ 2: "partly-cloudy-day",
45
+ 3: "overcast",
46
+ 45: "fog",
47
+ 48: "fog",
48
+ 51: "drizzle",
49
+ 53: "drizzle",
50
+ 55: "drizzle",
51
+ 56: "sleet",
52
+ 57: "sleet",
53
+ 61: "rain",
54
+ 63: "rain",
55
+ 65: "rain",
56
+ 66: "sleet",
57
+ 67: "sleet",
58
+ 71: "snow",
59
+ 73: "snow",
60
+ 75: "snow",
61
+ 77: "snow",
62
+ 80: "rain",
63
+ 81: "rain",
64
+ 82: "rain",
65
+ 85: "snow",
66
+ 86: "snow",
67
+ 95: "thunderstorms",
68
+ 96: "thunderstorms-hail",
69
+ 99: "thunderstorms-hail",
70
+ }
71
+
72
+ export const iconUrlFor = (code?: number): string | undefined => {
73
+ if (code === undefined) return undefined
74
+ const name = WMO_TO_ICON[code]
75
+ if (name === undefined) return undefined
76
+ return ICON_URLS[name]
77
+ }
78
+
79
+ export interface WeatherIconProps {
80
+ readonly code?: number
81
+ readonly className?: string
82
+ }
83
+
84
+ export const WeatherIcon = ({ code, className }: WeatherIconProps) => {
85
+ const url = iconUrlFor(code)
86
+ if (url === undefined) return null
87
+ return <img src={url} alt="" className={`block ${className ?? ""}`} />
88
+ }