react-os-shell 4.77.0 → 4.79.2
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-G7A6O5KI.js → Browser-XPFSDH27.js} +5 -5
- package/dist/{Browser-G7A6O5KI.js.map → Browser-XPFSDH27.js.map} +1 -1
- package/dist/{Calculator-SRZGJITP.js → Calculator-PAPSDNSJ.js} +4 -4
- package/dist/{Calculator-SRZGJITP.js.map → Calculator-PAPSDNSJ.js.map} +1 -1
- package/dist/{CurrencyConverter-3KBUNSD6.js → CurrencyConverter-VJQI2XVV.js} +4 -4
- package/dist/{CurrencyConverter-3KBUNSD6.js.map → CurrencyConverter-VJQI2XVV.js.map} +1 -1
- package/dist/{Documents-7CMK5XDC.js → Documents-NHWPVRQC.js} +5 -5
- package/dist/{Documents-7CMK5XDC.js.map → Documents-NHWPVRQC.js.map} +1 -1
- package/dist/{Files-KFHBFAEL.js → Files-4RFGGL6Q.js} +8 -8
- package/dist/{Files-KFHBFAEL.js.map → Files-4RFGGL6Q.js.map} +1 -1
- package/dist/{Notepad-3QOAGMND.js → Notepad-K57YAANX.js} +5 -5
- package/dist/{Notepad-3QOAGMND.js.map → Notepad-K57YAANX.js.map} +1 -1
- package/dist/{PomodoroTimer-QGQBN2OH.js → PomodoroTimer-GFL4L3XS.js} +4 -4
- package/dist/{PomodoroTimer-QGQBN2OH.js.map → PomodoroTimer-GFL4L3XS.js.map} +1 -1
- package/dist/{Preview-SEO3K7T6.js → Preview-IOH4HR4P.js} +19 -17
- package/dist/Preview-IOH4HR4P.js.map +1 -0
- package/dist/{Spreadsheet-2ZRR3TVZ.js → Spreadsheet-C5GAX4ZW.js} +23 -18
- package/dist/Spreadsheet-C5GAX4ZW.js.map +1 -0
- package/dist/{Stock-OVVGE7US.js → Stock-WZXVQX3G.js} +4 -4
- package/dist/{Stock-OVVGE7US.js.map → Stock-WZXVQX3G.js.map} +1 -1
- package/dist/{Weather-PKUXHYIL.js → Weather-FQ7ZVXVR.js} +4 -4
- package/dist/{Weather-PKUXHYIL.js.map → Weather-FQ7ZVXVR.js.map} +1 -1
- package/dist/{WorldClock-OUO4IYKF.js → WorldClock-XAFQ5ZQF.js} +4 -4
- package/dist/{WorldClock-OUO4IYKF.js.map → WorldClock-XAFQ5ZQF.js.map} +1 -1
- package/dist/apps/index.d.ts +10 -4
- package/dist/apps/index.js +17 -17
- package/dist/{chunk-BV6SQ46N.js → chunk-3L463T5H.js} +5 -3
- package/dist/chunk-3L463T5H.js.map +1 -0
- package/dist/{chunk-4SQU5YV6.js → chunk-CT3HVZRZ.js} +5 -3
- package/dist/chunk-CT3HVZRZ.js.map +1 -0
- package/dist/{chunk-UEJC6VOM.js → chunk-EXSEW5F3.js} +3 -74
- package/dist/chunk-EXSEW5F3.js.map +1 -0
- package/dist/{chunk-TT56U4GY.js → chunk-GO2LCDHS.js} +4 -4
- package/dist/{chunk-TT56U4GY.js.map → chunk-GO2LCDHS.js.map} +1 -1
- package/dist/chunk-UWLJI2O7.js +7 -0
- package/dist/{chunk-FSOC6W3V.js.map → chunk-UWLJI2O7.js.map} +1 -1
- package/dist/{chunk-S6K37RLY.js → chunk-VDKHMCWT.js} +6 -5
- package/dist/chunk-VDKHMCWT.js.map +1 -0
- package/dist/{chunk-HEULN5GY.js → chunk-Z5LURI3C.js} +6 -6
- package/dist/{chunk-HEULN5GY.js.map → chunk-Z5LURI3C.js.map} +1 -1
- package/dist/{chunk-XYP45LGG.js → chunk-ZO4XGUZQ.js} +3 -3
- package/dist/{chunk-XYP45LGG.js.map → chunk-ZO4XGUZQ.js.map} +1 -1
- package/dist/{index-DVekeidu.d.ts → index-C_uCjbAh.d.ts} +85 -1
- package/dist/index.d.ts +14 -3
- package/dist/index.js +52 -17
- package/dist/index.js.map +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +2 -2
- package/package.json +1 -1
- package/dist/Preview-SEO3K7T6.js.map +0 -1
- package/dist/Spreadsheet-2ZRR3TVZ.js.map +0 -1
- package/dist/chunk-4SQU5YV6.js.map +0 -1
- package/dist/chunk-BV6SQ46N.js.map +0 -1
- package/dist/chunk-FSOC6W3V.js +0 -7
- package/dist/chunk-S6K37RLY.js.map +0 -1
- package/dist/chunk-UEJC6VOM.js.map +0 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { AboutApp } from './chunk-
|
|
2
|
-
import { peekSpreadsheetPreviewStage, claimSpreadsheetPreviewStage, SPREADSHEET_PREVIEW_UPDATE_EVENT } from './chunk-
|
|
1
|
+
import { AboutApp } from './chunk-Z5LURI3C.js';
|
|
2
|
+
import { peekSpreadsheetPreviewStage, claimSpreadsheetPreviewStage, SPREADSHEET_PREVIEW_UPDATE_EVENT } from './chunk-CT3HVZRZ.js';
|
|
3
3
|
import { EditableGrid } from './chunk-DC6BYGZ6.js';
|
|
4
|
-
import './chunk-
|
|
5
|
-
import { WindowTitle } from './chunk-
|
|
4
|
+
import './chunk-UWLJI2O7.js';
|
|
5
|
+
import { WindowTitle } from './chunk-EXSEW5F3.js';
|
|
6
6
|
import './chunk-BLLINYDD.js';
|
|
7
7
|
import './chunk-CDR2Q64Q.js';
|
|
8
8
|
import './chunk-WNLPTLT6.js';
|
|
9
9
|
import './chunk-3CUSBZWG.js';
|
|
10
|
-
import { useRef,
|
|
10
|
+
import { useRef, useState, useEffect, useCallback } from 'react';
|
|
11
11
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
12
12
|
|
|
13
13
|
var TITLE_DISPLAY_MAX = 24;
|
|
@@ -79,11 +79,7 @@ function Spreadsheet() {
|
|
|
79
79
|
if (consumedRef.current === void 0) {
|
|
80
80
|
consumedRef.current = peekSpreadsheetPreviewStage();
|
|
81
81
|
}
|
|
82
|
-
|
|
83
|
-
if (consumedRef.current != null) {
|
|
84
|
-
claimSpreadsheetPreviewStage(consumedRef.current);
|
|
85
|
-
}
|
|
86
|
-
}, []);
|
|
82
|
+
const stagedAtRenderRef = useRef(consumedRef.current?.data ?? null);
|
|
87
83
|
const initialPreview = (() => {
|
|
88
84
|
const p = consumedRef.current;
|
|
89
85
|
if (!p) return null;
|
|
@@ -128,18 +124,27 @@ function Spreadsheet() {
|
|
|
128
124
|
const [emailHandler, setEmailHandler] = useState(
|
|
129
125
|
() => consumedRef.current?.data.onEmail
|
|
130
126
|
);
|
|
127
|
+
const applyPreview = useCallback((next) => {
|
|
128
|
+
const sheet = sheetFromCSV(next.csv, "Sheet 1");
|
|
129
|
+
if (!sheet) return;
|
|
130
|
+
setSheets([sheet]);
|
|
131
|
+
setActiveIdx(0);
|
|
132
|
+
setTitle(next.filename.replace(/\.(csv|tsv|txt)$/i, ""));
|
|
133
|
+
setEmailHandler(() => next.onEmail);
|
|
134
|
+
}, []);
|
|
135
|
+
useEffect(() => {
|
|
136
|
+
const stage = consumedRef.current;
|
|
137
|
+
if (stage == null) return;
|
|
138
|
+
claimSpreadsheetPreviewStage(stage);
|
|
139
|
+
if (stage.data !== stagedAtRenderRef.current) applyPreview(stage.data);
|
|
140
|
+
}, []);
|
|
131
141
|
useEffect(() => {
|
|
132
142
|
const myToken = consumedRef.current?.token;
|
|
133
143
|
if (myToken == null) return;
|
|
134
144
|
const handler = (e) => {
|
|
135
145
|
const detail = e.detail;
|
|
136
146
|
if (!detail || detail.token !== myToken) return;
|
|
137
|
-
|
|
138
|
-
if (!sheet) return;
|
|
139
|
-
setSheets([sheet]);
|
|
140
|
-
setActiveIdx(0);
|
|
141
|
-
setTitle(detail.data.filename.replace(/\.(csv|tsv|txt)$/i, ""));
|
|
142
|
-
setEmailHandler(() => detail.data.onEmail);
|
|
147
|
+
applyPreview(detail.data);
|
|
143
148
|
};
|
|
144
149
|
window.addEventListener(SPREADSHEET_PREVIEW_UPDATE_EVENT, handler);
|
|
145
150
|
return () => window.removeEventListener(SPREADSHEET_PREVIEW_UPDATE_EVENT, handler);
|
|
@@ -504,5 +509,5 @@ function Spreadsheet() {
|
|
|
504
509
|
}
|
|
505
510
|
|
|
506
511
|
export { Spreadsheet as default };
|
|
507
|
-
//# sourceMappingURL=Spreadsheet-
|
|
508
|
-
//# sourceMappingURL=Spreadsheet-
|
|
512
|
+
//# sourceMappingURL=Spreadsheet-C5GAX4ZW.js.map
|
|
513
|
+
//# sourceMappingURL=Spreadsheet-C5GAX4ZW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/apps/Spreadsheet.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAaA,IAAM,iBAAA,GAAoB,EAAA;AAC1B,SAAS,iBAAiB,CAAA,EAAW;AACnC,EAAA,OAAO,CAAA,CAAE,MAAA,GAAS,iBAAA,GAAoB,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,iBAAA,GAAoB,CAAC,CAAC,CAAA,MAAA,CAAA,GAAM,CAAA;AAClF;AAEA,IAAM,KAAA,GAAQ,4BAAA;AACd,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,YAAA,GAAe,EAAA;AAErB,SAAS,SAAS,CAAA,EAAmB;AACnC,EAAA,IAAI,CAAA,GAAI,EAAA,EAAI,OAAO,KAAA,CAAM,CAAC,CAAA;AAC1B,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,IAAI,CAAC,CAAA,GAAI,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA;AACrD;AAEA,SAAS,YAAY,KAAA,EAA6B;AAChD,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,CAAC,GAAG,CAAA,MAAO;AAAA,IAC9C,GAAA,EAAK,OAAO,CAAC,CAAA,CAAA;AAAA,IACb,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,IACjB,KAAA,EAAO;AAAA,GACT,CAAE,CAAA;AACJ;AAEA,SAAS,aAAA,CAAc,MAAc,IAAA,EAA0B;AAC7D,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAK,EAAG,MAAM,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AAChE;AAWA,SAAS,SAAS,IAAA,EAAqB;AACrC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,IACtB,IAAA;AAAA,IACA,OAAA,EAAS,YAAY,YAAY,CAAA;AAAA,IACjC,IAAA,EAAM,aAAA,CAAc,YAAA,EAAc,YAAY,CAAA;AAAA,IAC9C,YAAY;AAAC,GACf;AACF;AAEA,SAAS,SAAS,IAAA,EAA0B;AAC1C,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,IAAI,CAAA,IAAA,KAAQ;AAClC,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAI,CAAA,EAAG,OAAO,IAAA,CAAK,KAAA,CAAM,GAAI,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA;AAClE,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,KAAA,MAAW,MAAM,IAAA,EAAM;AACrB,MAAA,IAAI,OAAO,GAAA,EAAK;AAAE,QAAA,QAAA,GAAW,CAAC,QAAA;AAAU,QAAA;AAAA,MAAU;AAClD,MAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAC,QAAA,EAAU;AAAE,QAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAG,QAAA,OAAA,GAAU,EAAA;AAAI,QAAA;AAAA,MAAU;AACnF,MAAA,OAAA,IAAW,EAAA;AAAA,IACb;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AACzB,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AACtC;AAIA,SAAS,YAAA,CAAa,MAAc,SAAA,EAAiC;AACnE,EAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,MAAA,CAAO,OAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACxF,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK;AAAE,IAAA,OAAO,CAAA,CAAE,MAAA,GAAS,OAAA,EAAS,CAAA,CAAE,KAAK,EAAE,CAAA;AAAG,IAAA,OAAO,CAAA;AAAA,EAAG,CAAC,CAAA;AACnF,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AACxE,EAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,UAAA,IAAc,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,WAAA,CAAY,OAAO,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,EAAC,EAAE;AACjH;AAQe,SAAR,WAAA,GAA+B;AACpC,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAQhD,EAAA,MAAM,WAAA,GAAc,OAAmD,MAAS,CAAA;AAChF,EAAA,IAAI,WAAA,CAAY,YAAY,MAAA,EAAW;AACrC,IAAA,WAAA,CAAY,UAAU,2BAAA,EAA4B;AAAA,EACpD;AAGA,EAAA,MAAM,iBAAA,GAAoB,MAAA,CAAsC,WAAA,CAAY,OAAA,EAAS,QAAQ,IAAI,CAAA;AACjG,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,MAAM,IAAI,WAAA,CAAY,OAAA;AACtB,IAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAA,CAAE,IAAA,CAAK,KAAK,SAAS,CAAA;AAChD,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,MAAM,YAAY,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,qBAAqB,EAAE,CAAA;AACjE,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,SAAA,EAAU;AAAA,EACnC,CAAA,GAAG;AACH,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAkB,cAAA,GAAiB,CAAC,cAAA,CAAe,KAAK,CAAA,GAAI,CAAC,QAAA,CAAS,SAAS,CAAC,CAAC,CAAA;AAC7G,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,CAAC,CAAA;AAI5C,EAAA,MAAM,YAAA,GAAe,MAAA,CAAkB,EAAE,CAAA;AACzC,EAAA,MAAM,gBAAA,GAAmB,OAAgB,MAAM,CAAA;AAC/C,EAAA,MAAM,aAAA,GAAgB,OAAO,KAAK,CAAA;AAClC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAc,OAAA,EAAS;AACzB,MAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,gBAAA,CAAiB,OAAA,KAAY,MAAA,EAAQ;AAC9C,MAAA,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AAClD,MAAA,IAAI,aAAa,OAAA,CAAQ,MAAA,GAAS,EAAA,EAAI,YAAA,CAAa,QAAQ,KAAA,EAAM;AAAA,IACnE;AACA,IAAA,gBAAA,CAAiB,OAAA,GAAU,MAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACX,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAI;AACtC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,IAAA,SAAA,CAAU,IAAI,CAAA;AAAA,EAChB,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAqB;AACpC,MAAA,IAAI,CAAC,YAAA,CAAa,OAAA,EAAS,QAAA,CAAS,QAAA,CAAS,aAAa,CAAA,IAAK,CAAC,YAAA,CAAa,OAAA,EAAS,OAAA,CAAQ,eAAe,CAAA,EAAG;AAChH,MAAA,MAAM,MAAA,GAAA,CAAU,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,CAAC,CAAA,CAAE,QAAA,KAAa,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,GAAA,KAAQ,GAAA,CAAA;AACtF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,EAAK;AAAA,MACP;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,OAAO,CAAA;AAC1C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,OAAO,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AACT,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAI,QAAA,CAAS,cAAA,EAAgB,SAAS,UAAU,CAAA;AACtE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA;AAAA,IACtC,MAAM,WAAA,CAAY,OAAA,EAAS,IAAA,CAAK;AAAA,GAClC;AAIA,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,IAAA,KAAiC;AACjE,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,GAAA,EAAK,SAAS,CAAA;AAC9C,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,SAAA,CAAU,CAAC,KAAK,CAAC,CAAA;AACjB,IAAA,YAAA,CAAa,CAAC,CAAA;AACd,IAAA,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAC,CAAA;AACvD,IAAA,eAAA,CAAgB,MAAM,KAAK,OAAO,CAAA;AAAA,EACpC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,QAAQ,WAAA,CAAY,OAAA;AAC1B,IAAA,IAAI,SAAS,IAAA,EAAM;AAKnB,IAAA,4BAAA,CAA6B,KAAK,CAAA;AAMlC,IAAA,IAAI,MAAM,IAAA,KAAS,iBAAA,CAAkB,OAAA,EAAS,YAAA,CAAa,MAAM,IAAI,CAAA;AAAA,EACvE,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,YAAY,OAAA,EAAS,KAAA;AACrC,IAAA,IAAI,WAAW,IAAA,EAAM;AACrB,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa;AAC5B,MAAA,MAAM,SAAU,CAAA,CAA2C,MAAA;AAC3D,MAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,KAAA,KAAU,OAAA,EAAS;AACzC,MAAA,YAAA,CAAa,OAAO,IAAI,CAAA;AAAA,IAC1B,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,kCAAkC,OAAO,CAAA;AACjE,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,gCAAA,EAAkC,OAAO,CAAA;AAAA,EACnF,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,EAAE,CAAA;AACzC,EAAA,MAAM,OAAA,GAAU,OAAyB,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,GAAG,CAAA;AAClD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,IAAI,CAAA;AAEnD,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAS,CAAA,IAAK,OAAO,CAAC,CAAA;AAC5C,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,IAAc,EAAC;AACzC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAA8C,IAAI,CAAA;AACxF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAA6F,IAAI,CAAA;AAInI,EAAA,MAAM,WAAA,GAAc,YAAY,MAAsC;AACpE,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,SAAA,CAAU,OAAO,GAAA,EAAK,SAAA,CAAU,IAAI,GAAG,CAAA;AAC3D,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,SAAA,CAAU,OAAO,GAAA,EAAK,SAAA,CAAU,IAAI,GAAG,CAAA;AAC3D,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,SAAA,CAAU,OAAO,GAAA,EAAK,SAAA,CAAU,IAAI,GAAG,CAAA;AAC3D,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,SAAA,CAAU,OAAO,GAAA,EAAK,SAAA,CAAU,IAAI,GAAG,CAAA;AAC3D,MAAA,MAAM,QAAwC,EAAC;AAC/C,MAAA,KAAA,IAAS,IAAI,EAAA,EAAI,CAAA,IAAK,IAAI,CAAA,EAAA,EAAK,KAAA,IAAS,IAAI,EAAA,EAAI,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,QAAW,IAAA,CAAK,EAAE,KAAK,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA;AAC3F,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,WAAA,GAAc,CAAC,WAAW,CAAA,GAAI,EAAC;AAAA,EACxC,CAAA,EAAG,CAAC,SAAA,EAAW,WAAW,CAAC,CAAA;AAE3B,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,GAAA,EAAsB,KAAA,KAAgB;AACzE,IAAA,MAAM,QAAQ,WAAA,EAAY;AAC1B,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACnC,MAAA,IAAI,CAAA,KAAM,WAAW,OAAO,CAAA;AAC5B,MAAA,MAAM,SAAS,EAAE,GAAI,CAAA,CAAE,UAAA,IAAc,EAAC,EAAG;AAIzC,MAAA,MAAM,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,CAAE,GAAG,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAA,CAAE,GAAG,CAAA,CAAA;AAChD,MAAA,MAAM,OAAA,GAAU,KAAA,KAAU,MAAA,GAAY,KAAA,GAAQ,CAAA,CAAG,OAAO,QAAQ,CAAA,IAAK,EAAC,EAAG,GAAG,CAAA;AAC5E,MAAA,KAAA,MAAW,EAAE,GAAA,EAAK,GAAA,EAAI,IAAK,KAAA,EAAO;AAChC,QAAA,MAAM,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AACvB,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,EAAE,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,EAAC,EAAI,CAAC,GAAG,GAAG,OAAA,EAAQ;AAAA,MACrD;AACA,MAAA,OAAO,EAAE,GAAG,CAAA,EAAG,UAAA,EAAY,MAAA,EAAO;AAAA,IACpC,CAAC,CAAC,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,WAAA,EAAa,SAAS,CAAC,CAAA;AAE3B,EAAA,MAAM,QAAA,GAAW,SAAA,GAAY,EAAE,GAAA,EAAK,SAAA,CAAU,MAAA,CAAO,GAAA,EAAK,GAAA,EAAK,SAAA,CAAU,MAAA,CAAO,GAAA,EAAI,GAAI,WAAA;AACxF,EAAA,MAAM,YAAA,GAA0B,QAAA,GAAY,UAAA,CAAW,CAAA,EAAG,QAAA,CAAS,GAAG,CAAA,CAAA,EAAI,QAAA,CAAS,GAAG,CAAA,CAAE,CAAA,IAAK,KAAM,EAAC;AACpG,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,QAAA;AAEpB,EAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAAC,MAAA,KAA2B;AAChE,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAA,KAAM,SAAA,GAAY,EAAE,GAAG,CAAA,EAAG,GAAG,MAAA,EAAO,GAAI,CAAC,CAAC,CAAA;AAAA,EACjF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,OAAA,KAAwB;AAExD,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAA;AACjE,IAAA,IAAI,OAAA,KAAY,QAAQ,MAAA,EAAQ;AAC9B,MAAA,iBAAA,CAAkB,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,WAAA,CAAY,OAAO,GAAG,CAAA;AAAA,IACpE,CAAA,MAAO;AACL,MAAA,iBAAA,CAAkB,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,EAAG,CAAC,iBAAA,EAAmB,OAAA,CAAQ,MAAM,CAAC,CAAA;AAGtC,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,MAAM,IAAA,GAAO,CAAA,MAAA,EAAS,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,CAAA;AACvC,IAAA,SAAA,CAAU,UAAQ,CAAC,GAAG,MAAM,QAAA,CAAS,IAAI,CAAC,CAAC,CAAA;AAC3C,IAAA,YAAA,CAAa,OAAO,MAAM,CAAA;AAAA,EAC5B,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAgB;AACnC,IAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACxB,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ,KAAK,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,KAAM,GAAG,CAAC,CAAA;AAClD,IAAA,IAAI,aAAa,GAAA,IAAO,SAAA,GAAY,CAAA,EAAG,YAAA,CAAa,YAAY,CAAC,CAAA;AAAA,EACnE,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,EAAa,IAAA,KAAiB;AACjD,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAA,KAAM,GAAA,GAAM,EAAE,GAAG,CAAA,EAAG,IAAA,EAAK,GAAI,CAAC,CAAC,CAAA;AACpE,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAkB;AACpC,IAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,GAAS,KAAA;AACrC,IAAA,iBAAA,CAAkB;AAAA,MAChB,OAAA,EAAS,YAAY,WAAW,CAAA;AAAA,MAChC,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,CAAC,GAAG,GAAA,EAAK,GAAG,KAAA,CAAM,KAAK,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAC;AAAA,KACzD,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAkB;AACjC,IAAA,iBAAA,CAAkB;AAAA,MAChB,MAAM,CAAC,GAAG,MAAM,GAAG,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,MAAM,MAAM,OAAA,CAAQ,MAAM,EAAE,IAAA,CAAK,EAAE,CAAC,CAAC;AAAA,KACvF,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,iBAAA,CAAkB;AAAA,MAChB,OAAA,EAAS,YAAY,YAAY,CAAA;AAAA,MACjC,IAAA,EAAM,aAAA,CAAc,YAAA,EAAc,YAAY;AAAA,KAC/C,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,eAAe,MAAM,IAAA,CACxB,MAAA,CAAO,CAAA,GAAA,KAAO,IAAI,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA,CACrC,IAAI,CAAA,GAAA,KAAO,GAAA,CAAI,IAAI,CAAA,IAAA,KAAQ;AAC1B,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,IAAA,CAAK,SAAS,GAAG,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAChE,MAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAA;AACrC,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CACX,KAAK,IAAI,CAAA;AAGZ,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,YAAA,EAAc,CAAA,EAAG,EAAE,IAAA,EAAM,UAAA,EAAY,CAAA;AAC5D,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,CAAA,EAAG,KAAA,IAAS,aAAa,CAAA,IAAA,CAAA;AACtC,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,EACzB,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,OAAO,CAAA,KAA2C;AACnE,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC/B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,kCAAkC,EAAE,CAAA;AAEnE,IAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AAExC,MAAA,MAAM,UAAU,IAAI,UAAA,CAAW,MAAM,IAAA,CAAK,aAAa,CAAA;AACvD,MAAA,MAAM,IAAA,GAAO,MAAM,OAAO,MAAM,CAAA;AAChC,MAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,SAAS,EAAE,IAAA,EAAM,SAAS,CAAA;AAC/C,MAAA,MAAM,SAAA,GAAqB,EAAA,CAAG,UAAA,CAAW,GAAA,CAAI,CAAA,EAAA,KAAM;AACjD,QAAA,MAAM,IAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,EAAA,CAAG,MAAA,CAAO,EAAE,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,IAAI,CAAA;AAC1F,QAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,IAAA,CAAK,OAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACtF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AAAE,UAAA,MAAM,KAAK,CAAA,CAAE,GAAA,CAAI,OAAK,MAAA,CAAO,CAAA,IAAK,EAAE,CAAC,CAAA;AAAG,UAAA,OAAO,EAAA,CAAG,MAAA,GAAS,OAAA,EAAS,EAAA,CAAG,KAAK,EAAE,CAAA;AAAG,UAAA,OAAO,EAAA;AAAA,QAAI,CAAC,CAAA;AAC5H,QAAA,OAAO,MAAA,CAAO,MAAA,GAAS,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AACxE,QAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,UAAA,EAAW,EAAG,IAAA,EAAM,EAAA,EAAI,OAAA,EAAS,WAAA,CAAY,OAAO,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,MAC1F,CAAC,CAAA;AACD,MAAA,SAAA,CAAU,SAAS,CAAA;AACnB,MAAA,YAAA,CAAa,CAAC,CAAA;AACd,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA,MAAO;AAEL,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,MAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,MAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,MAAA,CAAO,OAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACxF,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK;AAAE,QAAA,OAAO,CAAA,CAAE,MAAA,GAAS,OAAA,EAAS,CAAA,CAAE,KAAK,EAAE,CAAA;AAAG,QAAA,OAAO,CAAA;AAAA,MAAG,CAAC,CAAA;AACnF,MAAA,OAAO,MAAA,CAAO,MAAA,GAAS,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AACxE,MAAA,iBAAA,CAAkB,EAAE,OAAA,EAAS,WAAA,CAAY,OAAO,CAAA,EAAG,IAAA,EAAM,QAAQ,CAAA;AACjE,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf;AAEA,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAAA,EAC/C,CAAA;AAGA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAA,GAAA,KAAO,GAAA,CAAI,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACtC,IAAA,MAAM,CAAA,GAAI,WAAW,IAAI,CAAA;AACzB,IAAA,IAAI,CAAC,MAAM,CAAC,CAAA,IAAK,KAAK,IAAA,EAAK,EAAG,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,EAC9C,CAAC,CAAC,CAAA;AACF,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,CAAC,GAAG,GAAA,KAAQ,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,UAAQ,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,QAAQ,CAAC,CAAA;AAEzF,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,WAAU,sBAAA,EAChC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,eAAY,KAAA,EAAO,CAAA,EAAG,iBAAiB,KAAA,IAAS,UAAU,CAAC,CAAA,eAAA,CAAA,EAAmB,CAAA;AAAA,oBAC/E,GAAA,CAAC,QAAA,EAAA,EAAS,GAAA,EAAI,aAAA,EAAc,CAAA;AAAA,oBAE5B,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EACZ,QAAA,EAAA;AAAA,MAAA,YAAA,mBACC,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UAAM,IAAA,EAAK,MAAA;AAAA,UAAO,KAAA,EAAO,KAAA;AAAA,UAAO,QAAA,EAAU,CAAA,CAAA,KAAK,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACrE,MAAA,EAAQ,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,UACnC,WAAW,CAAA,CAAA,KAAK;AAAE,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,eAAA,CAAgB,KAAK,CAAA;AAAA,UAAG,CAAA;AAAA,UACjE,SAAA,EAAS,IAAA;AAAA,UACT,SAAA,EAAU;AAAA;AAAA,OAA8H,mBAE1I,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,IAAI,CAAA,EAAG,SAAA,EAAU,8EAAA,EAA+E,KAAA,EAAM,iBAAA,EAC1I,mBAAS,UAAA,EACZ,CAAA;AAAA,sBAGF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,sBAEtC,GAAA,CAAC,OAAA,EAAA,EAAM,GAAA,EAAK,OAAA,EAAS,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,gCAAA,EAAiC,QAAA,EAAU,UAAA,EAAY,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBAClH,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAS,MAAM,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAM;AAAA,UAC5C,SAAA,EAAU,iGAAA;AAAA,UAAkG,QAAA,EAAA;AAAA;AAAA,OAE9G;AAAA,sBACA,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAS,SAAA;AAAA,UACf,SAAA,EAAU,iGAAA;AAAA,UAAkG,QAAA,EAAA;AAAA;AAAA,OAE9G;AAAA,MACC,YAAA,oBACC,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAS,MAAM,YAAA,CAAa,YAAA,IAAgB,CAAA,EAAG,KAAA,IAAS,aAAa,CAAA,IAAA,CAAM,CAAA;AAAA,UACjF,SAAA,EAAU,iGAAA;AAAA,UAAkG,QAAA,EAAA;AAAA;AAAA,OAE9G;AAAA,sBAGF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,sBAEtC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YAAM,IAAA,EAAK,QAAA;AAAA,YAAS,GAAA,EAAI,GAAA;AAAA,YAAI,GAAA,EAAI,IAAA;AAAA,YAAK,KAAA,EAAO,WAAA;AAAA,YAAa,QAAA,EAAU,CAAA,CAAA,KAAK,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACpG,SAAA,EAAU;AAAA;AAAA,SAAgH;AAAA,wBAC5H,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAAO,SAAS,MAAM,UAAA,CAAW,QAAA,CAAS,WAAW,KAAK,CAAC,CAAA;AAAA,YAC1D,SAAA,EAAU,iGAAA;AAAA,YAAkG,QAAA,EAAA;AAAA;AAAA;AAE9G,OAAA,EACF,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YAAM,IAAA,EAAK,QAAA;AAAA,YAAS,GAAA,EAAI,GAAA;AAAA,YAAI,GAAA,EAAI,KAAA;AAAA,YAAM,KAAA,EAAO,WAAA;AAAA,YAAa,QAAA,EAAU,CAAA,CAAA,KAAK,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACrG,SAAA,EAAU;AAAA;AAAA,SAAgH;AAAA,wBAC5H,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAAO,SAAS,MAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,KAAK,EAAE,CAAA;AAAA,YACxD,SAAA,EAAU,iGAAA;AAAA,YAAkG,QAAA,EAAA;AAAA;AAAA;AAE9G,OAAA,EACF,CAAA;AAAA,sBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,sBAEtC,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAS,WAAA;AAAA,UACf,SAAA,EAAU,iGAAA;AAAA,UAAkG,QAAA,EAAA;AAAA;AAAA,OAE9G;AAAA,sBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,2BAGrC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAA4B,KAAA,EAAO,SAAA,GAAY,KAAK,oBAAA,EACjE,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,MAAM,CAAA;AAAA,YAAG,UAAU,CAAC,SAAA;AAAA,YACzD,SAAA,EAAW,CAAA,sDAAA,EAAyD,YAAA,CAAa,IAAA,GAAO,8BAA8B,iCAAiC,CAAA,gDAAA,CAAA;AAAA,YAAoD,QAAA,EAAA;AAAA;AAAA,SAE7M;AAAA,wBACA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,QAAQ,CAAA;AAAA,YAAG,UAAU,CAAC,SAAA;AAAA,YAC3D,SAAA,EAAW,CAAA,mDAAA,EAAsD,YAAA,CAAa,MAAA,GAAS,8BAA8B,iCAAiC,CAAA,gDAAA,CAAA;AAAA,YAAoD,QAAA,EAAA;AAAA;AAAA,SAE5M;AAAA,wBACA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,WAAW,CAAA;AAAA,YAAG,UAAU,CAAC,SAAA;AAAA,YAC9D,SAAA,EAAW,CAAA,sDAAA,EAAyD,YAAA,CAAa,SAAA,GAAY,8BAA8B,iCAAiC,CAAA,gDAAA,CAAA;AAAA,YAAoD,QAAA,EAAA;AAAA;AAAA,SAElN;AAAA,wBACA,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,aAAa,QAAA,IAAY,MAAA;AAAA,YAChC,UAAU,CAAA,CAAA,KAAK,eAAA,CAAgB,UAAA,EAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACzD,UAAU,CAAC,SAAA;AAAA,YACX,SAAA,EAAU,kHAAA;AAAA,YACV,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,IAAA,EAAK,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,8BACrB,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,8BACtB,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,IAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,8BACpB,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,IAAA,EAAK,QAAA,EAAA,GAAA,EAAC;AAAA;AAAA;AAAA;AACtB,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,kBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA,EAAU,YAAA;AAAA,QACV,iBAAiB,CAAC,OAAA,KAAY,kBAAkB,EAAE,OAAA,EAAS,SAAS,CAAA;AAAA,QACpE,UAAA;AAAA,QACA,aAAA,EAAe,cAAA;AAAA,QACf,iBAAA,EAAmB,YAAA;AAAA,QACnB,OAAA,EAAS,YAAA;AAAA,QACT,SAAA,EAAU;AAAA;AAAA,KACZ,EACF,CAAA;AAAA,oBAGA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oEAAA,EACZ,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,GAAA,qBAClB,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,YAAA,CAAa,GAAG,CAAA;AAAA,YAC/B,eAAe,MAAM;AAAE,cAAA,aAAA,CAAc,GAAG,CAAA;AAAG,cAAA,UAAA,CAAW,MAAM,IAAI,CAAA;AAAA,YAAG,CAAA;AAAA,YACnE,eAAe,CAAA,CAAA,KAAK;AAAE,cAAA,CAAA,CAAE,cAAA,EAAe;AAAG,cAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,WAAA,CAAY,GAAG,CAAA;AAAA,YAAG,CAAA;AAAA,YACnF,SAAA,EAAW,CAAA,4EAAA,EACT,GAAA,KAAQ,SAAA,GACJ,kFACA,qDACN,CAAA,CAAA;AAAA,YACC,yBAAe,GAAA,mBACd,GAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBAAM,IAAA,EAAK,MAAA;AAAA,gBAAO,KAAA,EAAO,OAAA;AAAA,gBAAS,QAAA,EAAU,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBACzE,QAAQ,MAAM,WAAA,CAAY,GAAA,EAAK,OAAA,IAAW,MAAM,IAAI,CAAA;AAAA,gBACpD,WAAW,CAAA,CAAA,KAAK;AAAE,kBAAA,IAAI,EAAE,GAAA,KAAQ,OAAA,cAAqB,GAAA,EAAK,OAAA,IAAW,MAAM,IAAI,CAAA;AAAG,kBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,aAAA,CAAc,IAAI,CAAA;AAAA,gBAAG,CAAA;AAAA,gBAC/H,OAAA,EAAS,CAAA,CAAA,KAAK,CAAA,CAAE,eAAA,EAAgB;AAAA,gBAChC,SAAA,EAAS,IAAA;AAAA,gBACT,SAAA,EAAU;AAAA;AAAA,gBACV,KAAA,CAAM;AAAA,WAAA;AAAA,UAhBC,KAAA,CAAM;AAAA,SAkBpB,CAAA;AAAA,wBACD,GAAA,CAAC,YAAO,OAAA,EAAS,QAAA,EAAU,WAAU,+EAAA,EAAgF,KAAA,EAAM,aAAY,QAAA,EAAA,GAAA,EAAC;AAAA,OAAA,EAC1I,CAAA;AAAA,sBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,UAAA,WAAA;AAAA,UAAY;AAAA,SAAA,EAAM,CAAA;AAAA,QACxB,OAAA,CAAQ,MAAA,GAAS,CAAA,oBAChB,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,YAAA,OAAA;AAAA,YAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,CAAE,cAAA,CAAe,MAAA,EAAW,EAAE,qBAAA,EAAuB,GAAG;AAAA,WAAA,EAAE,CAAA;AAAA,+BACtG,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,YAAA,OAAA;AAAA,YAAA,CAAO,QAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAA,EAAG,CAAC,CAAA,GAAI,OAAA,CAAQ,QAAQ,cAAA,CAAe,MAAA,EAAW,EAAE,qBAAA,EAAuB,GAAG;AAAA,WAAA,EAAE;AAAA,SAAA,EAC5H,CAAA;AAAA,6BAED,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,MAAA;AAAA,UAAO,QAAA;AAAA,UAAI,OAAA,CAAQ;AAAA,SAAA,EAAO;AAAA,OAAA,EACxC;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"Spreadsheet-C5GAX4ZW.js","sourcesContent":["import { useState, useCallback, useEffect, useRef } from 'react';\nimport EditableGrid from '../shell/EditableGrid';\nimport type { GridColumn, CellStyle } from '../shell/EditableGrid';\nimport { WindowTitle } from '../shell/Modal';\nimport AboutApp from './_about';\nimport {\n SPREADSHEET_PREVIEW_UPDATE_EVENT,\n peekSpreadsheetPreviewStage,\n claimSpreadsheetPreviewStage,\n type SpreadsheetPreviewData,\n type PendingSpreadsheetStage,\n} from './_spreadsheetStage';\n\nconst TITLE_DISPLAY_MAX = 24;\nfunction truncateForTitle(s: string) {\n return s.length > TITLE_DISPLAY_MAX ? `${s.slice(0, TITLE_DISPLAY_MAX - 1)}…` : s;\n}\n\nconst ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nconst DEFAULT_COLS = 10;\nconst DEFAULT_ROWS = 30;\n\nfunction colLabel(i: number): string {\n if (i < 26) return ALPHA[i];\n return ALPHA[Math.floor(i / 26) - 1] + ALPHA[i % 26];\n}\n\nfunction makeColumns(count: number): GridColumn[] {\n return Array.from({ length: count }, (_, i) => ({\n key: `col_${i}`,\n title: colLabel(i),\n width: 100,\n }));\n}\n\nfunction makeEmptyData(rows: number, cols: number): string[][] {\n return Array.from({ length: rows }, () => Array(cols).fill(''));\n}\n\ninterface Sheet {\n id: string;\n name: string;\n columns: GridColumn[];\n data: string[][];\n /** Per-cell text styling. Key: `${row}:${col}`. */\n cellStyles?: Record<string, CellStyle>;\n}\n\nfunction newSheet(name: string): Sheet {\n return {\n id: crypto.randomUUID(),\n name,\n columns: makeColumns(DEFAULT_COLS),\n data: makeEmptyData(DEFAULT_ROWS, DEFAULT_COLS),\n cellStyles: {},\n };\n}\n\nfunction parseCSV(text: string): string[][] {\n return text.split('\\n').map(line => {\n if (line.includes('\\t')) return line.split('\\t').map(s => s.trim());\n const parts: string[] = [];\n let current = '';\n let inQuotes = false;\n for (const ch of line) {\n if (ch === '\"') { inQuotes = !inQuotes; continue; }\n if (ch === ',' && !inQuotes) { parts.push(current.trim()); current = ''; continue; }\n current += ch;\n }\n parts.push(current.trim());\n return parts;\n }).filter(r => r.some(c => c.trim()));\n}\n\n/** Build a single padded sheet from CSV/TSV text. Shared by file import and\n * the `setSpreadsheetPreview` external-load path. */\nfunction sheetFromCSV(text: string, sheetName: string): Sheet | null {\n const parsed = parseCSV(text);\n if (parsed.length === 0) return null;\n const maxCols = Math.max(DEFAULT_COLS, parsed.reduce((m, r) => Math.max(m, r.length), 0));\n const padded = parsed.map(r => { while (r.length < maxCols) r.push(''); return r; });\n while (padded.length < DEFAULT_ROWS) padded.push(Array(maxCols).fill(''));\n return { id: crypto.randomUUID(), name: sheetName, columns: makeColumns(maxCols), data: padded, cellStyles: {} };\n}\n\n// The consumer-facing staging surface (`setSpreadsheetPreview`,\n// SpreadsheetPreviewData, SpreadsheetPreviewHandle) lives in\n// ./_spreadsheetStage so that hosts importing it don't pull this module into\n// their startup bundle. This component drains the stage via the @internal\n// peek/claim pair.\n\nexport default function Spreadsheet() {\n const containerRef = useRef<HTMLDivElement>(null);\n // One-shot drain: this instance claims whatever was staged and stores the\n // token so it can recognise later `.update()` calls aimed at it. The render\n // phase only PEEKS — under React 18 concurrent rendering a render pass can\n // be discarded and replayed (the first mount of this lazy component\n // suspends on its chunk), and a destructive read here would let the\n // discarded pass swallow the payload, leaving the committed window empty.\n // The stage is cleared in the mount effect below (commit phase) instead.\n const consumedRef = useRef<PendingSpreadsheetStage | null | undefined>(undefined);\n if (consumedRef.current === undefined) {\n consumedRef.current = peekSpreadsheetPreviewStage();\n }\n // What the initial state below was derived from, so the mount effect can\n // tell whether `.update()` has replaced it since.\n const stagedAtRenderRef = useRef<SpreadsheetPreviewData | null>(consumedRef.current?.data ?? null);\n const initialPreview = (() => {\n const p = consumedRef.current;\n if (!p) return null;\n const sheet = sheetFromCSV(p.data.csv, 'Sheet 1');\n if (!sheet) return null;\n const titleName = p.data.filename.replace(/\\.(csv|tsv|txt)$/i, '');\n return { sheet, title: titleName };\n })();\n const [sheets, setSheets] = useState<Sheet[]>(initialPreview ? [initialPreview.sheet] : [newSheet('Sheet 1')]);\n const [activeIdx, setActiveIdx] = useState(0);\n\n // Undo history — push a snapshot whenever sheets change, except when the\n // change came from undo itself.\n const undoStackRef = useRef<Sheet[][]>([]);\n const lastCommittedRef = useRef<Sheet[]>(sheets);\n const skipRecordRef = useRef(false);\n useEffect(() => {\n if (skipRecordRef.current) {\n skipRecordRef.current = false;\n } else if (lastCommittedRef.current !== sheets) {\n undoStackRef.current.push(lastCommittedRef.current);\n if (undoStackRef.current.length > 50) undoStackRef.current.shift();\n }\n lastCommittedRef.current = sheets;\n }, [sheets]);\n const undo = useCallback(() => {\n const prev = undoStackRef.current.pop();\n if (!prev) return;\n skipRecordRef.current = true;\n setSheets(prev);\n }, []);\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (!containerRef.current?.contains(document.activeElement) && !containerRef.current?.matches(':focus-within')) return;\n const isUndo = (e.ctrlKey || e.metaKey) && !e.shiftKey && (e.key === 'z' || e.key === 'Z');\n if (isUndo) {\n e.preventDefault();\n undo();\n }\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [undo]);\n const [title, setTitle] = useState(initialPreview?.title ?? 'Untitled');\n const [emailHandler, setEmailHandler] = useState<SpreadsheetPreviewData['onEmail']>(\n () => consumedRef.current?.data.onEmail,\n );\n\n // Show a payload that arrived after this window was built. Shared by the two\n // delivery routes below — the stage, drained on mount, and the update event.\n const applyPreview = useCallback((next: SpreadsheetPreviewData) => {\n const sheet = sheetFromCSV(next.csv, 'Sheet 1');\n if (!sheet) return;\n setSheets([sheet]);\n setActiveIdx(0);\n setTitle(next.filename.replace(/\\.(csv|tsv|txt)$/i, ''));\n setEmailHandler(() => next.onEmail);\n }, []);\n\n useEffect(() => {\n const stage = consumedRef.current;\n if (stage == null) return;\n // Claim the stage for real once mounted. The identity check (inside\n // claimSpreadsheetPreviewStage) keeps a payload staged *after* our\n // render-phase peek (e.g. a second preview opened in quick succession)\n // available for the window it belongs to.\n claimSpreadsheetPreviewStage(stage);\n // An `.update()` that landed between that peek and this commit had no\n // listener to reach — the effect below had not run yet — so it rewrote the\n // stage instead, and the stage is now the only copy of it. Claim first:\n // from here on the event path is live, and the two effects run in one\n // commit, so nothing can slip between them.\n if (stage.data !== stagedAtRenderRef.current) applyPreview(stage.data);\n }, []);\n\n // Only respond to update events whose token matches our claim.\n useEffect(() => {\n const myToken = consumedRef.current?.token;\n if (myToken == null) return;\n const handler = (e: Event) => {\n const detail = (e as CustomEvent<PendingSpreadsheetStage>).detail;\n if (!detail || detail.token !== myToken) return;\n applyPreview(detail.data);\n };\n window.addEventListener(SPREADSHEET_PREVIEW_UPDATE_EVENT, handler);\n return () => window.removeEventListener(SPREADSHEET_PREVIEW_UPDATE_EVENT, handler);\n }, []);\n const [editingTitle, setEditingTitle] = useState(false);\n const [editingTab, setEditingTab] = useState<number | null>(null);\n const [tabName, setTabName] = useState('');\n const fileRef = useRef<HTMLInputElement>(null);\n const [addColCount, setAddColCount] = useState('1');\n const [addRowCount, setAddRowCount] = useState('10');\n\n const active = sheets[activeIdx] || sheets[0];\n const data = active.data;\n const columns = active.columns;\n const cellStyles = active.cellStyles ?? {};\n const [focusedCell, setFocusedCell] = useState<{ row: number; col: number } | null>(null);\n const [selection, setSelection] = useState<{ anchor: { row: number; col: number }; end: { row: number; col: number } } | null>(null);\n\n // Cells affected by toolbar actions: full selection rectangle if non-empty,\n // otherwise the single focused cell.\n const targetCells = useCallback((): { row: number; col: number }[] => {\n if (selection) {\n const r1 = Math.min(selection.anchor.row, selection.end.row);\n const r2 = Math.max(selection.anchor.row, selection.end.row);\n const c1 = Math.min(selection.anchor.col, selection.end.col);\n const c2 = Math.max(selection.anchor.col, selection.end.col);\n const cells: { row: number; col: number }[] = [];\n for (let r = r1; r <= r2; r++) for (let c = c1; c <= c2; c++) cells.push({ row: r, col: c });\n return cells;\n }\n return focusedCell ? [focusedCell] : [];\n }, [selection, focusedCell]);\n\n const toggleCellStyle = useCallback((key: keyof CellStyle, value?: any) => {\n const cells = targetCells();\n if (cells.length === 0) return;\n setSheets(prev => prev.map((s, i) => {\n if (i !== activeIdx) return s;\n const styles = { ...(s.cellStyles ?? {}) };\n // For toggles, derive the new state from the FIRST cell so the whole\n // selection ends up consistent (rather than each cell flipping\n // independently).\n const firstKey = `${cells[0].row}:${cells[0].col}`;\n const desired = value !== undefined ? value : !((styles[firstKey] ?? {})[key] as any);\n for (const { row, col } of cells) {\n const k = `${row}:${col}`;\n styles[k] = { ...(styles[k] ?? {}), [key]: desired };\n }\n return { ...s, cellStyles: styles };\n }));\n }, [targetCells, activeIdx]);\n\n const headCell = selection ? { row: selection.anchor.row, col: selection.anchor.col } : focusedCell;\n const focusedStyle: CellStyle = headCell ? (cellStyles[`${headCell.row}:${headCell.col}`] ?? {}) : {};\n const hasTarget = !!headCell;\n\n const updateActiveSheet = useCallback((update: Partial<Sheet>) => {\n setSheets(prev => prev.map((s, i) => i === activeIdx ? { ...s, ...update } : s));\n }, [activeIdx]);\n\n const handleChange = useCallback((newData: string[][]) => {\n // Sync column count if rows were inserted/deleted with different column counts\n const maxCols = newData.reduce((m, r) => Math.max(m, r.length), 0);\n if (maxCols !== columns.length) {\n updateActiveSheet({ data: newData, columns: makeColumns(maxCols) });\n } else {\n updateActiveSheet({ data: newData });\n }\n }, [updateActiveSheet, columns.length]);\n\n // Tab management\n const addSheet = () => {\n const name = `Sheet ${sheets.length + 1}`;\n setSheets(prev => [...prev, newSheet(name)]);\n setActiveIdx(sheets.length);\n };\n\n const removeSheet = (idx: number) => {\n if (sheets.length <= 1) return;\n setSheets(prev => prev.filter((_, i) => i !== idx));\n if (activeIdx >= idx && activeIdx > 0) setActiveIdx(activeIdx - 1);\n };\n\n const renameSheet = (idx: number, name: string) => {\n setSheets(prev => prev.map((s, i) => i === idx ? { ...s, name } : s));\n setEditingTab(null);\n };\n\n // Add columns to active sheet\n const addColumns = (count: number) => {\n const newColCount = columns.length + count;\n updateActiveSheet({\n columns: makeColumns(newColCount),\n data: data.map(row => [...row, ...Array(count).fill('')]),\n });\n };\n\n // Add rows to active sheet\n const addRows = (count: number) => {\n updateActiveSheet({\n data: [...data, ...Array.from({ length: count }, () => Array(columns.length).fill(''))],\n });\n };\n\n // Clear active sheet\n const handleClear = () => {\n updateActiveSheet({\n columns: makeColumns(DEFAULT_COLS),\n data: makeEmptyData(DEFAULT_ROWS, DEFAULT_COLS),\n });\n };\n\n // Serialize the active sheet (current edits included) as CSV\n const serializeCSV = () => data\n .filter(row => row.some(c => c.trim()))\n .map(row => row.map(cell => {\n if (cell.includes(',') || cell.includes('\"') || cell.includes('\\n'))\n return `\"${cell.replace(/\"/g, '\"\"')}\"`;\n return cell;\n }).join(','))\n .join('\\n');\n\n // Export as CSV\n const exportCSV = () => {\n const blob = new Blob([serializeCSV()], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${title || 'spreadsheet'}.csv`;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n // Import CSV / XLSX\n const importFile = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const name = file.name.replace(/\\.(csv|tsv|txt|xlsx|xls|ods)$/i, '');\n\n if (/\\.(xlsx|xls|ods)$/i.test(file.name)) {\n // XLSX — dynamic import\n const byteArr = new Uint8Array(await file.arrayBuffer());\n const XLSX = await import('xlsx');\n const wb = XLSX.read(byteArr, { type: 'array' });\n const newSheets: Sheet[] = wb.SheetNames.map(sn => {\n const rows: string[][] = XLSX.utils.sheet_to_json(wb.Sheets[sn], { header: 1, defval: '' });\n const maxCols = Math.max(DEFAULT_COLS, rows.reduce((m, r) => Math.max(m, r.length), 0));\n const padded = rows.map(r => { const nr = r.map(c => String(c ?? '')); while (nr.length < maxCols) nr.push(''); return nr; });\n while (padded.length < DEFAULT_ROWS) padded.push(Array(maxCols).fill(''));\n return { id: crypto.randomUUID(), name: sn, columns: makeColumns(maxCols), data: padded };\n });\n setSheets(newSheets);\n setActiveIdx(0);\n setTitle(name);\n } else {\n // CSV/TSV\n const text = await file.text();\n const parsed = parseCSV(text);\n if (parsed.length === 0) return;\n const maxCols = Math.max(DEFAULT_COLS, parsed.reduce((m, r) => Math.max(m, r.length), 0));\n const padded = parsed.map(r => { while (r.length < maxCols) r.push(''); return r; });\n while (padded.length < DEFAULT_ROWS) padded.push(Array(maxCols).fill(''));\n updateActiveSheet({ columns: makeColumns(maxCols), data: padded });\n setTitle(name);\n }\n\n if (fileRef.current) fileRef.current.value = '';\n };\n\n // Stats\n const allNums: number[] = [];\n data.forEach(row => row.forEach(cell => {\n const v = parseFloat(cell);\n if (!isNaN(v) && cell.trim()) allNums.push(v);\n }));\n const filledCount = data.reduce((c, row) => c + row.filter(cell => cell.trim()).length, 0);\n\n return (\n <div ref={containerRef} className=\"flex flex-col h-full\">\n <WindowTitle title={`${truncateForTitle(title || 'Untitled')} - Spreadsheets`} />\n <AboutApp app=\"spreadsheet\" />\n {/* Toolbar */}\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0\">\n {editingTitle ? (\n <input type=\"text\" value={title} onChange={e => setTitle(e.target.value)}\n onBlur={() => setEditingTitle(false)}\n onKeyDown={e => { if (e.key === 'Enter') setEditingTitle(false); }}\n autoFocus\n className=\"text-sm font-medium text-gray-900 border border-gray-300 rounded px-2 py-0.5 w-40 focus:border-blue-500 focus:ring-blue-500\" />\n ) : (\n <button onClick={() => setEditingTitle(true)} className=\"text-sm font-medium text-gray-900 hover:text-blue-600 truncate max-w-[200px]\" title=\"Click to rename\">\n {title || 'Untitled'}\n </button>\n )}\n\n <div className=\"h-4 w-px bg-gray-300\" />\n\n <input ref={fileRef} type=\"file\" accept=\".csv,.tsv,.txt,.xlsx,.xls,.ods\" onChange={importFile} className=\"hidden\" />\n <button onClick={() => fileRef.current?.click()}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n Open\n </button>\n <button onClick={exportCSV}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n Save CSV\n </button>\n {emailHandler && (\n <button onClick={() => emailHandler(serializeCSV(), `${title || 'spreadsheet'}.csv`)}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n Email\n </button>\n )}\n\n <div className=\"h-4 w-px bg-gray-300\" />\n\n <div className=\"flex items-center gap-1\">\n <input type=\"number\" min=\"1\" max=\"50\" value={addColCount} onChange={e => setAddColCount(e.target.value)}\n className=\"w-10 text-xs text-center border border-gray-300 rounded px-1 py-0.5 focus:border-blue-500 focus:ring-blue-500\" />\n <button onClick={() => addColumns(parseInt(addColCount) || 1)}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n + Col\n </button>\n </div>\n <div className=\"flex items-center gap-1\">\n <input type=\"number\" min=\"1\" max=\"500\" value={addRowCount} onChange={e => setAddRowCount(e.target.value)}\n className=\"w-10 text-xs text-center border border-gray-300 rounded px-1 py-0.5 focus:border-blue-500 focus:ring-blue-500\" />\n <button onClick={() => addRows(parseInt(addRowCount) || 10)}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n + Row\n </button>\n </div>\n\n <div className=\"h-4 w-px bg-gray-300\" />\n\n <button onClick={handleClear}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n Clear\n </button>\n\n <div className=\"h-4 w-px bg-gray-300\" />\n\n {/* Font style panel — applies to the focused cell. */}\n <div className=\"flex items-center gap-0.5\" title={hasTarget ? '' : 'Click a cell first'}>\n <button onClick={() => toggleCellStyle('bold')} disabled={!hasTarget}\n className={`px-2 py-1 text-xs rounded transition-colors font-bold ${focusedStyle.bold ? 'bg-blue-100 text-blue-700' : 'text-gray-600 hover:bg-gray-200'} disabled:opacity-40 disabled:cursor-not-allowed`}>\n B\n </button>\n <button onClick={() => toggleCellStyle('italic')} disabled={!hasTarget}\n className={`px-2 py-1 text-xs rounded transition-colors italic ${focusedStyle.italic ? 'bg-blue-100 text-blue-700' : 'text-gray-600 hover:bg-gray-200'} disabled:opacity-40 disabled:cursor-not-allowed`}>\n I\n </button>\n <button onClick={() => toggleCellStyle('underline')} disabled={!hasTarget}\n className={`px-2 py-1 text-xs rounded transition-colors underline ${focusedStyle.underline ? 'bg-blue-100 text-blue-700' : 'text-gray-600 hover:bg-gray-200'} disabled:opacity-40 disabled:cursor-not-allowed`}>\n U\n </button>\n <select\n value={focusedStyle.fontSize ?? 'base'}\n onChange={e => toggleCellStyle('fontSize', e.target.value)}\n disabled={!hasTarget}\n className=\"ml-1 text-xs border border-gray-300 rounded px-1 py-0.5 bg-white disabled:opacity-40 disabled:cursor-not-allowed\">\n <option value=\"sm\">XS</option>\n <option value=\"base\">S</option>\n <option value=\"lg\">M</option>\n <option value=\"xl\">L</option>\n </select>\n </div>\n </div>\n\n {/* Grid */}\n <div className=\"flex-1 min-h-0\">\n <EditableGrid\n columns={columns}\n data={data}\n onChange={handleChange}\n onColumnsChange={(newCols) => updateActiveSheet({ columns: newCols })}\n cellStyles={cellStyles}\n onFocusChange={setFocusedCell}\n onSelectionChange={setSelection}\n minRows={DEFAULT_ROWS}\n maxHeight=\"100%\"\n />\n </div>\n\n {/* Sheet tabs + status bar */}\n <div className=\"flex items-center border-t border-gray-200 bg-gray-50 shrink-0\">\n <div className=\"flex items-center gap-0.5 px-1 py-1 overflow-x-auto flex-1 min-w-0\">\n {sheets.map((sheet, idx) => (\n <button key={sheet.id}\n onClick={() => setActiveIdx(idx)}\n onDoubleClick={() => { setEditingTab(idx); setTabName(sheet.name); }}\n onContextMenu={e => { e.preventDefault(); if (sheets.length > 1) removeSheet(idx); }}\n className={`px-3 py-1 text-xs font-medium rounded-b whitespace-nowrap transition-colors ${\n idx === activeIdx\n ? 'bg-white text-blue-700 border border-t-0 border-gray-300 -mt-px relative z-10'\n : 'text-gray-500 hover:text-gray-700 hover:bg-gray-100'\n }`}>\n {editingTab === idx ? (\n <input type=\"text\" value={tabName} onChange={e => setTabName(e.target.value)}\n onBlur={() => renameSheet(idx, tabName || sheet.name)}\n onKeyDown={e => { if (e.key === 'Enter') renameSheet(idx, tabName || sheet.name); if (e.key === 'Escape') setEditingTab(null); }}\n onClick={e => e.stopPropagation()}\n autoFocus\n className=\"w-20 text-xs border border-blue-400 rounded px-1 py-0 focus:ring-0 focus:outline-none\" />\n ) : sheet.name}\n </button>\n ))}\n <button onClick={addSheet} className=\"px-2 py-1 text-xs text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded\" title=\"Add sheet\">+</button>\n </div>\n\n <div className=\"flex items-center gap-4 px-3 py-1 text-xs text-gray-500 shrink-0 border-l border-gray-200\">\n <span>{filledCount} cells</span>\n {allNums.length > 0 && (\n <>\n <span>Sum: {allNums.reduce((s, v) => s + v, 0).toLocaleString(undefined, { maximumFractionDigits: 2 })}</span>\n <span>Avg: {(allNums.reduce((s, v) => s + v, 0) / allNums.length).toLocaleString(undefined, { maximumFractionDigits: 2 })}</span>\n </>\n )}\n <span>{data.length} × {columns.length}</span>\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { loadAppearance, WidgetSettingsModal } from './chunk-
|
|
2
|
-
import { useWidgetSettings } from './chunk-
|
|
1
|
+
import { loadAppearance, WidgetSettingsModal } from './chunk-ZO4XGUZQ.js';
|
|
2
|
+
import { useWidgetSettings } from './chunk-EXSEW5F3.js';
|
|
3
3
|
import './chunk-BLLINYDD.js';
|
|
4
4
|
import './chunk-CDR2Q64Q.js';
|
|
5
5
|
import './chunk-WNLPTLT6.js';
|
|
@@ -149,5 +149,5 @@ function Stock() {
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
export { Stock as default };
|
|
152
|
-
//# sourceMappingURL=Stock-
|
|
153
|
-
//# sourceMappingURL=Stock-
|
|
152
|
+
//# sourceMappingURL=Stock-WZXVQX3G.js.map
|
|
153
|
+
//# sourceMappingURL=Stock-WZXVQX3G.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/Stock.tsx"],"names":[],"mappings":"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","file":"Stock-OVVGE7US.js","sourcesContent":["import { useState, useCallback } from 'react';\nimport { useWidgetSettings } from '../shell/Modal';\nimport WidgetSettingsModal, { loadAppearance, type WidgetAppearance } from '../shell/WidgetSettingsModal';\n\n/**\n * Stock ticker widget — track a watchlist of equities with demo prices.\n *\n * Prices are static, in-file demo data (DEMO_QUOTES) so the widget works with\n * no API key and no server. \"Setup\" is just picking which demo tickers to show.\n */\n\n/** Cap the watchlist — keeps the widget compact. */\nconst MAX_SYMBOLS = 8;\nconst DEFAULT_SYMBOLS = ['AAPL', 'MSFT', 'GOOGL', 'TSLA', 'NVDA'];\n\nconst SYMBOLS_KEY = 'stock_symbols';\nconst SETTINGS_KEY = 'stock_appearance';\n\ninterface Quote { price: number; change: number; changePct: number }\n\n/** Static demo quotes — realistic-ish values, a mix of gainers and losers. */\nconst DEMO_QUOTES: Record<string, Quote> = {\n AAPL: { price: 229.87, change: 1.42, changePct: 0.62 },\n MSFT: { price: 451.16, change: -2.31, changePct: -0.51 },\n GOOGL: { price: 178.34, change: 0.89, changePct: 0.50 },\n AMZN: { price: 201.45, change: -1.08, changePct: -0.53 },\n TSLA: { price: 248.92, change: 6.74, changePct: 2.78 },\n NVDA: { price: 134.81, change: -3.12, changePct: -2.26 },\n META: { price: 563.27, change: 4.55, changePct: 0.81 },\n};\n\n/** Demo tickers offered in the symbol picker. */\nconst DEMO_TICKERS = Object.keys(DEMO_QUOTES);\n\nfunction loadSymbols(): string[] {\n try { const s = JSON.parse(localStorage.getItem(SYMBOLS_KEY) || ''); if (Array.isArray(s) && s.length) return s.slice(0, MAX_SYMBOLS); } catch {}\n return DEFAULT_SYMBOLS;\n}\n\nconst fmtPrice = (n: number) => `$${n.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\nconst fmtSigned = (n: number) => `${n >= 0 ? '+' : ''}${n.toFixed(2)}`;\n\nexport default function Stock() {\n const [symbols, setSymbols] = useState(loadSymbols);\n const [appearance, setAppearance] = useState(() => loadAppearance(SETTINGS_KEY));\n\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [configSymbols, setConfigSymbols] = useState<string[]>([]);\n const [configAppearance, setConfigAppearance] = useState<WidgetAppearance>(appearance);\n const [newSymbol, setNewSymbol] = useState('');\n\n const openSettings = useCallback(() => {\n setConfigSymbols([...symbols]);\n setConfigAppearance({ ...appearance });\n setNewSymbol('');\n setSettingsOpen(true);\n }, [symbols, appearance]);\n\n useWidgetSettings(openSettings);\n\n const addSymbol = () => {\n const s = newSymbol.trim().toUpperCase();\n if (!s || configSymbols.includes(s) || configSymbols.length >= MAX_SYMBOLS) return;\n setConfigSymbols(p => [...p, s]);\n setNewSymbol('');\n };\n\n const saveSettings = () => {\n const cleaned = configSymbols.map(s => s.toUpperCase()).slice(0, MAX_SYMBOLS);\n setSymbols(cleaned); setAppearance(configAppearance);\n localStorage.setItem(SYMBOLS_KEY, JSON.stringify(cleaned));\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(configAppearance));\n setSettingsOpen(false);\n };\n\n // Tickers the picker can still offer (demo set minus what's already added).\n const availableTickers = DEMO_TICKERS.filter(t => !configSymbols.includes(t));\n\n return (\n <>\n {/* Theme-aware panel — mirrors the taskbar's `--taskbar-bg-rgb` so the\n * widget matches it across themes; gray-* classes auto-invert in dark.\n *\n * A plain naturally-flowing div — deliberately no `h-full`/`flex-1`, so\n * the window's `autoHeight` measurement hugs these rows instead of\n * reading the root as fill-height and pinning the window to its full\n * `dimensions` height (320×360) with empty space below the rows. */}\n <div\n style={{ backgroundColor: `rgb(var(--taskbar-bg-rgb, 243 244 246) / ${appearance.activeOpacity / 100})`, backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : undefined }}>\n <div className=\"px-4 py-3\">\n {symbols.length === 0 ? (\n <div className=\"text-xs text-gray-500 text-center py-6\">No symbols yet — add some in settings.</div>\n ) : (\n <div className=\"space-y-0.5\">\n {symbols.map(sym => {\n const q = DEMO_QUOTES[sym];\n const up = (q?.change ?? 0) >= 0;\n const color = !q ? 'text-gray-400' : q.change > 0 ? 'text-green-600' : q.change < 0 ? 'text-red-600' : 'text-gray-500';\n return (\n <div key={sym} className=\"flex items-center justify-between px-2 py-2 border-b border-gray-200 last:border-0\">\n <span className=\"text-sm font-bold text-gray-800 tracking-tight\">{sym}</span>\n {q ? (\n <div className=\"flex flex-col items-end leading-tight\">\n <span className=\"text-sm font-mono font-semibold text-gray-900 tabular-nums\">{fmtPrice(q.price)}</span>\n <span className={`text-[11px] font-medium tabular-nums ${color}`}>{up ? '▲' : '▼'} {fmtSigned(q.change)} ({fmtSigned(q.changePct)}%)</span>\n </div>\n ) : (\n <span className=\"text-sm font-mono text-gray-400 tabular-nums\">—</span>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n\n <WidgetSettingsModal open={settingsOpen} onClose={() => setSettingsOpen(false)} title=\"Stock Settings\"\n appearance={configAppearance} onAppearanceChange={setConfigAppearance} onSave={saveSettings}>\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">Symbols <span className=\"text-[11px] font-normal text-gray-400\">({configSymbols.length}/{MAX_SYMBOLS})</span></h3>\n <div className=\"space-y-1 mb-2\">\n {configSymbols.map((s, i) => (\n <div key={i} className=\"flex items-center justify-between py-1 px-2 bg-gray-50 rounded\">\n <span className=\"text-sm font-semibold text-gray-700\">{s}</span>\n <button onClick={() => setConfigSymbols(p => p.filter((_, idx) => idx !== i))} className=\"text-red-400 hover:text-red-600\">×</button>\n </div>\n ))}\n {configSymbols.length === 0 && <p className=\"text-[11px] text-gray-400 italic\">No symbols — add a ticker below.</p>}\n </div>\n {configSymbols.length < MAX_SYMBOLS ? (\n <div className=\"flex items-center gap-2\">\n <input value={newSymbol} onChange={e => setNewSymbol(e.target.value)} onKeyDown={e => { if (e.key === 'Enter') addSymbol(); }}\n placeholder=\"e.g. NVDA\" className=\"flex-1 bg-gray-50 border border-gray-200 rounded px-2 py-1 text-sm uppercase focus:outline-none focus:ring-1 focus:ring-blue-500\" />\n <button onClick={addSymbol} className=\"text-sm font-medium text-blue-600 hover:text-blue-800 px-2\">+ Add</button>\n </div>\n ) : (\n <p className=\"text-[11px] text-gray-400 italic\">Max {MAX_SYMBOLS} symbols — remove one to add another.</p>\n )}\n {availableTickers.length > 0 && configSymbols.length < MAX_SYMBOLS && (\n <div className=\"flex flex-wrap gap-1.5 mt-2\">\n {availableTickers.map(t => (\n <button key={t} onClick={() => setConfigSymbols(p => p.length < MAX_SYMBOLS ? [...p, t] : p)}\n className=\"text-[11px] font-medium text-gray-600 bg-gray-100 hover:bg-gray-200 rounded px-2 py-0.5 transition-colors\">{t}</button>\n ))}\n </div>\n )}\n <p className=\"text-[11px] text-gray-400 mt-2\">Demo prices — static sample data, no live feed.</p>\n </div>\n </WidgetSettingsModal>\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/apps/Stock.tsx"],"names":[],"mappings":"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","file":"Stock-WZXVQX3G.js","sourcesContent":["import { useState, useCallback } from 'react';\nimport { useWidgetSettings } from '../shell/Modal';\nimport WidgetSettingsModal, { loadAppearance, type WidgetAppearance } from '../shell/WidgetSettingsModal';\n\n/**\n * Stock ticker widget — track a watchlist of equities with demo prices.\n *\n * Prices are static, in-file demo data (DEMO_QUOTES) so the widget works with\n * no API key and no server. \"Setup\" is just picking which demo tickers to show.\n */\n\n/** Cap the watchlist — keeps the widget compact. */\nconst MAX_SYMBOLS = 8;\nconst DEFAULT_SYMBOLS = ['AAPL', 'MSFT', 'GOOGL', 'TSLA', 'NVDA'];\n\nconst SYMBOLS_KEY = 'stock_symbols';\nconst SETTINGS_KEY = 'stock_appearance';\n\ninterface Quote { price: number; change: number; changePct: number }\n\n/** Static demo quotes — realistic-ish values, a mix of gainers and losers. */\nconst DEMO_QUOTES: Record<string, Quote> = {\n AAPL: { price: 229.87, change: 1.42, changePct: 0.62 },\n MSFT: { price: 451.16, change: -2.31, changePct: -0.51 },\n GOOGL: { price: 178.34, change: 0.89, changePct: 0.50 },\n AMZN: { price: 201.45, change: -1.08, changePct: -0.53 },\n TSLA: { price: 248.92, change: 6.74, changePct: 2.78 },\n NVDA: { price: 134.81, change: -3.12, changePct: -2.26 },\n META: { price: 563.27, change: 4.55, changePct: 0.81 },\n};\n\n/** Demo tickers offered in the symbol picker. */\nconst DEMO_TICKERS = Object.keys(DEMO_QUOTES);\n\nfunction loadSymbols(): string[] {\n try { const s = JSON.parse(localStorage.getItem(SYMBOLS_KEY) || ''); if (Array.isArray(s) && s.length) return s.slice(0, MAX_SYMBOLS); } catch {}\n return DEFAULT_SYMBOLS;\n}\n\nconst fmtPrice = (n: number) => `$${n.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\nconst fmtSigned = (n: number) => `${n >= 0 ? '+' : ''}${n.toFixed(2)}`;\n\nexport default function Stock() {\n const [symbols, setSymbols] = useState(loadSymbols);\n const [appearance, setAppearance] = useState(() => loadAppearance(SETTINGS_KEY));\n\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [configSymbols, setConfigSymbols] = useState<string[]>([]);\n const [configAppearance, setConfigAppearance] = useState<WidgetAppearance>(appearance);\n const [newSymbol, setNewSymbol] = useState('');\n\n const openSettings = useCallback(() => {\n setConfigSymbols([...symbols]);\n setConfigAppearance({ ...appearance });\n setNewSymbol('');\n setSettingsOpen(true);\n }, [symbols, appearance]);\n\n useWidgetSettings(openSettings);\n\n const addSymbol = () => {\n const s = newSymbol.trim().toUpperCase();\n if (!s || configSymbols.includes(s) || configSymbols.length >= MAX_SYMBOLS) return;\n setConfigSymbols(p => [...p, s]);\n setNewSymbol('');\n };\n\n const saveSettings = () => {\n const cleaned = configSymbols.map(s => s.toUpperCase()).slice(0, MAX_SYMBOLS);\n setSymbols(cleaned); setAppearance(configAppearance);\n localStorage.setItem(SYMBOLS_KEY, JSON.stringify(cleaned));\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(configAppearance));\n setSettingsOpen(false);\n };\n\n // Tickers the picker can still offer (demo set minus what's already added).\n const availableTickers = DEMO_TICKERS.filter(t => !configSymbols.includes(t));\n\n return (\n <>\n {/* Theme-aware panel — mirrors the taskbar's `--taskbar-bg-rgb` so the\n * widget matches it across themes; gray-* classes auto-invert in dark.\n *\n * A plain naturally-flowing div — deliberately no `h-full`/`flex-1`, so\n * the window's `autoHeight` measurement hugs these rows instead of\n * reading the root as fill-height and pinning the window to its full\n * `dimensions` height (320×360) with empty space below the rows. */}\n <div\n style={{ backgroundColor: `rgb(var(--taskbar-bg-rgb, 243 244 246) / ${appearance.activeOpacity / 100})`, backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : undefined }}>\n <div className=\"px-4 py-3\">\n {symbols.length === 0 ? (\n <div className=\"text-xs text-gray-500 text-center py-6\">No symbols yet — add some in settings.</div>\n ) : (\n <div className=\"space-y-0.5\">\n {symbols.map(sym => {\n const q = DEMO_QUOTES[sym];\n const up = (q?.change ?? 0) >= 0;\n const color = !q ? 'text-gray-400' : q.change > 0 ? 'text-green-600' : q.change < 0 ? 'text-red-600' : 'text-gray-500';\n return (\n <div key={sym} className=\"flex items-center justify-between px-2 py-2 border-b border-gray-200 last:border-0\">\n <span className=\"text-sm font-bold text-gray-800 tracking-tight\">{sym}</span>\n {q ? (\n <div className=\"flex flex-col items-end leading-tight\">\n <span className=\"text-sm font-mono font-semibold text-gray-900 tabular-nums\">{fmtPrice(q.price)}</span>\n <span className={`text-[11px] font-medium tabular-nums ${color}`}>{up ? '▲' : '▼'} {fmtSigned(q.change)} ({fmtSigned(q.changePct)}%)</span>\n </div>\n ) : (\n <span className=\"text-sm font-mono text-gray-400 tabular-nums\">—</span>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n\n <WidgetSettingsModal open={settingsOpen} onClose={() => setSettingsOpen(false)} title=\"Stock Settings\"\n appearance={configAppearance} onAppearanceChange={setConfigAppearance} onSave={saveSettings}>\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">Symbols <span className=\"text-[11px] font-normal text-gray-400\">({configSymbols.length}/{MAX_SYMBOLS})</span></h3>\n <div className=\"space-y-1 mb-2\">\n {configSymbols.map((s, i) => (\n <div key={i} className=\"flex items-center justify-between py-1 px-2 bg-gray-50 rounded\">\n <span className=\"text-sm font-semibold text-gray-700\">{s}</span>\n <button onClick={() => setConfigSymbols(p => p.filter((_, idx) => idx !== i))} className=\"text-red-400 hover:text-red-600\">×</button>\n </div>\n ))}\n {configSymbols.length === 0 && <p className=\"text-[11px] text-gray-400 italic\">No symbols — add a ticker below.</p>}\n </div>\n {configSymbols.length < MAX_SYMBOLS ? (\n <div className=\"flex items-center gap-2\">\n <input value={newSymbol} onChange={e => setNewSymbol(e.target.value)} onKeyDown={e => { if (e.key === 'Enter') addSymbol(); }}\n placeholder=\"e.g. NVDA\" className=\"flex-1 bg-gray-50 border border-gray-200 rounded px-2 py-1 text-sm uppercase focus:outline-none focus:ring-1 focus:ring-blue-500\" />\n <button onClick={addSymbol} className=\"text-sm font-medium text-blue-600 hover:text-blue-800 px-2\">+ Add</button>\n </div>\n ) : (\n <p className=\"text-[11px] text-gray-400 italic\">Max {MAX_SYMBOLS} symbols — remove one to add another.</p>\n )}\n {availableTickers.length > 0 && configSymbols.length < MAX_SYMBOLS && (\n <div className=\"flex flex-wrap gap-1.5 mt-2\">\n {availableTickers.map(t => (\n <button key={t} onClick={() => setConfigSymbols(p => p.length < MAX_SYMBOLS ? [...p, t] : p)}\n className=\"text-[11px] font-medium text-gray-600 bg-gray-100 hover:bg-gray-200 rounded px-2 py-0.5 transition-colors\">{t}</button>\n ))}\n </div>\n )}\n <p className=\"text-[11px] text-gray-400 mt-2\">Demo prices — static sample data, no live feed.</p>\n </div>\n </WidgetSettingsModal>\n </>\n );\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { fetchCityWeather, getCondition, AVAILABLE_CITIES, toFahrenheit } from './chunk-7CCHEEYC.js';
|
|
2
|
-
import { loadAppearance, WidgetSettingsModal } from './chunk-
|
|
3
|
-
import { useWidgetSettings } from './chunk-
|
|
2
|
+
import { loadAppearance, WidgetSettingsModal } from './chunk-ZO4XGUZQ.js';
|
|
3
|
+
import { useWidgetSettings } from './chunk-EXSEW5F3.js';
|
|
4
4
|
import { useShellPrefs } from './chunk-BLLINYDD.js';
|
|
5
5
|
import './chunk-CDR2Q64Q.js';
|
|
6
6
|
import './chunk-WNLPTLT6.js';
|
|
@@ -422,5 +422,5 @@ function Weather() {
|
|
|
422
422
|
}
|
|
423
423
|
|
|
424
424
|
export { Weather as default };
|
|
425
|
-
//# sourceMappingURL=Weather-
|
|
426
|
-
//# sourceMappingURL=Weather-
|
|
425
|
+
//# sourceMappingURL=Weather-FQ7ZVXVR.js.map
|
|
426
|
+
//# sourceMappingURL=Weather-FQ7ZVXVR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/Weather.tsx"],"names":["parts","h","m","t"],"mappings":"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","file":"Weather-PKUXHYIL.js","sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport { useWidgetSettings } from '../shell/Modal';\nimport WidgetSettingsModal, { loadAppearance, type WidgetAppearance } from '../shell/WidgetSettingsModal';\nimport { useShellPrefs } from '../shell/ShellPrefs';\nimport { AVAILABLE_CITIES, fetchCityWeather, getCondition, toFahrenheit, type CityWeather } from './_weatherData';\n\nconst STORAGE_KEY = 'weather_city';\nconst LEGACY_KEY = 'weather_cities';\nconst SETTINGS_KEY = 'weather_appearance';\n\ninterface WeatherPrefs { useFahrenheit: boolean; showLocalTime: boolean; use24Hour: boolean }\nconst DEFAULT_PREFS: WeatherPrefs = { useFahrenheit: false, showLocalTime: true, use24Hour: false };\n\nfunction detectLocalCity(): string {\n try {\n const userTz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n for (const [name, info] of Object.entries(AVAILABLE_CITIES)) {\n if (info.tz === userTz) return name;\n }\n } catch {}\n return 'London';\n}\n\nfunction loadCity(): string {\n const v = typeof localStorage !== 'undefined' ? localStorage.getItem(STORAGE_KEY) : null;\n if (v && AVAILABLE_CITIES[v]) return v;\n try {\n const arr = JSON.parse(localStorage.getItem(LEGACY_KEY) || '');\n if (Array.isArray(arr) && arr[0] && AVAILABLE_CITIES[arr[0]]) {\n localStorage.setItem(STORAGE_KEY, arr[0]);\n return arr[0];\n }\n } catch {}\n return detectLocalCity();\n}\n\nconst toF = toFahrenheit;\n\nfunction getTimeInTz(timezone: string, use24Hour = false): string {\n try {\n if (use24Hour) {\n const parts = new Intl.DateTimeFormat('en-US', { timeZone: timezone, hour: 'numeric', minute: '2-digit', hour12: false }).formatToParts(new Date());\n const h = parseInt(parts.find(p => p.type === 'hour')?.value || '0');\n const m = parseInt(parts.find(p => p.type === 'minute')?.value || '0');\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`;\n }\n const parts = new Intl.DateTimeFormat('en-US', { timeZone: timezone, hour: 'numeric', minute: '2-digit', hour12: true }).formatToParts(new Date());\n const h = parseInt(parts.find(p => p.type === 'hour')?.value || '12');\n const m = parseInt(parts.find(p => p.type === 'minute')?.value || '0');\n const period = parts.find(p => p.type === 'dayPeriod')?.value || '';\n return `${h}:${String(m).padStart(2, '0')} ${period}`;\n } catch { return ''; }\n}\n\n/**\n * Effect keyframes — tuned for a ~110 px-tall card so drops/flakes fall\n * across the full height before recycling. Multiple snow/rain variants\n * give the impression of independent particles instead of a hypnotic\n * lock-step pattern.\n */\nconst WX_KEYFRAMES = `\n@keyframes wx-rain-a { 0% { transform: translate(0,-20px); opacity: 0; } 10% { opacity: 0.95; } 100% { transform: translate(8px,140px); opacity: 0; } }\n@keyframes wx-rain-b { 0% { transform: translate(0,-20px); opacity: 0; } 12% { opacity: 0.85; } 100% { transform: translate(12px,140px); opacity: 0; } }\n@keyframes wx-rain-c { 0% { transform: translate(0,-20px); opacity: 0; } 10% { opacity: 1; } 100% { transform: translate(5px,140px); opacity: 0; } }\n@keyframes wx-snow-a { 0% { transform: translate(0,-12px) rotate(0deg); opacity: 0; } 10% { opacity: 0.9; } 50% { transform: translate(10px,55px) rotate(180deg); } 100% { transform: translate(-4px,140px) rotate(360deg); opacity: 0; } }\n@keyframes wx-snow-b { 0% { transform: translate(0,-12px) rotate(0deg); opacity: 0; } 10% { opacity: 0.85; } 50% { transform: translate(-12px,55px) rotate(-180deg); } 100% { transform: translate(6px,140px) rotate(-360deg); opacity: 0; } }\n@keyframes wx-snow-c { 0% { transform: translate(0,-12px); opacity: 0; } 10% { opacity: 0.7; } 100% { transform: translate(2px,140px); opacity: 0; } }\n@keyframes wx-drift-cloud { 0% { transform: translateX(-40%); } 100% { transform: translateX(140%); } }\n@keyframes wx-twinkle { 0%, 100% { opacity: 0.25; transform: scale(1); } 50% { opacity: 1; transform: scale(1.6); } }\n@keyframes wx-flash { 0%, 86%, 100% { opacity: 0; } 87% { opacity: 0.95; } 88% { opacity: 0.15; } 89% { opacity: 0.85; } 90% { opacity: 0; } }\n@keyframes wx-bolt { 0%, 86%, 90%, 100% { opacity: 0; } 87% { opacity: 1; } 89% { opacity: 0.85; } }\n@keyframes wx-sun-pulse { 0%, 100% { transform: scale(1); opacity: 0.65; } 50% { transform: scale(1.12); opacity: 0.95; } }\n@keyframes wx-sun-rays { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n@keyframes wx-fog-drift { 0% { transform: translateX(-25%); opacity: 0.3; } 50% { opacity: 0.65; } 100% { transform: translateX(25%); opacity: 0.3; } }\n@keyframes wx-shooting-star { 0%, 95% { opacity: 0; transform: translate(0,0) scale(0); } 96% { opacity: 1; transform: translate(0,0) scale(1); } 100% { opacity: 0; transform: translate(40px,30px) scale(1); } }\n`;\n\nfunction SunEffect() {\n // Defined yellow-orange disc with halo + slowly-rotating ray sprite.\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <div className=\"absolute -top-5 -right-5 w-24 h-24\" style={{ animation: 'wx-sun-rays 70s linear infinite' }}>\n <svg viewBox=\"0 0 100 100\" className=\"w-full h-full\">\n {Array.from({ length: 12 }).map((_, i) => (\n <rect key={i} x={49} y={3} width={2} height={14} rx={1}\n fill=\"rgba(255, 232, 130, 0.55)\"\n transform={`rotate(${i * 30} 50 50)`} />\n ))}\n </svg>\n </div>\n <div className=\"absolute top-1 right-1 w-10 h-10 rounded-full\"\n style={{\n background: 'radial-gradient(circle at 35% 35%, #fff8cc 0%, #ffd84a 55%, #ff9e2a 100%)',\n boxShadow: '0 0 18px 5px rgba(255, 200, 80, 0.55)',\n animation: 'wx-sun-pulse 4.5s ease-in-out infinite',\n }} />\n </div>\n );\n}\n\nfunction NightStarsEffect() {\n // Crescent moon (outer warm circle + offset dark circle to carve out the\n // bite) and a sparse scatter of stars twinkling at independent rates.\n // One slow-cycle shooting star adds a moment of motion without\n // distracting.\n const stars = Array.from({ length: 16 }).map((_, i) => ({\n left: `${(i * 53 + 11) % 95}%`,\n top: `${(i * 37 + 9) % 78}%`,\n size: 1 + ((i * 13) % 3),\n delay: `${(i * 0.41) % 4}s`,\n duration: `${2.5 + ((i * 7) % 5) * 0.6}s`,\n }));\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {/* Crescent moon */}\n <div className=\"absolute top-1 right-1\">\n <svg viewBox=\"0 0 40 40\" className=\"w-9 h-9\" style={{ filter: 'drop-shadow(0 0 6px rgba(255,250,220,0.4))' }}>\n <defs>\n <radialGradient id=\"wx-moon-grad\" cx=\"35%\" cy=\"35%\">\n <stop offset=\"0\" stopColor=\"#fffae0\" />\n <stop offset=\"1\" stopColor=\"#d4c98a\" />\n </radialGradient>\n </defs>\n <circle cx={20} cy={20} r={13} fill=\"url(#wx-moon-grad)\" />\n <circle cx={26} cy={16} r={11} fill=\"rgba(15,23,42,1)\" />\n </svg>\n </div>\n {stars.map((s, i) => (\n <div key={i} className=\"absolute rounded-full bg-white\"\n style={{\n left: s.left, top: s.top, width: s.size, height: s.size,\n animation: `wx-twinkle ${s.duration} ease-in-out ${s.delay} infinite`,\n }} />\n ))}\n {/* Shooting star — appears once every ~12s */}\n <div className=\"absolute\" style={{ left: '15%', top: '20%', animation: 'wx-shooting-star 12s ease-out infinite' }}>\n <div className=\"w-12 h-px\"\n style={{ background: 'linear-gradient(to right, transparent, rgba(255,255,255,0.95))', boxShadow: '0 0 4px rgba(255,255,255,0.8)' }} />\n </div>\n </div>\n );\n}\n\nfunction CloudsEffect({ tone = 'light' as 'light' | 'dark' }) {\n const fill = tone === 'light' ? 'rgba(255,255,255,0.78)' : 'rgba(220,228,240,0.45)';\n const Cloud = ({ scale = 1 }) => (\n <svg viewBox=\"0 0 120 50\" className=\"w-32 h-12\" style={{ transform: `scale(${scale})`, filter: 'blur(0.6px)' }}>\n <ellipse cx={28} cy={36} rx={18} ry={11} fill={fill} />\n <ellipse cx={50} cy={28} rx={22} ry={15} fill={fill} />\n <ellipse cx={75} cy={32} rx={20} ry={12} fill={fill} />\n <ellipse cx={95} cy={38} rx={15} ry={9} fill={fill} />\n </svg>\n );\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <div className=\"absolute\" style={{ top: '8%', animation: 'wx-drift-cloud 42s linear infinite' }}><Cloud scale={0.9} /></div>\n <div className=\"absolute\" style={{ top: '40%', animation: 'wx-drift-cloud 60s linear -22s infinite', opacity: 0.85 }}><Cloud scale={1.25} /></div>\n <div className=\"absolute\" style={{ top: '68%', animation: 'wx-drift-cloud 78s linear -45s infinite', opacity: 0.7 }}><Cloud scale={0.75} /></div>\n </div>\n );\n}\n\nfunction RainEffect({ heavy = false }: { heavy?: boolean }) {\n const count = heavy ? 26 : 16;\n const variants = ['wx-rain-a', 'wx-rain-b', 'wx-rain-c'];\n const drops = Array.from({ length: count }).map((_, i) => ({\n left: `${(i * 100 / count + (i * 11) % 7) % 100}%`,\n delay: `${(i * 0.087) % 1.3}s`,\n height: `${12 + (i % 4) * 5}px`,\n duration: `${0.7 + (i % 3) * 0.18}s`,\n variant: variants[i % variants.length],\n }));\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {drops.map((d, i) => (\n <div key={i} className=\"absolute\"\n style={{\n left: d.left, top: '-20px',\n width: '1px', height: d.height,\n background: 'linear-gradient(180deg, rgba(180,210,255,0) 0%, rgba(220,235,255,0.85) 90%, rgba(255,255,255,0.95) 100%)',\n transform: 'rotate(8deg)',\n animation: `${d.variant} ${d.duration} linear ${d.delay} infinite`,\n transformOrigin: 'top',\n }} />\n ))}\n </div>\n );\n}\n\nfunction SnowEffect() {\n const variants = ['wx-snow-a', 'wx-snow-b', 'wx-snow-c'];\n const flakes = Array.from({ length: 16 }).map((_, i) => ({\n left: `${(i * 100 / 16 + (i * 13) % 5) % 100}%`,\n delay: `${(i * 0.43) % 5}s`,\n duration: `${4.5 + (i % 5)}s`,\n size: 3 + (i % 4) * 1.4,\n opacity: 0.65 + ((i * 7) % 4) * 0.08,\n variant: variants[i % variants.length],\n }));\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {flakes.map((f, i) => (\n <div key={i} className=\"absolute rounded-full bg-white\"\n style={{\n left: f.left, top: '-12px',\n width: f.size, height: f.size,\n opacity: f.opacity,\n boxShadow: '0 0 4px rgba(255,255,255,0.65)',\n animation: `${f.variant} ${f.duration} linear ${f.delay} infinite`,\n }} />\n ))}\n </div>\n );\n}\n\nfunction ThunderEffect() {\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <RainEffect heavy />\n {/* Sharp double-flash overlay */}\n <div className=\"absolute inset-0 bg-white\" style={{ animation: 'wx-flash 6s ease-out infinite' }} />\n {/* Lightning bolt — visible only during the flash peaks */}\n <div className=\"absolute inset-y-0 right-1/3 flex items-center justify-center pointer-events-none\"\n style={{ animation: 'wx-bolt 6s ease-out infinite' }}>\n <svg viewBox=\"0 0 18 60\" className=\"h-4/5\"\n style={{ filter: 'drop-shadow(0 0 6px rgba(255, 240, 150, 0.95)) drop-shadow(0 0 14px rgba(255, 220, 90, 0.7))' }}>\n <path d=\"M11 0 L2 28 L8 30 L4 60 L16 24 L9 22 Z\"\n fill=\"rgba(255, 250, 200, 0.98)\"\n stroke=\"rgba(255, 255, 255, 0.9)\" strokeWidth={0.3} />\n </svg>\n </div>\n </div>\n );\n}\n\nfunction FogEffect() {\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"absolute left-0 right-0\"\n style={{\n top: `${10 + i * 22}%`,\n height: '14px',\n background: 'linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.55) 50%, rgba(255,255,255,0) 100%)',\n filter: 'blur(2px)',\n animation: `wx-fog-drift ${10 + i * 3}s ease-in-out ${i * 0.7}s infinite alternate`,\n }} />\n ))}\n </div>\n );\n}\n\nfunction WeatherEffect({ code, isDay }: { code: number; isDay: boolean }) {\n if (code === 0 || code === 1) return isDay ? <SunEffect /> : <NightStarsEffect />;\n if (code === 2) return (\n <>\n {isDay ? <SunEffect /> : <NightStarsEffect />}\n <CloudsEffect tone={isDay ? 'light' : 'dark'} />\n </>\n );\n if (code === 3) return <CloudsEffect tone={isDay ? 'light' : 'dark'} />;\n if (code === 45 || code === 48) return <FogEffect />;\n if ([51, 53, 61, 80, 81].includes(code)) return <RainEffect />;\n if ([55, 63, 65, 82].includes(code)) return <RainEffect heavy />;\n if ([71, 73, 75].includes(code)) return <SnowEffect />;\n if ([95, 96, 99].includes(code)) return <ThunderEffect />;\n return null;\n}\n\nexport default function Weather() {\n const [city, setCity] = useState(loadCity);\n const [appearance, setAppearance] = useState(() => loadAppearance(SETTINGS_KEY));\n const [data, setData] = useState<CityWeather | null>(null);\n const [loading, setLoading] = useState(true);\n const [, setTick] = useState(0);\n useEffect(() => { const t = setInterval(() => setTick(n => n + 1), 60000); return () => clearInterval(t); }, []);\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [configCity, setConfigCity] = useState(city);\n const [configAppearance, setConfigAppearance] = useState<WidgetAppearance>(appearance);\n\n const { prefs: shellPrefs, save: saveShellPrefs } = useShellPrefs();\n const prefs: WeatherPrefs = { ...DEFAULT_PREFS, ...(shellPrefs.weather_prefs as WeatherPrefs | undefined ?? {}) };\n const [configPrefs, setConfigPrefs] = useState<WeatherPrefs>(prefs);\n\n useWidgetSettings(useCallback(() => {\n setConfigCity(city);\n setConfigAppearance({ ...appearance });\n setConfigPrefs({ ...prefs });\n setSettingsOpen(true);\n }, [city, appearance, prefs]));\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n fetchCityWeather(city).then(w => {\n if (cancelled) return;\n setData(w);\n setLoading(false);\n });\n return () => { cancelled = true; };\n }, [city]);\n\n const saveSettings = () => {\n setCity(configCity);\n setAppearance(configAppearance);\n saveShellPrefs({ weather_prefs: configPrefs });\n localStorage.setItem(STORAGE_KEY, configCity);\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(configAppearance));\n setSettingsOpen(false);\n };\n\n const t = (c: number) => prefs.useFahrenheit ? `${toF(c)}°F` : `${c}°`;\n\n // Half-height — tile is now ~110 px tall. Effect keyframes are tuned for\n // this so drops/flakes traverse the full height before recycling.\n const TILE_HEIGHT = 110;\n\n if (loading && !data) {\n return <div className=\"flex items-center justify-center h-full bg-gradient-to-b from-sky-400 to-blue-500 rounded-lg text-white/80 text-xs\" style={{ minHeight: TILE_HEIGHT }}>Loading…</div>;\n }\n if (!data) {\n return <div className=\"flex items-center justify-center h-full bg-slate-700 rounded-lg text-white/80 text-xs\" style={{ minHeight: TILE_HEIGHT }}>Couldn't load weather</div>;\n }\n\n const [condition, emoji, gradient] = getCondition(data.code, data.isDay);\n\n return (\n <>\n <style>{WX_KEYFRAMES}</style>\n <div className=\"rounded-lg overflow-hidden\"\n style={{\n backgroundColor: `rgba(15, 23, 42, ${appearance.activeOpacity / 100})`,\n backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : undefined,\n }}>\n <div className={`relative rounded-lg overflow-hidden text-white bg-gradient-to-br ${gradient}`} style={{ height: TILE_HEIGHT }}>\n {/* Animated effects */}\n <WeatherEffect code={data.code} isDay={data.isDay} />\n\n {/* Compact two-row content */}\n <div className=\"relative z-10 px-3 py-2.5 flex flex-col h-full justify-between\">\n {/* Top: city + time | temp */}\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-base font-semibold leading-tight truncate drop-shadow-sm\">{data.city}</div>\n {prefs.showLocalTime && (\n <div className=\"text-[10px] opacity-90 leading-tight tabular-nums drop-shadow-sm\">\n {getTimeInTz(data.timezone, prefs.use24Hour)}\n </div>\n )}\n </div>\n <div className=\"text-3xl font-extralight leading-none tracking-tight tabular-nums shrink-0 drop-shadow-sm\">\n {t(data.temp)}\n </div>\n </div>\n\n {/* Bottom: condition | H/L */}\n <div className=\"flex items-end justify-between gap-2\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <span className=\"text-lg leading-none drop-shadow-sm\">{emoji}</span>\n <span className=\"text-[11px] font-medium drop-shadow-sm truncate\">{condition}</span>\n </div>\n <span className=\"text-[10px] opacity-90 tabular-nums drop-shadow-sm shrink-0\">H:{t(data.high)} L:{t(data.low)}</span>\n </div>\n </div>\n </div>\n </div>\n\n <WidgetSettingsModal open={settingsOpen} onClose={() => setSettingsOpen(false)} title=\"Weather Settings\"\n appearance={configAppearance} onAppearanceChange={setConfigAppearance} onSave={saveSettings}>\n <div className=\"space-y-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">Display</h3>\n <div className=\"flex items-center gap-3 mb-2\">\n <span className=\"text-sm text-gray-600 w-24\">Temperature</span>\n <div className=\"flex gap-1\">\n {([{ key: false, label: '°C' }, { key: true, label: '°F' }] as const).map(o => (\n <button key={String(o.key)} onClick={() => setConfigPrefs(p => ({ ...p, useFahrenheit: o.key }))}\n className={`px-3 py-1 text-xs font-medium rounded-lg border transition-colors ${configPrefs.useFahrenheit === o.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'}`}>\n {o.label}\n </button>\n ))}\n </div>\n </div>\n <div className=\"flex items-center gap-3 mb-2\">\n <span className=\"text-sm text-gray-600 w-24\">Time Format</span>\n <div className=\"flex gap-1\">\n {([{ key: false, label: 'AM/PM' }, { key: true, label: '24H' }] as const).map(o => (\n <button key={String(o.key)} onClick={() => setConfigPrefs(p => ({ ...p, use24Hour: o.key }))}\n className={`px-3 py-1 text-xs font-medium rounded-lg border transition-colors ${configPrefs.use24Hour === o.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'}`}>\n {o.label}\n </button>\n ))}\n </div>\n </div>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input type=\"checkbox\" checked={configPrefs.showLocalTime} onChange={e => setConfigPrefs(p => ({ ...p, showLocalTime: e.target.checked }))}\n className=\"rounded border-gray-300 text-blue-600 h-3.5 w-3.5\" />\n <span className=\"text-sm text-gray-600\">Show local time</span>\n </label>\n </div>\n </div>\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">City</h3>\n <select value={configCity} onChange={e => setConfigCity(e.target.value)}\n className=\"w-full bg-gray-50 border border-gray-200 rounded px-2 py-1.5 text-sm focus:outline-none focus:ring-1 focus:ring-blue-500\">\n {Object.keys(AVAILABLE_CITIES).map(name => (\n <option key={name} value={name}>{name}</option>\n ))}\n </select>\n <p className=\"mt-1 text-[10px] text-gray-400\">Auto-detected from your timezone; change if needed.</p>\n </div>\n </WidgetSettingsModal>\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/apps/Weather.tsx"],"names":["parts","h","m","t"],"mappings":"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","file":"Weather-FQ7ZVXVR.js","sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport { useWidgetSettings } from '../shell/Modal';\nimport WidgetSettingsModal, { loadAppearance, type WidgetAppearance } from '../shell/WidgetSettingsModal';\nimport { useShellPrefs } from '../shell/ShellPrefs';\nimport { AVAILABLE_CITIES, fetchCityWeather, getCondition, toFahrenheit, type CityWeather } from './_weatherData';\n\nconst STORAGE_KEY = 'weather_city';\nconst LEGACY_KEY = 'weather_cities';\nconst SETTINGS_KEY = 'weather_appearance';\n\ninterface WeatherPrefs { useFahrenheit: boolean; showLocalTime: boolean; use24Hour: boolean }\nconst DEFAULT_PREFS: WeatherPrefs = { useFahrenheit: false, showLocalTime: true, use24Hour: false };\n\nfunction detectLocalCity(): string {\n try {\n const userTz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n for (const [name, info] of Object.entries(AVAILABLE_CITIES)) {\n if (info.tz === userTz) return name;\n }\n } catch {}\n return 'London';\n}\n\nfunction loadCity(): string {\n const v = typeof localStorage !== 'undefined' ? localStorage.getItem(STORAGE_KEY) : null;\n if (v && AVAILABLE_CITIES[v]) return v;\n try {\n const arr = JSON.parse(localStorage.getItem(LEGACY_KEY) || '');\n if (Array.isArray(arr) && arr[0] && AVAILABLE_CITIES[arr[0]]) {\n localStorage.setItem(STORAGE_KEY, arr[0]);\n return arr[0];\n }\n } catch {}\n return detectLocalCity();\n}\n\nconst toF = toFahrenheit;\n\nfunction getTimeInTz(timezone: string, use24Hour = false): string {\n try {\n if (use24Hour) {\n const parts = new Intl.DateTimeFormat('en-US', { timeZone: timezone, hour: 'numeric', minute: '2-digit', hour12: false }).formatToParts(new Date());\n const h = parseInt(parts.find(p => p.type === 'hour')?.value || '0');\n const m = parseInt(parts.find(p => p.type === 'minute')?.value || '0');\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`;\n }\n const parts = new Intl.DateTimeFormat('en-US', { timeZone: timezone, hour: 'numeric', minute: '2-digit', hour12: true }).formatToParts(new Date());\n const h = parseInt(parts.find(p => p.type === 'hour')?.value || '12');\n const m = parseInt(parts.find(p => p.type === 'minute')?.value || '0');\n const period = parts.find(p => p.type === 'dayPeriod')?.value || '';\n return `${h}:${String(m).padStart(2, '0')} ${period}`;\n } catch { return ''; }\n}\n\n/**\n * Effect keyframes — tuned for a ~110 px-tall card so drops/flakes fall\n * across the full height before recycling. Multiple snow/rain variants\n * give the impression of independent particles instead of a hypnotic\n * lock-step pattern.\n */\nconst WX_KEYFRAMES = `\n@keyframes wx-rain-a { 0% { transform: translate(0,-20px); opacity: 0; } 10% { opacity: 0.95; } 100% { transform: translate(8px,140px); opacity: 0; } }\n@keyframes wx-rain-b { 0% { transform: translate(0,-20px); opacity: 0; } 12% { opacity: 0.85; } 100% { transform: translate(12px,140px); opacity: 0; } }\n@keyframes wx-rain-c { 0% { transform: translate(0,-20px); opacity: 0; } 10% { opacity: 1; } 100% { transform: translate(5px,140px); opacity: 0; } }\n@keyframes wx-snow-a { 0% { transform: translate(0,-12px) rotate(0deg); opacity: 0; } 10% { opacity: 0.9; } 50% { transform: translate(10px,55px) rotate(180deg); } 100% { transform: translate(-4px,140px) rotate(360deg); opacity: 0; } }\n@keyframes wx-snow-b { 0% { transform: translate(0,-12px) rotate(0deg); opacity: 0; } 10% { opacity: 0.85; } 50% { transform: translate(-12px,55px) rotate(-180deg); } 100% { transform: translate(6px,140px) rotate(-360deg); opacity: 0; } }\n@keyframes wx-snow-c { 0% { transform: translate(0,-12px); opacity: 0; } 10% { opacity: 0.7; } 100% { transform: translate(2px,140px); opacity: 0; } }\n@keyframes wx-drift-cloud { 0% { transform: translateX(-40%); } 100% { transform: translateX(140%); } }\n@keyframes wx-twinkle { 0%, 100% { opacity: 0.25; transform: scale(1); } 50% { opacity: 1; transform: scale(1.6); } }\n@keyframes wx-flash { 0%, 86%, 100% { opacity: 0; } 87% { opacity: 0.95; } 88% { opacity: 0.15; } 89% { opacity: 0.85; } 90% { opacity: 0; } }\n@keyframes wx-bolt { 0%, 86%, 90%, 100% { opacity: 0; } 87% { opacity: 1; } 89% { opacity: 0.85; } }\n@keyframes wx-sun-pulse { 0%, 100% { transform: scale(1); opacity: 0.65; } 50% { transform: scale(1.12); opacity: 0.95; } }\n@keyframes wx-sun-rays { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n@keyframes wx-fog-drift { 0% { transform: translateX(-25%); opacity: 0.3; } 50% { opacity: 0.65; } 100% { transform: translateX(25%); opacity: 0.3; } }\n@keyframes wx-shooting-star { 0%, 95% { opacity: 0; transform: translate(0,0) scale(0); } 96% { opacity: 1; transform: translate(0,0) scale(1); } 100% { opacity: 0; transform: translate(40px,30px) scale(1); } }\n`;\n\nfunction SunEffect() {\n // Defined yellow-orange disc with halo + slowly-rotating ray sprite.\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <div className=\"absolute -top-5 -right-5 w-24 h-24\" style={{ animation: 'wx-sun-rays 70s linear infinite' }}>\n <svg viewBox=\"0 0 100 100\" className=\"w-full h-full\">\n {Array.from({ length: 12 }).map((_, i) => (\n <rect key={i} x={49} y={3} width={2} height={14} rx={1}\n fill=\"rgba(255, 232, 130, 0.55)\"\n transform={`rotate(${i * 30} 50 50)`} />\n ))}\n </svg>\n </div>\n <div className=\"absolute top-1 right-1 w-10 h-10 rounded-full\"\n style={{\n background: 'radial-gradient(circle at 35% 35%, #fff8cc 0%, #ffd84a 55%, #ff9e2a 100%)',\n boxShadow: '0 0 18px 5px rgba(255, 200, 80, 0.55)',\n animation: 'wx-sun-pulse 4.5s ease-in-out infinite',\n }} />\n </div>\n );\n}\n\nfunction NightStarsEffect() {\n // Crescent moon (outer warm circle + offset dark circle to carve out the\n // bite) and a sparse scatter of stars twinkling at independent rates.\n // One slow-cycle shooting star adds a moment of motion without\n // distracting.\n const stars = Array.from({ length: 16 }).map((_, i) => ({\n left: `${(i * 53 + 11) % 95}%`,\n top: `${(i * 37 + 9) % 78}%`,\n size: 1 + ((i * 13) % 3),\n delay: `${(i * 0.41) % 4}s`,\n duration: `${2.5 + ((i * 7) % 5) * 0.6}s`,\n }));\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {/* Crescent moon */}\n <div className=\"absolute top-1 right-1\">\n <svg viewBox=\"0 0 40 40\" className=\"w-9 h-9\" style={{ filter: 'drop-shadow(0 0 6px rgba(255,250,220,0.4))' }}>\n <defs>\n <radialGradient id=\"wx-moon-grad\" cx=\"35%\" cy=\"35%\">\n <stop offset=\"0\" stopColor=\"#fffae0\" />\n <stop offset=\"1\" stopColor=\"#d4c98a\" />\n </radialGradient>\n </defs>\n <circle cx={20} cy={20} r={13} fill=\"url(#wx-moon-grad)\" />\n <circle cx={26} cy={16} r={11} fill=\"rgba(15,23,42,1)\" />\n </svg>\n </div>\n {stars.map((s, i) => (\n <div key={i} className=\"absolute rounded-full bg-white\"\n style={{\n left: s.left, top: s.top, width: s.size, height: s.size,\n animation: `wx-twinkle ${s.duration} ease-in-out ${s.delay} infinite`,\n }} />\n ))}\n {/* Shooting star — appears once every ~12s */}\n <div className=\"absolute\" style={{ left: '15%', top: '20%', animation: 'wx-shooting-star 12s ease-out infinite' }}>\n <div className=\"w-12 h-px\"\n style={{ background: 'linear-gradient(to right, transparent, rgba(255,255,255,0.95))', boxShadow: '0 0 4px rgba(255,255,255,0.8)' }} />\n </div>\n </div>\n );\n}\n\nfunction CloudsEffect({ tone = 'light' as 'light' | 'dark' }) {\n const fill = tone === 'light' ? 'rgba(255,255,255,0.78)' : 'rgba(220,228,240,0.45)';\n const Cloud = ({ scale = 1 }) => (\n <svg viewBox=\"0 0 120 50\" className=\"w-32 h-12\" style={{ transform: `scale(${scale})`, filter: 'blur(0.6px)' }}>\n <ellipse cx={28} cy={36} rx={18} ry={11} fill={fill} />\n <ellipse cx={50} cy={28} rx={22} ry={15} fill={fill} />\n <ellipse cx={75} cy={32} rx={20} ry={12} fill={fill} />\n <ellipse cx={95} cy={38} rx={15} ry={9} fill={fill} />\n </svg>\n );\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <div className=\"absolute\" style={{ top: '8%', animation: 'wx-drift-cloud 42s linear infinite' }}><Cloud scale={0.9} /></div>\n <div className=\"absolute\" style={{ top: '40%', animation: 'wx-drift-cloud 60s linear -22s infinite', opacity: 0.85 }}><Cloud scale={1.25} /></div>\n <div className=\"absolute\" style={{ top: '68%', animation: 'wx-drift-cloud 78s linear -45s infinite', opacity: 0.7 }}><Cloud scale={0.75} /></div>\n </div>\n );\n}\n\nfunction RainEffect({ heavy = false }: { heavy?: boolean }) {\n const count = heavy ? 26 : 16;\n const variants = ['wx-rain-a', 'wx-rain-b', 'wx-rain-c'];\n const drops = Array.from({ length: count }).map((_, i) => ({\n left: `${(i * 100 / count + (i * 11) % 7) % 100}%`,\n delay: `${(i * 0.087) % 1.3}s`,\n height: `${12 + (i % 4) * 5}px`,\n duration: `${0.7 + (i % 3) * 0.18}s`,\n variant: variants[i % variants.length],\n }));\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {drops.map((d, i) => (\n <div key={i} className=\"absolute\"\n style={{\n left: d.left, top: '-20px',\n width: '1px', height: d.height,\n background: 'linear-gradient(180deg, rgba(180,210,255,0) 0%, rgba(220,235,255,0.85) 90%, rgba(255,255,255,0.95) 100%)',\n transform: 'rotate(8deg)',\n animation: `${d.variant} ${d.duration} linear ${d.delay} infinite`,\n transformOrigin: 'top',\n }} />\n ))}\n </div>\n );\n}\n\nfunction SnowEffect() {\n const variants = ['wx-snow-a', 'wx-snow-b', 'wx-snow-c'];\n const flakes = Array.from({ length: 16 }).map((_, i) => ({\n left: `${(i * 100 / 16 + (i * 13) % 5) % 100}%`,\n delay: `${(i * 0.43) % 5}s`,\n duration: `${4.5 + (i % 5)}s`,\n size: 3 + (i % 4) * 1.4,\n opacity: 0.65 + ((i * 7) % 4) * 0.08,\n variant: variants[i % variants.length],\n }));\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {flakes.map((f, i) => (\n <div key={i} className=\"absolute rounded-full bg-white\"\n style={{\n left: f.left, top: '-12px',\n width: f.size, height: f.size,\n opacity: f.opacity,\n boxShadow: '0 0 4px rgba(255,255,255,0.65)',\n animation: `${f.variant} ${f.duration} linear ${f.delay} infinite`,\n }} />\n ))}\n </div>\n );\n}\n\nfunction ThunderEffect() {\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <RainEffect heavy />\n {/* Sharp double-flash overlay */}\n <div className=\"absolute inset-0 bg-white\" style={{ animation: 'wx-flash 6s ease-out infinite' }} />\n {/* Lightning bolt — visible only during the flash peaks */}\n <div className=\"absolute inset-y-0 right-1/3 flex items-center justify-center pointer-events-none\"\n style={{ animation: 'wx-bolt 6s ease-out infinite' }}>\n <svg viewBox=\"0 0 18 60\" className=\"h-4/5\"\n style={{ filter: 'drop-shadow(0 0 6px rgba(255, 240, 150, 0.95)) drop-shadow(0 0 14px rgba(255, 220, 90, 0.7))' }}>\n <path d=\"M11 0 L2 28 L8 30 L4 60 L16 24 L9 22 Z\"\n fill=\"rgba(255, 250, 200, 0.98)\"\n stroke=\"rgba(255, 255, 255, 0.9)\" strokeWidth={0.3} />\n </svg>\n </div>\n </div>\n );\n}\n\nfunction FogEffect() {\n return (\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"absolute left-0 right-0\"\n style={{\n top: `${10 + i * 22}%`,\n height: '14px',\n background: 'linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.55) 50%, rgba(255,255,255,0) 100%)',\n filter: 'blur(2px)',\n animation: `wx-fog-drift ${10 + i * 3}s ease-in-out ${i * 0.7}s infinite alternate`,\n }} />\n ))}\n </div>\n );\n}\n\nfunction WeatherEffect({ code, isDay }: { code: number; isDay: boolean }) {\n if (code === 0 || code === 1) return isDay ? <SunEffect /> : <NightStarsEffect />;\n if (code === 2) return (\n <>\n {isDay ? <SunEffect /> : <NightStarsEffect />}\n <CloudsEffect tone={isDay ? 'light' : 'dark'} />\n </>\n );\n if (code === 3) return <CloudsEffect tone={isDay ? 'light' : 'dark'} />;\n if (code === 45 || code === 48) return <FogEffect />;\n if ([51, 53, 61, 80, 81].includes(code)) return <RainEffect />;\n if ([55, 63, 65, 82].includes(code)) return <RainEffect heavy />;\n if ([71, 73, 75].includes(code)) return <SnowEffect />;\n if ([95, 96, 99].includes(code)) return <ThunderEffect />;\n return null;\n}\n\nexport default function Weather() {\n const [city, setCity] = useState(loadCity);\n const [appearance, setAppearance] = useState(() => loadAppearance(SETTINGS_KEY));\n const [data, setData] = useState<CityWeather | null>(null);\n const [loading, setLoading] = useState(true);\n const [, setTick] = useState(0);\n useEffect(() => { const t = setInterval(() => setTick(n => n + 1), 60000); return () => clearInterval(t); }, []);\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [configCity, setConfigCity] = useState(city);\n const [configAppearance, setConfigAppearance] = useState<WidgetAppearance>(appearance);\n\n const { prefs: shellPrefs, save: saveShellPrefs } = useShellPrefs();\n const prefs: WeatherPrefs = { ...DEFAULT_PREFS, ...(shellPrefs.weather_prefs as WeatherPrefs | undefined ?? {}) };\n const [configPrefs, setConfigPrefs] = useState<WeatherPrefs>(prefs);\n\n useWidgetSettings(useCallback(() => {\n setConfigCity(city);\n setConfigAppearance({ ...appearance });\n setConfigPrefs({ ...prefs });\n setSettingsOpen(true);\n }, [city, appearance, prefs]));\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n fetchCityWeather(city).then(w => {\n if (cancelled) return;\n setData(w);\n setLoading(false);\n });\n return () => { cancelled = true; };\n }, [city]);\n\n const saveSettings = () => {\n setCity(configCity);\n setAppearance(configAppearance);\n saveShellPrefs({ weather_prefs: configPrefs });\n localStorage.setItem(STORAGE_KEY, configCity);\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(configAppearance));\n setSettingsOpen(false);\n };\n\n const t = (c: number) => prefs.useFahrenheit ? `${toF(c)}°F` : `${c}°`;\n\n // Half-height — tile is now ~110 px tall. Effect keyframes are tuned for\n // this so drops/flakes traverse the full height before recycling.\n const TILE_HEIGHT = 110;\n\n if (loading && !data) {\n return <div className=\"flex items-center justify-center h-full bg-gradient-to-b from-sky-400 to-blue-500 rounded-lg text-white/80 text-xs\" style={{ minHeight: TILE_HEIGHT }}>Loading…</div>;\n }\n if (!data) {\n return <div className=\"flex items-center justify-center h-full bg-slate-700 rounded-lg text-white/80 text-xs\" style={{ minHeight: TILE_HEIGHT }}>Couldn't load weather</div>;\n }\n\n const [condition, emoji, gradient] = getCondition(data.code, data.isDay);\n\n return (\n <>\n <style>{WX_KEYFRAMES}</style>\n <div className=\"rounded-lg overflow-hidden\"\n style={{\n backgroundColor: `rgba(15, 23, 42, ${appearance.activeOpacity / 100})`,\n backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : undefined,\n }}>\n <div className={`relative rounded-lg overflow-hidden text-white bg-gradient-to-br ${gradient}`} style={{ height: TILE_HEIGHT }}>\n {/* Animated effects */}\n <WeatherEffect code={data.code} isDay={data.isDay} />\n\n {/* Compact two-row content */}\n <div className=\"relative z-10 px-3 py-2.5 flex flex-col h-full justify-between\">\n {/* Top: city + time | temp */}\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-base font-semibold leading-tight truncate drop-shadow-sm\">{data.city}</div>\n {prefs.showLocalTime && (\n <div className=\"text-[10px] opacity-90 leading-tight tabular-nums drop-shadow-sm\">\n {getTimeInTz(data.timezone, prefs.use24Hour)}\n </div>\n )}\n </div>\n <div className=\"text-3xl font-extralight leading-none tracking-tight tabular-nums shrink-0 drop-shadow-sm\">\n {t(data.temp)}\n </div>\n </div>\n\n {/* Bottom: condition | H/L */}\n <div className=\"flex items-end justify-between gap-2\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <span className=\"text-lg leading-none drop-shadow-sm\">{emoji}</span>\n <span className=\"text-[11px] font-medium drop-shadow-sm truncate\">{condition}</span>\n </div>\n <span className=\"text-[10px] opacity-90 tabular-nums drop-shadow-sm shrink-0\">H:{t(data.high)} L:{t(data.low)}</span>\n </div>\n </div>\n </div>\n </div>\n\n <WidgetSettingsModal open={settingsOpen} onClose={() => setSettingsOpen(false)} title=\"Weather Settings\"\n appearance={configAppearance} onAppearanceChange={setConfigAppearance} onSave={saveSettings}>\n <div className=\"space-y-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">Display</h3>\n <div className=\"flex items-center gap-3 mb-2\">\n <span className=\"text-sm text-gray-600 w-24\">Temperature</span>\n <div className=\"flex gap-1\">\n {([{ key: false, label: '°C' }, { key: true, label: '°F' }] as const).map(o => (\n <button key={String(o.key)} onClick={() => setConfigPrefs(p => ({ ...p, useFahrenheit: o.key }))}\n className={`px-3 py-1 text-xs font-medium rounded-lg border transition-colors ${configPrefs.useFahrenheit === o.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'}`}>\n {o.label}\n </button>\n ))}\n </div>\n </div>\n <div className=\"flex items-center gap-3 mb-2\">\n <span className=\"text-sm text-gray-600 w-24\">Time Format</span>\n <div className=\"flex gap-1\">\n {([{ key: false, label: 'AM/PM' }, { key: true, label: '24H' }] as const).map(o => (\n <button key={String(o.key)} onClick={() => setConfigPrefs(p => ({ ...p, use24Hour: o.key }))}\n className={`px-3 py-1 text-xs font-medium rounded-lg border transition-colors ${configPrefs.use24Hour === o.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'}`}>\n {o.label}\n </button>\n ))}\n </div>\n </div>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input type=\"checkbox\" checked={configPrefs.showLocalTime} onChange={e => setConfigPrefs(p => ({ ...p, showLocalTime: e.target.checked }))}\n className=\"rounded border-gray-300 text-blue-600 h-3.5 w-3.5\" />\n <span className=\"text-sm text-gray-600\">Show local time</span>\n </label>\n </div>\n </div>\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">City</h3>\n <select value={configCity} onChange={e => setConfigCity(e.target.value)}\n className=\"w-full bg-gray-50 border border-gray-200 rounded px-2 py-1.5 text-sm focus:outline-none focus:ring-1 focus:ring-blue-500\">\n {Object.keys(AVAILABLE_CITIES).map(name => (\n <option key={name} value={name}>{name}</option>\n ))}\n </select>\n <p className=\"mt-1 text-[10px] text-gray-400\">Auto-detected from your timezone; change if needed.</p>\n </div>\n </WidgetSettingsModal>\n </>\n );\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AVAILABLE_CITIES, fetchCityWeather, getCondition, toFahrenheit } from './chunk-7CCHEEYC.js';
|
|
2
|
-
import { loadAppearance, WidgetSettingsModal } from './chunk-
|
|
3
|
-
import { useWidgetSettings } from './chunk-
|
|
2
|
+
import { loadAppearance, WidgetSettingsModal } from './chunk-ZO4XGUZQ.js';
|
|
3
|
+
import { useWidgetSettings } from './chunk-EXSEW5F3.js';
|
|
4
4
|
import { useShellPrefs } from './chunk-BLLINYDD.js';
|
|
5
5
|
import './chunk-CDR2Q64Q.js';
|
|
6
6
|
import './chunk-WNLPTLT6.js';
|
|
@@ -193,5 +193,5 @@ function WorldClock() {
|
|
|
193
193
|
}
|
|
194
194
|
|
|
195
195
|
export { WorldClock as default };
|
|
196
|
-
//# sourceMappingURL=WorldClock-
|
|
197
|
-
//# sourceMappingURL=WorldClock-
|
|
196
|
+
//# sourceMappingURL=WorldClock-XAFQ5ZQF.js.map
|
|
197
|
+
//# sourceMappingURL=WorldClock-XAFQ5ZQF.js.map
|