react-os-shell 0.2.43 → 0.2.44
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-5ZCLRIRU.js → Browser-LSJORULM.js} +3 -3
- package/dist/{Browser-5ZCLRIRU.js.map → Browser-LSJORULM.js.map} +1 -1
- package/dist/{Calculator-OHL2AZ52.js → Calculator-ZKEH53OV.js} +4 -4
- package/dist/{Calculator-OHL2AZ52.js.map → Calculator-ZKEH53OV.js.map} +1 -1
- package/dist/{Calendar-6AHL3UJY.js → Calendar-4UQDQ3NT.js} +3 -3
- package/dist/{Calendar-6AHL3UJY.js.map → Calendar-4UQDQ3NT.js.map} +1 -1
- package/dist/{CurrencyConverter-XZVZ7XOF.js → CurrencyConverter-TXBFDFG2.js} +56 -50
- package/dist/CurrencyConverter-TXBFDFG2.js.map +1 -0
- package/dist/{Documents-IPVZ47JX.js → Documents-CQVIIFZV.js} +3 -3
- package/dist/{Documents-IPVZ47JX.js.map → Documents-CQVIIFZV.js.map} +1 -1
- package/dist/{Email-Z7FDKAFD.js → Email-HRBZUWPY.js} +3 -3
- package/dist/{Email-Z7FDKAFD.js.map → Email-HRBZUWPY.js.map} +1 -1
- package/dist/Files-ITIKVHIE.js +8 -0
- package/dist/{Files-KEHRZ2UY.js.map → Files-ITIKVHIE.js.map} +1 -1
- package/dist/{Minesweeper-NGN4O6C4.js → Minesweeper-QGUPDVRS.js} +3 -3
- package/dist/{Minesweeper-NGN4O6C4.js.map → Minesweeper-QGUPDVRS.js.map} +1 -1
- package/dist/{Notepad-W3YYZ3GS.js → Notepad-74CQPZCV.js} +3 -3
- package/dist/{Notepad-W3YYZ3GS.js.map → Notepad-74CQPZCV.js.map} +1 -1
- package/dist/PomodoroTimer-PRP5CZ3S.js +627 -0
- package/dist/PomodoroTimer-PRP5CZ3S.js.map +1 -0
- package/dist/Preview-4MBQI66Q.js +7 -0
- package/dist/{Preview-4354N46U.js.map → Preview-4MBQI66Q.js.map} +1 -1
- package/dist/{Spreadsheet-FCFII6DW.js → Spreadsheet-MKXPPSKV.js} +3 -3
- package/dist/{Spreadsheet-FCFII6DW.js.map → Spreadsheet-MKXPPSKV.js.map} +1 -1
- package/dist/Weather-YXSCSPQT.js +424 -0
- package/dist/Weather-YXSCSPQT.js.map +1 -0
- package/dist/WorldClock-QO5PVJQQ.js +250 -0
- package/dist/WorldClock-QO5PVJQQ.js.map +1 -0
- package/dist/apps/index.d.ts +6 -10
- package/dist/apps/index.js +18 -18
- package/dist/apps/index.js.map +1 -1
- package/dist/chunk-7CCHEEYC.js +94 -0
- package/dist/chunk-7CCHEEYC.js.map +1 -0
- package/dist/{chunk-T2NQXP2J.js → chunk-7M3BBAHQ.js} +10 -4
- package/dist/chunk-7M3BBAHQ.js.map +1 -0
- package/dist/{chunk-IY7JJVHR.js → chunk-DUUANLLE.js} +3 -3
- package/dist/{chunk-IY7JJVHR.js.map → chunk-DUUANLLE.js.map} +1 -1
- package/dist/chunk-MK3HLUO4.js +380 -0
- package/dist/chunk-MK3HLUO4.js.map +1 -0
- package/dist/{chunk-2SRU4BYH.js → chunk-MTLVXT2C.js} +4 -4
- package/dist/{chunk-2SRU4BYH.js.map → chunk-MTLVXT2C.js.map} +1 -1
- package/dist/{chunk-TVOBLSSV.js → chunk-UK2AA3J6.js} +3 -3
- package/dist/{chunk-TVOBLSSV.js.map → chunk-UK2AA3J6.js.map} +1 -1
- package/dist/index.d.ts +16 -1
- package/dist/index.js +4089 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/CurrencyConverter-XZVZ7XOF.js.map +0 -1
- package/dist/Files-KEHRZ2UY.js +0 -8
- package/dist/PomodoroTimer-T2J5NDJR.js +0 -196
- package/dist/PomodoroTimer-T2J5NDJR.js.map +0 -1
- package/dist/Preview-4354N46U.js +0 -7
- package/dist/Weather-XTADR7Z3.js +0 -266
- package/dist/Weather-XTADR7Z3.js.map +0 -1
- package/dist/WorldClock-OFK2EA2H.js +0 -126
- package/dist/WorldClock-OFK2EA2H.js.map +0 -1
- package/dist/chunk-7KZWBIDL.js +0 -4144
- package/dist/chunk-7KZWBIDL.js.map +0 -1
- package/dist/chunk-T2NQXP2J.js.map +0 -1
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { AVAILABLE_CITIES, fetchCityWeather, getCondition, toFahrenheit } from './chunk-7CCHEEYC.js';
|
|
2
|
+
import { useShellPrefs } from './chunk-36VM54SC.js';
|
|
3
|
+
import { loadAppearance, WidgetSettingsModal } from './chunk-UK2AA3J6.js';
|
|
4
|
+
import { useWidgetSettings } from './chunk-7M3BBAHQ.js';
|
|
5
|
+
import './chunk-PLGHQ7QW.js';
|
|
6
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
7
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
var SETTINGS_KEY = "world_clock_appearance";
|
|
10
|
+
var DEFAULT_CITIES = ["London", "Shanghai", "New York"];
|
|
11
|
+
function AnalogClockWithMeridiem({ tz, now, size = 30 }) {
|
|
12
|
+
let h24 = 0, m = 0;
|
|
13
|
+
try {
|
|
14
|
+
const parts = new Intl.DateTimeFormat("en-US", {
|
|
15
|
+
timeZone: tz,
|
|
16
|
+
hour: "numeric",
|
|
17
|
+
minute: "2-digit",
|
|
18
|
+
hour12: false
|
|
19
|
+
}).formatToParts(now);
|
|
20
|
+
h24 = parseInt(parts.find((p) => p.type === "hour")?.value || "0", 10);
|
|
21
|
+
if (h24 === 24) h24 = 0;
|
|
22
|
+
m = parseInt(parts.find((p) => p.type === "minute")?.value || "0", 10);
|
|
23
|
+
} catch {
|
|
24
|
+
}
|
|
25
|
+
const ampm = h24 >= 12 ? "PM" : "AM";
|
|
26
|
+
const hourAngle = (h24 % 12 + m / 60) * 30 - 90;
|
|
27
|
+
const minuteAngle = m * 6 - 90;
|
|
28
|
+
const r = size / 2;
|
|
29
|
+
const hLen = r * 0.52;
|
|
30
|
+
const mLen = r * 0.78;
|
|
31
|
+
const hRad = hourAngle * Math.PI / 180;
|
|
32
|
+
const mRad = minuteAngle * Math.PI / 180;
|
|
33
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-0.5 shrink-0 text-gray-700", children: [
|
|
34
|
+
/* @__PURE__ */ jsxs("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, style: { color: "currentColor" }, children: [
|
|
35
|
+
/* @__PURE__ */ jsx(
|
|
36
|
+
"circle",
|
|
37
|
+
{
|
|
38
|
+
cx: r,
|
|
39
|
+
cy: r,
|
|
40
|
+
r: r - 0.6,
|
|
41
|
+
fill: "currentColor",
|
|
42
|
+
fillOpacity: 0.05,
|
|
43
|
+
stroke: "currentColor",
|
|
44
|
+
strokeOpacity: 0.4,
|
|
45
|
+
strokeWidth: 0.8
|
|
46
|
+
}
|
|
47
|
+
),
|
|
48
|
+
[0, 90, 180, 270].map((deg) => {
|
|
49
|
+
const a = (deg - 90) * Math.PI / 180;
|
|
50
|
+
const dx = r + Math.cos(a) * (r * 0.83);
|
|
51
|
+
const dy = r + Math.sin(a) * (r * 0.83);
|
|
52
|
+
return /* @__PURE__ */ jsx("circle", { cx: dx, cy: dy, r: 0.85, fill: "currentColor", fillOpacity: 0.55 }, deg);
|
|
53
|
+
}),
|
|
54
|
+
/* @__PURE__ */ jsx(
|
|
55
|
+
"line",
|
|
56
|
+
{
|
|
57
|
+
x1: r,
|
|
58
|
+
y1: r,
|
|
59
|
+
x2: r + Math.cos(hRad) * hLen,
|
|
60
|
+
y2: r + Math.sin(hRad) * hLen,
|
|
61
|
+
stroke: "currentColor",
|
|
62
|
+
strokeWidth: 1.6,
|
|
63
|
+
strokeLinecap: "round"
|
|
64
|
+
}
|
|
65
|
+
),
|
|
66
|
+
/* @__PURE__ */ jsx(
|
|
67
|
+
"line",
|
|
68
|
+
{
|
|
69
|
+
x1: r,
|
|
70
|
+
y1: r,
|
|
71
|
+
x2: r + Math.cos(mRad) * mLen,
|
|
72
|
+
y2: r + Math.sin(mRad) * mLen,
|
|
73
|
+
stroke: "currentColor",
|
|
74
|
+
strokeWidth: 1.1,
|
|
75
|
+
strokeLinecap: "round"
|
|
76
|
+
}
|
|
77
|
+
),
|
|
78
|
+
/* @__PURE__ */ jsx("circle", { cx: r, cy: r, r: 1.3, fill: "currentColor" })
|
|
79
|
+
] }),
|
|
80
|
+
/* @__PURE__ */ jsx("span", { className: "text-[8.5px] font-medium tracking-[0.12em] text-gray-500", children: ampm })
|
|
81
|
+
] });
|
|
82
|
+
}
|
|
83
|
+
function WorldClock() {
|
|
84
|
+
const { prefs, save } = useShellPrefs();
|
|
85
|
+
const [appearance, setAppearance] = useState(() => loadAppearance(SETTINGS_KEY));
|
|
86
|
+
const [settingsOpen, setSettingsOpen] = useState(false);
|
|
87
|
+
const [configCities, setConfigCities] = useState([]);
|
|
88
|
+
const [configAppearance, setConfigAppearance] = useState(appearance);
|
|
89
|
+
const wxPrefs = {
|
|
90
|
+
useFahrenheit: !!prefs.weather_prefs?.useFahrenheit
|
|
91
|
+
};
|
|
92
|
+
const [configWxPrefs, setConfigWxPrefs] = useState(wxPrefs);
|
|
93
|
+
const [now, setNow] = useState(() => /* @__PURE__ */ new Date());
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
const t = setInterval(() => setNow(/* @__PURE__ */ new Date()), 30 * 1e3);
|
|
96
|
+
return () => clearInterval(t);
|
|
97
|
+
}, []);
|
|
98
|
+
const tzToCity = Object.fromEntries(
|
|
99
|
+
Object.entries(AVAILABLE_CITIES).map(([city, info]) => [info.tz, city])
|
|
100
|
+
);
|
|
101
|
+
const rawClocks = prefs.world_clocks;
|
|
102
|
+
const cities = (() => {
|
|
103
|
+
if (!Array.isArray(rawClocks) || rawClocks.length === 0) return DEFAULT_CITIES;
|
|
104
|
+
const out = [];
|
|
105
|
+
for (const v of rawClocks) {
|
|
106
|
+
const asCity = AVAILABLE_CITIES[v] ? v : tzToCity[v];
|
|
107
|
+
if (asCity && !out.includes(asCity)) out.push(asCity);
|
|
108
|
+
}
|
|
109
|
+
return out.length ? out : DEFAULT_CITIES;
|
|
110
|
+
})();
|
|
111
|
+
const [data, setData] = useState({});
|
|
112
|
+
const [loading, setLoading] = useState(true);
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
let cancelled = false;
|
|
115
|
+
setLoading(true);
|
|
116
|
+
(async () => {
|
|
117
|
+
const next = {};
|
|
118
|
+
await Promise.all(cities.map(async (c) => {
|
|
119
|
+
const w = await fetchCityWeather(c);
|
|
120
|
+
if (w) next[c] = w;
|
|
121
|
+
}));
|
|
122
|
+
if (!cancelled) {
|
|
123
|
+
setData(next);
|
|
124
|
+
setLoading(false);
|
|
125
|
+
}
|
|
126
|
+
})();
|
|
127
|
+
return () => {
|
|
128
|
+
cancelled = true;
|
|
129
|
+
};
|
|
130
|
+
}, [cities.join(",")]);
|
|
131
|
+
useWidgetSettings(useCallback(() => {
|
|
132
|
+
setConfigCities([...cities]);
|
|
133
|
+
setConfigAppearance({ ...appearance });
|
|
134
|
+
setConfigWxPrefs({ ...wxPrefs });
|
|
135
|
+
setSettingsOpen(true);
|
|
136
|
+
}, [cities.join(","), appearance, wxPrefs.useFahrenheit]));
|
|
137
|
+
const saveSettings = () => {
|
|
138
|
+
if (configCities.length === 0) return;
|
|
139
|
+
save({
|
|
140
|
+
world_clocks: configCities,
|
|
141
|
+
weather_prefs: { ...prefs.weather_prefs ?? {}, useFahrenheit: configWxPrefs.useFahrenheit }
|
|
142
|
+
});
|
|
143
|
+
setAppearance(configAppearance);
|
|
144
|
+
localStorage.setItem(SETTINGS_KEY, JSON.stringify(configAppearance));
|
|
145
|
+
setSettingsOpen(false);
|
|
146
|
+
};
|
|
147
|
+
const formatTemp = (c) => wxPrefs.useFahrenheit ? `${toFahrenheit(c)}\xB0` : `${c}\xB0`;
|
|
148
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
149
|
+
/* @__PURE__ */ jsx(
|
|
150
|
+
"div",
|
|
151
|
+
{
|
|
152
|
+
className: "rounded-2xl overflow-hidden",
|
|
153
|
+
style: {
|
|
154
|
+
backgroundColor: `rgb(var(--taskbar-bg-rgb, 243 244 246) / ${appearance.activeOpacity / 100})`,
|
|
155
|
+
backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : void 0
|
|
156
|
+
},
|
|
157
|
+
children: /* @__PURE__ */ jsxs("div", { className: "px-1 py-1", children: [
|
|
158
|
+
loading && cities.every((c) => !data[c]) && /* @__PURE__ */ jsx("div", { className: "px-3 py-6 text-center text-xs text-gray-500", children: "Loading\u2026" }),
|
|
159
|
+
cities.map((cityName, i) => {
|
|
160
|
+
const w = data[cityName];
|
|
161
|
+
const tz = AVAILABLE_CITIES[cityName]?.tz ?? "UTC";
|
|
162
|
+
const last = i === cities.length - 1;
|
|
163
|
+
if (!w) {
|
|
164
|
+
return /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-3 px-3 py-3 ${last ? "" : "border-b border-gray-200"}`, children: [
|
|
165
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
166
|
+
/* @__PURE__ */ jsx("div", { className: "text-[15px] font-semibold tracking-tight leading-tight truncate text-gray-900", children: cityName }),
|
|
167
|
+
/* @__PURE__ */ jsx("div", { className: "text-[11px] text-gray-500 leading-tight", children: "\u2026" })
|
|
168
|
+
] }),
|
|
169
|
+
/* @__PURE__ */ jsx(AnalogClockWithMeridiem, { tz, now })
|
|
170
|
+
] }, cityName);
|
|
171
|
+
}
|
|
172
|
+
const [condition, emoji] = getCondition(w.code, w.isDay);
|
|
173
|
+
return /* @__PURE__ */ jsxs(
|
|
174
|
+
"div",
|
|
175
|
+
{
|
|
176
|
+
className: `flex items-center gap-3 px-3 py-3 ${last ? "" : "border-b border-gray-200"}`,
|
|
177
|
+
children: [
|
|
178
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
179
|
+
/* @__PURE__ */ jsx("div", { className: "text-[15px] font-semibold tracking-tight leading-tight truncate text-gray-900", children: cityName }),
|
|
180
|
+
/* @__PURE__ */ jsx("div", { className: "text-[11px] text-gray-500 leading-tight truncate mt-0.5", children: condition })
|
|
181
|
+
] }),
|
|
182
|
+
/* @__PURE__ */ jsx(AnalogClockWithMeridiem, { tz, now }),
|
|
183
|
+
/* @__PURE__ */ jsx("span", { className: "text-[22px] leading-none shrink-0", children: emoji }),
|
|
184
|
+
/* @__PURE__ */ jsxs("div", { className: "text-right shrink-0 min-w-[52px]", children: [
|
|
185
|
+
/* @__PURE__ */ jsx("div", { className: "text-[22px] font-extralight leading-none tabular-nums tracking-tight text-gray-900", children: formatTemp(w.temp) }),
|
|
186
|
+
/* @__PURE__ */ jsxs("div", { className: "text-[10px] text-gray-500 tabular-nums mt-1", children: [
|
|
187
|
+
"H:",
|
|
188
|
+
formatTemp(w.high),
|
|
189
|
+
" L:",
|
|
190
|
+
formatTemp(w.low)
|
|
191
|
+
] })
|
|
192
|
+
] })
|
|
193
|
+
]
|
|
194
|
+
},
|
|
195
|
+
cityName
|
|
196
|
+
);
|
|
197
|
+
})
|
|
198
|
+
] })
|
|
199
|
+
}
|
|
200
|
+
),
|
|
201
|
+
/* @__PURE__ */ jsxs(
|
|
202
|
+
WidgetSettingsModal,
|
|
203
|
+
{
|
|
204
|
+
open: settingsOpen,
|
|
205
|
+
onClose: () => setSettingsOpen(false),
|
|
206
|
+
title: "World Clock Settings",
|
|
207
|
+
appearance: configAppearance,
|
|
208
|
+
onAppearanceChange: setConfigAppearance,
|
|
209
|
+
onSave: saveSettings,
|
|
210
|
+
children: [
|
|
211
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
212
|
+
/* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-gray-700 mb-2", children: "Display" }),
|
|
213
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 mb-2", children: [
|
|
214
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm text-gray-600 w-24", children: "Temperature" }),
|
|
215
|
+
/* @__PURE__ */ jsx("div", { className: "flex gap-1", children: [{ key: false, label: "\xB0C" }, { key: true, label: "\xB0F" }].map((o) => /* @__PURE__ */ jsx(
|
|
216
|
+
"button",
|
|
217
|
+
{
|
|
218
|
+
onClick: () => setConfigWxPrefs((p) => ({ ...p, useFahrenheit: o.key })),
|
|
219
|
+
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"}`,
|
|
220
|
+
children: o.label
|
|
221
|
+
},
|
|
222
|
+
String(o.key)
|
|
223
|
+
)) })
|
|
224
|
+
] }),
|
|
225
|
+
/* @__PURE__ */ jsx("p", { className: "text-[10px] text-gray-400 mt-1", children: "Shared with the Weather widget." })
|
|
226
|
+
] }),
|
|
227
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
228
|
+
/* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-gray-700 mb-2", children: "Cities" }),
|
|
229
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-1 max-h-56 overflow-y-auto", children: Object.keys(AVAILABLE_CITIES).map((name) => /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 text-sm py-1 cursor-pointer hover:bg-gray-50 rounded px-2", children: [
|
|
230
|
+
/* @__PURE__ */ jsx(
|
|
231
|
+
"input",
|
|
232
|
+
{
|
|
233
|
+
type: "checkbox",
|
|
234
|
+
checked: configCities.includes(name),
|
|
235
|
+
onChange: () => setConfigCities((prev) => prev.includes(name) ? prev.filter((c) => c !== name) : [...prev, name]),
|
|
236
|
+
className: "rounded border-gray-300 text-blue-600 focus:ring-blue-500 h-3.5 w-3.5"
|
|
237
|
+
}
|
|
238
|
+
),
|
|
239
|
+
name
|
|
240
|
+
] }, name)) })
|
|
241
|
+
] })
|
|
242
|
+
]
|
|
243
|
+
}
|
|
244
|
+
)
|
|
245
|
+
] });
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export { WorldClock as default };
|
|
249
|
+
//# sourceMappingURL=WorldClock-QO5PVJQQ.js.map
|
|
250
|
+
//# sourceMappingURL=WorldClock-QO5PVJQQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/apps/WorldClock.tsx"],"names":[],"mappings":"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","file":"WorldClock-QO5PVJQQ.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 * Minimalist analogue clock face — no numerals, just four small dots at\n * the cardinal hours and two thin white hands. Returns both the SVG and\n * the AM/PM marker so the row can stack them vertically with consistent\n * spacing.\n */\nfunction AnalogClockWithMeridiem({ tz, now, size = 30 }: { tz: string; now: Date; size?: number }) {\n let h24 = 0, m = 0;\n try {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone: tz, hour: 'numeric', minute: '2-digit', hour12: false,\n }).formatToParts(now);\n h24 = parseInt(parts.find(p => p.type === 'hour')?.value || '0', 10);\n if (h24 === 24) h24 = 0;\n m = parseInt(parts.find(p => p.type === 'minute')?.value || '0', 10);\n } catch {}\n\n const ampm = h24 >= 12 ? 'PM' : 'AM';\n const hourAngle = ((h24 % 12) + m / 60) * 30 - 90;\n const minuteAngle = m * 6 - 90;\n const r = size / 2;\n const hLen = r * 0.52;\n const mLen = r * 0.78;\n const hRad = (hourAngle * Math.PI) / 180;\n const mRad = (minuteAngle * Math.PI) / 180;\n\n // Use currentColor + opacity so the clock face inherits the panel's\n // text colour — black-ish in light themes, light-grey in dark mode.\n return (\n <div className=\"flex flex-col items-center gap-0.5 shrink-0 text-gray-700\">\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`} style={{ color: 'currentColor' }}>\n <circle cx={r} cy={r} r={r - 0.6} fill=\"currentColor\" fillOpacity={0.05}\n stroke=\"currentColor\" strokeOpacity={0.4} strokeWidth={0.8} />\n {[0, 90, 180, 270].map(deg => {\n const a = (deg - 90) * Math.PI / 180;\n const dx = r + Math.cos(a) * (r * 0.83);\n const dy = r + Math.sin(a) * (r * 0.83);\n return <circle key={deg} cx={dx} cy={dy} r={0.85} fill=\"currentColor\" fillOpacity={0.55} />;\n })}\n <line x1={r} y1={r}\n x2={r + Math.cos(hRad) * hLen} y2={r + Math.sin(hRad) * hLen}\n stroke=\"currentColor\" strokeWidth={1.6} strokeLinecap=\"round\" />\n <line x1={r} y1={r}\n x2={r + Math.cos(mRad) * mLen} y2={r + Math.sin(mRad) * mLen}\n stroke=\"currentColor\" strokeWidth={1.1} strokeLinecap=\"round\" />\n <circle cx={r} cy={r} r={1.3} fill=\"currentColor\" />\n </svg>\n <span className=\"text-[8.5px] font-medium tracking-[0.12em] text-gray-500\">{ampm}</span>\n </div>\n );\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 <div className=\"rounded-2xl overflow-hidden\"\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=\"px-1 py-1\">\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, i) => {\n const w = data[cityName];\n const tz = AVAILABLE_CITIES[cityName]?.tz ?? 'UTC';\n const last = i === cities.length - 1;\n if (!w) {\n return (\n <div key={cityName} className={`flex items-center gap-3 px-3 py-3 ${last ? '' : 'border-b border-gray-200'}`}>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-[15px] font-semibold tracking-tight leading-tight truncate text-gray-900\">{cityName}</div>\n <div className=\"text-[11px] text-gray-500 leading-tight\">…</div>\n </div>\n <AnalogClockWithMeridiem tz={tz} now={now} />\n </div>\n );\n }\n const [condition, emoji] = getCondition(w.code, w.isDay);\n return (\n <div key={cityName}\n className={`flex items-center gap-3 px-3 py-3 ${last ? '' : 'border-b border-gray-200'}`}>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-[15px] font-semibold tracking-tight leading-tight truncate text-gray-900\">{cityName}</div>\n <div className=\"text-[11px] text-gray-500 leading-tight truncate mt-0.5\">{condition}</div>\n </div>\n <AnalogClockWithMeridiem tz={tz} now={now} />\n <span className=\"text-[22px] leading-none shrink-0\">{emoji}</span>\n <div className=\"text-right shrink-0 min-w-[52px]\">\n <div className=\"text-[22px] font-extralight leading-none tabular-nums tracking-tight text-gray-900\">{formatTemp(w.temp)}</div>\n <div className=\"text-[10px] text-gray-500 tabular-nums mt-1\">H:{formatTemp(w.high)} L:{formatTemp(w.low)}</div>\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.d.ts
CHANGED
|
@@ -54,16 +54,12 @@ declare function Checkers$1(): react_jsx_runtime.JSX.Element;
|
|
|
54
54
|
declare function Chess$1(): react_jsx_runtime.JSX.Element;
|
|
55
55
|
|
|
56
56
|
/**
|
|
57
|
-
* World Clock widget —
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* via `useWidgetSettings` — there is no inline "+ Add World Clock"
|
|
64
|
-
* button. Translucency is applied as a background-color alpha on the
|
|
65
|
-
* outer panel (slate-900 base) so the row gradients stay vivid even at
|
|
66
|
-
* lower opacity.
|
|
57
|
+
* World Clock widget — multi-city list. Each row pairs a tiny analogue
|
|
58
|
+
* clock (minimal-style: ring, four cardinal dots, two hands) with the
|
|
59
|
+
* city's current weather. The weather emoji doubles as a day/night cue
|
|
60
|
+
* (☀ vs 🌙 for clear, the same icons for everything else). Reads the
|
|
61
|
+
* shared Open-Meteo cache so it doesn't re-hit the API when the Weather
|
|
62
|
+
* widget already has the data.
|
|
67
63
|
*/
|
|
68
64
|
declare function WorldClock$1(): react_jsx_runtime.JSX.Element;
|
|
69
65
|
|
package/dist/apps/index.js
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
export { openFilesInTrashMode } from '../chunk-
|
|
2
|
-
export { setPdfPreview } from '../chunk-
|
|
1
|
+
export { openFilesInTrashMode } from '../chunk-MTLVXT2C.js';
|
|
2
|
+
export { setPdfPreview } from '../chunk-DUUANLLE.js';
|
|
3
3
|
import '../chunk-KUIPWCTJ.js';
|
|
4
4
|
import '../chunk-WIJ45SYD.js';
|
|
5
|
-
import '../chunk-
|
|
5
|
+
import '../chunk-7M3BBAHQ.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-ZKEH53OV.js'));
|
|
10
|
+
var Spreadsheet = lazy(() => import('../Spreadsheet-MKXPPSKV.js'));
|
|
11
|
+
var Weather = lazy(() => import('../Weather-YXSCSPQT.js'));
|
|
12
|
+
var CurrencyConverter = lazy(() => import('../CurrencyConverter-TXBFDFG2.js'));
|
|
13
|
+
var PomodoroTimer = lazy(() => import('../PomodoroTimer-PRP5CZ3S.js'));
|
|
14
|
+
var Notepad = lazy(() => import('../Notepad-74CQPZCV.js'));
|
|
15
|
+
var WorldClock = lazy(() => import('../WorldClock-QO5PVJQQ.js'));
|
|
16
16
|
var Chess = lazy(() => import('../Chess-C5BY45NA.js'));
|
|
17
17
|
var Checkers = lazy(() => import('../Checkers-MIAHIKJH.js'));
|
|
18
18
|
var Sudoku = lazy(() => import('../Sudoku-XHLYCEVT.js'));
|
|
19
19
|
var Tetris = lazy(() => import('../Tetris-ZHCZYL24.js'));
|
|
20
20
|
var Game2048 = lazy(() => import('../Game2048-3RH3ELRD.js'));
|
|
21
|
-
var Minesweeper = lazy(() => import('../Minesweeper-
|
|
22
|
-
var Email = lazy(() => import('../Email-
|
|
21
|
+
var Minesweeper = lazy(() => import('../Minesweeper-QGUPDVRS.js'));
|
|
22
|
+
var Email = lazy(() => import('../Email-HRBZUWPY.js'));
|
|
23
23
|
var GeminiChat = lazy(() => import('../GeminiChat-ITU46EH4.js'));
|
|
24
|
-
var Calendar = lazy(() => import('../Calendar-
|
|
25
|
-
var Preview = lazy(() => import('../Preview-
|
|
26
|
-
var Documents = lazy(() => import('../Documents-
|
|
27
|
-
var Files = lazy(() => import('../Files-
|
|
28
|
-
var Browser = lazy(() => import('../Browser-
|
|
24
|
+
var Calendar = lazy(() => import('../Calendar-4UQDQ3NT.js'));
|
|
25
|
+
var Preview = lazy(() => import('../Preview-4MBQI66Q.js'));
|
|
26
|
+
var Documents = lazy(() => import('../Documents-CQVIIFZV.js'));
|
|
27
|
+
var Files = lazy(() => import('../Files-ITIKVHIE.js'));
|
|
28
|
+
var Browser = lazy(() => import('../Browser-LSJORULM.js'));
|
|
29
29
|
var utilityApps = {
|
|
30
30
|
"/calculator": { component: Calculator, label: "Calculator", size: "sm", allowPinOnTop: true, utility: true, widget: true, autoHeight: true, dimensions: [280, 420] },
|
|
31
31
|
"/spreadsheet": { component: Spreadsheet, label: "Spreadsheets", size: "2xl", appStyle: true, multiInstance: true },
|
|
32
32
|
"/notepad": { component: Notepad, label: "Notepad", size: "lg", allowPinOnTop: true },
|
|
33
33
|
"/weather": { component: Weather, label: "Weather", size: "sm", utility: true, widget: true, autoHeight: true, dimensions: [320, 400] },
|
|
34
34
|
"/currency": { component: CurrencyConverter, label: "Currency Converter", size: "sm", utility: true, widget: true, autoHeight: true, dimensions: [320, 480] },
|
|
35
|
-
"/pomodoro": { component: PomodoroTimer, label: "Pomodoro Timer", size: "sm", utility: true, widget: true, autoHeight: true, dimensions: [320,
|
|
35
|
+
"/pomodoro": { component: PomodoroTimer, label: "Pomodoro Timer", size: "sm", utility: true, widget: true, autoHeight: true, dimensions: [320, 600] },
|
|
36
36
|
"/world-clock": { component: WorldClock, label: "World Clock", size: "sm", utility: true, widget: true, autoHeight: true, dimensions: [320, 480] }
|
|
37
37
|
};
|
|
38
38
|
var gameApps = {
|
package/dist/apps/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/apps/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Bundled apps — pre-built window registry entries for the 16 apps that ship\n * with `react-os-shell`. Consumers compose them into their own registry via\n * `createWindowRegistry`:\n *\n * import { createWindowRegistry } from 'react-os-shell';\n * import { bundledApps } from 'react-os-shell/apps';\n * import { erpEntities } from './shell-config';\n *\n * const windows = createWindowRegistry(bundledApps, erpEntities);\n *\n * Subsets are also exported (`utilityApps`, `gameApps`, `googleApps`) so a\n * consumer can pick-and-choose without importing every component.\n *\n * NOTE: 3 apps require consumer-supplied persistence (Calendar / Notepad for\n * stored content, Minesweeper for leaderboard). They're exported individually\n * but absent from `bundledApps` — wire the prefs provider to opt them in.\n * WorldClock uses `useShellPrefs()` so it lives in `bundledApps`; without a\n * consumer-supplied prefs adapter the city list won't survive a reload.\n */\nimport { lazy } from 'react';\nimport type { WindowRegistry } from '../windowRegistry/types';\n\n// ── Utility apps ──\nconst Calculator = lazy(() => import('./Calculator'));\nconst Spreadsheet = lazy(() => import('./Spreadsheet'));\nconst Weather = lazy(() => import('./Weather'));\nconst CurrencyConverter = lazy(() => import('./CurrencyConverter'));\nconst PomodoroTimer = lazy(() => import('./PomodoroTimer'));\nconst Notepad = lazy(() => import('./Notepad'));\nconst WorldClock = lazy(() => import('./WorldClock'));\n\n// ── Games ──\nconst Chess = lazy(() => import('./Chess'));\nconst Checkers = lazy(() => import('./Checkers'));\nconst Sudoku = lazy(() => import('./Sudoku'));\nconst Tetris = lazy(() => import('./Tetris'));\nconst Game2048 = lazy(() => import('./Game2048'));\nconst Minesweeper = lazy(() => import('./Minesweeper'));\n\n// ── Google apps ──\nconst Email = lazy(() => import('./Email'));\nconst GeminiChat = lazy(() => import('./GeminiChat'));\nconst Calendar = lazy(() => import('./Calendar'));\n\n// ── Document apps ──\nconst Preview = lazy(() => import('./Preview'));\nconst Documents = lazy(() => import('./Documents'));\nconst Files = lazy(() => import('./Files'));\n\n// ── Web ──\nconst Browser = lazy(() => import('./Browser'));\n\nexport const utilityApps: WindowRegistry = {\n '/calculator': { component: Calculator, label: 'Calculator', size: 'sm', allowPinOnTop: true, utility: true, widget: true, autoHeight: true, dimensions: [280, 420] },\n '/spreadsheet': { component: Spreadsheet, label: 'Spreadsheets', size: '2xl', appStyle: true, multiInstance: true },\n '/notepad': { component: Notepad, label: 'Notepad', size: 'lg', allowPinOnTop: true },\n '/weather': { component: Weather, label: 'Weather', size: 'sm', utility: true, widget: true, autoHeight: true, dimensions: [320, 400] },\n '/currency': { component: CurrencyConverter, label: 'Currency Converter', size: 'sm', utility: true, widget: true, autoHeight: true, dimensions: [320, 480] },\n '/pomodoro': { component: PomodoroTimer, label: 'Pomodoro Timer', size: 'sm', utility: true, widget: true, autoHeight: true, dimensions: [320,
|
|
1
|
+
{"version":3,"sources":["../../src/apps/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Bundled apps — pre-built window registry entries for the 16 apps that ship\n * with `react-os-shell`. Consumers compose them into their own registry via\n * `createWindowRegistry`:\n *\n * import { createWindowRegistry } from 'react-os-shell';\n * import { bundledApps } from 'react-os-shell/apps';\n * import { erpEntities } from './shell-config';\n *\n * const windows = createWindowRegistry(bundledApps, erpEntities);\n *\n * Subsets are also exported (`utilityApps`, `gameApps`, `googleApps`) so a\n * consumer can pick-and-choose without importing every component.\n *\n * NOTE: 3 apps require consumer-supplied persistence (Calendar / Notepad for\n * stored content, Minesweeper for leaderboard). They're exported individually\n * but absent from `bundledApps` — wire the prefs provider to opt them in.\n * WorldClock uses `useShellPrefs()` so it lives in `bundledApps`; without a\n * consumer-supplied prefs adapter the city list won't survive a reload.\n */\nimport { lazy } from 'react';\nimport type { WindowRegistry } from '../windowRegistry/types';\n\n// ── Utility apps ──\nconst Calculator = lazy(() => import('./Calculator'));\nconst Spreadsheet = lazy(() => import('./Spreadsheet'));\nconst Weather = lazy(() => import('./Weather'));\nconst CurrencyConverter = lazy(() => import('./CurrencyConverter'));\nconst PomodoroTimer = lazy(() => import('./PomodoroTimer'));\nconst Notepad = lazy(() => import('./Notepad'));\nconst WorldClock = lazy(() => import('./WorldClock'));\n\n// ── Games ──\nconst Chess = lazy(() => import('./Chess'));\nconst Checkers = lazy(() => import('./Checkers'));\nconst Sudoku = lazy(() => import('./Sudoku'));\nconst Tetris = lazy(() => import('./Tetris'));\nconst Game2048 = lazy(() => import('./Game2048'));\nconst Minesweeper = lazy(() => import('./Minesweeper'));\n\n// ── Google apps ──\nconst Email = lazy(() => import('./Email'));\nconst GeminiChat = lazy(() => import('./GeminiChat'));\nconst Calendar = lazy(() => import('./Calendar'));\n\n// ── Document apps ──\nconst Preview = lazy(() => import('./Preview'));\nconst Documents = lazy(() => import('./Documents'));\nconst Files = lazy(() => import('./Files'));\n\n// ── Web ──\nconst Browser = lazy(() => import('./Browser'));\n\nexport const utilityApps: WindowRegistry = {\n '/calculator': { component: Calculator, label: 'Calculator', size: 'sm', allowPinOnTop: true, utility: true, widget: true, autoHeight: true, dimensions: [280, 420] },\n '/spreadsheet': { component: Spreadsheet, label: 'Spreadsheets', size: '2xl', appStyle: true, multiInstance: true },\n '/notepad': { component: Notepad, label: 'Notepad', size: 'lg', allowPinOnTop: true },\n '/weather': { component: Weather, label: 'Weather', size: 'sm', utility: true, widget: true, autoHeight: true, dimensions: [320, 400] },\n '/currency': { component: CurrencyConverter, label: 'Currency Converter', size: 'sm', utility: true, widget: true, autoHeight: true, dimensions: [320, 480] },\n '/pomodoro': { component: PomodoroTimer, label: 'Pomodoro Timer', size: 'sm', utility: true, widget: true, autoHeight: true, dimensions: [320, 600] },\n '/world-clock': { component: WorldClock, label: 'World Clock', size: 'sm', utility: true, widget: true, autoHeight: true, dimensions: [320, 480] },\n};\n\nexport const gameApps: WindowRegistry = {\n '/chess': { component: Chess, label: 'Chess', size: 'lg', compact: true },\n '/checkers': { component: Checkers, label: 'Checkers', size: 'lg', compact: true },\n '/sudoku': { component: Sudoku, label: 'Sudoku', size: 'sm', compact: true, dimensions: [360, 535] },\n '/tetris': { component: Tetris, label: 'Tetris', size: 'md', compact: true, dimensions: [452, 618] },\n '/2048': { component: Game2048, label: '2048', size: 'sm', compact: true },\n '/minesweeper': { component: Minesweeper, label: 'Minesweeper', size: 'sm', compact: true },\n};\n\nexport const googleApps: WindowRegistry = {\n '/email': { component: Email, label: 'Email', size: '2xl', appStyle: true },\n '/gemini': { component: GeminiChat, label: 'Gemini AI', size: 'lg' },\n '/calendar': { component: Calendar, label: 'Calendar', size: 'xl' },\n};\n\nexport const documentApps: WindowRegistry = {\n '/preview': { component: Preview, label: 'Preview', size: '2xl', appStyle: true, multiInstance: true },\n '/documents': { component: Documents, label: 'Documents', size: 'xl', appStyle: true, multiInstance: true },\n '/files': { component: Files, label: 'Files', size: 'xl', appStyle: true },\n};\n\nexport const webApps: WindowRegistry = {\n '/browser': { component: Browser, label: 'Browser', size: '2xl', appStyle: true, multiInstance: true },\n};\n\nexport const bundledApps: WindowRegistry = {\n ...utilityApps,\n ...gameApps,\n ...googleApps,\n ...documentApps,\n ...webApps,\n};\n\nexport {\n Calculator,\n Spreadsheet,\n Notepad,\n Weather,\n CurrencyConverter,\n PomodoroTimer,\n WorldClock,\n Chess,\n Checkers,\n Sudoku,\n Tetris,\n Game2048,\n Minesweeper,\n Email,\n GeminiChat,\n Calendar,\n Preview,\n Documents,\n Files,\n Browser,\n};\n\nexport { setPdfPreview } from './Preview';\nexport { openFilesInTrashMode } from './Files';\nexport type { PdfPreviewData } from './Preview';\n"]}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// src/apps/_weatherData.ts
|
|
2
|
+
var WMO = {
|
|
3
|
+
0: ["Clear Sky", "\u2600\uFE0F", "\u{1F319}", "from-sky-400 to-blue-500", "from-indigo-900 to-slate-950"],
|
|
4
|
+
1: ["Mainly Clear", "\u{1F324}\uFE0F", "\u{1F319}", "from-sky-400 to-blue-500", "from-indigo-900 to-slate-950"],
|
|
5
|
+
2: ["Partly Cloudy", "\u26C5", "\u2601\uFE0F", "from-sky-400 to-blue-400", "from-indigo-800 to-slate-900"],
|
|
6
|
+
3: ["Overcast", "\u2601\uFE0F", "\u2601\uFE0F", "from-gray-400 to-gray-500", "from-gray-700 to-slate-900"],
|
|
7
|
+
45: ["Foggy", "\u{1F32B}\uFE0F", "\u{1F32B}\uFE0F", "from-gray-400 to-gray-500", "from-gray-700 to-slate-800"],
|
|
8
|
+
48: ["Foggy", "\u{1F32B}\uFE0F", "\u{1F32B}\uFE0F", "from-gray-400 to-gray-500", "from-gray-700 to-slate-800"],
|
|
9
|
+
51: ["Light Drizzle", "\u{1F326}\uFE0F", "\u{1F327}\uFE0F", "from-gray-400 to-blue-500", "from-gray-700 to-indigo-900"],
|
|
10
|
+
53: ["Drizzle", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-500 to-blue-600", "from-gray-700 to-indigo-900"],
|
|
11
|
+
55: ["Heavy Drizzle", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-500 to-blue-600", "from-gray-700 to-indigo-900"],
|
|
12
|
+
61: ["Light Rain", "\u{1F326}\uFE0F", "\u{1F327}\uFE0F", "from-gray-400 to-blue-500", "from-gray-700 to-indigo-900"],
|
|
13
|
+
63: ["Rain", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-500 to-blue-600", "from-gray-700 to-indigo-900"],
|
|
14
|
+
65: ["Heavy Rain", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-600 to-blue-700", "from-gray-700 to-indigo-950"],
|
|
15
|
+
71: ["Light Snow", "\u{1F328}\uFE0F", "\u{1F328}\uFE0F", "from-blue-200 to-blue-400", "from-blue-800 to-slate-900"],
|
|
16
|
+
73: ["Snow", "\u2744\uFE0F", "\u2744\uFE0F", "from-blue-300 to-blue-500", "from-blue-800 to-slate-900"],
|
|
17
|
+
75: ["Heavy Snow", "\u2744\uFE0F", "\u2744\uFE0F", "from-blue-400 to-blue-600", "from-blue-800 to-slate-900"],
|
|
18
|
+
80: ["Rain Showers", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-500 to-blue-600", "from-gray-700 to-indigo-900"],
|
|
19
|
+
82: ["Heavy Showers", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-600 to-blue-700", "from-gray-700 to-indigo-950"],
|
|
20
|
+
95: ["Thunderstorm", "\u26C8\uFE0F", "\u26C8\uFE0F", "from-gray-700 to-indigo-800", "from-gray-800 to-indigo-950"],
|
|
21
|
+
96: ["Thunderstorm", "\u26C8\uFE0F", "\u26C8\uFE0F", "from-gray-700 to-indigo-800", "from-gray-800 to-indigo-950"],
|
|
22
|
+
99: ["Thunderstorm", "\u26C8\uFE0F", "\u26C8\uFE0F", "from-gray-700 to-indigo-900", "from-gray-800 to-indigo-950"]
|
|
23
|
+
};
|
|
24
|
+
var getCondition = (code, isDay = true) => {
|
|
25
|
+
const entry = WMO[code] || ["Unknown", "\u2753", "\u2753", "from-gray-400 to-gray-500", "from-gray-700 to-slate-800"];
|
|
26
|
+
return [entry[0], isDay ? entry[1] : entry[2], isDay ? entry[3] : entry[4]];
|
|
27
|
+
};
|
|
28
|
+
var AVAILABLE_CITIES = {
|
|
29
|
+
"Sydney": { lat: -33.8688, lon: 151.2093, tz: "Australia/Sydney" },
|
|
30
|
+
"Melbourne": { lat: -37.8136, lon: 144.9631, tz: "Australia/Melbourne" },
|
|
31
|
+
"Auckland": { lat: -36.8485, lon: 174.7633, tz: "Pacific/Auckland" },
|
|
32
|
+
"Tokyo": { lat: 35.6762, lon: 139.6503, tz: "Asia/Tokyo" },
|
|
33
|
+
"Shanghai": { lat: 31.2304, lon: 121.4737, tz: "Asia/Shanghai" },
|
|
34
|
+
"Hong Kong": { lat: 22.3193, lon: 114.1694, tz: "Asia/Hong_Kong" },
|
|
35
|
+
"Singapore": { lat: 1.3521, lon: 103.8198, tz: "Asia/Singapore" },
|
|
36
|
+
"Bangkok": { lat: 13.7563, lon: 100.5018, tz: "Asia/Bangkok" },
|
|
37
|
+
"Mumbai": { lat: 19.076, lon: 72.8777, tz: "Asia/Kolkata" },
|
|
38
|
+
"Dubai": { lat: 25.2048, lon: 55.2708, tz: "Asia/Dubai" },
|
|
39
|
+
"Berlin": { lat: 52.52, lon: 13.405, tz: "Europe/Berlin" },
|
|
40
|
+
"Paris": { lat: 48.8566, lon: 2.3522, tz: "Europe/Paris" },
|
|
41
|
+
"London": { lat: 51.5074, lon: -0.1278, tz: "Europe/London" },
|
|
42
|
+
"New York": { lat: 40.7128, lon: -74.006, tz: "America/New_York" },
|
|
43
|
+
"Miami": { lat: 25.7617, lon: -80.1918, tz: "America/New_York" },
|
|
44
|
+
"Toronto": { lat: 43.6532, lon: -79.3832, tz: "America/Toronto" },
|
|
45
|
+
"Chicago": { lat: 41.8781, lon: -87.6298, tz: "America/Chicago" },
|
|
46
|
+
"Los Angeles": { lat: 34.0522, lon: -118.2437, tz: "America/Los_Angeles" }
|
|
47
|
+
};
|
|
48
|
+
var WEATHER_CACHE_KEY = "weather_local_cache";
|
|
49
|
+
var WEATHER_CACHE_TTL = 30 * 60 * 1e3;
|
|
50
|
+
function readCache() {
|
|
51
|
+
try {
|
|
52
|
+
return JSON.parse(localStorage.getItem(WEATHER_CACHE_KEY) || "{}");
|
|
53
|
+
} catch {
|
|
54
|
+
return {};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function writeCache(c) {
|
|
58
|
+
try {
|
|
59
|
+
localStorage.setItem(WEATHER_CACHE_KEY, JSON.stringify(c));
|
|
60
|
+
} catch {
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function fetchCityWeather(cityName, force = false) {
|
|
64
|
+
const coords = AVAILABLE_CITIES[cityName];
|
|
65
|
+
if (!coords) return null;
|
|
66
|
+
if (!force) {
|
|
67
|
+
const cached = readCache()[cityName];
|
|
68
|
+
if (cached && Date.now() - cached.ts < WEATHER_CACHE_TTL) return cached.data;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const res = await fetch(`https://api.open-meteo.com/v1/forecast?latitude=${coords.lat}&longitude=${coords.lon}¤t=temperature_2m,weather_code,is_day&daily=temperature_2m_max,temperature_2m_min&forecast_days=1&timezone=auto`);
|
|
72
|
+
const w = await res.json();
|
|
73
|
+
const cw = {
|
|
74
|
+
city: cityName,
|
|
75
|
+
temp: Math.round(w.current.temperature_2m),
|
|
76
|
+
code: w.current.weather_code,
|
|
77
|
+
high: Math.round(w.daily.temperature_2m_max[0]),
|
|
78
|
+
low: Math.round(w.daily.temperature_2m_min[0]),
|
|
79
|
+
isDay: w.current.is_day === 1,
|
|
80
|
+
timezone: w.timezone || "UTC"
|
|
81
|
+
};
|
|
82
|
+
const c = readCache();
|
|
83
|
+
c[cityName] = { data: cw, ts: Date.now() };
|
|
84
|
+
writeCache(c);
|
|
85
|
+
return cw;
|
|
86
|
+
} catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
var toFahrenheit = (c) => Math.round(c * 9 / 5 + 32);
|
|
91
|
+
|
|
92
|
+
export { AVAILABLE_CITIES, fetchCityWeather, getCondition, toFahrenheit };
|
|
93
|
+
//# sourceMappingURL=chunk-7CCHEEYC.js.map
|
|
94
|
+
//# sourceMappingURL=chunk-7CCHEEYC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/apps/_weatherData.ts"],"names":[],"mappings":";AASO,IAAM,GAAA,GAAgE;AAAA,EAC3E,GAAG,CAAC,WAAA,EAAa,cAAA,EAAM,WAAA,EAAM,4BAA4B,8BAA8B,CAAA;AAAA,EACvF,GAAG,CAAC,cAAA,EAAgB,iBAAA,EAAO,WAAA,EAAM,4BAA4B,8BAA8B,CAAA;AAAA,EAC3F,GAAG,CAAC,eAAA,EAAiB,QAAA,EAAK,cAAA,EAAM,4BAA4B,8BAA8B,CAAA;AAAA,EAC1F,GAAG,CAAC,UAAA,EAAY,cAAA,EAAM,cAAA,EAAM,6BAA6B,4BAA4B,CAAA;AAAA,EACrF,IAAI,CAAC,OAAA,EAAS,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,4BAA4B,CAAA;AAAA,EACrF,IAAI,CAAC,OAAA,EAAS,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,4BAA4B,CAAA;AAAA,EACrF,IAAI,CAAC,eAAA,EAAiB,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EAC9F,IAAI,CAAC,SAAA,EAAW,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EACxF,IAAI,CAAC,eAAA,EAAiB,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EAC9F,IAAI,CAAC,YAAA,EAAc,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EAC3F,IAAI,CAAC,MAAA,EAAQ,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EACrF,IAAI,CAAC,YAAA,EAAc,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EAC3F,IAAI,CAAC,YAAA,EAAc,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,4BAA4B,CAAA;AAAA,EAC1F,IAAI,CAAC,MAAA,EAAQ,cAAA,EAAM,cAAA,EAAM,6BAA6B,4BAA4B,CAAA;AAAA,EAClF,IAAI,CAAC,YAAA,EAAc,cAAA,EAAM,cAAA,EAAM,6BAA6B,4BAA4B,CAAA;AAAA,EACxF,IAAI,CAAC,cAAA,EAAgB,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EAC7F,IAAI,CAAC,eAAA,EAAiB,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EAC9F,IAAI,CAAC,cAAA,EAAgB,cAAA,EAAM,cAAA,EAAM,+BAA+B,6BAA6B,CAAA;AAAA,EAC7F,IAAI,CAAC,cAAA,EAAgB,cAAA,EAAM,cAAA,EAAM,+BAA+B,6BAA6B,CAAA;AAAA,EAC7F,IAAI,CAAC,cAAA,EAAgB,cAAA,EAAM,cAAA,EAAM,+BAA+B,6BAA6B;AAC/F,CAAA;AAEO,IAAM,YAAA,GAAe,CAAC,IAAA,EAAc,KAAA,GAAQ,IAAA,KAAmC;AACpF,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAI,CAAA,IAAK,CAAC,SAAA,EAAW,QAAA,EAAK,QAAA,EAAK,2BAAA,EAA6B,4BAA4B,CAAA;AAC1G,EAAA,OAAO,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,GAAQ,MAAM,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,GAAG,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAC5E;AAEO,IAAM,gBAAA,GAA6E;AAAA,EACxF,UAAgB,EAAE,GAAA,EAAK,UAAU,GAAA,EAAK,QAAA,EAAU,IAAI,kBAAA,EAAmB;AAAA,EACvE,aAAgB,EAAE,GAAA,EAAK,UAAU,GAAA,EAAK,QAAA,EAAU,IAAI,qBAAA,EAAsB;AAAA,EAC1E,YAAgB,EAAE,GAAA,EAAK,UAAU,GAAA,EAAK,QAAA,EAAU,IAAI,kBAAA,EAAmB;AAAA,EACvE,SAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,QAAA,EAAU,IAAI,YAAA,EAAa;AAAA,EACjE,YAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,QAAA,EAAU,IAAI,eAAA,EAAgB;AAAA,EACpE,aAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,QAAA,EAAU,IAAI,gBAAA,EAAiB;AAAA,EACrE,aAAgB,EAAE,GAAA,EAAK,QAAU,GAAA,EAAK,QAAA,EAAU,IAAI,gBAAA,EAAiB;AAAA,EACrE,WAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,QAAA,EAAU,IAAI,cAAA,EAAe;AAAA,EACnE,UAAgB,EAAE,GAAA,EAAK,QAAU,GAAA,EAAK,OAAA,EAAU,IAAI,cAAA,EAAe;AAAA,EACnE,SAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,OAAA,EAAU,IAAI,YAAA,EAAa;AAAA,EACjE,UAAgB,EAAE,GAAA,EAAK,OAAU,GAAA,EAAK,MAAA,EAAU,IAAI,eAAA,EAAgB;AAAA,EACpE,SAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,MAAA,EAAU,IAAI,cAAA,EAAe;AAAA,EACnE,UAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,OAAA,EAAU,IAAI,eAAA,EAAgB;AAAA,EACpE,YAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,OAAA,EAAU,IAAI,kBAAA,EAAmB;AAAA,EACvE,SAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,QAAA,EAAU,IAAI,kBAAA,EAAmB;AAAA,EACvE,WAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,QAAA,EAAU,IAAI,iBAAA,EAAkB;AAAA,EACtE,WAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,QAAA,EAAU,IAAI,iBAAA,EAAkB;AAAA,EACtE,eAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,SAAA,EAAW,IAAI,qBAAA;AACvD;AAEO,IAAM,iBAAA,GAAoB,qBAAA;AAC1B,IAAM,iBAAA,GAAoB,KAAK,EAAA,GAAK,GAAA;AAe3C,SAAS,SAAA,GAA0B;AACjC,EAAA,IAAI;AAAE,IAAA,OAAO,KAAK,KAAA,CAAM,YAAA,CAAa,OAAA,CAAQ,iBAAiB,KAAK,IAAI,CAAA;AAAA,EAAG,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,EAAC;AAAA,EAAG;AACjG;AACA,SAAS,WAAW,CAAA,EAAiB;AACnC,EAAA,IAAI;AAAE,IAAA,YAAA,CAAa,OAAA,CAAQ,iBAAA,EAAmB,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,EAAG,CAAA,CAAA,MAAQ;AAAA,EAAC;AAC7E;AAIA,eAAsB,gBAAA,CAAiB,QAAA,EAAkB,KAAA,GAAQ,KAAA,EAAoC;AACnG,EAAA,MAAM,MAAA,GAAS,iBAAiB,QAAQ,CAAA;AACxC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,MAAA,GAAS,SAAA,EAAU,CAAE,QAAQ,CAAA;AACnC,IAAA,IAAI,MAAA,IAAU,KAAK,GAAA,EAAI,GAAI,OAAO,EAAA,GAAK,iBAAA,SAA0B,MAAA,CAAO,IAAA;AAAA,EAC1E;AACA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,gDAAA,EAAmD,OAAO,GAAG,CAAA,WAAA,EAAc,MAAA,CAAO,GAAG,CAAA,qHAAA,CAAuH,CAAA;AACpO,IAAA,MAAM,CAAA,GAAI,MAAM,GAAA,CAAI,IAAA,EAAK;AACzB,IAAA,MAAM,EAAA,GAAkB;AAAA,MACtB,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,QAAQ,cAAc,CAAA;AAAA,MACzC,IAAA,EAAM,EAAE,OAAA,CAAQ,YAAA;AAAA,MAChB,MAAM,IAAA,CAAK,KAAA,CAAM,EAAE,KAAA,CAAM,kBAAA,CAAmB,CAAC,CAAC,CAAA;AAAA,MAC9C,KAAK,IAAA,CAAK,KAAA,CAAM,EAAE,KAAA,CAAM,kBAAA,CAAmB,CAAC,CAAC,CAAA;AAAA,MAC7C,KAAA,EAAO,CAAA,CAAE,OAAA,CAAQ,MAAA,KAAW,CAAA;AAAA,MAC5B,QAAA,EAAU,EAAE,QAAA,IAAY;AAAA,KAC1B;AACA,IAAA,MAAM,IAAI,SAAA,EAAU;AACpB,IAAA,CAAA,CAAE,QAAQ,IAAI,EAAE,IAAA,EAAM,IAAI,EAAA,EAAI,IAAA,CAAK,KAAI,EAAE;AACzC,IAAA,UAAA,CAAW,CAAC,CAAA;AACZ,IAAA,OAAO,EAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,IAAM,YAAA,GAAe,CAAC,CAAA,KAAc,IAAA,CAAK,MAAM,CAAA,GAAI,CAAA,GAAI,IAAI,EAAE","file":"chunk-7CCHEEYC.js","sourcesContent":["/**\n * Shared weather data — used by Weather (single-city tile with animations)\n * and WorldClock (multi-city list with per-row weather + day/night via the\n * emoji). Single source of truth for the WMO code map, the supported city\n * coordinates, and the localStorage cache so both widgets share fetched\n * data.\n */\n\n// [condition, day emoji, night emoji, day gradient, night gradient]\nexport const WMO: Record<number, [string, string, string, string, string]> = {\n 0: ['Clear Sky', '☀️', '🌙', 'from-sky-400 to-blue-500', 'from-indigo-900 to-slate-950'],\n 1: ['Mainly Clear', '🌤️', '🌙', 'from-sky-400 to-blue-500', 'from-indigo-900 to-slate-950'],\n 2: ['Partly Cloudy', '⛅', '☁️', 'from-sky-400 to-blue-400', 'from-indigo-800 to-slate-900'],\n 3: ['Overcast', '☁️', '☁️', 'from-gray-400 to-gray-500', 'from-gray-700 to-slate-900'],\n 45: ['Foggy', '🌫️', '🌫️', 'from-gray-400 to-gray-500', 'from-gray-700 to-slate-800'],\n 48: ['Foggy', '🌫️', '🌫️', 'from-gray-400 to-gray-500', 'from-gray-700 to-slate-800'],\n 51: ['Light Drizzle', '🌦️', '🌧️', 'from-gray-400 to-blue-500', 'from-gray-700 to-indigo-900'],\n 53: ['Drizzle', '🌧️', '🌧️', 'from-gray-500 to-blue-600', 'from-gray-700 to-indigo-900'],\n 55: ['Heavy Drizzle', '🌧️', '🌧️', 'from-gray-500 to-blue-600', 'from-gray-700 to-indigo-900'],\n 61: ['Light Rain', '🌦️', '🌧️', 'from-gray-400 to-blue-500', 'from-gray-700 to-indigo-900'],\n 63: ['Rain', '🌧️', '🌧️', 'from-gray-500 to-blue-600', 'from-gray-700 to-indigo-900'],\n 65: ['Heavy Rain', '🌧️', '🌧️', 'from-gray-600 to-blue-700', 'from-gray-700 to-indigo-950'],\n 71: ['Light Snow', '🌨️', '🌨️', 'from-blue-200 to-blue-400', 'from-blue-800 to-slate-900'],\n 73: ['Snow', '❄️', '❄️', 'from-blue-300 to-blue-500', 'from-blue-800 to-slate-900'],\n 75: ['Heavy Snow', '❄️', '❄️', 'from-blue-400 to-blue-600', 'from-blue-800 to-slate-900'],\n 80: ['Rain Showers', '🌧️', '🌧️', 'from-gray-500 to-blue-600', 'from-gray-700 to-indigo-900'],\n 82: ['Heavy Showers', '🌧️', '🌧️', 'from-gray-600 to-blue-700', 'from-gray-700 to-indigo-950'],\n 95: ['Thunderstorm', '⛈️', '⛈️', 'from-gray-700 to-indigo-800', 'from-gray-800 to-indigo-950'],\n 96: ['Thunderstorm', '⛈️', '⛈️', 'from-gray-700 to-indigo-800', 'from-gray-800 to-indigo-950'],\n 99: ['Thunderstorm', '⛈️', '⛈️', 'from-gray-700 to-indigo-900', 'from-gray-800 to-indigo-950'],\n};\n\nexport const getCondition = (code: number, isDay = true): [string, string, string] => {\n const entry = WMO[code] || ['Unknown', '❓', '❓', 'from-gray-400 to-gray-500', 'from-gray-700 to-slate-800'];\n return [entry[0], isDay ? entry[1] : entry[2], isDay ? entry[3] : entry[4]];\n};\n\nexport const AVAILABLE_CITIES: Record<string, { lat: number; lon: number; tz: string }> = {\n 'Sydney': { lat: -33.8688, lon: 151.2093, tz: 'Australia/Sydney' },\n 'Melbourne': { lat: -37.8136, lon: 144.9631, tz: 'Australia/Melbourne' },\n 'Auckland': { lat: -36.8485, lon: 174.7633, tz: 'Pacific/Auckland' },\n 'Tokyo': { lat: 35.6762, lon: 139.6503, tz: 'Asia/Tokyo' },\n 'Shanghai': { lat: 31.2304, lon: 121.4737, tz: 'Asia/Shanghai' },\n 'Hong Kong': { lat: 22.3193, lon: 114.1694, tz: 'Asia/Hong_Kong' },\n 'Singapore': { lat: 1.3521, lon: 103.8198, tz: 'Asia/Singapore' },\n 'Bangkok': { lat: 13.7563, lon: 100.5018, tz: 'Asia/Bangkok' },\n 'Mumbai': { lat: 19.0760, lon: 72.8777, tz: 'Asia/Kolkata' },\n 'Dubai': { lat: 25.2048, lon: 55.2708, tz: 'Asia/Dubai' },\n 'Berlin': { lat: 52.5200, lon: 13.4050, tz: 'Europe/Berlin' },\n 'Paris': { lat: 48.8566, lon: 2.3522, tz: 'Europe/Paris' },\n 'London': { lat: 51.5074, lon: -0.1278, tz: 'Europe/London' },\n 'New York': { lat: 40.7128, lon: -74.0060, tz: 'America/New_York' },\n 'Miami': { lat: 25.7617, lon: -80.1918, tz: 'America/New_York' },\n 'Toronto': { lat: 43.6532, lon: -79.3832, tz: 'America/Toronto' },\n 'Chicago': { lat: 41.8781, lon: -87.6298, tz: 'America/Chicago' },\n 'Los Angeles': { lat: 34.0522, lon: -118.2437, tz: 'America/Los_Angeles' },\n};\n\nexport const WEATHER_CACHE_KEY = 'weather_local_cache';\nexport const WEATHER_CACHE_TTL = 30 * 60 * 1000;\n\nexport interface CityWeather {\n city: string;\n temp: number;\n code: number;\n high: number;\n low: number;\n isDay: boolean;\n timezone: string;\n}\n\nexport interface WeatherCacheEntry { data: CityWeather; ts: number }\ntype WeatherCache = Record<string, WeatherCacheEntry>;\n\nfunction readCache(): WeatherCache {\n try { return JSON.parse(localStorage.getItem(WEATHER_CACHE_KEY) || '{}'); } catch { return {}; }\n}\nfunction writeCache(c: WeatherCache) {\n try { localStorage.setItem(WEATHER_CACHE_KEY, JSON.stringify(c)); } catch {}\n}\n\n/** Fetch a city's current weather + today's high/low, with a 30-min\n * localStorage cache shared across widgets. */\nexport async function fetchCityWeather(cityName: string, force = false): Promise<CityWeather | null> {\n const coords = AVAILABLE_CITIES[cityName];\n if (!coords) return null;\n if (!force) {\n const cached = readCache()[cityName];\n if (cached && Date.now() - cached.ts < WEATHER_CACHE_TTL) return cached.data;\n }\n try {\n const res = await fetch(`https://api.open-meteo.com/v1/forecast?latitude=${coords.lat}&longitude=${coords.lon}¤t=temperature_2m,weather_code,is_day&daily=temperature_2m_max,temperature_2m_min&forecast_days=1&timezone=auto`);\n const w = await res.json();\n const cw: CityWeather = {\n city: cityName,\n temp: Math.round(w.current.temperature_2m),\n code: w.current.weather_code,\n high: Math.round(w.daily.temperature_2m_max[0]),\n low: Math.round(w.daily.temperature_2m_min[0]),\n isDay: w.current.is_day === 1,\n timezone: w.timezone || 'UTC',\n };\n const c = readCache();\n c[cityName] = { data: cw, ts: Date.now() };\n writeCache(c);\n return cw;\n } catch {\n return null;\n }\n}\n\nexport const toFahrenheit = (c: number) => Math.round(c * 9 / 5 + 32);\n"]}
|
|
@@ -424,6 +424,11 @@ function _savePositionsDebounced() {
|
|
|
424
424
|
}
|
|
425
425
|
}, 500);
|
|
426
426
|
}
|
|
427
|
+
function setWindowDefaultPosition(key, pos) {
|
|
428
|
+
if (_windowPositions[key]) return;
|
|
429
|
+
_windowPositions[key] = pos;
|
|
430
|
+
_savePositionsDebounced();
|
|
431
|
+
}
|
|
427
432
|
var sizeDefaults = {
|
|
428
433
|
sm: 384,
|
|
429
434
|
md: 512,
|
|
@@ -2108,7 +2113,8 @@ function saveWindowState(windows) {
|
|
|
2108
2113
|
}
|
|
2109
2114
|
var DEFAULT_WIDGETS = [
|
|
2110
2115
|
{ id: "page:/weather", type: "page", label: "Weather", route: "/weather" },
|
|
2111
|
-
{ id: "page:/currency", type: "page", label: "Currency", route: "/currency" }
|
|
2116
|
+
{ id: "page:/currency", type: "page", label: "Currency Converter", route: "/currency" },
|
|
2117
|
+
{ id: "page:/world-clock", type: "page", label: "World Clock", route: "/world-clock" }
|
|
2112
2118
|
];
|
|
2113
2119
|
function restoreWindowState() {
|
|
2114
2120
|
try {
|
|
@@ -2253,6 +2259,6 @@ function WindowManagerProvider({ children }) {
|
|
|
2253
2259
|
] });
|
|
2254
2260
|
}
|
|
2255
2261
|
|
|
2256
|
-
export { CancelButton, CopyButton, DocFavStar, GLASS_DIVIDER, GLASS_INPUT_BG, LoadingSpinner, Modal, ModalActions, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, ThumbCard, WINDOW_REGISTRY, WindowManagerProvider, WindowTitle, activateModal, client_default, getActiveModalId, glassStyle, isEntityEntry, isPageEntry, isSection, navIcons, navSections, sectionIcons, setShellApiClient, setShellNavIcons, setShellWindowRegistry, startMenuCategories, useIsMobile, useModalActive, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle };
|
|
2257
|
-
//# sourceMappingURL=chunk-
|
|
2258
|
-
//# sourceMappingURL=chunk-
|
|
2262
|
+
export { CancelButton, CopyButton, DocFavStar, GLASS_DIVIDER, GLASS_INPUT_BG, LoadingSpinner, Modal, ModalActions, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, ThumbCard, WINDOW_REGISTRY, WindowManagerProvider, WindowTitle, activateModal, client_default, getActiveModalId, glassStyle, isEntityEntry, isPageEntry, isSection, navIcons, navSections, sectionIcons, setShellApiClient, setShellNavIcons, setShellWindowRegistry, setWindowDefaultPosition, startMenuCategories, useIsMobile, useModalActive, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle };
|
|
2263
|
+
//# sourceMappingURL=chunk-7M3BBAHQ.js.map
|
|
2264
|
+
//# sourceMappingURL=chunk-7M3BBAHQ.js.map
|