react-os-shell 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -0
  3. package/dist/Calculator-BNBRNV4P.js +184 -0
  4. package/dist/Calculator-BNBRNV4P.js.map +1 -0
  5. package/dist/Calendar-5EYUVGUU.js +423 -0
  6. package/dist/Calendar-5EYUVGUU.js.map +1 -0
  7. package/dist/Checkers-MIAHIKJH.js +214 -0
  8. package/dist/Checkers-MIAHIKJH.js.map +1 -0
  9. package/dist/Chess-C5BY45NA.js +190 -0
  10. package/dist/Chess-C5BY45NA.js.map +1 -0
  11. package/dist/ConfirmDialog-ZP4AHVUD.js +3 -0
  12. package/dist/ConfirmDialog-ZP4AHVUD.js.map +1 -0
  13. package/dist/CurrencyConverter-TYPU2IRF.js +223 -0
  14. package/dist/CurrencyConverter-TYPU2IRF.js.map +1 -0
  15. package/dist/Email-JEYYJ3YV.js +1835 -0
  16. package/dist/Email-JEYYJ3YV.js.map +1 -0
  17. package/dist/Game2048-3RH3ELRD.js +191 -0
  18. package/dist/Game2048-3RH3ELRD.js.map +1 -0
  19. package/dist/GeminiChat-BXLBJFT4.js +184 -0
  20. package/dist/GeminiChat-BXLBJFT4.js.map +1 -0
  21. package/dist/Minesweeper-VQGLAZON.js +270 -0
  22. package/dist/Minesweeper-VQGLAZON.js.map +1 -0
  23. package/dist/Notepad-YTZRCAXX.js +389 -0
  24. package/dist/Notepad-YTZRCAXX.js.map +1 -0
  25. package/dist/PomodoroTimer-HARIJN4S.js +196 -0
  26. package/dist/PomodoroTimer-HARIJN4S.js.map +1 -0
  27. package/dist/Spreadsheet-IOKEDNS6.js +446 -0
  28. package/dist/Spreadsheet-IOKEDNS6.js.map +1 -0
  29. package/dist/Sudoku-XHLYCEVT.js +197 -0
  30. package/dist/Sudoku-XHLYCEVT.js.map +1 -0
  31. package/dist/Tetris-ZHCZYL24.js +243 -0
  32. package/dist/Tetris-ZHCZYL24.js.map +1 -0
  33. package/dist/Weather-ROZ7TRNW.js +310 -0
  34. package/dist/Weather-ROZ7TRNW.js.map +1 -0
  35. package/dist/apps/index.d.ts +55 -0
  36. package/dist/apps/index.js +48 -0
  37. package/dist/apps/index.js.map +1 -0
  38. package/dist/chunk-5O2KEISQ.js +155 -0
  39. package/dist/chunk-5O2KEISQ.js.map +1 -0
  40. package/dist/chunk-D7PYW2QS.js +265 -0
  41. package/dist/chunk-D7PYW2QS.js.map +1 -0
  42. package/dist/chunk-GP4Y3VCB.js +806 -0
  43. package/dist/chunk-GP4Y3VCB.js.map +1 -0
  44. package/dist/chunk-NSU7OHPC.js +39 -0
  45. package/dist/chunk-NSU7OHPC.js.map +1 -0
  46. package/dist/chunk-PDFQNHW7.js +24 -0
  47. package/dist/chunk-PDFQNHW7.js.map +1 -0
  48. package/dist/chunk-RFTLYCSF.js +144 -0
  49. package/dist/chunk-RFTLYCSF.js.map +1 -0
  50. package/dist/chunk-SVBID2P6.js +142 -0
  51. package/dist/chunk-SVBID2P6.js.map +1 -0
  52. package/dist/chunk-TFGOLXGD.js +41 -0
  53. package/dist/chunk-TFGOLXGD.js.map +1 -0
  54. package/dist/chunk-WIJ45SYD.js +120 -0
  55. package/dist/chunk-WIJ45SYD.js.map +1 -0
  56. package/dist/chunk-WQIS72NL.js +1470 -0
  57. package/dist/chunk-WQIS72NL.js.map +1 -0
  58. package/dist/index.d.ts +642 -0
  59. package/dist/index.js +3443 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/sounds-NT4DEZGD.js +3 -0
  62. package/dist/sounds-NT4DEZGD.js.map +1 -0
  63. package/dist/styles.css +174 -0
  64. package/dist/types-CFIZ1_xt.d.ts +67 -0
  65. package/package.json +76 -0
