@circadian/sol 0.2.6 → 0.2.7

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/README.md CHANGED
@@ -366,6 +366,7 @@ The slim pill/bar variant. Accepts an optional `design` prop to override the pro
366
366
  | `showFlag` | `boolean` | `false` | Show country flag |
367
367
  | `showTemperature` | `boolean` | `true` | Show live temperature |
368
368
  | `overridePhase` | `SolarPhase \| null` | — | Force a discrete phase |
369
+ | `weatherCategoryOverride` | `WeatherCategory \| null` | — | Force a weather category for preview |
369
370
  | `customPalettes` | `CustomPalettes` | — | Override bg gradient per phase |
370
371
  | `simulatedDate` | `Date` | — | Simulate a time |
371
372
  | `className` | `string` | — | Wrapper CSS class |
@@ -411,6 +412,9 @@ Supported positions: `top-left` `top-center` `top-right` `center-left` `center`
411
412
 
412
413
  // Force a category for preview
413
414
  <SolarWidget showWeather weatherCategoryOverride="thunder" />
415
+
416
+ // Works on CompactWidget too
417
+ <CompactWidget showWeather weatherCategoryOverride="thunder" />
414
418
  ```
415
419
 
416
420
  Powered by [Open-Meteo](https://open-meteo.com/) — free, no API key. Available categories: `clear` `partly-cloudy` `overcast` `fog` `drizzle` `rain` `heavy-rain` `snow` `heavy-snow` `thunder`
package/dist/index.d.ts CHANGED
@@ -115,6 +115,7 @@ interface CompactWidgetProps {
115
115
  flag?: string;
116
116
  temperature?: string;
117
117
  weather?: WeatherCategory$1 | null;
118
+ weatherCategoryOverride?: WeatherCategory$1 | null;
118
119
  showFlag?: boolean;
119
120
  showWeather?: boolean;
120
121
  showTemperature?: boolean;
@@ -137,6 +138,7 @@ declare function CompactWidget({
137
138
  flag,
138
139
  temperature,
139
140
  weather,
141
+ weatherCategoryOverride,
140
142
  showFlag,
141
143
  showWeather,
142
144
  showTemperature,
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/hooks/useSolarPosition.tsx","../src/widgets/solar-widget.shell.tsx","../src/widgets/compact-widget.shell.tsx","../src/skins/types/widget-skin.types.ts","../src/provider/solar-theme-provider.tsx"],"sourcesContent":[],"mappings":";;;;;;;;;AAgBA;AAWA;AAWA;AAmBA;;UAzCiB,UAAA;;ECQL,OAAA,EAAA,MAAA;EAWA,SAAA,EAAA,MAAU;EAEV,MAAA,EAAA,MAAA;EAYA;EAAgC,SAAA,EAAA,MAAA;EAAP;EAAR,SAAA,EAAA,MAAA;;AAiFZ,KDvGL,UAAA,GCuGqB,OAAA,GAAA,MAAA,GAAA,SAAA,GAAA,SAAA,GAAA,YAAA,GAAA,WAAA,GAAA,QAAA,GAAA,MAAA,GAAA,UAAA;AACb,UD7FH,aAAA,CC6FG;EACX;EAIU,QAAA,EAAA,MAAA;EACD;EACU,OAAA,EAAA,MAAA;EAGV;EAAI,WAAA,EAAA,MAAA;EAyBN;EACd,aAAA,EAAA,MAAA;EACA;EACA,SAAA,EAAA,OAAA;EACA;EACA,KAAA,EDzHO,UCyHP;EACA;EACA,KAAA,EDzHO,UCyHP;EACA;EACe,YAAA,EAAA,MAAA;;AAEd,UDxHc,UAAA,CCwHd;EAAgB,KAAA,EDvHV,UCuHU;EAAA,SAAA,EDtHN,UCsHM;;;;;;KAzJP,eAAA;KAWA,UAAA;ADnBK,KCqBL,eAAA,GDrBe,OAAA,GAAA,eAAA,GAAA,UAAA,GAAA,KAAA,GAAA,SAAA,GAAA,MAAA,GAAA,YAAA,GAAA,MAAA,GAAA,YAAA,GAAA,SAAA;AAWf,KCsBA,cAAA,GAAiB,ODtBP,CCsBe,MDtBf,CCsBsB,UDtBtB,EAAA;EAWL,EAAA,EAAA,CAAA,MAAA,EAAA,MAAa,EAAA,MAAA,CAYrB;AAOT,CAAA,CAAA,CAAA;UCyEiB,gBAAA;oBACG;EA3GR,IAAA,CAAA,EA4GH,UA5GG;EAWA,QAAA,CAAA,EAAA,OAAU;EAEV,WAAA,CAAA,EAAA,OAAe;EAYf,WAAA,CAAA,EAAA,OAAc;EAAkB,cAAA,CAAA,EAuFzB,cAvFyB;EAAP,aAAA,CAAA,EAwFnB,UAxFmB;EAAR,uBAAA,CAAA,EAyFD,eAzFC,GAAA,IAAA;EAAO;AAiFpC;EACoB,aAAA,CAAA,EAUF,IAVE;EACX;;EAKS,aAAA,CAAA,EAAA,OAAA;;AAIA,iBAyBF,WAAA,CAzBE;EAAA,eAAA;EAAA,IAAA;EAAA,QAAA;EAAA,WAAA;EAAA,WAAA;EAAA,cAAA;EAAA,aAAA;EAAA,uBAAA;EAAA,aAAA,EAkCD,iBAlCC;EAAA;AAAA,CAAA,EAoCf,gBApCe,CAAA,EAoCC,kBAAA,CAAA,GAAA,CAAA,OApCD;;;KCxHN,iBAAA;AFLK,KEiBL,WAAA,GFjBe,IAAA,GAAA,IAAA,GAAA,IAAA;AAWf,UEsFK,gBAAA,CFtFK;EAWL,KAAA,EE4ER,UF5EqB;EAmBb,KAAA,EE0DR,UF1DkB;;;;ECjCf,WAAA,CAAA,EAAA,MAAe;EAWf,OAAA,CAAA,ECqFA,iBDrFU,GAAA,IAAA;EAEV,mBAAe,ECoFJ,iBDpFI,GAAA,IAAA;EAYf,gBAAA,EAAc,MAAA,GAAA,IAAA;EAAkB,QAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAP,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAR,QAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAO,aAAA,CAAA,EC6ElB,ID7EkB;EAiFnB,QAAA,EAAA,OAAA;EACG,WAAA,EAAA,OAAA;EACX,eAAA,EAAA,OAAA;EAIU,IAAA,ECNX,WDMW;EACD,OAAA,ECNP,aDMO;;AAIA,UCLD,kBAAA,CDKC;EAAI,MAAA,CAAA,ECJX,UDIW;EAyBN,aAAA,CAAW,EC5BT,UD4BS,GAAA,IAAA;EACzB,IAAA,CAAA,EAAA,MAAA;EACA,QAAA,CAAA,EAAA,MAAA;EACA,IAAA,CAAA,EAAA,MAAA;EACA,WAAA,CAAA,EAAA,MAAA;EACA,OAAA,CAAA,EC5BU,iBD4BV,GAAA,IAAA;EACA,QAAA,CAAA,EAAA,OAAA;EACA,WAAA,CAAA,EAAA,OAAA;EACA,eAAA,CAAA,EAAA,OAAA;EACe,IAAA,CAAA,EC5BR,WD4BQ;EACf,QAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACC,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAgB,QAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAA;mBCzBA;;;EAnIP,aAAA,CAAA,EAsIM,IAtIS;EAYf,SAAA,CAAA,EAAA,MAAW;AAgFvB;AACS,iBAqEO,aAAA,CArEP;EAAA,MAAA,EAsEC,cAtED;EAAA,aAAA;EAAA,IAAA;EAAA,QAAA;EAAA,IAAA;EAAA,WAAA;EAAA,OAAA;EAAA,QAAA;EAAA,WAAA;EAAA,eAAA;EAAA,IAAA;EAAA,QAAA;EAAA,SAAA;EAAA,QAAA;EAAA,cAAA;EAAA,aAAA,EAqFQ,iBArFR;EAAA;AAAA,CAAA,EAuFN,kBAvFM,CAAA,EAuFY,kBAAA,CAAA,GAAA,CAAA,OAvFZ;;;UCjGQ,WAAA;;EFOL,GAAA,EAAA,MAAA;EAWA;AAEZ;AAYA;;EAAqC,OAAA,CAAA,EAAA,MAAA;EAAR;;EAiFZ,cAAA,CAAA,EAAA,MAAgB;;AAExB,UEpGQ,aAAA,CFoGR;EAIU,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,CAAA;EACD,SAAA,EAAA,MAAA;EACU,OAAA,EAAA,MAAA;EAGV,QAAA,EAAA,MAAA;EAAI,WAAA,EAAA,MAAA;EAyBN;;;;;;EAMd,KAAA,CAAA,EEhIQ,WFgIR;;;;;;;;;;;ACvJF;AAYA;AAgFA;;;;;;;;;AAuBA;AACW,UCpEM,YAAA,CDoEN;EACO;EAKN,UAAA,EAAA,MAAA;EAIH;EAKU,KAAA,EAAA,MAAA;EAGD;EAAI,KAAA,EAAA,MAAA;EA4BN;EACN,YAAA,EAAA,MAAA;;AAER,UCxGe,SAAA,CDwGf;EACA,WAAA,EAAA,MAAA;EACA,aAAA,EAAA,MAAA;EACA,MAAA,EAAA,MAAA;EACA,OAAA,EAAA,MAAA;EACA,MAAA,EAAA,MAAA;EACA,MAAA,EAAA,MAAA;;AAEA,UCrGe,aAAA,CDqGf;EACA;EACA,EAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,CAAA;EACA;EACA,SAAA,EAAA,MAAA;EACe;EACf,WAAA,EAAA,MAAA;EACC;EAAkB,GAAA,EAAA,MAAA;EAAA;;;;ACxLrB;AAeiB,UA8EA,cAAA,CAlEP;EAyBO;EAaA,EAAA,EA8BX,UA9BoB;EAWT;EAiBA,KAAA,EAAA,MAAA;EAEX;EAUc,WAAA,EAAA,MAAA;EAAY;;;;EAMd,SAAA,EANL,MAMK,CANE,UAMF,EANc,SAMd,CAAA;EAMO;;;;EAgBW,cAAA,EAtBlB,MAsBkB,CAtBX,UAsBW,EAtBC,aAsBD,CAAA;EAAnB;;;;EA6BwB,cAAA,EA7CvB,MA6CuB,CA7ChB,UA6CgB,EA7CJ,aA6CI,CAAA;EAApB;;AAKrB;;;;;;;;;;AAwCA;;iBA1EiB,OAAO,YAAY;;AC1GpC;;;;;;;;;;;;;AA0OA;EAMU,YAAK,CAAA,EDrHE,WCsHL;EAWI;;;;EAIb,SAAA,ED/HU,KAAA,CAAM,aC+HhB,CD/H8B,eC+H9B,CAAA;EAAK;;;;qBDzHa,KAAA,CAAM,cAAc;;UAKxB,eAAA;SAER;SACA;;;mBAKU;QACX;;;;YAMI;wBACY;;;;;;;;kBAUN;;;;;WASP;;KAKC,UAAA;;;AHhNK,UI4BA,UAAA,CJ5BU;EAWf,KAAA,EIkBH,UJlBa;EAWL,SAAA,EAAA,OAAa;EAmBb,UAAA,EAAA,MAAU;;;iBIPV;EH1BL,QAAA,EAAA,MAAA,GAAe,IAAA;EAWf,QAAA,EAAA,MAAU,GAAA,IAAA;EAEV,SAAA,EAAA,MAAA,GAAe,IAAA;EAYf,WAAA,EAAA,OAAc;EAAkB,gBAAA,EAAA,CAAA,KAAA,EGMhB,UHNgB,GAAA,IAAA,EAAA,GAAA,IAAA;EAAP,KAAA,EGO5B,UHP4B;EAAR,MAAA,EGQnB,UHRmB;EAAO,SAAA,EAAA,CAAA,MAAA,EGSd,UHTc,EAAA,GAAA,IAAA;EAiFnB,UAAA,EGvEH,cHuEmB;EACb;;EAKD,aAAA,EG1EF,IH0EE,GAAA,SAAA;EACD,gBAAA,EAAA,CAAA,IAAA,EG1ES,IH0ET,GAAA,SAAA,EAAA,GAAA,IAAA;EACU;EAGV,cAAA,EG5EA,cH4EA,GAAA,SAAA;EAAI,iBAAA,EAAA,CAAA,QAAA,EG3EU,cH2EV,GAAA,SAAA,EAAA,GAAA,IAAA;AAyBtB;AACE,iBG+Gc,aAAA,CAAA,CH/Gd,EG+G+B,UH/G/B;UGqHQ,KAAA,CHpHR;EACA,QAAA,EGoHU,SHpHV;EACA,aAAA,CAAA,EGoHgB,UHpHhB;EACA;;;;;;EAMC,QAAA,CAAA,EAAA,OAAA;;AAAgB,iBGuHH,kBAAA,CHvHG;EAAA,QAAA;EAAA,aAAA;EAAA;AAAA,CAAA,EG2HhB,KH3HgB,CAAA,EG2HX,kBAAA,CAAA,GAAA,CAAA,OH3HW"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/hooks/useSolarPosition.tsx","../src/widgets/solar-widget.shell.tsx","../src/widgets/compact-widget.shell.tsx","../src/skins/types/widget-skin.types.ts","../src/provider/solar-theme-provider.tsx"],"sourcesContent":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -223,7 +223,7 @@ function blendPalette(skin, blend) {
223
223
  mode: from.mode
224
224
  };
225
225
  }
226
- function CompactWidget({ design: designOverride, overridePhase, time, location = "", flag, temperature, weather = null, showFlag = false, showWeather = false, showTemperature = true, size = "md", latitude, longitude, timezone, customPalettes, simulatedDate: simulatedDateProp, className = "" }) {
226
+ function CompactWidget({ design: designOverride, overridePhase, time, location = "", flag, temperature, weather = null, weatherCategoryOverride, showFlag = false, showWeather = false, showTemperature = true, size = "md", latitude, longitude, timezone, customPalettes, simulatedDate: simulatedDateProp, className = "" }) {
227
227
  const [mounted, setMounted] = useState(false);
228
228
  useLayoutEffect(() => setMounted(true), []);
229
229
  const ctx = useSolarTheme();
@@ -262,7 +262,7 @@ function CompactWidget({ design: designOverride, overridePhase, time, location =
262
262
  const resolvedLon = longitude ?? ctx.longitude;
263
263
  const resolvedTz = timezone ?? ctx.timezone;
264
264
  const liveWeather = useWeatherData(resolvedLat ?? null, resolvedLon ?? null);
265
- const liveWeatherCategory = showWeather ? weather ?? liveWeather?.category ?? null : null;
265
+ const liveWeatherCategory = showWeather ? weatherCategoryOverride ?? weather ?? liveWeather?.category ?? null : null;
266
266
  const liveTemperatureC = liveWeather?.temperatureC ?? null;
267
267
  const props = {
268
268
  phase,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["WMO_MAP: Record<number, WeatherCategory>","fetchWeather","WMO_MAP","useWeatherData","finalPalette: WidgetPalette","opts: Intl.DateTimeFormatOptions","liveWeatherCategory: WeatherCategory | null","liveTemperatureC: number | null","WMO_MAP: Record<number, WeatherCategory>","palette: WidgetPalette","liveWeatherCategory: WeatherCategory | null","liveTemperatureC: number | null","props: CompactSkinProps","opts: Intl.DateTimeFormatOptions"],"sources":["../src/widgets/solar-widget.shell.tsx","../src/widgets/compact-widget.shell.tsx"],"sourcesContent":["'use client';\n\n/**\n * widgets/solar-widget.shell.tsx (skin-aware shell)\n *\n * Weather fetch is now centralised here alongside the compact shell:\n * - Fetches temperature + weather_code from open-meteo once per mount\n * - Resolves liveWeatherCategory: weatherCategoryOverride ?? live category\n * - Passes liveWeatherCategory + liveTemperatureC down to skin components\n * - Skins should prefer these props over running their own fetch\n *\n * simulatedDate prop wins over ctx.simulatedDate (set by SolarDevTools),\n * which wins over undefined (live time). This means the devtools timeline\n * scrubber moves the orb in every widget without requiring any prop wiring.\n */\n\nimport { useEffect, useLayoutEffect, useMemo, useState } from 'react';\nimport type { SolarPhase } from '../hooks/useSolarPosition';\nimport { lerpHex } from '../lib/solar-lerp';\nimport { useSolarTheme } from '../provider/solar-theme-provider';\nimport type { DesignMode, WidgetPalette } from '../skins/types/widget-skin.types';\n\n// ─── Re-exported types ────────────────────────────────────────────────────────\n\nexport type ExpandDirection =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'center-left'\n | 'center'\n | 'center-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\nexport type WidgetSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport type WeatherCategory =\n | 'clear'\n | 'partly-cloudy'\n | 'overcast'\n | 'fog'\n | 'drizzle'\n | 'rain'\n | 'heavy-rain'\n | 'snow'\n | 'heavy-snow'\n | 'thunder';\n\nexport type CustomPalettes = Partial<Record<SolarPhase, { bg: [string, string, string] }>>;\n\nimport { SKINS } from '../skins/index';\nexport const PALETTES = SKINS.foundry.widgetPalettes;\n\n// ─── WMO weather code map ─────────────────────────────────────────────────────\n\nconst WMO_MAP: Record<number, WeatherCategory> = {\n 0: 'clear',\n 1: 'clear',\n 2: 'partly-cloudy',\n 3: 'overcast',\n 45: 'fog',\n 48: 'fog',\n 51: 'drizzle',\n 53: 'drizzle',\n 55: 'drizzle',\n 61: 'rain',\n 63: 'rain',\n 65: 'heavy-rain',\n 71: 'snow',\n 73: 'snow',\n 75: 'heavy-snow',\n 80: 'rain',\n 82: 'heavy-rain',\n 85: 'snow',\n 86: 'heavy-snow',\n 95: 'thunder',\n 96: 'thunder',\n 99: 'thunder',\n};\n\ninterface LiveWeather {\n temperatureC: number;\n category: WeatherCategory;\n}\n\nasync function fetchWeather(lat: number, lon: number): Promise<LiveWeather> {\n const url = new URL('https://api.open-meteo.com/v1/forecast');\n url.searchParams.set('latitude', String(lat));\n url.searchParams.set('longitude', String(lon));\n url.searchParams.set('current', 'temperature_2m,weather_code');\n url.searchParams.set('forecast_days', '1');\n const data = (await fetch(url.toString()).then((r) => r.json())) as {\n current: { temperature_2m: number; weather_code: number };\n };\n return {\n temperatureC: Math.round(data.current.temperature_2m),\n category: WMO_MAP[data.current.weather_code] ?? 'clear',\n };\n}\n\nfunction useWeatherData(lat: number | null, lon: number | null) {\n const [weather, setWeather] = useState<LiveWeather | null>(null);\n useEffect(() => {\n if (!lat || !lon) return;\n let dead = false;\n fetchWeather(lat, lon)\n .then((w) => {\n if (!dead) setWeather(w);\n })\n .catch(() => {});\n const id = setInterval(\n () =>\n fetchWeather(lat, lon)\n .then((w) => {\n if (!dead) setWeather(w);\n })\n .catch(() => {}),\n 30 * 60 * 1000,\n );\n return () => {\n dead = true;\n clearInterval(id);\n };\n }, [lat, lon]);\n return weather;\n}\n\n// ─── Widget props ─────────────────────────────────────────────────────────────\n\nexport interface SolarWidgetProps {\n expandDirection?: ExpandDirection;\n size?: WidgetSize;\n showFlag?: boolean;\n showWeather?: boolean;\n hoverEffect?: boolean;\n customPalettes?: CustomPalettes;\n phaseOverride?: SolarPhase;\n weatherCategoryOverride?: WeatherCategory | null;\n /** Explicit simulated date. Falls back to ctx.simulatedDate (from SolarDevTools)\n * then to real current time. */\n simulatedDate?: Date;\n /** Lock the widget state: `true` = always expanded, `false` = always collapsed.\n * Omit or pass `undefined` for default localStorage-driven behaviour. */\n forceExpanded?: boolean;\n}\n\n// ─── Palette blending helper ──────────────────────────────────────────────────\n\nfunction blendWidgetPalette(from: WidgetPalette, to: WidgetPalette, t: number): WidgetPalette {\n return {\n bg: [\n lerpHex(from.bg[0], to.bg[0], t),\n lerpHex(from.bg[1], to.bg[1], t),\n lerpHex(from.bg[2], to.bg[2], t),\n ],\n textColor: lerpHex(from.textColor, to.textColor, t),\n accentColor: lerpHex(from.accentColor, to.accentColor, t),\n orb: lerpHex(from.orb, to.orb, t),\n outerGlow: from.outerGlow,\n mode: t < 0.5 ? from.mode : to.mode,\n };\n}\n\n// ─── Shell component ──────────────────────────────────────────────────────────\n\nexport function SolarWidget({\n expandDirection = 'bottom-right',\n size = 'lg',\n showFlag = false,\n showWeather = false,\n hoverEffect = false,\n customPalettes,\n phaseOverride,\n weatherCategoryOverride,\n simulatedDate: simulatedDateProp,\n forceExpanded,\n}: SolarWidgetProps) {\n const [mounted, setMounted] = useState(false);\n useLayoutEffect(() => setMounted(true), []);\n\n const {\n phase,\n blend,\n activeSkin,\n timezone,\n latitude,\n longitude,\n simulatedDate: ctxSimulatedDate,\n setCustomPalettes,\n } = useSolarTheme();\n\n // Register customPalettes into context so DevTools can read them\n useEffect(() => {\n setCustomPalettes(customPalettes);\n return () => setCustomPalettes(undefined);\n }, [customPalettes, setCustomPalettes]);\n\n // prop wins → context (devtools) → undefined (live)\n const simulatedDate = simulatedDateProp ?? ctxSimulatedDate;\n\n const [expanded, setExpanded] = useState(false);\n\n const activePhase = phaseOverride ?? phase;\n const activeBlend = phaseOverride\n ? { phase: phaseOverride, nextPhase: phaseOverride, t: 0 }\n : blend;\n\n const fromPalette = activeSkin.widgetPalettes[activeBlend.phase];\n const toPalette = activeSkin.widgetPalettes[activeBlend.nextPhase];\n\n const blendedPalette = useMemo(\n () => blendWidgetPalette(fromPalette, toPalette, activeBlend.t),\n [fromPalette, toPalette, activeBlend.t],\n );\n\n const finalPalette: WidgetPalette = useMemo(() => {\n if (!customPalettes?.[activePhase]) return blendedPalette;\n return { ...blendedPalette, bg: customPalettes[activePhase]?.bg };\n }, [blendedPalette, customPalettes, activePhase]);\n\n const time = useMemo(() => {\n const d = simulatedDate ?? new Date();\n const opts: Intl.DateTimeFormatOptions = {\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h23',\n };\n if (timezone) opts.timeZone = timezone;\n const parts = new Intl.DateTimeFormat('en-GB', opts).formatToParts(d);\n const hh = parts.find((p) => p.type === 'hour')?.value ?? '00';\n const mm = parts.find((p) => p.type === 'minute')?.value ?? '00';\n return `${hh}:${mm}`;\n }, [simulatedDate, timezone]);\n\n // ── Centralised weather fetch ────────────────────────────────────────────\n const liveWeather = useWeatherData(latitude ?? null, longitude ?? null);\n\n const liveWeatherCategory: WeatherCategory | null = showWeather\n ? (weatherCategoryOverride ?? liveWeather?.category ?? null)\n : null;\n\n const liveTemperatureC: number | null = liveWeather?.temperatureC ?? null;\n\n const SkinComponent = activeSkin.Component;\n\n return (\n <div style={{ visibility: mounted ? 'visible' : 'hidden' }}>\n <SkinComponent\n phase={activePhase}\n blend={activeBlend}\n expanded={expanded}\n onToggle={() => setExpanded((v) => !v)}\n expandDirection={expandDirection}\n size={size}\n time={time}\n location=\"\"\n showFlag={showFlag}\n showWeather={showWeather}\n hoverEffect={hoverEffect}\n weather={weatherCategoryOverride}\n liveWeatherCategory={liveWeatherCategory}\n liveTemperatureC={liveTemperatureC}\n palette={finalPalette}\n latitude={latitude}\n longitude={longitude}\n timezone={timezone}\n simulatedDate={simulatedDate}\n forceExpanded={forceExpanded}\n />\n </div>\n );\n}\n","'use client';\n\n/**\n * widgets/compact-widget.shell.tsx\n *\n * Shell for the compact solar widget — a slim pill/bar format.\n *\n * simulatedDate prop wins over ctx.simulatedDate (set by SolarDevTools),\n * which wins over undefined (live time). This means the devtools timeline\n * scrubber moves the orb in compact widgets without requiring any prop wiring.\n */\n\nimport { useEffect, useLayoutEffect, useMemo, useState } from 'react';\nimport type { SolarBlend, SolarPhase } from '../hooks/useSolarPosition';\nimport { lerpHex } from '../lib/solar-lerp';\nimport { useSolarTheme } from '../provider/solar-theme-provider';\nimport type { DesignMode, SkinDefinition, WidgetPalette } from '../skins/types/widget-skin.types';\nimport type { CustomPalettes } from './solar-widget.shell';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type WeatherCategory =\n | 'clear'\n | 'partly-cloudy'\n | 'overcast'\n | 'fog'\n | 'drizzle'\n | 'rain'\n | 'heavy-rain'\n | 'snow'\n | 'heavy-snow'\n | 'thunder';\n\nexport type CompactSize = 'sm' | 'md' | 'lg';\n\n// ─── WMO weather code map ─────────────────────────────────────────────────────\n\nconst WMO_MAP: Record<number, WeatherCategory> = {\n 0: 'clear',\n 1: 'clear',\n 2: 'partly-cloudy',\n 3: 'overcast',\n 45: 'fog',\n 48: 'fog',\n 51: 'drizzle',\n 53: 'drizzle',\n 55: 'drizzle',\n 61: 'rain',\n 63: 'rain',\n 65: 'heavy-rain',\n 71: 'snow',\n 73: 'snow',\n 75: 'heavy-snow',\n 80: 'rain',\n 82: 'heavy-rain',\n 85: 'snow',\n 86: 'heavy-snow',\n 95: 'thunder',\n 96: 'thunder',\n 99: 'thunder',\n};\n\n// ─── Centralised weather fetch ────────────────────────────────────────────────\n\ninterface LiveWeather {\n temperatureC: number;\n category: WeatherCategory;\n}\n\nasync function fetchWeather(lat: number, lon: number): Promise<LiveWeather> {\n const url = new URL('https://api.open-meteo.com/v1/forecast');\n url.searchParams.set('latitude', String(lat));\n url.searchParams.set('longitude', String(lon));\n url.searchParams.set('current', 'temperature_2m,weather_code');\n url.searchParams.set('forecast_days', '1');\n const data = (await fetch(url.toString()).then((r) => r.json())) as {\n current: { temperature_2m: number; weather_code: number };\n };\n return {\n temperatureC: Math.round(data.current.temperature_2m),\n category: WMO_MAP[data.current.weather_code] ?? 'clear',\n };\n}\n\nfunction useWeatherData(lat: number | null, lon: number | null) {\n const [weather, setWeather] = useState<LiveWeather | null>(null);\n useEffect(() => {\n if (!lat || !lon) return;\n let dead = false;\n fetchWeather(lat, lon)\n .then((w) => {\n if (!dead) setWeather(w);\n })\n .catch(() => {});\n const id = setInterval(\n () =>\n fetchWeather(lat, lon)\n .then((w) => {\n if (!dead) setWeather(w);\n })\n .catch(() => {}),\n 30 * 60 * 1000,\n );\n return () => {\n dead = true;\n clearInterval(id);\n };\n }, [lat, lon]);\n return weather;\n}\n\n// ─── Props passed to every compact skin component ─────────────────────────────\n\nexport interface CompactSkinProps {\n phase: SolarPhase;\n blend: SolarBlend;\n time: string;\n location: string;\n flag?: string;\n temperature?: string;\n weather?: WeatherCategory | null;\n liveWeatherCategory: WeatherCategory | null;\n liveTemperatureC: number | null;\n latitude?: number | null;\n longitude?: number | null;\n timezone?: string | null;\n simulatedDate?: Date;\n showFlag: boolean;\n showWeather: boolean;\n showTemperature: boolean;\n size: CompactSize;\n palette: WidgetPalette;\n}\n\n// ─── Public props for the shell ───────────────────────────────────────────────\n\nexport interface CompactWidgetProps {\n design?: DesignMode;\n overridePhase?: SolarPhase | null;\n time?: string;\n location?: string;\n flag?: string;\n temperature?: string;\n weather?: WeatherCategory | null;\n showFlag?: boolean;\n showWeather?: boolean;\n showTemperature?: boolean;\n size?: CompactSize;\n latitude?: number | null;\n longitude?: number | null;\n timezone?: string | null;\n /** Override background colors per phase */\n customPalettes?: CustomPalettes;\n /** Explicit simulated date. Falls back to ctx.simulatedDate (from SolarDevTools)\n * then to real current time. */\n simulatedDate?: Date;\n className?: string;\n}\n\n// ─── Palette blending ─────────────────────────────────────────────────────────\n\nfunction blendPalette(skin: SkinDefinition, blend: SolarBlend): WidgetPalette {\n const from = skin.widgetPalettes[blend.phase];\n const to = skin.widgetPalettes[blend.nextPhase];\n const t = blend.t;\n if (t === 0) return from;\n const lerp = (a: string, b: string) => lerpHex(a, b, t);\n return {\n bg: [lerp(from.bg[0], to.bg[0]), lerp(from.bg[1], to.bg[1]), lerp(from.bg[2], to.bg[2])] as [\n string,\n string,\n string,\n ],\n textColor: lerp(from.textColor, to.textColor),\n accentColor: lerp(from.accentColor, to.accentColor),\n orb: lerp(from.orb, to.orb),\n outerGlow: lerp(from.outerGlow, to.outerGlow),\n mode: from.mode,\n };\n}\n\n// ─── Shell ────────────────────────────────────────────────────────────────────\n\nexport function CompactWidget({\n design: designOverride,\n overridePhase,\n time,\n location = '',\n flag,\n temperature,\n weather = null,\n showFlag = false,\n showWeather = false,\n showTemperature = true,\n size = 'md',\n latitude,\n longitude,\n timezone,\n customPalettes,\n simulatedDate: simulatedDateProp,\n className = '',\n}: CompactWidgetProps) {\n const [mounted, setMounted] = useState(false);\n useLayoutEffect(() => setMounted(true), []);\n\n const ctx = useSolarTheme();\n\n // Register customPalettes into context so DevTools can read them\n useEffect(() => {\n ctx.setCustomPalettes(customPalettes);\n return () => ctx.setCustomPalettes(undefined);\n }, [customPalettes, ctx.setCustomPalettes]);\n\n // prop wins → context (devtools) → undefined (live)\n const simulatedDate = simulatedDateProp ?? ctx.simulatedDate;\n\n const skin = useMemo(() => {\n if (!designOverride || designOverride === ctx.design) return ctx.activeSkin;\n return ctx.activeSkin;\n }, [designOverride, ctx.design, ctx.activeSkin]);\n\n const phase = overridePhase ?? ctx.phase;\n const blend = overridePhase\n ? { phase: overridePhase, nextPhase: overridePhase, t: 0 }\n : ctx.blend;\n\n const blendedPalette = useMemo(() => blendPalette(skin, blend), [skin, blend]);\n\n const palette: WidgetPalette = useMemo(() => {\n if (!customPalettes?.[phase]) return blendedPalette;\n return { ...blendedPalette, bg: customPalettes[phase]?.bg };\n }, [blendedPalette, customPalettes, phase]);\n\n const resolvedLat = latitude ?? ctx.latitude;\n const resolvedLon = longitude ?? ctx.longitude;\n const resolvedTz = timezone ?? ctx.timezone;\n\n // ── Centralised weather fetch ────────────────────────────────────────────\n const liveWeather = useWeatherData(resolvedLat ?? null, resolvedLon ?? null);\n\n const liveWeatherCategory: WeatherCategory | null = showWeather\n ? (weather ?? liveWeather?.category ?? null)\n : null;\n\n const liveTemperatureC: number | null = liveWeather?.temperatureC ?? null;\n\n // ── Resolve time string ──────────────────────────────────────────────────\n // If caller passes an explicit time string, use it. Otherwise derive from\n // simulatedDate (or real time) so the clock display matches the orb.\n const resolvedTime = useMemo(() => {\n if (time) return time;\n const d = simulatedDate ?? new Date();\n const opts: Intl.DateTimeFormatOptions = {\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h23',\n };\n if (resolvedTz) opts.timeZone = resolvedTz;\n const parts = new Intl.DateTimeFormat('en-GB', opts).formatToParts(d);\n const hh = parts.find((p) => p.type === 'hour')?.value ?? '00';\n const mm = parts.find((p) => p.type === 'minute')?.value ?? '00';\n return `${hh}:${mm}`;\n }, [time, simulatedDate, resolvedTz]);\n\n const props: CompactSkinProps = {\n phase,\n blend,\n time: resolvedTime,\n location,\n flag,\n temperature,\n weather,\n liveWeatherCategory,\n liveTemperatureC,\n latitude: resolvedLat,\n longitude: resolvedLon,\n timezone: resolvedTz,\n simulatedDate,\n showFlag,\n showWeather,\n showTemperature,\n size,\n palette,\n };\n\n const CompactComponent = (\n skin as SkinDefinition & {\n CompactComponent?: React.ComponentType<CompactSkinProps>;\n }\n ).CompactComponent;\n\n if (!CompactComponent) {\n return (\n <div className={className} style={{ opacity: 0.4, fontSize: 11, color: '#888' }}>\n Compact not implemented for {skin.id}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{ visibility: mounted ? 'visible' : 'hidden', isolation: 'isolate' }}\n >\n <CompactComponent {...props} />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["WMO_MAP: Record<number, WeatherCategory>","fetchWeather","WMO_MAP","useWeatherData","finalPalette: WidgetPalette","opts: Intl.DateTimeFormatOptions","liveWeatherCategory: WeatherCategory | null","liveTemperatureC: number | null","WMO_MAP: Record<number, WeatherCategory>","palette: WidgetPalette","liveWeatherCategory: WeatherCategory | null","liveTemperatureC: number | null","props: CompactSkinProps","opts: Intl.DateTimeFormatOptions"],"sources":["../src/widgets/solar-widget.shell.tsx","../src/widgets/compact-widget.shell.tsx"],"sourcesContent":["'use client';\n\n/**\n * widgets/solar-widget.shell.tsx (skin-aware shell)\n *\n * Weather fetch is now centralised here alongside the compact shell:\n * - Fetches temperature + weather_code from open-meteo once per mount\n * - Resolves liveWeatherCategory: weatherCategoryOverride ?? live category\n * - Passes liveWeatherCategory + liveTemperatureC down to skin components\n * - Skins should prefer these props over running their own fetch\n *\n * simulatedDate prop wins over ctx.simulatedDate (set by SolarDevTools),\n * which wins over undefined (live time). This means the devtools timeline\n * scrubber moves the orb in every widget without requiring any prop wiring.\n */\n\nimport { useEffect, useLayoutEffect, useMemo, useState } from 'react';\nimport type { SolarPhase } from '../hooks/useSolarPosition';\nimport { lerpHex } from '../lib/solar-lerp';\nimport { useSolarTheme } from '../provider/solar-theme-provider';\nimport type { DesignMode, WidgetPalette } from '../skins/types/widget-skin.types';\n\n// ─── Re-exported types ────────────────────────────────────────────────────────\n\nexport type ExpandDirection =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'center-left'\n | 'center'\n | 'center-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\nexport type WidgetSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport type WeatherCategory =\n | 'clear'\n | 'partly-cloudy'\n | 'overcast'\n | 'fog'\n | 'drizzle'\n | 'rain'\n | 'heavy-rain'\n | 'snow'\n | 'heavy-snow'\n | 'thunder';\n\nexport type CustomPalettes = Partial<Record<SolarPhase, { bg: [string, string, string] }>>;\n\nimport { SKINS } from '../skins/index';\nexport const PALETTES = SKINS.foundry.widgetPalettes;\n\n// ─── WMO weather code map ─────────────────────────────────────────────────────\n\nconst WMO_MAP: Record<number, WeatherCategory> = {\n 0: 'clear',\n 1: 'clear',\n 2: 'partly-cloudy',\n 3: 'overcast',\n 45: 'fog',\n 48: 'fog',\n 51: 'drizzle',\n 53: 'drizzle',\n 55: 'drizzle',\n 61: 'rain',\n 63: 'rain',\n 65: 'heavy-rain',\n 71: 'snow',\n 73: 'snow',\n 75: 'heavy-snow',\n 80: 'rain',\n 82: 'heavy-rain',\n 85: 'snow',\n 86: 'heavy-snow',\n 95: 'thunder',\n 96: 'thunder',\n 99: 'thunder',\n};\n\ninterface LiveWeather {\n temperatureC: number;\n category: WeatherCategory;\n}\n\nasync function fetchWeather(lat: number, lon: number): Promise<LiveWeather> {\n const url = new URL('https://api.open-meteo.com/v1/forecast');\n url.searchParams.set('latitude', String(lat));\n url.searchParams.set('longitude', String(lon));\n url.searchParams.set('current', 'temperature_2m,weather_code');\n url.searchParams.set('forecast_days', '1');\n const data = (await fetch(url.toString()).then((r) => r.json())) as {\n current: { temperature_2m: number; weather_code: number };\n };\n return {\n temperatureC: Math.round(data.current.temperature_2m),\n category: WMO_MAP[data.current.weather_code] ?? 'clear',\n };\n}\n\nfunction useWeatherData(lat: number | null, lon: number | null) {\n const [weather, setWeather] = useState<LiveWeather | null>(null);\n useEffect(() => {\n if (!lat || !lon) return;\n let dead = false;\n fetchWeather(lat, lon)\n .then((w) => {\n if (!dead) setWeather(w);\n })\n .catch(() => {});\n const id = setInterval(\n () =>\n fetchWeather(lat, lon)\n .then((w) => {\n if (!dead) setWeather(w);\n })\n .catch(() => {}),\n 30 * 60 * 1000,\n );\n return () => {\n dead = true;\n clearInterval(id);\n };\n }, [lat, lon]);\n return weather;\n}\n\n// ─── Widget props ─────────────────────────────────────────────────────────────\n\nexport interface SolarWidgetProps {\n expandDirection?: ExpandDirection;\n size?: WidgetSize;\n showFlag?: boolean;\n showWeather?: boolean;\n hoverEffect?: boolean;\n customPalettes?: CustomPalettes;\n phaseOverride?: SolarPhase;\n weatherCategoryOverride?: WeatherCategory | null;\n /** Explicit simulated date. Falls back to ctx.simulatedDate (from SolarDevTools)\n * then to real current time. */\n simulatedDate?: Date;\n /** Lock the widget state: `true` = always expanded, `false` = always collapsed.\n * Omit or pass `undefined` for default localStorage-driven behaviour. */\n forceExpanded?: boolean;\n}\n\n// ─── Palette blending helper ──────────────────────────────────────────────────\n\nfunction blendWidgetPalette(from: WidgetPalette, to: WidgetPalette, t: number): WidgetPalette {\n return {\n bg: [\n lerpHex(from.bg[0], to.bg[0], t),\n lerpHex(from.bg[1], to.bg[1], t),\n lerpHex(from.bg[2], to.bg[2], t),\n ],\n textColor: lerpHex(from.textColor, to.textColor, t),\n accentColor: lerpHex(from.accentColor, to.accentColor, t),\n orb: lerpHex(from.orb, to.orb, t),\n outerGlow: from.outerGlow,\n mode: t < 0.5 ? from.mode : to.mode,\n };\n}\n\n// ─── Shell component ──────────────────────────────────────────────────────────\n\nexport function SolarWidget({\n expandDirection = 'bottom-right',\n size = 'lg',\n showFlag = false,\n showWeather = false,\n hoverEffect = false,\n customPalettes,\n phaseOverride,\n weatherCategoryOverride,\n simulatedDate: simulatedDateProp,\n forceExpanded,\n}: SolarWidgetProps) {\n const [mounted, setMounted] = useState(false);\n useLayoutEffect(() => setMounted(true), []);\n\n const {\n phase,\n blend,\n activeSkin,\n timezone,\n latitude,\n longitude,\n simulatedDate: ctxSimulatedDate,\n setCustomPalettes,\n } = useSolarTheme();\n\n // Register customPalettes into context so DevTools can read them\n useEffect(() => {\n setCustomPalettes(customPalettes);\n return () => setCustomPalettes(undefined);\n }, [customPalettes, setCustomPalettes]);\n\n // prop wins → context (devtools) → undefined (live)\n const simulatedDate = simulatedDateProp ?? ctxSimulatedDate;\n\n const [expanded, setExpanded] = useState(false);\n\n const activePhase = phaseOverride ?? phase;\n const activeBlend = phaseOverride\n ? { phase: phaseOverride, nextPhase: phaseOverride, t: 0 }\n : blend;\n\n const fromPalette = activeSkin.widgetPalettes[activeBlend.phase];\n const toPalette = activeSkin.widgetPalettes[activeBlend.nextPhase];\n\n const blendedPalette = useMemo(\n () => blendWidgetPalette(fromPalette, toPalette, activeBlend.t),\n [fromPalette, toPalette, activeBlend.t],\n );\n\n const finalPalette: WidgetPalette = useMemo(() => {\n if (!customPalettes?.[activePhase]) return blendedPalette;\n return { ...blendedPalette, bg: customPalettes[activePhase]?.bg };\n }, [blendedPalette, customPalettes, activePhase]);\n\n const time = useMemo(() => {\n const d = simulatedDate ?? new Date();\n const opts: Intl.DateTimeFormatOptions = {\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h23',\n };\n if (timezone) opts.timeZone = timezone;\n const parts = new Intl.DateTimeFormat('en-GB', opts).formatToParts(d);\n const hh = parts.find((p) => p.type === 'hour')?.value ?? '00';\n const mm = parts.find((p) => p.type === 'minute')?.value ?? '00';\n return `${hh}:${mm}`;\n }, [simulatedDate, timezone]);\n\n // ── Centralised weather fetch ────────────────────────────────────────────\n const liveWeather = useWeatherData(latitude ?? null, longitude ?? null);\n\n const liveWeatherCategory: WeatherCategory | null = showWeather\n ? (weatherCategoryOverride ?? liveWeather?.category ?? null)\n : null;\n\n const liveTemperatureC: number | null = liveWeather?.temperatureC ?? null;\n\n const SkinComponent = activeSkin.Component;\n\n return (\n <div style={{ visibility: mounted ? 'visible' : 'hidden' }}>\n <SkinComponent\n phase={activePhase}\n blend={activeBlend}\n expanded={expanded}\n onToggle={() => setExpanded((v) => !v)}\n expandDirection={expandDirection}\n size={size}\n time={time}\n location=\"\"\n showFlag={showFlag}\n showWeather={showWeather}\n hoverEffect={hoverEffect}\n weather={weatherCategoryOverride}\n liveWeatherCategory={liveWeatherCategory}\n liveTemperatureC={liveTemperatureC}\n palette={finalPalette}\n latitude={latitude}\n longitude={longitude}\n timezone={timezone}\n simulatedDate={simulatedDate}\n forceExpanded={forceExpanded}\n />\n </div>\n );\n}\n","'use client';\n\n/**\n * widgets/compact-widget.shell.tsx\n *\n * Shell for the compact solar widget — a slim pill/bar format.\n *\n * simulatedDate prop wins over ctx.simulatedDate (set by SolarDevTools),\n * which wins over undefined (live time). This means the devtools timeline\n * scrubber moves the orb in compact widgets without requiring any prop wiring.\n */\n\nimport { useEffect, useLayoutEffect, useMemo, useState } from 'react';\nimport type { SolarBlend, SolarPhase } from '../hooks/useSolarPosition';\nimport { lerpHex } from '../lib/solar-lerp';\nimport { useSolarTheme } from '../provider/solar-theme-provider';\nimport type { DesignMode, SkinDefinition, WidgetPalette } from '../skins/types/widget-skin.types';\nimport type { CustomPalettes } from './solar-widget.shell';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type WeatherCategory =\n | 'clear'\n | 'partly-cloudy'\n | 'overcast'\n | 'fog'\n | 'drizzle'\n | 'rain'\n | 'heavy-rain'\n | 'snow'\n | 'heavy-snow'\n | 'thunder';\n\nexport type CompactSize = 'sm' | 'md' | 'lg';\n\n// ─── WMO weather code map ─────────────────────────────────────────────────────\n\nconst WMO_MAP: Record<number, WeatherCategory> = {\n 0: 'clear',\n 1: 'clear',\n 2: 'partly-cloudy',\n 3: 'overcast',\n 45: 'fog',\n 48: 'fog',\n 51: 'drizzle',\n 53: 'drizzle',\n 55: 'drizzle',\n 61: 'rain',\n 63: 'rain',\n 65: 'heavy-rain',\n 71: 'snow',\n 73: 'snow',\n 75: 'heavy-snow',\n 80: 'rain',\n 82: 'heavy-rain',\n 85: 'snow',\n 86: 'heavy-snow',\n 95: 'thunder',\n 96: 'thunder',\n 99: 'thunder',\n};\n\n// ─── Centralised weather fetch ────────────────────────────────────────────────\n\ninterface LiveWeather {\n temperatureC: number;\n category: WeatherCategory;\n}\n\nasync function fetchWeather(lat: number, lon: number): Promise<LiveWeather> {\n const url = new URL('https://api.open-meteo.com/v1/forecast');\n url.searchParams.set('latitude', String(lat));\n url.searchParams.set('longitude', String(lon));\n url.searchParams.set('current', 'temperature_2m,weather_code');\n url.searchParams.set('forecast_days', '1');\n const data = (await fetch(url.toString()).then((r) => r.json())) as {\n current: { temperature_2m: number; weather_code: number };\n };\n return {\n temperatureC: Math.round(data.current.temperature_2m),\n category: WMO_MAP[data.current.weather_code] ?? 'clear',\n };\n}\n\nfunction useWeatherData(lat: number | null, lon: number | null) {\n const [weather, setWeather] = useState<LiveWeather | null>(null);\n useEffect(() => {\n if (!lat || !lon) return;\n let dead = false;\n fetchWeather(lat, lon)\n .then((w) => {\n if (!dead) setWeather(w);\n })\n .catch(() => {});\n const id = setInterval(\n () =>\n fetchWeather(lat, lon)\n .then((w) => {\n if (!dead) setWeather(w);\n })\n .catch(() => {}),\n 30 * 60 * 1000,\n );\n return () => {\n dead = true;\n clearInterval(id);\n };\n }, [lat, lon]);\n return weather;\n}\n\n// ─── Props passed to every compact skin component ─────────────────────────────\n\nexport interface CompactSkinProps {\n phase: SolarPhase;\n blend: SolarBlend;\n time: string;\n location: string;\n flag?: string;\n temperature?: string;\n weather?: WeatherCategory | null;\n liveWeatherCategory: WeatherCategory | null;\n liveTemperatureC: number | null;\n latitude?: number | null;\n longitude?: number | null;\n timezone?: string | null;\n simulatedDate?: Date;\n showFlag: boolean;\n showWeather: boolean;\n showTemperature: boolean;\n size: CompactSize;\n palette: WidgetPalette;\n}\n\n// ─── Public props for the shell ───────────────────────────────────────────────\n\nexport interface CompactWidgetProps {\n design?: DesignMode;\n overridePhase?: SolarPhase | null;\n time?: string;\n location?: string;\n flag?: string;\n temperature?: string;\n weather?: WeatherCategory | null;\n weatherCategoryOverride?: WeatherCategory | null;\n showFlag?: boolean;\n showWeather?: boolean;\n showTemperature?: boolean;\n size?: CompactSize;\n latitude?: number | null;\n longitude?: number | null;\n timezone?: string | null;\n /** Override background colors per phase */\n customPalettes?: CustomPalettes;\n /** Explicit simulated date. Falls back to ctx.simulatedDate (from SolarDevTools)\n * then to real current time. */\n simulatedDate?: Date;\n className?: string;\n}\n\n// ─── Palette blending ─────────────────────────────────────────────────────────\n\nfunction blendPalette(skin: SkinDefinition, blend: SolarBlend): WidgetPalette {\n const from = skin.widgetPalettes[blend.phase];\n const to = skin.widgetPalettes[blend.nextPhase];\n const t = blend.t;\n if (t === 0) return from;\n const lerp = (a: string, b: string) => lerpHex(a, b, t);\n return {\n bg: [lerp(from.bg[0], to.bg[0]), lerp(from.bg[1], to.bg[1]), lerp(from.bg[2], to.bg[2])] as [\n string,\n string,\n string,\n ],\n textColor: lerp(from.textColor, to.textColor),\n accentColor: lerp(from.accentColor, to.accentColor),\n orb: lerp(from.orb, to.orb),\n outerGlow: lerp(from.outerGlow, to.outerGlow),\n mode: from.mode,\n };\n}\n\n// ─── Shell ────────────────────────────────────────────────────────────────────\n\nexport function CompactWidget({\n design: designOverride,\n overridePhase,\n time,\n location = '',\n flag,\n temperature,\n weather = null,\n weatherCategoryOverride,\n showFlag = false,\n showWeather = false,\n showTemperature = true,\n size = 'md',\n latitude,\n longitude,\n timezone,\n customPalettes,\n simulatedDate: simulatedDateProp,\n className = '',\n}: CompactWidgetProps) {\n const [mounted, setMounted] = useState(false);\n useLayoutEffect(() => setMounted(true), []);\n\n const ctx = useSolarTheme();\n\n // Register customPalettes into context so DevTools can read them\n useEffect(() => {\n ctx.setCustomPalettes(customPalettes);\n return () => ctx.setCustomPalettes(undefined);\n }, [customPalettes, ctx.setCustomPalettes]);\n\n // prop wins → context (devtools) → undefined (live)\n const simulatedDate = simulatedDateProp ?? ctx.simulatedDate;\n\n const skin = useMemo(() => {\n if (!designOverride || designOverride === ctx.design) return ctx.activeSkin;\n return ctx.activeSkin;\n }, [designOverride, ctx.design, ctx.activeSkin]);\n\n const phase = overridePhase ?? ctx.phase;\n const blend = overridePhase\n ? { phase: overridePhase, nextPhase: overridePhase, t: 0 }\n : ctx.blend;\n\n const blendedPalette = useMemo(() => blendPalette(skin, blend), [skin, blend]);\n\n const palette: WidgetPalette = useMemo(() => {\n if (!customPalettes?.[phase]) return blendedPalette;\n return { ...blendedPalette, bg: customPalettes[phase]?.bg };\n }, [blendedPalette, customPalettes, phase]);\n\n const resolvedLat = latitude ?? ctx.latitude;\n const resolvedLon = longitude ?? ctx.longitude;\n const resolvedTz = timezone ?? ctx.timezone;\n\n // ── Centralised weather fetch ────────────────────────────────────────────\n const liveWeather = useWeatherData(resolvedLat ?? null, resolvedLon ?? null);\n\n const liveWeatherCategory: WeatherCategory | null = showWeather\n ? (weatherCategoryOverride ?? weather ?? liveWeather?.category ?? null)\n : null;\n\n const liveTemperatureC: number | null = liveWeather?.temperatureC ?? null;\n\n // ── Resolve time string ──────────────────────────────────────────────────\n // If caller passes an explicit time string, use it. Otherwise derive from\n // simulatedDate (or real time) so the clock display matches the orb.\n const resolvedTime = useMemo(() => {\n if (time) return time;\n const d = simulatedDate ?? new Date();\n const opts: Intl.DateTimeFormatOptions = {\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h23',\n };\n if (resolvedTz) opts.timeZone = resolvedTz;\n const parts = new Intl.DateTimeFormat('en-GB', opts).formatToParts(d);\n const hh = parts.find((p) => p.type === 'hour')?.value ?? '00';\n const mm = parts.find((p) => p.type === 'minute')?.value ?? '00';\n return `${hh}:${mm}`;\n }, [time, simulatedDate, resolvedTz]);\n\n const props: CompactSkinProps = {\n phase,\n blend,\n time: resolvedTime,\n location,\n flag,\n temperature,\n weather,\n liveWeatherCategory,\n liveTemperatureC,\n latitude: resolvedLat,\n longitude: resolvedLon,\n timezone: resolvedTz,\n simulatedDate,\n showFlag,\n showWeather,\n showTemperature,\n size,\n palette,\n };\n\n const CompactComponent = (\n skin as SkinDefinition & {\n CompactComponent?: React.ComponentType<CompactSkinProps>;\n }\n ).CompactComponent;\n\n if (!CompactComponent) {\n return (\n <div className={className} style={{ opacity: 0.4, fontSize: 11, color: '#888' }}>\n Compact not implemented for {skin.id}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{ visibility: mounted ? 'visible' : 'hidden', isolation: 'isolate' }}\n >\n <CompactComponent {...props} />\n </div>\n );\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@circadian/sol",
3
- "version": "0.2.6",
3
+ "version": "0.2.7",
4
4
  "type": "module",
5
5
  "description": "Solar-aware React widget library with real-time phase transitions.",
6
6
  "homepage": "https://circadian.dev",