@aparte/plugin-cards 0.0.0-stage → 0.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +151 -2
  3. package/dist/carousel-DwgHvriV.js +63 -0
  4. package/dist/carousel-DwgHvriV.js.map +1 -0
  5. package/dist/controls-BYUm4aRV.js +62 -0
  6. package/dist/controls-BYUm4aRV.js.map +1 -0
  7. package/dist/format-BFq79ydr.js +728 -0
  8. package/dist/format-BFq79ydr.js.map +1 -0
  9. package/dist/index.d.ts +30 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +120 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/items/icons.d.ts +12 -0
  14. package/dist/items/icons.d.ts.map +1 -0
  15. package/dist/items/index.d.ts +100 -0
  16. package/dist/items/index.d.ts.map +1 -0
  17. package/dist/items.js +698 -0
  18. package/dist/items.js.map +1 -0
  19. package/dist/kit/carousel.d.ts +17 -0
  20. package/dist/kit/carousel.d.ts.map +1 -0
  21. package/dist/kit/controls.d.ts +51 -0
  22. package/dist/kit/controls.d.ts.map +1 -0
  23. package/dist/kit/define.d.ts +201 -0
  24. package/dist/kit/define.d.ts.map +1 -0
  25. package/dist/kit/dom.d.ts +40 -0
  26. package/dist/kit/dom.d.ts.map +1 -0
  27. package/dist/kit/fence.d.ts +39 -0
  28. package/dist/kit/fence.d.ts.map +1 -0
  29. package/dist/kit/format.d.ts +49 -0
  30. package/dist/kit/format.d.ts.map +1 -0
  31. package/dist/kit/rating.d.ts +19 -0
  32. package/dist/kit/rating.d.ts.map +1 -0
  33. package/dist/kit/sparkline.d.ts +19 -0
  34. package/dist/kit/sparkline.d.ts.map +1 -0
  35. package/dist/kit/strings.d.ts +139 -0
  36. package/dist/kit/strings.d.ts.map +1 -0
  37. package/dist/link/icons.d.ts +16 -0
  38. package/dist/link/icons.d.ts.map +1 -0
  39. package/dist/link/index.d.ts +98 -0
  40. package/dist/link/index.d.ts.map +1 -0
  41. package/dist/link.js +387 -0
  42. package/dist/link.js.map +1 -0
  43. package/dist/media/icons.d.ts +28 -0
  44. package/dist/media/icons.d.ts.map +1 -0
  45. package/dist/media/index.d.ts +107 -0
  46. package/dist/media/index.d.ts.map +1 -0
  47. package/dist/media.js +610 -0
  48. package/dist/media.js.map +1 -0
  49. package/dist/order/icons.d.ts +49 -0
  50. package/dist/order/icons.d.ts.map +1 -0
  51. package/dist/order/index.d.ts +204 -0
  52. package/dist/order/index.d.ts.map +1 -0
  53. package/dist/order.js +1843 -0
  54. package/dist/order.js.map +1 -0
  55. package/dist/place/icons.d.ts +18 -0
  56. package/dist/place/icons.d.ts.map +1 -0
  57. package/dist/place/index.d.ts +207 -0
  58. package/dist/place/index.d.ts.map +1 -0
  59. package/dist/place.js +1456 -0
  60. package/dist/place.js.map +1 -0
  61. package/dist/plan/icons.d.ts +25 -0
  62. package/dist/plan/icons.d.ts.map +1 -0
  63. package/dist/plan/index.d.ts +153 -0
  64. package/dist/plan/index.d.ts.map +1 -0
  65. package/dist/plan.js +1191 -0
  66. package/dist/plan.js.map +1 -0
  67. package/dist/product/icons.d.ts +16 -0
  68. package/dist/product/icons.d.ts.map +1 -0
  69. package/dist/product/index.d.ts +133 -0
  70. package/dist/product/index.d.ts.map +1 -0
  71. package/dist/product.js +1245 -0
  72. package/dist/product.js.map +1 -0
  73. package/dist/rating-CHVajQ2b.js +35 -0
  74. package/dist/rating-CHVajQ2b.js.map +1 -0
  75. package/dist/score/icons.d.ts +35 -0
  76. package/dist/score/icons.d.ts.map +1 -0
  77. package/dist/score/index.d.ts +185 -0
  78. package/dist/score/index.d.ts.map +1 -0
  79. package/dist/score.js +1843 -0
  80. package/dist/score.js.map +1 -0
  81. package/dist/sparkline-C-cA9obz.js +56 -0
  82. package/dist/sparkline-C-cA9obz.js.map +1 -0
  83. package/dist/stats/icons.d.ts +19 -0
  84. package/dist/stats/icons.d.ts.map +1 -0
  85. package/dist/stats/index.d.ts +137 -0
  86. package/dist/stats/index.d.ts.map +1 -0
  87. package/dist/stats.js +1085 -0
  88. package/dist/stats.js.map +1 -0
  89. package/dist/stock/chart.d.ts +135 -0
  90. package/dist/stock/chart.d.ts.map +1 -0
  91. package/dist/stock/icons.d.ts +15 -0
  92. package/dist/stock/icons.d.ts.map +1 -0
  93. package/dist/stock/index.d.ts +195 -0
  94. package/dist/stock/index.d.ts.map +1 -0
  95. package/dist/stock.js +1013 -0
  96. package/dist/stock.js.map +1 -0
  97. package/dist/weather/conditions.d.ts +25 -0
  98. package/dist/weather/conditions.d.ts.map +1 -0
  99. package/dist/weather/icons.d.ts +12 -0
  100. package/dist/weather/icons.d.ts.map +1 -0
  101. package/dist/weather/index.d.ts +146 -0
  102. package/dist/weather/index.d.ts.map +1 -0
  103. package/dist/weather.js +1162 -0
  104. package/dist/weather.js.map +1 -0
  105. package/package.json +137 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weather.js","sources":["../src/weather/conditions.ts","../src/weather/icons.ts","../src/weather/weather.css?raw","../src/weather/index.ts"],"sourcesContent":["/**\n * The weather a card knows how to draw, and the doors to it from the APIs a tool calls.\n *\n * A tool returns its own codes — WMO numbers from Open-Meteo, ids from OpenWeather, a\n * sentence from elsewhere. The card draws eleven conditions; these functions turn a code\n * into one of them, so an app's `map` is one call instead of a table.\n */\nimport type { CardWord } from '../kit/strings.js';\n\nexport type WeatherCondition =\n | 'clear'\n | 'partly-cloudy'\n | 'cloudy'\n | 'fog'\n | 'drizzle'\n | 'rain'\n | 'heavy-rain'\n | 'sleet'\n | 'snow'\n | 'thunder'\n | 'wind';\n\nexport const WEATHER_CONDITIONS: readonly WeatherCondition[] = [\n 'clear', 'partly-cloudy', 'cloudy', 'fog', 'drizzle', 'rain', 'heavy-rain', 'sleet', 'snow', 'thunder', 'wind',\n];\n\n/**\n * A WMO weather code (Open-Meteo's `weather_code`) as a condition.\n * https://open-meteo.com/en/docs — \"WMO Weather interpretation codes\".\n */\nexport function conditionFromWmo(code: unknown): WeatherCondition | undefined {\n const c = typeof code === 'string' ? Number(code) : code;\n if (typeof c !== 'number' || !Number.isFinite(c)) return undefined;\n if (c === 0) return 'clear';\n if (c === 1 || c === 2) return 'partly-cloudy';\n if (c === 3) return 'cloudy';\n if (c === 45 || c === 48) return 'fog';\n if (c >= 51 && c <= 55) return 'drizzle';\n if (c === 56 || c === 57 || c === 66 || c === 67) return 'sleet';\n if (c === 61 || c === 63 || c === 80 || c === 81) return 'rain';\n if (c === 65 || c === 82) return 'heavy-rain';\n if ((c >= 71 && c <= 77) || c === 85 || c === 86) return 'snow';\n if (c >= 95 && c <= 99) return 'thunder';\n return undefined;\n}\n\n/**\n * An OpenWeather condition id (`weather[0].id`) as a condition.\n * https://openweathermap.org/weather-conditions\n */\nexport function conditionFromOpenWeather(id: unknown): WeatherCondition | undefined {\n const c = typeof id === 'string' ? Number(id) : id;\n if (typeof c !== 'number' || !Number.isFinite(c)) return undefined;\n if (c >= 200 && c < 300) return 'thunder';\n if (c >= 300 && c < 400) return 'drizzle';\n if (c === 511 || (c >= 611 && c <= 616)) return 'sleet';\n if (c >= 502 && c <= 504) return 'heavy-rain';\n if (c === 522 || c === 531) return 'heavy-rain';\n if (c >= 500 && c < 600) return 'rain';\n if (c >= 600 && c < 700) return 'snow';\n if (c === 771 || c === 781) return 'wind';\n if (c >= 700 && c < 800) return 'fog';\n if (c === 800) return 'clear';\n if (c === 801 || c === 802) return 'partly-cloudy';\n if (c === 803 || c === 804) return 'cloudy';\n return undefined;\n}\n\n/** Words for each condition, in English and French, matched inside a sentence. Order matters: most specific first. */\nconst TEXT_MATCHES: Array<[RegExp, WeatherCondition]> = [\n [/thunder|storm|orage|lightning/i, 'thunder'],\n [/sleet|freezing|verglas|grésil|hail|grêle/i, 'sleet'],\n [/snow|neige|blizzard|flurr/i, 'snow'],\n [/heavy rain|downpour|torrential|forte pluie|averse forte|déluge/i, 'heavy-rain'],\n [/drizzle|bruine|crachin/i, 'drizzle'],\n [/rain|shower|pluie|pluvieux|averse/i, 'rain'],\n [/fog|mist|haze|brouillard|brume/i, 'fog'],\n [/partly|partial|scattered|few clouds|mostly sunny|éclaircie|partiellement|peu nuageux/i, 'partly-cloudy'],\n [/cloud|overcast|couvert|nuageux|gris/i, 'cloudy'],\n [/wind|gust|vent|rafale/i, 'wind'],\n [/clear|sunny|fair|soleil|ensoleillé|dégagé/i, 'clear'],\n];\n\n/** A description (\"Light rain\", \"Partiellement nuageux\") as a condition — English and French. */\nexport function conditionFromText(text: unknown): WeatherCondition | undefined {\n if (typeof text !== 'string' || !text.trim()) return undefined;\n const known = text.trim().toLowerCase().replace(/[\\s_]+/g, '-');\n if ((WEATHER_CONDITIONS as readonly string[]).includes(known)) return known as WeatherCondition;\n for (const [re, condition] of TEXT_MATCHES) if (re.test(text)) return condition;\n return undefined;\n}\n\n/** What each condition is called, when the tool gives no description of its own. */\nexport const CONDITION_WORDS: Record<WeatherCondition, CardWord> = {\n clear: { en: 'Clear', fr: 'Dégagé', de: 'Klar', es: 'Despejado', it: 'Sereno', ja: '晴れ', ko: '맑음', pt: 'Céu limpo', ru: 'Ясно', zh: '晴' },\n 'partly-cloudy': { en: 'Partly cloudy', fr: 'Partiellement nuageux', de: 'Teilweise bewölkt', es: 'Parcialmente nublado', it: 'Parzialmente nuvoloso', ja: '晴れ時々曇り', ko: '구름 조금', pt: 'Parcialmente nublado', ru: 'Переменная облачность', zh: '多云' },\n cloudy: { en: 'Cloudy', fr: 'Couvert', de: 'Bewölkt', es: 'Nublado', it: 'Nuvoloso', ja: '曇り', ko: '흐림', pt: 'Nublado', ru: 'Облачно', zh: '阴' },\n fog: { en: 'Fog', fr: 'Brouillard', de: 'Nebel', es: 'Niebla', it: 'Nebbia', ja: '霧', ko: '안개', pt: 'Nevoeiro', ru: 'Туман', zh: '雾' },\n drizzle: { en: 'Drizzle', fr: 'Bruine', de: 'Nieselregen', es: 'Llovizna', it: 'Pioviggine', ja: '霧雨', ko: '이슬비', pt: 'Garoa', ru: 'Морось', zh: '毛毛雨' },\n rain: { en: 'Rain', fr: 'Pluie', de: 'Regen', es: 'Lluvia', it: 'Pioggia', ja: '雨', ko: '비', pt: 'Chuva', ru: 'Дождь', zh: '雨' },\n 'heavy-rain': { en: 'Heavy rain', fr: 'Forte pluie', de: 'Starkregen', es: 'Lluvia intensa', it: 'Pioggia forte', ja: '大雨', ko: '폭우', pt: 'Chuva forte', ru: 'Сильный дождь', zh: '大雨' },\n sleet: { en: 'Sleet', fr: 'Pluie verglaçante', de: 'Schneeregen', es: 'Aguanieve', it: 'Nevischio', ja: 'みぞれ', ko: '진눈깨비', pt: 'Granizo fino', ru: 'Мокрый снег', zh: '雨夹雪' },\n snow: { en: 'Snow', fr: 'Neige', de: 'Schnee', es: 'Nieve', it: 'Neve', ja: '雪', ko: '눈', pt: 'Neve', ru: 'Снег', zh: '雪' },\n thunder: { en: 'Thunderstorm', fr: 'Orage', de: 'Gewitter', es: 'Tormenta', it: 'Temporale', ja: '雷雨', ko: '뇌우', pt: 'Trovoada', ru: 'Гроза', zh: '雷雨' },\n wind: { en: 'Windy', fr: 'Venteux', de: 'Windig', es: 'Ventoso', it: 'Ventoso', ja: '強風', ko: '바람', pt: 'Ventoso', ru: 'Ветрено', zh: '有风' },\n};\n","/**\n * The weather glyphs: one 64 × 64 drawing per condition, day and night, built from a few\n * parts (sun, moon, cloud, drops, flakes, bolt). Coloured and animated by the sheet\n * through their classes — `--aparte-weather-*` tokens, so a theme recolours the sky.\n *\n * They live here and not in core's `icons/`: core's set is what core draws, and core\n * draws no weather. These are constants of the package, the only markup a card parses.\n */\nimport type { WeatherCondition } from './conditions.js';\n\nconst r = (n: number) => Math.round(n * 100) / 100;\n\nconst RAYS = Array.from({ length: 8 }, (_, i) => {\n const a = (i * Math.PI) / 4;\n return `M${r(32 + 16 * Math.cos(a))} ${r(32 + 16 * Math.sin(a))}L${r(32 + 22 * Math.cos(a))} ${r(32 + 22 * Math.sin(a))}`;\n}).join('');\n\nconst SUN = `<g class=\"aparte-wx-sun-g\"><path class=\"aparte-wx-rays\" d=\"${RAYS}\"/><circle class=\"aparte-wx-sun\" cx=\"32\" cy=\"32\" r=\"11\"/></g>`; // safe-attr: this package's own glyph constants and loop numbers, never data\nconst MOON = `<g class=\"aparte-wx-moon-g\"><path class=\"aparte-wx-moon\" d=\"M38.5 16.5A16 16 0 1 0 47.5 44.5A12.5 12.5 0 0 1 38.5 16.5Z\"/><circle class=\"aparte-wx-star\" cx=\"48\" cy=\"17\" r=\"1.6\"/><circle class=\"aparte-wx-star\" cx=\"54\" cy=\"27\" r=\"1.1\"/></g>`;\nconst CLOUD_PATH = 'M22 46H46A9 9 0 0 0 47 28.06A13 13 0 0 0 22.4 25.1A10.5 10.5 0 0 0 22 46Z';\nconst cloud = (cls: string, transform = '') => `<path class=\"${cls}\"${transform ? ` transform=\"${transform}\"` : ''} d=\"${CLOUD_PATH}\"/>`; // safe-attr: this package's own glyph constants and loop numbers, never data\n\n/** The sun or the moon, small, behind a cloud. */\nconst behind = (night: boolean) => `<g transform=\"translate(-6.5 -6.5) scale(0.72)\" class=\"aparte-wx-behind\">${night ? MOON : SUN}</g>`; // safe-text: this package's own SVG, built from its glyph constants\n\nconst drops = (n: number, cls = 'aparte-wx-drop') => {\n const xs = n === 5 ? [19, 26, 33, 40, 47] : n === 4 ? [22, 29, 36, 43] : n === 2 ? [24, 32] : [24, 32, 40];\n return `<g class=\"aparte-wx-fall\">${xs.map((x, i) => `<path class=\"${cls}\" style=\"--i:${i}\" d=\"M${x} ${46 + (i % 2) * 3}l-2.5 6\"/>`).join('')}</g>`; // safe-attr: this package's own glyph constants and loop numbers, never data // safe-text: this package's own SVG, built from its glyph constants\n};\nconst dots = (n: number) => {\n const xs = n === 4 ? [22, 29, 36, 43] : [24, 32, 40];\n return `<g class=\"aparte-wx-fall\">${xs.map((x, i) => `<circle class=\"aparte-wx-drip\" style=\"--i:${i}\" cx=\"${x}\" cy=\"${49 + (i % 2) * 3}\" r=\"1.8\"/>`).join('')}</g>`; // safe-attr: this package's own glyph constants and loop numbers, never data // safe-text: this package's own SVG, built from its glyph constants\n};\nconst flakes = (xs: number[]) =>\n `<g class=\"aparte-wx-drift-down\">${xs.map((x, i) => `<g class=\"aparte-wx-flake\" style=\"--i:${i}\" transform=\"translate(${x} ${50 + (i % 2) * 4})\"><path d=\"M0 -3.2V3.2M-2.8 -1.6L2.8 1.6M-2.8 1.6L2.8 -1.6\"/></g>`).join('')}</g>`; // safe-attr: numbers computed here, never data // safe-text: this package's own SVG, built from its glyph constants\nconst BOLT = '<path class=\"aparte-wx-bolt\" d=\"M34.5 40 26 53h6.5l-3 10L41 48.5h-6.5l4.5-8.5z\"/>';\nconst FOG = '<g class=\"aparte-wx-fog-g\"><path class=\"aparte-wx-fog\" d=\"M14 49H50M18 55H46M22 61H42\"/></g>';\nconst WIND = '<g class=\"aparte-wx-wind-g\"><path class=\"aparte-wx-wind\" d=\"M9 25h26a6 6 0 1 0-6-6\"/><path class=\"aparte-wx-wind\" d=\"M9 33h37a6.5 6.5 0 1 1-6.5 6.5\"/><path class=\"aparte-wx-wind\" d=\"M9 41h18\"/></g>';\n\n/** The glyph for a condition, by day or by night, as markup for `glyph()`. */\nexport function weatherIcon(condition: WeatherCondition, night = false): string {\n const up = 'translate(0 -6)';\n let body: string;\n switch (condition) {\n case 'clear':\n body = night ? MOON : SUN;\n break;\n case 'partly-cloudy':\n body = `${behind(night)}<g class=\"aparte-wx-drift\">${cloud('aparte-wx-cloud', 'translate(4 6)')}</g>`; // safe-text: this package's own SVG, built from its glyph constants\n break;\n case 'cloudy':\n body = `${cloud('aparte-wx-cloud-back', 'translate(8 -5) scale(0.82)')}<g class=\"aparte-wx-drift\">${cloud('aparte-wx-cloud', 'translate(-2 4)')}</g>`; // safe-text: this package's own SVG, built from its glyph constants\n break;\n case 'fog':\n body = `${cloud('aparte-wx-cloud', 'translate(0 -8)')}${FOG}`;\n break;\n case 'drizzle':\n body = `${cloud('aparte-wx-cloud', up)}${dots(4)}`;\n break;\n case 'rain':\n body = `${cloud('aparte-wx-cloud', up)}${drops(3)}`;\n break;\n case 'heavy-rain':\n body = `${cloud('aparte-wx-cloud-back', 'translate(9 -12) scale(0.8)')}${cloud('aparte-wx-cloud aparte-wx-cloud--dark', up)}${drops(5)}`;\n break;\n case 'sleet':\n body = `${cloud('aparte-wx-cloud', up)}${drops(2)}${flakes([40])}`;\n break;\n case 'snow':\n body = `${cloud('aparte-wx-cloud', up)}${flakes([23, 32, 41])}`;\n break;\n case 'thunder':\n body = `${cloud('aparte-wx-cloud-back', 'translate(9 -12) scale(0.8)')}${cloud('aparte-wx-cloud aparte-wx-cloud--dark', up)}${BOLT}`;\n break;\n case 'wind':\n body = WIND;\n break;\n }\n return `<svg viewBox=\"0 0 64 64\" xmlns=\"http://www.w3.org/2000/svg\" class=\"aparte-wx\" data-condition=\"${condition}\"${night ? ' data-night=\"\"' : ''}>${body}</svg>`; // safe-attr: a WeatherCondition, one of eleven constants // safe-text: this package's own SVG, built from its glyph constants\n}\n","export default \"/* =========================================\\n The weather card — @aparte/plugin-cards/weather\\n =========================================\\n Three variants of one card, chosen by `data-variant` on its root:\\n hero the sky behind the temperature, the stats, the next hours\\n compact one line on the card's surface, the sky as an edge\\n forecast a header on the sky, then the days, each with its range\\n Every colour is a `--aparte-weather-*` token: the glyphs' parts, the eleven skies by\\n day and by night. A theme repaints the weather by setting them.\\n */\\n\\n/* Declared with no weight: core adds a renderer's sheet AFTER the app's CSS, so at equal\\n weight an app's own `.aparte-weather-card { --aparte-weather-sky-clear: … }` would lose. */\\n:where(.aparte-weather-card) {\\n /* The glyphs on the card's own surface. */\\n --aparte-weather-sun: #fbbf24;\\n --aparte-weather-sun-rays: #f59e0b;\\n --aparte-weather-moon: #c9ad5f;\\n --aparte-weather-star: #fde68a;\\n --aparte-weather-cloud: #c7d0dc;\\n --aparte-weather-cloud-back: #dfe5ed;\\n --aparte-weather-cloud-dark: #8794a7;\\n --aparte-weather-rain: #3b82f6;\\n --aparte-weather-snow: #6aa9ec;\\n --aparte-weather-bolt: #f5b80b;\\n --aparte-weather-fog: #98a3b3;\\n --aparte-weather-wind: #7f93ad;\\n\\n /* The skies, by day. */\\n --aparte-weather-sky-clear: linear-gradient(160deg, #2a78dc 0%, #4fa7f0 55%, #7cc6f7 100%);\\n --aparte-weather-sky-partly-cloudy: linear-gradient(160deg, #3a7acb 0%, #6aa3dd 60%, #9cc4ea 100%);\\n --aparte-weather-sky-cloudy: linear-gradient(160deg, #56657a 0%, #75849a 60%, #8d9bb0 100%);\\n --aparte-weather-sky-fog: linear-gradient(160deg, #636e7d 0%, #808a98 60%, #9aa3af 100%);\\n --aparte-weather-sky-drizzle: linear-gradient(160deg, #4a6079 0%, #6a7f98 60%, #8396ac 100%);\\n --aparte-weather-sky-rain: linear-gradient(160deg, #364860 0%, #55687f 60%, #6c7f95 100%);\\n --aparte-weather-sky-heavy-rain: linear-gradient(160deg, #2a374b 0%, #445367 60%, #5a697d 100%);\\n --aparte-weather-sky-sleet: linear-gradient(160deg, #495b71 0%, #6a7f96 60%, #8ea2b8 100%);\\n --aparte-weather-sky-snow: linear-gradient(160deg, #557495 0%, #7e9cbd 60%, #a5bfd8 100%);\\n --aparte-weather-sky-thunder: linear-gradient(160deg, #26223c 0%, #3d375a 60%, #554d74 100%);\\n --aparte-weather-sky-wind: linear-gradient(160deg, #46719a 0%, #6b93b9 60%, #93b4d2 100%);\\n\\n /* And by night. */\\n --aparte-weather-night-clear: linear-gradient(160deg, #081127 0%, #16224a 55%, #2b3a70 100%);\\n --aparte-weather-night-partly-cloudy: linear-gradient(160deg, #0f1834 0%, #1f2b52 60%, #38466f 100%);\\n --aparte-weather-night-cloudy: linear-gradient(160deg, #191f2b 0%, #2a3241 60%, #3c4556 100%);\\n --aparte-weather-night-fog: linear-gradient(160deg, #1f242d 0%, #333a45 60%, #484f5b 100%);\\n --aparte-weather-night-drizzle: linear-gradient(160deg, #18212f 0%, #2a3647 60%, #3c4a5e 100%);\\n --aparte-weather-night-rain: linear-gradient(160deg, #131b28 0%, #24303f 60%, #344255 100%);\\n --aparte-weather-night-heavy-rain: linear-gradient(160deg, #0e141f 0%, #1c2533 60%, #2b3647 100%);\\n --aparte-weather-night-sleet: linear-gradient(160deg, #1a2433 0%, #2d3a4d 60%, #425267 100%);\\n --aparte-weather-night-snow: linear-gradient(160deg, #1f2c42 0%, #33476a 60%, #4d6386 100%);\\n --aparte-weather-night-thunder: linear-gradient(160deg, #110e23 0%, #221d3d 60%, #352e55 100%);\\n --aparte-weather-night-wind: linear-gradient(160deg, #142236 0%, #243a58 60%, #395271 100%);\\n\\n /* Text on a sky. */\\n --aparte-weather-on-sky: #ffffff;\\n --aparte-weather-on-sky-muted: rgb(255 255 255 / 0.8);\\n --aparte-weather-tile: rgb(255 255 255 / 0.14);\\n --aparte-weather-tile-border: rgb(255 255 255 / 0.18);\\n}\\n\\n/* The glyphs drawn over a sky: white clouds, pale rain. */\\n.aparte-weather-card[data-variant=\\\"hero\\\"][data-state=\\\"ready\\\"],\\n.aparte-weather__forecast-head {\\n --aparte-weather-cloud: #ffffff;\\n --aparte-weather-moon: #f1e9c8;\\n --aparte-weather-cloud-back: rgb(255 255 255 / 0.62);\\n --aparte-weather-cloud-dark: #d3dae4;\\n --aparte-weather-rain: #bfdbfe;\\n --aparte-weather-snow: #ffffff;\\n --aparte-weather-fog: rgb(255 255 255 / 0.85);\\n --aparte-weather-wind: rgb(255 255 255 / 0.92);\\n --aparte-rich-card-spark: rgb(255 255 255 / 0.95);\\n}\\n\\n/* ── The sky ─────────────────────────────────────────────────────────── */\\n\\n.aparte-weather__sky {\\n position: absolute;\\n inset: 0;\\n z-index: -1;\\n background: var(--aparte-weather-sky-partly-cloudy);\\n}\\n\\n.aparte-weather__sky::after {\\n content: \\\"\\\";\\n position: absolute;\\n inset: 0;\\n background: radial-gradient(120% 80% at 100% 0%, rgb(255 255 255 / 0.22), transparent 60%);\\n pointer-events: none;\\n}\\n\\n.aparte-weather__sky[data-condition=\\\"clear\\\"]::after {\\n background: radial-gradient(90% 70% at 92% 4%, rgb(255 223 130 / 0.45), transparent 62%);\\n}\\n\\n.aparte-weather__sky[data-night]::after {\\n background:\\n radial-gradient(1.5px 1.5px at 18% 22%, rgb(255 255 255 / 0.8), transparent 100%),\\n radial-gradient(1px 1px at 34% 12%, rgb(255 255 255 / 0.7), transparent 100%),\\n radial-gradient(1.2px 1.2px at 62% 30%, rgb(255 255 255 / 0.6), transparent 100%),\\n radial-gradient(1px 1px at 78% 16%, rgb(255 255 255 / 0.7), transparent 100%),\\n radial-gradient(1.4px 1.4px at 48% 8%, rgb(255 255 255 / 0.5), transparent 100%);\\n}\\n\\n.aparte-weather__sky[data-condition=\\\"clear\\\"], .aparte-weather__accent[data-condition=\\\"clear\\\"] { background: var(--aparte-weather-sky-clear); }\\n.aparte-weather__sky[data-condition=\\\"partly-cloudy\\\"], .aparte-weather__accent[data-condition=\\\"partly-cloudy\\\"] { background: var(--aparte-weather-sky-partly-cloudy); }\\n.aparte-weather__sky[data-condition=\\\"cloudy\\\"], .aparte-weather__accent[data-condition=\\\"cloudy\\\"] { background: var(--aparte-weather-sky-cloudy); }\\n.aparte-weather__sky[data-condition=\\\"fog\\\"], .aparte-weather__accent[data-condition=\\\"fog\\\"] { background: var(--aparte-weather-sky-fog); }\\n.aparte-weather__sky[data-condition=\\\"drizzle\\\"], .aparte-weather__accent[data-condition=\\\"drizzle\\\"] { background: var(--aparte-weather-sky-drizzle); }\\n.aparte-weather__sky[data-condition=\\\"rain\\\"], .aparte-weather__accent[data-condition=\\\"rain\\\"] { background: var(--aparte-weather-sky-rain); }\\n.aparte-weather__sky[data-condition=\\\"heavy-rain\\\"], .aparte-weather__accent[data-condition=\\\"heavy-rain\\\"] { background: var(--aparte-weather-sky-heavy-rain); }\\n.aparte-weather__sky[data-condition=\\\"sleet\\\"], .aparte-weather__accent[data-condition=\\\"sleet\\\"] { background: var(--aparte-weather-sky-sleet); }\\n.aparte-weather__sky[data-condition=\\\"snow\\\"], .aparte-weather__accent[data-condition=\\\"snow\\\"] { background: var(--aparte-weather-sky-snow); }\\n.aparte-weather__sky[data-condition=\\\"thunder\\\"], .aparte-weather__accent[data-condition=\\\"thunder\\\"] { background: var(--aparte-weather-sky-thunder); }\\n.aparte-weather__sky[data-condition=\\\"wind\\\"], .aparte-weather__accent[data-condition=\\\"wind\\\"] { background: var(--aparte-weather-sky-wind); }\\n\\n.aparte-weather__sky[data-night][data-condition=\\\"clear\\\"], .aparte-weather__accent[data-night][data-condition=\\\"clear\\\"] { background: var(--aparte-weather-night-clear); }\\n.aparte-weather__sky[data-night][data-condition=\\\"partly-cloudy\\\"], .aparte-weather__accent[data-night][data-condition=\\\"partly-cloudy\\\"] { background: var(--aparte-weather-night-partly-cloudy); }\\n.aparte-weather__sky[data-night][data-condition=\\\"cloudy\\\"], .aparte-weather__accent[data-night][data-condition=\\\"cloudy\\\"] { background: var(--aparte-weather-night-cloudy); }\\n.aparte-weather__sky[data-night][data-condition=\\\"fog\\\"], .aparte-weather__accent[data-night][data-condition=\\\"fog\\\"] { background: var(--aparte-weather-night-fog); }\\n.aparte-weather__sky[data-night][data-condition=\\\"drizzle\\\"], .aparte-weather__accent[data-night][data-condition=\\\"drizzle\\\"] { background: var(--aparte-weather-night-drizzle); }\\n.aparte-weather__sky[data-night][data-condition=\\\"rain\\\"], .aparte-weather__accent[data-night][data-condition=\\\"rain\\\"] { background: var(--aparte-weather-night-rain); }\\n.aparte-weather__sky[data-night][data-condition=\\\"heavy-rain\\\"], .aparte-weather__accent[data-night][data-condition=\\\"heavy-rain\\\"] { background: var(--aparte-weather-night-heavy-rain); }\\n.aparte-weather__sky[data-night][data-condition=\\\"sleet\\\"], .aparte-weather__accent[data-night][data-condition=\\\"sleet\\\"] { background: var(--aparte-weather-night-sleet); }\\n.aparte-weather__sky[data-night][data-condition=\\\"snow\\\"], .aparte-weather__accent[data-night][data-condition=\\\"snow\\\"] { background: var(--aparte-weather-night-snow); }\\n.aparte-weather__sky[data-night][data-condition=\\\"thunder\\\"], .aparte-weather__accent[data-night][data-condition=\\\"thunder\\\"] { background: var(--aparte-weather-night-thunder); }\\n.aparte-weather__sky[data-night][data-condition=\\\"wind\\\"], .aparte-weather__accent[data-night][data-condition=\\\"wind\\\"] { background: var(--aparte-weather-night-wind); }\\n\\n/* ── Hero ────────────────────────────────────────────────────────────── */\\n\\n.aparte-weather-card[data-variant=\\\"hero\\\"][data-state=\\\"ready\\\"] {\\n color: var(--aparte-weather-on-sky);\\n border-color: rgb(0 0 0 / 0.06);\\n background: transparent;\\n box-shadow: 0 10px 30px -18px rgb(15 23 42 / 0.55);\\n text-shadow: 0 1px 2px rgb(0 0 0 / 0.16);\\n}\\n\\n/* The card narrows on its own width, not the window's: a widget on a wide screen is as\\n narrow as a phone. On a drawn card (or its skeleton) only — a one-line state shrinks to\\n its words, and a size container cannot. */\\n.aparte-weather-card:is([data-state=\\\"ready\\\"], [data-state=\\\"loading\\\"]) {\\n container: aparte-weather / inline-size;\\n}\\n\\n.aparte-weather__body {\\n display: grid;\\n gap: var(--aparte-space-6);\\n padding: var(--aparte-space-7) var(--aparte-space-8) var(--aparte-space-7);\\n}\\n\\n.aparte-weather__head {\\n display: flex;\\n align-items: flex-start;\\n justify-content: space-between;\\n gap: var(--aparte-space-4);\\n}\\n\\n.aparte-weather__place {\\n display: flex;\\n flex-direction: column;\\n gap: var(--aparte-space-1);\\n min-inline-size: 0;\\n}\\n\\n.aparte-weather__location {\\n font-size: var(--aparte-font-size-lg);\\n font-weight: var(--aparte-font-weight-semibold);\\n letter-spacing: -0.01em;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n\\n.aparte-weather__when {\\n font-size: var(--aparte-font-size-sm);\\n color: var(--aparte-weather-on-sky-muted);\\n}\\n\\n.aparte-weather-card[data-variant=\\\"hero\\\"] .aparte-weather__icon {\\n --aparte-rich-card-glyph-size: 4.5rem;\\n margin-block: calc(var(--aparte-space-2) * -1) calc(var(--aparte-space-6) * -1);\\n margin-inline-end: calc(var(--aparte-space-2) * -1);\\n filter: drop-shadow(0 6px 10px rgb(0 0 0 / 0.18));\\n}\\n\\n.aparte-weather__now {\\n display: flex;\\n align-items: center;\\n gap: var(--aparte-space-7);\\n}\\n\\n.aparte-weather-card[data-variant=\\\"hero\\\"] .aparte-weather__temp {\\n font-size: calc(3.75rem * var(--aparte-font-scale));\\n font-weight: 300;\\n line-height: 0.9;\\n letter-spacing: -0.045em;\\n}\\n\\n.aparte-weather__now-text {\\n display: flex;\\n flex-direction: column;\\n gap: var(--aparte-space-2);\\n min-inline-size: 0;\\n}\\n\\n.aparte-weather__summary {\\n font-size: var(--aparte-font-size-base);\\n font-weight: var(--aparte-font-weight-medium);\\n}\\n\\n.aparte-weather__line {\\n display: flex;\\n flex-wrap: wrap;\\n column-gap: var(--aparte-space-5);\\n row-gap: var(--aparte-space-1);\\n font-size: var(--aparte-font-size-sm);\\n color: var(--aparte-weather-on-sky-muted);\\n}\\n\\n.aparte-weather__range {\\n display: inline-flex;\\n gap: var(--aparte-space-4);\\n white-space: nowrap;\\n}\\n\\n.aparte-weather__stats {\\n display: grid;\\n grid-template-columns: repeat(auto-fit, minmax(5.5rem, 1fr));\\n gap: var(--aparte-space-3);\\n margin: 0;\\n}\\n\\n.aparte-weather__stat {\\n display: flex;\\n flex-direction: column;\\n gap: var(--aparte-space-1);\\n padding: var(--aparte-space-3) var(--aparte-space-4);\\n border: var(--aparte-border-width) solid var(--aparte-weather-tile-border);\\n border-radius: var(--aparte-radius-lg);\\n background: var(--aparte-weather-tile);\\n backdrop-filter: blur(6px);\\n}\\n\\n.aparte-weather__stat-label {\\n font-size: var(--aparte-font-size-2xs);\\n font-weight: var(--aparte-font-weight-semibold);\\n letter-spacing: 0.06em;\\n text-transform: uppercase;\\n color: var(--aparte-weather-on-sky-muted);\\n}\\n\\n.aparte-weather__stat-value {\\n display: flex;\\n align-items: center;\\n gap: var(--aparte-space-2);\\n margin: 0;\\n font-size: var(--aparte-font-size-md);\\n font-weight: var(--aparte-font-weight-semibold);\\n white-space: nowrap;\\n}\\n\\n.aparte-weather__wind-arrow {\\n display: inline-block;\\n font-size: var(--aparte-font-size-sm);\\n transform: rotate(var(--aparte-weather-wind-angle, 0deg));\\n}\\n\\n/* Buttons on the sky: glass, not the surface's. */\\n.aparte-weather-card[data-variant=\\\"hero\\\"][data-state=\\\"ready\\\"] .aparte-rich-card__actions {\\n padding-inline: var(--aparte-space-8);\\n border-block-start-color: var(--aparte-weather-tile-border);\\n background: rgb(0 0 0 / 0.1);\\n}\\n\\n.aparte-weather-card[data-variant=\\\"hero\\\"][data-state=\\\"ready\\\"] .aparte-rich-card__action {\\n border-color: var(--aparte-weather-tile-border);\\n background: var(--aparte-weather-tile);\\n color: var(--aparte-weather-on-sky);\\n text-shadow: none;\\n}\\n\\n.aparte-weather-card[data-variant=\\\"hero\\\"][data-state=\\\"ready\\\"] .aparte-rich-card__action:hover {\\n background: rgb(255 255 255 / 0.24);\\n}\\n\\n/* The next hours: a row of columns, the temperature's curve drawn above them. */\\n.aparte-weather__hourly {\\n --aparte-weather-hours: 8;\\n display: grid;\\n gap: var(--aparte-space-1);\\n padding-block-start: var(--aparte-space-5);\\n border-block-start: var(--aparte-border-width) solid var(--aparte-weather-tile-border);\\n overflow-x: auto;\\n scrollbar-width: none;\\n}\\n\\n.aparte-weather__curve {\\n block-size: 1.75rem;\\n /* The curve's points sit over the middle of each column. */\\n padding-inline: calc(50% / var(--aparte-weather-hours));\\n min-inline-size: calc(var(--aparte-weather-hours) * 2.75rem);\\n box-sizing: border-box;\\n}\\n\\n.aparte-weather__hours {\\n display: grid;\\n grid-auto-flow: column;\\n grid-auto-columns: minmax(2.75rem, 1fr);\\n margin: 0;\\n padding: 0;\\n list-style: none;\\n}\\n\\n.aparte-weather__hour {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n gap: var(--aparte-space-2);\\n}\\n\\n.aparte-weather__hour-time {\\n font-size: var(--aparte-font-size-xs);\\n color: var(--aparte-weather-on-sky-muted);\\n white-space: nowrap;\\n}\\n\\n.aparte-weather__hour-temp {\\n font-size: var(--aparte-font-size-md);\\n font-weight: var(--aparte-font-weight-semibold);\\n}\\n\\n.aparte-weather__hour-rain {\\n margin-block: calc(var(--aparte-space-2) * -1);\\n font-size: var(--aparte-font-size-2xs);\\n font-weight: var(--aparte-font-weight-semibold);\\n color: #cfe5ff;\\n}\\n\\n.aparte-weather__mini {\\n --aparte-rich-card-glyph-size: 1.6rem;\\n}\\n\\n/* A small drawing stands still: only the big glyph moves. */\\n.aparte-weather__mini svg * {\\n animation: none !important;\\n}\\n\\n/* ── Compact ─────────────────────────────────────────────────────────── */\\n\\n.aparte-weather-card[data-variant=\\\"compact\\\"] {\\n max-inline-size: 22rem;\\n}\\n\\n.aparte-weather__accent {\\n position: absolute;\\n inset-block: 0;\\n inset-inline-start: 0;\\n inline-size: 4px;\\n}\\n\\n.aparte-weather__compact {\\n display: flex;\\n align-items: center;\\n gap: var(--aparte-space-5);\\n padding: var(--aparte-space-4) var(--aparte-space-6) var(--aparte-space-4) calc(var(--aparte-space-6) + 4px);\\n}\\n\\n.aparte-weather__compact .aparte-weather__icon {\\n --aparte-rich-card-glyph-size: 2.4rem;\\n}\\n\\n.aparte-weather__compact .aparte-weather__temp {\\n font-size: var(--aparte-font-size-2xl);\\n font-weight: var(--aparte-font-weight-semibold);\\n letter-spacing: -0.03em;\\n line-height: 1;\\n}\\n\\n.aparte-weather__compact-text {\\n display: flex;\\n flex-direction: column;\\n min-inline-size: 0;\\n flex: 1;\\n}\\n\\n.aparte-weather__compact .aparte-weather__location {\\n font-size: var(--aparte-font-size-md);\\n}\\n\\n.aparte-weather__compact .aparte-weather__summary {\\n font-size: var(--aparte-font-size-sm);\\n font-weight: var(--aparte-font-weight-normal);\\n color: var(--aparte-text-muted);\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n\\n.aparte-weather__compact .aparte-weather__range {\\n flex-direction: column;\\n gap: 0;\\n font-size: var(--aparte-font-size-sm);\\n color: var(--aparte-text-muted);\\n text-align: end;\\n}\\n\\n.aparte-weather__compact .aparte-weather__hi {\\n color: var(--aparte-text);\\n font-weight: var(--aparte-font-weight-semibold);\\n}\\n\\n/* ── Forecast ────────────────────────────────────────────────────────── */\\n\\n.aparte-weather__forecast-head {\\n position: relative;\\n isolation: isolate;\\n color: var(--aparte-weather-on-sky);\\n text-shadow: 0 1px 2px rgb(0 0 0 / 0.16);\\n}\\n\\n.aparte-weather__forecast-head .aparte-weather__compact {\\n padding: var(--aparte-space-6) var(--aparte-space-7);\\n}\\n\\n.aparte-weather__forecast-head .aparte-weather__icon {\\n --aparte-rich-card-glyph-size: 3.25rem;\\n}\\n\\n.aparte-weather__forecast-head .aparte-weather__temp {\\n font-size: calc(2.25rem * var(--aparte-font-scale));\\n font-weight: 300;\\n}\\n\\n.aparte-weather__forecast-head .aparte-weather__summary,\\n.aparte-weather__forecast-head .aparte-weather__range {\\n color: var(--aparte-weather-on-sky-muted);\\n}\\n\\n.aparte-weather__forecast-head .aparte-weather__hi {\\n color: var(--aparte-weather-on-sky);\\n}\\n\\n.aparte-weather__days {\\n margin: 0;\\n padding: var(--aparte-space-2) var(--aparte-space-7) var(--aparte-space-4);\\n list-style: none;\\n}\\n\\n.aparte-weather__day {\\n display: grid;\\n grid-template-columns: minmax(3.25rem, auto) 1.75rem 2.25rem 2.25rem minmax(3rem, 1fr) 2.25rem;\\n align-items: center;\\n gap: var(--aparte-space-3);\\n padding-block: var(--aparte-space-3);\\n font-size: var(--aparte-font-size-md);\\n}\\n\\n.aparte-weather__day + .aparte-weather__day {\\n border-block-start: var(--aparte-border-width) solid var(--aparte-border);\\n}\\n\\n.aparte-weather__day-name {\\n font-weight: var(--aparte-font-weight-medium);\\n white-space: nowrap;\\n}\\n\\n.aparte-weather__day-rain {\\n font-size: var(--aparte-font-size-xs);\\n font-weight: var(--aparte-font-weight-semibold);\\n color: var(--aparte-weather-rain);\\n}\\n\\n.aparte-weather__day-low {\\n color: var(--aparte-text-muted);\\n text-align: end;\\n}\\n\\n.aparte-weather__day-high {\\n font-weight: var(--aparte-font-weight-semibold);\\n}\\n\\n.aparte-weather__bar {\\n position: relative;\\n block-size: 6px;\\n border-radius: var(--aparte-radius-full);\\n background: color-mix(in oklab, var(--aparte-text) 10%, transparent);\\n}\\n\\n.aparte-weather__bar-fill {\\n position: absolute;\\n inset-block: 0;\\n inset-inline-start: var(--aparte-weather-bar-start, 0%);\\n inset-inline-end: calc(100% - var(--aparte-weather-bar-end, 100%));\\n border-radius: inherit;\\n background: linear-gradient(to right, var(--aparte-weather-bar-cold), var(--aparte-weather-bar-warm));\\n}\\n\\n.aparte-weather__bar-fill:dir(rtl) {\\n background: linear-gradient(to left, var(--aparte-weather-bar-cold), var(--aparte-weather-bar-warm));\\n}\\n\\n.aparte-weather__bar-now {\\n position: absolute;\\n inset-block-start: 50%;\\n inset-inline-start: calc(var(--aparte-weather-bar-at, 0%) - 5px);\\n inline-size: 10px;\\n block-size: 10px;\\n border: 2px solid var(--aparte-surface-1);\\n border-radius: var(--aparte-radius-full);\\n background: var(--aparte-text);\\n transform: translateY(-50%);\\n}\\n\\n/* ── Loading ─────────────────────────────────────────────────────────── */\\n\\n.aparte-weather-card[data-state=\\\"loading\\\"] .aparte-weather__sk-place { inline-size: 7rem; }\\n.aparte-weather-card[data-state=\\\"loading\\\"] .aparte-weather__sk-icon { inline-size: 3.5rem; block-size: 3.5rem; flex: none; }\\n.aparte-weather-card[data-state=\\\"loading\\\"] .aparte-weather__sk-temp { inline-size: 5.5rem; block-size: 3.25rem; border-radius: var(--aparte-radius-lg); }\\n.aparte-weather-card[data-state=\\\"loading\\\"] .aparte-weather__sk-summary { inline-size: 8rem; }\\n.aparte-weather-card[data-state=\\\"loading\\\"] .aparte-weather__sk-stats {\\n display: grid;\\n grid-template-columns: repeat(3, 1fr);\\n gap: var(--aparte-space-3);\\n}\\n.aparte-weather-card[data-state=\\\"loading\\\"] .aparte-weather__sk-stat { block-size: 3rem; border-radius: var(--aparte-radius-lg); }\\n.aparte-weather-card[data-state=\\\"loading\\\"] .aparte-weather__compact .aparte-weather__sk-icon { inline-size: 2.6rem; block-size: 2.6rem; }\\n.aparte-weather-card[data-state=\\\"loading\\\"] .aparte-weather__compact .aparte-weather__sk-temp { inline-size: 3rem; block-size: 1.75rem; }\\n\\n/* ── The glyphs ──────────────────────────────────────────────────────── */\\n\\n.aparte-wx .aparte-wx-sun { fill: var(--aparte-weather-sun); }\\n.aparte-wx .aparte-wx-rays {\\n fill: none;\\n stroke: var(--aparte-weather-sun-rays);\\n stroke-width: 3.2;\\n stroke-linecap: round;\\n transform-box: view-box;\\n transform-origin: 32px 32px;\\n /* Core's turn: its sheet is on every page a chat is on. */\\n animation: aparte-spin 60s linear infinite;\\n}\\n.aparte-wx .aparte-wx-moon { fill: var(--aparte-weather-moon); }\\n.aparte-wx .aparte-wx-star { fill: var(--aparte-weather-star); animation: aparte-weather-twinkle 3.2s ease-in-out infinite; }\\n.aparte-wx .aparte-wx-star + .aparte-wx-star { animation-delay: -1.6s; }\\n.aparte-wx .aparte-wx-cloud { fill: var(--aparte-weather-cloud); }\\n.aparte-wx .aparte-wx-cloud-back { fill: var(--aparte-weather-cloud-back); }\\n.aparte-wx .aparte-wx-cloud--dark { fill: var(--aparte-weather-cloud-dark); }\\n.aparte-wx .aparte-wx-drift { animation: aparte-weather-drift 7s ease-in-out infinite alternate; }\\n.aparte-wx .aparte-wx-drop {\\n fill: none;\\n stroke: var(--aparte-weather-rain);\\n stroke-width: 3;\\n stroke-linecap: round;\\n animation: aparte-weather-fall 1.3s ease-in infinite;\\n animation-delay: calc(var(--i, 0) * -0.45s);\\n}\\n.aparte-wx .aparte-wx-drip {\\n fill: var(--aparte-weather-rain);\\n animation: aparte-weather-fall 1.6s ease-in infinite;\\n animation-delay: calc(var(--i, 0) * -0.4s);\\n}\\n.aparte-wx .aparte-wx-flake path {\\n fill: none;\\n stroke: var(--aparte-weather-snow);\\n stroke-width: 1.8;\\n stroke-linecap: round;\\n animation: aparte-weather-snowfall 3.4s linear infinite;\\n}\\n.aparte-wx .aparte-wx-flake:nth-child(2) path { animation-delay: -1.1s; }\\n.aparte-wx .aparte-wx-flake:nth-child(3) path { animation-delay: -2.2s; }\\n.aparte-wx .aparte-wx-bolt { fill: var(--aparte-weather-bolt); animation: aparte-weather-flash 4.5s linear infinite; }\\n.aparte-wx .aparte-wx-fog, .aparte-wx .aparte-wx-wind {\\n fill: none;\\n stroke-width: 3.2;\\n stroke-linecap: round;\\n}\\n.aparte-wx .aparte-wx-fog { stroke: var(--aparte-weather-fog); }\\n.aparte-wx .aparte-wx-fog-g { animation: aparte-weather-drift 6s ease-in-out infinite alternate; }\\n.aparte-wx .aparte-wx-wind { stroke: var(--aparte-weather-wind); stroke-width: 3.6; animation: aparte-weather-gust 3.2s ease-in-out infinite alternate; }\\n.aparte-wx .aparte-wx-wind:nth-child(2) { animation-delay: -1.1s; }\\n.aparte-wx .aparte-wx-wind:nth-child(3) { animation-delay: -2.2s; }\\n\\n@keyframes aparte-weather-twinkle { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } }\\n@keyframes aparte-weather-drift { from { transform: translateX(-1.5px); } to { transform: translateX(1.5px); } }\\n@keyframes aparte-weather-fall {\\n 0% { transform: translateY(-3px); opacity: 0; }\\n 25% { opacity: 1; }\\n 100% { transform: translateY(6px); opacity: 0; }\\n}\\n@keyframes aparte-weather-snowfall {\\n 0% { transform: translate(0, -3px); opacity: 0; }\\n 20% { opacity: 1; }\\n 100% { transform: translate(2px, 6px); opacity: 0; }\\n}\\n@keyframes aparte-weather-flash {\\n 0%, 86%, 100% { opacity: 1; }\\n 88% { opacity: 0.25; }\\n 90% { opacity: 1; }\\n 92% { opacity: 0.4; }\\n}\\n@keyframes aparte-weather-gust {\\n from { transform: translateX(-2px); }\\n to { transform: translateX(2.5px); }\\n}\\n\\n@container aparte-weather (max-width: 22rem) {\\n .aparte-weather__body { padding: var(--aparte-space-6); }\\n .aparte-weather-card[data-variant=\\\"hero\\\"] .aparte-weather__temp { font-size: calc(3rem * var(--aparte-font-scale)); }\\n .aparte-weather__days { padding-inline: var(--aparte-space-5); }\\n .aparte-weather__day { grid-template-columns: minmax(2.75rem, auto) 1.5rem 2rem 2rem minmax(2rem, 1fr) 2rem; }\\n}\\n\"","/**\n * @aparte/plugin-cards/weather — a tool's weather, drawn as a card.\n *\n * import { setupWeatherCard, fromOpenMeteo } from '@aparte/plugin-cards/weather';\n *\n * setupWeatherCard({\n * tool: 'get_weather',\n * map: (result) => fromOpenMeteo(result.forecast, { location: result.city }),\n * });\n *\n * Three variants of one card: `hero` (the sky, the temperature, the next hours), `compact`\n * (one line) and `forecast` (the days ahead, each with its range). Your tool keeps its\n * own fields — `map` says which is which — and three readers turn the codes of the usual\n * APIs into the card's conditions: `conditionFromWmo` (Open-Meteo), `conditionFromOpenWeather`\n * and `conditionFromText`.\n */\nimport type { AparteConfig } from '@aparte/core';\nimport { defineCard, type CardContext, type CardSetupOptions } from '../kit/define.js';\nimport { el, glyph, num, str, type Loose } from '../kit/dom.js';\nimport { formatDay, formatHour, formatNumber, formatPercent, formatUnit, formatWhen, toDate } from '../kit/format.js';\nimport { sparkline } from '../kit/sparkline.js';\nimport { word, type CardWord } from '../kit/strings.js';\nimport { CONDITION_WORDS, conditionFromText, conditionFromWmo, type WeatherCondition } from './conditions.js';\nimport { weatherIcon } from './icons.js';\nimport weatherStyles from './weather.css?raw';\n\nexport type WeatherVariant = 'hero' | 'compact' | 'forecast';\nexport type WindUnit = 'km/h' | 'mph' | 'm/s' | 'kn';\n\n/** One hour ahead. */\nexport interface WeatherHour {\n time: string | number | Date;\n temperature: number;\n condition?: WeatherCondition | string;\n /** Chance of precipitation, 0–100. */\n precipitation?: number;\n /** OpenWeather's `pop`: the same chance as a share, 0–1, where `1` is certain rain. */\n pop?: number;\n night?: boolean;\n}\n\n/** One day ahead. */\nexport interface WeatherDay {\n date: string | number | Date;\n condition?: WeatherCondition | string;\n high: number;\n low: number;\n /** Chance of precipitation, 0–100. */\n precipitation?: number;\n /** OpenWeather's `pop`: the same chance as a share, 0–1, where `1` is certain rain. */\n pop?: number;\n}\n\n/**\n * The weather card's fields — what `map` returns. Only `temperature` (or `daily`) is\n * needed; every other field adds a line when it is there and nothing when it is not.\n */\nexport interface WeatherInput {\n location?: string;\n /** One of the eleven conditions, or a description `conditionFromText` reads. */\n condition?: WeatherCondition | string;\n /** The tool's own description, in its own language; else the condition's name. */\n summary?: string;\n temperature?: number;\n /** `C` (default) or `F` — `fahrenheit` and OpenWeather's `imperial` read as `F` too. */\n unit?: 'C' | 'F' | 'fahrenheit' | 'imperial' | 'metric';\n feelsLike?: number;\n high?: number;\n low?: number;\n /** 0–100. */\n humidity?: number;\n /** A speed in `km/h`, or `{ speed, unit, direction }` — direction in degrees, where it blows from. */\n wind?: number | { speed: number; unit?: WindUnit; direction?: number };\n /** Chance of precipitation, 0–100. */\n precipitation?: number;\n /** OpenWeather's `pop`: the same chance as a share, 0–1, where `1` is certain rain. */\n pop?: number;\n /** Draw the night sky and the moon. */\n night?: boolean;\n /** When this was measured. */\n time?: string | number | Date;\n hourly?: WeatherHour[];\n daily?: WeatherDay[];\n}\n\n/** The data as the card draws it, once read. */\nexport interface WeatherData {\n location?: string;\n condition: WeatherCondition;\n summary?: string;\n temperature?: number;\n unit: 'C' | 'F';\n feelsLike?: number;\n high?: number;\n low?: number;\n humidity?: number;\n wind?: { speed: number; unit: WindUnit; direction?: number };\n precipitation?: number;\n night: boolean;\n time?: Date;\n hourly: Array<{ time: Date; temperature: number; condition?: WeatherCondition; precipitation?: number; night: boolean }>;\n daily: Array<{ date: Date; condition: WeatherCondition; high: number; low: number; precipitation?: number }>;\n}\n\nconst W = {\n cardsWeatherTitle: { en: 'Weather', fr: 'Météo', de: 'Wetter', es: 'Tiempo', it: 'Meteo', ja: '天気', ko: '날씨', pt: 'Clima', ru: 'Погода', zh: '天气' },\n cardsWeatherIn: { en: 'Weather in {place}', fr: 'Météo à {place}', de: 'Wetter in {place}', es: 'Tiempo en {place}', it: 'Meteo a {place}', ja: '{place}の天気', ko: '{place} 날씨', pt: 'Clima em {place}', ru: 'Погода: {place}', zh: '{place}天气' },\n cardsWeatherFeelsLike: { en: 'Feels like {t}', fr: 'Ressenti {t}', de: 'Gefühlt {t}', es: 'Sensación {t}', it: 'Percepita {t}', ja: '体感 {t}', ko: '체감 {t}', pt: 'Sensação {t}', ru: 'Ощущается как {t}', zh: '体感 {t}' },\n cardsWeatherHigh: { en: 'High', fr: 'Max.', de: 'Höchst', es: 'Máx.', it: 'Max', ja: '最高', ko: '최고', pt: 'Máx.', ru: 'Макс.', zh: '最高' },\n cardsWeatherLow: { en: 'Low', fr: 'Min.', de: 'Tiefst', es: 'Mín.', it: 'Min', ja: '最低', ko: '최저', pt: 'Mín.', ru: 'Мин.', zh: '最低' },\n cardsWeatherWind: { en: 'Wind', fr: 'Vent', de: 'Wind', es: 'Viento', it: 'Vento', ja: '風', ko: '바람', pt: 'Vento', ru: 'Ветер', zh: '风' },\n cardsWeatherHumidity: { en: 'Humidity', fr: 'Humidité', de: 'Feuchte', es: 'Humedad', it: 'Umidità', ja: '湿度', ko: '습도', pt: 'Umidade', ru: 'Влажность', zh: '湿度' },\n cardsWeatherRain: { en: 'Rain', fr: 'Pluie', de: 'Regen', es: 'Lluvia', it: 'Pioggia', ja: '降水', ko: '강수', pt: 'Chuva', ru: 'Осадки', zh: '降水' },\n cardsWeatherNow: { en: 'Now', fr: 'Maint.', de: 'Jetzt', es: 'Ahora', it: 'Ora', ja: '今', ko: '지금', pt: 'Agora', ru: 'Сейчас', zh: '现在' },\n cardsWeatherForecast: { en: 'Forecast', fr: 'Prévisions', de: 'Vorhersage', es: 'Pronóstico', it: 'Previsioni', ja: '予報', ko: '예보', pt: 'Previsão', ru: 'Прогноз', zh: '预报' },\n} satisfies Record<string, CardWord>;\n\nconst WIND_INTL: Record<WindUnit, string | null> = { 'km/h': 'kilometer-per-hour', mph: 'mile-per-hour', 'm/s': 'meter-per-second', kn: null };\nconst HOURS_SHOWN = 8;\nconst DAYS_SHOWN = 7;\n\nfunction readCondition(value: unknown): WeatherCondition | undefined {\n if (typeof value === 'number') return conditionFromWmo(value);\n return conditionFromText(value);\n}\n\n/** `F` for Fahrenheit however a tool names it — `°F`, `fahrenheit`, OpenWeather's `imperial` — else `C`. */\nfunction readUnit(value: unknown): 'C' | 'F' {\n return typeof value === 'string' && /^\\s*°?\\s*f\\b|fahrenheit|imperial/i.test(value) ? 'F' : 'C';\n}\n\nfunction readWindUnit(value: unknown): WindUnit {\n if (typeof value !== 'string') return 'km/h';\n const v = value.toLowerCase().replace(/\\s/g, '');\n if (v.includes('mph') || v.includes('mp/h')) return 'mph';\n if (v === 'm/s' || v === 'ms') return 'm/s';\n if (v.startsWith('kn') || v === 'kt') return 'kn';\n return 'km/h';\n}\n\n/**\n * A chance as a percentage, 0–100. A tool writes a share (0.4) or a percentage (40), and\n * the two meet at 1: alone, `1` is 1 %. Where the source is known to write shares — a field\n * that is one by definition (`pop`), or a series that writes a fraction elsewhere — `share`\n * says so, and `1` is then certain.\n */\nfunction percent(value: unknown, share = false): number | undefined {\n const n = num(value);\n if (n === undefined) return undefined;\n const p = n > 0 && n <= 1 && (share || !Number.isInteger(n)) ? n * 100 : n;\n return Math.max(0, Math.min(100, Math.round(p)));\n}\n\n/** Whether a series writes its chances as shares: one fraction strictly between 0 and 1 is enough to tell. */\nfunction writesShares(items: Loose[]): boolean {\n return items.some((item) => {\n const n = num(item?.['precipitation']);\n return n !== undefined && n > 0 && n < 1;\n });\n}\n\n/** An item's chance of rain: its `precipitation` (a share if its series writes them), else its `pop` (always a share). */\nfunction chanceOf(item: Loose | null | undefined, shares: boolean): number | undefined {\n return percent(item?.['precipitation'], shares) ?? percent(item?.['pop'], true);\n}\n\n/** The card's data from the loose shape `map` returns, or `null` when there is no temperature to show. */\nexport function readWeather(raw: unknown): WeatherData | null {\n if (!raw || typeof raw !== 'object') return null;\n const r = raw as Record<string, unknown>;\n const temperature = num(r['temperature'] ?? r['temp']);\n const rawDaily: Loose[] = Array.isArray(r['daily']) ? r['daily'] : [];\n const dailyShares = writesShares(rawDaily);\n const daily = rawDaily\n .map((d: Loose) => {\n const date = toDate(d?.date ?? d?.time);\n const high = num(d?.high ?? d?.max);\n const low = num(d?.low ?? d?.min);\n if (!date || high === undefined || low === undefined) return null;\n return { date, condition: readCondition(d?.condition) ?? 'cloudy', high, low, precipitation: chanceOf(d, dailyShares) };\n })\n .filter(<T>(d: T | null): d is T => d !== null)\n .slice(0, DAYS_SHOWN);\n if (temperature === undefined && daily.length === 0) return null;\n\n const night = r['night'] === true || r['isDay'] === false || r['is_day'] === 0;\n const rawHourly: Loose[] = Array.isArray(r['hourly']) ? r['hourly'] : [];\n const hourlyShares = writesShares(rawHourly);\n const hourly = rawHourly\n .map((h: Loose) => {\n const time = toDate(h?.time);\n const t = num(h?.temperature ?? h?.temp);\n if (!time || t === undefined) return null;\n return { time, temperature: t, condition: readCondition(h?.condition), precipitation: chanceOf(h, hourlyShares), night: h?.night === true };\n })\n .filter(<T>(h: T | null): h is T => h !== null)\n .slice(0, HOURS_SHOWN);\n\n let wind: WeatherData['wind'];\n const w = r['wind'];\n if (typeof w === 'number' || typeof w === 'string') {\n const speed = num(w);\n if (speed !== undefined) wind = { speed, unit: readWindUnit(r['windUnit']), direction: num(r['windDirection']) };\n } else if (w && typeof w === 'object') {\n const o = w as Record<string, unknown>;\n const speed = num(o['speed']);\n if (speed !== undefined) wind = { speed, unit: readWindUnit(o['unit']), direction: num(o['direction']) };\n } else if (num(r['windSpeed']) !== undefined) {\n wind = { speed: num(r['windSpeed'])!, unit: readWindUnit(r['windUnit']), direction: num(r['windDirection']) };\n }\n\n const condition = readCondition(r['condition']) ?? readCondition(r['summary']) ?? daily[0]?.condition ?? 'cloudy';\n return {\n location: str(r['location'] ?? r['city'] ?? r['place']),\n condition,\n summary: str(r['summary'] ?? r['description']),\n temperature,\n unit: readUnit(r['unit']),\n feelsLike: num(r['feelsLike'] ?? r['feels_like']),\n high: num(r['high']) ?? daily[0]?.high,\n low: num(r['low']) ?? daily[0]?.low,\n humidity: percent(r['humidity']),\n wind,\n precipitation: chanceOf(r, false),\n night,\n time: toDate(r['time']) ?? undefined,\n hourly,\n daily,\n };\n}\n\n/**\n * Open-Meteo's forecast response (https://open-meteo.com/en/docs) as the card's fields.\n * Ask it for `current=temperature_2m,apparent_temperature,relative_humidity_2m,is_day,\n * weather_code,wind_speed_10m,wind_direction_10m`, `hourly=temperature_2m,weather_code,\n * precipitation_probability` and `daily=weather_code,temperature_2m_max,temperature_2m_min,\n * precipitation_probability_max`; whatever it lacks is left out. Open-Meteo returns no\n * place name, so pass it.\n *\n * Its times carry no offset (`2026-10-31T14:00`): they are on the clock of the `timezone`\n * you asked for, GMT by default, and the response says how far that is from UTC\n * (`utc_offset_seconds`). They are read as the instants they are, so the hours show on the\n * reader's own clock whatever the `timezone`; ask `timezone=auto` so the DAYS are the\n * place's own (its \"today\", and each day's high and low).\n */\nexport function fromOpenMeteo(response: unknown, options: { location?: string } = {}): WeatherInput {\n const r = (response && typeof response === 'object' ? response : {}) as Loose;\n const current = r['current'] ?? r['current_weather'] ?? {};\n // The units come with whichever block was asked for: a daily-only forecast has no\n // `current_units`, and the legacy `current_weather` has units of its own.\n const cu = r['current_units'] ?? {};\n const cwu = r['current_weather_units'] ?? {};\n const hu = r['hourly_units'] ?? {};\n const du = r['daily_units'] ?? {};\n const unit = readUnit(cu['temperature_2m'] ?? cu['temperature'] ?? cwu['temperature'] ?? du['temperature_2m_max'] ?? du['temperature_2m_min'] ?? hu['temperature_2m']);\n const windUnit = readWindUnit(cu['wind_speed_10m'] ?? cu['windspeed'] ?? cwu['windspeed'] ?? cwu['wind_speed_10m'] ?? hu['wind_speed_10m'] ?? du['wind_speed_10m_max']);\n const offset = num(r['utc_offset_seconds']);\n const instant = (time: unknown): Date | null => openMeteoTime(time, offset);\n const nowMs = instant(current['time'])?.getTime() ?? Date.now();\n\n const hourly: WeatherHour[] = [];\n const h = r['hourly'];\n if (h && Array.isArray(h['time'])) {\n h['time'].forEach((time: unknown, i: number) => {\n const at = instant(time);\n const t = num(h['temperature_2m']?.[i]);\n // From the current hour on.\n if (!at || t === undefined || at.getTime() < nowMs - 3_600_000) return;\n hourly.push({\n time: at,\n temperature: t,\n condition: conditionFromWmo(h['weather_code']?.[i]),\n precipitation: num(h['precipitation_probability']?.[i]),\n night: h['is_day']?.[i] === 0,\n });\n });\n }\n const daily: WeatherDay[] = [];\n const d = r['daily'];\n if (d && Array.isArray(d['time'])) {\n d['time'].forEach((date: unknown, i: number) => {\n const high = num(d['temperature_2m_max']?.[i]);\n const low = num(d['temperature_2m_min']?.[i]);\n if (high === undefined || low === undefined) return;\n daily.push({\n date: date as string,\n condition: conditionFromWmo(d['weather_code']?.[i]),\n high,\n low,\n precipitation: num(d['precipitation_probability_max']?.[i]),\n });\n });\n }\n return {\n location: options.location,\n condition: conditionFromWmo(current['weather_code'] ?? current['weathercode']),\n temperature: num(current['temperature_2m'] ?? current['temperature']),\n unit,\n feelsLike: num(current['apparent_temperature']),\n humidity: num(current['relative_humidity_2m']),\n wind: num(current['wind_speed_10m'] ?? current['windspeed']) !== undefined\n ? { speed: num(current['wind_speed_10m'] ?? current['windspeed'])!, unit: windUnit, direction: num(current['wind_direction_10m'] ?? current['winddirection']) }\n : undefined,\n precipitation: num(hourly[0]?.precipitation),\n night: current['is_day'] === 0,\n time: instant(current['time']) ?? undefined,\n hourly: hourly.slice(0, HOURS_SHOWN),\n daily: daily.slice(0, DAYS_SHOWN),\n } as WeatherInput;\n}\n\n/**\n * One of Open-Meteo's times as an instant. A date-time with no offset is on the response's\n * clock, `offset` seconds from UTC, where `new Date()` would read it on the READER's clock.\n * An epoch (`timeformat=unixtime`) is already an instant, and a response that gives no\n * offset is read as before.\n */\nfunction openMeteoTime(value: unknown, offset: number | undefined): Date | null {\n const m = typeof value === 'string' ? /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})(?::(\\d{2}))?$/.exec(value.trim()) : null;\n if (!m || offset === undefined) return toDate(value);\n const utc = Date.UTC(Number(m[1]), Number(m[2]) - 1, Number(m[3]), Number(m[4]), Number(m[5]), Number(m[6] ?? 0));\n return new Date(utc - offset * 1000);\n}\n\n// ── Drawing ──────────────────────────────────────────────────────────────────\n\nconst deg = (config: AparteConfig, t: number) => `${formatNumber(config, Math.round(t))}°`;\nconst degFull = (config: AparteConfig, t: number, unit: 'C' | 'F') => formatUnit(config, Math.round(t), unit === 'F' ? 'fahrenheit' : 'celsius');\n\nfunction summaryOf(data: WeatherData, config: AparteConfig): string {\n return data.summary ?? word(config, `cardsWeather_${data.condition}`, CONDITION_WORDS[data.condition]);\n}\n\nfunction windText(config: AparteConfig, wind: NonNullable<WeatherData['wind']>): string {\n const intl = WIND_INTL[wind.unit];\n return intl ? formatUnit(config, wind.speed, intl) : `${formatNumber(config, Math.round(wind.speed))} kn`;\n}\n\n/** A label above its value, for the stats row. */\nfunction stat(ctx: CardContext, key: keyof typeof W, value: () => string, extra?: Node): HTMLElement {\n const dt = el('dt', { class: 'aparte-weather__stat-label' });\n ctx.word(dt, key, W[key]);\n const dd = el('dd', { class: 'aparte-weather__stat-value' });\n const text = el('span');\n ctx.bind(text, value);\n dd.append(...(extra ? [extra, text] : [text]));\n return el('div', { class: 'aparte-weather__stat', attrs: { 'data-stat': key.replace('cardsWeather', '').toLowerCase() } }, dt, dd);\n}\n\nfunction rangeText(ctx: CardContext, data: WeatherData): HTMLElement | null {\n if (data.high === undefined && data.low === undefined) return null;\n const range = el('span', { class: 'aparte-weather__range' });\n if (data.high !== undefined) {\n const hi = el('span', { class: 'aparte-weather__hi' });\n ctx.bind(hi, () => `↑ ${deg(ctx.config, data.high!)}`);\n ctx.bind(hi, () => `${word(ctx.config, 'cardsWeatherHigh', W.cardsWeatherHigh)} ${degFull(ctx.config, data.high!, data.unit)}`, 'aria-label');\n range.append(hi);\n }\n if (data.low !== undefined) {\n const lo = el('span', { class: 'aparte-weather__lo' });\n ctx.bind(lo, () => `↓ ${deg(ctx.config, data.low!)}`);\n ctx.bind(lo, () => `${word(ctx.config, 'cardsWeatherLow', W.cardsWeatherLow)} ${degFull(ctx.config, data.low!, data.unit)}`, 'aria-label');\n range.append(lo);\n }\n return range;\n}\n\nfunction placeLine(ctx: CardContext, data: WeatherData): HTMLElement {\n const place = el('div', { class: 'aparte-weather__place' });\n const name = el('span', { class: 'aparte-weather__location' });\n ctx.bind(name, () => data.location ?? word(ctx.config, 'cardsWeatherTitle', W.cardsWeatherTitle));\n place.append(name);\n if (data.time) {\n const when = el('time', { class: 'aparte-weather__when', attrs: { datetime: data.time.toISOString() } });\n ctx.bind(when, () => formatWhen(ctx.config, data.time!));\n place.append(when);\n }\n return place;\n}\n\n/** The sky behind the hero and the forecast's header: a gradient per condition, by day or by night. */\nfunction sky(data: WeatherData): HTMLElement {\n return el('div', { class: 'aparte-weather__sky', attrs: { 'data-condition': data.condition, 'data-night': data.night, 'aria-hidden': 'true' } });\n}\n\nfunction hours(ctx: CardContext, data: WeatherData): HTMLElement | null {\n if (data.hourly.length < 2) return null;\n const temps = data.hourly.map((h) => h.temperature);\n const list = el('ol', { class: 'aparte-weather__hours' });\n data.hourly.forEach((h, i) => {\n const time = el('span', { class: 'aparte-weather__hour-time' });\n if (i === 0) ctx.word(time, 'cardsWeatherNow', W.cardsWeatherNow);\n else ctx.bind(time, () => formatHour(ctx.config, h.time));\n const temp = el('span', { class: 'aparte-weather__hour-temp' });\n ctx.bind(temp, () => deg(ctx.config, h.temperature));\n const cond = h.condition ?? data.condition;\n // The glyph is hidden from a screen reader, so the hour's sky is also said in words.\n const sky = el('span', { class: 'aparte-sr-only' });\n ctx.word(sky, `cardsWeather_${cond}`, CONDITION_WORDS[cond]);\n let rain: HTMLElement | null = null;\n if (h.precipitation !== undefined && h.precipitation >= 30) {\n rain = el('span', { class: 'aparte-weather__hour-rain' });\n ctx.bind(rain, () => formatPercent(ctx.config, h.precipitation! / 100));\n }\n list.append(el('li', { class: 'aparte-weather__hour' }, time, sky, glyph(weatherIcon(cond, h.night), 'aparte-rich-card__glyph aparte-weather__mini'), rain, temp));\n });\n const strip = el('div', { class: 'aparte-weather__hourly' },\n el('div', { class: 'aparte-weather__curve' }, sparkline(temps, { area: true, pad: 0.2 })),\n list);\n strip.style.setProperty('--aparte-weather-hours', String(data.hourly.length));\n return strip;\n}\n\nfunction renderHero(data: WeatherData, ctx: CardContext): Node[] {\n const { config } = ctx;\n const head = el('div', { class: 'aparte-weather__head' }, placeLine(ctx, data), glyph(weatherIcon(data.condition, data.night), 'aparte-rich-card__glyph aparte-weather__icon'));\n const now = el('div', { class: 'aparte-weather__now' });\n if (data.temperature !== undefined) {\n const temp = el('span', { class: 'aparte-weather__temp' });\n ctx.bind(temp, () => deg(config, data.temperature!));\n ctx.bind(temp, () => degFull(config, data.temperature!, data.unit), 'aria-label');\n now.append(temp);\n }\n const text = el('div', { class: 'aparte-weather__now-text' });\n const summary = el('span', { class: 'aparte-weather__summary' });\n ctx.bind(summary, () => summaryOf(data, config));\n text.append(summary);\n const line = el('span', { class: 'aparte-weather__line' });\n const range = rangeText(ctx, data);\n if (range) line.append(range);\n if (data.feelsLike !== undefined) {\n const feels = el('span', { class: 'aparte-weather__feels' });\n ctx.bind(feels, () => word(config, 'cardsWeatherFeelsLike', W.cardsWeatherFeelsLike, { t: deg(config, data.feelsLike!) }));\n line.append(feels);\n }\n if (line.childNodes.length) text.append(line);\n now.append(text);\n\n const stats = el('dl', { class: 'aparte-weather__stats' });\n if (data.wind) {\n const arrow = data.wind.direction !== undefined\n ? el('span', { class: 'aparte-weather__wind-arrow', attrs: { 'aria-hidden': 'true', style: `--aparte-weather-wind-angle: ${Math.round(data.wind.direction + 180)}deg` }, text: '↑' })\n : undefined;\n stats.append(stat(ctx, 'cardsWeatherWind', () => windText(config, data.wind!), arrow));\n }\n if (data.humidity !== undefined) stats.append(stat(ctx, 'cardsWeatherHumidity', () => formatUnit(config, data.humidity!, 'percent')));\n if (data.precipitation !== undefined) stats.append(stat(ctx, 'cardsWeatherRain', () => formatUnit(config, data.precipitation!, 'percent')));\n\n const body = el('div', { class: 'aparte-weather__body' }, head, now);\n if (stats.childNodes.length) body.append(stats);\n const hourly = hours(ctx, data);\n if (hourly) body.append(hourly);\n return [sky(data), body];\n}\n\nfunction renderCompact(data: WeatherData, ctx: CardContext): Node[] {\n const { config } = ctx;\n const row = el('div', { class: 'aparte-weather__compact' });\n row.append(glyph(weatherIcon(data.condition, data.night), 'aparte-rich-card__glyph aparte-weather__icon'));\n if (data.temperature !== undefined) {\n const temp = el('span', { class: 'aparte-weather__temp' });\n ctx.bind(temp, () => deg(config, data.temperature!));\n ctx.bind(temp, () => degFull(config, data.temperature!, data.unit), 'aria-label');\n row.append(temp);\n }\n const text = el('div', { class: 'aparte-weather__compact-text' });\n const name = el('span', { class: 'aparte-weather__location' });\n ctx.bind(name, () => data.location ?? word(config, 'cardsWeatherTitle', W.cardsWeatherTitle));\n const summary = el('span', { class: 'aparte-weather__summary' });\n ctx.bind(summary, () => summaryOf(data, config));\n text.append(name, summary);\n row.append(text);\n const range = rangeText(ctx, data);\n if (range) row.append(range);\n return [el('span', { class: 'aparte-weather__accent', attrs: { 'data-condition': data.condition, 'data-night': data.night, 'aria-hidden': 'true' } }), row];\n}\n\n/** A colour for a temperature in °C, from cold blue to hot red, for the day's range bar. */\nfunction heat(celsius: number): string {\n const stops: Array<[number, [number, number, number]]> = [\n [-10, [129, 140, 248]], [0, [96, 165, 250]], [10, [52, 211, 153]], [18, [250, 204, 21]], [26, [251, 146, 60]], [34, [239, 68, 68]],\n ];\n if (celsius <= stops[0]![0]) return `rgb(${stops[0]![1].join(' ')})`;\n for (let i = 1; i < stops.length; i++) {\n const [t1, c1] = stops[i]!;\n const [t0, c0] = stops[i - 1]!;\n if (celsius <= t1) {\n const k = (celsius - t0) / (t1 - t0);\n return `rgb(${c0.map((v, j) => Math.round(v + (c1[j]! - v) * k)).join(' ')})`;\n }\n }\n return `rgb(${stops[stops.length - 1]![1].join(' ')})`;\n}\n\nfunction renderForecast(data: WeatherData, ctx: CardContext): Node[] {\n const { config } = ctx;\n // The sky only behind the header: the days below sit on the card's surface.\n const header = el('div', { class: 'aparte-weather__forecast-head' }, sky(data));\n header.append(...renderCompact(data, ctx).slice(1));\n if (data.daily.length === 0) return [header];\n const toC = (t: number) => (data.unit === 'F' ? ((t - 32) * 5) / 9 : t);\n const lo = Math.min(...data.daily.map((d) => d.low));\n const hi = Math.max(...data.daily.map((d) => d.high));\n const span = hi - lo || 1;\n const list = el('ol', { class: 'aparte-weather__days' });\n ctx.bind(list, () => word(config, 'cardsWeatherForecast', W.cardsWeatherForecast), 'aria-label');\n data.daily.forEach((d, i) => {\n const name = el('span', { class: 'aparte-weather__day-name' });\n ctx.bind(name, () => formatDay(config, d.date, 'short'));\n const rain = el('span', { class: 'aparte-weather__day-rain' });\n if (d.precipitation !== undefined && d.precipitation >= 20) ctx.bind(rain, () => formatPercent(config, d.precipitation! / 100));\n const low = el('span', { class: 'aparte-weather__day-low' });\n ctx.bind(low, () => deg(config, d.low));\n const high = el('span', { class: 'aparte-weather__day-high' });\n ctx.bind(high, () => deg(config, d.high));\n const fill = el('span', { class: 'aparte-weather__bar-fill' });\n fill.style.setProperty('--aparte-weather-bar-start', `${((d.low - lo) / span) * 100}%`);\n fill.style.setProperty('--aparte-weather-bar-end', `${((d.high - lo) / span) * 100}%`);\n fill.style.setProperty('--aparte-weather-bar-cold', heat(toC(d.low)));\n fill.style.setProperty('--aparte-weather-bar-warm', heat(toC(d.high)));\n const bar = el('span', { class: 'aparte-weather__bar', attrs: { 'aria-hidden': 'true' } }, fill);\n if (i === 0 && data.temperature !== undefined && data.temperature >= d.low && data.temperature <= d.high) {\n const dot = el('span', { class: 'aparte-weather__bar-now' });\n dot.style.setProperty('--aparte-weather-bar-at', `${((data.temperature - lo) / span) * 100}%`);\n bar.append(dot);\n }\n const row = el('li', { class: 'aparte-weather__day' }, name, glyph(weatherIcon(d.condition), 'aparte-rich-card__glyph aparte-weather__mini'), rain, low, bar, high);\n ctx.bind(row, () => `${formatDay(config, d.date, 'long')}: ${word(config, `cardsWeather_${d.condition}`, CONDITION_WORDS[d.condition])}, ${word(config, 'cardsWeatherLow', W.cardsWeatherLow)} ${degFull(config, d.low, data.unit)}, ${word(config, 'cardsWeatherHigh', W.cardsWeatherHigh)} ${degFull(config, d.high, data.unit)}`, 'aria-label');\n list.append(row);\n });\n return [header, list];\n}\n\nfunction skeleton(partial: Partial<WeatherData> | null, ctx: CardContext): Node[] {\n const block = (cls: string, kind: 'text' | 'rect' | 'circle' = 'rect') =>\n el('span', { class: `aparte-skeleton aparte-skeleton--${kind} ${cls}`, attrs: { 'aria-hidden': 'true' } });\n const place = el('div', { class: 'aparte-weather__place' });\n if (partial?.location) place.append(el('span', { class: 'aparte-weather__location', text: partial.location }));\n else place.append(block('aparte-weather__sk-place', 'text'));\n const head = el('div', { class: 'aparte-weather__head' }, place, block('aparte-weather__sk-icon', 'circle'));\n if (ctx.variant === 'compact') {\n return [el('div', { class: 'aparte-weather__compact' }, block('aparte-weather__sk-icon', 'circle'), block('aparte-weather__sk-temp'), place)];\n }\n const stats = el('div', { class: 'aparte-weather__sk-stats' }, block('aparte-weather__sk-stat'), block('aparte-weather__sk-stat'), block('aparte-weather__sk-stat'));\n return [el('div', { class: 'aparte-weather__body' }, head, el('div', { class: 'aparte-weather__now' }, block('aparte-weather__sk-temp'), block('aparte-weather__sk-summary', 'text')), stats)];\n}\n\nexport const weatherCard = defineCard<WeatherData, WeatherVariant>({\n name: 'weather',\n variants: ['hero', 'compact', 'forecast'],\n styles: weatherStyles,\n icon: weatherIcon('partly-cloudy'),\n normalize: readWeather,\n render: (data, ctx) => (ctx.variant === 'compact' ? renderCompact(data, ctx) : ctx.variant === 'forecast' ? renderForecast(data, ctx) : renderHero(data, ctx)),\n skeleton,\n label: (data, ctx) => (data?.location\n ? word(ctx.config, 'cardsWeatherIn', W.cardsWeatherIn, { place: data.location })\n : word(ctx.config, 'cardsWeatherTitle', W.cardsWeatherTitle)),\n fallback: (data, ctx) => {\n const parts = [\n data.temperature !== undefined ? degFull(ctx.config, data.temperature, data.unit) : null,\n summaryOf(data, ctx.config),\n data.high !== undefined && data.low !== undefined\n ? `${word(ctx.config, 'cardsWeatherHigh', W.cardsWeatherHigh)} ${degFull(ctx.config, data.high, data.unit)} / ${word(ctx.config, 'cardsWeatherLow', W.cardsWeatherLow)} ${degFull(ctx.config, data.low, data.unit)}`\n : null,\n ].filter(Boolean);\n return `${data.location ? `${data.location}: ` : ''}${parts.join(', ')}`;\n },\n partial: (input) => {\n const location = str(input['location'] ?? input['city'] ?? input['place'] ?? input['q'] ?? input['query']);\n return location ? { location } : null;\n },\n});\n\n/** Draw a tool's weather as this card — returns the function that stops it. */\nexport function setupWeatherCard(options: CardSetupOptions<WeatherData, WeatherVariant> = {}): () => void {\n return weatherCard.setup(options);\n}\n\nexport { conditionFromWmo, conditionFromOpenWeather, conditionFromText, WEATHER_CONDITIONS } from './conditions.js';\nexport type { WeatherCondition } from './conditions.js';\n"],"names":["r","sky"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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"}