@@ -0,0 +1,310 @@
1
+ import { loadAppearance, WidgetSettingsModal } from './chunk-SVBID2P6.js';
2
+ import { useWidgetSettings } from './chunk-WQIS72NL.js';
3
+ import './chunk-RFTLYCSF.js';
4
+ import { useState, useEffect, useCallback } from 'react';
5
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
+
7
+ var WMO = {
8
+ 0: ["Clear Sky", "\u2600\uFE0F", "\u{1F319}", "from-sky-400 to-blue-500", "from-indigo-800 to-slate-900"],
9
+ 1: ["Mainly Clear", "\u{1F324}\uFE0F", "\u{1F319}", "from-sky-400 to-blue-500", "from-indigo-800 to-slate-900"],
10
+ 2: ["Partly Cloudy", "\u26C5", "\u2601\uFE0F", "from-sky-400 to-blue-400", "from-indigo-700 to-slate-800"],
11
+ 3: ["Overcast", "\u2601\uFE0F", "\u2601\uFE0F", "from-gray-400 to-gray-500", "from-gray-700 to-slate-800"],
12
+ 45: ["Foggy", "\u{1F32B}\uFE0F", "\u{1F32B}\uFE0F", "from-gray-400 to-gray-500", "from-gray-700 to-slate-800"],
13
+ 48: ["Foggy", "\u{1F32B}\uFE0F", "\u{1F32B}\uFE0F", "from-gray-400 to-gray-500", "from-gray-700 to-slate-800"],
14
+ 51: ["Light Drizzle", "\u{1F326}\uFE0F", "\u{1F327}\uFE0F", "from-gray-400 to-blue-500", "from-gray-700 to-indigo-800"],
15
+ 53: ["Drizzle", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-500 to-blue-600", "from-gray-700 to-indigo-800"],
16
+ 55: ["Heavy Drizzle", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-500 to-blue-600", "from-gray-700 to-indigo-800"],
17
+ 61: ["Light Rain", "\u{1F326}\uFE0F", "\u{1F327}\uFE0F", "from-gray-400 to-blue-500", "from-gray-700 to-indigo-800"],
18
+ 63: ["Rain", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-500 to-blue-600", "from-gray-700 to-indigo-800"],
19
+ 65: ["Heavy Rain", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-600 to-blue-700", "from-gray-700 to-indigo-900"],
20
+ 71: ["Light Snow", "\u{1F328}\uFE0F", "\u{1F328}\uFE0F", "from-blue-200 to-blue-400", "from-blue-800 to-slate-900"],
21
+ 73: ["Snow", "\u2744\uFE0F", "\u2744\uFE0F", "from-blue-300 to-blue-500", "from-blue-800 to-slate-900"],
22
+ 75: ["Heavy Snow", "\u2744\uFE0F", "\u2744\uFE0F", "from-blue-400 to-blue-600", "from-blue-800 to-slate-900"],
23
+ 80: ["Rain Showers", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-500 to-blue-600", "from-gray-700 to-indigo-800"],
24
+ 82: ["Heavy Showers", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-600 to-blue-700", "from-gray-700 to-indigo-900"],
25
+ 95: ["Thunderstorm", "\u26C8\uFE0F", "\u26C8\uFE0F", "from-gray-700 to-indigo-800", "from-gray-800 to-indigo-950"],
26
+ 96: ["Thunderstorm", "\u26C8\uFE0F", "\u26C8\uFE0F", "from-gray-700 to-indigo-800", "from-gray-800 to-indigo-950"],
27
+ 99: ["Thunderstorm", "\u26C8\uFE0F", "\u26C8\uFE0F", "from-gray-700 to-indigo-900", "from-gray-800 to-indigo-950"]
28
+ };
29
+ var getCondition = (code, isDay = true) => {
30
+ const entry = WMO[code] || ["Unknown", "\u2753", "\u2753", "from-gray-400 to-gray-500", "from-gray-700 to-slate-800"];
31
+ return [entry[0], isDay ? entry[1] : entry[2], isDay ? entry[3] : entry[4]];
32
+ };
33
+ var AVAILABLE_CITIES = {
34
+ "Sydney": { lat: -33.8688, lon: 151.2093 },
35
+ "London": { lat: 51.5074, lon: -0.1278 },
36
+ "Los Angeles": { lat: 34.0522, lon: -118.2437 },
37
+ "Shanghai": { lat: 31.2304, lon: 121.4737 },
38
+ "New York": { lat: 40.7128, lon: -74.006 },
39
+ "Tokyo": { lat: 35.6762, lon: 139.6503 },
40
+ "Dubai": { lat: 25.2048, lon: 55.2708 },
41
+ "Singapore": { lat: 1.3521, lon: 103.8198 },
42
+ "Hong Kong": { lat: 22.3193, lon: 114.1694 },
43
+ "Paris": { lat: 48.8566, lon: 2.3522 },
44
+ "Berlin": { lat: 52.52, lon: 13.405 },
45
+ "Mumbai": { lat: 19.076, lon: 72.8777 },
46
+ "Bangkok": { lat: 13.7563, lon: 100.5018 },
47
+ "Melbourne": { lat: -37.8136, lon: 144.9631 },
48
+ "Toronto": { lat: 43.6532, lon: -79.3832 },
49
+ "Miami": { lat: 25.7617, lon: -80.1918 },
50
+ "Chicago": { lat: 41.8781, lon: -87.6298 },
51
+ "Auckland": { lat: -36.8485, lon: 174.7633 }
52
+ };
53
+ var DEFAULT_CITIES = ["Sydney", "London", "Los Angeles", "Shanghai"];
54
+ var STORAGE_KEY = "weather_cities";
55
+ var SETTINGS_KEY = "weather_appearance";
56
+ var CACHE_KEY = "weather_multi_cache";
57
+ var CACHE_TTL = 30 * 60 * 1e3;
58
+ var PREFS_KEY = "weather_prefs";
59
+ function loadCities() {
60
+ try {
61
+ const s = JSON.parse(localStorage.getItem(STORAGE_KEY) || "");
62
+ if (Array.isArray(s) && s.length) return s;
63
+ } catch {
64
+ }
65
+ return DEFAULT_CITIES;
66
+ }
67
+ function loadPrefs() {
68
+ try {
69
+ const s = JSON.parse(localStorage.getItem(PREFS_KEY) || "");
70
+ if (s) return { useFahrenheit: false, showLocalTime: false, use24Hour: false, ...s };
71
+ } catch {
72
+ }
73
+ return { useFahrenheit: false, showLocalTime: false, use24Hour: false };
74
+ }
75
+ var toF = (c) => Math.round(c * 9 / 5 + 32);
76
+ function getTimeInTz(timezone, use24Hour = false) {
77
+ try {
78
+ const now = /* @__PURE__ */ new Date();
79
+ const h24Parts = new Intl.DateTimeFormat("en-US", { timeZone: timezone, hour: "numeric", minute: "2-digit", hour12: false }).formatToParts(now);
80
+ const h24 = parseInt(h24Parts.find((p) => p.type === "hour")?.value || "0");
81
+ const m = parseInt(h24Parts.find((p) => p.type === "minute")?.value || "0");
82
+ if (use24Hour) {
83
+ return { hours: h24, minutes: m, text: `${String(h24).padStart(2, "0")}:${String(m).padStart(2, "0")}` };
84
+ }
85
+ const parts = new Intl.DateTimeFormat("en-US", { timeZone: timezone, hour: "numeric", minute: "2-digit", hour12: true }).formatToParts(now);
86
+ const h12 = parseInt(parts.find((p) => p.type === "hour")?.value || "12");
87
+ const period = parts.find((p) => p.type === "dayPeriod")?.value || "";
88
+ return { hours: h24, minutes: m, text: `${h12}:${String(m).padStart(2, "0")} ${period}` };
89
+ } catch {
90
+ return { hours: 0, minutes: 0, text: "" };
91
+ }
92
+ }
93
+ function MiniClock({ hours, minutes, size = 20 }) {
94
+ const r = size / 2;
95
+ const hAngle = (hours % 12 + minutes / 60) * 30 - 90;
96
+ const mAngle = minutes * 6 - 90;
97
+ const hRad = hAngle * Math.PI / 180;
98
+ const mRad = mAngle * Math.PI / 180;
99
+ const hLen = r * 0.5;
100
+ const mLen = r * 0.7;
101
+ return /* @__PURE__ */ jsxs("svg", { width: size, height: size, className: "shrink-0", children: [
102
+ /* @__PURE__ */ jsx("circle", { cx: r, cy: r, r: r - 1, fill: "rgba(255,255,255,0.15)", stroke: "rgba(255,255,255,0.4)", strokeWidth: 1 }),
103
+ /* @__PURE__ */ jsx(
104
+ "line",
105
+ {
106
+ x1: r,
107
+ y1: r,
108
+ x2: r + Math.cos(hRad) * hLen,
109
+ y2: r + Math.sin(hRad) * hLen,
110
+ stroke: "white",
111
+ strokeWidth: 1.5,
112
+ strokeLinecap: "round"
113
+ }
114
+ ),
115
+ /* @__PURE__ */ jsx(
116
+ "line",
117
+ {
118
+ x1: r,
119
+ y1: r,
120
+ x2: r + Math.cos(mRad) * mLen,
121
+ y2: r + Math.sin(mRad) * mLen,
122
+ stroke: "white",
123
+ strokeWidth: 1,
124
+ strokeLinecap: "round"
125
+ }
126
+ ),
127
+ /* @__PURE__ */ jsx("circle", { cx: r, cy: r, r: 1, fill: "white" })
128
+ ] });
129
+ }
130
+ function Weather() {
131
+ const [cities, setCities] = useState(loadCities);
132
+ const [appearance, setAppearance] = useState(() => loadAppearance(SETTINGS_KEY));
133
+ const [data, setData] = useState([]);
134
+ const [loading, setLoading] = useState(true);
135
+ const [, setTick] = useState(0);
136
+ useEffect(() => {
137
+ const t2 = setInterval(() => setTick((n) => n + 1), 6e4);
138
+ return () => clearInterval(t2);
139
+ }, []);
140
+ const [settingsOpen, setSettingsOpen] = useState(false);
141
+ const [configCities, setConfigCities] = useState([]);
142
+ const [configAppearance, setConfigAppearance] = useState(appearance);
143
+ const [prefs, setPrefs] = useState(loadPrefs);
144
+ const [configPrefs, setConfigPrefs] = useState(prefs);
145
+ useWidgetSettings(useCallback(() => {
146
+ setConfigCities([...cities]);
147
+ setConfigAppearance({ ...appearance });
148
+ setConfigPrefs({ ...prefs });
149
+ setSettingsOpen(true);
150
+ }, [cities, appearance, prefs]));
151
+ const fetchAll = useCallback(async (cityList, force = false) => {
152
+ if (!force) {
153
+ try {
154
+ const cached = JSON.parse(localStorage.getItem(CACHE_KEY) || "{}");
155
+ const key = cityList.join(",");
156
+ if (cached[key] && Date.now() - cached[key].ts < CACHE_TTL) {
157
+ setData(cached[key].data);
158
+ setLoading(false);
159
+ return;
160
+ }
161
+ } catch {
162
+ }
163
+ }
164
+ setLoading(true);
165
+ const results = [];
166
+ for (const city of cityList) {
167
+ const coords = AVAILABLE_CITIES[city];
168
+ if (!coords) continue;
169
+ try {
170
+ const res = await fetch(`https://api.open-meteo.com/v1/forecast?latitude=${coords.lat}&longitude=${coords.lon}&current=temperature_2m,weather_code,is_day&daily=temperature_2m_max,temperature_2m_min&forecast_days=1&timezone=auto`);
171
+ const w = await res.json();
172
+ results.push({ city, temp: Math.round(w.current.temperature_2m), code: w.current.weather_code, high: Math.round(w.daily.temperature_2m_max[0]), low: Math.round(w.daily.temperature_2m_min[0]), isDay: w.current.is_day === 1, timezone: w.timezone || "UTC" });
173
+ } catch {
174
+ }
175
+ }
176
+ setData(results);
177
+ setLoading(false);
178
+ try {
179
+ const c = JSON.parse(localStorage.getItem(CACHE_KEY) || "{}");
180
+ c[cityList.join(",")] = { data: results, ts: Date.now() };
181
+ localStorage.setItem(CACHE_KEY, JSON.stringify(c));
182
+ } catch {
183
+ }
184
+ }, []);
185
+ useEffect(() => {
186
+ fetchAll(cities);
187
+ }, [cities, fetchAll]);
188
+ const saveSettings = () => {
189
+ if (configCities.length === 0) return;
190
+ setCities(configCities);
191
+ setAppearance(configAppearance);
192
+ setPrefs(configPrefs);
193
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(configCities));
194
+ localStorage.setItem(SETTINGS_KEY, JSON.stringify(configAppearance));
195
+ localStorage.setItem(PREFS_KEY, JSON.stringify(configPrefs));
196
+ setSettingsOpen(false);
197
+ };
198
+ const t = (c) => prefs.useFahrenheit ? `${toF(c)}\xB0F` : `${c}\xB0`;
199
+ if (loading && data.length === 0) {
200
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full bg-gradient-to-b from-sky-400 to-blue-500 rounded-lg text-white/70 text-sm", children: "Loading..." });
201
+ }
202
+ const firstIsDay = data.length > 0 ? data[0].isDay : true;
203
+ const [, , gradient] = data.length > 0 ? getCondition(data[0].code, firstIsDay) : ["", "", "from-sky-400 to-blue-500"];
204
+ const dynamicHeight = data.length * 48 + 16;
205
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
206
+ /* @__PURE__ */ jsx(
207
+ "div",
208
+ {
209
+ className: `flex flex-col bg-gradient-to-b ${gradient} rounded-lg text-white overflow-hidden`,
210
+ style: { minHeight: dynamicHeight, opacity: appearance.activeOpacity / 100, backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : void 0 },
211
+ children: /* @__PURE__ */ jsx("div", { className: "flex-1 flex flex-col justify-between px-3 py-3", children: data.map((d) => {
212
+ const [condition, emoji] = getCondition(d.code, d.isDay);
213
+ return /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-2 rounded-lg px-2 py-1 -mx-1 ${d.isDay ? "" : "bg-black/15"}`, children: [
214
+ prefs.showLocalTime && (() => {
215
+ const time = getTimeInTz(d.timezone, prefs.use24Hour);
216
+ return /* @__PURE__ */ jsx(MiniClock, { hours: time.hours, minutes: time.minutes, size: 24 });
217
+ })(),
218
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
219
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold leading-tight", children: d.city }),
220
+ /* @__PURE__ */ jsx("div", { className: "text-[10px] opacity-70", children: prefs.showLocalTime ? getTimeInTz(d.timezone, prefs.use24Hour).text : condition })
221
+ ] }),
222
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [
223
+ /* @__PURE__ */ jsx("span", { className: "text-lg", children: emoji }),
224
+ /* @__PURE__ */ jsxs("div", { className: "text-right", children: [
225
+ /* @__PURE__ */ jsx("div", { className: "text-2xl font-light leading-none", children: t(d.temp) }),
226
+ /* @__PURE__ */ jsxs("div", { className: "text-[9px] opacity-60", children: [
227
+ "H:",
228
+ t(d.high),
229
+ " L:",
230
+ t(d.low)
231
+ ] })
232
+ ] })
233
+ ] })
234
+ ] }, d.city);
235
+ }) })
236
+ }
237
+ ),
238
+ /* @__PURE__ */ jsxs(
239
+ WidgetSettingsModal,
240
+ {
241
+ open: settingsOpen,
242
+ onClose: () => setSettingsOpen(false),
243
+ title: "Weather Settings",
244
+ appearance: configAppearance,
245
+ onAppearanceChange: setConfigAppearance,
246
+ onSave: saveSettings,
247
+ children: [
248
+ /* @__PURE__ */ jsx("div", { className: "space-y-3", children: /* @__PURE__ */ jsxs("div", { children: [
249
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-gray-700 mb-2", children: "Display" }),
250
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 mb-2", children: [
251
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-gray-600 w-24", children: "Temperature" }),
252
+ /* @__PURE__ */ jsx("div", { className: "flex gap-1", children: [{ key: false, label: "\xB0C" }, { key: true, label: "\xB0F" }].map((o) => /* @__PURE__ */ jsx(
253
+ "button",
254
+ {
255
+ onClick: () => setConfigPrefs((p) => ({ ...p, useFahrenheit: o.key })),
256
+ 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"}`,
257
+ children: o.label
258
+ },
259
+ String(o.key)
260
+ )) })
261
+ ] }),
262
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 mb-2", children: [
263
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-gray-600 w-24", children: "Time Format" }),
264
+ /* @__PURE__ */ jsx("div", { className: "flex gap-1", children: [{ key: false, label: "AM/PM" }, { key: true, label: "24H" }].map((o) => /* @__PURE__ */ jsx(
265
+ "button",
266
+ {
267
+ onClick: () => setConfigPrefs((p) => ({ ...p, use24Hour: o.key })),
268
+ 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"}`,
269
+ children: o.label
270
+ },
271
+ String(o.key)
272
+ )) })
273
+ ] }),
274
+ /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
275
+ /* @__PURE__ */ jsx(
276
+ "input",
277
+ {
278
+ type: "checkbox",
279
+ checked: configPrefs.showLocalTime,
280
+ onChange: (e) => setConfigPrefs((p) => ({ ...p, showLocalTime: e.target.checked })),
281
+ className: "rounded border-gray-300 text-blue-600 h-3.5 w-3.5"
282
+ }
283
+ ),
284
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-gray-600", children: "Show local time" })
285
+ ] })
286
+ ] }) }),
287
+ /* @__PURE__ */ jsxs("div", { children: [
288
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-gray-700 mb-2", children: "Cities" }),
289
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-1 max-h-48 overflow-y-auto", children: Object.keys(AVAILABLE_CITIES).map((city) => /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 text-sm py-1 cursor-pointer hover:bg-gray-50 rounded px-2", children: [
290
+ /* @__PURE__ */ jsx(
291
+ "input",
292
+ {
293
+ type: "checkbox",
294
+ checked: configCities.includes(city),
295
+ onChange: () => setConfigCities((prev) => prev.includes(city) ? prev.filter((c) => c !== city) : [...prev, city]),
296
+ className: "rounded border-gray-300 text-blue-600 focus:ring-blue-500 h-3.5 w-3.5"
297
+ }
298
+ ),
299
+ city
300
+ ] }, city)) })
301
+ ] })
302
+ ]
303
+ }
304
+ )
305
+ ] });
306
+ }
307
+
308
+ export { Weather as default };
309
+ //# sourceMappingURL=Weather-ROZ7TRNW.js.map
310
+ //# sourceMappingURL=Weather-ROZ7TRNW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/apps/Weather.tsx"],"names":["t"],"mappings":"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","file":"Weather-ROZ7TRNW.js","sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport { useWidgetSettings } from '../shell/Modal';\nimport WidgetSettingsModal, { loadAppearance, type WidgetAppearance } from '../shell/WidgetSettingsModal';\n\n// [condition, day emoji, night emoji, day gradient, night gradient]\nconst WMO: Record<number, [string, string, string, string, string]> = {\n 0: ['Clear Sky', '☀️', '🌙', 'from-sky-400 to-blue-500', 'from-indigo-800 to-slate-900'],\n 1: ['Mainly Clear', '🌤️', '🌙', 'from-sky-400 to-blue-500', 'from-indigo-800 to-slate-900'],\n 2: ['Partly Cloudy', '⛅', '☁️', 'from-sky-400 to-blue-400', 'from-indigo-700 to-slate-800'],\n 3: ['Overcast', '☁️', '☁️', 'from-gray-400 to-gray-500', 'from-gray-700 to-slate-800'],\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-800'],\n 53: ['Drizzle', '🌧️', '🌧️', 'from-gray-500 to-blue-600', 'from-gray-700 to-indigo-800'],\n 55: ['Heavy Drizzle', '🌧️', '🌧️', 'from-gray-500 to-blue-600', 'from-gray-700 to-indigo-800'],\n 61: ['Light Rain', '🌦️', '🌧️', 'from-gray-400 to-blue-500', 'from-gray-700 to-indigo-800'],\n 63: ['Rain', '🌧️', '🌧️', 'from-gray-500 to-blue-600', 'from-gray-700 to-indigo-800'],\n 65: ['Heavy Rain', '🌧️', '🌧️', 'from-gray-600 to-blue-700', 'from-gray-700 to-indigo-900'],\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-800'],\n 82: ['Heavy Showers', '🌧️', '🌧️', 'from-gray-600 to-blue-700', 'from-gray-700 to-indigo-900'],\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\nconst getCondition = (code: number, isDay = true) => {\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]] as [string, string, string];\n};\n\nconst AVAILABLE_CITIES: Record<string, { lat: number; lon: number }> = {\n 'Sydney': { lat: -33.8688, lon: 151.2093 },\n 'London': { lat: 51.5074, lon: -0.1278 },\n 'Los Angeles': { lat: 34.0522, lon: -118.2437 },\n 'Shanghai': { lat: 31.2304, lon: 121.4737 },\n 'New York': { lat: 40.7128, lon: -74.0060 },\n 'Tokyo': { lat: 35.6762, lon: 139.6503 },\n 'Dubai': { lat: 25.2048, lon: 55.2708 },\n 'Singapore': { lat: 1.3521, lon: 103.8198 },\n 'Hong Kong': { lat: 22.3193, lon: 114.1694 },\n 'Paris': { lat: 48.8566, lon: 2.3522 },\n 'Berlin': { lat: 52.5200, lon: 13.4050 },\n 'Mumbai': { lat: 19.0760, lon: 72.8777 },\n 'Bangkok': { lat: 13.7563, lon: 100.5018 },\n 'Melbourne': { lat: -37.8136, lon: 144.9631 },\n 'Toronto': { lat: 43.6532, lon: -79.3832 },\n 'Miami': { lat: 25.7617, lon: -80.1918 },\n 'Chicago': { lat: 41.8781, lon: -87.6298 },\n 'Auckland': { lat: -36.8485, lon: 174.7633 },\n};\n\nconst DEFAULT_CITIES = ['Sydney', 'London', 'Los Angeles', 'Shanghai'];\nconst STORAGE_KEY = 'weather_cities';\nconst SETTINGS_KEY = 'weather_appearance';\nconst CACHE_KEY = 'weather_multi_cache';\nconst CACHE_TTL = 30 * 60 * 1000;\n\nconst PREFS_KEY = 'weather_prefs';\ninterface CityWeather { city: string; temp: number; code: number; high: number; low: number; isDay: boolean; timezone: string }\ninterface WeatherPrefs { useFahrenheit: boolean; showLocalTime: boolean; use24Hour: boolean }\n\nfunction loadCities(): string[] {\n try { const s = JSON.parse(localStorage.getItem(STORAGE_KEY) || ''); if (Array.isArray(s) && s.length) return s; } catch {}\n return DEFAULT_CITIES;\n}\n\nfunction loadPrefs(): WeatherPrefs {\n try { const s = JSON.parse(localStorage.getItem(PREFS_KEY) || ''); if (s) return { useFahrenheit: false, showLocalTime: false, use24Hour: false, ...s }; } catch {}\n return { useFahrenheit: false, showLocalTime: false, use24Hour: false };\n}\n\nconst toF = (c: number) => Math.round(c * 9 / 5 + 32);\n\nfunction getTimeInTz(timezone: string, use24Hour = false): { hours: number; minutes: number; text: string } {\n try {\n const now = new Date();\n const h24Parts = new Intl.DateTimeFormat('en-US', { timeZone: timezone, hour: 'numeric', minute: '2-digit', hour12: false }).formatToParts(now);\n const h24 = parseInt(h24Parts.find(p => p.type === 'hour')?.value || '0');\n const m = parseInt(h24Parts.find(p => p.type === 'minute')?.value || '0');\n if (use24Hour) {\n return { hours: h24, minutes: m, text: `${String(h24).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(now);\n const h12 = parseInt(parts.find(p => p.type === 'hour')?.value || '12');\n const period = parts.find(p => p.type === 'dayPeriod')?.value || '';\n return { hours: h24, minutes: m, text: `${h12}:${String(m).padStart(2, '0')} ${period}` };\n } catch { return { hours: 0, minutes: 0, text: '' }; }\n}\n\n/** Tiny analog clock SVG */\nfunction MiniClock({ hours, minutes, size = 20 }: { hours: number; minutes: number; size?: number }) {\n const r = size / 2;\n const hAngle = ((hours % 12) + minutes / 60) * 30 - 90;\n const mAngle = minutes * 6 - 90;\n const hRad = (hAngle * Math.PI) / 180;\n const mRad = (mAngle * Math.PI) / 180;\n const hLen = r * 0.5;\n const mLen = r * 0.7;\n return (\n <svg width={size} height={size} className=\"shrink-0\">\n <circle cx={r} cy={r} r={r - 1} fill=\"rgba(255,255,255,0.15)\" stroke=\"rgba(255,255,255,0.4)\" strokeWidth={1} />\n {/* Hour hand */}\n <line x1={r} y1={r} x2={r + Math.cos(hRad) * hLen} y2={r + Math.sin(hRad) * hLen}\n stroke=\"white\" strokeWidth={1.5} strokeLinecap=\"round\" />\n {/* Minute hand */}\n <line x1={r} y1={r} x2={r + Math.cos(mRad) * mLen} y2={r + Math.sin(mRad) * mLen}\n stroke=\"white\" strokeWidth={1} strokeLinecap=\"round\" />\n {/* Center dot */}\n <circle cx={r} cy={r} r={1} fill=\"white\" />\n </svg>\n );\n}\n\nexport default function Weather() {\n const [cities, setCities] = useState(loadCities);\n const [appearance, setAppearance] = useState(() => loadAppearance(SETTINGS_KEY));\n const [data, setData] = useState<CityWeather[]>([]);\n const [loading, setLoading] = useState(true);\n // Tick every minute so clocks update\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 [configCities, setConfigCities] = useState<string[]>([]);\n const [configAppearance, setConfigAppearance] = useState<WidgetAppearance>(appearance);\n const [prefs, setPrefs] = useState(loadPrefs);\n const [configPrefs, setConfigPrefs] = useState<WeatherPrefs>(prefs);\n\n useWidgetSettings(useCallback(() => {\n setConfigCities([...cities]);\n setConfigAppearance({ ...appearance });\n setConfigPrefs({ ...prefs });\n setSettingsOpen(true);\n }, [cities, appearance, prefs]));\n\n const fetchAll = useCallback(async (cityList: string[], force = false) => {\n if (!force) {\n try {\n const cached = JSON.parse(localStorage.getItem(CACHE_KEY) || '{}');\n const key = cityList.join(',');\n if (cached[key] && Date.now() - cached[key].ts < CACHE_TTL) {\n setData(cached[key].data); setLoading(false); return;\n }\n } catch {}\n }\n setLoading(true);\n const results: CityWeather[] = [];\n for (const city of cityList) {\n const coords = AVAILABLE_CITIES[city];\n if (!coords) continue;\n try {\n const res = await fetch(`https://api.open-meteo.com/v1/forecast?latitude=${coords.lat}&longitude=${coords.lon}&current=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 results.push({ city, temp: Math.round(w.current.temperature_2m), code: w.current.weather_code, high: Math.round(w.daily.temperature_2m_max[0]), low: Math.round(w.daily.temperature_2m_min[0]), isDay: w.current.is_day === 1, timezone: w.timezone || 'UTC' });\n } catch {}\n }\n setData(results); setLoading(false);\n try { const c = JSON.parse(localStorage.getItem(CACHE_KEY) || '{}'); c[cityList.join(',')] = { data: results, ts: Date.now() }; localStorage.setItem(CACHE_KEY, JSON.stringify(c)); } catch {}\n }, []);\n\n useEffect(() => { fetchAll(cities); }, [cities, fetchAll]);\n\n const saveSettings = () => {\n if (configCities.length === 0) return;\n setCities(configCities); setAppearance(configAppearance); setPrefs(configPrefs);\n localStorage.setItem(STORAGE_KEY, JSON.stringify(configCities));\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(configAppearance));\n localStorage.setItem(PREFS_KEY, JSON.stringify(configPrefs));\n setSettingsOpen(false);\n };\n\n const t = (c: number) => prefs.useFahrenheit ? `${toF(c)}°F` : `${c}°`;\n\n if (loading && data.length === 0) {\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/70 text-sm\">Loading...</div>;\n }\n\n // Use the first city's condition + day/night for the background gradient\n const firstIsDay = data.length > 0 ? data[0].isDay : true;\n const [, , gradient] = data.length > 0 ? getCondition(data[0].code, firstIsDay) : ['', '', 'from-sky-400 to-blue-500'];\n const dynamicHeight = data.length * 48 + 16;\n\n return (\n <>\n <div className={`flex flex-col bg-gradient-to-b ${gradient} rounded-lg text-white overflow-hidden`}\n style={{ minHeight: dynamicHeight, opacity: appearance.activeOpacity / 100, backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : undefined }}>\n <div className=\"flex-1 flex flex-col justify-between px-3 py-3\">\n {data.map(d => {\n const [condition, emoji] = getCondition(d.code, d.isDay);\n return (\n <div key={d.city} className={`flex items-center gap-2 rounded-lg px-2 py-1 -mx-1 ${d.isDay ? '' : 'bg-black/15'}`}>\n {prefs.showLocalTime && (() => {\n const time = getTimeInTz(d.timezone, prefs.use24Hour);\n return <MiniClock hours={time.hours} minutes={time.minutes} size={24} />;\n })()}\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold leading-tight\">{d.city}</div>\n <div className=\"text-[10px] opacity-70\">\n {prefs.showLocalTime ? getTimeInTz(d.timezone, prefs.use24Hour).text : condition}\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <span className=\"text-lg\">{emoji}</span>\n <div className=\"text-right\">\n <div className=\"text-2xl font-light leading-none\">{t(d.temp)}</div>\n <div className=\"text-[9px] opacity-60\">H:{t(d.high)} L:{t(d.low)}</div>\n </div>\n </div>\n </div>\n );\n })}\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\">Cities</h3>\n <div className=\"grid grid-cols-2 gap-1 max-h-48 overflow-y-auto\">\n {Object.keys(AVAILABLE_CITIES).map(city => (\n <label key={city} 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(city)}\n onChange={() => setConfigCities(prev => prev.includes(city) ? prev.filter(c => c !== city) : [...prev, city])}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500 h-3.5 w-3.5\" />\n {city}\n </label>\n ))}\n </div>\n </div>\n </WidgetSettingsModal>\n </>\n );\n}\n"]}
@@ -0,0 +1,55 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as react from 'react';
3
+ import { W as WindowRegistry } from '../types-CFIZ1_xt.js';
4
+
5
+ declare function Calendar$1(): react_jsx_runtime.JSX.Element;
6
+
7
+ declare function GeminiChat$1(): react_jsx_runtime.JSX.Element;
8
+
9
+ declare function Email$1(): react_jsx_runtime.JSX.Element;
10
+
11
+ declare function Minesweeper$1(): react_jsx_runtime.JSX.Element;
12
+
13
+ declare function Game2048$1(): react_jsx_runtime.JSX.Element;
14
+
15
+ declare function Tetris$1(): react_jsx_runtime.JSX.Element;
16
+
17
+ declare function Sudoku$1(): react_jsx_runtime.JSX.Element;
18
+
19
+ declare function Checkers$1(): react_jsx_runtime.JSX.Element;
20
+
21
+ declare function Chess$1(): react_jsx_runtime.JSX.Element;
22
+
23
+ declare function Notepad$1(): react_jsx_runtime.JSX.Element;
24
+
25
+ declare function PomodoroTimer$1(): react_jsx_runtime.JSX.Element;
26
+
27
+ declare function CurrencyConverter$1(): react_jsx_runtime.JSX.Element;
28
+
29
+ declare function Weather$1(): react_jsx_runtime.JSX.Element;
30
+
31
+ declare function Spreadsheet$1(): react_jsx_runtime.JSX.Element;
32
+
33
+ declare function Calculator$1(): react_jsx_runtime.JSX.Element;
34
+
35
+ declare const Calculator: react.LazyExoticComponent<typeof Calculator$1>;
36
+ declare const Spreadsheet: react.LazyExoticComponent<typeof Spreadsheet$1>;
37
+ declare const Weather: react.LazyExoticComponent<typeof Weather$1>;
38
+ declare const CurrencyConverter: react.LazyExoticComponent<typeof CurrencyConverter$1>;
39
+ declare const PomodoroTimer: react.LazyExoticComponent<typeof PomodoroTimer$1>;
40
+ declare const Notepad: react.LazyExoticComponent<typeof Notepad$1>;
41
+ declare const Chess: react.LazyExoticComponent<typeof Chess$1>;
42
+ declare const Checkers: react.LazyExoticComponent<typeof Checkers$1>;
43
+ declare const Sudoku: react.LazyExoticComponent<typeof Sudoku$1>;
44
+ declare const Tetris: react.LazyExoticComponent<typeof Tetris$1>;
45
+ declare const Game2048: react.LazyExoticComponent<typeof Game2048$1>;
46
+ declare const Minesweeper: react.LazyExoticComponent<typeof Minesweeper$1>;
47
+ declare const Email: react.LazyExoticComponent<typeof Email$1>;
48
+ declare const GeminiChat: react.LazyExoticComponent<typeof GeminiChat$1>;
49
+ declare const Calendar: react.LazyExoticComponent<typeof Calendar$1>;
50
+ declare const utilityApps: WindowRegistry;
51
+ declare const gameApps: WindowRegistry;
52
+ declare const googleApps: WindowRegistry;
53
+ declare const bundledApps: WindowRegistry;
54
+
55
+ export { Calculator, Calendar, Checkers, Chess, CurrencyConverter, Email, Game2048, GeminiChat, Minesweeper, Notepad, PomodoroTimer, Spreadsheet, Sudoku, Tetris, Weather, bundledApps, gameApps, googleApps, utilityApps };
@@ -0,0 +1,48 @@
1
+ import { lazy } from 'react';
2
+
3
+ // src/apps/index.ts
4
+ var Calculator = lazy(() => import('../Calculator-BNBRNV4P.js'));
5
+ var Spreadsheet = lazy(() => import('../Spreadsheet-IOKEDNS6.js'));
6
+ var Weather = lazy(() => import('../Weather-ROZ7TRNW.js'));
7
+ var CurrencyConverter = lazy(() => import('../CurrencyConverter-TYPU2IRF.js'));
8
+ var PomodoroTimer = lazy(() => import('../PomodoroTimer-HARIJN4S.js'));
9
+ var Notepad = lazy(() => import('../Notepad-YTZRCAXX.js'));
10
+ var Chess = lazy(() => import('../Chess-C5BY45NA.js'));
11
+ var Checkers = lazy(() => import('../Checkers-MIAHIKJH.js'));
12
+ var Sudoku = lazy(() => import('../Sudoku-XHLYCEVT.js'));
13
+ var Tetris = lazy(() => import('../Tetris-ZHCZYL24.js'));
14
+ var Game2048 = lazy(() => import('../Game2048-3RH3ELRD.js'));
15
+ var Minesweeper = lazy(() => import('../Minesweeper-VQGLAZON.js'));
16
+ var Email = lazy(() => import('../Email-JEYYJ3YV.js'));
17
+ var GeminiChat = lazy(() => import('../GeminiChat-BXLBJFT4.js'));
18
+ var Calendar = lazy(() => import('../Calendar-5EYUVGUU.js'));
19
+ var utilityApps = {
20
+ "/calculator": { component: Calculator, label: "Calculator", size: "sm", allowPinOnTop: true, utility: true, widget: true, dimensions: [280, 420] },
21
+ "/spreadsheet": { component: Spreadsheet, label: "Spreadsheets", size: "2xl", compact: true },
22
+ "/notepad": { component: Notepad, label: "Notepad", size: "lg" },
23
+ "/weather": { component: Weather, label: "Weather", size: "sm", utility: true, widget: true, autoHeight: true, dimensions: [320, 400] },
24
+ "/currency": { component: CurrencyConverter, label: "Currency Converter", size: "sm", utility: true, widget: true, dimensions: [320, 480] },
25
+ "/pomodoro": { component: PomodoroTimer, label: "Pomodoro Timer", size: "sm", utility: true, widget: true, dimensions: [320, 420] }
26
+ };
27
+ var gameApps = {
28
+ "/chess": { component: Chess, label: "Chess", size: "lg", compact: true },
29
+ "/checkers": { component: Checkers, label: "Checkers", size: "lg", compact: true },
30
+ "/sudoku": { component: Sudoku, label: "Sudoku", size: "sm", compact: true, dimensions: [360, 535] },
31
+ "/tetris": { component: Tetris, label: "Tetris", size: "md", compact: true, dimensions: [452, 618] },
32
+ "/2048": { component: Game2048, label: "2048", size: "sm", compact: true },
33
+ "/minesweeper": { component: Minesweeper, label: "Minesweeper", size: "sm", compact: true }
34
+ };
35
+ var googleApps = {
36
+ "/email": { component: Email, label: "Email", size: "2xl" },
37
+ "/gemini": { component: GeminiChat, label: "Gemini AI", size: "lg" },
38
+ "/calendar": { component: Calendar, label: "Calendar", size: "xl" }
39
+ };
40
+ var bundledApps = {
41
+ ...utilityApps,
42
+ ...gameApps,
43
+ ...googleApps
44
+ };
45
+
46
+ export { Calculator, Calendar, Checkers, Chess, CurrencyConverter, Email, Game2048, GeminiChat, Minesweeper, Notepad, PomodoroTimer, Spreadsheet, Sudoku, Tetris, Weather, bundledApps, gameApps, googleApps, utilityApps };
47
+ //# sourceMappingURL=index.js.map
48
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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: 4 apps require consumer-supplied persistence (Calendar / Notepad /\n * WorldClock for stored preferences, Minesweeper for leaderboard). They're\n * exported individually but absent from `bundledApps` — wire the prefs\n * provider to opt them in.\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'));\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\nexport const utilityApps: WindowRegistry = {\n '/calculator': { component: Calculator, label: 'Calculator', size: 'sm', allowPinOnTop: true, utility: true, widget: true, dimensions: [280, 420] },\n '/spreadsheet': { component: Spreadsheet, label: 'Spreadsheets', size: '2xl', compact: true },\n '/notepad': { component: Notepad, label: 'Notepad', size: 'lg' },\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, dimensions: [320, 480] },\n '/pomodoro': { component: PomodoroTimer, label: 'Pomodoro Timer', size: 'sm', utility: true, widget: true, dimensions: [320, 420] },\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' },\n '/gemini': { component: GeminiChat, label: 'Gemini AI', size: 'lg' },\n '/calendar': { component: Calendar, label: 'Calendar', size: 'xl' },\n};\n\nexport const bundledApps: WindowRegistry = {\n ...utilityApps,\n ...gameApps,\n ...googleApps,\n};\n\nexport {\n Calculator,\n Spreadsheet,\n Notepad,\n Weather,\n CurrencyConverter,\n PomodoroTimer,\n Chess,\n Checkers,\n Sudoku,\n Tetris,\n Game2048,\n Minesweeper,\n Email,\n GeminiChat,\n Calendar,\n};\n"]}