@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.
- package/LICENSE +21 -0
- package/README.md +69 -0
- package/bin/_wrapper-shared.js +42 -0
- package/bin/dev.js +95 -0
- package/bin/sirenodeck.js +42 -0
- package/config/default-config.yml +117 -0
- package/config/starter-config.yml +54 -0
- package/dist/main.mjs +64702 -0
- package/package.json +140 -0
- package/src/action/executor.ts +156 -0
- package/src/action/index.ts +7 -0
- package/src/addon/api-types.ts +15 -0
- package/src/addon/api.ts +461 -0
- package/src/addon/check-runner.ts +84 -0
- package/src/addon/index.ts +5 -0
- package/src/addon/loader.ts +441 -0
- package/src/addon/registry.ts +230 -0
- package/src/addon/spec.ts +69 -0
- package/src/api/addon.ts +33 -0
- package/src/api/asset-url.ts +24 -0
- package/src/api/index.ts +50 -0
- package/src/api/protocol-internal.ts +656 -0
- package/src/api/protocol.ts +2 -0
- package/src/api/react/index.ts +11 -0
- package/src/api/react/registry.ts +91 -0
- package/src/api/react/use-addon-channel.ts +26 -0
- package/src/api/react/use-button-state.tsx +23 -0
- package/src/api/react/use-deck.ts +24 -0
- package/src/assets/logo.png +0 -0
- package/src/assets/logo72x72.png +0 -0
- package/src/assets/logoFull.png +0 -0
- package/src/builtin-addons/brightness/README.md +51 -0
- package/src/builtin-addons/brightness/buttons/brightness/backend.ts +13 -0
- package/src/builtin-addons/brightness/buttons/brightness/config.ts +10 -0
- package/src/builtin-addons/brightness/buttons/brightness/frontend.tsx +50 -0
- package/src/builtin-addons/brightness/domain/macos.ts +46 -0
- package/src/builtin-addons/brightness/index.d.ts +5 -0
- package/src/builtin-addons/brightness/index.ts +20 -0
- package/src/builtin-addons/brightness/poller.ts +27 -0
- package/src/builtin-addons/brightness/providers/darwin.ts +107 -0
- package/src/builtin-addons/brightness/providers/index.ts +81 -0
- package/src/builtin-addons/brightness/providers/linux.ts +108 -0
- package/src/builtin-addons/brightness/providers/windows.ts +77 -0
- package/src/builtin-addons/brightness/sirenodeck.json +6 -0
- package/src/builtin-addons/coding-agents/assets/claude-code.svg +1 -0
- package/src/builtin-addons/coding-agents/assets/opencode-dark-square.svg +1 -0
- package/src/builtin-addons/coding-agents/buttons/agent/backend.ts +82 -0
- package/src/builtin-addons/coding-agents/buttons/agent/config.ts +13 -0
- package/src/builtin-addons/coding-agents/buttons/agent/frontend.tsx +130 -0
- package/src/builtin-addons/coding-agents/buttons/agent/pages.tsx +150 -0
- package/src/builtin-addons/coding-agents/buttons/summary/backend.ts +48 -0
- package/src/builtin-addons/coding-agents/buttons/summary/config.ts +11 -0
- package/src/builtin-addons/coding-agents/buttons/summary/frontend.tsx +254 -0
- package/src/builtin-addons/coding-agents/decks/agents.ts +69 -0
- package/src/builtin-addons/coding-agents/global/backend.ts +402 -0
- package/src/builtin-addons/coding-agents/global-entry.ts +7 -0
- package/src/builtin-addons/coding-agents/hook/script.ts +123 -0
- package/src/builtin-addons/coding-agents/index.ts +15 -0
- package/src/builtin-addons/coding-agents/manifest.ts +115 -0
- package/src/builtin-addons/coding-agents/providers/claude-code.ts +470 -0
- package/src/builtin-addons/coding-agents/providers/claude-instances.ts +184 -0
- package/src/builtin-addons/coding-agents/providers/opencode-instances.ts +108 -0
- package/src/builtin-addons/coding-agents/providers/opencode.ts +636 -0
- package/src/builtin-addons/coding-agents/providers/registry.ts +120 -0
- package/src/builtin-addons/coding-agents/providers/spawn.ts +112 -0
- package/src/builtin-addons/coding-agents/shared/claude-hook-events.ts +55 -0
- package/src/builtin-addons/coding-agents/shared/claude-status.ts +236 -0
- package/src/builtin-addons/coding-agents/shared/live-count.ts +39 -0
- package/src/builtin-addons/coding-agents/shared/notifier.ts +58 -0
- package/src/builtin-addons/coding-agents/shared/opencode-status.ts +82 -0
- package/src/builtin-addons/coding-agents/shared/snapshot.ts +66 -0
- package/src/builtin-addons/coding-agents/shared/state.ts +72 -0
- package/src/builtin-addons/coding-agents/sirenodeck.json +6 -0
- package/src/builtin-addons/coding-agents/types/types.ts +33 -0
- package/src/builtin-addons/core/README.md +89 -0
- package/src/builtin-addons/core/buttons/action/backend.ts +7 -0
- package/src/builtin-addons/core/buttons/action/config.ts +13 -0
- package/src/builtin-addons/core/buttons/action/frontend.tsx +16 -0
- package/src/builtin-addons/core/buttons/change-deck/backend.ts +18 -0
- package/src/builtin-addons/core/buttons/change-deck/config.ts +15 -0
- package/src/builtin-addons/core/buttons/change-deck/frontend.tsx +18 -0
- package/src/builtin-addons/core/buttons/media-sample/backend.ts +8 -0
- package/src/builtin-addons/core/buttons/media-sample/config.ts +7 -0
- package/src/builtin-addons/core/buttons/media-sample/frontend.tsx +2 -0
- package/src/builtin-addons/core/buttons/page-nav/backend.ts +28 -0
- package/src/builtin-addons/core/buttons/page-nav/config.ts +9 -0
- package/src/builtin-addons/core/buttons/page-nav/frontend.tsx +68 -0
- package/src/builtin-addons/core/buttons/toggle/backend.ts +119 -0
- package/src/builtin-addons/core/buttons/toggle/config.ts +57 -0
- package/src/builtin-addons/core/buttons/toggle/frontend.tsx +57 -0
- package/src/builtin-addons/core/buttons/toggle/global-service.ts +174 -0
- package/src/builtin-addons/core/index.ts +120 -0
- package/src/builtin-addons/core/sirenodeck.json +6 -0
- package/src/builtin-addons/date-time/README.md +73 -0
- package/src/builtin-addons/date-time/buttons/analog-clock/backend.ts +10 -0
- package/src/builtin-addons/date-time/buttons/analog-clock/config.ts +4 -0
- package/src/builtin-addons/date-time/buttons/analog-clock/frontend.tsx +88 -0
- package/src/builtin-addons/date-time/buttons/custom/backend.ts +10 -0
- package/src/builtin-addons/date-time/buttons/custom/config.ts +9 -0
- package/src/builtin-addons/date-time/buttons/custom/frontend.tsx +26 -0
- package/src/builtin-addons/date-time/buttons/date/backend.ts +10 -0
- package/src/builtin-addons/date-time/buttons/date/config.ts +10 -0
- package/src/builtin-addons/date-time/buttons/date/frontend.tsx +42 -0
- package/src/builtin-addons/date-time/buttons/time/backend.ts +10 -0
- package/src/builtin-addons/date-time/buttons/time/config.ts +9 -0
- package/src/builtin-addons/date-time/buttons/time/frontend.tsx +29 -0
- package/src/builtin-addons/date-time/index.d.ts +5 -0
- package/src/builtin-addons/date-time/index.ts +30 -0
- package/src/builtin-addons/date-time/poller.ts +11 -0
- package/src/builtin-addons/date-time/shared/format-date.ts +36 -0
- package/src/builtin-addons/date-time/shared/format.ts +105 -0
- package/src/builtin-addons/date-time/shared/use-now.ts +10 -0
- package/src/builtin-addons/date-time/sirenodeck.json +6 -0
- package/src/builtin-addons/emoji-selector/README.md +45 -0
- package/src/builtin-addons/emoji-selector/assets/launcher.svg +10 -0
- package/src/builtin-addons/emoji-selector/assets/smileys.svg +8 -0
- package/src/builtin-addons/emoji-selector/buttons/category/backend.ts +14 -0
- package/src/builtin-addons/emoji-selector/buttons/category/config.ts +8 -0
- package/src/builtin-addons/emoji-selector/buttons/category/frontend.tsx +19 -0
- package/src/builtin-addons/emoji-selector/buttons/emoji/backend.ts +7 -0
- package/src/builtin-addons/emoji-selector/buttons/emoji/config.ts +9 -0
- package/src/builtin-addons/emoji-selector/buttons/emoji/frontend.tsx +11 -0
- package/src/builtin-addons/emoji-selector/buttons/launcher/backend.ts +13 -0
- package/src/builtin-addons/emoji-selector/buttons/launcher/config.ts +6 -0
- package/src/builtin-addons/emoji-selector/buttons/launcher/frontend.tsx +31 -0
- package/src/builtin-addons/emoji-selector/data/categories.ts +1084 -0
- package/src/builtin-addons/emoji-selector/decks/index.ts +137 -0
- package/src/builtin-addons/emoji-selector/index.d.ts +5 -0
- package/src/builtin-addons/emoji-selector/index.ts +29 -0
- package/src/builtin-addons/emoji-selector/sirenodeck.json +6 -0
- package/src/builtin-addons/emoji-selector/support.ts +49 -0
- package/src/builtin-addons/index.ts +13 -0
- package/src/builtin-addons/internal-settings/README.md +26 -0
- package/src/builtin-addons/internal-settings/backend.ts +58 -0
- package/src/builtin-addons/internal-settings/buttons/app-info/backend.ts +7 -0
- package/src/builtin-addons/internal-settings/buttons/app-info/config.ts +13 -0
- package/src/builtin-addons/internal-settings/buttons/app-info/frontend.tsx +18 -0
- package/src/builtin-addons/internal-settings/buttons/brightness/common/frontend.tsx +50 -0
- package/src/builtin-addons/internal-settings/buttons/brightness-down/backend.ts +16 -0
- package/src/builtin-addons/internal-settings/buttons/brightness-down/config.ts +6 -0
- package/src/builtin-addons/internal-settings/buttons/brightness-down/frontend.tsx +8 -0
- package/src/builtin-addons/internal-settings/buttons/brightness-up/backend.ts +16 -0
- package/src/builtin-addons/internal-settings/buttons/brightness-up/config.ts +6 -0
- package/src/builtin-addons/internal-settings/buttons/brightness-up/frontend.tsx +8 -0
- package/src/builtin-addons/internal-settings/decks/settings.ts +25 -0
- package/src/builtin-addons/internal-settings/index.d.ts +4 -0
- package/src/builtin-addons/internal-settings/index.ts +53 -0
- package/src/builtin-addons/internal-settings/logo72x72.png +0 -0
- package/src/builtin-addons/internal-settings/sirenodeck.json +6 -0
- package/src/builtin-addons/media/README.md +45 -0
- package/src/builtin-addons/media/backend.ts +143 -0
- package/src/builtin-addons/media/buttons/media-player/backend.ts +19 -0
- package/src/builtin-addons/media/buttons/media-player/components/MediaStatus.tsx +25 -0
- package/src/builtin-addons/media/buttons/media-player/components/MediaSurface.tsx +52 -0
- package/src/builtin-addons/media/buttons/media-player/components/ProgressBar.tsx +21 -0
- package/src/builtin-addons/media/buttons/media-player/components/status-meta.ts +36 -0
- package/src/builtin-addons/media/buttons/media-player/config.ts +4 -0
- package/src/builtin-addons/media/buttons/media-player/frontend.tsx +29 -0
- package/src/builtin-addons/media/buttons/volume/common/frontend.tsx +52 -0
- package/src/builtin-addons/media/buttons/volume/mute/backend.ts +13 -0
- package/src/builtin-addons/media/buttons/volume/mute/config.ts +4 -0
- package/src/builtin-addons/media/buttons/volume/mute/frontend.tsx +26 -0
- package/src/builtin-addons/media/buttons/volume/volume-down/backend.ts +14 -0
- package/src/builtin-addons/media/buttons/volume/volume-down/config.ts +6 -0
- package/src/builtin-addons/media/buttons/volume/volume-down/frontend.tsx +10 -0
- package/src/builtin-addons/media/buttons/volume/volume-up/backend.ts +14 -0
- package/src/builtin-addons/media/buttons/volume/volume-up/config.ts +6 -0
- package/src/builtin-addons/media/buttons/volume/volume-up/frontend.tsx +8 -0
- package/src/builtin-addons/media/checks.ts +104 -0
- package/src/builtin-addons/media/executor.ts +36 -0
- package/src/builtin-addons/media/index.d.ts +5 -0
- package/src/builtin-addons/media/index.ts +53 -0
- package/src/builtin-addons/media/progress.ts +16 -0
- package/src/builtin-addons/media/providers/darwin.ts +391 -0
- package/src/builtin-addons/media/providers/index.ts +27 -0
- package/src/builtin-addons/media/providers/linux.ts +196 -0
- package/src/builtin-addons/media/providers/types.ts +48 -0
- package/src/builtin-addons/media/providers/windows.ts +121 -0
- package/src/builtin-addons/media/sirenodeck.json +6 -0
- package/src/builtin-addons/media/state.ts +19 -0
- package/src/builtin-addons/register-builtins.ts +65 -0
- package/src/builtin-addons/session/README.md +14 -0
- package/src/builtin-addons/session/buttons/session-info/backend.ts +8 -0
- package/src/builtin-addons/session/buttons/session-info/config.ts +4 -0
- package/src/builtin-addons/session/buttons/session-info/frontend.tsx +2 -0
- package/src/builtin-addons/session/buttons/time/backend.ts +7 -0
- package/src/builtin-addons/session/buttons/time/config.ts +6 -0
- package/src/builtin-addons/session/buttons/time/frontend.tsx +2 -0
- package/src/builtin-addons/session/index.d.ts +5 -0
- package/src/builtin-addons/session/index.ts +18 -0
- package/src/builtin-addons/session/sirenodeck.json +6 -0
- package/src/builtin-addons/system-status/README.md +169 -0
- package/src/builtin-addons/system-status/buttons/_shared.ts +131 -0
- package/src/builtin-addons/system-status/buttons/system-status/frontend.tsx +224 -0
- package/src/builtin-addons/system-status/buttons/system-status/schemas.ts +67 -0
- package/src/builtin-addons/system-status/domain/catalog.ts +53 -0
- package/src/builtin-addons/system-status/domain/chart-sampler.ts +58 -0
- package/src/builtin-addons/system-status/domain/display-metrics.ts +128 -0
- package/src/builtin-addons/system-status/domain/index.ts +10 -0
- package/src/builtin-addons/system-status/domain/live-metrics.ts +1021 -0
- package/src/builtin-addons/system-status/domain/metric-ids.ts +0 -0
- package/src/builtin-addons/system-status/index.ts +16 -0
- package/src/builtin-addons/system-status/manifest.ts +105 -0
- package/src/builtin-addons/system-status/shared/metrics-catalog.ts +316 -0
- package/src/builtin-addons/system-status/sirenodeck.json +6 -0
- package/src/builtin-addons/test-buildin/decks/action-buttons-test.ts +56 -0
- package/src/builtin-addons/test-buildin/index.d.ts +5 -0
- package/src/builtin-addons/test-buildin/index.ts +16 -0
- package/src/builtin-addons/value-display/README.md +59 -0
- package/src/builtin-addons/value-display/backend.ts +86 -0
- package/src/builtin-addons/value-display/buttons/value-display/backend.ts +17 -0
- package/src/builtin-addons/value-display/buttons/value-display/config.ts +36 -0
- package/src/builtin-addons/value-display/buttons/value-display/frontend.tsx +54 -0
- package/src/builtin-addons/value-display/index.d.ts +5 -0
- package/src/builtin-addons/value-display/index.ts +23 -0
- package/src/builtin-addons/value-display/sirenodeck.json +6 -0
- package/src/builtin-addons/weather/README.md +46 -0
- package/src/builtin-addons/weather/backend.ts +121 -0
- package/src/builtin-addons/weather/buttons/weather/backend.ts +27 -0
- package/src/builtin-addons/weather/buttons/weather/config.ts +29 -0
- package/src/builtin-addons/weather/buttons/weather/frontend.tsx +63 -0
- package/src/builtin-addons/weather/buttons/weather/icons.tsx +88 -0
- package/src/builtin-addons/weather/buttons/weather/pages.tsx +109 -0
- package/src/builtin-addons/weather/domain/codes.ts +35 -0
- package/src/builtin-addons/weather/domain/fetch.ts +47 -0
- package/src/builtin-addons/weather/index.d.ts +5 -0
- package/src/builtin-addons/weather/index.ts +23 -0
- package/src/builtin-addons/weather/poller.ts +70 -0
- package/src/builtin-addons/weather/provider/city-key.ts +9 -0
- package/src/builtin-addons/weather/provider/codes.ts +35 -0
- package/src/builtin-addons/weather/provider/fetch.ts +97 -0
- package/src/builtin-addons/weather/provider/geocode.ts +67 -0
- package/src/builtin-addons/weather/provider/types.ts +42 -0
- package/src/builtin-addons/weather/sirenodeck.json +6 -0
- package/src/cli/coding-agents-onboarding.ts +434 -0
- package/src/cli/commands/addon-decks.ts +441 -0
- package/src/cli/commands/addon-registry.ts +639 -0
- package/src/cli/commands/emulator-mode.ts +289 -0
- package/src/cli/commands/install.ts +128 -0
- package/src/cli/commands/logs.ts +74 -0
- package/src/cli/commands/network-bind.ts +111 -0
- package/src/cli/commands/pipeline/helpers.ts +75 -0
- package/src/cli/commands/pipeline/preflight.ts +20 -0
- package/src/cli/commands/port-identity.ts +152 -0
- package/src/cli/commands/reload.ts +37 -0
- package/src/cli/commands/restart.ts +139 -0
- package/src/cli/commands/run.ts +2270 -0
- package/src/cli/commands/service/install.ts +121 -0
- package/src/cli/commands/service/render-template.ts +158 -0
- package/src/cli/commands/service-manager.ts +184 -0
- package/src/cli/commands/spawn-daemon.ts +251 -0
- package/src/cli/commands/start.ts +1061 -0
- package/src/cli/commands/status.ts +110 -0
- package/src/cli/commands/stop.ts +121 -0
- package/src/cli/commands/subprocess-supervisor.ts +203 -0
- package/src/cli/commands/system-requirements.ts +699 -0
- package/src/cli/cwd.ts +28 -0
- package/src/cli/first-run.ts +149 -0
- package/src/cli/http-server.ts +244 -0
- package/src/cli/index.ts +355 -0
- package/src/cli/install-root.ts +26 -0
- package/src/cli/main.ts +194 -0
- package/src/cli/package-manager.ts +175 -0
- package/src/cli/probe-deps.ts +45 -0
- package/src/cli/prompt.ts +22 -0
- package/src/cli/startup-display.ts +452 -0
- package/src/config/builtin-icons.ts +57 -0
- package/src/config/config-diff.ts +54 -0
- package/src/config/discovery.ts +64 -0
- package/src/config/icon-resolver.ts +90 -0
- package/src/config/include-resolver.ts +202 -0
- package/src/config/index.ts +9 -0
- package/src/config/loader.ts +187 -0
- package/src/config/mutation.ts +514 -0
- package/src/config/reference-expander.ts +84 -0
- package/src/config/schemas.ts +223 -0
- package/src/config/validation.ts +254 -0
- package/src/core/asset-id.ts +21 -0
- package/src/core/gesture-state.ts +344 -0
- package/src/core/icon-asset-registry.ts +127 -0
- package/src/core/icon-source.ts +86 -0
- package/src/core/index.ts +30 -0
- package/src/core/mime.ts +16 -0
- package/src/core/pagination.ts +90 -0
- package/src/core/pub-sub.ts +126 -0
- package/src/core/settings.ts +153 -0
- package/src/core/store.ts +88 -0
- package/src/core/watcher.ts +73 -0
- package/src/deck/addon-handler-bridge.ts +516 -0
- package/src/deck/deck-config.ts +271 -0
- package/src/deck/editor-surfaces.ts +87 -0
- package/src/deck/host-context.ts +18 -0
- package/src/deck/index.ts +102 -0
- package/src/deck/macro-parse.ts +182 -0
- package/src/deck/methods.ts +348 -0
- package/src/deck/paginate-deck.ts +98 -0
- package/src/deck/position-buttons.ts +57 -0
- package/src/deck/runtime/index.ts +5 -0
- package/src/deck/runtime/runtime.ts +1060 -0
- package/src/deck/runtime-subscriptions.ts +45 -0
- package/src/deck/system-back-injection.ts +62 -0
- package/src/deck/system-buttons/registry.tsx +97 -0
- package/src/deck/system-buttons/types.ts +14 -0
- package/src/device/black-frame.ts +73 -0
- package/src/device/index.ts +13 -0
- package/src/device/linux-udev.ts +36 -0
- package/src/device/models.ts +89 -0
- package/src/device/reconnecting.ts +193 -0
- package/src/device/registry.ts +38 -0
- package/src/device/stream-deck.ts +155 -0
- package/src/index.ts +74 -0
- package/src/outputClient/emulator.ts +357 -0
- package/src/outputClient/index.ts +26 -0
- package/src/outputClient/open-browser.ts +26 -0
- package/src/outputClient/real.ts +393 -0
- package/src/outputClient/types.ts +83 -0
- package/src/render/browser-renderer.ts +240 -0
- package/src/render/buffer-hash.ts +20 -0
- package/src/render/editor-handler.ts +197 -0
- package/src/render/emulator-server.ts +128 -0
- package/src/render/icon-source-resolver.ts +69 -0
- package/src/render/index.ts +16 -0
- package/src/render/protocol.ts +61 -0
- package/src/render/push-raw-image.ts +100 -0
- package/src/render/screenshot-cadence.ts +87 -0
- package/src/render/state-publisher.ts +110 -0
- package/src/render/vite-server.ts +138 -0
- package/src/render/ws-bridge.ts +315 -0
- package/src/system/device-selection.ts +80 -0
- package/src/system/glob-match.ts +74 -0
- package/src/system/providers/active-app/darwin.ts +117 -0
- package/src/system/providers/active-app/linux.ts +245 -0
- package/src/system/providers/active-app/wayland-gnome.ts +303 -0
- package/src/system/providers/active-app/windows.ts +94 -0
- package/src/system/providers/active-app.ts +97 -0
- package/src/system/providers/clipboard/darwin.ts +65 -0
- package/src/system/providers/clipboard/linux.ts +163 -0
- package/src/system/providers/clipboard/windows.ts +94 -0
- package/src/system/providers/clipboard.ts +84 -0
- package/src/system/providers/error.ts +16 -0
- package/src/system/providers/key-macro/darwin.ts +221 -0
- package/src/system/providers/key-macro/linux.ts +651 -0
- package/src/system/providers/key-macro/parser.ts +215 -0
- package/src/system/providers/key-macro/windows.ts +476 -0
- package/src/system/providers/key-macro.ts +79 -0
- package/src/system/providers/notification/darwin.ts +36 -0
- package/src/system/providers/notification/linux.ts +115 -0
- package/src/system/providers/notification/windows.ts +72 -0
- package/src/system/providers/notification.ts +75 -0
- package/src/system/providers/session/darwin.ts +82 -0
- package/src/system/providers/session/linux.ts +175 -0
- package/src/system/providers/session/windows.ts +73 -0
- package/src/system/providers/session.ts +89 -0
- package/src/system/providers/shared.ts +65 -0
- package/src/system/requirements.ts +235 -0
- package/src/system/setup-wizard/config-seed.ts +30 -0
- package/src/system/setup-wizard/format.ts +275 -0
- package/src/system/setup-wizard/index.ts +45 -0
- package/src/system/setup-wizard/open-settings.ts +26 -0
- package/src/system/setup-wizard/plan.ts +230 -0
- package/src/system/setup-wizard/probe-cache.ts +34 -0
- package/src/system/setup-wizard/probe.ts +486 -0
- package/src/system/setup-wizard/runtime-features.ts +85 -0
- package/src/system/setup-wizard/sudo.ts +178 -0
- package/src/system/setup-wizard/types.ts +133 -0
- package/src/system/virtual-stream-deck.ts +67 -0
- package/src/themes/css.ts +210 -0
- package/src/themes/default/assets/IBMPlexSans-Italic-VariableFont_wdth,wght.ttf +0 -0
- package/src/themes/default/assets/IBMPlexSans-VariableFont_wdth,wght.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Bold.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-BoldItalic.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-ExtraLight.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-ExtraLightItalic.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Italic.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Light.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-LightItalic.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Medium.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-MediumItalic.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Regular.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-SemiBold.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-SemiBoldItalic.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Thin.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-ThinItalic.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/OFL.txt +93 -0
- package/src/themes/default/assets/OFL.txt +93 -0
- package/src/themes/default/assets/README.txt +106 -0
- package/src/themes/default/assets/static/IBMPlexSans-Bold.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-BoldItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-ExtraLight.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-ExtraLightItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-Italic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-Light.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-LightItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-Medium.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-MediumItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-Regular.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-SemiBold.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-SemiBoldItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-Thin.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-ThinItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-Bold.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-BoldItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-ExtraLight.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-ExtraLightItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-Italic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-Light.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-LightItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-Medium.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-MediumItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-Regular.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-SemiBold.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-SemiBoldItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-Thin.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-ThinItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Bold.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-BoldItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-ExtraLight.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-ExtraLightItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Italic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Light.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-LightItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Medium.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-MediumItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Regular.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-SemiBold.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-SemiBoldItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Thin.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-ThinItalic.ttf +0 -0
- package/src/themes/default/components.css +81 -0
- package/src/themes/default/sirenodeck.json +170 -0
- package/src/themes/index.ts +14 -0
- package/src/themes/light/assets/IBMPlexSans-Italic-VariableFont_wdth,wght.ttf +0 -0
- package/src/themes/light/assets/IBMPlexSans-VariableFont_wdth,wght.ttf +0 -0
- package/src/themes/light/assets/IBM_Plex_Mono/IBMPlexMono-Bold.ttf +0 -0
- package/src/themes/light/assets/IBM_Plex_Mono/IBMPlexMono-Medium.ttf +0 -0
- package/src/themes/light/assets/IBM_Plex_Mono/IBMPlexMono-Regular.ttf +0 -0
- package/src/themes/light/assets/IBM_Plex_Mono/OFL.txt +93 -0
- package/src/themes/light/assets/OFL.txt +93 -0
- package/src/themes/light/assets/README.txt +106 -0
- package/src/themes/light/assets/static/IBMPlexSans-Light.ttf +0 -0
- package/src/themes/light/assets/static/IBMPlexSans-LightItalic.ttf +0 -0
- package/src/themes/light/assets/static/IBMPlexSans-Thin.ttf +0 -0
- package/src/themes/light/components.css +70 -0
- package/src/themes/light/sirenodeck.json +170 -0
- package/src/themes/loader.ts +343 -0
- package/src/themes/manifest.ts +164 -0
- package/src/themes/use-resolved-theme.tsx +32 -0
- package/src/ui/ButtonFrame.tsx +230 -0
- package/src/ui/contexts/AssetCacheContext.tsx +43 -0
- package/src/ui/index.ts +20 -0
- package/src/ui/primitives/Chip.tsx +53 -0
- package/src/ui/primitives/Icon.tsx +209 -0
- package/src/ui/primitives/Label.tsx +82 -0
- package/src/ui/primitives/ProgressBar.tsx +38 -0
- package/src/ui/primitives/TapIndicator.tsx +67 -0
- package/src/ui/primitives/Text.tsx +810 -0
- package/src/ui/primitives/index.ts +6 -0
- package/src/ui/surfaces/BarsSurface.tsx +211 -0
- package/src/ui/surfaces/IconLabelProgressSurface.tsx +133 -0
- package/src/ui/surfaces/IconLabelSurface.tsx +59 -0
- package/src/ui/surfaces/LabelValueListSurface.tsx +202 -0
- package/src/ui/surfaces/PaginatedSurface.tsx +164 -0
- package/src/ui/surfaces/SplitActionSurface.tsx +98 -0
- package/src/ui/surfaces/TemporaryErrorSurface.tsx +68 -0
- package/src/ui/surfaces/ValueChart.tsx +218 -0
- package/src/ui/surfaces/index.ts +32 -0
- package/src/ui/surfaces/paginated-schema.ts +22 -0
- package/src/ui/theme-presentation-builder.ts +184 -0
- package/src/ui/theme-presentation.tsx +146 -0
- package/src/ui/utils/cn.ts +12 -0
- package/src/util/cache-paths.ts +38 -0
- package/src/util/config-diff.ts +16 -0
- package/src/util/daemon-control.ts +85 -0
- package/src/util/daemon.ts +575 -0
- package/src/util/device-config.ts +56 -0
- package/src/util/errors.ts +13 -0
- package/src/util/log-reader.ts +114 -0
- package/src/util/log-tail.ts +103 -0
- package/src/util/logger.ts +417 -0
- package/src/util/process-title.ts +79 -0
- package/src/util/single-instance.ts +202 -0
- package/src/version.ts +10 -0
- package/src/vite/index.ts +6 -0
- package/src/vite/virtual-modules.ts +631 -0
- 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,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,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¤t=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
|
+
}
|