react-os-shell 0.7.0 → 0.7.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.
Files changed (51) hide show
  1. package/dist/{Browser-42ZTL3DQ.js → Browser-WVSS64J6.js} +3 -3
  2. package/dist/{Browser-42ZTL3DQ.js.map → Browser-WVSS64J6.js.map} +1 -1
  3. package/dist/{Calculator-QMC43H6W.js → Calculator-37EIFRDU.js} +4 -4
  4. package/dist/{Calculator-QMC43H6W.js.map → Calculator-37EIFRDU.js.map} +1 -1
  5. package/dist/{Calendar-OSPNZXPD.js → Calendar-KCZQJ5CY.js} +3 -3
  6. package/dist/{Calendar-OSPNZXPD.js.map → Calendar-KCZQJ5CY.js.map} +1 -1
  7. package/dist/{CurrencyConverter-RQKXZ56O.js → CurrencyConverter-PWX3FKRK.js} +4 -4
  8. package/dist/{CurrencyConverter-RQKXZ56O.js.map → CurrencyConverter-PWX3FKRK.js.map} +1 -1
  9. package/dist/{Documents-SNNWYPAS.js → Documents-W2DABIOW.js} +3 -3
  10. package/dist/{Documents-SNNWYPAS.js.map → Documents-W2DABIOW.js.map} +1 -1
  11. package/dist/{Email-QIDYGDSR.js → Email-GTGL7CW5.js} +3 -3
  12. package/dist/{Email-QIDYGDSR.js.map → Email-GTGL7CW5.js.map} +1 -1
  13. package/dist/Files-XNAPEBFF.js +11 -0
  14. package/dist/{Files-JUWNFKSF.js.map → Files-XNAPEBFF.js.map} +1 -1
  15. package/dist/{Minesweeper-TZU7VTBR.js → Minesweeper-N73MSPJV.js} +3 -3
  16. package/dist/{Minesweeper-TZU7VTBR.js.map → Minesweeper-N73MSPJV.js.map} +1 -1
  17. package/dist/{Notepad-RXDODESR.js → Notepad-MXEQCIC7.js} +3 -3
  18. package/dist/{Notepad-RXDODESR.js.map → Notepad-MXEQCIC7.js.map} +1 -1
  19. package/dist/{PomodoroTimer-YYFTVAAT.js → PomodoroTimer-VEYXRZWZ.js} +4 -4
  20. package/dist/{PomodoroTimer-YYFTVAAT.js.map → PomodoroTimer-VEYXRZWZ.js.map} +1 -1
  21. package/dist/Preview-VMKMY6SY.js +8 -0
  22. package/dist/{Preview-HDHGK3QA.js.map → Preview-VMKMY6SY.js.map} +1 -1
  23. package/dist/Spreadsheet-UZMNMLZH.js +6 -0
  24. package/dist/{Spreadsheet-2ZWIDCBD.js.map → Spreadsheet-UZMNMLZH.js.map} +1 -1
  25. package/dist/{Weather-G7GAZWKB.js → Weather-R6ULA547.js} +4 -4
  26. package/dist/{Weather-G7GAZWKB.js.map → Weather-R6ULA547.js.map} +1 -1
  27. package/dist/{WorldClock-H3TAHY3V.js → WorldClock-HHIBQXUR.js} +4 -5
  28. package/dist/WorldClock-HHIBQXUR.js.map +1 -0
  29. package/dist/apps/index.js +21 -21
  30. package/dist/apps/index.js.map +1 -1
  31. package/dist/{chunk-ZIRRB5P2.js → chunk-3T6SQ4UO.js} +36 -15
  32. package/dist/chunk-3T6SQ4UO.js.map +1 -0
  33. package/dist/{chunk-EIMG6KP7.js → chunk-CDSFAXIS.js} +4 -4
  34. package/dist/{chunk-EIMG6KP7.js.map → chunk-CDSFAXIS.js.map} +1 -1
  35. package/dist/{chunk-VIUW7IPZ.js → chunk-KJ5664G7.js} +3 -3
  36. package/dist/{chunk-VIUW7IPZ.js.map → chunk-KJ5664G7.js.map} +1 -1
  37. package/dist/{chunk-U7XDTOFD.js → chunk-LWVRQWGV.js} +3 -3
  38. package/dist/{chunk-U7XDTOFD.js.map → chunk-LWVRQWGV.js.map} +1 -1
  39. package/dist/{chunk-QWQHSHAX.js → chunk-SUUADOG6.js} +4 -4
  40. package/dist/{chunk-QWQHSHAX.js.map → chunk-SUUADOG6.js.map} +1 -1
  41. package/dist/{chunk-OMCRYSXD.js → chunk-ZETQWO2W.js} +3 -3
  42. package/dist/{chunk-OMCRYSXD.js.map → chunk-ZETQWO2W.js.map} +1 -1
  43. package/dist/index.d.ts +62 -1
  44. package/dist/index.js +105 -17
  45. package/dist/index.js.map +1 -1
  46. package/package.json +1 -1
  47. package/dist/Files-JUWNFKSF.js +0 -11
  48. package/dist/Preview-HDHGK3QA.js +0 -8
  49. package/dist/Spreadsheet-2ZWIDCBD.js +0 -6
  50. package/dist/WorldClock-H3TAHY3V.js.map +0 -1
  51. package/dist/chunk-ZIRRB5P2.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -131,6 +131,27 @@ declare function setWindowDefaultPosition(key: string, pos: {
131
131
  w: number;
132
132
  h: number;
133
133
  }): void;
