efficient-shell 4.137.0 → 4.137.1

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 (166) hide show
  1. package/LICENSE +6 -17
  2. package/README.md +3 -1
  3. package/dist/Browser-ZX5OTOKK.js +43 -0
  4. package/dist/Calculator-4SQGOQFQ.js +29 -0
  5. package/dist/ConfirmDialog-NPKW2XHM.js +1 -0
  6. package/dist/CurrencyConverter-2KOM7L6V.js +21 -0
  7. package/dist/Documents-IZTIQYPG.js +52 -0
  8. package/dist/Files-B63KKXGZ.js +89 -0
  9. package/dist/Notepad-WA77V45J.js +25 -0
  10. package/dist/PdfViewer-RBRGEKWF.js +1 -0
  11. package/dist/PomodoroTimer-SDUBKXUS.js +99 -0
  12. package/dist/Preview-D4KOA4OI.js +187 -0
  13. package/dist/Sidebar-Y57LYXXI.js +23 -0
  14. package/dist/Spreadsheet-JX5E6WH6.js +37 -0
  15. package/dist/Stock-XAQ5WMUZ.js +16 -0
  16. package/dist/Weather-HLAGJ5LV.js +60 -0
  17. package/dist/WorldClock-IRI4VCTA.js +32 -0
  18. package/dist/apps/index.js +1 -151
  19. package/dist/chunk-3A46NCXK.js +29 -0
  20. package/dist/chunk-44UO7FYU.js +11 -0
  21. package/dist/chunk-466CM2TJ.js +1 -0
  22. package/dist/chunk-57MIENLJ.js +1 -0
  23. package/dist/chunk-5CRAF2AD.js +2 -0
  24. package/dist/chunk-A2OQLLYK.js +6 -0
  25. package/dist/chunk-B43AGQET.js +4 -0
  26. package/dist/chunk-BR22X7E5.js +1 -0
  27. package/dist/chunk-BUTSU7FO.js +1 -0
  28. package/dist/chunk-D65T4H6J.js +1 -0
  29. package/dist/chunk-ESL5TDNA.js +1 -0
  30. package/dist/chunk-FBDZGO3V.js +1 -0
  31. package/dist/chunk-FHTLC7HH.js +1 -0
  32. package/dist/chunk-FQLMX3IE.js +948 -0
  33. package/dist/chunk-H562R4GX.js +34 -0
  34. package/dist/chunk-JN4WXTWJ.js +106 -0
  35. package/dist/chunk-LVDRBRYU.js +1 -0
  36. package/dist/chunk-LWLCNQY7.js +1 -0
  37. package/dist/chunk-MAIHBBWT.js +1 -0
  38. package/dist/chunk-NPJH5MD7.js +13 -0
  39. package/dist/chunk-OCSOMMY2.js +1 -0
  40. package/dist/chunk-OQDWLHZI.js +1 -0
  41. package/dist/chunk-OWSAMA3I.js +23 -0
  42. package/dist/chunk-PH3PRIFP.js +5 -0
  43. package/dist/chunk-TAWKWSPN.js +9 -0
  44. package/dist/chunk-U4GTZPXP.js +1 -0
  45. package/dist/chunk-UB4JIOLD.js +2 -0
  46. package/dist/chunk-UZAJ5BF6.js +9 -0
  47. package/dist/chunk-VEGMDXT4.js +1 -0
  48. package/dist/chunk-VTVSMRFX.js +1 -0
  49. package/dist/chunk-VVAGSKW7.js +1 -0
  50. package/dist/chunk-XO43FJRM.js +19 -0
  51. package/dist/chunk-Y7BOLDRM.js +69 -0
  52. package/dist/file-intake/index.js +1 -4
  53. package/dist/index.js +639 -7473
  54. package/dist/map/index.js +20 -540
  55. package/dist/markdown/index.js +6 -184
  56. package/dist/markup/index.js +1 -135
  57. package/dist/page-tabs/index.js +21 -709
  58. package/dist/sounds-OMHXVVQ4.js +1 -0
  59. package/dist/ui/index.js +1 -19
  60. package/package.json +4 -3
  61. package/dist/Browser-ZNX4WFUH.js +0 -482
  62. package/dist/Browser-ZNX4WFUH.js.map +0 -1
  63. package/dist/Calculator-6FGNKOXU.js +0 -192
  64. package/dist/Calculator-6FGNKOXU.js.map +0 -1
  65. package/dist/ConfirmDialog-NPQMIGUR.js +0 -4
  66. package/dist/ConfirmDialog-NPQMIGUR.js.map +0 -1
  67. package/dist/CurrencyConverter-FF7EXRYL.js +0 -236
  68. package/dist/CurrencyConverter-FF7EXRYL.js.map +0 -1
  69. package/dist/Documents-H3R7XSBH.js +0 -441
  70. package/dist/Documents-H3R7XSBH.js.map +0 -1
  71. package/dist/Files-ZHJIAUC2.js +0 -805
  72. package/dist/Files-ZHJIAUC2.js.map +0 -1
  73. package/dist/Notepad-VE7ISWRQ.js +0 -410
  74. package/dist/Notepad-VE7ISWRQ.js.map +0 -1
  75. package/dist/PdfViewer-SQBFYAGW.js +0 -5
  76. package/dist/PdfViewer-SQBFYAGW.js.map +0 -1
  77. package/dist/PomodoroTimer-IR3WREED.js +0 -633
  78. package/dist/PomodoroTimer-IR3WREED.js.map +0 -1
  79. package/dist/Preview-DAQGRNRM.js +0 -2959
  80. package/dist/Preview-DAQGRNRM.js.map +0 -1
  81. package/dist/Sidebar-YW6H4NDJ.js +0 -291
  82. package/dist/Sidebar-YW6H4NDJ.js.map +0 -1
  83. package/dist/Spreadsheet-HOCPHJOC.js +0 -519
  84. package/dist/Spreadsheet-HOCPHJOC.js.map +0 -1
  85. package/dist/Stock-LVRQPURG.js +0 -158
  86. package/dist/Stock-LVRQPURG.js.map +0 -1
  87. package/dist/Weather-LZQGVDJL.js +0 -431
  88. package/dist/Weather-LZQGVDJL.js.map +0 -1
  89. package/dist/WorldClock-XPD7WOZT.js +0 -202
  90. package/dist/WorldClock-XPD7WOZT.js.map +0 -1
  91. package/dist/apps/index.js.map +0 -1
  92. package/dist/chunk-5O42JXQE.js +0 -26
  93. package/dist/chunk-5O42JXQE.js.map +0 -1
  94. package/dist/chunk-5RPTS3BT.js +0 -70
  95. package/dist/chunk-5RPTS3BT.js.map +0 -1
  96. package/dist/chunk-6XJEJWNJ.js +0 -61
  97. package/dist/chunk-6XJEJWNJ.js.map +0 -1
  98. package/dist/chunk-7CCHEEYC.js +0 -94
  99. package/dist/chunk-7CCHEEYC.js.map +0 -1
  100. package/dist/chunk-BE7FZOFU.js +0 -17
  101. package/dist/chunk-BE7FZOFU.js.map +0 -1
  102. package/dist/chunk-COWYSHG2.js +0 -79
  103. package/dist/chunk-COWYSHG2.js.map +0 -1
  104. package/dist/chunk-D7PYW2QS.js +0 -265
  105. package/dist/chunk-D7PYW2QS.js.map +0 -1
  106. package/dist/chunk-DVZWYWSD.js +0 -26
  107. package/dist/chunk-DVZWYWSD.js.map +0 -1
  108. package/dist/chunk-E7TB6WD2.js +0 -153
  109. package/dist/chunk-E7TB6WD2.js.map +0 -1
  110. package/dist/chunk-FIHOGVUP.js +0 -416
  111. package/dist/chunk-FIHOGVUP.js.map +0 -1
  112. package/dist/chunk-GA35NEND.js +0 -56
  113. package/dist/chunk-GA35NEND.js.map +0 -1
  114. package/dist/chunk-HUBJAUGG.js +0 -316
  115. package/dist/chunk-HUBJAUGG.js.map +0 -1
  116. package/dist/chunk-I2TAAJHS.js +0 -465
  117. package/dist/chunk-I2TAAJHS.js.map +0 -1
  118. package/dist/chunk-ICTRCKUE.js +0 -3710
  119. package/dist/chunk-ICTRCKUE.js.map +0 -1
  120. package/dist/chunk-IPXN646P.js +0 -14
  121. package/dist/chunk-IPXN646P.js.map +0 -1
  122. package/dist/chunk-IRWSRJ4K.js +0 -48
  123. package/dist/chunk-IRWSRJ4K.js.map +0 -1
  124. package/dist/chunk-JOPU6WPY.js +0 -504
  125. package/dist/chunk-JOPU6WPY.js.map +0 -1
  126. package/dist/chunk-MGGY74RY.js +0 -14
  127. package/dist/chunk-MGGY74RY.js.map +0 -1
  128. package/dist/chunk-PVPPAWVM.js +0 -46
  129. package/dist/chunk-PVPPAWVM.js.map +0 -1
  130. package/dist/chunk-R7QGMK6N.js +0 -102
  131. package/dist/chunk-R7QGMK6N.js.map +0 -1
  132. package/dist/chunk-RT6DSB5Y.js +0 -143
  133. package/dist/chunk-RT6DSB5Y.js.map +0 -1
  134. package/dist/chunk-TRCWINHF.js +0 -105
  135. package/dist/chunk-TRCWINHF.js.map +0 -1
  136. package/dist/chunk-TW7LPMVR.js +0 -16
  137. package/dist/chunk-TW7LPMVR.js.map +0 -1
  138. package/dist/chunk-UTYKLGGT.js +0 -195
  139. package/dist/chunk-UTYKLGGT.js.map +0 -1
  140. package/dist/chunk-VNJJCH5A.js +0 -822
  141. package/dist/chunk-VNJJCH5A.js.map +0 -1
  142. package/dist/chunk-XJHZWSKV.js +0 -1103
  143. package/dist/chunk-XJHZWSKV.js.map +0 -1
  144. package/dist/chunk-Y3GYJ7YR.js +0 -549
  145. package/dist/chunk-Y3GYJ7YR.js.map +0 -1
  146. package/dist/chunk-YA4EE7ST.js +0 -14107
  147. package/dist/chunk-YA4EE7ST.js.map +0 -1
  148. package/dist/chunk-YDHXWCCJ.js +0 -145
  149. package/dist/chunk-YDHXWCCJ.js.map +0 -1
  150. package/dist/chunk-YE6GUDGP.js +0 -548
  151. package/dist/chunk-YE6GUDGP.js.map +0 -1
  152. package/dist/chunk-YNKK7NE3.js +0 -171
  153. package/dist/chunk-YNKK7NE3.js.map +0 -1
  154. package/dist/chunk-YPO6RDMX.js +0 -20
  155. package/dist/chunk-YPO6RDMX.js.map +0 -1
  156. package/dist/chunk-ZS7PMGUW.js +0 -7
  157. package/dist/chunk-ZS7PMGUW.js.map +0 -1
  158. package/dist/file-intake/index.js.map +0 -1
  159. package/dist/index.js.map +0 -1
  160. package/dist/map/index.js.map +0 -1
  161. package/dist/markdown/index.js.map +0 -1
  162. package/dist/markup/index.js.map +0 -1
  163. package/dist/page-tabs/index.js.map +0 -1
  164. package/dist/sounds-NT4DEZGD.js +0 -3
  165. package/dist/sounds-NT4DEZGD.js.map +0 -1
  166. package/dist/ui/index.js.map +0 -1
