react-os-shell 0.2.54 → 0.2.56
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/dist/{Browser-4WIA5UFC.js → Browser-XDEBFFH5.js} +3 -3
- package/dist/{Browser-4WIA5UFC.js.map → Browser-XDEBFFH5.js.map} +1 -1
- package/dist/{Calculator-WJSLOXOC.js → Calculator-CSVNNWA3.js} +4 -4
- package/dist/{Calculator-WJSLOXOC.js.map → Calculator-CSVNNWA3.js.map} +1 -1
- package/dist/{Calendar-PNKZHKKU.js → Calendar-SGDRB5L7.js} +3 -3
- package/dist/{Calendar-PNKZHKKU.js.map → Calendar-SGDRB5L7.js.map} +1 -1
- package/dist/{CurrencyConverter-23WT33SH.js → CurrencyConverter-AXZ6EWU4.js} +4 -4
- package/dist/{CurrencyConverter-23WT33SH.js.map → CurrencyConverter-AXZ6EWU4.js.map} +1 -1
- package/dist/{Documents-QT3EIB6G.js → Documents-S5PXDWTK.js} +3 -3
- package/dist/{Documents-QT3EIB6G.js.map → Documents-S5PXDWTK.js.map} +1 -1
- package/dist/{Email-2LZXT2UA.js → Email-3DXXEIFE.js} +3 -3
- package/dist/{Email-2LZXT2UA.js.map → Email-3DXXEIFE.js.map} +1 -1
- package/dist/Files-I4H7LVP3.js +8 -0
- package/dist/{Files-XAJ64SWC.js.map → Files-I4H7LVP3.js.map} +1 -1
- package/dist/{Minesweeper-BOCFOG5R.js → Minesweeper-L7YLY73F.js} +3 -3
- package/dist/{Minesweeper-BOCFOG5R.js.map → Minesweeper-L7YLY73F.js.map} +1 -1
- package/dist/{Notepad-UUUJKLXB.js → Notepad-SN5WZIJY.js} +3 -3
- package/dist/{Notepad-UUUJKLXB.js.map → Notepad-SN5WZIJY.js.map} +1 -1
- package/dist/{PomodoroTimer-H4EMUMPT.js → PomodoroTimer-PJFPPOOQ.js} +4 -4
- package/dist/{PomodoroTimer-H4EMUMPT.js.map → PomodoroTimer-PJFPPOOQ.js.map} +1 -1
- package/dist/Preview-KUPKE5NL.js +7 -0
- package/dist/{Preview-KZRXVDHE.js.map → Preview-KUPKE5NL.js.map} +1 -1
- package/dist/{Spreadsheet-TEK43EVB.js → Spreadsheet-T5TEHTKO.js} +3 -3
- package/dist/{Spreadsheet-TEK43EVB.js.map → Spreadsheet-T5TEHTKO.js.map} +1 -1
- package/dist/{Weather-BGLKHRCK.js → Weather-XMFVT6EO.js} +4 -4
- package/dist/{Weather-BGLKHRCK.js.map → Weather-XMFVT6EO.js.map} +1 -1
- package/dist/{WorldClock-X3VM3WFT.js → WorldClock-2F7CPJZW.js} +4 -4
- package/dist/{WorldClock-X3VM3WFT.js.map → WorldClock-2F7CPJZW.js.map} +1 -1
- package/dist/apps/index.js +17 -17
- package/dist/{chunk-4ZCO2DWL.js → chunk-372FJEYH.js} +3 -3
- package/dist/{chunk-4ZCO2DWL.js.map → chunk-372FJEYH.js.map} +1 -1
- package/dist/{chunk-X3TFGP5L.js → chunk-C4ULDV3I.js} +31 -46
- package/dist/chunk-C4ULDV3I.js.map +1 -0
- package/dist/{chunk-ZISNG7C2.js → chunk-HPORR7Y6.js} +4 -4
- package/dist/{chunk-ZISNG7C2.js.map → chunk-HPORR7Y6.js.map} +1 -1
- package/dist/{chunk-YMSQ23E4.js → chunk-LWXHFZE4.js} +25 -11
- package/dist/chunk-LWXHFZE4.js.map +1 -0
- package/dist/index.js +4 -4
- package/package.json +1 -1
- package/dist/Files-XAJ64SWC.js +0 -8
- package/dist/Preview-KZRXVDHE.js +0 -7
- package/dist/chunk-X3TFGP5L.js.map +0 -1
- package/dist/chunk-YMSQ23E4.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/Weather.tsx"],"names":["parts","h","m","t"],"mappings":"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","file":"Weather-BGLKHRCK.js","sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport { useWidgetSettings } from '../shell/Modal';\nimport WidgetSettingsModal, { loadAppearance, type WidgetAppearance } from '../shell/WidgetSettingsModal';\nimport { useShellPrefs } from '../shell/ShellPrefs';\nimport { AVAILABLE_CITIES, fetchCityWeather, getCondition, toFahrenheit, type CityWeather } from './_weatherData';\n\nconst STORAGE_KEY = 'weather_city';\nconst LEGACY_KEY = 'weather_cities';\nconst SETTINGS_KEY = 'weather_appearance';\n\ninterface WeatherPrefs { useFahrenheit: boolean; showLocalTime: boolean; use24Hour: boolean }\nconst DEFAULT_PREFS: WeatherPrefs = { useFahrenheit: false, showLocalTime: true, use24Hour: false };\n\nfunction detectLocalCity(): string {\n try {\n const userTz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n for (const [name, info] of Object.entries(AVAILABLE_CITIES)) {\n if (info.tz === userTz) return name;\n }\n } catch {}\n return 'London';\n}\n\nfunction loadCity(): string {\n const v = typeof localStorage !== 'undefined' ? localStorage.getItem(STORAGE_KEY) : null;\n if (v && AVAILABLE_CITIES[v]) return v;\n try {\n const arr = JSON.parse(localStorage.getItem(LEGACY_KEY) || '');\n if (Array.isArray(arr) && arr[0] && AVAILABLE_CITIES[arr[0]]) {\n localStorage.setItem(STORAGE_KEY, arr[0]);\n return arr[0];\n }\n } catch {}\n return detectLocalCity();\n}\n\nconst toF = toFahrenheit;\n\nfunction getTimeInTz(timezone: string, use24Hour = false): string {\n try {\n if (use24Hour) {\n const parts = new Intl.DateTimeFormat('en-US', { timeZone: timezone, hour: 'numeric', minute: '2-digit', hour12: false }).formatToParts(new Date());\n const h = parseInt(parts.find(p => p.type === 'hour')?.value || '0');\n const m = parseInt(parts.find(p => p.type === 'minute')?.value || '0');\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`;\n }\n const parts = new Intl.DateTimeFormat('en-US', { timeZone: timezone, hour: 'numeric', minute: '2-digit', hour12: true }).formatToParts(new Date());\n const h = parseInt(parts.find(p => p.type === 'hour')?.value || '12');\n const m = parseInt(parts.find(p => p.type === 'minute')?.value || '0');\n const period = parts.find(p => p.type === 'dayPeriod')?.value || '';\n return `${h}:${String(m).padStart(2, '0')} ${period}`;\n } catch { return ''; }\n}\n\n/**\n * Effect keyframes — tuned for a ~110 px-tall card so drops/flakes fall\n * across the full height before recycling. Multiple snow/rain variants\n * give the impression of independent particles instead of a hypnotic\n * lock-step pattern.\n */\nconst WX_KEYFRAMES = `\n@keyframes wx-rain-a { 0% { transform: translate(0,-20px); opacity: 0; } 10% { opacity: 0.95; } 100% { transform: translate(8px,140px); opacity: 0; } }\n@keyframes wx-rain-b { 0% { transform: translate(0,-20px); opacity: 0; } 12% { opacity: 0.85; } 100% { transform: translate(12px,140px); opacity: 0; } }\n@keyframes wx-rain-c { 0% { transform: translate(0,-20px); opacity: 0; } 10% { opacity: 1; } 100% { transform: translate(5px,140px); opacity: 0; } }\n@keyframes wx-snow-a { 0% { transform: translate(0,-12px) rotate(0deg); opacity: 0; } 10% { opacity: 0.9; } 50% { transform: translate(10px,55px) rotate(180deg); } 100% { transform: translate(-4px,140px) rotate(360deg); opacity: 0; } }\n@keyframes wx-snow-b { 0% { transform: translate(0,-12px) rotate(0deg); opacity: 0; } 10% { opacity: 0.85; } 50% { transform: translate(-12px,55px) rotate(-180deg); } 100% { transform: translate(6px,140px) rotate(-360deg); opacity: 0; } }\n@keyframes wx-snow-c { 0% { transform: translate(0,-12px); opacity: 0; } 10% { opacity: 0.7; } 100% { transform: translate(2px,140px); opacity: 0; } }\n@keyframes wx-drift-cloud { 0% { transform: translateX(-40%); } 100% { transform: translateX(140%); } }\n@keyframes wx-twinkle { 0%, 100% { opacity: 0.25; transform: scale(1); } 50% { opacity: 1; transform: scale(1.6); } }\n@keyframes wx-flash { 0%, 86%, 100% { opacity: 0; } 87% { opacity: 0.95; } 88% { opacity: 0.15; } 89% { opacity: 0.85; } 90% { opacity: 0; } }\n@keyframes wx-bolt { 0%, 86%, 90%, 100% { opacity: 0; } 87% { opacity: 1; } 89% { opacity: 0.85; } }\n@keyframes wx-sun-pulse { 0%, 100% { transform: scale(1); opacity: 0.65; } 50% { transform: scale(1.12); opacity: 0.95; } }\n@keyframes wx-sun-rays { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n@keyframes wx-fog-drift { 0% { transform: translateX(-25%); opacity: 0.3; } 50% { opacity: 0.65; } 100% { transform: translateX(25%); opacity: 0.3; } }\n@keyframes wx-shooting-star { 0%, 95% { opacity: 0; transform: translate(0,0) scale(0); } 96% { opacity: 1; transform: translate(0,0) scale(1); } 100% { opacity: 0; transform: translate(40px,30px) scale(1); } }\n`;\n\nfunction SunEffect() {\n // Defined yellow-orange disc with halo + slowly-rotating ray sprite.\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <div className=\"absolute -top-5 -right-5 w-24 h-24\" style={{ animation: 'wx-sun-rays 70s linear infinite' }}>\n <svg viewBox=\"0 0 100 100\" className=\"w-full h-full\">\n {Array.from({ length: 12 }).map((_, i) => (\n <rect key={i} x={49} y={3} width={2} height={14} rx={1}\n fill=\"rgba(255, 232, 130, 0.55)\"\n transform={`rotate(${i * 30} 50 50)`} />\n ))}\n </svg>\n </div>\n <div className=\"absolute top-1 right-1 w-10 h-10 rounded-full\"\n style={{\n background: 'radial-gradient(circle at 35% 35%, #fff8cc 0%, #ffd84a 55%, #ff9e2a 100%)',\n boxShadow: '0 0 18px 5px rgba(255, 200, 80, 0.55)',\n animation: 'wx-sun-pulse 4.5s ease-in-out infinite',\n }} />\n </div>\n );\n}\n\nfunction NightStarsEffect() {\n // Crescent moon (outer warm circle + offset dark circle to carve out the\n // bite) and a sparse scatter of stars twinkling at independent rates.\n // One slow-cycle shooting star adds a moment of motion without\n // distracting.\n const stars = Array.from({ length: 16 }).map((_, i) => ({\n left: `${(i * 53 + 11) % 95}%`,\n top: `${(i * 37 + 9) % 78}%`,\n size: 1 + ((i * 13) % 3),\n delay: `${(i * 0.41) % 4}s`,\n duration: `${2.5 + ((i * 7) % 5) * 0.6}s`,\n }));\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {/* Crescent moon */}\n <div className=\"absolute top-1 right-1\">\n <svg viewBox=\"0 0 40 40\" className=\"w-9 h-9\" style={{ filter: 'drop-shadow(0 0 6px rgba(255,250,220,0.4))' }}>\n <defs>\n <radialGradient id=\"wx-moon-grad\" cx=\"35%\" cy=\"35%\">\n <stop offset=\"0\" stopColor=\"#fffae0\" />\n <stop offset=\"1\" stopColor=\"#d4c98a\" />\n </radialGradient>\n </defs>\n <circle cx={20} cy={20} r={13} fill=\"url(#wx-moon-grad)\" />\n <circle cx={26} cy={16} r={11} fill=\"rgba(15,23,42,1)\" />\n </svg>\n </div>\n {stars.map((s, i) => (\n <div key={i} className=\"absolute rounded-full bg-white\"\n style={{\n left: s.left, top: s.top, width: s.size, height: s.size,\n animation: `wx-twinkle ${s.duration} ease-in-out ${s.delay} infinite`,\n }} />\n ))}\n {/* Shooting star — appears once every ~12s */}\n <div className=\"absolute\" style={{ left: '15%', top: '20%', animation: 'wx-shooting-star 12s ease-out infinite' }}>\n <div className=\"w-12 h-px\"\n style={{ background: 'linear-gradient(to right, transparent, rgba(255,255,255,0.95))', boxShadow: '0 0 4px rgba(255,255,255,0.8)' }} />\n </div>\n </div>\n );\n}\n\nfunction CloudsEffect({ tone = 'light' as 'light' | 'dark' }) {\n const fill = tone === 'light' ? 'rgba(255,255,255,0.78)' : 'rgba(220,228,240,0.45)';\n const Cloud = ({ scale = 1 }) => (\n <svg viewBox=\"0 0 120 50\" className=\"w-32 h-12\" style={{ transform: `scale(${scale})`, filter: 'blur(0.6px)' }}>\n <ellipse cx={28} cy={36} rx={18} ry={11} fill={fill} />\n <ellipse cx={50} cy={28} rx={22} ry={15} fill={fill} />\n <ellipse cx={75} cy={32} rx={20} ry={12} fill={fill} />\n <ellipse cx={95} cy={38} rx={15} ry={9} fill={fill} />\n </svg>\n );\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <div className=\"absolute\" style={{ top: '8%', animation: 'wx-drift-cloud 42s linear infinite' }}><Cloud scale={0.9} /></div>\n <div className=\"absolute\" style={{ top: '40%', animation: 'wx-drift-cloud 60s linear -22s infinite', opacity: 0.85 }}><Cloud scale={1.25} /></div>\n <div className=\"absolute\" style={{ top: '68%', animation: 'wx-drift-cloud 78s linear -45s infinite', opacity: 0.7 }}><Cloud scale={0.75} /></div>\n </div>\n );\n}\n\nfunction RainEffect({ heavy = false }: { heavy?: boolean }) {\n const count = heavy ? 26 : 16;\n const variants = ['wx-rain-a', 'wx-rain-b', 'wx-rain-c'];\n const drops = Array.from({ length: count }).map((_, i) => ({\n left: `${(i * 100 / count + (i * 11) % 7) % 100}%`,\n delay: `${(i * 0.087) % 1.3}s`,\n height: `${12 + (i % 4) * 5}px`,\n duration: `${0.7 + (i % 3) * 0.18}s`,\n variant: variants[i % variants.length],\n }));\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {drops.map((d, i) => (\n <div key={i} className=\"absolute\"\n style={{\n left: d.left, top: '-20px',\n width: '1px', height: d.height,\n background: 'linear-gradient(180deg, rgba(180,210,255,0) 0%, rgba(220,235,255,0.85) 90%, rgba(255,255,255,0.95) 100%)',\n transform: 'rotate(8deg)',\n animation: `${d.variant} ${d.duration} linear ${d.delay} infinite`,\n transformOrigin: 'top',\n }} />\n ))}\n </div>\n );\n}\n\nfunction SnowEffect() {\n const variants = ['wx-snow-a', 'wx-snow-b', 'wx-snow-c'];\n const flakes = Array.from({ length: 16 }).map((_, i) => ({\n left: `${(i * 100 / 16 + (i * 13) % 5) % 100}%`,\n delay: `${(i * 0.43) % 5}s`,\n duration: `${4.5 + (i % 5)}s`,\n size: 3 + (i % 4) * 1.4,\n opacity: 0.65 + ((i * 7) % 4) * 0.08,\n variant: variants[i % variants.length],\n }));\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {flakes.map((f, i) => (\n <div key={i} className=\"absolute rounded-full bg-white\"\n style={{\n left: f.left, top: '-12px',\n width: f.size, height: f.size,\n opacity: f.opacity,\n boxShadow: '0 0 4px rgba(255,255,255,0.65)',\n animation: `${f.variant} ${f.duration} linear ${f.delay} infinite`,\n }} />\n ))}\n </div>\n );\n}\n\nfunction ThunderEffect() {\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <RainEffect heavy />\n {/* Sharp double-flash overlay */}\n <div className=\"absolute inset-0 bg-white\" style={{ animation: 'wx-flash 6s ease-out infinite' }} />\n {/* Lightning bolt — visible only during the flash peaks */}\n <div className=\"absolute inset-y-0 right-1/3 flex items-center justify-center pointer-events-none\"\n style={{ animation: 'wx-bolt 6s ease-out infinite' }}>\n <svg viewBox=\"0 0 18 60\" className=\"h-4/5\"\n style={{ filter: 'drop-shadow(0 0 6px rgba(255, 240, 150, 0.95)) drop-shadow(0 0 14px rgba(255, 220, 90, 0.7))' }}>\n <path d=\"M11 0 L2 28 L8 30 L4 60 L16 24 L9 22 Z\"\n fill=\"rgba(255, 250, 200, 0.98)\"\n stroke=\"rgba(255, 255, 255, 0.9)\" strokeWidth={0.3} />\n </svg>\n </div>\n </div>\n );\n}\n\nfunction FogEffect() {\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"absolute left-0 right-0\"\n style={{\n top: `${10 + i * 22}%`,\n height: '14px',\n background: 'linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.55) 50%, rgba(255,255,255,0) 100%)',\n filter: 'blur(2px)',\n animation: `wx-fog-drift ${10 + i * 3}s ease-in-out ${i * 0.7}s infinite alternate`,\n }} />\n ))}\n </div>\n );\n}\n\nfunction WeatherEffect({ code, isDay }: { code: number; isDay: boolean }) {\n if (code === 0 || code === 1) return isDay ? <SunEffect /> : <NightStarsEffect />;\n if (code === 2) return (\n <>\n {isDay ? <SunEffect /> : <NightStarsEffect />}\n <CloudsEffect tone={isDay ? 'light' : 'dark'} />\n </>\n );\n if (code === 3) return <CloudsEffect tone={isDay ? 'light' : 'dark'} />;\n if (code === 45 || code === 48) return <FogEffect />;\n if ([51, 53, 61, 80, 81].includes(code)) return <RainEffect />;\n if ([55, 63, 65, 82].includes(code)) return <RainEffect heavy />;\n if ([71, 73, 75].includes(code)) return <SnowEffect />;\n if ([95, 96, 99].includes(code)) return <ThunderEffect />;\n return null;\n}\n\nexport default function Weather() {\n const [city, setCity] = useState(loadCity);\n const [appearance, setAppearance] = useState(() => loadAppearance(SETTINGS_KEY));\n const [data, setData] = useState<CityWeather | null>(null);\n const [loading, setLoading] = useState(true);\n const [, setTick] = useState(0);\n useEffect(() => { const t = setInterval(() => setTick(n => n + 1), 60000); return () => clearInterval(t); }, []);\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [configCity, setConfigCity] = useState(city);\n const [configAppearance, setConfigAppearance] = useState<WidgetAppearance>(appearance);\n\n const { prefs: shellPrefs, save: saveShellPrefs } = useShellPrefs();\n const prefs: WeatherPrefs = { ...DEFAULT_PREFS, ...(shellPrefs.weather_prefs as WeatherPrefs | undefined ?? {}) };\n const [configPrefs, setConfigPrefs] = useState<WeatherPrefs>(prefs);\n\n useWidgetSettings(useCallback(() => {\n setConfigCity(city);\n setConfigAppearance({ ...appearance });\n setConfigPrefs({ ...prefs });\n setSettingsOpen(true);\n }, [city, appearance, prefs]));\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n fetchCityWeather(city).then(w => {\n if (cancelled) return;\n setData(w);\n setLoading(false);\n });\n return () => { cancelled = true; };\n }, [city]);\n\n const saveSettings = () => {\n setCity(configCity);\n setAppearance(configAppearance);\n saveShellPrefs({ weather_prefs: configPrefs });\n localStorage.setItem(STORAGE_KEY, configCity);\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(configAppearance));\n setSettingsOpen(false);\n };\n\n const t = (c: number) => prefs.useFahrenheit ? `${toF(c)}°F` : `${c}°`;\n\n // Half-height — tile is now ~110 px tall. Effect keyframes are tuned for\n // this so drops/flakes traverse the full height before recycling.\n const TILE_HEIGHT = 110;\n\n if (loading && !data) {\n return <div className=\"flex items-center justify-center h-full bg-gradient-to-b from-sky-400 to-blue-500 rounded-lg text-white/80 text-xs\" style={{ minHeight: TILE_HEIGHT }}>Loading…</div>;\n }\n if (!data) {\n return <div className=\"flex items-center justify-center h-full bg-slate-700 rounded-lg text-white/80 text-xs\" style={{ minHeight: TILE_HEIGHT }}>Couldn't load weather</div>;\n }\n\n const [condition, emoji, gradient] = getCondition(data.code, data.isDay);\n\n return (\n <>\n <style>{WX_KEYFRAMES}</style>\n <div className=\"rounded-lg overflow-hidden\"\n style={{\n backgroundColor: `rgba(15, 23, 42, ${appearance.activeOpacity / 100})`,\n backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : undefined,\n }}>\n <div className={`relative rounded-lg overflow-hidden text-white bg-gradient-to-br ${gradient}`} style={{ height: TILE_HEIGHT }}>\n {/* Animated effects */}\n <WeatherEffect code={data.code} isDay={data.isDay} />\n\n {/* Compact two-row content */}\n <div className=\"relative z-10 px-3 py-2.5 flex flex-col h-full justify-between\">\n {/* Top: city + time | temp */}\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-base font-semibold leading-tight truncate drop-shadow-sm\">{data.city}</div>\n {prefs.showLocalTime && (\n <div className=\"text-[10px] opacity-90 leading-tight tabular-nums drop-shadow-sm\">\n {getTimeInTz(data.timezone, prefs.use24Hour)}\n </div>\n )}\n </div>\n <div className=\"text-3xl font-extralight leading-none tracking-tight tabular-nums shrink-0 drop-shadow-sm\">\n {t(data.temp)}\n </div>\n </div>\n\n {/* Bottom: condition | H/L */}\n <div className=\"flex items-end justify-between gap-2\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <span className=\"text-lg leading-none drop-shadow-sm\">{emoji}</span>\n <span className=\"text-[11px] font-medium drop-shadow-sm truncate\">{condition}</span>\n </div>\n <span className=\"text-[10px] opacity-90 tabular-nums drop-shadow-sm shrink-0\">H:{t(data.high)} L:{t(data.low)}</span>\n </div>\n </div>\n </div>\n </div>\n\n <WidgetSettingsModal open={settingsOpen} onClose={() => setSettingsOpen(false)} title=\"Weather Settings\"\n appearance={configAppearance} onAppearanceChange={setConfigAppearance} onSave={saveSettings}>\n <div className=\"space-y-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">Display</h3>\n <div className=\"flex items-center gap-3 mb-2\">\n <span className=\"text-sm text-gray-600 w-24\">Temperature</span>\n <div className=\"flex gap-1\">\n {([{ key: false, label: '°C' }, { key: true, label: '°F' }] as const).map(o => (\n <button key={String(o.key)} onClick={() => setConfigPrefs(p => ({ ...p, useFahrenheit: o.key }))}\n className={`px-3 py-1 text-xs font-medium rounded-lg border transition-colors ${configPrefs.useFahrenheit === o.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'}`}>\n {o.label}\n </button>\n ))}\n </div>\n </div>\n <div className=\"flex items-center gap-3 mb-2\">\n <span className=\"text-sm text-gray-600 w-24\">Time Format</span>\n <div className=\"flex gap-1\">\n {([{ key: false, label: 'AM/PM' }, { key: true, label: '24H' }] as const).map(o => (\n <button key={String(o.key)} onClick={() => setConfigPrefs(p => ({ ...p, use24Hour: o.key }))}\n className={`px-3 py-1 text-xs font-medium rounded-lg border transition-colors ${configPrefs.use24Hour === o.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'}`}>\n {o.label}\n </button>\n ))}\n </div>\n </div>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input type=\"checkbox\" checked={configPrefs.showLocalTime} onChange={e => setConfigPrefs(p => ({ ...p, showLocalTime: e.target.checked }))}\n className=\"rounded border-gray-300 text-blue-600 h-3.5 w-3.5\" />\n <span className=\"text-sm text-gray-600\">Show local time</span>\n </label>\n </div>\n </div>\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">City</h3>\n <select value={configCity} onChange={e => setConfigCity(e.target.value)}\n className=\"w-full bg-gray-50 border border-gray-200 rounded px-2 py-1.5 text-sm focus:outline-none focus:ring-1 focus:ring-blue-500\">\n {Object.keys(AVAILABLE_CITIES).map(name => (\n <option key={name} value={name}>{name}</option>\n ))}\n </select>\n <p className=\"mt-1 text-[10px] text-gray-400\">Auto-detected from your timezone; change if needed.</p>\n </div>\n </WidgetSettingsModal>\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/apps/Weather.tsx"],"names":["parts","h","m","t"],"mappings":"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","file":"Weather-XMFVT6EO.js","sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport { useWidgetSettings } from '../shell/Modal';\nimport WidgetSettingsModal, { loadAppearance, type WidgetAppearance } from '../shell/WidgetSettingsModal';\nimport { useShellPrefs } from '../shell/ShellPrefs';\nimport { AVAILABLE_CITIES, fetchCityWeather, getCondition, toFahrenheit, type CityWeather } from './_weatherData';\n\nconst STORAGE_KEY = 'weather_city';\nconst LEGACY_KEY = 'weather_cities';\nconst SETTINGS_KEY = 'weather_appearance';\n\ninterface WeatherPrefs { useFahrenheit: boolean; showLocalTime: boolean; use24Hour: boolean }\nconst DEFAULT_PREFS: WeatherPrefs = { useFahrenheit: false, showLocalTime: true, use24Hour: false };\n\nfunction detectLocalCity(): string {\n try {\n const userTz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n for (const [name, info] of Object.entries(AVAILABLE_CITIES)) {\n if (info.tz === userTz) return name;\n }\n } catch {}\n return 'London';\n}\n\nfunction loadCity(): string {\n const v = typeof localStorage !== 'undefined' ? localStorage.getItem(STORAGE_KEY) : null;\n if (v && AVAILABLE_CITIES[v]) return v;\n try {\n const arr = JSON.parse(localStorage.getItem(LEGACY_KEY) || '');\n if (Array.isArray(arr) && arr[0] && AVAILABLE_CITIES[arr[0]]) {\n localStorage.setItem(STORAGE_KEY, arr[0]);\n return arr[0];\n }\n } catch {}\n return detectLocalCity();\n}\n\nconst toF = toFahrenheit;\n\nfunction getTimeInTz(timezone: string, use24Hour = false): string {\n try {\n if (use24Hour) {\n const parts = new Intl.DateTimeFormat('en-US', { timeZone: timezone, hour: 'numeric', minute: '2-digit', hour12: false }).formatToParts(new Date());\n const h = parseInt(parts.find(p => p.type === 'hour')?.value || '0');\n const m = parseInt(parts.find(p => p.type === 'minute')?.value || '0');\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`;\n }\n const parts = new Intl.DateTimeFormat('en-US', { timeZone: timezone, hour: 'numeric', minute: '2-digit', hour12: true }).formatToParts(new Date());\n const h = parseInt(parts.find(p => p.type === 'hour')?.value || '12');\n const m = parseInt(parts.find(p => p.type === 'minute')?.value || '0');\n const period = parts.find(p => p.type === 'dayPeriod')?.value || '';\n return `${h}:${String(m).padStart(2, '0')} ${period}`;\n } catch { return ''; }\n}\n\n/**\n * Effect keyframes — tuned for a ~110 px-tall card so drops/flakes fall\n * across the full height before recycling. Multiple snow/rain variants\n * give the impression of independent particles instead of a hypnotic\n * lock-step pattern.\n */\nconst WX_KEYFRAMES = `\n@keyframes wx-rain-a { 0% { transform: translate(0,-20px); opacity: 0; } 10% { opacity: 0.95; } 100% { transform: translate(8px,140px); opacity: 0; } }\n@keyframes wx-rain-b { 0% { transform: translate(0,-20px); opacity: 0; } 12% { opacity: 0.85; } 100% { transform: translate(12px,140px); opacity: 0; } }\n@keyframes wx-rain-c { 0% { transform: translate(0,-20px); opacity: 0; } 10% { opacity: 1; } 100% { transform: translate(5px,140px); opacity: 0; } }\n@keyframes wx-snow-a { 0% { transform: translate(0,-12px) rotate(0deg); opacity: 0; } 10% { opacity: 0.9; } 50% { transform: translate(10px,55px) rotate(180deg); } 100% { transform: translate(-4px,140px) rotate(360deg); opacity: 0; } }\n@keyframes wx-snow-b { 0% { transform: translate(0,-12px) rotate(0deg); opacity: 0; } 10% { opacity: 0.85; } 50% { transform: translate(-12px,55px) rotate(-180deg); } 100% { transform: translate(6px,140px) rotate(-360deg); opacity: 0; } }\n@keyframes wx-snow-c { 0% { transform: translate(0,-12px); opacity: 0; } 10% { opacity: 0.7; } 100% { transform: translate(2px,140px); opacity: 0; } }\n@keyframes wx-drift-cloud { 0% { transform: translateX(-40%); } 100% { transform: translateX(140%); } }\n@keyframes wx-twinkle { 0%, 100% { opacity: 0.25; transform: scale(1); } 50% { opacity: 1; transform: scale(1.6); } }\n@keyframes wx-flash { 0%, 86%, 100% { opacity: 0; } 87% { opacity: 0.95; } 88% { opacity: 0.15; } 89% { opacity: 0.85; } 90% { opacity: 0; } }\n@keyframes wx-bolt { 0%, 86%, 90%, 100% { opacity: 0; } 87% { opacity: 1; } 89% { opacity: 0.85; } }\n@keyframes wx-sun-pulse { 0%, 100% { transform: scale(1); opacity: 0.65; } 50% { transform: scale(1.12); opacity: 0.95; } }\n@keyframes wx-sun-rays { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n@keyframes wx-fog-drift { 0% { transform: translateX(-25%); opacity: 0.3; } 50% { opacity: 0.65; } 100% { transform: translateX(25%); opacity: 0.3; } }\n@keyframes wx-shooting-star { 0%, 95% { opacity: 0; transform: translate(0,0) scale(0); } 96% { opacity: 1; transform: translate(0,0) scale(1); } 100% { opacity: 0; transform: translate(40px,30px) scale(1); } }\n`;\n\nfunction SunEffect() {\n // Defined yellow-orange disc with halo + slowly-rotating ray sprite.\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <div className=\"absolute -top-5 -right-5 w-24 h-24\" style={{ animation: 'wx-sun-rays 70s linear infinite' }}>\n <svg viewBox=\"0 0 100 100\" className=\"w-full h-full\">\n {Array.from({ length: 12 }).map((_, i) => (\n <rect key={i} x={49} y={3} width={2} height={14} rx={1}\n fill=\"rgba(255, 232, 130, 0.55)\"\n transform={`rotate(${i * 30} 50 50)`} />\n ))}\n </svg>\n </div>\n <div className=\"absolute top-1 right-1 w-10 h-10 rounded-full\"\n style={{\n background: 'radial-gradient(circle at 35% 35%, #fff8cc 0%, #ffd84a 55%, #ff9e2a 100%)',\n boxShadow: '0 0 18px 5px rgba(255, 200, 80, 0.55)',\n animation: 'wx-sun-pulse 4.5s ease-in-out infinite',\n }} />\n </div>\n );\n}\n\nfunction NightStarsEffect() {\n // Crescent moon (outer warm circle + offset dark circle to carve out the\n // bite) and a sparse scatter of stars twinkling at independent rates.\n // One slow-cycle shooting star adds a moment of motion without\n // distracting.\n const stars = Array.from({ length: 16 }).map((_, i) => ({\n left: `${(i * 53 + 11) % 95}%`,\n top: `${(i * 37 + 9) % 78}%`,\n size: 1 + ((i * 13) % 3),\n delay: `${(i * 0.41) % 4}s`,\n duration: `${2.5 + ((i * 7) % 5) * 0.6}s`,\n }));\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {/* Crescent moon */}\n <div className=\"absolute top-1 right-1\">\n <svg viewBox=\"0 0 40 40\" className=\"w-9 h-9\" style={{ filter: 'drop-shadow(0 0 6px rgba(255,250,220,0.4))' }}>\n <defs>\n <radialGradient id=\"wx-moon-grad\" cx=\"35%\" cy=\"35%\">\n <stop offset=\"0\" stopColor=\"#fffae0\" />\n <stop offset=\"1\" stopColor=\"#d4c98a\" />\n </radialGradient>\n </defs>\n <circle cx={20} cy={20} r={13} fill=\"url(#wx-moon-grad)\" />\n <circle cx={26} cy={16} r={11} fill=\"rgba(15,23,42,1)\" />\n </svg>\n </div>\n {stars.map((s, i) => (\n <div key={i} className=\"absolute rounded-full bg-white\"\n style={{\n left: s.left, top: s.top, width: s.size, height: s.size,\n animation: `wx-twinkle ${s.duration} ease-in-out ${s.delay} infinite`,\n }} />\n ))}\n {/* Shooting star — appears once every ~12s */}\n <div className=\"absolute\" style={{ left: '15%', top: '20%', animation: 'wx-shooting-star 12s ease-out infinite' }}>\n <div className=\"w-12 h-px\"\n style={{ background: 'linear-gradient(to right, transparent, rgba(255,255,255,0.95))', boxShadow: '0 0 4px rgba(255,255,255,0.8)' }} />\n </div>\n </div>\n );\n}\n\nfunction CloudsEffect({ tone = 'light' as 'light' | 'dark' }) {\n const fill = tone === 'light' ? 'rgba(255,255,255,0.78)' : 'rgba(220,228,240,0.45)';\n const Cloud = ({ scale = 1 }) => (\n <svg viewBox=\"0 0 120 50\" className=\"w-32 h-12\" style={{ transform: `scale(${scale})`, filter: 'blur(0.6px)' }}>\n <ellipse cx={28} cy={36} rx={18} ry={11} fill={fill} />\n <ellipse cx={50} cy={28} rx={22} ry={15} fill={fill} />\n <ellipse cx={75} cy={32} rx={20} ry={12} fill={fill} />\n <ellipse cx={95} cy={38} rx={15} ry={9} fill={fill} />\n </svg>\n );\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <div className=\"absolute\" style={{ top: '8%', animation: 'wx-drift-cloud 42s linear infinite' }}><Cloud scale={0.9} /></div>\n <div className=\"absolute\" style={{ top: '40%', animation: 'wx-drift-cloud 60s linear -22s infinite', opacity: 0.85 }}><Cloud scale={1.25} /></div>\n <div className=\"absolute\" style={{ top: '68%', animation: 'wx-drift-cloud 78s linear -45s infinite', opacity: 0.7 }}><Cloud scale={0.75} /></div>\n </div>\n );\n}\n\nfunction RainEffect({ heavy = false }: { heavy?: boolean }) {\n const count = heavy ? 26 : 16;\n const variants = ['wx-rain-a', 'wx-rain-b', 'wx-rain-c'];\n const drops = Array.from({ length: count }).map((_, i) => ({\n left: `${(i * 100 / count + (i * 11) % 7) % 100}%`,\n delay: `${(i * 0.087) % 1.3}s`,\n height: `${12 + (i % 4) * 5}px`,\n duration: `${0.7 + (i % 3) * 0.18}s`,\n variant: variants[i % variants.length],\n }));\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {drops.map((d, i) => (\n <div key={i} className=\"absolute\"\n style={{\n left: d.left, top: '-20px',\n width: '1px', height: d.height,\n background: 'linear-gradient(180deg, rgba(180,210,255,0) 0%, rgba(220,235,255,0.85) 90%, rgba(255,255,255,0.95) 100%)',\n transform: 'rotate(8deg)',\n animation: `${d.variant} ${d.duration} linear ${d.delay} infinite`,\n transformOrigin: 'top',\n }} />\n ))}\n </div>\n );\n}\n\nfunction SnowEffect() {\n const variants = ['wx-snow-a', 'wx-snow-b', 'wx-snow-c'];\n const flakes = Array.from({ length: 16 }).map((_, i) => ({\n left: `${(i * 100 / 16 + (i * 13) % 5) % 100}%`,\n delay: `${(i * 0.43) % 5}s`,\n duration: `${4.5 + (i % 5)}s`,\n size: 3 + (i % 4) * 1.4,\n opacity: 0.65 + ((i * 7) % 4) * 0.08,\n variant: variants[i % variants.length],\n }));\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {flakes.map((f, i) => (\n <div key={i} className=\"absolute rounded-full bg-white\"\n style={{\n left: f.left, top: '-12px',\n width: f.size, height: f.size,\n opacity: f.opacity,\n boxShadow: '0 0 4px rgba(255,255,255,0.65)',\n animation: `${f.variant} ${f.duration} linear ${f.delay} infinite`,\n }} />\n ))}\n </div>\n );\n}\n\nfunction ThunderEffect() {\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <RainEffect heavy />\n {/* Sharp double-flash overlay */}\n <div className=\"absolute inset-0 bg-white\" style={{ animation: 'wx-flash 6s ease-out infinite' }} />\n {/* Lightning bolt — visible only during the flash peaks */}\n <div className=\"absolute inset-y-0 right-1/3 flex items-center justify-center pointer-events-none\"\n style={{ animation: 'wx-bolt 6s ease-out infinite' }}>\n <svg viewBox=\"0 0 18 60\" className=\"h-4/5\"\n style={{ filter: 'drop-shadow(0 0 6px rgba(255, 240, 150, 0.95)) drop-shadow(0 0 14px rgba(255, 220, 90, 0.7))' }}>\n <path d=\"M11 0 L2 28 L8 30 L4 60 L16 24 L9 22 Z\"\n fill=\"rgba(255, 250, 200, 0.98)\"\n stroke=\"rgba(255, 255, 255, 0.9)\" strokeWidth={0.3} />\n </svg>\n </div>\n </div>\n );\n}\n\nfunction FogEffect() {\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"absolute left-0 right-0\"\n style={{\n top: `${10 + i * 22}%`,\n height: '14px',\n background: 'linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.55) 50%, rgba(255,255,255,0) 100%)',\n filter: 'blur(2px)',\n animation: `wx-fog-drift ${10 + i * 3}s ease-in-out ${i * 0.7}s infinite alternate`,\n }} />\n ))}\n </div>\n );\n}\n\nfunction WeatherEffect({ code, isDay }: { code: number; isDay: boolean }) {\n if (code === 0 || code === 1) return isDay ? <SunEffect /> : <NightStarsEffect />;\n if (code === 2) return (\n <>\n {isDay ? <SunEffect /> : <NightStarsEffect />}\n <CloudsEffect tone={isDay ? 'light' : 'dark'} />\n </>\n );\n if (code === 3) return <CloudsEffect tone={isDay ? 'light' : 'dark'} />;\n if (code === 45 || code === 48) return <FogEffect />;\n if ([51, 53, 61, 80, 81].includes(code)) return <RainEffect />;\n if ([55, 63, 65, 82].includes(code)) return <RainEffect heavy />;\n if ([71, 73, 75].includes(code)) return <SnowEffect />;\n if ([95, 96, 99].includes(code)) return <ThunderEffect />;\n return null;\n}\n\nexport default function Weather() {\n const [city, setCity] = useState(loadCity);\n const [appearance, setAppearance] = useState(() => loadAppearance(SETTINGS_KEY));\n const [data, setData] = useState<CityWeather | null>(null);\n const [loading, setLoading] = useState(true);\n const [, setTick] = useState(0);\n useEffect(() => { const t = setInterval(() => setTick(n => n + 1), 60000); return () => clearInterval(t); }, []);\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [configCity, setConfigCity] = useState(city);\n const [configAppearance, setConfigAppearance] = useState<WidgetAppearance>(appearance);\n\n const { prefs: shellPrefs, save: saveShellPrefs } = useShellPrefs();\n const prefs: WeatherPrefs = { ...DEFAULT_PREFS, ...(shellPrefs.weather_prefs as WeatherPrefs | undefined ?? {}) };\n const [configPrefs, setConfigPrefs] = useState<WeatherPrefs>(prefs);\n\n useWidgetSettings(useCallback(() => {\n setConfigCity(city);\n setConfigAppearance({ ...appearance });\n setConfigPrefs({ ...prefs });\n setSettingsOpen(true);\n }, [city, appearance, prefs]));\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n fetchCityWeather(city).then(w => {\n if (cancelled) return;\n setData(w);\n setLoading(false);\n });\n return () => { cancelled = true; };\n }, [city]);\n\n const saveSettings = () => {\n setCity(configCity);\n setAppearance(configAppearance);\n saveShellPrefs({ weather_prefs: configPrefs });\n localStorage.setItem(STORAGE_KEY, configCity);\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(configAppearance));\n setSettingsOpen(false);\n };\n\n const t = (c: number) => prefs.useFahrenheit ? `${toF(c)}°F` : `${c}°`;\n\n // Half-height — tile is now ~110 px tall. Effect keyframes are tuned for\n // this so drops/flakes traverse the full height before recycling.\n const TILE_HEIGHT = 110;\n\n if (loading && !data) {\n return <div className=\"flex items-center justify-center h-full bg-gradient-to-b from-sky-400 to-blue-500 rounded-lg text-white/80 text-xs\" style={{ minHeight: TILE_HEIGHT }}>Loading…</div>;\n }\n if (!data) {\n return <div className=\"flex items-center justify-center h-full bg-slate-700 rounded-lg text-white/80 text-xs\" style={{ minHeight: TILE_HEIGHT }}>Couldn't load weather</div>;\n }\n\n const [condition, emoji, gradient] = getCondition(data.code, data.isDay);\n\n return (\n <>\n <style>{WX_KEYFRAMES}</style>\n <div className=\"rounded-lg overflow-hidden\"\n style={{\n backgroundColor: `rgba(15, 23, 42, ${appearance.activeOpacity / 100})`,\n backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : undefined,\n }}>\n <div className={`relative rounded-lg overflow-hidden text-white bg-gradient-to-br ${gradient}`} style={{ height: TILE_HEIGHT }}>\n {/* Animated effects */}\n <WeatherEffect code={data.code} isDay={data.isDay} />\n\n {/* Compact two-row content */}\n <div className=\"relative z-10 px-3 py-2.5 flex flex-col h-full justify-between\">\n {/* Top: city + time | temp */}\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-base font-semibold leading-tight truncate drop-shadow-sm\">{data.city}</div>\n {prefs.showLocalTime && (\n <div className=\"text-[10px] opacity-90 leading-tight tabular-nums drop-shadow-sm\">\n {getTimeInTz(data.timezone, prefs.use24Hour)}\n </div>\n )}\n </div>\n <div className=\"text-3xl font-extralight leading-none tracking-tight tabular-nums shrink-0 drop-shadow-sm\">\n {t(data.temp)}\n </div>\n </div>\n\n {/* Bottom: condition | H/L */}\n <div className=\"flex items-end justify-between gap-2\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <span className=\"text-lg leading-none drop-shadow-sm\">{emoji}</span>\n <span className=\"text-[11px] font-medium drop-shadow-sm truncate\">{condition}</span>\n </div>\n <span className=\"text-[10px] opacity-90 tabular-nums drop-shadow-sm shrink-0\">H:{t(data.high)} L:{t(data.low)}</span>\n </div>\n </div>\n </div>\n </div>\n\n <WidgetSettingsModal open={settingsOpen} onClose={() => setSettingsOpen(false)} title=\"Weather Settings\"\n appearance={configAppearance} onAppearanceChange={setConfigAppearance} onSave={saveSettings}>\n <div className=\"space-y-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">Display</h3>\n <div className=\"flex items-center gap-3 mb-2\">\n <span className=\"text-sm text-gray-600 w-24\">Temperature</span>\n <div className=\"flex gap-1\">\n {([{ key: false, label: '°C' }, { key: true, label: '°F' }] as const).map(o => (\n <button key={String(o.key)} onClick={() => setConfigPrefs(p => ({ ...p, useFahrenheit: o.key }))}\n className={`px-3 py-1 text-xs font-medium rounded-lg border transition-colors ${configPrefs.useFahrenheit === o.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'}`}>\n {o.label}\n </button>\n ))}\n </div>\n </div>\n <div className=\"flex items-center gap-3 mb-2\">\n <span className=\"text-sm text-gray-600 w-24\">Time Format</span>\n <div className=\"flex gap-1\">\n {([{ key: false, label: 'AM/PM' }, { key: true, label: '24H' }] as const).map(o => (\n <button key={String(o.key)} onClick={() => setConfigPrefs(p => ({ ...p, use24Hour: o.key }))}\n className={`px-3 py-1 text-xs font-medium rounded-lg border transition-colors ${configPrefs.use24Hour === o.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'}`}>\n {o.label}\n </button>\n ))}\n </div>\n </div>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input type=\"checkbox\" checked={configPrefs.showLocalTime} onChange={e => setConfigPrefs(p => ({ ...p, showLocalTime: e.target.checked }))}\n className=\"rounded border-gray-300 text-blue-600 h-3.5 w-3.5\" />\n <span className=\"text-sm text-gray-600\">Show local time</span>\n </label>\n </div>\n </div>\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">City</h3>\n <select value={configCity} onChange={e => setConfigCity(e.target.value)}\n className=\"w-full bg-gray-50 border border-gray-200 rounded px-2 py-1.5 text-sm focus:outline-none focus:ring-1 focus:ring-blue-500\">\n {Object.keys(AVAILABLE_CITIES).map(name => (\n <option key={name} value={name}>{name}</option>\n ))}\n </select>\n <p className=\"mt-1 text-[10px] text-gray-400\">Auto-detected from your timezone; change if needed.</p>\n </div>\n </WidgetSettingsModal>\n </>\n );\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AVAILABLE_CITIES, fetchCityWeather, getCondition, toFahrenheit } from './chunk-7CCHEEYC.js';
|
|
2
2
|
import { useShellPrefs } from './chunk-36VM54SC.js';
|
|
3
|
-
import { loadAppearance, WidgetSettingsModal } from './chunk-
|
|
4
|
-
import { useWidgetSettings } from './chunk-
|
|
3
|
+
import { loadAppearance, WidgetSettingsModal } from './chunk-372FJEYH.js';
|
|
4
|
+
import { useWidgetSettings } from './chunk-LWXHFZE4.js';
|
|
5
5
|
import './chunk-PLGHQ7QW.js';
|
|
6
6
|
import { useState, useEffect, useCallback } from 'react';
|
|
7
7
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
@@ -192,5 +192,5 @@ function WorldClock() {
|
|
|
192
192
|
}
|
|
193
193
|
|
|
194
194
|
export { WorldClock as default };
|
|
195
|
-
//# sourceMappingURL=WorldClock-
|
|
196
|
-
//# sourceMappingURL=WorldClock-
|
|
195
|
+
//# sourceMappingURL=WorldClock-2F7CPJZW.js.map
|
|
196
|
+
//# sourceMappingURL=WorldClock-2F7CPJZW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/WorldClock.tsx"],"names":[],"mappings":"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","file":"WorldClock-X3VM3WFT.js","sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport { useWidgetSettings } from '../shell/Modal';\nimport WidgetSettingsModal, { loadAppearance, type WidgetAppearance } from '../shell/WidgetSettingsModal';\nimport { useShellPrefs } from '../shell/ShellPrefs';\nimport { AVAILABLE_CITIES, fetchCityWeather, getCondition, toFahrenheit, type CityWeather } from './_weatherData';\n\nconst SETTINGS_KEY = 'world_clock_appearance';\nconst DEFAULT_CITIES = ['London', 'Shanghai', 'New York'];\n\ninterface WeatherPrefs { useFahrenheit: boolean }\n\n/**\n * Resolve the local time for the supplied IANA timezone into a digital\n * `12:34` + `AM` / `PM` pair. Used by the World Clock rows.\n */\nfunction digitalTime(tz: string, now: Date): { time: string; ampm: string } {\n try {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone: tz, hour: 'numeric', minute: '2-digit', hour12: true,\n }).formatToParts(now);\n const h = parts.find(p => p.type === 'hour')?.value || '12';\n const m = parts.find(p => p.type === 'minute')?.value || '00';\n const ampm = (parts.find(p => p.type === 'dayPeriod')?.value || '').toUpperCase();\n return { time: `${h}:${m}`, ampm };\n } catch { return { time: '', ampm: '' }; }\n}\n\n/**\n * World Clock widget — multi-city list. Each row pairs a tiny analogue\n * clock (minimal-style: ring, four cardinal dots, two hands) with the\n * city's current weather. The weather emoji doubles as a day/night cue\n * (☀ vs 🌙 for clear, the same icons for everything else). Reads the\n * shared Open-Meteo cache so it doesn't re-hit the API when the Weather\n * widget already has the data.\n */\nexport default function WorldClock() {\n const { prefs, save } = useShellPrefs();\n const [appearance, setAppearance] = useState(() => loadAppearance(SETTINGS_KEY));\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [configCities, setConfigCities] = useState<string[]>([]);\n const [configAppearance, setConfigAppearance] = useState<WidgetAppearance>(appearance);\n\n const wxPrefs: WeatherPrefs = {\n useFahrenheit: !!(prefs.weather_prefs as WeatherPrefs | undefined)?.useFahrenheit,\n };\n const [configWxPrefs, setConfigWxPrefs] = useState(wxPrefs);\n\n // Tick once every 30 s so the analogue minute-hands drift smoothly. We\n // don't show seconds so faster polling is wasted re-renders.\n const [now, setNow] = useState(() => new Date());\n useEffect(() => {\n const t = setInterval(() => setNow(new Date()), 30 * 1000);\n return () => clearInterval(t);\n }, []);\n\n // Resolve the saved city list and migrate the legacy IANA-timezone\n // format (`Europe/London`) over to the new city-name format\n // (`London`).\n const tzToCity: Record<string, string> = Object.fromEntries(\n Object.entries(AVAILABLE_CITIES).map(([city, info]) => [info.tz, city])\n );\n const rawClocks = prefs.world_clocks as string[] | undefined;\n const cities: string[] = (() => {\n if (!Array.isArray(rawClocks) || rawClocks.length === 0) return DEFAULT_CITIES;\n const out: string[] = [];\n for (const v of rawClocks) {\n const asCity = AVAILABLE_CITIES[v] ? v : tzToCity[v];\n if (asCity && !out.includes(asCity)) out.push(asCity);\n }\n return out.length ? out : DEFAULT_CITIES;\n })();\n\n const [data, setData] = useState<Record<string, CityWeather>>({});\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n (async () => {\n const next: Record<string, CityWeather> = {};\n await Promise.all(cities.map(async c => {\n const w = await fetchCityWeather(c);\n if (w) next[c] = w;\n }));\n if (!cancelled) { setData(next); setLoading(false); }\n })();\n return () => { cancelled = true; };\n }, [cities.join(',')]);\n\n useWidgetSettings(useCallback(() => {\n setConfigCities([...cities]);\n setConfigAppearance({ ...appearance });\n setConfigWxPrefs({ ...wxPrefs });\n setSettingsOpen(true);\n }, [cities.join(','), appearance, wxPrefs.useFahrenheit]));\n\n const saveSettings = () => {\n if (configCities.length === 0) return;\n save({\n world_clocks: configCities,\n weather_prefs: { ...(prefs.weather_prefs as object | undefined ?? {}), useFahrenheit: configWxPrefs.useFahrenheit },\n });\n setAppearance(configAppearance);\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(configAppearance));\n setSettingsOpen(false);\n };\n\n const formatTemp = (c: number) => wxPrefs.useFahrenheit ? `${toFahrenheit(c)}°` : `${c}°`;\n\n return (\n <>\n {/* Theme-aware panel — same colour as the taskbar so all dashboard\n * widgets read as a coordinated set across light and dark themes.\n * Rows use `divide-y` rather than per-row border classes so the\n * last row never paints a stray separator line at the panel's\n * bottom edge. */}\n <div className=\"h-full\"\n style={{\n backgroundColor: `rgb(var(--taskbar-bg-rgb, 243 244 246) / ${appearance.activeOpacity / 100})`,\n backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : undefined,\n }}>\n <div className=\"divide-y divide-gray-200\">\n {loading && cities.every(c => !data[c]) && (\n <div className=\"px-3 py-6 text-center text-xs text-gray-500\">Loading…</div>\n )}\n {cities.map((cityName) => {\n const w = data[cityName];\n const tz = AVAILABLE_CITIES[cityName]?.tz ?? 'UTC';\n const { time, ampm } = digitalTime(tz, now);\n if (!w) {\n return (\n <div key={cityName} className=\"px-4 py-3\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-[15px] font-semibold tracking-tight text-gray-900 truncate\">{cityName}</span>\n <span className=\"tabular-nums text-[13px] font-medium text-gray-500\">{time}<span className=\"text-[9px] ml-0.5 opacity-70\">{ampm}</span></span>\n </div>\n <div className=\"text-[11px] text-gray-400 mt-1\">Loading weather…</div>\n </div>\n );\n }\n const [condition, emoji] = getCondition(w.code, w.isDay);\n return (\n <div key={cityName} className=\"px-4 py-3\">\n {/* Top — city name on the left, big temperature on the right. */}\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-[15px] font-semibold tracking-tight text-gray-900 truncate\">{cityName}</span>\n <span className=\"text-[26px] font-extralight leading-none tabular-nums tracking-tight text-gray-900 shrink-0\">{formatTemp(w.temp)}</span>\n </div>\n\n {/* Bottom — emoji · digital time · condition on the left;\n H/L on the right. */}\n <div className=\"flex items-center justify-between gap-2 mt-1.5 text-[11px]\">\n <div className=\"flex items-center gap-1.5 min-w-0 text-gray-500\">\n <span className=\"text-base leading-none shrink-0\">{emoji}</span>\n <span className=\"tabular-nums font-semibold text-gray-700 shrink-0\">\n {time}<span className=\"text-[9px] font-medium ml-0.5 opacity-70\">{ampm}</span>\n </span>\n <span className=\"text-gray-300 shrink-0\">·</span>\n <span className=\"truncate\">{condition}</span>\n </div>\n <span className=\"tabular-nums text-gray-500 shrink-0\">H:{formatTemp(w.high)} L:{formatTemp(w.low)}</span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n <WidgetSettingsModal open={settingsOpen} onClose={() => setSettingsOpen(false)} title=\"World Clock Settings\"\n appearance={configAppearance} onAppearanceChange={setConfigAppearance} onSave={saveSettings}>\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">Display</h3>\n <div className=\"flex items-center gap-3 mb-2\">\n <span className=\"text-sm text-gray-600 w-24\">Temperature</span>\n <div className=\"flex gap-1\">\n {([{ key: false, label: '°C' }, { key: true, label: '°F' }] as const).map(o => (\n <button key={String(o.key)} onClick={() => setConfigWxPrefs(p => ({ ...p, useFahrenheit: o.key }))}\n className={`px-3 py-1 text-xs font-medium rounded-lg border transition-colors ${configWxPrefs.useFahrenheit === o.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'}`}>\n {o.label}\n </button>\n ))}\n </div>\n </div>\n <p className=\"text-[10px] text-gray-400 mt-1\">Shared with the Weather widget.</p>\n </div>\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">Cities</h3>\n <div className=\"grid grid-cols-2 gap-1 max-h-56 overflow-y-auto\">\n {Object.keys(AVAILABLE_CITIES).map(name => (\n <label key={name} className=\"flex items-center gap-2 text-sm py-1 cursor-pointer hover:bg-gray-50 rounded px-2\">\n <input type=\"checkbox\" checked={configCities.includes(name)}\n onChange={() => setConfigCities(prev => prev.includes(name) ? prev.filter(c => c !== name) : [...prev, name])}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500 h-3.5 w-3.5\" />\n {name}\n </label>\n ))}\n </div>\n </div>\n </WidgetSettingsModal>\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/apps/WorldClock.tsx"],"names":[],"mappings":";;;;;;;;AAMA,IAAM,YAAA,GAAe,wBAAA;AACrB,IAAM,cAAA,GAAiB,CAAC,QAAA,EAAU,UAAA,EAAY,UAAU,CAAA;AAQxD,SAAS,WAAA,CAAY,IAAY,GAAA,EAA2C;AAC1E,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS;AAAA,MAC7C,QAAA,EAAU,EAAA;AAAA,MAAI,IAAA,EAAM,SAAA;AAAA,MAAW,MAAA,EAAQ,SAAA;AAAA,MAAW,MAAA,EAAQ;AAAA,KAC3D,CAAA,CAAE,aAAA,CAAc,GAAG,CAAA;AACpB,IAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,MAAM,GAAG,KAAA,IAAS,IAAA;AACvD,IAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,QAAQ,GAAG,KAAA,IAAS,IAAA;AACzD,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,WAAW,CAAA,EAAG,KAAA,IAAS,EAAA,EAAI,WAAA,EAAY;AAChF,IAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,IAAA,EAAK;AAAA,EACnC,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,EAAA,EAAG;AAAA,EAAG;AAC3C;AAUe,SAAR,UAAA,GAA8B;AACnC,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,aAAA,EAAc;AACtC,EAAA,MAAM,CAAC,YAAY,aAAa,CAAA,GAAI,SAAS,MAAM,cAAA,CAAe,YAAY,CAAC,CAAA;AAC/E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA,CAAmB,EAAE,CAAA;AAC7D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAA2B,UAAU,CAAA;AAErF,EAAA,MAAM,OAAA,GAAwB;AAAA,IAC5B,aAAA,EAAe,CAAC,CAAE,KAAA,CAAM,aAAA,EAA4C;AAAA,GACtE;AACA,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,OAAO,CAAA;AAI1D,EAAA,MAAM,CAAC,KAAK,MAAM,CAAA,GAAI,SAAS,sBAAM,IAAI,MAAM,CAAA;AAC/C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,CAAA,GAAI,YAAY,MAAM,MAAA,qBAAW,IAAA,EAAM,CAAA,EAAG,EAAA,GAAK,GAAI,CAAA;AACzD,IAAA,OAAO,MAAM,cAAc,CAAC,CAAA;AAAA,EAC9B,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,MAAM,WAAmC,MAAA,CAAO,WAAA;AAAA,IAC9C,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,IAAI,CAAA,KAAM,CAAC,IAAA,CAAK,EAAA,EAAI,IAAI,CAAC;AAAA,GACxE;AACA,EAAA,MAAM,YAAY,KAAA,CAAM,YAAA;AACxB,EAAA,MAAM,UAAoB,MAAM;AAC9B,IAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,SAAS,KAAK,SAAA,CAAU,MAAA,KAAW,GAAG,OAAO,cAAA;AAChE,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,MAAA,MAAM,SAAS,gBAAA,CAAiB,CAAC,CAAA,GAAI,CAAA,GAAI,SAAS,CAAC,CAAA;AACnD,MAAA,IAAI,MAAA,IAAU,CAAC,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,EAAG,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,GAAA,CAAI,SAAS,GAAA,GAAM,cAAA;AAAA,EAC5B,CAAA,GAAG;AAEH,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAA,CAAsC,EAAE,CAAA;AAChE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAE3C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,CAAC,YAAY;AACX,MAAA,MAAM,OAAoC,EAAC;AAC3C,MAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,OAAM,CAAA,KAAK;AACtC,QAAA,MAAM,CAAA,GAAI,MAAM,gBAAA,CAAiB,CAAC,CAAA;AAClC,QAAA,IAAI,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AAAA,MACnB,CAAC,CAAC,CAAA;AACF,MAAA,IAAI,CAAC,SAAA,EAAW;AAAE,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAG,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAAG;AAAA,IACtD,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,GAAG,CAAC,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA;AAErB,EAAA,iBAAA,CAAkB,YAAY,MAAM;AAClC,IAAA,eAAA,CAAgB,CAAC,GAAG,MAAM,CAAC,CAAA;AAC3B,IAAA,mBAAA,CAAoB,EAAE,GAAG,UAAA,EAAY,CAAA;AACrC,IAAA,gBAAA,CAAiB,EAAE,GAAG,OAAA,EAAS,CAAA;AAC/B,IAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,UAAA,EAAY,OAAA,CAAQ,aAAa,CAAC,CAAC,CAAA;AAEzD,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC/B,IAAA,IAAA,CAAK;AAAA,MACH,YAAA,EAAc,YAAA;AAAA,MACd,aAAA,EAAe,EAAE,GAAI,KAAA,CAAM,iBAAuC,EAAC,EAAI,aAAA,EAAe,aAAA,CAAc,aAAA;AAAc,KACnH,CAAA;AACD,IAAA,aAAA,CAAc,gBAAgB,CAAA;AAC9B,IAAA,YAAA,CAAa,OAAA,CAAQ,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,gBAAgB,CAAC,CAAA;AACnE,IAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAc,OAAA,CAAQ,aAAA,GAAgB,CAAA,EAAG,YAAA,CAAa,CAAC,CAAC,CAAA,IAAA,CAAA,GAAM,CAAA,EAAG,CAAC,CAAA,IAAA,CAAA;AAEtF,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EAME,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAAI,SAAA,EAAU,QAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL,eAAA,EAAiB,CAAA,yCAAA,EAA4C,UAAA,CAAW,aAAA,GAAgB,GAAG,CAAA,CAAA,CAAA;AAAA,UAC3F,gBAAgB,UAAA,CAAW,UAAA,GAAa,IAAI,CAAA,KAAA,EAAQ,UAAA,CAAW,UAAU,CAAA,GAAA,CAAA,GAAQ;AAAA,SACnF;AAAA,QACA,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACZ,QAAA,EAAA;AAAA,UAAA,OAAA,IAAW,MAAA,CAAO,KAAA,CAAM,CAAA,CAAA,KAAK,CAAC,IAAA,CAAK,CAAC,CAAC,CAAA,oBACpC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EAA8C,QAAA,EAAA,eAAA,EAAQ,CAAA;AAAA,UAEtE,MAAA,CAAO,GAAA,CAAI,CAAC,QAAA,KAAa;AACxB,YAAA,MAAM,CAAA,GAAI,KAAK,QAAQ,CAAA;AACvB,YAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,QAAQ,CAAA,EAAG,EAAA,IAAM,KAAA;AAC7C,YAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,WAAA,CAAY,IAAI,GAAG,CAAA;AAC1C,YAAA,IAAI,CAAC,CAAA,EAAG;AACN,cAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAmB,SAAA,EAAU,WAAA,EAC5B,QAAA,EAAA;AAAA,gCAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2CAAA,EACb,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iEAAA,EAAmE,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,kCAC5F,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oDAAA,EAAsD,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,oCAAK,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,IAAA,EAAK;AAAA,mBAAA,EAAO;AAAA,iBAAA,EACzI,CAAA;AAAA,gCACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAiC,QAAA,EAAA,uBAAA,EAAgB;AAAA,eAAA,EAAA,EALxD,QAMV,CAAA;AAAA,YAEJ;AACA,YAAA,MAAM,CAAC,WAAW,KAAK,CAAA,GAAI,aAAa,CAAA,CAAE,IAAA,EAAM,EAAE,KAAK,CAAA;AACvD,YAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAmB,SAAA,EAAU,WAAA,EAE5B,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2CAAA,EACb,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iEAAA,EAAmE,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,oCAC3F,MAAA,EAAA,EAAK,SAAA,EAAU,+FAA+F,QAAA,EAAA,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA,EAAE;AAAA,eAAA,EACpI,CAAA;AAAA,8BAIA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EACb,QAAA,EAAA;AAAA,gCAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iDAAA,EACb,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAA,EAAmC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,kCACzD,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,oCAAK,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAA,IAAA,EAAK;AAAA,mBAAA,EACzE,CAAA;AAAA,kCACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,kCAC1C,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,SAAA,EAAU;AAAA,iBAAA,EACxC,CAAA;AAAA,gCACA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA;AAAA,kBAAA,IAAA;AAAA,kBAAG,UAAA,CAAW,EAAE,IAAI,CAAA;AAAA,kBAAE,KAAA;AAAA,kBAAI,UAAA,CAAW,EAAE,GAAG;AAAA,iBAAA,EAAE;AAAA,eAAA,EACpG;AAAA,aAAA,EAAA,EAnBQ,QAoBV,CAAA;AAAA,UAEJ,CAAC;AAAA,SAAA,EACH;AAAA;AAAA,KACF;AAAA,oBAEA,IAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QAAoB,IAAA,EAAM,YAAA;AAAA,QAAc,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,QAAG,KAAA,EAAM,sBAAA;AAAA,QACpF,UAAA,EAAY,gBAAA;AAAA,QAAkB,kBAAA,EAAoB,mBAAA;AAAA,QAAqB,MAAA,EAAQ,YAAA;AAAA,QAC/E,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0CAAA,EAA2C,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BAChE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,kCACvD,KAAA,EAAA,EAAI,SAAA,EAAU,cACX,QAAA,EAAA,CAAC,EAAE,KAAK,KAAA,EAAO,KAAA,EAAO,SAAK,EAAG,EAAE,KAAK,IAAA,EAAM,KAAA,EAAO,SAAM,CAAA,CAAY,IAAI,CAAA,CAAA,qBACxE,GAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBAA2B,OAAA,EAAS,MAAM,gBAAA,CAAiB,CAAA,CAAA,MAAM,EAAE,GAAG,CAAA,EAAG,aAAA,EAAe,CAAA,CAAE,GAAA,EAAI,CAAE,CAAA;AAAA,kBAC/F,WAAW,CAAA,kEAAA,EAAqE,aAAA,CAAc,kBAAkB,CAAA,CAAE,GAAA,GAAM,2CAA2C,yDAAyD,CAAA,CAAA;AAAA,kBAC3N,QAAA,EAAA,CAAA,CAAE;AAAA,iBAAA;AAAA,gBAFQ,MAAA,CAAO,EAAE,GAAG;AAAA,eAI1B,CAAA,EACH;AAAA,aAAA,EACF,CAAA;AAAA,4BACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gCAAA,EAAiC,QAAA,EAAA,iCAAA,EAA+B;AAAA,WAAA,EAC/E,CAAA;AAAA,+BACC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0CAAA,EAA2C,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BAC/D,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACZ,QAAA,EAAA,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,CAAE,GAAA,CAAI,CAAA,IAAA,qBACjC,IAAA,CAAC,OAAA,EAAA,EAAiB,WAAU,mFAAA,EAC1B,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBAAM,IAAA,EAAK,UAAA;AAAA,kBAAW,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,IAAI,CAAA;AAAA,kBACxD,UAAU,MAAM,eAAA,CAAgB,UAAQ,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,IAAI,CAAA,GAAI,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,kBAC5G,SAAA,EAAU;AAAA;AAAA,eAAwE;AAAA,cACnF;AAAA,aAAA,EAAA,EAJS,IAKZ,CACD,CAAA,EACH;AAAA,WAAA,EACF;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ","file":"WorldClock-2F7CPJZW.js","sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport { useWidgetSettings } from '../shell/Modal';\nimport WidgetSettingsModal, { loadAppearance, type WidgetAppearance } from '../shell/WidgetSettingsModal';\nimport { useShellPrefs } from '../shell/ShellPrefs';\nimport { AVAILABLE_CITIES, fetchCityWeather, getCondition, toFahrenheit, type CityWeather } from './_weatherData';\n\nconst SETTINGS_KEY = 'world_clock_appearance';\nconst DEFAULT_CITIES = ['London', 'Shanghai', 'New York'];\n\ninterface WeatherPrefs { useFahrenheit: boolean }\n\n/**\n * Resolve the local time for the supplied IANA timezone into a digital\n * `12:34` + `AM` / `PM` pair. Used by the World Clock rows.\n */\nfunction digitalTime(tz: string, now: Date): { time: string; ampm: string } {\n try {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone: tz, hour: 'numeric', minute: '2-digit', hour12: true,\n }).formatToParts(now);\n const h = parts.find(p => p.type === 'hour')?.value || '12';\n const m = parts.find(p => p.type === 'minute')?.value || '00';\n const ampm = (parts.find(p => p.type === 'dayPeriod')?.value || '').toUpperCase();\n return { time: `${h}:${m}`, ampm };\n } catch { return { time: '', ampm: '' }; }\n}\n\n/**\n * World Clock widget — multi-city list. Each row pairs a tiny analogue\n * clock (minimal-style: ring, four cardinal dots, two hands) with the\n * city's current weather. The weather emoji doubles as a day/night cue\n * (☀ vs 🌙 for clear, the same icons for everything else). Reads the\n * shared Open-Meteo cache so it doesn't re-hit the API when the Weather\n * widget already has the data.\n */\nexport default function WorldClock() {\n const { prefs, save } = useShellPrefs();\n const [appearance, setAppearance] = useState(() => loadAppearance(SETTINGS_KEY));\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [configCities, setConfigCities] = useState<string[]>([]);\n const [configAppearance, setConfigAppearance] = useState<WidgetAppearance>(appearance);\n\n const wxPrefs: WeatherPrefs = {\n useFahrenheit: !!(prefs.weather_prefs as WeatherPrefs | undefined)?.useFahrenheit,\n };\n const [configWxPrefs, setConfigWxPrefs] = useState(wxPrefs);\n\n // Tick once every 30 s so the analogue minute-hands drift smoothly. We\n // don't show seconds so faster polling is wasted re-renders.\n const [now, setNow] = useState(() => new Date());\n useEffect(() => {\n const t = setInterval(() => setNow(new Date()), 30 * 1000);\n return () => clearInterval(t);\n }, []);\n\n // Resolve the saved city list and migrate the legacy IANA-timezone\n // format (`Europe/London`) over to the new city-name format\n // (`London`).\n const tzToCity: Record<string, string> = Object.fromEntries(\n Object.entries(AVAILABLE_CITIES).map(([city, info]) => [info.tz, city])\n );\n const rawClocks = prefs.world_clocks as string[] | undefined;\n const cities: string[] = (() => {\n if (!Array.isArray(rawClocks) || rawClocks.length === 0) return DEFAULT_CITIES;\n const out: string[] = [];\n for (const v of rawClocks) {\n const asCity = AVAILABLE_CITIES[v] ? v : tzToCity[v];\n if (asCity && !out.includes(asCity)) out.push(asCity);\n }\n return out.length ? out : DEFAULT_CITIES;\n })();\n\n const [data, setData] = useState<Record<string, CityWeather>>({});\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n (async () => {\n const next: Record<string, CityWeather> = {};\n await Promise.all(cities.map(async c => {\n const w = await fetchCityWeather(c);\n if (w) next[c] = w;\n }));\n if (!cancelled) { setData(next); setLoading(false); }\n })();\n return () => { cancelled = true; };\n }, [cities.join(',')]);\n\n useWidgetSettings(useCallback(() => {\n setConfigCities([...cities]);\n setConfigAppearance({ ...appearance });\n setConfigWxPrefs({ ...wxPrefs });\n setSettingsOpen(true);\n }, [cities.join(','), appearance, wxPrefs.useFahrenheit]));\n\n const saveSettings = () => {\n if (configCities.length === 0) return;\n save({\n world_clocks: configCities,\n weather_prefs: { ...(prefs.weather_prefs as object | undefined ?? {}), useFahrenheit: configWxPrefs.useFahrenheit },\n });\n setAppearance(configAppearance);\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(configAppearance));\n setSettingsOpen(false);\n };\n\n const formatTemp = (c: number) => wxPrefs.useFahrenheit ? `${toFahrenheit(c)}°` : `${c}°`;\n\n return (\n <>\n {/* Theme-aware panel — same colour as the taskbar so all dashboard\n * widgets read as a coordinated set across light and dark themes.\n * Rows use `divide-y` rather than per-row border classes so the\n * last row never paints a stray separator line at the panel's\n * bottom edge. */}\n <div className=\"h-full\"\n style={{\n backgroundColor: `rgb(var(--taskbar-bg-rgb, 243 244 246) / ${appearance.activeOpacity / 100})`,\n backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : undefined,\n }}>\n <div className=\"divide-y divide-gray-200\">\n {loading && cities.every(c => !data[c]) && (\n <div className=\"px-3 py-6 text-center text-xs text-gray-500\">Loading…</div>\n )}\n {cities.map((cityName) => {\n const w = data[cityName];\n const tz = AVAILABLE_CITIES[cityName]?.tz ?? 'UTC';\n const { time, ampm } = digitalTime(tz, now);\n if (!w) {\n return (\n <div key={cityName} className=\"px-4 py-3\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-[15px] font-semibold tracking-tight text-gray-900 truncate\">{cityName}</span>\n <span className=\"tabular-nums text-[13px] font-medium text-gray-500\">{time}<span className=\"text-[9px] ml-0.5 opacity-70\">{ampm}</span></span>\n </div>\n <div className=\"text-[11px] text-gray-400 mt-1\">Loading weather…</div>\n </div>\n );\n }\n const [condition, emoji] = getCondition(w.code, w.isDay);\n return (\n <div key={cityName} className=\"px-4 py-3\">\n {/* Top — city name on the left, big temperature on the right. */}\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-[15px] font-semibold tracking-tight text-gray-900 truncate\">{cityName}</span>\n <span className=\"text-[26px] font-extralight leading-none tabular-nums tracking-tight text-gray-900 shrink-0\">{formatTemp(w.temp)}</span>\n </div>\n\n {/* Bottom — emoji · digital time · condition on the left;\n H/L on the right. */}\n <div className=\"flex items-center justify-between gap-2 mt-1.5 text-[11px]\">\n <div className=\"flex items-center gap-1.5 min-w-0 text-gray-500\">\n <span className=\"text-base leading-none shrink-0\">{emoji}</span>\n <span className=\"tabular-nums font-semibold text-gray-700 shrink-0\">\n {time}<span className=\"text-[9px] font-medium ml-0.5 opacity-70\">{ampm}</span>\n </span>\n <span className=\"text-gray-300 shrink-0\">·</span>\n <span className=\"truncate\">{condition}</span>\n </div>\n <span className=\"tabular-nums text-gray-500 shrink-0\">H:{formatTemp(w.high)} L:{formatTemp(w.low)}</span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n <WidgetSettingsModal open={settingsOpen} onClose={() => setSettingsOpen(false)} title=\"World Clock Settings\"\n appearance={configAppearance} onAppearanceChange={setConfigAppearance} onSave={saveSettings}>\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">Display</h3>\n <div className=\"flex items-center gap-3 mb-2\">\n <span className=\"text-sm text-gray-600 w-24\">Temperature</span>\n <div className=\"flex gap-1\">\n {([{ key: false, label: '°C' }, { key: true, label: '°F' }] as const).map(o => (\n <button key={String(o.key)} onClick={() => setConfigWxPrefs(p => ({ ...p, useFahrenheit: o.key }))}\n className={`px-3 py-1 text-xs font-medium rounded-lg border transition-colors ${configWxPrefs.useFahrenheit === o.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'}`}>\n {o.label}\n </button>\n ))}\n </div>\n </div>\n <p className=\"text-[10px] text-gray-400 mt-1\">Shared with the Weather widget.</p>\n </div>\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">Cities</h3>\n <div className=\"grid grid-cols-2 gap-1 max-h-56 overflow-y-auto\">\n {Object.keys(AVAILABLE_CITIES).map(name => (\n <label key={name} className=\"flex items-center gap-2 text-sm py-1 cursor-pointer hover:bg-gray-50 rounded px-2\">\n <input type=\"checkbox\" checked={configCities.includes(name)}\n onChange={() => setConfigCities(prev => prev.includes(name) ? prev.filter(c => c !== name) : [...prev, name])}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500 h-3.5 w-3.5\" />\n {name}\n </label>\n ))}\n </div>\n </div>\n </WidgetSettingsModal>\n </>\n );\n}\n"]}
|
package/dist/apps/index.js
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
export { openFilesInTrashMode } from '../chunk-
|
|
2
|
-
export { setPdfPreview } from '../chunk-
|
|
1
|
+
export { openFilesInTrashMode } from '../chunk-HPORR7Y6.js';
|
|
2
|
+
export { setPdfPreview } from '../chunk-C4ULDV3I.js';
|
|
3
3
|
import '../chunk-KUIPWCTJ.js';
|
|
4
4
|
import '../chunk-WIJ45SYD.js';
|
|
5
|
-
import '../chunk-
|
|
5
|
+
import '../chunk-LWXHFZE4.js';
|
|
6
6
|
import '../chunk-PLGHQ7QW.js';
|
|
7
7
|
import { lazy } from 'react';
|
|
8
8
|
|
|
9
|
-
var Calculator = lazy(() => import('../Calculator-
|
|
10
|
-
var Spreadsheet = lazy(() => import('../Spreadsheet-
|
|
11
|
-
var Weather = lazy(() => import('../Weather-
|
|
12
|
-
var CurrencyConverter = lazy(() => import('../CurrencyConverter-
|
|
13
|
-
var PomodoroTimer = lazy(() => import('../PomodoroTimer-
|
|
14
|
-
var Notepad = lazy(() => import('../Notepad-
|
|
15
|
-
var WorldClock = lazy(() => import('../WorldClock-
|
|
9
|
+
var Calculator = lazy(() => import('../Calculator-CSVNNWA3.js'));
|
|
10
|
+
var Spreadsheet = lazy(() => import('../Spreadsheet-T5TEHTKO.js'));
|
|
11
|
+
var Weather = lazy(() => import('../Weather-XMFVT6EO.js'));
|
|
12
|
+
var CurrencyConverter = lazy(() => import('../CurrencyConverter-AXZ6EWU4.js'));
|
|
13
|
+
var PomodoroTimer = lazy(() => import('../PomodoroTimer-PJFPPOOQ.js'));
|
|
14
|
+
var Notepad = lazy(() => import('../Notepad-SN5WZIJY.js'));
|
|
15
|
+
var WorldClock = lazy(() => import('../WorldClock-2F7CPJZW.js'));
|
|
16
16
|
var TodoList = lazy(() => import('../TodoList-7JZ2SLDI.js'));
|
|
17
17
|
var Chess = lazy(() => import('../Chess-C5BY45NA.js'));
|
|
18
18
|
var Checkers = lazy(() => import('../Checkers-MIAHIKJH.js'));
|
|
19
19
|
var Sudoku = lazy(() => import('../Sudoku-XHLYCEVT.js'));
|
|
20
20
|
var Tetris = lazy(() => import('../Tetris-ZHCZYL24.js'));
|
|
21
21
|
var Game2048 = lazy(() => import('../Game2048-3RH3ELRD.js'));
|
|
22
|
-
var Minesweeper = lazy(() => import('../Minesweeper-
|
|
23
|
-
var Email = lazy(() => import('../Email-
|
|
22
|
+
var Minesweeper = lazy(() => import('../Minesweeper-L7YLY73F.js'));
|
|
23
|
+
var Email = lazy(() => import('../Email-3DXXEIFE.js'));
|
|
24
24
|
var GeminiChat = lazy(() => import('../GeminiChat-XTEBZIVK.js'));
|
|
25
|
-
var Calendar = lazy(() => import('../Calendar-
|
|
26
|
-
var Preview = lazy(() => import('../Preview-
|
|
27
|
-
var Documents = lazy(() => import('../Documents-
|
|
28
|
-
var Files = lazy(() => import('../Files-
|
|
29
|
-
var Browser = lazy(() => import('../Browser-
|
|
25
|
+
var Calendar = lazy(() => import('../Calendar-SGDRB5L7.js'));
|
|
26
|
+
var Preview = lazy(() => import('../Preview-KUPKE5NL.js'));
|
|
27
|
+
var Documents = lazy(() => import('../Documents-S5PXDWTK.js'));
|
|
28
|
+
var Files = lazy(() => import('../Files-I4H7LVP3.js'));
|
|
29
|
+
var Browser = lazy(() => import('../Browser-XDEBFFH5.js'));
|
|
30
30
|
var utilityApps = {
|
|
31
31
|
"/calculator": { component: Calculator, label: "Calculator", size: "sm", allowPinOnTop: true, utility: true, widget: true, autoHeight: true, dimensions: [280, 420] },
|
|
32
32
|
"/spreadsheet": { component: Spreadsheet, label: "Spreadsheets", size: "2xl", appStyle: true, multiInstance: true },
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Modal } from './chunk-
|
|
1
|
+
import { Modal } from './chunk-LWXHFZE4.js';
|
|
2
2
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
3
|
|
|
4
4
|
var DEFAULT_APPEARANCE = { activeOpacity: 70, inactiveOpacity: 50, activeBlur: 0, inactiveBlur: 0 };
|
|
@@ -138,5 +138,5 @@ function WidgetSettingsModal({ open, onClose, title, appearance, onAppearanceCha
|
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
export { WidgetSettingsModal, loadAppearance };
|
|
141
|
-
//# sourceMappingURL=chunk-
|
|
142
|
-
//# sourceMappingURL=chunk-
|
|
141
|
+
//# sourceMappingURL=chunk-372FJEYH.js.map
|
|
142
|
+
//# sourceMappingURL=chunk-372FJEYH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shell/WidgetSettingsModal.tsx"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/shell/WidgetSettingsModal.tsx"],"names":[],"mappings":"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","file":"chunk-372FJEYH.js","sourcesContent":["import Modal from './Modal';\n\nexport interface WidgetAppearance {\n activeOpacity: number;\n inactiveOpacity: number;\n activeBlur: number;\n inactiveBlur: number;\n}\n\nexport const DEFAULT_APPEARANCE: WidgetAppearance = { activeOpacity: 70, inactiveOpacity: 50, activeBlur: 0, inactiveBlur: 0 };\n\nexport function loadAppearance(key: string): WidgetAppearance {\n try {\n const saved = JSON.parse(localStorage.getItem(key) || '');\n // Migrate old single `blur` field to activeBlur/inactiveBlur\n if (saved.blur != null && saved.activeBlur == null) {\n saved.activeBlur = saved.blur;\n saved.inactiveBlur = saved.blur;\n delete saved.blur;\n }\n return { ...DEFAULT_APPEARANCE, ...saved };\n }\n catch { return DEFAULT_APPEARANCE; }\n}\n\n/** Reusable settings modal for widgets — renders appearance sliders + optional extra content above */\nexport default function WidgetSettingsModal({ open, onClose, title, appearance, onAppearanceChange, onSave, children }: {\n open: boolean;\n onClose: () => void;\n title: string;\n appearance: WidgetAppearance;\n onAppearanceChange: (a: WidgetAppearance) => void;\n onSave: () => void;\n children?: React.ReactNode;\n}) {\n if (!open) return null;\n\n const inp = 'w-full h-1.5 rounded-full appearance-none bg-gray-200 cursor-pointer accent-blue-500';\n const lbl = 'flex items-center justify-between text-xs text-gray-500';\n\n return (\n <div onPointerDown={e => e.stopPropagation()} onContextMenu={e => e.stopPropagation()}>\n <Modal open={open} onClose={onClose} title={title} size=\"sm\">\n <div className=\"space-y-4\">\n {children}\n\n {/* Appearance */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-3\">Appearance</h3>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">Active</div>\n <div className=\"space-y-2\">\n <div>\n <div className={lbl}><span>Opacity</span><span>{appearance.activeOpacity}%</span></div>\n <input type=\"range\" min={20} max={100} value={appearance.activeOpacity}\n onChange={e => onAppearanceChange({ ...appearance, activeOpacity: +e.target.value })} className={inp} />\n </div>\n <div>\n <div className={lbl}><span>Blur</span><span>{appearance.activeBlur}px</span></div>\n <input type=\"range\" min={0} max={20} value={appearance.activeBlur}\n onChange={e => onAppearanceChange({ ...appearance, activeBlur: +e.target.value })} className={inp} />\n </div>\n </div>\n </div>\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">Inactive</div>\n <div className=\"space-y-2\">\n <div>\n <div className={lbl}><span>Opacity</span><span>{appearance.inactiveOpacity}%</span></div>\n <input type=\"range\" min={20} max={100} value={appearance.inactiveOpacity}\n onChange={e => onAppearanceChange({ ...appearance, inactiveOpacity: +e.target.value })} className={inp} />\n </div>\n <div>\n <div className={lbl}><span>Blur</span><span>{appearance.inactiveBlur}px</span></div>\n <input type=\"range\" min={0} max={20} value={appearance.inactiveBlur}\n onChange={e => onAppearanceChange({ ...appearance, inactiveBlur: +e.target.value })} className={inp} />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex gap-2 pt-2\">\n <button onClick={onSave}\n className=\"flex-1 text-sm font-medium py-2 rounded-lg bg-blue-600 text-white hover:bg-blue-700 transition\">Save</button>\n <button onClick={onClose}\n className=\"flex-1 text-sm font-medium py-2 rounded-lg border border-gray-300 text-gray-600 hover:bg-gray-50 transition\">Cancel</button>\n </div>\n </div>\n </Modal>\n </div>\n );\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ImageAnnotator_default } from './chunk-KUIPWCTJ.js';
|
|
2
2
|
import { toast_default } from './chunk-WIJ45SYD.js';
|
|
3
|
-
import { WindowTitle, getActiveModalId } from './chunk-
|
|
3
|
+
import { WindowTitle, getActiveModalId } from './chunk-LWXHFZE4.js';
|
|
4
4
|
import { createContext, useState, useEffect, useRef, useContext } from 'react';
|
|
5
5
|
import { createPortal } from 'react-dom';
|
|
6
6
|
import * as pdfjsLib from 'pdfjs-dist';
|
|
@@ -294,6 +294,7 @@ function PdfPanel({ url, filename, onDownload, onEmail }) {
|
|
|
294
294
|
useEffect(() => {
|
|
295
295
|
if (!pdf || !canvasRef.current) return;
|
|
296
296
|
let cancelled = false;
|
|
297
|
+
let task = null;
|
|
297
298
|
pdf.getPage(page).then((p) => {
|
|
298
299
|
if (cancelled || !canvasRef.current) return;
|
|
299
300
|
const viewport = p.getViewport({ scale });
|
|
@@ -303,11 +304,13 @@ function PdfPanel({ url, filename, onDownload, onEmail }) {
|
|
|
303
304
|
canvas.style.width = `${viewport.width}px`;
|
|
304
305
|
canvas.style.height = `${viewport.height}px`;
|
|
305
306
|
const ctx = canvas.getContext("2d");
|
|
306
|
-
p.render({ canvas, canvasContext: ctx, viewport })
|
|
307
|
+
task = p.render({ canvas, canvasContext: ctx, viewport });
|
|
308
|
+
task.promise.catch(() => {
|
|
307
309
|
});
|
|
308
310
|
});
|
|
309
311
|
return () => {
|
|
310
312
|
cancelled = true;
|
|
313
|
+
task?.cancel();
|
|
311
314
|
};
|
|
312
315
|
}, [pdf, page, scale]);
|
|
313
316
|
const handlePrint = () => {
|
|
@@ -1564,6 +1567,15 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
|
|
|
1564
1567
|
const GeometryCtor = sampleMesh.geometry.constructor;
|
|
1565
1568
|
const BufferAttrCtor = sampleMesh.geometry.attributes?.position?.constructor;
|
|
1566
1569
|
if (!Vector3Ctor || !MeshCtor || !MaterialCtor || !GeometryCtor || !BufferAttrCtor) return;
|
|
1570
|
+
let LineSegmentsCtor = null;
|
|
1571
|
+
let LineBasicMaterialCtor = null;
|
|
1572
|
+
scene.traverse((obj) => {
|
|
1573
|
+
if (LineSegmentsCtor && LineBasicMaterialCtor) return;
|
|
1574
|
+
if (!obj?.isLineSegments) return;
|
|
1575
|
+
LineSegmentsCtor = obj.constructor;
|
|
1576
|
+
const mat = Array.isArray(obj.material) ? obj.material[0] : obj.material;
|
|
1577
|
+
if (mat?.constructor) LineBasicMaterialCtor = mat.constructor;
|
|
1578
|
+
});
|
|
1567
1579
|
const teardown = () => {
|
|
1568
1580
|
const s = measureRef.current;
|
|
1569
1581
|
if (!s) return;
|
|
@@ -1588,40 +1600,13 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
|
|
|
1588
1600
|
return;
|
|
1589
1601
|
}
|
|
1590
1602
|
measureRef.current = { points: [], normals: [], markers: [], line: null, label: null, rafId: null };
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
(async () => {
|
|
1594
|
-
try {
|
|
1595
|
-
THREE = await import(
|
|
1596
|
-
/* @vite-ignore */
|
|
1597
|
-
'three'
|
|
1598
|
-
);
|
|
1599
|
-
raycaster = new THREE.Raycaster();
|
|
1600
|
-
} catch (err) {
|
|
1601
|
-
console.warn("[Preview] measure: failed to load three for raycaster", err);
|
|
1602
|
-
}
|
|
1603
|
-
})();
|
|
1603
|
+
const OV = ovRef.current;
|
|
1604
|
+
const intersectionMode = OV?.IntersectionMode?.MeshOnly ?? 1;
|
|
1604
1605
|
const bbox = v.viewer.GetBoundingBox?.(() => true);
|
|
1605
1606
|
const diag = bbox ? Math.sqrt(
|
|
1606
1607
|
(bbox.max.x - bbox.min.x) ** 2 + (bbox.max.y - bbox.min.y) ** 2 + (bbox.max.z - bbox.min.z) ** 2
|
|
1607
1608
|
) : 100;
|
|
1608
1609
|
const markerRadius = Math.max(diag * 5e-3, 0.2);
|
|
1609
|
-
const ndcFromEvent = (ev) => {
|
|
1610
|
-
const rect = canvas.getBoundingClientRect();
|
|
1611
|
-
return {
|
|
1612
|
-
x: (ev.clientX - rect.left) / rect.width * 2 - 1,
|
|
1613
|
-
y: -((ev.clientY - rect.top) / rect.height * 2 - 1)
|
|
1614
|
-
};
|
|
1615
|
-
};
|
|
1616
|
-
const collectTargets = () => {
|
|
1617
|
-
const out = [];
|
|
1618
|
-
v.viewer.mainModel?.EnumerateMeshes?.((m) => {
|
|
1619
|
-
if (m.userData?.__sectionHelper || m.userData?.__measureHelper) return;
|
|
1620
|
-
if (m.visible === false) return;
|
|
1621
|
-
out.push(m);
|
|
1622
|
-
});
|
|
1623
|
-
return out;
|
|
1624
|
-
};
|
|
1625
1610
|
const makeMarker = (point) => {
|
|
1626
1611
|
const widthSegs = 16, heightSegs = 12;
|
|
1627
1612
|
const positions = [];
|
|
@@ -1730,8 +1715,8 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
|
|
|
1730
1715
|
const drawLine = (a, b) => {
|
|
1731
1716
|
const geom = new GeometryCtor();
|
|
1732
1717
|
geom.setAttribute("position", new BufferAttrCtor(new Float32Array([a.x, a.y, a.z, b.x, b.y, b.z]), 3));
|
|
1733
|
-
const LineCtor =
|
|
1734
|
-
const LineMatCtor =
|
|
1718
|
+
const LineCtor = LineSegmentsCtor ?? MeshCtor;
|
|
1719
|
+
const LineMatCtor = LineBasicMaterialCtor ?? MaterialCtor;
|
|
1735
1720
|
const mat = new LineMatCtor({ color: 16746496, depthTest: false, depthWrite: false, transparent: true, opacity: 0.95 });
|
|
1736
1721
|
const line = new LineCtor(geom, mat);
|
|
1737
1722
|
line.renderOrder = 9998;
|
|
@@ -1799,17 +1784,17 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
|
|
|
1799
1784
|
}
|
|
1800
1785
|
};
|
|
1801
1786
|
const doMeasurePick = (ev) => {
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
const
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
const
|
|
1809
|
-
if (!
|
|
1787
|
+
if (!v.viewer.camera) return;
|
|
1788
|
+
const rect = canvas.getBoundingClientRect();
|
|
1789
|
+
const mouseCoords = {
|
|
1790
|
+
x: ev.clientX - rect.left,
|
|
1791
|
+
y: ev.clientY - rect.top
|
|
1792
|
+
};
|
|
1793
|
+
const hit = v.viewer.GetMeshIntersectionUnderMouse?.(intersectionMode, mouseCoords);
|
|
1794
|
+
if (!hit) return;
|
|
1810
1795
|
const s = measureRef.current;
|
|
1811
|
-
const point = new Vector3Ctor(
|
|
1812
|
-
const normal = worldNormalFromHit(
|
|
1796
|
+
const point = new Vector3Ctor(hit.point.x, hit.point.y, hit.point.z);
|
|
1797
|
+
const normal = worldNormalFromHit(hit);
|
|
1813
1798
|
if (s.points.length === 2) {
|
|
1814
1799
|
for (const m of s.markers) {
|
|
1815
1800
|
scene.remove(m);
|
|
@@ -1831,7 +1816,7 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
|
|
|
1831
1816
|
s.points.push(point);
|
|
1832
1817
|
s.normals.push(normal);
|
|
1833
1818
|
if (measureMode === "perp") {
|
|
1834
|
-
const highlight = buildFaceHighlight(
|
|
1819
|
+
const highlight = buildFaceHighlight(hit.object, hit);
|
|
1835
1820
|
s.markers.push(highlight ?? makeMarker(point));
|
|
1836
1821
|
} else {
|
|
1837
1822
|
s.markers.push(makeMarker(point));
|
|
@@ -2403,5 +2388,5 @@ function ImagePanel({ url, filename, onDownload, onEmail }) {
|
|
|
2403
2388
|
}
|
|
2404
2389
|
|
|
2405
2390
|
export { Preview, setPdfPreview };
|
|
2406
|
-
//# sourceMappingURL=chunk-
|
|
2407
|
-
//# sourceMappingURL=chunk-
|
|
2391
|
+
//# sourceMappingURL=chunk-C4ULDV3I.js.map
|
|
2392
|
+
//# sourceMappingURL=chunk-C4ULDV3I.js.map
|