134
+ /** Read the saved box for a window key (viewport-relative px), or null. */
135
+ declare function getWindowPosition(key: string): {
136
+ x: number;
137
+ y: number;
138
+ w: number;
139
+ h: number;
140
+ } | null;
141
+ /**
142
+ * Force a window's saved position — unlike `setWindowDefaultPosition` this
143
+ * overwrites any existing entry. Use when the consumer wants to deliberately
144
+ * (re)place a window, e.g. the Widget Manager dropping a freshly-added widget
145
+ * into a tidy top-left slot regardless of where it last sat. For `autoHeight`
146
+ * windows the `h` here is only a first-paint placeholder — the window
147
+ * re-measures its content height on open.
148
+ */
149
+ declare function setWindowPosition(key: string, pos: {
150
+ x: number;
151
+ y: number;
152
+ w: number;
153
+ h: number;
154
+ }): void;
134
155
  interface ModalProps {
135
156
  open: boolean;
136
157
  onClose: () => void;
@@ -601,6 +622,46 @@ interface StatusBadgeProps {
601
622
  }
602
623
  declare function StatusBadge({ status }: StatusBadgeProps): react_jsx_runtime.JSX.Element;
603
624
 
625
+ /**
626
+ * System-tray badge shown only when the app is served from a developer's own
627
+ * machine (localhost / 127.0.0.1). Drop it into the host's `taskbarTrayLeft`
628
+ * slot — it renders nothing off-localhost, so it's safe to leave wired on every
629
+ * build. Visibility is gated on the runtime hostname; see utils/env.ts.
630
+ */
631
+ declare function DevIndicator(): react_jsx_runtime.JSX.Element | null;
632
+
633
+ /**
634
+ * Dev-environment detection + browser chrome.
635
+ *
636
+ * A deployed bundle is byte-identical across hosts (CI builds once and promotes
637
+ * the same image between environments), so build-time signals like
638
+ * `import.meta.env.MODE` can't tell a developer's machine from a deployed site —
639
+ * only the runtime hostname can. `isDevEnv()` is therefore gated on
640
+ * `localhost`/`127.0.0.1`, and everything dev-only (the <DevIndicator/> tray
641
+ * badge, the `[DEV]` tab-title prefix) keys off it so it never leaks onto a
642
+ * deployed host.
643
+ */
644
+ /** Tooltip/banner copy for the dev indicator. */
645
+ declare const DEV_BANNER_TEXT = "LOCAL DEV ENVIRONMENT \u2014 running against your local backend; not connected to the live system";
646
+ /**
647
+ * True only when served from a developer's own machine.
648
+ *
649
+ * Gated on `localhost`/`127.0.0.1` only (not `*.local` mDNS names), so a
650
+ * teammate reaching a dev server over the LAN doesn't get the dev chrome.
651
+ */
652
+ declare function isDevEnv(): boolean;
653
+ /**
654
+ * Apply local-dev browser chrome: prefix the tab title with `[DEV]` and,
655
+ * optionally, swap the favicon. No-op outside localhost. Idempotent — safe to
656
+ * call at startup and again whenever a route overwrites `document.title`.
657
+ *
658
+ * Call before React mounts (e.g. in `main.tsx`) so the title is correct on the
659
+ * first paint. Pass `faviconHref` only if the host actually ships that asset.
660
+ */
661
+ declare function applyDevTitle(opts?: {
662
+ faviconHref?: string;
663
+ }): void;
664
+
604
665
  interface SavedBox {
605
666
  x: number;
606
667
  y: number;
@@ -1288,4 +1349,4 @@ declare function useNewHotkey(callback: () => void): void;
1288
1349
  */
1289
1350
  declare function useEditHotkey(callback: (() => void) | null): void;
1290
1351
 
1291
- export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, BehaviorPanel, type BugReport, type BugReportConfig, BugReportConfigProvider, BugReportDetail, type BugReportExtraField, type BugReportExtraSelectField, BugReportProvider, type BugReportSubmission, type BugReportSubmitPayload, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, CancelButton, type CellStyle, type ChangelogEntry, type ColumnDef, ConfirmProvider, CopyButton, Customization, type CustomizationOmitSection, type CustomizationProps, Desktop, type DesktopHostConfig, DesktopHostProvider, DocFavStar, ENTER, EditableGrid, type EditableGridProps, type EntityFetcher, EntityList, type EntityListColumn, type EntityListProps, GLASS_DIVIDER, GLASS_INPUT_BG, GlobalSearch, type GridColumn, HelpCenter, type HelpCenterDoc, type HelpCenterProps, Layout, type LayoutProps, ListFooter, type LoginPayload, MOD, type MailCapabilities, MailConnectModal, type MailUser, Markdown, type MarkdownProps, Modal, ModalActions, NotificationBell, type NotificationsConfig, type PaginatedResponse, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, type ReportType, ResizableTable, SHIFT, type SearchConfig, type SearchProvider, type SearchResult, type SemanticGroup, type ShellAuth, ShellAuthProvider, ShellEntityFetcherProvider, type ShellNotification, type ShellPrefsAdapter, ShellPrefsProvider, ShortcutHelp, type SortState, SoundsPanel, StartMenu, StatusBadge, StatusBadgeProvider, type StickyEntityRef, type StickyResolver, SystemPreferences, type SystemPreferencesProps, type SystemPreferencesSection, VERSION, WidgetManager, WindowManagerProvider, WindowRegistry, WindowTitle, commitExposeHighlight, confirm, confirmDestructive, createWindowRegistry, exitExposeMode, formatDate, getActiveWindowRoute, getExposeHighlight, glassStyle, isMac, openBugReportDialog, prompt, reportBug, setExposeHighlight, setShellApiClient, setShellAuthBridge, setShellMailServer, setShellNavIcons, setWindowDefaultPosition, subscribeExposeHighlight, toast, toggleExposeMode, useBugReport, useClickOutside, useColumnConfig, useDesktopHost, useEditHotkey, useInfiniteScroll, useLocalStoragePrefs, useMailAuth, useModalActive, useNewHotkey, useShellAuth, useShellEntityFetcher, useShellPrefs, useSort, useTableNav, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle };
1352
+ export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, BehaviorPanel, type BugReport, type BugReportConfig, BugReportConfigProvider, BugReportDetail, type BugReportExtraField, type BugReportExtraSelectField, BugReportProvider, type BugReportSubmission, type BugReportSubmitPayload, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, CancelButton, type CellStyle, type ChangelogEntry, type ColumnDef, ConfirmProvider, CopyButton, Customization, type CustomizationOmitSection, type CustomizationProps, DEV_BANNER_TEXT, Desktop, type DesktopHostConfig, DesktopHostProvider, DevIndicator, DocFavStar, ENTER, EditableGrid, type EditableGridProps, type EntityFetcher, EntityList, type EntityListColumn, type EntityListProps, GLASS_DIVIDER, GLASS_INPUT_BG, GlobalSearch, type GridColumn, HelpCenter, type HelpCenterDoc, type HelpCenterProps, Layout, type LayoutProps, ListFooter, type LoginPayload, MOD, type MailCapabilities, MailConnectModal, type MailUser, Markdown, type MarkdownProps, Modal, ModalActions, NotificationBell, type NotificationsConfig, type PaginatedResponse, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, type ReportType, ResizableTable, SHIFT, type SearchConfig, type SearchProvider, type SearchResult, type SemanticGroup, type ShellAuth, ShellAuthProvider, ShellEntityFetcherProvider, type ShellNotification, type ShellPrefsAdapter, ShellPrefsProvider, ShortcutHelp, type SortState, SoundsPanel, StartMenu, StatusBadge, StatusBadgeProvider, type StickyEntityRef, type StickyResolver, SystemPreferences, type SystemPreferencesProps, type SystemPreferencesSection, VERSION, WidgetManager, WindowManagerProvider, WindowRegistry, WindowTitle, applyDevTitle, commitExposeHighlight, confirm, confirmDestructive, createWindowRegistry, exitExposeMode, formatDate, getActiveWindowRoute, getExposeHighlight, getWindowPosition, glassStyle, isDevEnv, isMac, openBugReportDialog, prompt, reportBug, setExposeHighlight, setShellApiClient, setShellAuthBridge, setShellMailServer, setShellNavIcons, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toast, toggleExposeMode, useBugReport, useClickOutside, useColumnConfig, useDesktopHost, useEditHotkey, useInfiniteScroll, useLocalStoragePrefs, useMailAuth, useModalActive, useNewHotkey, useShellAuth, useShellEntityFetcher, useShellPrefs, useSort, useTableNav, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle };
package/dist/index.js CHANGED
@@ -6,15 +6,15 @@ export { setShellMailServer, useMailAuth } from './chunk-VBFB3ZIN.js';
6
6
  import { subscribePomo, getPomoSnapshot } from './chunk-MK3HLUO4.js';
