efficient-shell 4.171.0 → 4.173.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +255 -8
- package/dist/{Browser-BW3EZ7B2.js → Browser-X7UTQJOX.js} +14 -14
- package/dist/Calculator-IAJLLX67.js +29 -0
- package/dist/ConfirmDialog-EBZ5LHVS.js +1 -0
- package/dist/{CurrencyConverter-IW6F7HW4.js → CurrencyConverter-RODHLQMG.js} +6 -6
- package/dist/{Documents-VH3JXSSJ.js → Documents-BJFZHHBZ.js} +7 -7
- package/dist/{Files-R4ZA5MXU.js → Files-PL5NE4PQ.js} +28 -28
- package/dist/{Notepad-FOITSJJA.js → Notepad-52LDWEK2.js} +9 -9
- package/dist/PdfViewer-IIXXT7SF.js +1 -0
- package/dist/{PomodoroTimer-C4SVIFC6.js → PomodoroTimer-C3KCTCMB.js} +21 -21
- package/dist/{Preview-5K6LK6WZ.js → Preview-O3N26GG6.js} +20 -20
- package/dist/{Sidebar-FDFNRXJU.js → Sidebar-QNGQA6J5.js} +16 -16
- package/dist/{Spreadsheet-CZC3QU2G.js → Spreadsheet-HVKVNQN6.js} +14 -14
- package/dist/{Stock-B4WWEBZH.js → Stock-YOGVYL6F.js} +2 -2
- package/dist/{Weather-TDB5AY23.js → Weather-4OQOBM4C.js} +13 -13
- package/dist/{WorldClock-HYHDVPBV.js → WorldClock-K5KLOOD7.js} +6 -6
- package/dist/apps/index.js +1 -1
- package/dist/bin/ui-check.js +1 -1
- package/dist/chunk-6TDPY7WG.js +3 -0
- package/dist/{chunk-5G4QMZGJ.js → chunk-A6ZY4XSQ.js} +6 -6
- package/dist/{chunk-4P3IWZUC.js → chunk-AYZ4LP2A.js} +9 -9
- package/dist/{chunk-CRI4UFBU.js → chunk-CQN5CFKA.js} +4 -4
- package/dist/{chunk-ECFMRDUP.js → chunk-FIGVDYJR.js} +16 -16
- package/dist/{chunk-Y3UKUB7V.js → chunk-MFR4GZSB.js} +15 -15
- package/dist/{chunk-2UIKLYAI.js → chunk-MVUYJAZT.js} +1 -1
- package/dist/{chunk-HA2WG27U.js → chunk-MYNLN25H.js} +2 -2
- package/dist/{chunk-KSSAVLO7.js → chunk-OZMDKNVR.js} +1 -1
- package/dist/{chunk-GKLJ2SYS.js → chunk-RN5V7MDO.js} +322 -322
- package/dist/chunk-S5QF4VFG.js +1 -0
- package/dist/{chunk-5J2TKKGH.js → chunk-SXRJYJ7M.js} +1 -1
- package/dist/{chunk-NTCAZ6Y3.js → chunk-TLYGAHZN.js} +1 -1
- package/dist/{chunk-HNXPIYRS.js → chunk-U2SEGSNG.js} +1 -1
- package/dist/{chunk-FZRQBHTK.js → chunk-U6IUYOYS.js} +1 -1
- package/dist/{chunk-3U47BTEV.js → chunk-UOZMVS4Y.js} +11 -11
- package/dist/{chunk-S2AZZGFF.js → chunk-W32SKK3D.js} +1 -1
- package/dist/chunk-W33ZFDRR.js +1 -0
- package/dist/{chunk-FWZUTHP5.js → chunk-X5LH3UOJ.js} +111 -111
- package/dist/{chunk-36QX6LOQ.js → chunk-XHWT4DH2.js} +1 -1
- package/dist/chunk-XJX3NA37.js +1 -0
- package/dist/{chunk-AUKURHBZ.js → chunk-Z3JO7MDE.js} +4 -4
- package/dist/{chunk-7YFAFXQG.js → chunk-ZDCOC4IH.js} +9 -9
- package/dist/file-intake/index.js +1 -1
- package/dist/format/index.d.ts +1 -1
- package/dist/format/index.js +1 -1
- package/dist/{index-Dq20bi8D.d.ts → index-Dod08dsC.d.ts} +178 -11
- package/dist/{index-DCUzlKPZ.d.ts → index-DpUDK9zG.d.ts} +5 -0
- package/dist/index.d.ts +14 -6
- package/dist/index.js +111 -111
- package/dist/map/index.js +2 -2
- package/dist/page-tabs/index.js +5 -5
- package/dist/pdf/index.js +1 -1
- package/dist/sounds-FO772MN2.js +1 -0
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.js +1 -1
- package/package.json +1 -1
- package/dist/Calculator-VBK5NSMU.js +0 -29
- package/dist/ConfirmDialog-YRCG3W2T.js +0 -1
- package/dist/PdfViewer-S2B2DZYB.js +0 -1
- package/dist/chunk-67ZUPDWG.js +0 -1
- package/dist/chunk-6KO2U66R.js +0 -3
- package/dist/chunk-BUTSU7FO.js +0 -1
- package/dist/chunk-NCQLGQYR.js +0 -1
- package/dist/sounds-OMHXVVQ4.js +0 -1
package/README.md
CHANGED
|
@@ -969,7 +969,7 @@ All exports are named — `import { Modal, ... } from 'efficient-shell'`.
|
|
|
969
969
|
| `<ShellEntityFetcherProvider value={(endpoint, id) => …}>` | How the modal stack fetches entity data. |
|
|
970
970
|
| `<BugReportConfigProvider value={{ submit, list?, resolve? }}>` | Wire the bug-report flow to your backend. |
|
|
971
971
|
| `<DesktopHostProvider value={{ stickyResolver?, saveShortcuts?, … }}>` | Sticky-note ref resolver + persistence callbacks. |
|
|
972
|
-
| `<StatusBadgeProvider groups={{ status: 'success' \| ... }}
|
|
972
|
+
| `<StatusBadgeProvider groups={{ status: 'success' \| ... }} labelFor?>` | Status string → semantic group. `labelFor(status)` gives every badge under it the host's words for a status (an interface in another language passes it once); a status it returns `undefined` for keeps the derived label, and a badge's own `label` still wins. `useStatusLabel()` says a status the same way outside a badge: a filter option, a search result's second line. |
|
|
973
973
|
| `<PortalBrandingProvider load={...} fallback={...}>` | Loads public hostname-scoped Company Profile identity before authentication, applies its favicon and optional derived document title, and exposes it through `usePortalBranding()`. |
|
|
974
974
|
| `setShellApiClient(axios)` | Module-level: register your axios instance once. |
|
|
975
975
|
| `setShellAuthBridge({ user, logout })` | Module-level: register user identity / logout handler. |
|
|
@@ -1682,6 +1682,16 @@ const { language, languages, setLanguage } = useShellLanguage();
|
|
|
1682
1682
|
`onChange` runs, and you re-render the provider with the new `language` and
|
|
1683
1683
|
`strings`.
|
|
1684
1684
|
|
|
1685
|
+
**The windowed shell's lists, records and forms are in the catalog too.**
|
|
1686
|
+
`EntityList`'s row menu and its copy and export toasts (`entityList`),
|
|
1687
|
+
`ResizableTable`'s column chooser (`columns`), a record window with no record
|
|
1688
|
+
to draw (`record`), `ChangePasswordForm` (`password`), `PdfActionButton`
|
|
1689
|
+
(`pdfAction`), `UndoControls` (`undo`), the copy icon beside a record's number
|
|
1690
|
+
(`copy`), the plain "Loading..." line (`loading`) and `SoundsPanel`'s scheme
|
|
1691
|
+
and event names (`sounds`). Their own props — `submitLabel`, `doneLabel`, the
|
|
1692
|
+
PDF button's `label`, a list's `errorTitle` — still win, and the keys a sound
|
|
1693
|
+
scheme is stored under are identifiers, never translated.
|
|
1694
|
+
|
|
1685
1695
|
**What is not in the catalog, on purpose:** month and weekday names (the
|
|
1686
1696
|
`locale` supplies them); file-format names in `BrandAssetEditor`'s default
|
|
1687
1697
|
`acceptHint` and the `20ft`/`40ft` container codes (notation, not language); the
|
|
@@ -1690,7 +1700,7 @@ tables read); the sample content of the starter templates (`DashboardTemplate`,
|
|
|
1690
1700
|
`AuthScreen` and the rest are demos to copy, not components to configure); and
|
|
1691
1701
|
console warnings, which are for developers.
|
|
1692
1702
|
|
|
1693
|
-
**The full catalog** —
|
|
1703
|
+
**The full catalog** — 55 sections, 522 keys. A function's default is shown
|
|
1694
1704
|
with sample arguments.
|
|
1695
1705
|
|
|
1696
1706
|
<details><summary><code>window</code> — 17 keys</summary>
|
|
@@ -1828,7 +1838,7 @@ with sample arguments.
|
|
|
1828
1838
|
|
|
1829
1839
|
</details>
|
|
1830
1840
|
|
|
1831
|
-
<details><summary><code>pageTabs</code> —
|
|
1841
|
+
<details><summary><code>pageTabs</code> — 16 keys</summary>
|
|
1832
1842
|
|
|
1833
1843
|
| Key | Type | English default |
|
|
1834
1844
|
|---|---|---|
|
|
@@ -1839,6 +1849,9 @@ with sample arguments.
|
|
|
1839
1849
|
| `closeRight` | `string` | `Close tabs to the right` |
|
|
1840
1850
|
| `closeAll` | `string` | `Close all tabs` |
|
|
1841
1851
|
| `unsaved` | `string` | `Unsaved changes` |
|
|
1852
|
+
| `copy` | `(text: string) => string` | `Copy {text}` |
|
|
1853
|
+
| `copied` | `string` | `Copied` |
|
|
1854
|
+
| `tabMenu` | `string` | `Window menu` |
|
|
1842
1855
|
| `discardTitle` | `string` | `Discard unsaved changes?` |
|
|
1843
1856
|
| `discardOne` | `string` | `This page has changes that have not been saved. Close it anyway?` |
|
|
1844
1857
|
| `discardMany` | `string` | `pages have changes that have not been saved. Close them anyway?` |
|
|
@@ -1932,11 +1945,12 @@ with sample arguments.
|
|
|
1932
1945
|
|
|
1933
1946
|
</details>
|
|
1934
1947
|
|
|
1935
|
-
<details><summary><code>list</code> —
|
|
1948
|
+
<details><summary><code>list</code> — 9 keys</summary>
|
|
1936
1949
|
|
|
1937
1950
|
| Key | Type | English default |
|
|
1938
1951
|
|---|---|---|
|
|
1939
1952
|
| `selected` | `(count: number) => string` | `3 selected` |
|
|
1953
|
+
| `selectedNotShown` | `(count: number, notShown: number) => string` | `3 selected, 3 not shown` |
|
|
1940
1954
|
| `allLoaded` | `(total: number, label: string) => string` | `All 3 {label} loaded` |
|
|
1941
1955
|
| `count` | `(total: number, label: string) => string` | `3 {label}` |
|
|
1942
1956
|
| `loadedOf` | `(loaded: number, total: number, label: string) => string` | `3 of 3 {label}` |
|
|
@@ -2016,13 +2030,15 @@ with sample arguments.
|
|
|
2016
2030
|
|
|
2017
2031
|
</details>
|
|
2018
2032
|
|
|
2019
|
-
<details><summary><code>copy</code> —
|
|
2033
|
+
<details><summary><code>copy</code> — 7 keys</summary>
|
|
2020
2034
|
|
|
2021
2035
|
| Key | Type | English default |
|
|
2022
2036
|
|---|---|---|
|
|
2023
2037
|
| `copy` | `string` | `Copy` |
|
|
2024
2038
|
| `copyLabel` | `(label: string) => string` | `Copy {label}` |
|
|
2025
2039
|
| `copied` | `string` | `Copied` |
|
|
2040
|
+
| `copyValue` | `(value: string) => string` | `Copy {value}` |
|
|
2041
|
+
| `copiedValue` | `string` | `Copied!` |
|
|
2026
2042
|
| `copiedLabel` | `(label: string) => string` | `{label} copied` |
|
|
2027
2043
|
| `failed` | `string` | `Could not copy to the clipboard` |
|
|
2028
2044
|
|
|
@@ -2139,6 +2155,60 @@ with sample arguments.
|
|
|
2139
2155
|
|
|
2140
2156
|
</details>
|
|
2141
2157
|
|
|
2158
|
+
<details><summary><code>resizeHandle</code> — 2 keys</summary>
|
|
2159
|
+
|
|
2160
|
+
| Key | Type | English default |
|
|
2161
|
+
|---|---|---|
|
|
2162
|
+
| `label` | `string` | `Resize panel` |
|
|
2163
|
+
| `hint` | `string` | `Drag to resize · double-click to reset` |
|
|
2164
|
+
|
|
2165
|
+
</details>
|
|
2166
|
+
|
|
2167
|
+
<details><summary><code>number</code> — 2 keys</summary>
|
|
2168
|
+
|
|
2169
|
+
| Key | Type | English default |
|
|
2170
|
+
|---|---|---|
|
|
2171
|
+
| `increase` | `string` | `Increase` |
|
|
2172
|
+
| `decrease` | `string` | `Decrease` |
|
|
2173
|
+
|
|
2174
|
+
</details>
|
|
2175
|
+
|
|
2176
|
+
<details><summary><code>slider</code> — 1 keys</summary>
|
|
2177
|
+
|
|
2178
|
+
| Key | Type | English default |
|
|
2179
|
+
|---|---|---|
|
|
2180
|
+
| `value` | `(label: string) => string` | `{label} value` |
|
|
2181
|
+
|
|
2182
|
+
</details>
|
|
2183
|
+
|
|
2184
|
+
<details><summary><code>color</code> — 9 keys</summary>
|
|
2185
|
+
|
|
2186
|
+
| Key | Type | English default |
|
|
2187
|
+
|---|---|---|
|
|
2188
|
+
| `swatch` | `(label: string, value: string) => string` | `{label}: {value}` |
|
|
2189
|
+
| `none` | `string` | `None` |
|
|
2190
|
+
| `panel` | `(label: string) => string` | `{label} picker` |
|
|
2191
|
+
| `square` | `string` | `Saturation and brightness` |
|
|
2192
|
+
| `squareValue` | `(saturation: number, brightness: number) => string` | `Saturation 3%, brightness 3%` |
|
|
2193
|
+
| `hue` | `string` | `Hue` |
|
|
2194
|
+
| `hex` | `(label: string) => string` | `{label} hex code` |
|
|
2195
|
+
| `presets` | `string` | `Presets` |
|
|
2196
|
+
| `clear` | `string` | `No color` |
|
|
2197
|
+
|
|
2198
|
+
</details>
|
|
2199
|
+
|
|
2200
|
+
<details><summary><code>tree</code> — 5 keys</summary>
|
|
2201
|
+
|
|
2202
|
+
| Key | Type | English default |
|
|
2203
|
+
|---|---|---|
|
|
2204
|
+
| `empty` | `string` | `Nothing here yet` |
|
|
2205
|
+
| `dropHere` | `string` | `Drop here` |
|
|
2206
|
+
| `dragHint` | `string` | `Drag to move` |
|
|
2207
|
+
| `moveHint` | `string` | `Alt+Arrow Up or Alt+Arrow Down moves it` |
|
|
2208
|
+
| `insertHere` | `string` | `Insert here` |
|
|
2209
|
+
|
|
2210
|
+
</details>
|
|
2211
|
+
|
|
2142
2212
|
<details><summary><code>layout</code> — 17 keys</summary>
|
|
2143
2213
|
|
|
2144
2214
|
| Key | Type | English default |
|
|
@@ -2363,6 +2433,183 @@ with sample arguments.
|
|
|
2363
2433
|
|
|
2364
2434
|
</details>
|
|
2365
2435
|
|
|
2436
|
+
<details><summary><code>map</code> — 14 keys</summary>
|
|
2437
|
+
|
|
2438
|
+
| Key | Type | English default |
|
|
2439
|
+
|---|---|---|
|
|
2440
|
+
| `failed` | `string` | `The map could not be drawn here. The list has everything it shows.` |
|
|
2441
|
+
| `approximate` | `(label: string) => string` | `{label}, approximate location` |
|
|
2442
|
+
| `approximateTitle` | `(label: string) => string` | `{label} (approximate)` |
|
|
2443
|
+
| `places` | `(count: number) => string` | `places` (`place` for one) |
|
|
2444
|
+
| `group` | `(count: number, noun: string) => string` | `3 {noun} here` |
|
|
2445
|
+
| `stops` | `(numbers: string) => string` | `Stops {numbers}` |
|
|
2446
|
+
| `closeBy` | `(count: number, noun: string) => string` | `3 more {noun} close by, drawn when the map is closer` |
|
|
2447
|
+
| `spread` | `string` | `Press to see them apart` |
|
|
2448
|
+
| `cycle` | `string` | `They stand on one spot: press for the next of them` |
|
|
2449
|
+
| `fullScreen` | `string` | `Full screen` |
|
|
2450
|
+
| `leaveFullScreen` | `string` | `Leave full screen` |
|
|
2451
|
+
| `chosen` | `(label: string) => string` | `{label}, chosen on the map` |
|
|
2452
|
+
| `closeCard` | `string` | `Close` |
|
|
2453
|
+
| `openRecord` | `string` | `Open` |
|
|
2454
|
+
|
|
2455
|
+
</details>
|
|
2456
|
+
|
|
2457
|
+
<details><summary><code>pdf</code> — 16 keys</summary>
|
|
2458
|
+
|
|
2459
|
+
| Key | Type | English default |
|
|
2460
|
+
|---|---|---|
|
|
2461
|
+
| `previousPage` | `string` | `Previous page` |
|
|
2462
|
+
| `nextPage` | `string` | `Next page` |
|
|
2463
|
+
| `pageOf` | `(page: number, total: number) => string` | `2 / 5` |
|
|
2464
|
+
| `zoomOut` | `string` | `Zoom out` |
|
|
2465
|
+
| `zoomIn` | `string` | `Zoom in` |
|
|
2466
|
+
| `zoom` | `string` | `Zoom` |
|
|
2467
|
+
| `fitWidth` | `string` | `Fit width` |
|
|
2468
|
+
| `fitPage` | `string` | `Fit page` |
|
|
2469
|
+
| `fit` | `string` | `Fit` |
|
|
2470
|
+
| `fitHint` | `string` | `Fit to the pane: follows its size until you zoom by hand` |
|
|
2471
|
+
| `print` | `string` | `Print` |
|
|
2472
|
+
| `download` | `string` | `Download` |
|
|
2473
|
+
| `email` | `string` | `Email` |
|
|
2474
|
+
| `loading` | `string` | `Loading PDF…` |
|
|
2475
|
+
| `loadFailed` | `string` | `Failed to load PDF` |
|
|
2476
|
+
| `allowPopups` | `string` | `Allow popups to print` |
|
|
2477
|
+
|
|
2478
|
+
</details>
|
|
2479
|
+
|
|
2480
|
+
<details><summary><code>loading</code> — 1 keys</summary>
|
|
2481
|
+
|
|
2482
|
+
| Key | Type | English default |
|
|
2483
|
+
|---|---|---|
|
|
2484
|
+
| `label` | `string` | `Loading...` |
|
|
2485
|
+
|
|
2486
|
+
</details>
|
|
2487
|
+
|
|
2488
|
+
<details><summary><code>entityList</code> — 15 keys</summary>
|
|
2489
|
+
|
|
2490
|
+
| Key | Type | English default |
|
|
2491
|
+
|---|---|---|
|
|
2492
|
+
| `open` | `string` | `Open` |
|
|
2493
|
+
| `copy` | `string` | `Copy` |
|
|
2494
|
+
| `copyColumn` | `(column: string) => string` | `Copy {column}` |
|
|
2495
|
+
| `copyRows` | `(count: number) => string` | `Copy 3 rows` (`Copy row` for one) |
|
|
2496
|
+
| `exportSelected` | `string` | `Export selected to CSV` |
|
|
2497
|
+
| `selectAll` | `string` | `Select all` |
|
|
2498
|
+
| `selectAllLoaded` | `(loaded: number) => string` | `Select all 3 loaded` |
|
|
2499
|
+
| `clearSelection` | `string` | `Clear selection` |
|
|
2500
|
+
| `refresh` | `string` | `Refresh` |
|
|
2501
|
+
| `copiedText` | `string` | `Text` |
|
|
2502
|
+
| `copiedRows` | `(count: number) => string` | `3 rows` (`Row` for one) |
|
|
2503
|
+
| `exported` | `(count: number) => string` | `Exported 3 rows.` (`Exported 1 row.` for one) |
|
|
2504
|
+
| `exportTruncated` | `(kept: number, asked: number) => string` | `Exported 5000 of 8000 rows. The server capped this export, so the file is incomplete.` |
|
|
2505
|
+
| `exportTruncatedUnknown` | `(asked: number) => string` | `Exported only some of the 8000 rows. The server capped this export, so the file is incomplete.` |
|
|
2506
|
+
| `exportFailed` | `string` | `CSV export failed.` |
|
|
2507
|
+
|
|
2508
|
+
</details>
|
|
2509
|
+
|
|
2510
|
+
<details><summary><code>columns</code> — 9 keys</summary>
|
|
2511
|
+
|
|
2512
|
+
| Key | Type | English default |
|
|
2513
|
+
|---|---|---|
|
|
2514
|
+
| `choose` | `string` | `Choose columns` |
|
|
2515
|
+
| `heading` | `string` | `Columns` |
|
|
2516
|
+
| `reset` | `string` | `Reset` |
|
|
2517
|
+
| `saveDefault` | `string` | `Save as default for all users` |
|
|
2518
|
+
| `savedDefault` | `string` | `Saved as default` |
|
|
2519
|
+
| `select` | `string` | `Select` |
|
|
2520
|
+
| `selectDone` | `string` | `Done` |
|
|
2521
|
+
| `showSelection` | `string` | `Show selection column` |
|
|
2522
|
+
| `hideSelection` | `string` | `Hide selection column` |
|
|
2523
|
+
|
|
2524
|
+
</details>
|
|
2525
|
+
|
|
2526
|
+
<details><summary><code>record</code> — 8 keys</summary>
|
|
2527
|
+
|
|
2528
|
+
| Key | Type | English default |
|
|
2529
|
+
|---|---|---|
|
|
2530
|
+
| `loading` | `string` | `Loading record…` |
|
|
2531
|
+
| `signInRequired` | `string` | `Sign in required` |
|
|
2532
|
+
| `signInBody` | `string` | `Your session may have expired. Sign in again to open this record.` |
|
|
2533
|
+
| `notFound` | `string` | `Record not found` |
|
|
2534
|
+
| `loadFailed` | `string` | `Couldn't load record` |
|
|
2535
|
+
| `checkConnection` | `string` | `Check your connection and try again.` |
|
|
2536
|
+
| `rejected` | `string` | `The server rejected this request.` |
|
|
2537
|
+
| `retry` | `string` | `Try again` |
|
|
2538
|
+
|
|
2539
|
+
</details>
|
|
2540
|
+
|
|
2541
|
+
<details><summary><code>password</code> — 11 keys</summary>
|
|
2542
|
+
|
|
2543
|
+
| Key | Type | English default |
|
|
2544
|
+
|---|---|---|
|
|
2545
|
+
| `current` | `string` | `Current Password` |
|
|
2546
|
+
| `newPassword` | `string` | `New Password` |
|
|
2547
|
+
| `confirm` | `string` | `Confirm Password` |
|
|
2548
|
+
| `submit` | `string` | `Change Password` |
|
|
2549
|
+
| `submitting` | `string` | `Changing...` |
|
|
2550
|
+
| `done` | `string` | `Done` |
|
|
2551
|
+
| `currentRequired` | `string` | `Current password is required.` |
|
|
2552
|
+
| `tooShort` | `(minLength: number) => string` | `New password must be at least 8 characters.` |
|
|
2553
|
+
| `mismatch` | `string` | `Passwords do not match.` |
|
|
2554
|
+
| `failed` | `string` | `Failed to change password.` |
|
|
2555
|
+
| `changed` | `string` | `Your password has been changed successfully.` |
|
|
2556
|
+
|
|
2557
|
+
</details>
|
|
2558
|
+
|
|
2559
|
+
<details><summary><code>pdfAction</code> — 10 keys</summary>
|
|
2560
|
+
|
|
2561
|
+
| Key | Type | English default |
|
|
2562
|
+
|---|---|---|
|
|
2563
|
+
| `label` | `string` | `PDF` |
|
|
2564
|
+
| `loading` | `string` | `Loading...` |
|
|
2565
|
+
| `preview` | `string` | `Preview` |
|
|
2566
|
+
| `download` | `string` | `Download` |
|
|
2567
|
+
| `email` | `string` | `Send by Email` |
|
|
2568
|
+
| `downloaded` | `(filename: string) => string` | `{filename} downloaded.` |
|
|
2569
|
+
| `tookTooLong` | `(filename: string) => string` | `{filename} took too long to load. Please try again.` |
|
|
2570
|
+
| `previewLoading` | `string` | `LOADING PDF` |
|
|
2571
|
+
| `previewTookTooLong` | `string` | `This document took too long to load. Close this window and try again.` |
|
|
2572
|
+
| `previewFailed` | `string` | `Failed to load PDF.` |
|
|
2573
|
+
|
|
2574
|
+
</details>
|
|
2575
|
+
|
|
2576
|
+
<details><summary><code>undo</code> — 6 keys</summary>
|
|
2577
|
+
|
|
2578
|
+
| Key | Type | English default |
|
|
2579
|
+
|---|---|---|
|
|
2580
|
+
| `undo` | `string` | `Undo` |
|
|
2581
|
+
| `redo` | `string` | `Redo` |
|
|
2582
|
+
| `undoStep` | `(label: string, keys: string) => string` | `Undo {label} ({keys})` |
|
|
2583
|
+
| `redoStep` | `(label: string, keys: string) => string` | `Redo {label} ({keys})` |
|
|
2584
|
+
| `nothingToUndo` | `string` | `Nothing to undo` |
|
|
2585
|
+
| `nothingToRedo` | `string` | `Nothing to redo` |
|
|
2586
|
+
|
|
2587
|
+
</details>
|
|
2588
|
+
|
|
2589
|
+
<details><summary><code>sounds</code> — 17 keys</summary>
|
|
2590
|
+
|
|
2591
|
+
| Key | Type | English default |
|
|
2592
|
+
|---|---|---|
|
|
2593
|
+
| `title` | `string` | `Sounds` |
|
|
2594
|
+
| `enable` | `string` | `Sound effects` |
|
|
2595
|
+
| `autosave` | `string` | `Changes are saved automatically` |
|
|
2596
|
+
| `choice` | `(event: string, pack: string) => string` | `{event} — {pack}` |
|
|
2597
|
+
| `packClassic` | `string` | `Classic` |
|
|
2598
|
+
| `packMinimal` | `string` | `Minimal` |
|
|
2599
|
+
| `packRetro` | `string` | `Retro` |
|
|
2600
|
+
| `packSoft` | `string` | `Soft` |
|
|
2601
|
+
| `packArcade` | `string` | `Arcade` |
|
|
2602
|
+
| `packSilent` | `string` | `Silent` |
|
|
2603
|
+
| `eventClick` | `string` | `Click` |
|
|
2604
|
+
| `eventSuccess` | `string` | `Success` |
|
|
2605
|
+
| `eventError` | `string` | `Error` |
|
|
2606
|
+
| `eventNotification` | `string` | `Notification` |
|
|
2607
|
+
| `eventStartup` | `string` | `Startup` |
|
|
2608
|
+
| `eventTimerDone` | `string` | `Timer` |
|
|
2609
|
+
| `eventLogout` | `string` | `Logout` |
|
|
2610
|
+
|
|
2611
|
+
</details>
|
|
2612
|
+
|
|
2366
2613
|
### Brand surfaces — `efficient-shell/brand.css`
|
|
2367
2614
|
|
|
2368
2615
|
For output that is not a portal window — a report, a published artifact, a
|
|
@@ -2640,8 +2887,8 @@ missing or cannot be read. All of them are also exported from
|
|
|
2640
2887
|
| `formatTime(value, options?)` | `9:30 am` — twelve-hour, small am/pm; a `locale` gives the locale's own clock. |
|
|
2641
2888
|
| `getUserTimezone()`, `setUserTimezone(zone)`, `syncTimezoneFromProfile(zone)`, `TZ_AUTO` | The zone setting. `undefined` / `'auto'` follow the browser. Call `syncTimezoneFromProfile` when the signed-in user loads; a blank value changes nothing. |
|
|
2642
2889
|
| `getUserDateFormat()`, `setUserDateFormat(key)`, `DATE_FORMAT_OPTIONS` | The format setting and the 16 formats a settings page offers. |
|
|
2643
|
-
| `timeAgo(value, { precise? })` | `just now` under a minute, then `5m ago`, `3h ago`, `2d ago`; from seven days on the date (`formatDate`). A future time is `just now`. `precise` counts seconds (`12s ago`) for a status screen. Takes a string, a `Date` or epoch ms. |
|
|
2644
|
-
| `<TimeAgo value precise? className? />` | `timeAgo` in a `<time>` whose hover (`title`) is the full `formatDateTime`. Use it wherever a relative time is shown. |
|
|
2890
|
+
| `timeAgo(value, { precise? })` | `just now` under a minute, then `5m ago`, `3h ago`, `2d ago`; from seven days on the date (`formatDate`). A future time is `just now`. `precise` counts seconds (`12s ago`) for a status screen. Takes a string, a `Date` or epoch ms. With `locale` (a BCP 47 tag) the words are `Intl.RelativeTimeFormat`'s in that language, and the fallback date is written in it too. |
|
|
2891
|
+
| `<TimeAgo value precise? locale? className? />` | `timeAgo` in a `<time>` whose hover (`title`) is the full `formatDateTime`. Use it wherever a relative time is shown. It follows `ShellStringsProvider`'s `locale`; pass `locale` to override. |
|
|
2645
2892
|
| `setCurrencyFormats(catalog)` | Hand the kit the currency catalog (`/api/currencies/`: `{ AUD: { symbol: 'A$', decimals: 2 }, … }`) once a session starts. Until then amounts show their code. |
|
|
2646
2893
|
| `formatMoney(amount, currency?, { whole? })` | `A$1,234.50`, `-€50.00`, `CHF 1,200.00`. The catalog's symbol — an unknown code prints as the code, never a guessed `$`. Minus first, commas, the catalog's decimals (2 by default); `whole` drops them (`A$3,841`) for a storefront card. No currency prints the bare figure. Takes a number or the API's string. |
|
|
2647
2894
|
| `currencySymbol(code)`, `currencyDecimals(code)` | The two catalog lookups `formatMoney` uses. |
|
|
@@ -2768,7 +3015,7 @@ itself where the kit has an answer:
|
|
|
2768
3015
|
| `radius` | a literal corner radius: an arbitrary-value radius class (`rounded-[4px]`) or an inline `borderRadius` number or length (not `inherit`, `var(…)`, `50%` or `9999`) | a scale utility or a role token; the theme's Corners setting shapes them |
|
|
2769
3016
|
| `kit` | an import of a second UI kit (`@headlessui`, `@radix-ui`, `@mui`, `antd`, `sonner`, …) | the kit's component |
|
|
2770
3017
|
| `icon` | an import of an icon package (`@heroicons`, `lucide-react`, `@tabler/icons`, …) | `<Icon name>` from `efficient-shell/icons` |
|
|
2771
|
-
| `kit-dep` | one of those packages declared in `package.json` (not `devDependencies`) | remove it |
|
|
3018
|
+
| `kit-dep` | one of those packages declared in `package.json` (not `devDependencies`, and not one the shell needs from an entry the repository imports: `@headlessui/react` and `@heroicons/react` for the root entry, an icon set's own package) | remove it |
|
|
2772
3019
|
|
|
2773
3020
|
Known gaps: `rgb()` / `hsl()` colours, colours in `.ts` maps, and
|
|
2774
3021
|
`createElement('button')` are not counted.
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import{peekBrowserStartUrl as e,claimBrowserStartUrl as t}from"./chunk-LWLCNQY7.js";import{AboutApp as o}from"./chunk-
|
|
1
|
+
import{peekBrowserStartUrl as e,claimBrowserStartUrl as t}from"./chunk-LWLCNQY7.js";import{AboutApp as o}from"./chunk-XHWT4DH2.js";import{WindowTitle as r}from"./chunk-X5LH3UOJ.js";import"./chunk-DSSLOQDW.js";import"./chunk-6TDPY7WG.js";import"./chunk-XJX3NA37.js";import"./chunk-CQN5CFKA.js";import"./chunk-5A7MWTXX.js";import"./chunk-EXXHI5DO.js";import"./chunk-PGVUO7GB.js";import"./chunk-HZZNJHRH.js";import"./chunk-D65T4H6J.js";import{confirm as n}from"./chunk-FIGVDYJR.js";import"./chunk-AFYQTVZO.js";import"./chunk-X4FJ54PP.js";import"./chunk-S5QF4VFG.js";import"./chunk-YKZHOXI4.js";import{useRef as a,useEffect as i,useState as s}from"react";import{jsxs as l,jsx as c,Fragment as m}from"react/jsx-runtime";var d="react-os-shell:browser-bookmarks",u="react-os-shell:browser-homepage",h="https://en.wikipedia.org/wiki/Main_Page",p=[{label:"Wikipedia",url:"https://en.wikipedia.org/wiki/Main_Page"},{label:"DevDocs",url:"https://devdocs.io"},{label:"Example",url:"https://example.com"}],g=new Set(["ac ad ae af ag ai al am ao aq ar as at au aw ax az ba bb bd be bf bg bh bi","bj bm bn bo br bs bt bw by bz ca cc cd cf cg ch ci ck cl cm cn co cr cu cv","cw cx cy cz de dj dk dm do dz ec ee eg er es et eu fi fj fk fm fo fr ga gd","ge gf gg gh gi gl gm gn gp gq gr gs gt gu gw gy hk hm hn hr ht hu id ie il","im in io iq ir is it je jm jo jp ke kg kh ki km kn kp kr kw ky kz la lb lc","li lk lr ls lt lu lv ly ma mc md me mg mh mk ml mm mn mo mp mq mr ms mt mu","mv mw mx my mz na nc ne nf ng ni nl no np nr nu nz om pa pe pf pg ph pk pl","pm pn pr ps pt pw py qa re ro rs ru rw sa sb sc sd se sg sh si sk sl sm sn","so sr ss st su sv sx sy sz tc td tf tg th tj tk tl tm tn to tr tt tv tw tz","ua ug uk us uy uz va vc ve vg vi vn vu wf ws ye yt za zm zw","com net org edu gov mil int info biz name pro app dev xyz online site tech","store shop cloud design digital agency studio media news blog live life","world today email systems solutions services software page link space host","press wiki team group works careers finance capital energy academy"].join(" ").split(" "));function b(e){let t=e.trim();return t?/^[a-z][a-z0-9+.-]*:\/\//i.test(t)?t:function(e){const t=/^([\w-]+\.)+([a-z]{2,})(\/.*)?$/i.exec(e);return null!==t&&g.has(t[2].toLowerCase())}(t)?"https://"+t:"https://duckduckgo.com/?q="+encodeURIComponent(t):""}var k=["duckduckgo.com","developer.mozilla.org","google.com","gmail.com","youtube.com","facebook.com","instagram.com","whatsapp.com","twitter.com","x.com","github.com","gitlab.com","linkedin.com","reddit.com","pinterest.com","amazon.com","amazon.ca","amazon.co.uk","apple.com","icloud.com","microsoft.com","outlook.com","live.com","office.com","netflix.com","spotify.com","paypal.com","stripe.com","chat.openai.com","chatgpt.com","claude.ai"];function f(){if("undefined"==typeof window)return p;try{const e=localStorage.getItem(d);if(!e)return p;const t=JSON.parse(e);if(Array.isArray(t)&&t.every(e=>"string"==typeof e?.url))return t}catch{}return p}function x(){return"undefined"==typeof window?h:localStorage.getItem(u)||h}function w(){const m=a(void 0);void 0===m.current&&(m.current=e()),i(()=>{null!=m.current&&t(m.current)},[]);const h=m.current?b(m.current.url):"",[p,g]=s(x),[k,w]=s(h||p),[N,L]=s(k),[j,C]=s([k]),[z,H]=s(0),[M,W]=s(0),[S,R]=s(f),[A,D]=s(!1),[B,O]=s(null),X=a(null),E=a(null);i(()=>{try{localStorage.setItem(d,JSON.stringify(S))}catch{}},[S]);const T=e=>{const t=b(e);t&&(w(t),L(t),C(e=>{const o=e.slice(0,z+1);return o.push(t),o}),H(e=>e+1),D(!1))},F=()=>{"undefined"!=typeof window&&window.open(k,"_blank","noopener,noreferrer")},I=()=>{const e=B?.trim();e?(R(t=>[...t,{label:e,url:k}]),O(null)):O(null)};i(()=>{if(null===B)return;X.current?.focus(),X.current?.select();const e=e=>{const t=e.target;t?.closest("[data-bookmark-popover]")||O(null)},t=setTimeout(()=>document.addEventListener("mousedown",e),0);return()=>{clearTimeout(t),document.removeEventListener("mousedown",e)}},[null!==B]);const P=e=>{R(t=>t.filter((t,o)=>o!==e))},V=z>0,G=z<j.length-1,J=S.some(e=>e.url===k),U="p-1.5 rounded hover:bg-gray-200 transition-colors text-gray-600 disabled:opacity-30";/* @__PURE__ */
|
|
2
2
|
return l("div",{className:"relative flex flex-col h-full bg-white",children:[
|
|
3
3
|
/* @__PURE__ */c(r,{title:`Browser - ${v(k)}`}),
|
|
4
4
|
/* @__PURE__ */c(o,{app:"browser"}),
|
|
5
5
|
/* @__PURE__ */l("div",{className:"flex items-center gap-1 px-2 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0",children:[
|
|
6
|
-
/* @__PURE__ */c("button",{onClick:()=>{if(z>0){const e=z-1;
|
|
7
|
-
/* @__PURE__ */c("button",{onClick:()=>{if(z<j.length-1){const e=z+1;
|
|
8
|
-
/* @__PURE__ */c("button",{onClick:()=>
|
|
9
|
-
/* @__PURE__ */c("button",{onClick:()=>
|
|
10
|
-
/* @__PURE__ */c("form",{onSubmit:e=>{e.preventDefault(),
|
|
6
|
+
/* @__PURE__ */c("button",{onClick:()=>{if(z>0){const e=z-1;H(e),w(j[e]),L(j[e]),D(!1)}},disabled:!V,className:U,title:"Back",children:/* @__PURE__ */c("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:/* @__PURE__ */c("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 19.5L8.25 12l7.5-7.5"})})}),
|
|
7
|
+
/* @__PURE__ */c("button",{onClick:()=>{if(z<j.length-1){const e=z+1;H(e),w(j[e]),L(j[e]),D(!1)}},disabled:!G,className:U,title:"Forward",children:/* @__PURE__ */c("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:/* @__PURE__ */c("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8.25 4.5l7.5 7.5-7.5 7.5"})})}),
|
|
8
|
+
/* @__PURE__ */c("button",{onClick:()=>W(e=>e+1),className:U,title:"Refresh",children:/* @__PURE__ */c("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:/* @__PURE__ */c("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M16.023 9.348h4.992V4.356M2.985 19.644v-4.992h4.992M3.05 9.348a9 9 0 0114.85-3.36L21.015 9.348m0 5.304a9 9 0 01-14.85 3.36l-3.115-3.36"})})}),
|
|
9
|
+
/* @__PURE__ */c("button",{onClick:()=>T(p),className:U,title:"Home",children:/* @__PURE__ */c("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:/* @__PURE__ */c("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M2.25 12l8.954-8.955a1.5 1.5 0 012.122 0l8.954 8.955M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"})})}),
|
|
10
|
+
/* @__PURE__ */c("form",{onSubmit:e=>{e.preventDefault(),T(N)},className:"flex-1 flex items-center mx-1",children:/* @__PURE__ */l("div",{className:"flex items-center w-full bg-white border border-gray-300 rounded focus-within:border-blue-400 focus-within:ring-1 focus-within:ring-blue-200",children:[
|
|
11
11
|
/* @__PURE__ */c("span",{className:"px-2 text-gray-400 text-xs",children:k.startsWith("https://")?"🔒":"⚠️"}),
|
|
12
12
|
/* @__PURE__ */c("input",{type:"text",value:N,onChange:e=>L(e.target.value),onFocus:e=>e.target.select(),className:"flex-1 px-1 py-1 text-sm bg-transparent outline-none font-mono",spellCheck:!1,placeholder:"Enter URL or search…"}),k!==N&&/* @__PURE__ */c("button",{type:"button",onClick:()=>L(k),className:"px-1.5 text-[10px] text-gray-400 hover:text-gray-700",title:"Reset to current URL",children:"×"})]})}),
|
|
13
|
-
/* @__PURE__ */c("button",{"data-bookmark-popover":!0,onClick:()=>
|
|
14
|
-
/* @__PURE__ */c("button",{onClick:
|
|
15
|
-
/* @__PURE__ */c("button",{onClick:()=>D(e=>!e),className:
|
|
13
|
+
/* @__PURE__ */c("button",{"data-bookmark-popover":!0,onClick:()=>J?P(S.findIndex(e=>e.url===k)):void O(v(k)),className:U+" "+(J?"text-yellow-500":""),title:J?"Remove bookmark":"Add bookmark",children:/* @__PURE__ */c("svg",{className:"h-4 w-4",fill:J?"currentColor":"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */c("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z"})})}),
|
|
14
|
+
/* @__PURE__ */c("button",{onClick:F,className:U,title:"Open in new tab",children:/* @__PURE__ */c("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */c("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-7.5-9L21 3m0 0v6m0-6L9.75 14.25"})})}),
|
|
15
|
+
/* @__PURE__ */c("button",{onClick:()=>D(e=>!e),className:U,title:"Embedding help",children:/* @__PURE__ */c("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */c("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z"})})})]}),null!==B&&/* @__PURE__ */l("div",{"data-bookmark-popover":!0,className:"absolute right-3 top-12 z-30 w-72 bg-white border border-gray-200 rounded-md shadow-lg p-3",children:[
|
|
16
16
|
/* @__PURE__ */c("div",{className:"text-[11px] font-semibold uppercase tracking-wide text-gray-500 mb-1",children:"Bookmark this page"}),
|
|
17
17
|
/* @__PURE__ */c("div",{className:"text-[11px] text-gray-400 truncate mb-2 font-mono",title:k,children:k}),
|
|
18
|
-
/* @__PURE__ */c("input",{ref:
|
|
18
|
+
/* @__PURE__ */c("input",{ref:X,type:"text",value:B,onChange:e=>O(e.target.value),onKeyDown:e=>{"Enter"===e.key?I():"Escape"===e.key&&O(null)},placeholder:"Name",className:"w-full text-sm px-2 py-1.5 border border-gray-300 rounded focus:outline-none focus:border-blue-400 focus:ring-1 focus:ring-blue-200"}),
|
|
19
19
|
/* @__PURE__ */l("div",{className:"flex justify-end gap-1 mt-2",children:[
|
|
20
|
-
/* @__PURE__ */c("button",{onClick:()=>
|
|
21
|
-
/* @__PURE__ */c("button",{onClick:
|
|
22
|
-
/* @__PURE__ */l("div",{className:"flex items-center gap-0.5 px-2 py-1 border-b border-gray-200 bg-white shrink-0 overflow-x-auto",children:[0===
|
|
20
|
+
/* @__PURE__ */c("button",{onClick:()=>O(null),className:"px-2 py-1 text-xs text-gray-600 hover:bg-gray-100 rounded",children:"Cancel"}),
|
|
21
|
+
/* @__PURE__ */c("button",{onClick:I,disabled:!B.trim(),className:"px-2 py-1 text-xs bg-blue-500 text-white rounded hover:bg-blue-600 disabled:opacity-40",children:"Save"})]})]}),
|
|
22
|
+
/* @__PURE__ */l("div",{className:"flex items-center gap-0.5 px-2 py-1 border-b border-gray-200 bg-white shrink-0 overflow-x-auto",children:[0===S.length&&/* @__PURE__ */c("span",{className:"text-[11px] text-gray-400 italic px-2",children:"No bookmarks yet — star the address bar to add one."}),S.map((e,t)=>/* @__PURE__ */l("button",{onClick:()=>T(e.url),onContextMenu:async o=>{o.preventDefault();await n({title:"Remove bookmark",message:`"${e.label}" will be removed from your bookmarks.`,confirmLabel:"Remove",variant:"danger"})&&P(t)},className:"flex items-center gap-1.5 px-2 py-0.5 rounded text-[12px] text-gray-700 hover:bg-gray-100 whitespace-nowrap",title:`${e.url}\n(right-click to remove)`,children:[
|
|
23
23
|
/* @__PURE__ */c("img",{src:`https://icons.duckduckgo.com/ip3/${new URL(e.url).hostname}.ico`,alt:"",className:"h-3.5 w-3.5",onError:e=>{e.target.style.visibility="hidden"}}),e.label]},t)),
|
|
24
24
|
/* @__PURE__ */c("div",{className:"flex-1"}),
|
|
25
25
|
/* @__PURE__ */c("button",{onClick:()=>{g(k);try{localStorage.setItem(u,k)}catch{}},className:"px-2 py-0.5 text-[11px] text-gray-500 hover:text-gray-800",title:"Set current page as homepage",children:"Set as home"})]}),
|
|
26
|
-
/* @__PURE__ */c("div",{className:"flex-1 relative min-h-0 bg-gray-50",children:/* @__PURE__ */c(y,{url:k,iframeKey:
|
|
26
|
+
/* @__PURE__ */c("div",{className:"flex-1 relative min-h-0 bg-gray-50",children:/* @__PURE__ */c(y,{url:k,iframeKey:M,iframeRef:E,openExternal:F,showHelp:A,dismissHelp:()=>D(!1)})})]})}function v(e){try{return new URL(e).hostname.replace(/^www\./,"")}catch{return e}}function y({url:e,iframeKey:t,iframeRef:o,openExternal:r,showHelp:n,dismissHelp:a}){const[d,u]=s(!1);i(()=>{u(!1)},[e]);return function(e){try{const t=new URL(e).hostname.toLowerCase();return k.some(e=>t===e||t.endsWith("."+e))}catch{return!1}}(e)&&!d?/* @__PURE__ */c("div",{className:"absolute inset-0 flex items-center justify-center bg-white p-8",children:/* @__PURE__ */l("div",{className:"max-w-md text-center",children:[
|
|
27
27
|
/* @__PURE__ */c("svg",{className:"h-14 w-14 mx-auto text-gray-300 mb-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.2,children:/* @__PURE__ */c("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728L5.636 5.636m12.728 12.728L21 21M5.636 5.636L3 3m9 9a9 9 0 110-18 9 9 0 010 18z"})}),
|
|
28
28
|
/* @__PURE__ */l("h3",{className:"text-base font-semibold text-gray-800 mb-1",children:[v(e)," can't be embedded"]}),
|
|
29
29
|
/* @__PURE__ */l("p",{className:"text-sm text-gray-500 mb-4",children:["This site sends an ",
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import{loadAppearance as e,WidgetSettingsModal as t}from"./chunk-MVUYJAZT.js";import{useWidgetSettings as n}from"./chunk-X5LH3UOJ.js";import"./chunk-DSSLOQDW.js";import"./chunk-6TDPY7WG.js";import"./chunk-CQN5CFKA.js";import"./chunk-5A7MWTXX.js";import"./chunk-EXXHI5DO.js";import"./chunk-PGVUO7GB.js";import"./chunk-HZZNJHRH.js";import"./chunk-D65T4H6J.js";import"./chunk-FIGVDYJR.js";import"./chunk-AFYQTVZO.js";import"./chunk-X4FJ54PP.js";import"./chunk-S5QF4VFG.js";import"./chunk-YKZHOXI4.js";import{useState as r,useRef as l,useCallback as o,useEffect as i}from"react";import{jsxs as a,Fragment as c,jsx as s}from"react/jsx-runtime";var u="calc_appearance";function d(){const[d,h]=r("0"),[m,k]=r(null),[b,p]=r(null),[g,v]=r(!1),[x,y]=r(""),[N,f]=r([]),[C,$]=r(!1),[j,w]=r(()=>e(u)),[E,F]=r(!1),[S,T]=r(j),L=l(null);n(o(()=>{T({...j}),F(!0)},[j]));const A=o(e=>{y(""),h(t=>g||"0"===t?(v(!1),"."===e?"0.":e):"."===e&&t.includes(".")?t:t+e)},[g]),D=o(()=>{h("0"),k(null),p(null),v(!1)},[]),H=o((e,t,n)=>{switch(n){case"+":return e+t;case"-":return e-t;case"×":return e*t;case"÷":return 0===t?0:e/t;default:return t}},[]),O=o(e=>{const t=parseFloat(d);if(null!==m&&b&&!g){const e=H(m,t,b);h(String(e)),k(e),f(n=>[`${m} ${b} ${t} = ${e}`,...n].slice(0,20))}else k(t);p(e),v(!0)},[d,m,b,g,H]),W=o(()=>{if(null===m||!b)return;const e=parseFloat(d),t=H(m,e,b),n=`${m} ${b} ${e} =`;f(e=>[`${n} ${t}`,...e].slice(0,20)),y(n),h(String(t)),k(null),p(null),v(!0)},[d,m,b,H]),X=o(()=>{h(e=>String(parseFloat(e)/100))},[]),J=o(()=>{h(e=>e.startsWith("-")?e.slice(1):"0"===e?e:"-"+e)},[]);i(()=>{const e=e=>{const t=e.target.tagName;"INPUT"!==t&&"TEXTAREA"!==t&&"SELECT"!==t&&(e.key>="0"&&e.key<="9"?A(e.key):"."===e.key?A("."):"+"===e.key?O("+"):"-"===e.key?O("-"):"*"===e.key?O("×"):"/"===e.key?(e.preventDefault(),O("÷")):"Enter"===e.key||"="===e.key?("Enter"===e.key&&e.target instanceof Node&&L.current?.contains(e.target)&&e.preventDefault(),W()):"Escape"===e.key?D():"Backspace"===e.key?h(e=>e.length>1?e.slice(0,-1):"0"):"%"===e.key&&X())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[A,O,W,D,X]);const B="flex items-center justify-center rounded-lg text-sm font-medium transition-colors",V=`${B} bg-white border border-gray-200 text-gray-900 hover:bg-gray-50 active:bg-gray-100`,G=`${B} bg-blue-50 border border-blue-200 text-blue-700 hover:bg-blue-100 active:bg-blue-200`,I=`${B} bg-gray-100 border border-gray-200 text-gray-600 hover:bg-gray-200 active:bg-gray-300`,M=`${B} bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800`;/* @__PURE__ */
|
|
2
|
+
return a(c,{children:[
|
|
3
|
+
/* @__PURE__ */a("div",{ref:L,className:"flex flex-col h-full",style:{opacity:j.activeOpacity/100,backdropFilter:j.activeBlur>0?`blur(${j.activeBlur}px)`:void 0},children:[
|
|
4
|
+
/* @__PURE__ */a("div",{className:"bg-slate-200 rounded-t-lg px-4 py-2 group/display relative flex flex-col justify-end min-h-[120px] border-b border-slate-300",children:[
|
|
5
|
+
/* @__PURE__ */s("div",{className:"flex flex-col justify-end flex-1 overflow-hidden",children:N.slice(0,3).reverse().map((e,t)=>/* @__PURE__ */s("div",{className:"text-[11px] text-slate-400 text-right font-mono truncate",children:e},t))}),(x||b&&null!==m)&&/* @__PURE__ */s("div",{className:"text-base text-slate-600 text-right font-mono",children:x||`${m} ${b} ${g?"":d}`}),
|
|
6
|
+
/* @__PURE__ */a("div",{className:"flex items-center gap-2",children:[
|
|
7
|
+
/* @__PURE__ */s("button",{onClick:()=>{navigator.clipboard.writeText(d),$(!0),setTimeout(()=>$(!1),1200)},title:"Copy result",className:"shrink-0 text-slate-300 hover:text-slate-500 transition-colors opacity-0 group-hover/display:opacity-100",children:/* @__PURE__ */s("svg",C?{className:"h-5 w-5 text-green-500",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:/* @__PURE__ */s("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"})}:{className:"h-5 w-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:/* @__PURE__ */s("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"})})}),
|
|
8
|
+
/* @__PURE__ */s("div",{className:"text-right text-4xl font-mono font-bold text-slate-800 truncate flex-1",children:(e=>{const t=parseFloat(e);return isNaN(t)||e.endsWith(".")||e.endsWith(".0")||Math.abs(t)<1e15&&e.length<16?e:t.toExponential(6)})(d)})]})]}),
|
|
9
|
+
/* @__PURE__ */a("div",{className:"grid grid-cols-4 grid-rows-5 gap-1.5 flex-1 min-h-0 p-2",children:[
|
|
10
|
+
/* @__PURE__ */s("button",{onClick:D,className:I,children:"AC"}),
|
|
11
|
+
/* @__PURE__ */s("button",{onClick:J,className:I,children:"+/−"}),
|
|
12
|
+
/* @__PURE__ */s("button",{onClick:X,className:I,children:"%"}),
|
|
13
|
+
/* @__PURE__ */s("button",{onClick:()=>O("÷"),className:`${G} ${"÷"===b?"ring-2 ring-blue-400":""}`,children:"÷"}),
|
|
14
|
+
/* @__PURE__ */s("button",{onClick:()=>A("7"),className:V,children:"7"}),
|
|
15
|
+
/* @__PURE__ */s("button",{onClick:()=>A("8"),className:V,children:"8"}),
|
|
16
|
+
/* @__PURE__ */s("button",{onClick:()=>A("9"),className:V,children:"9"}),
|
|
17
|
+
/* @__PURE__ */s("button",{onClick:()=>O("×"),className:`${G} ${"×"===b?"ring-2 ring-blue-400":""}`,children:"×"}),
|
|
18
|
+
/* @__PURE__ */s("button",{onClick:()=>A("4"),className:V,children:"4"}),
|
|
19
|
+
/* @__PURE__ */s("button",{onClick:()=>A("5"),className:V,children:"5"}),
|
|
20
|
+
/* @__PURE__ */s("button",{onClick:()=>A("6"),className:V,children:"6"}),
|
|
21
|
+
/* @__PURE__ */s("button",{onClick:()=>O("-"),className:`${G} ${"-"===b?"ring-2 ring-blue-400":""}`,children:"−"}),
|
|
22
|
+
/* @__PURE__ */s("button",{onClick:()=>A("1"),className:V,children:"1"}),
|
|
23
|
+
/* @__PURE__ */s("button",{onClick:()=>A("2"),className:V,children:"2"}),
|
|
24
|
+
/* @__PURE__ */s("button",{onClick:()=>A("3"),className:V,children:"3"}),
|
|
25
|
+
/* @__PURE__ */s("button",{onClick:()=>O("+"),className:`${G} ${"+"===b?"ring-2 ring-blue-400":""}`,children:"+"}),
|
|
26
|
+
/* @__PURE__ */s("button",{onClick:()=>A("0"),className:`${V} col-span-2`,children:"0"}),
|
|
27
|
+
/* @__PURE__ */s("button",{onClick:()=>A("."),className:V,children:"."}),
|
|
28
|
+
/* @__PURE__ */s("button",{onClick:W,className:M,children:"="})]})]}),
|
|
29
|
+
/* @__PURE__ */s(t,{open:E,onClose:()=>F(!1),title:"Calculator Settings",appearance:S,onAppearanceChange:T,onSave:()=>{w(S),localStorage.setItem(u,JSON.stringify(S)),F(!1)}})]})}export{d as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{ConfirmProvider,confirm,confirmDestructive,prompt,useConfirm}from"./chunk-FIGVDYJR.js";import"./chunk-AFYQTVZO.js";import"./chunk-X4FJ54PP.js";import"./chunk-S5QF4VFG.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{loadAppearance as e,WidgetSettingsModal as t}from"./chunk-
|
|
1
|
+
import{loadAppearance as e,WidgetSettingsModal as t}from"./chunk-MVUYJAZT.js";import{useWidgetSettings as r}from"./chunk-X5LH3UOJ.js";import"./chunk-DSSLOQDW.js";import"./chunk-6TDPY7WG.js";import"./chunk-CQN5CFKA.js";import"./chunk-5A7MWTXX.js";import"./chunk-EXXHI5DO.js";import"./chunk-PGVUO7GB.js";import"./chunk-HZZNJHRH.js";import"./chunk-D65T4H6J.js";import"./chunk-FIGVDYJR.js";import"./chunk-AFYQTVZO.js";import"./chunk-X4FJ54PP.js";import"./chunk-S5QF4VFG.js";import"./chunk-YKZHOXI4.js";import{useState as a,useCallback as n,useEffect as s}from"react";import{jsxs as c,Fragment as o,jsx as i}from"react/jsx-runtime";var l=["USD","CNY","AUD","GBP","EUR","JPY","CAD","THB","NZD","SGD","HKD","CHF","KRW","INR","MXN","BRL"],m=[["USD","CNY"],["USD","AUD"],["GBP","USD"],["USD","JPY"]],u="currency_pairs",p="currency_appearance",d="currency_rates_cache";function h(e){try{const t=JSON.parse(localStorage.getItem(d)||"{}")[e];if(t&&Date.now()-t.timestamp<36e5)return t.rates}catch{}return null}function g(e,t){try{const r=JSON.parse(localStorage.getItem(d)||"{}");r[e]={rates:t,timestamp:Date.now()},localStorage.setItem(d,JSON.stringify(r))}catch{}}function x(){try{const e=JSON.parse(localStorage.getItem(u)||"");if(Array.isArray(e)&&e.length)return e.slice(0,4)}catch{}return m}var y={USD:"🇺🇸",CNY:"🇨🇳",AUD:"🇦🇺",GBP:"🇬🇧",JPY:"🇯🇵",CAD:"🇨🇦",EUR:"🇪🇺",THB:"🇹🇭",NZD:"🇳🇿",SGD:"🇸🇬",HKD:"🇭🇰",CHF:"🇨🇭",KRW:"🇰🇷",INR:"🇮🇳",MXN:"🇲🇽",BRL:"🇧🇷"};function f(){const[m,d]=a(x),[f,N]=a(()=>e(p)),[b,v]=a({}),[S,D]=a(!1),[k,C]=a(!1),[j,J]=a([]),[U,O]=a(f),[A,H]=a("USD"),[I,Y]=a("CNY");r(n(()=>{J([...m]),O({...f}),C(!0)},[m,f])),s(()=>{const e=[...new Set(m.map(([e])=>e))];let t=!0;return async function(){D(!0);const r={};for(const t of e){const e=h(t);if(e)r[t]=e;else try{const e=await fetch(`https://open.er-api.com/v6/latest/${t}`),a=await e.json();a.rates&&(r[t]=a.rates,g(t,a.rates))}catch{}}t&&(v(r),D(!1))}(),()=>{t=!1}},[m]);/* @__PURE__ */
|
|
2
2
|
return c(o,{children:[
|
|
3
3
|
/* @__PURE__ */i("div",{style:{backgroundColor:`rgb(var(--taskbar-bg-rgb, 243 244 246) / ${f.activeOpacity/100})`,backdropFilter:f.activeBlur>0?`blur(${f.activeBlur}px)`:void 0},children:/* @__PURE__ */c("div",{className:"px-4 py-3 space-y-1",children:[S&&/* @__PURE__ */i("div",{className:"text-xs text-gray-400 text-center py-4",children:"Loading rates..."}),m.map(([e,t],r)=>{const a=b[e]?.[t];/* @__PURE__ */
|
|
4
4
|
return c("button",{onClick:()=>{const e=m.map((e,t)=>t===r?[e[1],e[0]]:e);d(e),localStorage.setItem(u,JSON.stringify(e))},className:"flex items-center justify-between px-2 py-2 border-b border-gray-200 last:border-0 w-full hover:bg-gray-100 rounded transition-colors cursor-pointer",children:[
|
|
@@ -9,13 +9,13 @@ return c("button",{onClick:()=>{const e=m.map((e,t)=>t===r?[e[1],e[0]]:e);d(e),l
|
|
|
9
9
|
/* @__PURE__ */i("span",{className:"text-base",children:y[t]||""}),
|
|
10
10
|
/* @__PURE__ */i("span",{className:"text-sm font-semibold text-gray-700",children:t})]}),
|
|
11
11
|
/* @__PURE__ */i("div",{className:"text-base font-mono font-semibold text-gray-900 tabular-nums",children:null!=a?a.toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:4}):"—"})]},`${e}-${t}-${r}`)})]})}),
|
|
12
|
-
/* @__PURE__ */i(t,{open:k,onClose:()=>C(!1),title:"Currency Settings",appearance:
|
|
12
|
+
/* @__PURE__ */i(t,{open:k,onClose:()=>C(!1),title:"Currency Settings",appearance:U,onAppearanceChange:O,onSave:()=>{if(0===j.length)return;const e=j.slice(0,4);d(e),N(U),localStorage.setItem(u,JSON.stringify(e)),localStorage.setItem(p,JSON.stringify(U)),C(!1)},children:/* @__PURE__ */c("div",{children:[
|
|
13
13
|
/* @__PURE__ */c("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:["Currency Pairs ",
|
|
14
14
|
/* @__PURE__ */c("span",{className:"text-[11px] font-normal text-gray-400",children:["(",j.length,"/",4,")"]})]}),
|
|
15
15
|
/* @__PURE__ */i("div",{className:"space-y-1 mb-2",children:j.map(([e,t],r)=>/* @__PURE__ */c("div",{className:"flex items-center justify-between py-1 px-2 bg-gray-50 rounded",children:[
|
|
16
16
|
/* @__PURE__ */c("span",{className:"text-sm",children:[y[e]||""," ",e," → ",y[t]||""," ",t]}),
|
|
17
|
-
/* @__PURE__ */i("button",{onClick:()=>
|
|
18
|
-
/* @__PURE__ */i("select",{value:
|
|
17
|
+
/* @__PURE__ */i("button",{onClick:()=>J(e=>e.filter((e,t)=>t!==r)),className:"text-red-400 hover:text-red-600",children:"×"})]},r))}),j.length<4?/* @__PURE__ */c("div",{className:"flex items-center gap-2",children:[
|
|
18
|
+
/* @__PURE__ */i("select",{value:A,onChange:e=>H(e.target.value),className:"bg-gray-50 border border-gray-200 rounded px-2 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-blue-500",children:l.map(e=>/* @__PURE__ */i("option",{children:e},e))}),
|
|
19
19
|
/* @__PURE__ */i("span",{className:"text-gray-400",children:"→"}),
|
|
20
|
-
/* @__PURE__ */i("select",{value:
|
|
21
|
-
/* @__PURE__ */i("button",{onClick:()=>{
|
|
20
|
+
/* @__PURE__ */i("select",{value:I,onChange:e=>Y(e.target.value),className:"bg-gray-50 border border-gray-200 rounded px-2 py-1 text-sm focus:outline-none focus:ring-1 focus:ring-blue-500",children:l.map(e=>/* @__PURE__ */i("option",{children:e},e))}),
|
|
21
|
+
/* @__PURE__ */i("button",{onClick:()=>{A!==I&&j.length<4&&J(e=>[...e,[A,I]])},className:"text-sm font-medium text-blue-600 hover:text-blue-800 px-2",children:"+ Add"})]}):/* @__PURE__ */c("p",{className:"text-[11px] text-gray-400 italic",children:["Max ",4," pairs — remove one to add another."]})]})})]})}export{f as default};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import{escapeHtml as e}from"./chunk-BR22X7E5.js";import{AboutApp as t}from"./chunk-
|
|
1
|
+
import{escapeHtml as e}from"./chunk-BR22X7E5.js";import{AboutApp as t}from"./chunk-XHWT4DH2.js";import{WindowTitle as n}from"./chunk-X5LH3UOJ.js";import"./chunk-DSSLOQDW.js";import"./chunk-6TDPY7WG.js";import"./chunk-XJX3NA37.js";import{toast_default as r}from"./chunk-OZMDKNVR.js";import"./chunk-CQN5CFKA.js";import"./chunk-5A7MWTXX.js";import"./chunk-EXXHI5DO.js";import{PopupMenu as o,PopupMenuLabel as l,PopupMenuItem as a,PopupMenuDivider as i}from"./chunk-PGVUO7GB.js";import"./chunk-HZZNJHRH.js";import"./chunk-D65T4H6J.js";import"./chunk-FIGVDYJR.js";import"./chunk-AFYQTVZO.js";import"./chunk-X4FJ54PP.js";import"./chunk-S5QF4VFG.js";import"./chunk-YKZHOXI4.js";import{useState as s,useRef as c}from"react";import{jsxs as d,jsx as h}from"react/jsx-runtime";var m=/* @__PURE__ */new Set(["txt","md","markdown","csv","tsv","log","json","xml","html","htm","css","js","jsx","ts","tsx","py","rb","go","rs","java","c","h","cpp","hpp","sh","bash","yml","yaml","toml","ini","conf","env","sql"]),u=/* @__PURE__ */new Set(["docx"]),p={filename:"Untitled",kind:"docx",content:"",ext:"docx"};function g(){const[g,x]=s(p),[f,y]=s(!1),[v,b]=s(!1),[k,w]=s(!1),[N,C]=s(null),D=c(null),j=c(null),L=c(null),M=(e,t)=>{L.current?.focus(),document.execCommand(e,!1,t),w(!0)},U=e=>{for(const t of e){if(!t.type.startsWith("image/"))continue;const e=new FileReader;e.onload=()=>{L.current?.focus(),document.execCommand("insertImage",!1,String(e.result)),w(!0)},e.readAsDataURL(t)}},R=e=>{N&&(N.el.removeAttribute("width"),N.el.removeAttribute("height"),N.el.style.width=e??"",N.el.style.height=e?"auto":"",w(!0),C(null))},O=async t=>{const n=(t.name.split(".").pop()||"").toLowerCase();y(!0);try{if(m.has(n)||!u.has(n)&&t.type.startsWith("text/")){const r=await t.text(),o=e(r).replace(/\n/g,"<br>");x({filename:t.name,kind:"text",content:o,ext:n}),w(!1)}else if(u.has(n))try{const e=await(import(
|
|
2
2
|
/* @vite-ignore */
|
|
3
|
-
"mammoth")),r=await t.arrayBuffer(),o=await e.convertToHtml({arrayBuffer:r});x({filename:t.name,kind:"docx",content:o.value||"<p><em>(empty document)</em></p>",ext:n}),w(!1)}catch(e){r.error('Install the optional "mammoth" peer dep to read .docx files.')}else"doc"===n?r.error(".doc is the legacy Word binary format — convert to .docx first."):r.error(`Unsupported file type: .${n||"unknown"}`)}finally{y(!1)}},
|
|
3
|
+
"mammoth")),r=await t.arrayBuffer(),o=await e.convertToHtml({arrayBuffer:r});x({filename:t.name,kind:"docx",content:o.value||"<p><em>(empty document)</em></p>",ext:n}),w(!1)}catch(e){r.error('Install the optional "mammoth" peer dep to read .docx files.')}else"doc"===n?r.error(".doc is the legacy Word binary format — convert to .docx first."):r.error(`Unsupported file type: .${n||"unknown"}`)}finally{y(!1)}},A=g?.filename?(W=g.filename).length>24?`${W.slice(0,23)}…`:W:"Untitled";var W;/* @__PURE__ */
|
|
4
4
|
return d("div",{className:"relative flex flex-col h-full",onDragOver:e=>{e.preventDefault(),v||b(!0)},onDragLeave:e=>{e.currentTarget===e.target&&b(!1)},onDrop:e=>{e.preventDefault(),b(!1);const t=Array.from(e.dataTransfer.files??[]);0!==t.length&&(t.every(e=>e.type.startsWith("image/"))?U(t):O(t[0]))},children:[
|
|
5
|
-
/* @__PURE__ */h(n,{title:`${
|
|
5
|
+
/* @__PURE__ */h(n,{title:`${A}${k?" •":""} - Documents`}),
|
|
6
6
|
/* @__PURE__ */h(t,{app:"documents"}),
|
|
7
7
|
/* @__PURE__ */d("div",{className:"flex items-center flex-wrap gap-x-2 gap-y-1 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0",children:[
|
|
8
|
-
/* @__PURE__ */h("input",{ref:
|
|
9
|
-
/* @__PURE__ */d("button",{onClick:()=>
|
|
8
|
+
/* @__PURE__ */h("input",{ref:D,type:"file",accept:".txt,.md,.csv,.tsv,.log,.json,.xml,.html,.htm,.css,.js,.jsx,.ts,.tsx,.py,.rb,.go,.rs,.java,.c,.h,.cpp,.hpp,.sh,.bash,.yml,.yaml,.toml,.ini,.conf,.env,.sql,.docx,text/*",onChange:e=>{const t=e.target.files?.[0];t&&O(t),D.current&&(D.current.value="")},className:"hidden"}),
|
|
9
|
+
/* @__PURE__ */d("button",{onClick:()=>D.current?.click(),className:"text-xs text-gray-700 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors flex items-center gap-1",children:[
|
|
10
10
|
/* @__PURE__ */h("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */h("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3.75 9.776c.112-.017.227-.026.344-.026h15.812c.117 0 .232.009.344.026m-16.5 0a2.25 2.25 0 00-1.883 2.542l.857 6a2.25 2.25 0 002.227 1.932H19.05a2.25 2.25 0 002.227-1.932l.857-6a2.25 2.25 0 00-1.883-2.542m-16.5 0V6A2.25 2.25 0 016 3.75h3.879a1.5 1.5 0 011.06.44l2.122 2.12a1.5 1.5 0 001.06.44H18A2.25 2.25 0 0120.25 9v.776"})}),"Open"]}),
|
|
11
11
|
/* @__PURE__ */h("button",{onClick:()=>{if(!g)return;const t=L.current?.innerHTML??"";if("text"===g.kind){if(/<(b|strong|i|em|u|font|span style|ul|ol|img)|style="[^"]*text-align/i.test(t)){const n=new Blob([`<!doctype html><meta charset="utf-8"><title>${e(g.filename)}</title><body style="font-family:ui-monospace,monospace;white-space:pre-wrap">${t}`],{type:"text/html"}),r=URL.createObjectURL(n),o=document.createElement("a");o.href=r,o.download=`${g.filename.replace(/\.[^.]+$/,"")}.html`,o.click(),URL.revokeObjectURL(r)}else{const e=L.current?.innerText??"",t=new Blob([e],{type:"text/plain"}),n=URL.createObjectURL(t),r=document.createElement("a");r.href=n,r.download=g.filename,r.click(),URL.revokeObjectURL(n)}}else{const n=new Blob([`<!doctype html><meta charset="utf-8"><title>${e(g.filename)}</title>${t}`],{type:"text/html"}),r=URL.createObjectURL(n),o=document.createElement("a");o.href=r,o.download=`${g.filename.replace(/\.docx$/i,"")}.html`,o.click(),URL.revokeObjectURL(r)}},className:"text-xs text-gray-700 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors",children:"Save"}),
|
|
12
12
|
/* @__PURE__ */h("span",{className:"text-[10px] text-gray-400 ml-1",children:"TXT · DOCX · Code"}),
|
|
@@ -38,8 +38,8 @@ return d("div",{className:"relative flex flex-col h-full",onDragOver:e=>{e.preve
|
|
|
38
38
|
/* @__PURE__ */h("button",{onMouseDown:e=>e.preventDefault(),onClick:()=>M("justifyRight"),className:"px-2 py-1 rounded text-gray-700 hover:bg-gray-200 transition-colors",title:"Align right",children:/* @__PURE__ */h("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:/* @__PURE__ */h("path",{strokeLinecap:"round",d:"M3.75 6h16.5M10.5 12h9.75M6 18h14.25"})})}),
|
|
39
39
|
/* @__PURE__ */h("button",{onMouseDown:e=>e.preventDefault(),onClick:()=>M("justifyFull"),className:"px-2 py-1 rounded text-gray-700 hover:bg-gray-200 transition-colors",title:"Justify",children:/* @__PURE__ */h("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:/* @__PURE__ */h("path",{strokeLinecap:"round",d:"M3.75 6h16.5M3.75 12h16.5M3.75 18h16.5"})})})]}),
|
|
40
40
|
/* @__PURE__ */h("div",{className:"h-4 w-px bg-gray-300 mx-1"}),
|
|
41
|
-
/* @__PURE__ */h("input",{ref:
|
|
42
|
-
/* @__PURE__ */d("button",{onClick:()=>
|
|
41
|
+
/* @__PURE__ */h("input",{ref:j,type:"file",accept:"image/*",multiple:!0,className:"hidden",onChange:e=>{e.target.files?.length&&U(Array.from(e.target.files)),j.current&&(j.current.value="")}}),
|
|
42
|
+
/* @__PURE__ */d("button",{onClick:()=>j.current?.click(),className:"px-2 py-1 text-xs rounded text-gray-700 hover:bg-gray-200 transition-colors flex items-center gap-1",title:"Insert image (or paste / drop one)",children:[
|
|
43
43
|
/* @__PURE__ */h("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */h("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M2.25 15.75l5.159-5.159a2.25 2.25 0 013.182 0l5.159 5.159m-1.5-1.5l1.409-1.409a2.25 2.25 0 013.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 001.5-1.5V6a1.5 1.5 0 00-1.5-1.5H3.75A1.5 1.5 0 002.25 6v12a1.5 1.5 0 001.5 1.5zm10.5-11.25h.008v.008h-.008V8.25zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z"})}),"Image"]})]}),
|
|
44
44
|
/* @__PURE__ */h("div",{className:"flex-1 min-h-0 overflow-hidden",children:/* @__PURE__ */h("div",f?{className:"flex items-center justify-center h-full text-sm text-gray-400",children:"Loading…"}:{className:"h-full overflow-auto "+("docx"===g.kind?"bg-gray-100 px-6 py-8":"bg-white"),children:/* @__PURE__ */h("div",{ref:L,contentEditable:!0,suppressContentEditableWarning:!0,spellCheck:!1,onInput:()=>w(!0),onPaste:e=>{const t=Array.from(e.clipboardData?.items??[]).filter(e=>"file"===e.kind&&e.type.startsWith("image/")).map(e=>e.getAsFile()).filter(e=>!!e);t.length&&(e.preventDefault(),U(t))},onClick:e=>{const t=e.target;"IMG"===t.tagName&&(e.preventDefault(),C({x:e.clientX,y:e.clientY,el:t}))},dangerouslySetInnerHTML:{__html:g.content},className:"docx"===g.kind?"docs-editor mx-auto w-[8.5in] min-h-[11in] bg-white p-[1in] shadow text-[14px] leading-relaxed text-gray-800 outline-none focus:ring-2 focus:ring-blue-400/40":"docs-editor block w-full min-h-full p-4 font-mono text-[13px] leading-relaxed text-gray-800 bg-white outline-none whitespace-pre-wrap"})})}),v&&/* @__PURE__ */h("div",{className:"absolute inset-0 bg-blue-500/15 border-4 border-dashed border-blue-500 pointer-events-none flex items-center justify-center z-20",children:/* @__PURE__ */h("div",{className:"px-4 py-2 rounded-md bg-blue-600 text-white text-sm font-medium shadow-lg",children:"Drop a document to open · images insert into the page"})}),N&&/* @__PURE__ */d(o,{minWidth:150,style:{left:N.x,top:N.y},onClose:()=>C(null),children:[
|
|
45
45
|
/* @__PURE__ */h(l,{children:"Image width"}),
|