efficient-shell 4.137.0 → 4.145.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/LICENSE +6 -17
  2. package/README.md +80 -12
  3. package/dist/Browser-24YNRTKT.js +43 -0
  4. package/dist/Calculator-LER6KUQC.js +29 -0
  5. package/dist/ConfirmDialog-GAYETRMG.js +1 -0
  6. package/dist/CurrencyConverter-Y35GFDFF.js +21 -0
  7. package/dist/Documents-7FYX2CGT.js +52 -0
  8. package/dist/Files-RZOML2N6.js +89 -0
  9. package/dist/Notepad-VVDCBDUA.js +25 -0
  10. package/dist/PdfViewer-CvLb2j_l.d.ts +40 -0
  11. package/dist/PdfViewer-ZCT3PYXU.js +1 -0
  12. package/dist/PomodoroTimer-VAM3AJOX.js +99 -0
  13. package/dist/Preview-HZ37D7QJ.js +187 -0
  14. package/dist/Sidebar-CVF7C6BO.js +23 -0
  15. package/dist/Spreadsheet-6WX3P6AB.js +37 -0
  16. package/dist/Stock-AUWI3TUX.js +16 -0
  17. package/dist/Weather-HU75TH7T.js +60 -0
  18. package/dist/WorldClock-T64MDRMJ.js +32 -0
  19. package/dist/apps/index.d.ts +3 -23
  20. package/dist/apps/index.js +1 -151
  21. package/dist/brand.css +1 -1
  22. package/dist/chunk-2RHMSFZV.js +9 -0
  23. package/dist/chunk-4FS742BM.js +1 -0
  24. package/dist/chunk-57MIENLJ.js +1 -0
  25. package/dist/chunk-7DAQ3WVP.js +106 -0
  26. package/dist/chunk-BR22X7E5.js +1 -0
  27. package/dist/chunk-BUTSU7FO.js +1 -0
  28. package/dist/chunk-CVTOZCM3.js +24 -0
  29. package/dist/chunk-D65T4H6J.js +1 -0
  30. package/dist/chunk-ESL5TDNA.js +1 -0
  31. package/dist/chunk-FBDZGO3V.js +1 -0
  32. package/dist/chunk-FHTLC7HH.js +1 -0
  33. package/dist/chunk-GDSGXDET.js +34 -0
  34. package/dist/chunk-I55UMU3R.js +6 -0
  35. package/dist/chunk-KKOHUQPF.js +1 -0
  36. package/dist/chunk-L7TEFXIS.js +69 -0
  37. package/dist/chunk-LVDRBRYU.js +1 -0
  38. package/dist/chunk-LVFMK5OQ.js +29 -0
  39. package/dist/chunk-LWLCNQY7.js +1 -0
  40. package/dist/chunk-MAIHBBWT.js +1 -0
  41. package/dist/chunk-MU5H2CDL.js +2 -0
  42. package/dist/chunk-NBBOFQPL.js +947 -0
  43. package/dist/chunk-NPJH5MD7.js +13 -0
  44. package/dist/chunk-OCSOMMY2.js +1 -0
  45. package/dist/chunk-PH3PRIFP.js +5 -0
  46. package/dist/chunk-RJ4LACFH.js +9 -0
  47. package/dist/chunk-SLCR26NK.js +4 -0
  48. package/dist/chunk-TFKB2WEB.js +19 -0
  49. package/dist/chunk-TR6PLN7W.js +1 -0
  50. package/dist/chunk-TWV42Q3K.js +1 -0
  51. package/dist/chunk-UB22J6EF.js +1 -0
  52. package/dist/chunk-UB4JIOLD.js +2 -0
  53. package/dist/chunk-V453E4KU.js +11 -0
  54. package/dist/chunk-VTVSMRFX.js +1 -0
  55. package/dist/file-intake/index.js +1 -4
  56. package/dist/{index-DVI9DMSu.d.ts → index-NhR7frRu.d.ts} +189 -17
  57. package/dist/index.d.ts +2 -2
  58. package/dist/index.js +639 -7473
  59. package/dist/map/index.d.ts +266 -13
  60. package/dist/map/index.js +22 -540
  61. package/dist/markdown/index.js +6 -184
  62. package/dist/markup/index.js +1 -135
  63. package/dist/page-tabs/index.js +21 -709
  64. package/dist/pdf/index.d.ts +9 -0
  65. package/dist/pdf/index.js +2 -0
  66. package/dist/sounds-OMHXVVQ4.js +1 -0
  67. package/dist/ui/index.d.ts +1 -1
  68. package/dist/ui/index.js +1 -19
  69. package/dist/ui.css +7 -0
  70. package/package.json +9 -3
  71. package/dist/Browser-ZNX4WFUH.js +0 -482
  72. package/dist/Browser-ZNX4WFUH.js.map +0 -1
  73. package/dist/Calculator-6FGNKOXU.js +0 -192
  74. package/dist/Calculator-6FGNKOXU.js.map +0 -1
  75. package/dist/ConfirmDialog-NPQMIGUR.js +0 -4
  76. package/dist/ConfirmDialog-NPQMIGUR.js.map +0 -1
  77. package/dist/CurrencyConverter-FF7EXRYL.js +0 -236
  78. package/dist/CurrencyConverter-FF7EXRYL.js.map +0 -1
  79. package/dist/Documents-H3R7XSBH.js +0 -441
  80. package/dist/Documents-H3R7XSBH.js.map +0 -1
  81. package/dist/Files-ZHJIAUC2.js +0 -805
  82. package/dist/Files-ZHJIAUC2.js.map +0 -1
  83. package/dist/Notepad-VE7ISWRQ.js +0 -410
  84. package/dist/Notepad-VE7ISWRQ.js.map +0 -1
  85. package/dist/PdfViewer-SQBFYAGW.js +0 -5
  86. package/dist/PdfViewer-SQBFYAGW.js.map +0 -1
  87. package/dist/PomodoroTimer-IR3WREED.js +0 -633
  88. package/dist/PomodoroTimer-IR3WREED.js.map +0 -1
  89. package/dist/Preview-DAQGRNRM.js +0 -2959
  90. package/dist/Preview-DAQGRNRM.js.map +0 -1
  91. package/dist/Sidebar-YW6H4NDJ.js +0 -291
  92. package/dist/Sidebar-YW6H4NDJ.js.map +0 -1
  93. package/dist/Spreadsheet-HOCPHJOC.js +0 -519
  94. package/dist/Spreadsheet-HOCPHJOC.js.map +0 -1
  95. package/dist/Stock-LVRQPURG.js +0 -158
  96. package/dist/Stock-LVRQPURG.js.map +0 -1
  97. package/dist/Weather-LZQGVDJL.js +0 -431
  98. package/dist/Weather-LZQGVDJL.js.map +0 -1
  99. package/dist/WorldClock-XPD7WOZT.js +0 -202
  100. package/dist/WorldClock-XPD7WOZT.js.map +0 -1
  101. package/dist/apps/index.js.map +0 -1
  102. package/dist/chunk-5O42JXQE.js +0 -26
  103. package/dist/chunk-5O42JXQE.js.map +0 -1
  104. package/dist/chunk-5RPTS3BT.js +0 -70
  105. package/dist/chunk-5RPTS3BT.js.map +0 -1
  106. package/dist/chunk-6XJEJWNJ.js +0 -61
  107. package/dist/chunk-6XJEJWNJ.js.map +0 -1
  108. package/dist/chunk-7CCHEEYC.js +0 -94
  109. package/dist/chunk-7CCHEEYC.js.map +0 -1
  110. package/dist/chunk-BE7FZOFU.js +0 -17
  111. package/dist/chunk-BE7FZOFU.js.map +0 -1
  112. package/dist/chunk-COWYSHG2.js +0 -79
  113. package/dist/chunk-COWYSHG2.js.map +0 -1
  114. package/dist/chunk-D7PYW2QS.js +0 -265
  115. package/dist/chunk-D7PYW2QS.js.map +0 -1
  116. package/dist/chunk-DVZWYWSD.js +0 -26
  117. package/dist/chunk-DVZWYWSD.js.map +0 -1
  118. package/dist/chunk-E7TB6WD2.js +0 -153
  119. package/dist/chunk-E7TB6WD2.js.map +0 -1
  120. package/dist/chunk-FIHOGVUP.js +0 -416
  121. package/dist/chunk-FIHOGVUP.js.map +0 -1
  122. package/dist/chunk-GA35NEND.js +0 -56
  123. package/dist/chunk-GA35NEND.js.map +0 -1
  124. package/dist/chunk-HUBJAUGG.js +0 -316
  125. package/dist/chunk-HUBJAUGG.js.map +0 -1
  126. package/dist/chunk-I2TAAJHS.js +0 -465
  127. package/dist/chunk-I2TAAJHS.js.map +0 -1
  128. package/dist/chunk-ICTRCKUE.js +0 -3710
  129. package/dist/chunk-ICTRCKUE.js.map +0 -1
  130. package/dist/chunk-IPXN646P.js +0 -14
  131. package/dist/chunk-IPXN646P.js.map +0 -1
  132. package/dist/chunk-IRWSRJ4K.js +0 -48
  133. package/dist/chunk-IRWSRJ4K.js.map +0 -1
  134. package/dist/chunk-JOPU6WPY.js +0 -504
  135. package/dist/chunk-JOPU6WPY.js.map +0 -1
  136. package/dist/chunk-MGGY74RY.js +0 -14
  137. package/dist/chunk-MGGY74RY.js.map +0 -1
  138. package/dist/chunk-PVPPAWVM.js +0 -46
  139. package/dist/chunk-PVPPAWVM.js.map +0 -1
  140. package/dist/chunk-R7QGMK6N.js +0 -102
  141. package/dist/chunk-R7QGMK6N.js.map +0 -1
  142. package/dist/chunk-RT6DSB5Y.js +0 -143
  143. package/dist/chunk-RT6DSB5Y.js.map +0 -1
  144. package/dist/chunk-TRCWINHF.js +0 -105
  145. package/dist/chunk-TRCWINHF.js.map +0 -1
  146. package/dist/chunk-TW7LPMVR.js +0 -16
  147. package/dist/chunk-TW7LPMVR.js.map +0 -1
  148. package/dist/chunk-UTYKLGGT.js +0 -195
  149. package/dist/chunk-UTYKLGGT.js.map +0 -1
  150. package/dist/chunk-VNJJCH5A.js +0 -822
  151. package/dist/chunk-VNJJCH5A.js.map +0 -1
  152. package/dist/chunk-XJHZWSKV.js +0 -1103
  153. package/dist/chunk-XJHZWSKV.js.map +0 -1
  154. package/dist/chunk-Y3GYJ7YR.js +0 -549
  155. package/dist/chunk-Y3GYJ7YR.js.map +0 -1
  156. package/dist/chunk-YA4EE7ST.js +0 -14107
  157. package/dist/chunk-YA4EE7ST.js.map +0 -1
  158. package/dist/chunk-YDHXWCCJ.js +0 -145
  159. package/dist/chunk-YDHXWCCJ.js.map +0 -1
  160. package/dist/chunk-YE6GUDGP.js +0 -548
  161. package/dist/chunk-YE6GUDGP.js.map +0 -1
  162. package/dist/chunk-YNKK7NE3.js +0 -171
  163. package/dist/chunk-YNKK7NE3.js.map +0 -1
  164. package/dist/chunk-YPO6RDMX.js +0 -20
  165. package/dist/chunk-YPO6RDMX.js.map +0 -1
  166. package/dist/chunk-ZS7PMGUW.js +0 -7
  167. package/dist/chunk-ZS7PMGUW.js.map +0 -1
  168. package/dist/file-intake/index.js.map +0 -1
  169. package/dist/index.js.map +0 -1
  170. package/dist/map/index.js.map +0 -1
  171. package/dist/markdown/index.js.map +0 -1
  172. package/dist/markup/index.js.map +0 -1
  173. package/dist/page-tabs/index.js.map +0 -1
  174. package/dist/sounds-NT4DEZGD.js +0 -3
  175. package/dist/sounds-NT4DEZGD.js.map +0 -1
  176. 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