package/package.json CHANGED
@@ -1,6 +1,140 @@
1
1
  {
2
2
  "name": "@aparte/plugin-cards",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.29.1",
4
+ "homepage": "https://apartejs.dev/guides/cards/",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "description": "Rich cards for aparté — a tool's result drawn as a card (weather, products, places, figures, orders, stocks, scores, plans, media, links), with variants and live controls, from any source.",
9
+ "type": "module",
10
+ "sideEffects": false,
11
+ "main": "./dist/index.js",
12
+ "module": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "@aparte-workspace/source": "./src/index.ts",
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js",
19
+ "default": "./dist/index.js"
20
+ },
21
+ "./weather": {
22
+ "@aparte-workspace/source": "./src/weather/index.ts",
23
+ "types": "./dist/weather/index.d.ts",
24
+ "import": "./dist/weather.js",
25
+ "default": "./dist/weather.js"
26
+ },
27
+ "./items": {
28
+ "@aparte-workspace/source": "./src/items/index.ts",
29
+ "types": "./dist/items/index.d.ts",
30
+ "import": "./dist/items.js",
31
+ "default": "./dist/items.js"
32
+ },
33
+ "./product": {
34
+ "@aparte-workspace/source": "./src/product/index.ts",
35
+ "types": "./dist/product/index.d.ts",
36
+ "import": "./dist/product.js",
37
+ "default": "./dist/product.js"
38
+ },
39
+ "./place": {
40
+ "@aparte-workspace/source": "./src/place/index.ts",
41
+ "types": "./dist/place/index.d.ts",
42
+ "import": "./dist/place.js",
43
+ "default": "./dist/place.js"
44
+ },
45
+ "./stats": {
46
+ "@aparte-workspace/source": "./src/stats/index.ts",
47
+ "types": "./dist/stats/index.d.ts",
48
+ "import": "./dist/stats.js",
49
+ "default": "./dist/stats.js"
50
+ },
51
+ "./order": {
52
+ "@aparte-workspace/source": "./src/order/index.ts",
53
+ "types": "./dist/order/index.d.ts",
54
+ "import": "./dist/order.js",
55
+ "default": "./dist/order.js"
56
+ },
57
+ "./stock": {
58
+ "@aparte-workspace/source": "./src/stock/index.ts",
59
+ "types": "./dist/stock/index.d.ts",
60
+ "import": "./dist/stock.js",
61
+ "default": "./dist/stock.js"
62
+ },
63
+ "./plan": {
64
+ "@aparte-workspace/source": "./src/plan/index.ts",
65
+ "types": "./dist/plan/index.d.ts",
66
+ "import": "./dist/plan.js",
67
+ "default": "./dist/plan.js"
68
+ },
69
+ "./score": {
70
+ "@aparte-workspace/source": "./src/score/index.ts",
71
+ "types": "./dist/score/index.d.ts",
72
+ "import": "./dist/score.js",
73
+ "default": "./dist/score.js"
74
+ },
75
+ "./media": {
76
+ "@aparte-workspace/source": "./src/media/index.ts",
77
+ "types": "./dist/media/index.d.ts",
78
+ "import": "./dist/media.js",
79
+ "default": "./dist/media.js"
80
+ },
81
+ "./link": {
82
+ "@aparte-workspace/source": "./src/link/index.ts",
83
+ "types": "./dist/link/index.d.ts",
84
+ "import": "./dist/link.js",
85
+ "default": "./dist/link.js"
86
+ }
87
+ },
88
+ "files": [
89
+ "dist",
90
+ "README.md",
91
+ "LICENSE"
92
+ ],
93
+ "engines": {
94
+ "node": ">=18"
95
+ },
96
+ "peerDependencies": {
97
+ "@aparte/core": ">=0.29.1 <1.0.0"
98
+ },
99
+ "devDependencies": {
100
+ "typescript": "~5.7.0",
101
+ "vite": "^6.0.0",
102
+ "@aparte/core": "0.29.1"
103
+ },
104
+ "keywords": [
105
+ "aparte",
106
+ "plugin",
107
+ "cards",
108
+ "generative-ui",
109
+ "tool-ui",
110
+ "weather",
111
+ "web-components",
112
+ "carousel",
113
+ "product",
114
+ "places",
115
+ "kpi",
116
+ "receipt",
117
+ "stock",
118
+ "todo",
119
+ "sports",
120
+ "gallery",
121
+ "link-preview"
122
+ ],
123
+ "license": "MIT",
124
+ "repository": {
125
+ "type": "git",
126
+ "url": "git+https://github.com/apartejs/aparte.git",
127
+ "directory": "packages/plugins/cards"
128
+ },
129
+ "bugs": {
130
+ "url": "https://github.com/apartejs/aparte/issues"
131
+ },
132
+ "scripts": {
133
+ "dev": "vite",
134
+ "build": "vite build && tsc -b --emitDeclarationOnly --force && node ../../../scripts/stamp-dist.mjs",
135
+ "preview": "vite preview",
136
+ "test": "vitest",
137
+ "test:run": "vitest run",
138
+ "test:coverage": "vitest run --coverage"
139
+ }
6
140
  }