@@ -1,153 +0,0 @@
1
- import { Modal } from './chunk-ICTRCKUE.js';
2
- import { keepsNativeMenu } from './chunk-JOPU6WPY.js';
3
- import { jsx, jsxs } from 'react/jsx-runtime';
4
-
5
- var DEFAULT_APPEARANCE = { activeOpacity: 70, inactiveOpacity: 50, activeBlur: 0, inactiveBlur: 0 };
6
- function loadAppearance(key) {
7
- try {
8
- const saved = JSON.parse(localStorage.getItem(key) || "");
9
- if (saved.blur != null && saved.activeBlur == null) {
10
- saved.activeBlur = saved.blur;
11
- saved.inactiveBlur = saved.blur;
12
- delete saved.blur;
13
- }
14
- return { ...DEFAULT_APPEARANCE, ...saved };
15
- } catch {
16
- return DEFAULT_APPEARANCE;
17
- }
18
- }
19
- function WidgetSettingsModal({ open, onClose, title, appearance, onAppearanceChange, onSave, children }) {
20
- if (!open) return null;
21
- const inp = "w-full h-1.5 rounded-full appearance-none bg-gray-200 cursor-pointer accent-blue-500";
22
- const lbl = "flex items-center justify-between text-xs text-gray-500";
23
- return /* @__PURE__ */ jsx(
24
- "div",
25
- {
26
- onPointerDown: (e) => e.stopPropagation(),
27
- onContextMenu: (e) => {
28
- e.stopPropagation();
29
- if (!keepsNativeMenu(e.target)) e.preventDefault();
30
- },
31
- children: /* @__PURE__ */ jsx(Modal, { open, onClose, title, size: "sm", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
32
- children,
33
- /* @__PURE__ */ jsxs("div", { children: [
34
- /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-gray-700 mb-3", children: "Appearance" }),
35
- /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
36
- /* @__PURE__ */ jsxs("div", { children: [
37
- /* @__PURE__ */ jsx("div", { className: "text-xs font-medium text-gray-600 mb-2", children: "Active" }),
38
- /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
39
- /* @__PURE__ */ jsxs("div", { children: [
40
- /* @__PURE__ */ jsxs("div", { className: lbl, children: [
41
- /* @__PURE__ */ jsx("span", { children: "Opacity" }),
42
- /* @__PURE__ */ jsxs("span", { children: [
43
- appearance.activeOpacity,
44
- "%"
45
- ] })
46
- ] }),
47
- /* @__PURE__ */ jsx(
48
- "input",
49
- {
50
- type: "range",
51
- min: 20,
52
- max: 100,
53
- value: appearance.activeOpacity,
54
- onChange: (e) => onAppearanceChange({ ...appearance, activeOpacity: +e.target.value }),
55
- className: inp
56
- }
57
- )
58
- ] }),
59
- /* @__PURE__ */ jsxs("div", { children: [
60
- /* @__PURE__ */ jsxs("div", { className: lbl, children: [
61
- /* @__PURE__ */ jsx("span", { children: "Blur" }),
62
- /* @__PURE__ */ jsxs("span", { children: [
63
- appearance.activeBlur,
64
- "px"
65
- ] })
66
- ] }),
67
- /* @__PURE__ */ jsx(
68
- "input",
69
- {
70
- type: "range",
71
- min: 0,
72
- max: 20,
73
- value: appearance.activeBlur,
74
- onChange: (e) => onAppearanceChange({ ...appearance, activeBlur: +e.target.value }),
75
- className: inp
76
- }
77
- )
78
- ] })
79
- ] })
80
- ] }),
81
- /* @__PURE__ */ jsxs("div", { children: [
82
- /* @__PURE__ */ jsx("div", { className: "text-xs font-medium text-gray-600 mb-2", children: "Inactive" }),
83
- /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
84
- /* @__PURE__ */ jsxs("div", { children: [
85
- /* @__PURE__ */ jsxs("div", { className: lbl, children: [
86
- /* @__PURE__ */ jsx("span", { children: "Opacity" }),
87
- /* @__PURE__ */ jsxs("span", { children: [
88
- appearance.inactiveOpacity,
89
- "%"
90
- ] })
91
- ] }),
92
- /* @__PURE__ */ jsx(
93
- "input",
94
- {
95
- type: "range",
96
- min: 20,
97
- max: 100,
98
- value: appearance.inactiveOpacity,
99
- onChange: (e) => onAppearanceChange({ ...appearance, inactiveOpacity: +e.target.value }),
100
- className: inp
101
- }
102
- )
103
- ] }),
104
- /* @__PURE__ */ jsxs("div", { children: [
105
- /* @__PURE__ */ jsxs("div", { className: lbl, children: [
106
- /* @__PURE__ */ jsx("span", { children: "Blur" }),
107
- /* @__PURE__ */ jsxs("span", { children: [
108
- appearance.inactiveBlur,
109
- "px"
110
- ] })
111
- ] }),
112
- /* @__PURE__ */ jsx(
113
- "input",
114
- {
115
- type: "range",
116
- min: 0,
117
- max: 20,
118
- value: appearance.inactiveBlur,
119
- onChange: (e) => onAppearanceChange({ ...appearance, inactiveBlur: +e.target.value }),
120
- className: inp
121
- }
122
- )
123
- ] })
124
- ] })
125
- ] })
126
- ] })
127
- ] }),
128
- /* @__PURE__ */ jsxs("div", { className: "flex gap-2 pt-2", children: [
129
- /* @__PURE__ */ jsx(
130
- "button",
131
- {
132
- onClick: onSave,
133
- className: "flex-1 text-sm font-medium py-2 rounded-lg bg-blue-600 text-white hover:bg-blue-700 transition",
134
- children: "Save"
135
- }
136
- ),
137
- /* @__PURE__ */ jsx(
138
- "button",
139
- {
140
- onClick: onClose,
141
- className: "flex-1 text-sm font-medium py-2 rounded-lg border border-gray-300 text-gray-600 hover:bg-gray-50 transition",
142
- children: "Cancel"
143
- }
144
- )
145
- ] })
146
- ] }) })
147
- }
148
- );
149
- }
150
-
151
- export { WidgetSettingsModal, loadAppearance };
152
- //# sourceMappingURL=chunk-E7TB6WD2.js.map
153
- //# sourceMappingURL=chunk-E7TB6WD2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/shell/WidgetSettingsModal.tsx"],"names":[],"mappings":"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","file":"chunk-E7TB6WD2.js","sourcesContent":["import Modal from './Modal';\nimport { keepsNativeMenu } from './contextMenuTarget';\n\nexport interface WidgetAppearance {\n activeOpacity: number;\n inactiveOpacity: number;\n activeBlur: number;\n inactiveBlur: number;\n}\n\nexport const DEFAULT_APPEARANCE: WidgetAppearance = { activeOpacity: 70, inactiveOpacity: 50, activeBlur: 0, inactiveBlur: 0 };\n\nexport function loadAppearance(key: string): WidgetAppearance {\n try {\n const saved = JSON.parse(localStorage.getItem(key) || '');\n // Migrate old single `blur` field to activeBlur/inactiveBlur\n if (saved.blur != null && saved.activeBlur == null) {\n saved.activeBlur = saved.blur;\n saved.inactiveBlur = saved.blur;\n delete saved.blur;\n }\n return { ...DEFAULT_APPEARANCE, ...saved };\n }\n catch { return DEFAULT_APPEARANCE; }\n}\n\n/** Reusable settings modal for widgets — renders appearance sliders + optional extra content above */\nexport default function WidgetSettingsModal({ open, onClose, title, appearance, onAppearanceChange, onSave, children }: {\n open: boolean;\n onClose: () => void;\n title: string;\n appearance: WidgetAppearance;\n onAppearanceChange: (a: WidgetAppearance) => void;\n onSave: () => void;\n children?: React.ReactNode;\n}) {\n if (!open) return null;\n\n const inp = 'w-full h-1.5 rounded-full appearance-none bg-gray-200 cursor-pointer accent-blue-500';\n const lbl = 'flex items-center justify-between text-xs text-gray-500';\n\n // stopPropagation keeps a right-click inside the settings dialog from\n // reaching the widget underneath and opening the widget's own menu. It also\n // stops the event before the shell's global contextmenu listener can see it,\n // so without preventDefault the browser's native menu would show here. A\n // text field in `children` still keeps that menu, as it does everywhere else\n // in the shell — spellcheck and Paste are the browser's.\n return (\n <div\n onPointerDown={e => e.stopPropagation()}\n onContextMenu={e => {\n e.stopPropagation();\n if (!keepsNativeMenu(e.target)) e.preventDefault();\n }}\n >\n <Modal open={open} onClose={onClose} title={title} size=\"sm\">\n <div className=\"space-y-4\">\n {children}\n\n {/* Appearance */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-3\">Appearance</h3>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">Active</div>\n <div className=\"space-y-2\">\n <div>\n <div className={lbl}><span>Opacity</span><span>{appearance.activeOpacity}%</span></div>\n <input type=\"range\" min={20} max={100} value={appearance.activeOpacity}\n onChange={e => onAppearanceChange({ ...appearance, activeOpacity: +e.target.value })} className={inp} />\n </div>\n <div>\n <div className={lbl}><span>Blur</span><span>{appearance.activeBlur}px</span></div>\n <input type=\"range\" min={0} max={20} value={appearance.activeBlur}\n onChange={e => onAppearanceChange({ ...appearance, activeBlur: +e.target.value })} className={inp} />\n </div>\n </div>\n </div>\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">Inactive</div>\n <div className=\"space-y-2\">\n <div>\n <div className={lbl}><span>Opacity</span><span>{appearance.inactiveOpacity}%</span></div>\n <input type=\"range\" min={20} max={100} value={appearance.inactiveOpacity}\n onChange={e => onAppearanceChange({ ...appearance, inactiveOpacity: +e.target.value })} className={inp} />\n </div>\n <div>\n <div className={lbl}><span>Blur</span><span>{appearance.inactiveBlur}px</span></div>\n <input type=\"range\" min={0} max={20} value={appearance.inactiveBlur}\n onChange={e => onAppearanceChange({ ...appearance, inactiveBlur: +e.target.value })} className={inp} />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex gap-2 pt-2\">\n <button onClick={onSave}\n className=\"flex-1 text-sm font-medium py-2 rounded-lg bg-blue-600 text-white hover:bg-blue-700 transition\">Save</button>\n <button onClick={onClose}\n className=\"flex-1 text-sm font-medium py-2 rounded-lg border border-gray-300 text-gray-600 hover:bg-gray-50 transition\">Cancel</button>\n </div>\n </div>\n </Modal>\n </div>\n );\n}\n"]}
@@ -1,416 +0,0 @@
1
- import { toast_default } from './chunk-UTYKLGGT.js';
2
- import { createContext, useContext, useRef, useState, useEffect } from 'react';
3
- import * as pdfjsLib from 'pdfjs-dist';
4
- import { createPortal } from 'react-dom';
5
- import { jsx, jsxs } from 'react/jsx-runtime';
6
-
7
- // src/apps/_wasmBytes.ts
8
- function hasWasmPreamble(bytes) {
9
- return bytes.length >= 4 && bytes[0] === 0 && bytes[1] === 97 && bytes[2] === 115 && bytes[3] === 109;
10
- }
11
- function describeNonWasm(bytes) {
12
- if (bytes.length === 0) return "an empty response";
13
- const head = Array.from(bytes.subarray(0, 24)).map((b) => b >= 32 && b < 127 ? String.fromCharCode(b) : ".").join("");
14
- return `${bytes.length} bytes starting "${head}"`;
15
- }
16
- function wasmBytesError(href, filename, bytes) {
17
- return new Error(
18
- `The response for ${href} is not a WebAssembly module (got ${describeNonWasm(bytes)}). The bundler did not emit "${filename}" as an asset, and the host answered with a fallback page instead of a 404. Serve pdfjs-dist/wasm/ yourself and point window.__REACT_OS_SHELL_PDF_WASM__ at it.`
19
- );
20
- }
21
- var ToolbarSlotContext = createContext(null);
22
- function PanelActions({ children }) {
23
- const slot = useContext(ToolbarSlotContext);
24
- if (slot) return createPortal(children, slot);
25
- return /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-1 border-b border-gray-200 bg-gray-50 px-3 py-2 text-xs", children });
26
- }
27
- if (typeof window !== "undefined" && !pdfjsLib.GlobalWorkerOptions.workerSrc) {
28
- pdfjsLib.GlobalWorkerOptions.workerSrc = `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/build/pdf.worker.min.mjs`;
29
- }
30
- var PDF_WASM_MODULES = {
31
- "jbig2.wasm": new URL("pdfjs-dist/wasm/jbig2.wasm", import.meta.url).href,
32
- "openjpeg.wasm": new URL("pdfjs-dist/wasm/openjpeg.wasm", import.meta.url).href
33
- };
34
- var BundledPdfWasmFactory = class {
35
- async fetch({ kind, filename }) {
36
- if (kind !== "wasmUrl") {
37
- throw new Error(`Ensure that the \`${kind}\` API parameter is provided.`);
38
- }
39
- const href = PDF_WASM_MODULES[filename];
40
- if (!href) {
41
- throw new Error(`No bundled pdf.js wasm module for "${filename}".`);
42
- }
43
- const res = await fetch(href);
44
- if (!res.ok) {
45
- throw new Error(`Unable to load wasm data at: ${href}`);
46
- }
47
- const bytes = new Uint8Array(await res.arrayBuffer());
48
- if (!hasWasmPreamble(bytes)) {
49
- throw wasmBytesError(href, filename, bytes);
50
- }
51
- return bytes;
52
- }
53
- };
54
- function pdfWasmParams() {
55
- const dir = typeof window !== "undefined" ? window.__REACT_OS_SHELL_PDF_WASM__ : void 0;
56
- if (typeof dir === "string" && dir) {
57
- return { wasmUrl: dir.endsWith("/") ? dir : `${dir}/` };
58
- }
59
- return { BinaryDataFactory: BundledPdfWasmFactory };
60
- }
61
- var ZOOM_PRESETS = [50, 75, 100, 125, 150, 200, 300, 400];
62
- var PAGE_GUTTER = 40;
63
- var MIN_SCALE = 0.3;
64
- var MAX_SCALE = 4;
65
- function fitScale(fit, container, page) {
66
- const byWidth = (container.width - PAGE_GUTTER) / page.width;
67
- const wanted = fit === "page" ? Math.min(byWidth, (container.height - PAGE_GUTTER) / page.height) : byWidth;
68
- return Math.min(Math.max(wanted, MIN_SCALE), MAX_SCALE);
69
- }
70
- var TEXT_LAYER_CSS = `
71
- .preview-pdf-textlayer {
72
- position: absolute;
73
- inset: 0;
74
- overflow: clip;
75
- line-height: 1;
76
- text-align: initial;
77
- text-size-adjust: none;
78
- forced-color-adjust: none;
79
- transform-origin: 0 0;
80
- caret-color: CanvasText;
81
- --min-font-size: 1;
82
- --text-scale-factor: calc(var(--total-scale-factor, 1) * var(--min-font-size));
83
- --min-font-size-inv: calc(1 / var(--min-font-size));
84
- }
85
- .preview-pdf-textlayer :is(span, br) {
86
- color: transparent;
87
- position: absolute;
88
- white-space: pre;
89
- cursor: text;
90
- transform-origin: 0% 0%;
91
- }
92
- .preview-pdf-textlayer > :not(.markedContent),
93
- .preview-pdf-textlayer .markedContent span:not(.markedContent) {
94
- z-index: 1;
95
- --font-height: 0;
96
- font-size: calc(var(--text-scale-factor) * var(--font-height));
97
- --scale-x: 1;
98
- --rotate: 0deg;
99
- transform: rotate(var(--rotate)) scaleX(var(--scale-x)) scale(var(--min-font-size-inv));
100
- }
101
- .preview-pdf-textlayer .markedContent {
102
- display: contents;
103
- }
104
- .preview-pdf-textlayer span[role="img"] {
105
- user-select: none;
106
- cursor: default;
107
- }
108
- .preview-pdf-textlayer ::selection {
109
- background: rgba(0, 80, 255, 0.25);
110
- }
111
- .preview-pdf-textlayer br::selection {
112
- background: transparent;
113
- }
114
- .preview-pdf-textlayer .endOfContent {
115
- display: block;
116
- position: absolute;
117
- inset: 100% 0 0;
118
- z-index: 0;
119
- cursor: default;
120
- user-select: none;
121
- }
122
- .preview-pdf-textlayer.selecting .endOfContent {
123
- top: 0;
124
- }
125
- `;
126
- function PdfViewer({ url, filename, fit = "width", onDownload, onEmail }) {
127
- const canvasRef = useRef(null);
128
- const textLayerRef = useRef(null);
129
- const containerRef = useRef(null);
130
- const [pdf, setPdf] = useState(null);
131
- const [page, setPage] = useState(1);
132
- const [totalPages, setTotalPages] = useState(0);
133
- const [scale, setScale] = useState(1);
134
- const [fitMode, setFitMode] = useState(true);
135
- const [loading, setLoading] = useState(true);
136
- useEffect(() => {
137
- let cancelled = false;
138
- setLoading(true);
139
- setPage(1);
140
- pdfjsLib.getDocument({ url, ...pdfWasmParams() }).promise.then((doc) => {
141
- if (cancelled) return;
142
- setPdf(doc);
143
- setTotalPages(doc.numPages);
144
- setLoading(false);
145
- }).catch(() => {
146
- if (!cancelled) {
147
- toast_default.error("Failed to load PDF");
148
- setLoading(false);
149
- }
150
- });
151
- return () => {
152
- cancelled = true;
153
- };
154
- }, [url]);
155
- useEffect(() => {
156
- if (!pdf || !fitMode || !containerRef.current) return;
157
- const recompute = () => {
158
- const el = containerRef.current;
159
- if (!el) return;
160
- pdf.getPage(page).then((p) => {
161
- if (!containerRef.current) return;
162
- const viewport = p.getViewport({ scale: 1 });
163
- const next = fitScale(
164
- fit,
165
- { width: el.clientWidth, height: el.clientHeight },
166
- { width: viewport.width, height: viewport.height }
167
- );
168
- setScale((prev) => Math.abs(prev - next) < 5e-3 ? prev : next);
169
- });
170
- };
171
- recompute();
172
- const ro = new ResizeObserver(recompute);
173
- ro.observe(containerRef.current);
174
- return () => ro.disconnect();
175
- }, [pdf, page, fitMode, fit]);
176
- useEffect(() => {
177
- if (!pdf || !canvasRef.current) return;
178
- let cancelled = false;
179
- let task = null;
180
- let textLayer = null;
181
- pdf.getPage(page).then((p) => {
182
- if (cancelled || !canvasRef.current) return;
183
- const viewport = p.getViewport({ scale });
184
- const canvas = canvasRef.current;
185
- canvas.width = viewport.width;
186
- canvas.height = viewport.height;
187
- canvas.style.width = `${viewport.width}px`;
188
- canvas.style.height = `${viewport.height}px`;
189
- const ctx = canvas.getContext("2d");
190
- task = p.render({ canvas, canvasContext: ctx, viewport });
191
- task.promise.catch(() => {
192
- });
193
- const textEl = textLayerRef.current;
194
- if (textEl) {
195
- textEl.replaceChildren();
196
- textEl.style.setProperty("--total-scale-factor", String(viewport.scale));
197
- textLayer = new pdfjsLib.TextLayer({
198
- textContentSource: p.streamTextContent(),
199
- container: textEl,
200
- viewport
201
- });
202
- textLayer.render().then(() => {
203
- if (cancelled) return;
204
- const end = document.createElement("div");
205
- end.className = "endOfContent";
206
- textEl.append(end);
207
- }).catch(() => {
208
- });
209
- }
210
- });
211
- return () => {
212
- cancelled = true;
213
- task?.cancel();
214
- textLayer?.cancel();
215
- };
216
- }, [pdf, page, scale]);
217
- useEffect(() => {
218
- const up = () => textLayerRef.current?.classList.remove("selecting");
219
- window.addEventListener("pointerup", up);
220
- return () => window.removeEventListener("pointerup", up);
221
- }, []);
222
- const handlePrint = () => {
223
- if (!pdf) return;
224
- const win = window.open("", "_blank");
225
- if (!win) {
226
- toast_default.error("Allow popups to print");
227
- return;
228
- }
229
- const promises = [];
230
- for (let i = 1; i <= totalPages; i++) {
231
- promises.push(pdf.getPage(i).then((p) => {
232
- const vp = p.getViewport({ scale: 2 });
233
- const c = document.createElement("canvas");
234
- c.width = vp.width;
235
- c.height = vp.height;
236
- return p.render({ canvas: c, canvasContext: c.getContext("2d"), viewport: vp }).promise.then(() => c.toDataURL());
237
- }));
238
- }
239
- Promise.all(promises).then((images) => {
240
- win.document.write(`<html><head><title>${filename}</title><style>@media print{body{margin:0}img{width:100%;page-break-after:always}}</style></head><body>`);
241
- win.document.write(images.map((src) => `<img src="${src}"/>`).join(""));
242
- win.document.write("</body></html>");
243
- win.document.close();
244
- setTimeout(() => {
245
- win.print();
246
- win.close();
247
- }, 300);
248
- });
249
- };
250
- const handleDefaultDownload = () => {
251
- const a = document.createElement("a");
252
- a.href = url;
253
- a.download = filename;
254
- a.click();
255
- };
256
- const reFit = () => setFitMode(true);
257
- const fitLabel = fit === "page" ? "Fit page" : "Fit width";
258
- const onWheelPage = (e) => {
259
- if (!pdf) return;
260
- if (e.ctrlKey || e.metaKey) return;
261
- const el = containerRef.current;
262
- if (!el) return;
263
- const atTop = el.scrollTop <= 0;
264
- const atBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - 1;
265
- if (e.deltaY > 0 && atBottom && page < totalPages) {
266
- e.preventDefault();
267
- setPage((p) => Math.min(totalPages, p + 1));
268
- requestAnimationFrame(() => {
269
- if (containerRef.current) containerRef.current.scrollTop = 0;
270
- });
271
- } else if (e.deltaY < 0 && atTop && page > 1) {
272
- e.preventDefault();
273
- setPage((p) => Math.max(1, p - 1));
274
- requestAnimationFrame(() => {
275
- if (containerRef.current) containerRef.current.scrollTop = containerRef.current.scrollHeight;
276
- });
277
- }
278
- };
279
- const onKeyPage = (e) => {
280
- if (!pdf) return;
281
- const tag = (document.activeElement?.tagName || "").toLowerCase();
282
- if (tag === "input" || tag === "textarea" || document.activeElement?.isContentEditable) return;
283
- if (e.key === "PageDown" || e.key === "ArrowRight") {
284
- if (page < totalPages) {
285
- e.preventDefault();
286
- setPage((p) => Math.min(totalPages, p + 1));
287
- }
288
- } else if (e.key === "PageUp" || e.key === "ArrowLeft") {
289
- if (page > 1) {
290
- e.preventDefault();
291
- setPage((p) => Math.max(1, p - 1));
292
- }
293
- } else if (e.key === "Home") {
294
- e.preventDefault();
295
- setPage(1);
296
- } else if (e.key === "End") {
297
- e.preventDefault();
298
- setPage(totalPages);
299
- }
300
- };
301
- const btn = "px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1";
302
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col h-full", children: [
303
- /* @__PURE__ */ jsxs(PanelActions, { children: [
304
- /* @__PURE__ */ jsx("button", { "aria-label": "Previous page", onClick: () => setPage((p) => Math.max(1, p - 1)), disabled: page <= 1, className: "px-1 py-1 rounded hover:bg-gray-200 disabled:opacity-30 text-gray-600", children: /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15.75 19.5L8.25 12l7.5-7.5" }) }) }),
305
- /* @__PURE__ */ jsxs("span", { className: "text-gray-600 font-medium tabular-nums", children: [
306
- page,
307
- " / ",
308
- totalPages
309
- ] }),
310
- /* @__PURE__ */ jsx("button", { "aria-label": "Next page", onClick: () => setPage((p) => Math.min(totalPages, p + 1)), disabled: page >= totalPages, className: "px-1 py-1 rounded hover:bg-gray-200 disabled:opacity-30 text-gray-600", children: /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.25 4.5l7.5 7.5-7.5 7.5" }) }) }),
311
- /* @__PURE__ */ jsx("div", { className: "h-4 w-px bg-gray-300 mx-1" }),
312
- /* @__PURE__ */ jsx(
313
- "button",
314
- {
315
- onClick: () => {
316
- setFitMode(false);
317
- setScale((s) => Math.max(0.3, Math.round((s - 0.25) * 100) / 100));
318
- },
319
- className: btn,
320
- children: "\u2212"
321
- }
322
- ),
323
- /* @__PURE__ */ jsxs(
324
- "select",
325
- {
326
- value: fitMode ? "fit" : ZOOM_PRESETS.includes(Math.round(scale * 100)) ? Math.round(scale * 100) : "custom",
327
- onChange: (e) => {
328
- const v = e.target.value;
329
- if (v === "fit") {
330
- setFitMode(true);
331
- return;
332
- }
333
- if (v !== "custom") {
334
- setFitMode(false);
335
- setScale(Number(v) / 100);
336
- }
337
- },
338
- className: "bg-transparent hover:bg-gray-200 rounded px-1 py-1 text-gray-600 tabular-nums cursor-pointer focus:outline-none focus:ring-1 focus:ring-blue-400",
339
- title: "Zoom",
340
- children: [
341
- /* @__PURE__ */ jsx("option", { value: "fit", children: fitLabel }),
342
- !fitMode && !ZOOM_PRESETS.includes(Math.round(scale * 100)) && /* @__PURE__ */ jsxs("option", { value: "custom", children: [
343
- Math.round(scale * 100),
344
- "%"
345
- ] }),
346
- ZOOM_PRESETS.map((p) => /* @__PURE__ */ jsxs("option", { value: p, children: [
347
- p,
348
- "%"
349
- ] }, p))
350
- ]
351
- }
352
- ),
353
- /* @__PURE__ */ jsx(
354
- "button",
355
- {
356
- onClick: () => {
357
- setFitMode(false);
358
- setScale((s) => Math.min(4, Math.round((s + 0.25) * 100) / 100));
359
- },
360
- className: btn,
361
- children: "+"
362
- }
363
- ),
364
- /* @__PURE__ */ jsx(
365
- "button",
366
- {
367
- onClick: reFit,
368
- className: btn + (fitMode ? " bg-gray-200 text-gray-900" : ""),
369
- title: `${fitLabel} \u2014 auto-tracks the container size until you zoom manually`,
370
- children: "Fit"
371
- }
372
- ),
373
- /* @__PURE__ */ jsx("div", { className: "h-4 w-px bg-gray-300 mx-1" }),
374
- /* @__PURE__ */ jsxs("button", { onClick: handlePrint, className: btn, children: [
375
- /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6.72 13.829c-.24.03-.48.062-.72.096m.72-.096a42.415 42.415 0 0110.56 0m-10.56 0L6.34 18m10.94-4.171c.24.03.48.062.72.096m-.72-.096L17.66 18m0 0l.229 2.523a1.125 1.125 0 01-1.12 1.227H7.231c-.662 0-1.18-.568-1.12-1.227L6.34 18m11.318 0h1.091A2.25 2.25 0 0021 15.75V9.456c0-1.081-.768-2.015-1.837-2.175a48.055 48.055 0 00-1.913-.247M6.34 18H5.25A2.25 2.25 0 013 15.75V9.456c0-1.081.768-2.015 1.837-2.175a48.041 48.041 0 011.913-.247m10.5 0a48.536 48.536 0 00-10.5 0m10.5 0V3.375c0-.621-.504-1.125-1.125-1.125h-8.25c-.621 0-1.125.504-1.125 1.125v3.659M18 10.5h.008v.008H18V10.5zm-3 0h.008v.008H15V10.5z" }) }),
376
- "Print"
377
- ] }),
378
- /* @__PURE__ */ jsxs("button", { onClick: onDownload ?? handleDefaultDownload, className: btn, children: [
379
- /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3" }) }),
380
- "Download"
381
- ] }),
382
- onEmail && /* @__PURE__ */ jsxs("button", { onClick: onEmail, className: btn, children: [
383
- /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75" }) }),
384
- "Email"
385
- ] })
386
- ] }),
387
- /* @__PURE__ */ jsx(
388
- "div",
389
- {
390
- ref: containerRef,
391
- className: "flex-1 overflow-auto bg-gray-100 outline-none",
392
- tabIndex: 0,
393
- onWheel: onWheelPage,
394
- onKeyDown: onKeyPage,
395
- children: loading ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full text-gray-400 text-sm", children: "Loading PDF..." }) : /* @__PURE__ */ jsxs("div", { className: "min-h-full flex items-center justify-center p-4", children: [
396
- /* @__PURE__ */ jsx("style", { children: TEXT_LAYER_CSS }),
397
- /* @__PURE__ */ jsxs("div", { className: "relative shadow-lg rounded", children: [
398
- /* @__PURE__ */ jsx("canvas", { ref: canvasRef, className: "block rounded" }),
399
- /* @__PURE__ */ jsx(
400
- "div",
401
- {
402
- ref: textLayerRef,
403
- className: "preview-pdf-textlayer",
404
- onPointerDown: (e) => e.currentTarget.classList.add("selecting")
405
- }
406
- )
407
- ] })
408
- ] })
409
- }
410
- )
411
- ] });
412
- }
413
-
414
- export { PanelActions, PdfViewer, ToolbarSlotContext, fitScale };
415
- //# sourceMappingURL=chunk-FIHOGVUP.js.map
416
- //# sourceMappingURL=chunk-FIHOGVUP.js.map