7
7
  import { useShellPrefs } from './chunk-36VM54SC.js';
8
8
  export { ShellPrefsProvider, useLocalStoragePrefs, useShellPrefs } from './chunk-36VM54SC.js';
9
- import { PREVIEW_OPENED_EVENT, openPreviewFile } from './chunk-QWQHSHAX.js';
9
+ import { PREVIEW_OPENED_EVENT, openPreviewFile } from './chunk-SUUADOG6.js';
10
10
  import { playNotification, playStartup, soundsEnabled, getSoundConfig, SOUND_PACK_KEYS, SOUND_PACKS, SOUND_TYPES, SOUND_TYPE_LABELS, setSoundForType, previewSound, setAllSounds, playLogout } from './chunk-D7PYW2QS.js';
11
- import { setPdfPreview } from './chunk-VIUW7IPZ.js';
11
+ import { setPdfPreview } from './chunk-KJ5664G7.js';
12
12
  import './chunk-KUIPWCTJ.js';
13
13
  import { toast_default } from './chunk-WIJ45SYD.js';
14
14
  export { toast_default as toast } from './chunk-WIJ45SYD.js';
15
- export { EditableGrid } from './chunk-OMCRYSXD.js';
16
- import { useWindowManager, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, Modal, WINDOW_REGISTRY, isPageEntry, ModalActions, useIsMobile, useModalActive, client_default, LoadingSpinner, ThumbCard, activateModal } from './chunk-ZIRRB5P2.js';
17
- export { CancelButton, CopyButton, DocFavStar, Modal, ModalActions, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, WindowManagerProvider, WindowTitle, commitExposeHighlight, exitExposeMode, getActiveWindowRoute, getExposeHighlight, isEntityEntry, isPageEntry, setExposeHighlight, setShellApiClient, setShellWindowRegistry, setWindowDefaultPosition, subscribeExposeHighlight, toggleExposeMode, useModalActive, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-ZIRRB5P2.js';
15
+ export { EditableGrid } from './chunk-ZETQWO2W.js';
16
+ import { useWindowManager, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, Modal, WINDOW_REGISTRY, isPageEntry, ModalActions, useIsMobile, useModalActive, client_default, LoadingSpinner, setWindowPosition, ThumbCard, activateModal } from './chunk-3T6SQ4UO.js';
17
+ export { CancelButton, CopyButton, DocFavStar, Modal, ModalActions, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, WindowManagerProvider, WindowTitle, commitExposeHighlight, exitExposeMode, getActiveWindowRoute, getExposeHighlight, getWindowPosition, isEntityEntry, isPageEntry, setExposeHighlight, setShellApiClient, setShellWindowRegistry, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toggleExposeMode, useModalActive, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-3T6SQ4UO.js';
18
18
  import { confirm } from './chunk-UBN4IUDE.js';
19
19
  export { ConfirmProvider, confirm, confirmDestructive, prompt } from './chunk-UBN4IUDE.js';
20
20
  import { useAuth, useShellAuth } from './chunk-ADJ3CERD.js';
@@ -1219,6 +1219,37 @@ function StatusBadge({ status }) {
1219
1219
  const label = status.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
1220
1220
  return /* @__PURE__ */ jsx("span", { className: `inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${color}`, children: label });
1221
1221
  }
1222
+
1223
+ // src/utils/env.ts
1224
+ var DEV_BANNER_TEXT = "LOCAL DEV ENVIRONMENT \u2014 running against your local backend; not connected to the live system";
1225
+ function isDevEnv() {
1226
+ const host = window.location.hostname;
1227
+ return host === "localhost" || host === "127.0.0.1";
1228
+ }
1229
+ function applyDevTitle(opts) {
1230
+ if (!isDevEnv()) return;
1231
+ if (!document.title.startsWith("[DEV]")) {
1232
+ document.title = `[DEV] ${document.title}`;
1233
+ }
1234
+ if (opts?.faviconHref) {
1235
+ const icon = document.querySelector('link[rel="icon"]');
1236
+ if (icon) icon.href = opts.faviconHref;
1237
+ }
1238
+ }
1239
+ function DevIndicator() {
1240
+ if (!isDevEnv()) return null;
1241
+ return /* @__PURE__ */ jsxs(
1242
+ "div",
1243
+ {
1244
+ className: "shrink-0 inline-flex items-center gap-1 rounded-md bg-blue-600 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-blue-50 select-none",
1245
+ title: DEV_BANNER_TEXT,
1246
+ children: [
1247
+ /* @__PURE__ */ jsx("svg", { className: "h-3 w-3 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2.5, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4" }) }),
1248
+ /* @__PURE__ */ jsx("span", { children: "Dev" })
1249
+ ]
1250
+ }
1251
+ );
1252
+ }
1222
1253
  function FallbackIcon() {
1223
1254
  return /* @__PURE__ */ jsxs("svg", { className: "h-5 w-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: [
1224
1255
  /* @__PURE__ */ jsx("rect", { x: "3.5", y: "3.5", width: "7", height: "7", rx: "1.5" }),
@@ -1243,8 +1274,61 @@ function WidgetManager({ open, onClose }) {
1243
1274
  if (!open) return null;
1244
1275
  const activeByRoute = new Map(openWindows.filter((w) => w.route).map((w) => [w.route, w]));
1245
1276
  const isActive = (route) => activeByRoute.has(route);
1277
+ const PAD = 20, GAP = 16;
1278
+ const workArea = () => {
1279
+ const cs = getComputedStyle(document.documentElement);
1280
+ const tbH = parseInt(cs.getPropertyValue("--taskbar-height")) || 0;
1281
+ const tbW = parseInt(cs.getPropertyValue("--taskbar-width")) || 0;
1282
+ const tbPos = cs.getPropertyValue("--taskbar-position").trim() || "bottom";
1283
+ const sidebarW = parseInt(cs.getPropertyValue("--sidebar-width")) || 0;
1284
+ return {
1285
+ leftOffset: (tbPos === "left" ? tbW : 0) + sidebarW + PAD,
1286
+ topOffset: (tbPos === "top" ? tbH : 0) + PAD,
1287
+ maxBottom: window.innerHeight - (tbPos === "bottom" ? tbH : 0) - PAD
1288
+ };
1289
+ };
1290
+ const liveWidgetRects = () => [...document.querySelectorAll("[data-modal-panel][data-widget]")].map((el) => {
1291
+ const r = el.getBoundingClientRect();
1292
+ return { x: r.left, y: r.top, w: r.width, h: r.height };
1293
+ }).filter((r) => r.w > 0 && r.h > 0);
1294
+ const computeSlot = (occupied, w, h) => {
1295
+ const { leftOffset, topOffset, maxBottom } = workArea();
1296
+ const rightLimit = window.innerWidth - PAD;
1297
+ const lowestInColumn = (colX) => {
1298
+ const ov = occupied.filter((r) => r.x < colX + w && r.x + r.w > colX);
1299
+ return ov.length ? Math.max(...ov.map((r) => r.y + r.h)) + GAP : topOffset;
1300
+ };
1301
+ let x = leftOffset, y = lowestInColumn(x), guard = 0;
1302
+ while (y + h > maxBottom && x + (w + GAP) + w <= rightLimit && guard < 12) {
1303
+ x += w + GAP;
1304
+ y = lowestInColumn(x);
1305
+ guard++;
1306
+ }
1307
+ return { x, y };
1308
+ };
1309
+ const dimsFor = (route) => {
1310
+ const e = WINDOW_REGISTRY[route];
1311
+ return { w: e?.dimensions?.[0] ?? 320, h: e?.dimensions?.[1] ?? 240, auto: !!e?.autoHeight };
1312
+ };
1313
+ const placeAndOpen = (route) => {
1314
+ const { w, h, auto } = dimsFor(route);
1315
+ const selfH = auto ? Math.min(h, 160) : h;
1316
+ const { x, y } = computeSlot(liveWidgetRects(), w, selfH);
1317
+ setWindowPosition(`page:${route}`, { x, y, w, h });
1318
+ openPage(route);
1319
+ };
1320
+ const waitForWidget = (route) => new Promise((resolve) => {
1321
+ const sel = `[data-modal-panel][data-window-key="page:${route}"]`;
1322
+ let n = 0;
1323
+ const tick = () => {
1324
+ const el = document.querySelector(sel);
1325
+ if (el && el.getBoundingClientRect().height > 40 || n++ > 30) resolve();
1326
+ else setTimeout(tick, 30);
1327
+ };
1328
+ setTimeout(tick, 30);
1329
+ });
1246
1330
  const add = (route) => {
1247
- if (!isActive(route)) openPage(route);
1331
+ if (!isActive(route)) placeAndOpen(route);
1248
1332
  };
1249
1333
  const remove = (route) => {
1250
1334
  const w = activeByRoute.get(route);
@@ -1255,7 +1339,13 @@ function WidgetManager({ open, onClose }) {
1255
1339
  };
1256
1340
  const activeCount = widgets.reduce((n, w) => n + (isActive(w.route) ? 1 : 0), 0);
1257
1341
  const allActive = widgets.length > 0 && activeCount === widgets.length;
1258
- const addAll = () => widgets.forEach((w) => add(w.route));
1342
+ const addAll = async () => {
1343
+ for (const w of widgets) {
1344
+ if (isActive(w.route)) continue;
1345
+ placeAndOpen(w.route);
1346
+ await waitForWidget(w.route);
1347
+ }
1348
+ };
1259
1349
  const removeAll = () => widgets.forEach((w) => remove(w.route));
1260
1350
  const widgetGlyph = /* @__PURE__ */ jsxs("svg", { className: "h-5 w-5 text-blue-500", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: [
1261
1351
  /* @__PURE__ */ jsx("rect", { x: "3.5", y: "3.5", width: "7", height: "7", rx: "1.5" }),
@@ -1312,7 +1402,7 @@ function WidgetManager({ open, onClose }) {
1312
1402
  }
1313
1403
 
1314
1404
  // src/version.ts
1315
- var VERSION = "0.7.0" ;
1405
+ var VERSION = "0.7.2" ;
1316
1406
  var APP_VERSION = VERSION;
1317
1407
 
1318
1408
  // src/changelog.ts
@@ -3230,19 +3320,17 @@ function LogoutAnimation({ onComplete, subtitle }) {
3230
3320
  const [phase, setPhase] = useState("show");
3231
3321
  useEffect(() => {
3232
3322
  playLogout();
3233
- const t1 = setTimeout(() => setPhase("shrink"), 800);
3234
- const t2 = setTimeout(() => setPhase("fade"), 1800);
3235
- const t3 = setTimeout(onComplete, 2300);
3323
+ const t1 = setTimeout(() => setPhase("out"), 800);
3324
+ const t2 = setTimeout(onComplete, 2300);
3236
3325
  return () => {
3237
3326
  clearTimeout(t1);
3238
3327
  clearTimeout(t2);
3239
- clearTimeout(t3);
3240
3328
  };
3241
3329
  }, [onComplete]);
3242
3330
  return /* @__PURE__ */ jsxs(
3243
3331
  "div",
3244
3332
  {
3245
- className: `fixed inset-0 z-[9999] flex flex-col items-center justify-center transition-opacity duration-500 ${phase === "fade" ? "opacity-0" : "opacity-100"}`,
3333
+ className: "fixed inset-0 z-[9999] flex flex-col items-center justify-center",
3246
3334
  style: { background: "linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%)" },
3247
3335
  children: [
3248
3336
  /* @__PURE__ */ jsx("div", { className: "absolute inset-0 overflow-hidden", children: /* @__PURE__ */ jsx(
@@ -3252,7 +3340,7 @@ function LogoutAnimation({ onComplete, subtitle }) {
3252
3340
  style: {
3253
3341
  background: "radial-gradient(circle, rgba(124,58,237,0.4) 0%, transparent 70%)",
3254
3342
  animation: "logout-glow 2s ease-in-out infinite",
3255
- opacity: phase === "shrink" ? 0 : 0.2,
3343
+ opacity: phase === "show" ? 0.2 : 0,
3256
3344
  transition: "opacity 1s"
3257
3345
  }
3258
3346
  }
@@ -3260,8 +3348,8 @@ function LogoutAnimation({ onComplete, subtitle }) {
3260
3348
  /* @__PURE__ */ jsx(
3261
3349
  "div",
3262
3350
  {
3263
- className: `relative transition-all duration-1000 ease-in ${phase === "shrink" ? "scale-0 opacity-0" : "scale-100 opacity-100"}`,
3264
- style: phase === "shrink" ? { transform: "scale(0) rotate(180deg)" } : void 0,
3351
+ className: `relative transition-all duration-1000 ease-in ${phase === "out" ? "scale-0 opacity-0" : "scale-100 opacity-100"}`,
3352
+ style: phase === "out" ? { transform: "scale(0) rotate(180deg)" } : void 0,
3265
3353
  children: /* @__PURE__ */ jsx("img", { src: "/favicon.svg", alt: "", className: "h-20 w-20 drop-shadow-[0_0_30px_rgba(124,58,237,0.5)]" })
3266
3354
  }
3267
3355
  ),
@@ -6544,6 +6632,6 @@ function useEditHotkey(callback) {
6544
6632
  }, [callback, isActive]);
6545
6633
  }
6546
6634
 
6547
- export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, BehaviorPanel, BugReportConfigProvider, BugReportDetail, BugReportProvider, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, Customization, Desktop, DesktopHostProvider, ENTER, EntityList, GlobalSearch, HelpCenter, Layout, ListFooter, MOD, MailConnectModal, Markdown, NotificationBell, ResizableTable, SHIFT, ShellEntityFetcherProvider, ShortcutHelp, SoundsPanel, StartMenu, StatusBadge, StatusBadgeProvider, SystemPreferences, VERSION, WidgetManager, createWindowRegistry, isMac, openBugReportDialog, reportBug, useBugReport, useClickOutside, useColumnConfig, useDesktopHost, useEditHotkey, useInfiniteScroll, useNewHotkey, useShellEntityFetcher, useSort, useTableNav };
6635
+ export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, BehaviorPanel, BugReportConfigProvider, BugReportDetail, BugReportProvider, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, Customization, DEV_BANNER_TEXT, Desktop, DesktopHostProvider, DevIndicator, ENTER, EntityList, GlobalSearch, HelpCenter, Layout, ListFooter, MOD, MailConnectModal, Markdown, NotificationBell, ResizableTable, SHIFT, ShellEntityFetcherProvider, ShortcutHelp, SoundsPanel, StartMenu, StatusBadge, StatusBadgeProvider, SystemPreferences, VERSION, WidgetManager, applyDevTitle, createWindowRegistry, isDevEnv, isMac, openBugReportDialog, reportBug, useBugReport, useClickOutside, useColumnConfig, useDesktopHost, useEditHotkey, useInfiniteScroll, useNewHotkey, useShellEntityFetcher, useSort, useTableNav };
6548
6636
  //# sourceMappingURL=index.js.map
6549
6637
  //# sourceMappingURL=index.js.map