efficient-shell 8.33.0 → 8.35.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 (476) hide show
  1. package/README.md +66 -15
  2. package/THIRD_PARTY_NOTICES.md +11 -2
  3. package/dist/{Browser-V3NK5J6A.js → Browser-ERZNOFN7.js} +14 -14
  4. package/dist/Calculator-NXIOZMML.js +29 -0
  5. package/dist/{CurrencyConverter-S7LG5PMX.js → CurrencyConverter-57WUTV4H.js} +12 -12
  6. package/dist/{Documents-EKGXGENC.js → Documents-POWS4L44.js} +7 -7
  7. package/dist/{Files-5J4CR3CU.js → Files-O44UH6ZF.js} +40 -40
  8. package/dist/{Notepad-GTU3U27L.js → Notepad-66ZCGUHC.js} +9 -9
  9. package/dist/PdfViewer-KSLOYXMD.js +1 -0
  10. package/dist/{PomodoroTimer-2HPCAEI5.js → PomodoroTimer-GLYNCO4H.js} +17 -17
  11. package/dist/{Preview-TMS6JTPA.js → Preview-WZDFVBNJ.js} +15 -15
  12. package/dist/Sidebar-QQFJJWE2.js +43 -0
  13. package/dist/{Spreadsheet-P77Z2TVQ.js → Spreadsheet-OYAVNRCT.js} +14 -14
  14. package/dist/{Stock-VNFYS73L.js → Stock-CIHUZOQS.js} +7 -7
  15. package/dist/{Weather-DS4YZ6SH.js → Weather-UKLNJ3VF.js} +13 -13
  16. package/dist/{WorldClock-7S4TITSF.js → WorldClock-OZ3I7D2M.js} +6 -6
  17. package/dist/ai/index.d.ts +48 -10
  18. package/dist/ai/index.js +38 -33
  19. package/dist/ai.css +1 -1
  20. package/dist/apps/index.js +1 -1
  21. package/dist/bin/media-host-check.js +1 -1
  22. package/dist/bin/ui-check.js +1 -1
  23. package/dist/chunk-243NPEG6.js +2 -0
  24. package/dist/{chunk-L3NYH4QV.js → chunk-2AHHM4SK.js} +39 -39
  25. package/dist/{chunk-7CFH6Y4T.js → chunk-2F7ZOMKK.js} +1 -1
  26. package/dist/chunk-2PWZNFFP.js +19 -0
  27. package/dist/{chunk-KIBL6M3T.js → chunk-2SHYR3RA.js} +4 -3
  28. package/dist/{chunk-G433MKIN.js → chunk-2U2GJCSP.js} +5 -5
  29. package/dist/chunk-2UCDJCGZ.js +4 -0
  30. package/dist/{chunk-ZN3O2KJ7.js → chunk-2WL3Q7VW.js} +12 -12
  31. package/dist/chunk-2ZD67TDP.js +2 -0
  32. package/dist/chunk-3ER2WJNL.js +2 -0
  33. package/dist/chunk-44F7JLNV.js +2 -0
  34. package/dist/chunk-474G67EG.js +6 -0
  35. package/dist/chunk-47OCVZXD.js +2 -0
  36. package/dist/chunk-4CFQXH5N.js +2 -0
  37. package/dist/chunk-4FNGR474.js +2 -0
  38. package/dist/{chunk-XWLWG4HS.js → chunk-4GVH4ZUH.js} +1 -1
  39. package/dist/{chunk-YRWRA7MW.js → chunk-4HCRZHIX.js} +1 -1
  40. package/dist/chunk-4L7GLO5W.js +2 -0
  41. package/dist/{chunk-MXHEREC6.js → chunk-4MO375G3.js} +3 -3
  42. package/dist/chunk-4RDYNULI.js +2 -0
  43. package/dist/{chunk-WFWDABGV.js → chunk-4RNF6MNW.js} +2 -2
  44. package/dist/chunk-5DFKPSJQ.js +1 -0
  45. package/dist/chunk-5FCEBKT2.js +7 -0
  46. package/dist/chunk-5HDMPCZP.js +2 -0
  47. package/dist/chunk-5KZ4WKUI.js +2 -0
  48. package/dist/{chunk-DGLCMYSQ.js → chunk-5N5DBTTF.js} +11 -11
  49. package/dist/{chunk-KNVE7CMS.js → chunk-5OX6KXWY.js} +1 -1
  50. package/dist/{chunk-PNQ4EYYM.js → chunk-5YELPBUT.js} +3 -3
  51. package/dist/chunk-64ZHCEZN.js +5 -0
  52. package/dist/{chunk-Y2D2YMFY.js → chunk-6ANFVX4M.js} +12 -12
  53. package/dist/chunk-6I7EODFJ.js +7 -0
  54. package/dist/chunk-6IUDFVTN.js +2 -0
  55. package/dist/chunk-75IWV4ZF.js +2 -0
  56. package/dist/chunk-77SI7AKG.js +2 -0
  57. package/dist/{chunk-KK5MX7EH.js → chunk-7ACSSYEZ.js} +13 -13
  58. package/dist/chunk-7GB7CVQI.js +2 -0
  59. package/dist/chunk-7KCJ77BP.js +2 -0
  60. package/dist/chunk-7P3DXO3E.js +2 -0
  61. package/dist/{chunk-GI7FOLDX.js → chunk-ACW3J77L.js} +1 -1
  62. package/dist/{chunk-ERMZ75FO.js → chunk-AF7R2MV4.js} +1 -1
  63. package/dist/{chunk-QQK3XS6H.js → chunk-AZU7YOES.js} +8 -8
  64. package/dist/{chunk-NFR4QZL2.js → chunk-BHMUOWAE.js} +4 -4
  65. package/dist/chunk-BWIX3YIH.js +2 -0
  66. package/dist/{chunk-XEKPJGVZ.js → chunk-BX2IOAD5.js} +1 -1
  67. package/dist/chunk-BXQYRG7P.js +2 -0
  68. package/dist/{chunk-UB4BTRSB.js → chunk-BYCOB6WT.js} +1 -1
  69. package/dist/chunk-BZMZTPS6.js +1 -0
  70. package/dist/chunk-BZR43D3G.js +2 -0
  71. package/dist/chunk-CAMLFCGY.js +29 -0
  72. package/dist/chunk-CAUWHLN7.js +4 -0
  73. package/dist/{chunk-3GT6LKCC.js → chunk-CCPNMYCK.js} +1 -1
  74. package/dist/{chunk-RAAUW5OZ.js → chunk-DG2WU3BU.js} +2 -2
  75. package/dist/chunk-DIN3EFOM.js +14 -0
  76. package/dist/chunk-DS6R5R3O.js +2 -0
  77. package/dist/{chunk-WJ3XSJ6B.js → chunk-EBC4XFL2.js} +1 -1
  78. package/dist/{chunk-37JDUDCO.js → chunk-ECCUEG3J.js} +1 -1
  79. package/dist/chunk-EHMDGAWA.js +2 -0
  80. package/dist/{chunk-FJXYKN7R.js → chunk-EM6BEHAD.js} +8 -8
  81. package/dist/chunk-EQPVQY5E.js +2 -0
  82. package/dist/{chunk-KFXVHP37.js → chunk-EVB35JP5.js} +1 -1
  83. package/dist/{chunk-FL2PUQX7.js → chunk-EW6FRPFJ.js} +1 -1
  84. package/dist/{chunk-JCMP5KMS.js → chunk-EZY4CO4A.js} +6 -6
  85. package/dist/chunk-FATXXVV3.js +2 -0
  86. package/dist/chunk-FEVWWOGL.js +2 -0
  87. package/dist/{chunk-PJCVNFWM.js → chunk-FKZEGBLK.js} +10 -10
  88. package/dist/chunk-FMERDO2X.js +2 -0
  89. package/dist/{chunk-DTSCO7VM.js → chunk-FMKTVZAO.js} +1 -1
  90. package/dist/chunk-FOXMWLVS.js +2 -0
  91. package/dist/{chunk-IZCODCSC.js → chunk-FTKKGGOQ.js} +1 -1
  92. package/dist/chunk-FUSCAZEK.js +2 -0
  93. package/dist/{chunk-4S4523B2.js → chunk-G2MJTE6X.js} +12 -12
  94. package/dist/chunk-G4GQOAWS.js +2 -0
  95. package/dist/{chunk-EZGY6CFN.js → chunk-GK3QH63P.js} +1 -1
  96. package/dist/{chunk-QGDZ6RAI.js → chunk-HAIMJAI4.js} +2 -2
  97. package/dist/chunk-HMHL27AU.js +6 -0
  98. package/dist/chunk-I27TFZJH.js +2 -0
  99. package/dist/chunk-IBHBPSQN.js +2 -0
  100. package/dist/{chunk-4AAGZQX7.js → chunk-IHEEJO5S.js} +1 -1
  101. package/dist/chunk-INUXPG27.js +2 -0
  102. package/dist/{chunk-WQNIXV4T.js → chunk-IUCIYWTT.js} +8 -8
  103. package/dist/chunk-IWQSBA3D.js +2 -0
  104. package/dist/chunk-JBQWR4SX.js +8 -0
  105. package/dist/{chunk-AX7KPMDV.js → chunk-JDKRQG7X.js} +2 -2
  106. package/dist/chunk-JMWKD4R5.js +2 -0
  107. package/dist/chunk-JREQY3YN.js +2 -0
  108. package/dist/chunk-JVIOAZHW.js +14 -0
  109. package/dist/chunk-K4RFJ7P2.js +2 -0
  110. package/dist/chunk-KTMEHSTB.js +2 -0
  111. package/dist/{chunk-FOLZVO2Z.js → chunk-L3G3YHVN.js} +13 -13
  112. package/dist/chunk-L65BESIE.js +1 -0
  113. package/dist/chunk-LQD7K7HK.js +2 -0
  114. package/dist/{chunk-ZEKM6HAA.js → chunk-M2AIC7IK.js} +2 -2
  115. package/dist/{chunk-KDZUWQEG.js → chunk-M2KV4WKR.js} +1 -1
  116. package/dist/{chunk-H3BC4KDE.js → chunk-M2LLVSBR.js} +1 -1
  117. package/dist/{chunk-SAKHGHF5.js → chunk-MC43PRTL.js} +1 -1
  118. package/dist/{chunk-VRUDENTZ.js → chunk-MICWRC72.js} +7 -7
  119. package/dist/chunk-MTZUYC4Y.js +5 -0
  120. package/dist/chunk-MVJ34HIV.js +2 -0
  121. package/dist/{chunk-WTY3SXO7.js → chunk-MY755PTJ.js} +1 -1
  122. package/dist/chunk-NEQFHRF3.js +2 -0
  123. package/dist/chunk-NFMDU4EJ.js +4 -0
  124. package/dist/chunk-NK7HBFNQ.js +2 -0
  125. package/dist/chunk-NKZNPYDB.js +3 -0
  126. package/dist/chunk-NTME34BP.js +2 -0
  127. package/dist/chunk-NTWI7EGJ.js +4 -0
  128. package/dist/{chunk-YSFLXPUS.js → chunk-NUSSZJF2.js} +5 -5
  129. package/dist/chunk-NZBQVE3Q.js +2 -0
  130. package/dist/{chunk-RGBX3EVC.js → chunk-O2YAB6WK.js} +8 -8
  131. package/dist/{chunk-TRZPF2CE.js → chunk-OFKWTOXK.js} +3 -3
  132. package/dist/chunk-OIH56GH5.js +2 -0
  133. package/dist/chunk-OKRAYHGW.js +2 -0
  134. package/dist/chunk-OM5K4WCB.js +2 -0
  135. package/dist/chunk-ONC3BFFM.js +2 -0
  136. package/dist/chunk-OSXM35MX.js +2 -0
  137. package/dist/{chunk-ZT5Y5JZB.js → chunk-P42YNSKI.js} +4 -4
  138. package/dist/chunk-PAZU27H5.js +2 -0
  139. package/dist/chunk-PBGMVLOF.js +2 -0
  140. package/dist/{chunk-TFMOGKW2.js → chunk-PCKYNZ5Y.js} +10 -10
  141. package/dist/chunk-PRJJK7VR.js +2 -0
  142. package/dist/chunk-PYW3HX7A.js +2 -0
  143. package/dist/{chunk-YW2DH6YQ.js → chunk-QPWD5CCS.js} +5 -5
  144. package/dist/chunk-QTM26JQP.js +2 -0
  145. package/dist/chunk-QYEMC2OA.js +2 -0
  146. package/dist/chunk-R2IXRW5N.js +2 -0
  147. package/dist/{chunk-RUQEB2ZC.js → chunk-R4C3GGCS.js} +3 -3
  148. package/dist/chunk-RAHDUMQ5.js +2 -0
  149. package/dist/{chunk-3V5Z2BJY.js → chunk-RB2F65YJ.js} +12 -12
  150. package/dist/chunk-RBXMTHOT.js +4 -0
  151. package/dist/chunk-ROUTBYMG.js +5 -0
  152. package/dist/{chunk-BZV4K6GR.js → chunk-RPJ2GC3K.js} +20 -20
  153. package/dist/{chunk-XC55NMXR.js → chunk-S4IW5OL3.js} +1 -1
  154. package/dist/chunk-S4J4B7LY.js +5 -0
  155. package/dist/{chunk-HVX37PKU.js → chunk-SEXLHFMR.js} +1 -1
  156. package/dist/{chunk-SYSDAVZ3.js → chunk-SWHRP52Y.js} +1 -1
  157. package/dist/chunk-T3NJAOJL.js +2 -0
  158. package/dist/{chunk-NWP6IJYK.js → chunk-TANR67XF.js} +2 -2
  159. package/dist/chunk-TI5WUO3V.js +2 -0
  160. package/dist/{chunk-4F3IKYUO.js → chunk-TOVHLONK.js} +6 -6
  161. package/dist/{chunk-JOIWDQRJ.js → chunk-TRD22FC7.js} +6 -6
  162. package/dist/{chunk-YGZMD6TZ.js → chunk-TTY62G5D.js} +16 -16
  163. package/dist/{chunk-YCQVEJOT.js → chunk-TW6WYYBC.js} +2 -2
  164. package/dist/{chunk-B55IXYDR.js → chunk-TZHWF3P5.js} +2 -2
  165. package/dist/chunk-UKC6VJE4.js +2 -0
  166. package/dist/chunk-URWQO4KB.js +2 -0
  167. package/dist/{chunk-IAQC775L.js → chunk-UZ3CZQA4.js} +1 -1
  168. package/dist/chunk-V3GM5NXB.js +2 -0
  169. package/dist/chunk-V6Q2GZAI.js +2 -0
  170. package/dist/chunk-VRODVMV3.js +1 -0
  171. package/dist/chunk-VW4FHT46.js +2 -0
  172. package/dist/chunk-W5DLG5T2.js +2 -0
  173. package/dist/chunk-W5I35GZZ.js +2 -0
  174. package/dist/{chunk-V4KQUOUP.js → chunk-WKRFD4E4.js} +8 -8
  175. package/dist/{chunk-PDXD6DT7.js → chunk-WME5DFB6.js} +1 -1
  176. package/dist/chunk-WYDD26UO.js +2 -0
  177. package/dist/{chunk-3C67XRVJ.js → chunk-XB2YPUKR.js} +8 -8
  178. package/dist/{chunk-DWYNPXSB.js → chunk-XDDTFV32.js} +1 -1
  179. package/dist/chunk-XUYWUGDM.js +2 -0
  180. package/dist/{chunk-UQBPKZUR.js → chunk-XZL3HCWH.js} +1 -1
  181. package/dist/{chunk-IK4Y7WEP.js → chunk-YBB56N6X.js} +1 -1
  182. package/dist/chunk-YHYAGJ6V.js +2 -0
  183. package/dist/chunk-YKKMR5DU.js +8 -0
  184. package/dist/chunk-YVULGIDQ.js +2 -0
  185. package/dist/chunk-Z5XEAC32.js +2 -0
  186. package/dist/chunk-ZBL4CN2E.js +2 -0
  187. package/dist/chunk-ZEN67DFI.js +2 -0
  188. package/dist/{chunk-X5AZHR2J.js → chunk-ZRHQGFO5.js} +2 -2
  189. package/dist/{chunk-O3HRFXNN.js → chunk-ZXSMSVLU.js} +3 -3
  190. package/dist/chunk-ZXU4DEQM.js +2 -0
  191. package/dist/chunk-ZZIVSJ2B.js +2 -0
  192. package/dist/data/ListLoadError.js +1 -1
  193. package/dist/format/index.js +1 -1
  194. package/dist/forms/BorderInput.js +1 -1
  195. package/dist/forms/BrandAssetEditor.js +1 -1
  196. package/dist/forms/Calendar.js +1 -1
  197. package/dist/forms/ColorPicker.js +1 -1
  198. package/dist/forms/ComposerAttachments.js +1 -1
  199. package/dist/forms/CornersInput.js +1 -1
  200. package/dist/forms/DatePicker.js +1 -1
  201. package/dist/forms/DateRangePicker.js +1 -1
  202. package/dist/forms/DisplayChips.js +1 -1
  203. package/dist/forms/FilePicker.js +1 -1
  204. package/dist/forms/IconPicker.js +1 -1
  205. package/dist/forms/InputNumber.js +1 -1
  206. package/dist/forms/LinkPicker.js +1 -1
  207. package/dist/forms/MediaLibrary.js +1 -1
  208. package/dist/forms/MediaUploadField.js +1 -1
  209. package/dist/forms/MediaUploadGrid.js +1 -1
  210. package/dist/forms/MediaUsedInList.js +1 -1
  211. package/dist/forms/PositionInput.js +1 -1
  212. package/dist/forms/Select.d.ts +1 -1
  213. package/dist/forms/Select.js +1 -1
  214. package/dist/forms/SidesInput.js +1 -1
  215. package/dist/forms/Slider.js +1 -1
  216. package/dist/forms/Snippet.js +1 -1
  217. package/dist/forms/SplitButton.js +1 -1
  218. package/dist/forms/Switch.js +1 -1
  219. package/dist/forms/TagInput.js +1 -1
  220. package/dist/forms/TextToolbar.d.ts +4 -1
  221. package/dist/forms/TextToolbar.js +1 -1
  222. package/dist/forms/WidthsBar.js +1 -1
  223. package/dist/forms/mediaLibraryMenu.js +1 -1
  224. package/dist/forms/settingRowContext.d.ts +11 -1
  225. package/dist/forms/settingRowContext.js +1 -1
  226. package/dist/forms/textAlign.d.ts +89 -0
  227. package/dist/forms/textAlign.js +2 -0
  228. package/dist/icons/efficient-glyphs.d.ts +61 -0
  229. package/dist/icons/efficient-glyphs.js +1 -1
  230. package/dist/icons/efficient-looks.d.ts +22 -0
  231. package/dist/icons/efficient-looks.js +1 -1
  232. package/dist/icons/efficient-meanings.d.ts +61 -0
  233. package/dist/icons/efficient-meanings.js +1 -1
  234. package/dist/icons/efficient.d.ts +61 -0
  235. package/dist/icons/efficient.js +1 -1
  236. package/dist/icons/glyphs/BrandAdyenIcon.d.ts +11 -0
  237. package/dist/icons/glyphs/BrandAdyenIcon.js +1 -0
  238. package/dist/icons/glyphs/BrandAfterpayIcon.d.ts +11 -0
  239. package/dist/icons/glyphs/BrandAfterpayIcon.js +1 -0
  240. package/dist/icons/glyphs/BrandAircallIcon.d.ts +11 -0
  241. package/dist/icons/glyphs/BrandAircallIcon.js +1 -0
  242. package/dist/icons/glyphs/BrandAmericanexpressIcon.d.ts +11 -0
  243. package/dist/icons/glyphs/BrandAmericanexpressIcon.js +1 -0
  244. package/dist/icons/glyphs/BrandApplepayIcon.d.ts +11 -0
  245. package/dist/icons/glyphs/BrandApplepayIcon.js +1 -0
  246. package/dist/icons/glyphs/BrandBigcommerceIcon.d.ts +11 -0
  247. package/dist/icons/glyphs/BrandBigcommerceIcon.js +1 -0
  248. package/dist/icons/glyphs/BrandBrevoIcon.d.ts +11 -0
  249. package/dist/icons/glyphs/BrandBrevoIcon.js +1 -0
  250. package/dist/icons/glyphs/BrandCalendlyIcon.d.ts +11 -0
  251. package/dist/icons/glyphs/BrandCalendlyIcon.js +1 -0
  252. package/dist/icons/glyphs/BrandCampaignmonitorIcon.d.ts +11 -0
  253. package/dist/icons/glyphs/BrandCampaignmonitorIcon.js +1 -0
  254. package/dist/icons/glyphs/BrandDhlIcon.d.ts +11 -0
  255. package/dist/icons/glyphs/BrandDhlIcon.js +1 -0
  256. package/dist/icons/glyphs/BrandDropboxIcon.d.ts +11 -0
  257. package/dist/icons/glyphs/BrandDropboxIcon.js +1 -0
  258. package/dist/icons/glyphs/BrandEbayIcon.d.ts +11 -0
  259. package/dist/icons/glyphs/BrandEbayIcon.js +1 -0
  260. package/dist/icons/glyphs/BrandEtsyIcon.d.ts +11 -0
  261. package/dist/icons/glyphs/BrandEtsyIcon.js +1 -0
  262. package/dist/icons/glyphs/BrandFacebookIcon.d.ts +11 -0
  263. package/dist/icons/glyphs/BrandFacebookIcon.js +1 -0
  264. package/dist/icons/glyphs/BrandFedexIcon.d.ts +11 -0
  265. package/dist/icons/glyphs/BrandFedexIcon.js +1 -0
  266. package/dist/icons/glyphs/BrandGmailIcon.d.ts +11 -0
  267. package/dist/icons/glyphs/BrandGmailIcon.js +1 -0
  268. package/dist/icons/glyphs/BrandGoogleadsIcon.d.ts +11 -0
  269. package/dist/icons/glyphs/BrandGoogleadsIcon.js +1 -0
  270. package/dist/icons/glyphs/BrandGoogleanalyticsIcon.d.ts +11 -0
  271. package/dist/icons/glyphs/BrandGoogleanalyticsIcon.js +1 -0
  272. package/dist/icons/glyphs/BrandGooglecalendarIcon.d.ts +11 -0
  273. package/dist/icons/glyphs/BrandGooglecalendarIcon.js +1 -0
  274. package/dist/icons/glyphs/BrandGoogledriveIcon.d.ts +11 -0
  275. package/dist/icons/glyphs/BrandGoogledriveIcon.js +1 -0
  276. package/dist/icons/glyphs/BrandGooglepayIcon.d.ts +11 -0
  277. package/dist/icons/glyphs/BrandGooglepayIcon.js +1 -0
  278. package/dist/icons/glyphs/BrandGooglesheetsIcon.d.ts +11 -0
  279. package/dist/icons/glyphs/BrandGooglesheetsIcon.js +1 -0
  280. package/dist/icons/glyphs/BrandHubspotIcon.d.ts +11 -0
  281. package/dist/icons/glyphs/BrandHubspotIcon.js +1 -0
  282. package/dist/icons/glyphs/BrandInstagramIcon.d.ts +11 -0
  283. package/dist/icons/glyphs/BrandInstagramIcon.js +1 -0
  284. package/dist/icons/glyphs/BrandIntercomIcon.d.ts +11 -0
  285. package/dist/icons/glyphs/BrandIntercomIcon.js +1 -0
  286. package/dist/icons/glyphs/BrandKlarnaIcon.d.ts +11 -0
  287. package/dist/icons/glyphs/BrandKlarnaIcon.js +1 -0
  288. package/dist/icons/glyphs/BrandLineIcon.d.ts +11 -0
  289. package/dist/icons/glyphs/BrandLineIcon.js +1 -0
  290. package/dist/icons/glyphs/BrandLinkedinIcon.d.ts +11 -0
  291. package/dist/icons/glyphs/BrandLinkedinIcon.js +1 -0
  292. package/dist/icons/glyphs/BrandMailchimpIcon.d.ts +11 -0
  293. package/dist/icons/glyphs/BrandMailchimpIcon.js +1 -0
  294. package/dist/icons/glyphs/BrandMailgunIcon.d.ts +11 -0
  295. package/dist/icons/glyphs/BrandMailgunIcon.js +1 -0
  296. package/dist/icons/glyphs/BrandMakeIcon.d.ts +11 -0
  297. package/dist/icons/glyphs/BrandMakeIcon.js +1 -0
  298. package/dist/icons/glyphs/BrandMastercardIcon.d.ts +11 -0
  299. package/dist/icons/glyphs/BrandMastercardIcon.js +1 -0
  300. package/dist/icons/glyphs/BrandMessengerIcon.d.ts +11 -0
  301. package/dist/icons/glyphs/BrandMessengerIcon.js +1 -0
  302. package/dist/icons/glyphs/BrandMetaIcon.d.ts +11 -0
  303. package/dist/icons/glyphs/BrandMetaIcon.js +1 -0
  304. package/dist/icons/glyphs/BrandMyobIcon.d.ts +11 -0
  305. package/dist/icons/glyphs/BrandMyobIcon.js +1 -0
  306. package/dist/icons/glyphs/BrandNotionIcon.d.ts +11 -0
  307. package/dist/icons/glyphs/BrandNotionIcon.js +1 -0
  308. package/dist/icons/glyphs/BrandPaypalIcon.d.ts +11 -0
  309. package/dist/icons/glyphs/BrandPaypalIcon.js +1 -0
  310. package/dist/icons/glyphs/BrandPinterestIcon.d.ts +11 -0
  311. package/dist/icons/glyphs/BrandPinterestIcon.js +1 -0
  312. package/dist/icons/glyphs/BrandQuickbooksIcon.d.ts +11 -0
  313. package/dist/icons/glyphs/BrandQuickbooksIcon.js +1 -0
  314. package/dist/icons/glyphs/BrandSageIcon.d.ts +11 -0
  315. package/dist/icons/glyphs/BrandSageIcon.js +1 -0
  316. package/dist/icons/glyphs/BrandShopifyIcon.d.ts +11 -0
  317. package/dist/icons/glyphs/BrandShopifyIcon.js +1 -0
  318. package/dist/icons/glyphs/BrandSquareIcon.d.ts +11 -0
  319. package/dist/icons/glyphs/BrandSquareIcon.js +1 -0
  320. package/dist/icons/glyphs/BrandSquarespaceIcon.d.ts +11 -0
  321. package/dist/icons/glyphs/BrandSquarespaceIcon.js +1 -0
  322. package/dist/icons/glyphs/BrandStripeIcon.d.ts +11 -0
  323. package/dist/icons/glyphs/BrandStripeIcon.js +1 -0
  324. package/dist/icons/glyphs/BrandTelegramIcon.d.ts +11 -0
  325. package/dist/icons/glyphs/BrandTelegramIcon.js +1 -0
  326. package/dist/icons/glyphs/BrandTiktokIcon.d.ts +11 -0
  327. package/dist/icons/glyphs/BrandTiktokIcon.js +1 -0
  328. package/dist/icons/glyphs/BrandTrelloIcon.d.ts +11 -0
  329. package/dist/icons/glyphs/BrandTrelloIcon.js +1 -0
  330. package/dist/icons/glyphs/BrandUpsIcon.d.ts +11 -0
  331. package/dist/icons/glyphs/BrandUpsIcon.js +1 -0
  332. package/dist/icons/glyphs/BrandVisaIcon.d.ts +11 -0
  333. package/dist/icons/glyphs/BrandVisaIcon.js +1 -0
  334. package/dist/icons/glyphs/BrandVonageIcon.d.ts +11 -0
  335. package/dist/icons/glyphs/BrandVonageIcon.js +1 -0
  336. package/dist/icons/glyphs/BrandWechatIcon.d.ts +11 -0
  337. package/dist/icons/glyphs/BrandWechatIcon.js +1 -0
  338. package/dist/icons/glyphs/BrandWhatsappIcon.d.ts +11 -0
  339. package/dist/icons/glyphs/BrandWhatsappIcon.js +1 -0
  340. package/dist/icons/glyphs/BrandWiseIcon.d.ts +11 -0
  341. package/dist/icons/glyphs/BrandWiseIcon.js +1 -0
  342. package/dist/icons/glyphs/BrandWixIcon.d.ts +11 -0
  343. package/dist/icons/glyphs/BrandWixIcon.js +1 -0
  344. package/dist/icons/glyphs/BrandWoocommerceIcon.d.ts +11 -0
  345. package/dist/icons/glyphs/BrandWoocommerceIcon.js +1 -0
  346. package/dist/icons/glyphs/BrandXIcon.d.ts +11 -0
  347. package/dist/icons/glyphs/BrandXIcon.js +1 -0
  348. package/dist/icons/glyphs/BrandXeroIcon.d.ts +11 -0
  349. package/dist/icons/glyphs/BrandXeroIcon.js +1 -0
  350. package/dist/icons/glyphs/BrandYoutubeIcon.d.ts +11 -0
  351. package/dist/icons/glyphs/BrandYoutubeIcon.js +1 -0
  352. package/dist/icons/glyphs/BrandZapierIcon.d.ts +11 -0
  353. package/dist/icons/glyphs/BrandZapierIcon.js +1 -0
  354. package/dist/icons/glyphs/BrandZendeskIcon.d.ts +11 -0
  355. package/dist/icons/glyphs/BrandZendeskIcon.js +1 -0
  356. package/dist/icons/glyphs/BrandZoomIcon.d.ts +11 -0
  357. package/dist/icons/glyphs/BrandZoomIcon.js +1 -0
  358. package/dist/icons/index.d.ts +6 -4
  359. package/dist/icons/index.js +1 -1
  360. package/dist/icons/looks/BrandFacebookOutlineIcon.d.ts +11 -0
  361. package/dist/icons/looks/BrandFacebookOutlineIcon.js +1 -0
  362. package/dist/icons/looks/BrandFacebookSolidIcon.d.ts +11 -0
  363. package/dist/icons/looks/BrandFacebookSolidIcon.js +1 -0
  364. package/dist/icons/looks/BrandInstagramOutlineIcon.d.ts +11 -0
  365. package/dist/icons/looks/BrandInstagramOutlineIcon.js +1 -0
  366. package/dist/icons/looks/BrandInstagramSolidIcon.d.ts +11 -0
  367. package/dist/icons/looks/BrandInstagramSolidIcon.js +1 -0
  368. package/dist/icons/looks/BrandLineOutlineIcon.d.ts +11 -0
  369. package/dist/icons/looks/BrandLineOutlineIcon.js +1 -0
  370. package/dist/icons/looks/BrandLineSolidIcon.d.ts +11 -0
  371. package/dist/icons/looks/BrandLineSolidIcon.js +1 -0
  372. package/dist/icons/looks/BrandLinkedinOutlineIcon.d.ts +11 -0
  373. package/dist/icons/looks/BrandLinkedinOutlineIcon.js +1 -0
  374. package/dist/icons/looks/BrandLinkedinSolidIcon.d.ts +11 -0
  375. package/dist/icons/looks/BrandLinkedinSolidIcon.js +1 -0
  376. package/dist/icons/looks/BrandPinterestOutlineIcon.d.ts +11 -0
  377. package/dist/icons/looks/BrandPinterestOutlineIcon.js +1 -0
  378. package/dist/icons/looks/BrandPinterestSolidIcon.d.ts +11 -0
  379. package/dist/icons/looks/BrandPinterestSolidIcon.js +1 -0
  380. package/dist/icons/looks/BrandTelegramOutlineIcon.d.ts +11 -0
  381. package/dist/icons/looks/BrandTelegramOutlineIcon.js +1 -0
  382. package/dist/icons/looks/BrandTelegramSolidIcon.d.ts +11 -0
  383. package/dist/icons/looks/BrandTelegramSolidIcon.js +1 -0
  384. package/dist/icons/looks/BrandTiktokOutlineIcon.d.ts +11 -0
  385. package/dist/icons/looks/BrandTiktokOutlineIcon.js +1 -0
  386. package/dist/icons/looks/BrandTiktokSolidIcon.d.ts +11 -0
  387. package/dist/icons/looks/BrandTiktokSolidIcon.js +1 -0
  388. package/dist/icons/looks/BrandWechatOutlineIcon.d.ts +11 -0
  389. package/dist/icons/looks/BrandWechatOutlineIcon.js +1 -0
  390. package/dist/icons/looks/BrandWechatSolidIcon.d.ts +11 -0
  391. package/dist/icons/looks/BrandWechatSolidIcon.js +1 -0
  392. package/dist/icons/looks/BrandWhatsappOutlineIcon.d.ts +11 -0
  393. package/dist/icons/looks/BrandWhatsappOutlineIcon.js +1 -0
  394. package/dist/icons/looks/BrandWhatsappSolidIcon.d.ts +11 -0
  395. package/dist/icons/looks/BrandWhatsappSolidIcon.js +1 -0
  396. package/dist/icons/looks/BrandXOutlineIcon.d.ts +11 -0
  397. package/dist/icons/looks/BrandXOutlineIcon.js +1 -0
  398. package/dist/icons/looks/BrandXSolidIcon.d.ts +11 -0
  399. package/dist/icons/looks/BrandXSolidIcon.js +1 -0
  400. package/dist/icons/looks/BrandYoutubeOutlineIcon.d.ts +11 -0
  401. package/dist/icons/looks/BrandYoutubeOutlineIcon.js +1 -0
  402. package/dist/icons/looks/BrandYoutubeSolidIcon.d.ts +11 -0
  403. package/dist/icons/looks/BrandYoutubeSolidIcon.js +1 -0
  404. package/dist/icons/looks/map.d.ts +1 -1
  405. package/dist/icons/looks/map.js +1 -1
  406. package/dist/icons/sets.js +1 -1
  407. package/dist/index.d.ts +3 -2
  408. package/dist/index.js +174 -174
  409. package/dist/map/index.js +6 -6
  410. package/dist/markdown/index.js +1 -1
  411. package/dist/names-mX74Rrmy.d.ts +23 -0
  412. package/dist/page-tabs/index.js +5 -5
  413. package/dist/pdf/index.js +1 -1
  414. package/dist/shell/Accordion.js +1 -1
  415. package/dist/shell/AppUpdateBanner.js +1 -1
  416. package/dist/shell/Banner.js +1 -1
  417. package/dist/shell/Breadcrumbs.js +1 -1
  418. package/dist/shell/ColoredBadge.js +1 -1
  419. package/dist/shell/ConfirmDialog.js +1 -1
  420. package/dist/shell/ContextMenu.js +1 -1
  421. package/dist/shell/Dialog.js +1 -1
  422. package/dist/shell/Drawer.js +1 -1
  423. package/dist/shell/DropdownMenu.js +1 -1
  424. package/dist/shell/EmptyState.js +1 -1
  425. package/dist/shell/HelpCenter.js +1 -1
  426. package/dist/shell/ImageLightbox.js +1 -1
  427. package/dist/shell/LanguageSelect.js +1 -1
  428. package/dist/shell/Markdown.d.ts +1 -1
  429. package/dist/shell/Markdown.js +1 -1
  430. package/dist/shell/PageHeader.js +1 -1
  431. package/dist/shell/PopupMenu.js +1 -1
  432. package/dist/shell/ProductionTimeline.js +1 -1
  433. package/dist/shell/Result.js +1 -1
  434. package/dist/shell/SearchableSelect.js +1 -1
  435. package/dist/shell/SettingReset.js +1 -1
  436. package/dist/shell/SettingRow.d.ts +9 -1
  437. package/dist/shell/SettingRow.js +1 -1
  438. package/dist/shell/SidebarLayout.js +1 -1
  439. package/dist/shell/SidebarNav.js +1 -1
  440. package/dist/shell/SortableList.js +1 -1
  441. package/dist/shell/StepChain.js +1 -1
  442. package/dist/shell/Stepper.js +1 -1
  443. package/dist/shell/TopNav.js +1 -1
  444. package/dist/shell/Tree.js +1 -1
  445. package/dist/telemetry/index.js +1 -1
  446. package/dist/templates/AuthScreen.js +1 -1
  447. package/dist/templates/ChatTemplate.js +1 -1
  448. package/dist/templates/CheckoutTemplate.js +1 -1
  449. package/dist/templates/DashboardTemplate.js +1 -1
  450. package/dist/templates/DataTablePage.js +1 -1
  451. package/dist/templates/EmailTemplate.js +1 -1
  452. package/dist/templates/FormLayoutPage.js +1 -1
  453. package/dist/ui/index.d.ts +3 -2
  454. package/dist/ui/index.js +1 -1
  455. package/dist/version.js +1 -1
  456. package/package.json +1 -1
  457. package/dist/Calculator-4JDJKSA7.js +0 -29
  458. package/dist/PdfViewer-67VBUIRD.js +0 -1
  459. package/dist/Sidebar-YB4OVUG5.js +0 -43
  460. package/dist/chunk-367OG4UV.js +0 -5
  461. package/dist/chunk-3JJFBUK6.js +0 -3
  462. package/dist/chunk-4AXJIJDC.js +0 -14
  463. package/dist/chunk-AS4CTEZD.js +0 -8
  464. package/dist/chunk-E4Z5OXBI.js +0 -1
  465. package/dist/chunk-GSS4E7X3.js +0 -1
  466. package/dist/chunk-PNGL4ZW2.js +0 -6
  467. package/dist/chunk-QWPFFWUG.js +0 -29
  468. package/dist/chunk-R3XAXBYV.js +0 -1
  469. package/dist/chunk-STA76WXF.js +0 -2
  470. package/dist/chunk-W7S56JZ7.js +0 -7
  471. package/dist/chunk-WZNGOA4Z.js +0 -1
  472. package/dist/chunk-X7XJBK2E.js +0 -14
  473. package/dist/chunk-ZLXLHKE5.js +0 -19
  474. package/dist/names-DYWfNBkN.d.ts +0 -21
  475. /package/dist/{chunk-2HDDCXTW.js → chunk-EHPZIBOL.js} +0 -0
  476. /package/dist/{chunk-WYHRPXEX.js → chunk-KJRYEKQP.js} +0 -0
package/README.md CHANGED
@@ -657,6 +657,17 @@ children carry `--rosh-tb-size`, `--rosh-tb-steps`, `--rosh-tb-color-col` and
657
657
  through `windows`, can point at their buttons. Being a size container, it
658
658
  takes its width from where it is put: in a shrink-to-fit place, give it one.
659
659
 
660
+ **One alignment vocabulary.** The four directions are one table, exported
661
+ from `efficient-shell/ui`, and the toolbar's alignment group draws from it:
662
+ `TEXT_ALIGNS` (`left` · `center` · `right` · `justify`, in reading order),
663
+ `TEXT_ALIGN_ICONS` (each direction's meaning in the icon set),
664
+ `textAlignWords(strings)` (the words, from the shell's `textToolbar`
665
+ strings), and `textAlignOptions(allow, labels?)`, the options for the subset
666
+ a host can honour, always in the table's order, in `Segmented`'s option shape.
667
+ `TEXT_ALIGN_FIT` and `textAlignFit(options)` say how wide a strip's words are
668
+ for the drop-to-glyphs rule (English measured, other words estimated on the
669
+ generous side). There is no `inherit`: an empty value presses nothing.
670
+
660
671
  ### Popovers
661
672
 
662
673
  `Popover` is a button and the panel it opens, right under it, for anything
@@ -1633,7 +1644,7 @@ All exports are named — `import { Modal, ... } from 'efficient-shell'`.
1633
1644
  | `TimelineTrack` | The time axis both timelines are drawn on, and the reason they look and move alike rather than merely similar. A 6 px rail with a fill, a **date ruler** (month ticks always, week ticks where they clear 14 px, a month label only where it clears 72 px of the last one), dots whose shape and glyph say what kind of event they are — every one of them in the theme accent at its 600 step, the colour a primary `Button` wears, so a shape survives the greyscale print and the colour-blind reader that a hue never did, and one of two label strategies: `labels="lanes"` packs them into two rows and folds runs of the same kind into `×N` pills, `labels="active"` draws the one label a scrubber needs, `labels="none"` draws none — the bare rail, where an item's `caption` is the only text near its mark, the edge captions flank the rail on its own row, and the `pending` things are one dashed cap past a dashed tail rather than a column. `axis="compressed"` CUTS any stretch holding more than 30% of the window's time down to a fixed notch with a break glyph saying how many days it hides, and shares the rest of the track proportionally; `axis="linear"` keeps time proportional throughout; `axis="spread"` cuts nothing and keeps the 48 px floor, the idle stretches paying for it in proportion. `highlightKeys` lights one band from the leftmost named mark to the rightmost and every mark inside it; `onHoverChange` reports the mark under the pointer or the focus. A `provisional` item is hollow, never current, and outside the fill. `endMark` puts a hollow, dashed mark ON a bare rail's right edge for a day the window already runs to — an estimate, a contractual date — with the label and the date in its popover. An optional `thumb` turns it into a scrubber: give it `stops` and it becomes discrete — a drag follows the pointer but snaps to the nearest stop as it goes, arrows step stop to stop, and `valueText` says which one for a screen reader. An optional `playback` then drives that thumb along the rail by itself: the caller owns the button and the `playing` flag, the track owns the travel, because the distance between two stops is a distance in **pixels of its axis** and nobody outside knows how wide the track is. It is paced by that distance — 350 ms per 100 px, clamped to 450–1400 ms, eased in and out — so a compressed `//` notch costs 48 px of travel like any other 48 px instead of swallowing the glide, and the date chip, read back through the axis's inverse mapping, skips exactly the days the notch hides. `onArrive(key, ms)` fires on arrival and never mid-travel; the thumb then rests 700 ms before setting off again. The timing is the **wall clock**, not the frame rate: the rest is waited out on a timer and the travel is measured against the high-resolution timestamp each animation frame carries, so 700 ms is 700 ms on a throttled or occluded surface that hands out one frame a second instead of sixty — and a page that comes back after an idle stretch walks its backlog forward at one report per frame rather than announcing four at once. `onProgress({ fromKey, toKey, t, ms } | null)` hands out the in-flight position on every frame of a glide and `null` the moment there is none (arrival, pause, cancel, end, and a released drag), so a consumer can interpolate a table under the bar on the same eased `t` that places the disc; a drag reports the pointer's linear fraction between its two neighbouring stops. Flipping `playing` off freezes it where it is — keeping what is left of the rest rather than spending it — and flipping it back on carries on from there; taking hold of the thumb — a drag, a click, an arrow key — ends the playback through `onStop`. Under `prefers-reduced-motion` the walk stays, the travel goes, and `onProgress` only ever says `null`. Hovering a `×N` pill **magnifies** its stretch so the members can carry their own labels (or do it from code with `zoomRange`), and an item's `preview` fills the hover/focus popover with the document in miniature, with an "Open" footer that fires its `onOpen` — the popover has already drawn the mark's label and its date above the preview, so a consumer leaves both out of it. Also `markers` — each one free to name its own `glyph` where its kind's is not specific enough — `phases`, `edgeCaptions`, and a `pending` list for the things that have no date. Every mark takes its own pointer, including on a scrubber: the 24 px hit strip that makes a 6 px rail pressable runs UNDER the dots rather than over them, so hover, focus and click reach a report, an inspection or a shipment, while a press on the bare rail between two of them still starts a drag and a drag crossing a mark is not interrupted by it. No two marks are ever drawn on top of each other: a run whose centres are closer than one mark's width — of any kinds, folded or not — becomes ONE mark carrying `×N`, its kind's own shape and glyph where the run shares a kind and a neutral `×N` pill where it does not, named after every member it stands for. A pointer opens it: the axis magnifies around the run and each member is a mark again with its own popover, the same magnification a `×N` label pill asks for. A run that is all one DATE can never be opened — no magnification separates a coordinate from itself — so its popover lists every member with its date and its own preview instead. Folding is a drawing decision only: the thumb's stops, `onActivate` and playback all still see every mark. The marks are an `<ol>` with exactly one `aria-current="step"` and ONE tab stop — arrows traverse, Home/End jump, Enter/Space activates — and every tooltip and pill popover is hoverable, persistent and Escape-dismissible (WCAG 1.4.13). A popover is kept inside the track and inside the shell window that owns it (UI-11), the first day's mark included, and a mark carries no native `title` — its popover is the tooltip, on hover and on focus alike. Under a 320 px track it stops squeezing the axis and switches to a vertical variant. Motion is `rosh-tl-*` classes in `ui.css` behind one `prefers-reduced-motion` rule, replayed on every mount, total budget 600 ms. |
1634
1645
  | `ProductionTimeline` | The scrubbable production bar, drawn on `TimelineTrack` inside the shared timeline card: a sentence-case heading with the PO as its subject, the window and the lead time as meta, a Play **pill** on the right whose glyph follows its state, and a footer carrying the status line and legend chips drawn with the track's own glyphs — a shipment is a diamond with a truck in it and an inspection a disc with a flask, on the rail and in the chip alike, because every kind is painted in the one accent and the glyph is the only thing left to tell them apart. The thumb only ever rests on a date a report was filed on — drag it and it snaps report to report, arrow it and it steps one report at a time — so the bar never shows an estimate dressed as a fact. Press Play and it **travels** between them: a fresh press rewinds to the first report, the thumb reads each snapshot for 700 ms and then glides to the next with the date chip counting the days it crosses, and the status line under the bar changes on arrival rather than while it is on its way. Pausing freezes it mid-glide and pressing Play again carries on from exactly there; touching the thumb ends the playback and hands it back. The walk keeps time by the clock rather than by the frame rate, so an idle or throttled pane does not stretch it. `onScrubProgress` forwards the track's in-flight fraction — `{ fromKey, toKey, t, ms }` keyed by report id, `null` at a stop — which is how a consumer's items table moves WITH the thumb instead of jumping a whole report's worth of quantities when it lands; it is optional and undefined by default, so a caller that only reads the snapshot needs no change. `onPickReport` selects a report; the optional `onOpenReport` / `onOpenMarker` make the label above the thumb a real button that opens the document behind it. `reportLabel` names a report wherever the bar states its identity — the caption over the thumb, the popover header, each dot's accessible name, the slider's value text and the status line — and defaults to its own `progress_number`, while `resetLabel` replaces the whole of the `Back to …` button: together they are what lets a portal that must not print an internal document number run the same card. A report carries an optional `preview` for its hover/focus popover — the stage row it filed, the note attached to it — and `renderReportPreview` builds one for the reports that carry none, the convenience for a caller whose list arrives straight off an API; the report's own preview wins where both exist, and the popover prints the report number and the date itself. `useProductionTimeline(opts)` owns the slider state and the derived snapshot so the caller's items table and the bar read the same state; `STAGES` / `calcOverall` / `calcReportOverall` are the stage maths it shares with that table. **`variant="rail"`** is the bar alone, for a window whose own header already says what the order is: no card, no heading, no lead-time line, no label under the active report — every report, shipment, inspection and **invoice** (kind `invoice`, a disc with a receipt) is a dot with a popover — the thumb with its date chip, `Start` and `Est. done` flanking the rail, the estimated completion as a hollow mark on the right edge while it is still ahead, and under the rail one row: Play, the return button when the thumb has been moved, and the `<report> · date · N% overall · N pc in stock` line. The rail spreads the reports (the track's `spread` axis) rather than folding two a week apart into a `×2`. `onPlayStart` fires before the thumb moves, on a fresh run and on a resume, so a window that keeps the bar in view while its table shows something else can switch the table first. |
1635
1646
  | `MilestoneTimeline` | The static sibling, on the same `TimelineTrack` and in the same card: one dot per milestone on a date axis, no scrubber. `heading` and `subject` split the title from the record it is about (`Mould development` · **001F/1813**), and the meta line states when it started, how long it has run and how many milestones are dated. The axis **cuts** rather than squeezes: a stretch holding more than 30% of the window's time becomes a fixed notch with a break glyph saying how many days it hides, and every stretch that still keeps time gets at least 48 px. Labels are packed into **two lanes** by their **measured** width, and a run of same-kind revisions folds into one `DFM ×4` pill whose members keep their dots on the rail: hovering it magnifies that stretch until each member can carry its own label, a click pins the popover listing them, Escape closes it. A milestone carries an optional `glyph` (a `default` one that names `doc` is drawn as the signed drawing it is), a `preview` for the popover, and an `onOpen` that the popover's "Open" button fires — `onClick` selects the dot on the bar, `onOpen` opens the drawing behind it, and a card that declares only the first keeps its Open button because the footer falls back to it. Label and date are printed by the popover above the preview, so a consumer supplies neither. A milestone with **no date gets no position**, because the only position available would be a date the record does not have: it is listed beside the bar under "Not yet reached" (two rows, then a real `+N more` button) and takes no part in the range, the fill or a phase bracket. `phase` groups of 2+ get a bracket marking parallel work, the fill never runs past today, and today gets its dashed rule and tag even when it IS the right edge — the commonest case, because a programme with no finish date ends at today. **`variant="rail"`** is the bar alone, for a window whose stepper already names the stages: no card, no heading, no label under any dot — every milestone is a dot with a popover, a revision carries a two-character `caption` over its dot (`v3`; captions that would overprint collapse to `v1–v4`), `edgeCaptions` flank the rail on its own row (`{ start: 'Start', end: 'Ready' }`), nothing is cut (the `spread` axis: every stretch at least 48 px, the idle ones drawn short rather than notched), and what has not happened is one dashed **cap** at the end of a dashed tail — a real button announced as the last undated milestone, naming the rest in its popover. The stepper and the rail then point at each other: `highlightKeys` lights one soft band from the leftmost named milestone to the rightmost and every dot inside it (a single key rings one dot; the cap answers to the pending milestone's key), and `onHoverChange` reports the milestone under the pointer or the focus, `null` on leave. A `provisional` milestone — a sample ORDERED, drawn where the shipment will be — is hollow, never "where we are", and outside the fill. |
1636
- | `SettingRow` | One setting in a settings card: the name with its explanation stacked under it on the left, the control or value on the right (it never shrinks), and an optional body (`children`) that opens beneath behind its own line. Each row draws its own top line (`divider`) and padding, so rows stack in a card. One prop per slot: `label` (the name) and `value` (a control or a read-only fact). `size="compact"` is the editor-panel row (Lewis, final 2026-10-17): `icon` before the name; the name on one line, never wrapped; and at the right end the value, then a 24px reset slot drawn on EVERY row, empty until `action` (the Reset button) fills it, so every control in a group ends on one line. When the name and the control do not fit, the control drops under the name and still ends on that line. Number boxes in a compact row are one 80px box with the compact steppers, by default; a `Slider` takes the room from the name to its box (track at least 96px) or drops under the name. The default size draws what it always drew. Handles a value that is a control (`controlId` labels it), a read-only fact, a value nobody knows (an em dash in the faint ink, never an empty cell), and a `quiet` row nothing can write yet. A name over a field (children, no value) draws nothing on the right. `DescriptionList` is the record-detail neighbour and stays that. `showWhen` (with `values`, and `context` for where the row is) hides the row while the rule is false — see `ShowWhen` below. **The per-view state** (S7: V2 2026-10-09, D3 2026-10-12): `viewState="auto"` is a value never edited in the view on screen, worked out from the view above — an "auto" tag after the name, and every `InputNumber`, `Select` and `Slider` in the value wears the auto look (dashed edge, sunken ground, grey value) and is described as "auto" to a screen reader, from this one prop (a control's own `auto` wins; `useSettingAuto()` lets a host's own control follow it). `viewState="edited"` is a value set in this view: the kit's blue changed dot (`CountBadge dot tone="accent"`) after the name, heard as "Changed in this view". `readout` is the value's word ("1600px") with the control in `children`: it stays on the name line at the right in every row; where both do not fit, the name wraps between its words and a readout of several words gives way first; the hint goes under that line. |
1647
+ | `SettingRow` | One setting in a settings card: the name with its explanation stacked under it on the left, the control or value on the right (it never shrinks), and an optional body (`children`) that opens beneath behind its own line. Each row draws its own top line (`divider`) and padding, so rows stack in a card. One prop per slot: `label` (the name) and `value` (a control or a read-only fact). `size="compact"` is the editor-panel row (Lewis, final 2026-10-17): `icon` before the name; the name on one line, never wrapped; and at the right end the value, then a 24px reset slot drawn on EVERY row, empty until `action` (the Reset button) fills it, so every control in a group ends on one line. When the name and the control do not fit, the control drops under the name and still ends on that line. Number boxes in a compact row are one 80px box with the compact steppers, by default; a `Slider` takes the room from the name to its box (track at least 96px) or drops under the name. The default size draws what it always drew. Handles a value that is a control (`controlId` labels it; `labelId` puts an id on the name; in a compact row a `Switch` in the value with no name of its own takes the row's name by `aria-labelledby`, so the host names it once), a read-only fact, a value nobody knows (an em dash in the faint ink, never an empty cell), and a `quiet` row nothing can write yet. A name over a field (children, no value) draws nothing on the right. `DescriptionList` is the record-detail neighbour and stays that. `showWhen` (with `values`, and `context` for where the row is) hides the row while the rule is false — see `ShowWhen` below. **The per-view state** (S7: V2 2026-10-09, D3 2026-10-12): `viewState="auto"` is a value never edited in the view on screen, worked out from the view above — an "auto" tag after the name, and every `InputNumber`, `Select` and `Slider` in the value wears the auto look (dashed edge, sunken ground, grey value) and is described as "auto" to a screen reader, from this one prop (a control's own `auto` wins; `useSettingAuto()` lets a host's own control follow it). `viewState="edited"` is a value set in this view: the kit's blue changed dot (`CountBadge dot tone="accent"`) after the name, heard as "Changed in this view". `readout` is the value's word ("1600px") with the control in `children`: it stays on the name line at the right in every row; where both do not fit, the name wraps between its words and a readout of several words gives way first; the hint goes under that line. |
1637
1648
  | `SettingReset` | The ↺ in a `SettingRow`'s reset slot (`action`), passed while the value is edited in this view. `view="desktop"` (default): "Reset Padding", back to the site default. `view="tablet"` / `"phone"`: "Inherit parent layout for Padding", back to auto. `detail` says what it goes back to ("auto, 40px"), in its tooltip and description. The kit's 24px ghost `IconButton` with a 44 x 44 hit area that reaches 4px left (never over the value) and 16px right; a press calls `onReset` and moves focus to the row's own control. A host's right-click item on Tablet and Phone uses the same words: `strings.settingView.inheritParentLayout`, with a `PopupMenuItem` `description` second line. |
1638
1649
  | `Accordion` | Folds with a heading button each (`h3` by default, `level`). Two tiers: `tier="band"` (default) is a settings group, an edge-to-edge grey band one step darker than the panel (`--rosh-fold-band`, `--rosh-fold-band-hover`), title 16 / 600; `tier="row"` is a fold inside a group or a quiet fold in a portal form, no ground, title 14 / 500. Each item can carry an `icon` and, on a band, a `count` of changed settings (a pill, read as "2 changed"). The chevron points right when shut and down when open, in a 24px column that lines up with the settings rows' reset slot. |
1639
1650
  | `ShowWhen` / `isShown` / `ShowWhenRule` | The ONE rule for "show this settings row only when another setting has a value" (owner ruling 2026-10-17). The rule is data, never a function: `{ field: 'country_selector_enabled', is: true }`, `{ field, in: [...] }` (is one of), `{ field, set: true }` (holds anything: not `undefined`/`null`/`false`/blank/empty list; `0` counts), `default` for an unset field, a dotted `field` (`'source.slug'`), `{ context: 'parentType', in: ['Flex'] }` (where the row is, not what it stores), and `{ not }` / `{ all: [] }` / `{ any: [] }`. `isShown(rule, values, context)` is the only reader; `SettingRow`'s `showWhen` and the `<ShowWhen rule values>` wrapper both use it. A hidden row keeps its stored value — nothing here writes — and a rule it cannot read shows the row. |
@@ -4281,6 +4292,15 @@ import { AssistantChat } from 'efficient-shell/ai';
4281
4292
  which it does not send or clear). `initialQuestion` makes a NEW chat ask
4282
4293
  that question as it mounts, once; it is never sent over a restored
4283
4294
  `conversationId`. The admin portal's saved questions use all three.
4295
+ * **Rating answers.** With `onRate`, a finished answer the server named a run
4296
+ for (`run_id` on the stream's `finish` metadata, and on each answer of a
4297
+ restored thread, with the person's `rating`) gets thumbs up and down under
4298
+ it. A thumb is a toggle; a thumbs-down is saved at once and then offers an
4299
+ optional "what was wrong" note, saved again with it. The chat hands the host
4300
+ an `AssistantRateRequest` (`conversationId`, `runId`, `rating` — `null` when
4301
+ taken back) and saves nothing itself; a rejected promise shows
4302
+ `labels.rateFailed` and undoes the thumb. Without `onRate` no thumbs are
4303
+ drawn: the admin portal turns them on for JARVIS.
4284
4304
  * **Plans.** When the assistant needs two or more changes, the server sends a
4285
4305
  `data-plan` part (re-sent whole, same id, on every change). The chat pins it
4286
4306
  above the composer as a `StepChain` ("Plan: 2 of 3 done · in progress"):
@@ -4435,24 +4455,55 @@ Dev costs window first):
4435
4455
  <Icon name="brand-samsung" size={20} /> // the area of a 20 px square
4436
4456
  ```
4437
4457
 
4438
- `brand-1password`, `brand-amd`, `brand-anthropic`, `brand-apple`, `brand-aws`,
4439
- `brand-cloudflare`, `brand-dell`, `brand-github`, `brand-intel`,
4440
- `brand-nvidia`, `brand-samsung`: `BRAND_ICON_NAMES` lists them
4441
- (`BrandIconName`, `isBrandIconName`), and each is a single export too
4442
- (`BrandAwsIcon`). A mark is filled in one colour (`currentColor`, so it
4443
- follows the text and dark mode), has no other look, and no theme set redraws
4444
- it. Marks differ wildly in shape (Apple is taller than wide, Samsung's
4445
- wordmark six times wider than tall), so each is cropped to its own outline and
4446
- drawn at its own aspect with the **area** of a `size` square, not its height:
4458
+ `BRAND_ICON_NAMES` lists every mark (`BrandIconName`, `isBrandIconName`), and
4459
+ each is a single export too (`BrandAwsIcon`). The first eleven are Henry's
4460
+ (`brand-1password`, `brand-amd`, `brand-anthropic`, `brand-apple`,
4461
+ `brand-aws`, `brand-cloudflare`, `brand-dell`, `brand-github`, `brand-intel`,
4462
+ `brand-nvidia`, `brand-samsung`). The rest are every mark efficient-web-builder
4463
+ draws: the 57 marks of its Integrations grid (`brand-stripe`, `brand-xero`,
4464
+ `brand-googleanalytics` and the rest; a key is the Simple Icons slug, lowercase
4465
+ letters and digits only), and its footer's social marks
4466
+ (`brand-facebook`, `brand-instagram`, `brand-linkedin`, `brand-pinterest`,
4467
+ `brand-tiktok`, `brand-x`, `brand-youtube`, `brand-whatsapp`,
4468
+ `brand-telegram`, `brand-line`, `brand-wechat`).
4469
+
4470
+ A mark's default is the brand's own mark, filled in one colour (`currentColor`,
4471
+ so it follows the text and dark mode), and no theme set redraws it. Marks
4472
+ differ wildly in shape (Apple is taller than wide, Samsung's wordmark six times
4473
+ wider than tall), so each is cropped to its own outline and drawn at its own
4474
+ aspect with the **area** of a `size` square, not its height:
4447
4475
  `brandBox(size, aspect)` gives `height = max(5.5px, size × min(1/√aspect,
4448
4476
  1.1))` and `width = height × aspect`. The box is inline style, so a square
4449
4477
  sizing class (`h-4 w-4`) does not squash a wordmark; size a mark with `size`.
4450
4478
 
4451
- The paths are copied from [Simple Icons](https://simpleicons.org) 16.35.0
4452
- (`brand-aws` from 13.21.0, the last release that had it), CC0 1.0; every mark
4453
- is a trademark of its owner, shown only to name that owner's product. The
4454
- source, with each mark's file and version, is `src/icons/brands.json`; to add a
4455
- mark, add its entry there and run `npm run icons` (`scripts/icons/brands.mjs`).
4479
+ **The 11 social marks also have two looks**, the two the published footer
4480
+ offers a merchant: `outline` and `solid`. A look is drawn **square** at
4481
+ `size`, on Tabler's 24 grid, as the footer draws it:
4482
+
4483
+ ```tsx
4484
+ <Icon name="brand-x" /> // the default: X's own mark, sized by area
4485
+ <Icon name="brand-x" look="outline" size={20} /> // Tabler's outline, 20 px square, a 1.75 line
4486
+ <Icon name="brand-x" look="solid" size={20} /> // Tabler's filled mark, 20 px square
4487
+ ```
4488
+
4489
+ The looks register with the set's other looks (`registerIconSet(efficientLooks)`
4490
+ from `efficient-shell/icons/sets`) and are single exports of
4491
+ `efficient-shell/icons/efficient-looks` too (`BrandXOutlineIcon`,
4492
+ `BrandXSolidIcon`). Any other mark asked for a look draws its default, as every
4493
+ meaning does.
4494
+
4495
+ The default paths are copied from [Simple Icons](https://simpleicons.org):
4496
+ 16.35.0 for the first eleven (`brand-aws` from 13.21.0, the last release that
4497
+ had it), 16.34.0 for web-builder's marks (the release its lockfile draws), CC0
4498
+ 1.0. Simple Icons has no LinkedIn, so `brand-linkedin`'s default is Tabler's
4499
+ filled mark, cropped and sized the same way. The looks are
4500
+ [Tabler](https://tabler.io/icons) 3.49.0's drawings (MIT), as
4501
+ `@tabler/icons-react` draws them; Tabler has no filled Telegram, LINE or
4502
+ WeChat, so those three solids are web-builder's own drawings on Tabler's
4503
+ outline geometry. Every mark is a trademark of its owner, shown only to name
4504
+ that owner's product. The source, with each mark's and each look's file and
4505
+ version, is `src/icons/brands.json`; to add a mark, add its entry there and run
4506
+ `npm run icons` (`scripts/icons/brands.mjs`).
4456
4507
 
4457
4508
  | Import | Holds | Use it for | Needs |
4458
4509
  |---|---|---|---|
@@ -274,8 +274,8 @@ SOFTWARE.
274
274
 
275
275
  The brand marks in the `efficient` icon set (the `brand-*` meanings,
276
276
  `BrandAwsIcon` and the rest; source `src/icons/brands.json`) are copied from
277
- simple-icons 16.35.0, and `brand-aws` from simple-icons 13.21.0
278
- (https://github.com/simple-icons/simple-icons). The drawings are dedicated to
277
+ simple-icons 16.35.0 and 16.34.0 (each mark names its release), and `brand-aws`
278
+ from simple-icons 13.21.0 (https://github.com/simple-icons/simple-icons). The drawings are dedicated to
279
279
  the public domain under CC0 1.0 Universal
280
280
  (https://creativecommons.org/publicdomain/zero/1.0/). Each mark is a trademark
281
281
  of its owner; it is shown only to name that owner's product, and implies no
@@ -362,6 +362,15 @@ SOFTWARE.
362
362
  The drawings in the `tabler` icon set (`efficient-shell/icons/tabler`, the Ocean
363
363
  theme's) are copied from @tabler/icons 3.48.0 (https://github.com/tabler/tabler-icons).
364
364
 
365
+ The looks of the social brand marks in the `efficient` icon set (`outline` and
366
+ `solid` of `brand-facebook`, `brand-x` and the rest, `BrandXOutlineIcon` and the
367
+ like; source `src/icons/brands.json`), and the default drawing of
368
+ `brand-linkedin`, are copied from @tabler/icons 3.49.0. Three of them, the solid
369
+ looks of `brand-telegram`, `brand-line` and `brand-wechat`, are drawn by
370
+ Efficient on the geometry of Tabler's outline marks. Each mark is a trademark
371
+ of its owner; it is shown only to name that owner's product, and implies no
372
+ endorsement.
373
+
365
374
  MIT License
366
375
 
367
376
  Copyright (c) 2020-2026 Paweł Kuna
@@ -1,29 +1,29 @@
1
- import{peekBrowserStartUrl as e,claimBrowserStartUrl as t}from"./chunk-LWLCNQY7.js";import{AboutApp as o}from"./chunk-WFWDABGV.js";import{WindowTitle as r}from"./chunk-L3NYH4QV.js";import"./chunk-CY5N5OA3.js";import"./chunk-AW7TOB6N.js";import"./chunk-KNUR2UEG.js";import"./chunk-JDCM2VHG.js";import"./chunk-HVX37PKU.js";import"./chunk-5A7MWTXX.js";import"./chunk-Y53KNQKL.js";import"./chunk-FL2PUQX7.js";import{confirm as n}from"./chunk-ZN3O2KJ7.js";import"./chunk-YCQVEJOT.js";import"./chunk-KC3EX26K.js";import"./chunk-VWGWZY7A.js";import"./chunk-PKXQDCNR.js";import"./chunk-UGTRSRIW.js";import"./chunk-XWLWG4HS.js";import"./chunk-CDAJKLGL.js";import"./chunk-D323R2FT.js";import"./chunk-R3XAXBYV.js";import"./chunk-PJCVNFWM.js";import"./chunk-QR4RM7PO.js";import"./chunk-5QFPTDQF.js";import"./chunk-4IU5BSVE.js";import"./chunk-K7U4RWXJ.js";import"./chunk-VH6GB73Q.js";import{Icon as a}from"./chunk-KIBL6M3T.js";import"./chunk-J75ZT2JQ.js";import"./chunk-Q5MD3VY6.js";import"./chunk-MRJKZWWV.js";import"./chunk-6KO5VTL7.js";import"./chunk-22S6LG6D.js";import"./chunk-PGN5ME7B.js";import"./chunk-62LW225J.js";import"./chunk-GLUJS42B.js";import"./chunk-D65T4H6J.js";import"./chunk-DTJRIWFR.js";import"./chunk-TWVUQUUD.js";import"./chunk-E6UCGCOC.js";import"./chunk-C3QOHMR6.js";import{useRef as s,useEffect as i,useState as l}from"react";import{jsxs as c,jsx as m,Fragment as u}from"react/jsx-runtime";var d="react-os-shell:browser-bookmarks",h="react-os-shell:browser-homepage",p="https://en.wikipedia.org/wiki/Main_Page",g=[{label:"Wikipedia",url:"https://en.wikipedia.org/wiki/Main_Page"},{label:"DevDocs",url:"https://devdocs.io"},{label:"Example",url:"https://example.com"}],b=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 k(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&&b.has(t[2].toLowerCase())}(t)?"https://"+t:"https://duckduckgo.com/?q="+encodeURIComponent(t):""}var f=["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 x(){if("undefined"==typeof window)return g;try{const e=localStorage.getItem(d);if(!e)return g;const t=JSON.parse(e);if(Array.isArray(t)&&t.every(e=>"string"==typeof e?.url))return t}catch{}return g}function w(){return"undefined"==typeof window?p:localStorage.getItem(h)||p}function y(){const u=s(void 0);void 0===u.current&&(u.current=e()),i(()=>{null!=u.current&&t(u.current)},[]);const p=u.current?k(u.current.url):"",[g,b]=l(w),[f,y]=l(p||g),[j,C]=l(f),[W,R]=l([f]),[z,L]=l(0),[S,D]=l(0),[T,U]=l(x),[E,K]=l(!1),[G,J]=l(null),H=s(null),O=s(null);i(()=>{try{localStorage.setItem(d,JSON.stringify(T))}catch{}},[T]);const Q=e=>{const t=k(e);t&&(y(t),C(t),R(e=>{const o=e.slice(0,z+1);return o.push(t),o}),L(e=>e+1),K(!1))},V=()=>{"undefined"!=typeof window&&window.open(f,"_blank","noopener,noreferrer")},M=()=>{const e=G?.trim();e?(U(t=>[...t,{label:e,url:f}]),J(null)):J(null)};i(()=>{if(null===G)return;H.current?.focus(),H.current?.select();const e=e=>{const t=e.target;t?.closest("[data-bookmark-popover]")||J(null)},t=setTimeout(()=>document.addEventListener("mousedown",e),0);return()=>{clearTimeout(t),document.removeEventListener("mousedown",e)}},[null!==G]);const P=e=>{U(t=>t.filter((t,o)=>o!==e))},X=z>0,B=z<W.length-1,F=T.some(e=>e.url===f),A="p-2 rounded hover:bg-gray-200 transition-colors text-gray-600 disabled:opacity-30";/* @__PURE__ */
1
+ import{peekBrowserStartUrl as e,claimBrowserStartUrl as t}from"./chunk-LWLCNQY7.js";import{AboutApp as o}from"./chunk-4RNF6MNW.js";import{WindowTitle as r}from"./chunk-2AHHM4SK.js";import"./chunk-CY5N5OA3.js";import"./chunk-AW7TOB6N.js";import"./chunk-KNUR2UEG.js";import"./chunk-JDCM2VHG.js";import"./chunk-SEXLHFMR.js";import"./chunk-5A7MWTXX.js";import"./chunk-Y53KNQKL.js";import"./chunk-EW6FRPFJ.js";import{confirm as n}from"./chunk-2WL3Q7VW.js";import"./chunk-TW6WYYBC.js";import"./chunk-VWGWZY7A.js";import"./chunk-PKXQDCNR.js";import"./chunk-4GVH4ZUH.js";import"./chunk-UGTRSRIW.js";import"./chunk-CDAJKLGL.js";import"./chunk-D323R2FT.js";import"./chunk-KC3EX26K.js";import"./chunk-BZMZTPS6.js";import"./chunk-FKZEGBLK.js";import"./chunk-5QFPTDQF.js";import"./chunk-QR4RM7PO.js";import"./chunk-4IU5BSVE.js";import"./chunk-K7U4RWXJ.js";import{Icon as a}from"./chunk-2SHYR3RA.js";import"./chunk-J75ZT2JQ.js";import"./chunk-VH6GB73Q.js";import"./chunk-Q5MD3VY6.js";import"./chunk-MRJKZWWV.js";import"./chunk-6KO5VTL7.js";import"./chunk-22S6LG6D.js";import"./chunk-PGN5ME7B.js";import"./chunk-62LW225J.js";import"./chunk-GLUJS42B.js";import"./chunk-D65T4H6J.js";import"./chunk-DTJRIWFR.js";import"./chunk-TWVUQUUD.js";import"./chunk-E6UCGCOC.js";import"./chunk-C3QOHMR6.js";import{useRef as s,useEffect as i,useState as l}from"react";import{jsxs as c,jsx as m,Fragment as u}from"react/jsx-runtime";var d="react-os-shell:browser-bookmarks",h="react-os-shell:browser-homepage",p="https://en.wikipedia.org/wiki/Main_Page",g=[{label:"Wikipedia",url:"https://en.wikipedia.org/wiki/Main_Page"},{label:"DevDocs",url:"https://devdocs.io"},{label:"Example",url:"https://example.com"}],b=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 k(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&&b.has(t[2].toLowerCase())}(t)?"https://"+t:"https://duckduckgo.com/?q="+encodeURIComponent(t):""}var f=["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 x(){if("undefined"==typeof window)return g;try{const e=localStorage.getItem(d);if(!e)return g;const t=JSON.parse(e);if(Array.isArray(t)&&t.every(e=>"string"==typeof e?.url))return t}catch{}return g}function w(){return"undefined"==typeof window?p:localStorage.getItem(h)||p}function y(){const u=s(void 0);void 0===u.current&&(u.current=e()),i(()=>{null!=u.current&&t(u.current)},[]);const p=u.current?k(u.current.url):"",[g,b]=l(w),[f,y]=l(p||g),[j,C]=l(f),[W,R]=l([f]),[z,L]=l(0),[S,E]=l(0),[T,D]=l(x),[H,U]=l(!1),[K,G]=l(null),M=s(null),F=s(null);i(()=>{try{localStorage.setItem(d,JSON.stringify(T))}catch{}},[T]);const J=e=>{const t=k(e);t&&(y(t),C(t),R(e=>{const o=e.slice(0,z+1);return o.push(t),o}),L(e=>e+1),U(!1))},O=()=>{"undefined"!=typeof window&&window.open(f,"_blank","noopener,noreferrer")},Q=()=>{const e=K?.trim();e?(D(t=>[...t,{label:e,url:f}]),G(null)):G(null)};i(()=>{if(null===K)return;M.current?.focus(),M.current?.select();const e=e=>{const t=e.target;t?.closest("[data-bookmark-popover]")||G(null)},t=setTimeout(()=>document.addEventListener("mousedown",e),0);return()=>{clearTimeout(t),document.removeEventListener("mousedown",e)}},[null!==K]);const B=e=>{D(t=>t.filter((t,o)=>o!==e))},P=z>0,A=z<W.length-1,V=T.some(e=>e.url===f),I="p-2 rounded hover:bg-gray-200 transition-colors text-gray-600 disabled:opacity-30";/* @__PURE__ */
2
2
  return c("div",{className:"relative flex flex-col h-full bg-white",children:[
3
3
  /* @__PURE__ */m(r,{title:`Browser - ${v(f)}`}),
4
4
  /* @__PURE__ */m(o,{app:"browser"}),
5
5
  /* @__PURE__ */c("div",{className:"flex items-center gap-1 px-2 py-2 border-b border-gray-200 bg-gray-50 shrink-0",children:[
6
- /* @__PURE__ */m("button",{onClick:()=>{if(z>0){const e=z-1;L(e),y(W[e]),C(W[e]),K(!1)}},disabled:!X,className:A,title:"Back",children:/* @__PURE__ */m(a,{name:"chevron-left",className:"h-4 w-4",strokeWidth:2})}),
7
- /* @__PURE__ */m("button",{onClick:()=>{if(z<W.length-1){const e=z+1;L(e),y(W[e]),C(W[e]),K(!1)}},disabled:!B,className:A,title:"Forward",children:/* @__PURE__ */m(a,{name:"chevron-right",className:"h-4 w-4",strokeWidth:2})}),
8
- /* @__PURE__ */m("button",{onClick:()=>D(e=>e+1),className:A,title:"Refresh",children:/* @__PURE__ */m(a,{name:"refresh",className:"h-4 w-4",strokeWidth:1.8})}),
9
- /* @__PURE__ */m("button",{onClick:()=>Q(g),className:A,title:"Home",children:/* @__PURE__ */m(a,{name:"home",className:"h-4 w-4",strokeWidth:1.8})}),
10
- /* @__PURE__ */m("form",{onSubmit:e=>{e.preventDefault(),Q(j)},className:"flex-1 flex items-center mx-1",children:/* @__PURE__ */c("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:[
6
+ /* @__PURE__ */m("button",{onClick:()=>{if(z>0){const e=z-1;L(e),y(W[e]),C(W[e]),U(!1)}},disabled:!P,className:I,title:"Back",children:/* @__PURE__ */m(a,{name:"chevron-left",className:"h-4 w-4",strokeWidth:2})}),
7
+ /* @__PURE__ */m("button",{onClick:()=>{if(z<W.length-1){const e=z+1;L(e),y(W[e]),C(W[e]),U(!1)}},disabled:!A,className:I,title:"Forward",children:/* @__PURE__ */m(a,{name:"chevron-right",className:"h-4 w-4",strokeWidth:2})}),
8
+ /* @__PURE__ */m("button",{onClick:()=>E(e=>e+1),className:I,title:"Refresh",children:/* @__PURE__ */m(a,{name:"refresh",className:"h-4 w-4",strokeWidth:1.8})}),
9
+ /* @__PURE__ */m("button",{onClick:()=>J(g),className:I,title:"Home",children:/* @__PURE__ */m(a,{name:"home",className:"h-4 w-4",strokeWidth:1.8})}),
10
+ /* @__PURE__ */m("form",{onSubmit:e=>{e.preventDefault(),J(j)},className:"flex-1 flex items-center mx-1",children:/* @__PURE__ */c("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__ */m("span",{className:"px-2 text-gray-400 text-xs",children:f.startsWith("https://")?"🔒":"⚠️"}),
12
12
  /* @__PURE__ */m("input",{type:"text",value:j,onChange:e=>C(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…"}),f!==j&&/* @__PURE__ */m("button",{type:"button",onClick:()=>C(f),className:"px-2 text-2xs text-gray-400 hover:text-gray-700",title:"Reset to current URL",children:"×"})]})}),
13
- /* @__PURE__ */m("button",{"data-bookmark-popover":!0,onClick:()=>F?P(T.findIndex(e=>e.url===f)):void J(v(f)),className:A+" "+(F?"text-yellow-500":""),title:F?"Remove bookmark":"Add bookmark",children:/* @__PURE__ */m(a,{name:"star",className:"h-4 w-4",fill:F?"currentColor":"none",strokeWidth:1.5})}),
14
- /* @__PURE__ */m("button",{onClick:V,className:A,title:"Open in new tab",children:/* @__PURE__ */m(a,{name:"external",className:"h-4 w-4",strokeWidth:1.5})}),
15
- /* @__PURE__ */m("button",{onClick:()=>K(e=>!e),className:A,title:"Embedding help",children:/* @__PURE__ */m(a,{name:"help",className:"h-4 w-4",strokeWidth:1.5})})]}),null!==G&&/* @__PURE__ */c("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:[
13
+ /* @__PURE__ */m("button",{"data-bookmark-popover":!0,onClick:()=>V?B(T.findIndex(e=>e.url===f)):void G(v(f)),className:I+" "+(V?"text-yellow-500":""),title:V?"Remove bookmark":"Add bookmark",children:/* @__PURE__ */m(a,{name:"star",className:"h-4 w-4",fill:V?"currentColor":"none",strokeWidth:1.5})}),
14
+ /* @__PURE__ */m("button",{onClick:O,className:I,title:"Open in new tab",children:/* @__PURE__ */m(a,{name:"external",className:"h-4 w-4",strokeWidth:1.5})}),
15
+ /* @__PURE__ */m("button",{onClick:()=>U(e=>!e),className:I,title:"Embedding help",children:/* @__PURE__ */m(a,{name:"help",className:"h-4 w-4",strokeWidth:1.5})})]}),null!==K&&/* @__PURE__ */c("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__ */m("div",{className:"text-2xs font-semibold uppercase tracking-wide text-gray-500 mb-1",children:"Bookmark this page"}),
17
17
  /* @__PURE__ */m("div",{className:"text-2xs text-gray-400 truncate mb-2 font-mono",title:f,children:f}),
18
- /* @__PURE__ */m("input",{ref:H,type:"text",value:G,onChange:e=>J(e.target.value),onKeyDown:e=>{"Enter"===e.key?M():"Escape"===e.key&&J(null)},placeholder:"Name",className:"w-full text-sm px-2 h-8 border border-gray-300 rounded focus:outline-none focus:border-blue-400 focus:ring-1 focus:ring-blue-200"}),
18
+ /* @__PURE__ */m("input",{ref:M,type:"text",value:K,onChange:e=>G(e.target.value),onKeyDown:e=>{"Enter"===e.key?Q():"Escape"===e.key&&G(null)},placeholder:"Name",className:"w-full text-sm px-2 h-8 border border-gray-300 rounded focus:outline-none focus:border-blue-400 focus:ring-1 focus:ring-blue-200"}),
19
19
  /* @__PURE__ */c("div",{className:"flex justify-end gap-1 mt-2",children:[
20
- /* @__PURE__ */m("button",{onClick:()=>J(null),className:"px-2 py-1 text-xs text-gray-600 hover:bg-gray-100 rounded",children:"Cancel"}),
21
- /* @__PURE__ */m("button",{onClick:M,disabled:!G.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__ */c("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===T.length&&/* @__PURE__ */m("span",{className:"text-2xs text-gray-400 italic px-2",children:"No bookmarks yet — star the address bar to add one."}),T.map((e,t)=>/* @__PURE__ */c("button",{onClick:()=>Q(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-2 px-2 py-0.5 rounded text-xs text-gray-700 hover:bg-gray-100 whitespace-nowrap",title:`${e.url}\n(right-click to remove)`,children:[
20
+ /* @__PURE__ */m("button",{onClick:()=>G(null),className:"px-2 py-1 text-xs text-gray-600 hover:bg-gray-100 rounded",children:"Cancel"}),
21
+ /* @__PURE__ */m("button",{onClick:Q,disabled:!K.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__ */c("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===T.length&&/* @__PURE__ */m("span",{className:"text-2xs text-gray-400 italic px-2",children:"No bookmarks yet — star the address bar to add one."}),T.map((e,t)=>/* @__PURE__ */c("button",{onClick:()=>J(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"})&&B(t)},className:"flex items-center gap-2 px-2 py-0.5 rounded text-xs text-gray-700 hover:bg-gray-100 whitespace-nowrap",title:`${e.url}\n(right-click to remove)`,children:[
23
23
  /* @__PURE__ */m("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__ */m("div",{className:"flex-1"}),
25
25
  /* @__PURE__ */m("button",{onClick:()=>{b(f);try{localStorage.setItem(h,f)}catch{}},className:"px-2 py-0.5 text-2xs text-gray-500 hover:text-gray-800",title:"Set current page as homepage",children:"Set as home"})]}),
26
- /* @__PURE__ */m("div",{className:"flex-1 relative min-h-0 bg-gray-50",children:/* @__PURE__ */m(N,{url:f,iframeKey:S,iframeRef:O,openExternal:V,showHelp:E,dismissHelp:()=>K(!1)})})]})}function v(e){try{return new URL(e).hostname.replace(/^www\./,"")}catch{return e}}function N({url:e,iframeKey:t,iframeRef:o,openExternal:r,showHelp:n,dismissHelp:s}){const[d,h]=l(!1);i(()=>{h(!1)},[e]);return function(e){try{const t=new URL(e).hostname.toLowerCase();return f.some(e=>t===e||t.endsWith("."+e))}catch{return!1}}(e)&&!d?/* @__PURE__ */m("div",{className:"absolute inset-0 flex items-center justify-center bg-white p-8",children:/* @__PURE__ */c("div",{className:"max-w-md text-center",children:[
26
+ /* @__PURE__ */m("div",{className:"flex-1 relative min-h-0 bg-gray-50",children:/* @__PURE__ */m(N,{url:f,iframeKey:S,iframeRef:F,openExternal:O,showHelp:H,dismissHelp:()=>U(!1)})})]})}function v(e){try{return new URL(e).hostname.replace(/^www\./,"")}catch{return e}}function N({url:e,iframeKey:t,iframeRef:o,openExternal:r,showHelp:n,dismissHelp:s}){const[d,h]=l(!1);i(()=>{h(!1)},[e]);return function(e){try{const t=new URL(e).hostname.toLowerCase();return f.some(e=>t===e||t.endsWith("."+e))}catch{return!1}}(e)&&!d?/* @__PURE__ */m("div",{className:"absolute inset-0 flex items-center justify-center bg-white p-8",children:/* @__PURE__ */c("div",{className:"max-w-md text-center",children:[
27
27
  /* @__PURE__ */m(a,{name:"no-symbol",className:"h-14 w-14 mx-auto text-gray-300 mb-3",strokeWidth:1.2}),
28
28
  /* @__PURE__ */c("h3",{className:"text-base font-semibold text-gray-800 mb-1",children:[v(e)," can't be embedded"]}),
29
29
  /* @__PURE__ */c("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-5OX6KXWY.js";import{useWidgetSettings as n}from"./chunk-2AHHM4SK.js";import"./chunk-CY5N5OA3.js";import"./chunk-AW7TOB6N.js";import"./chunk-KNUR2UEG.js";import"./chunk-JDCM2VHG.js";import"./chunk-SEXLHFMR.js";import"./chunk-5A7MWTXX.js";import"./chunk-Y53KNQKL.js";import"./chunk-EW6FRPFJ.js";import"./chunk-2WL3Q7VW.js";import"./chunk-TW6WYYBC.js";import"./chunk-VWGWZY7A.js";import"./chunk-PKXQDCNR.js";import"./chunk-4GVH4ZUH.js";import"./chunk-UGTRSRIW.js";import"./chunk-CDAJKLGL.js";import"./chunk-D323R2FT.js";import"./chunk-KC3EX26K.js";import"./chunk-FKZEGBLK.js";import"./chunk-5QFPTDQF.js";import"./chunk-QR4RM7PO.js";import"./chunk-4IU5BSVE.js";import"./chunk-K7U4RWXJ.js";import{Icon as r}from"./chunk-2SHYR3RA.js";import"./chunk-J75ZT2JQ.js";import"./chunk-VH6GB73Q.js";import"./chunk-Q5MD3VY6.js";import"./chunk-MRJKZWWV.js";import"./chunk-6KO5VTL7.js";import"./chunk-22S6LG6D.js";import"./chunk-PGN5ME7B.js";import"./chunk-62LW225J.js";import"./chunk-GLUJS42B.js";import"./chunk-D65T4H6J.js";import"./chunk-DTJRIWFR.js";import"./chunk-TWVUQUUD.js";import"./chunk-E6UCGCOC.js";import"./chunk-C3QOHMR6.js";import{useState as c,useRef as i,useCallback as l,useEffect as o}from"react";import{jsxs as s,Fragment as a,jsx as u}from"react/jsx-runtime";var h="calc_appearance";function m(){const[m,k]=c("0"),[p,d]=c(null),[b,g]=c(null),[j,N]=c(!1),[y,x]=c(""),[f,C]=c([]),[v,$]=c(!1),[W,E]=c(()=>e(h)),[R,T]=c(!1),[S,w]=c(W),K=i(null);n(l(()=>{w({...W}),T(!0)},[W]));const F=l(e=>{x(""),k(t=>j||"0"===t?(N(!1),"."===e?"0.":e):"."===e&&t.includes(".")?t:t+e)},[j]),L=l(()=>{k("0"),d(null),g(null),N(!1)},[]),D=l((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}},[]),G=l(e=>{const t=parseFloat(m);if(null!==p&&b&&!j){const e=D(p,t,b);k(String(e)),d(e),C(n=>[`${p} ${b} ${t} = ${e}`,...n].slice(0,20))}else d(t);g(e),N(!0)},[m,p,b,j,D]),J=l(()=>{if(null===p||!b)return;const e=parseFloat(m),t=D(p,e,b),n=`${p} ${b} ${e} =`;C(e=>[`${n} ${t}`,...e].slice(0,20)),x(n),k(String(t)),d(null),g(null),N(!0)},[m,p,b,D]),U=l(()=>{k(e=>String(parseFloat(e)/100))},[]),A=l(()=>{k(e=>e.startsWith("-")?e.slice(1):"0"===e?e:"-"+e)},[]);o(()=>{const e=e=>{const t=e.target.tagName;"INPUT"!==t&&"TEXTAREA"!==t&&"SELECT"!==t&&(e.key>="0"&&e.key<="9"?F(e.key):"."===e.key?F("."):"+"===e.key?G("+"):"-"===e.key?G("-"):"*"===e.key?G("×"):"/"===e.key?(e.preventDefault(),G("÷")):"Enter"===e.key||"="===e.key?("Enter"===e.key&&e.target instanceof Node&&K.current?.contains(e.target)&&e.preventDefault(),J()):"Escape"===e.key?L():"Backspace"===e.key?k(e=>e.length>1?e.slice(0,-1):"0"):"%"===e.key&&U())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[F,G,J,L,U]);const Q="flex items-center justify-center rounded-lg text-sm font-medium transition-colors",B=`${Q} bg-white border border-gray-200 text-gray-900 hover:bg-gray-50 active:bg-gray-100`,H=`${Q} bg-blue-50 border border-blue-200 text-blue-700 hover:bg-blue-100 active:bg-blue-200`,M=`${Q} bg-gray-100 border border-gray-200 text-gray-600 hover:bg-gray-200 active:bg-gray-300`,V=`${Q} bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800`;/* @__PURE__ */
2
+ return s(a,{children:[
3
+ /* @__PURE__ */s("div",{ref:K,className:"flex flex-col h-full",style:{opacity:W.activeOpacity/100,backdropFilter:W.activeBlur>0?`blur(${W.activeBlur}px)`:void 0},children:[
4
+ /* @__PURE__ */s("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__ */u("div",{className:"flex flex-col justify-end flex-1 overflow-hidden",children:f.slice(0,3).reverse().map((e,t)=>/* @__PURE__ */u("div",{className:"text-2xs text-slate-400 text-right font-mono truncate",children:e},t))}),(y||b&&null!==p)&&/* @__PURE__ */u("div",{className:"text-base text-slate-600 text-right font-mono",children:y||`${p} ${b} ${j?"":m}`}),
6
+ /* @__PURE__ */s("div",{className:"flex items-center gap-2",children:[
7
+ /* @__PURE__ */u("button",{onClick:()=>{navigator.clipboard.writeText(m),$(!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__ */u(r,v?{name:"check",className:"h-5 w-5 text-green-500",strokeWidth:2}:{name:"copy",className:"h-5 w-5",strokeWidth:2})}),
8
+ /* @__PURE__ */u("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)})(m)})]})]}),
9
+ /* @__PURE__ */s("div",{className:"grid grid-cols-4 grid-rows-5 gap-2 flex-1 min-h-0 p-2",children:[
10
+ /* @__PURE__ */u("button",{onClick:L,className:M,children:"AC"}),
11
+ /* @__PURE__ */u("button",{onClick:A,className:M,children:"+/−"}),
12
+ /* @__PURE__ */u("button",{onClick:U,className:M,children:"%"}),
13
+ /* @__PURE__ */u("button",{onClick:()=>G("÷"),className:`${H} ${"÷"===b?"ring-2 ring-blue-400":""}`,children:"÷"}),
14
+ /* @__PURE__ */u("button",{onClick:()=>F("7"),className:B,children:"7"}),
15
+ /* @__PURE__ */u("button",{onClick:()=>F("8"),className:B,children:"8"}),
16
+ /* @__PURE__ */u("button",{onClick:()=>F("9"),className:B,children:"9"}),
17
+ /* @__PURE__ */u("button",{onClick:()=>G("×"),className:`${H} ${"×"===b?"ring-2 ring-blue-400":""}`,children:"×"}),
18
+ /* @__PURE__ */u("button",{onClick:()=>F("4"),className:B,children:"4"}),
19
+ /* @__PURE__ */u("button",{onClick:()=>F("5"),className:B,children:"5"}),
20
+ /* @__PURE__ */u("button",{onClick:()=>F("6"),className:B,children:"6"}),
21
+ /* @__PURE__ */u("button",{onClick:()=>G("-"),className:`${H} ${"-"===b?"ring-2 ring-blue-400":""}`,children:"−"}),
22
+ /* @__PURE__ */u("button",{onClick:()=>F("1"),className:B,children:"1"}),
23
+ /* @__PURE__ */u("button",{onClick:()=>F("2"),className:B,children:"2"}),
24
+ /* @__PURE__ */u("button",{onClick:()=>F("3"),className:B,children:"3"}),
25
+ /* @__PURE__ */u("button",{onClick:()=>G("+"),className:`${H} ${"+"===b?"ring-2 ring-blue-400":""}`,children:"+"}),
26
+ /* @__PURE__ */u("button",{onClick:()=>F("0"),className:`${B} col-span-2`,children:"0"}),
27
+ /* @__PURE__ */u("button",{onClick:()=>F("."),className:B,children:"."}),
28
+ /* @__PURE__ */u("button",{onClick:J,className:V,children:"="})]})]}),
29
+ /* @__PURE__ */u(t,{open:R,onClose:()=>T(!1),title:"Calculator Settings",appearance:S,onAppearanceChange:w,onSave:()=>{E(S),localStorage.setItem(h,JSON.stringify(S)),T(!1)}})]})}export{m as default};
@@ -1,21 +1,21 @@
1
- import{loadAppearance as t,WidgetSettingsModal as e}from"./chunk-KNVE7CMS.js";import{useWidgetSettings as r}from"./chunk-L3NYH4QV.js";import"./chunk-CY5N5OA3.js";import"./chunk-AW7TOB6N.js";import"./chunk-KNUR2UEG.js";import"./chunk-JDCM2VHG.js";import"./chunk-HVX37PKU.js";import"./chunk-5A7MWTXX.js";import"./chunk-Y53KNQKL.js";import"./chunk-FL2PUQX7.js";import"./chunk-ZN3O2KJ7.js";import"./chunk-YCQVEJOT.js";import"./chunk-KC3EX26K.js";import"./chunk-VWGWZY7A.js";import"./chunk-PKXQDCNR.js";import"./chunk-UGTRSRIW.js";import"./chunk-XWLWG4HS.js";import"./chunk-CDAJKLGL.js";import"./chunk-D323R2FT.js";import"./chunk-PJCVNFWM.js";import"./chunk-QR4RM7PO.js";import"./chunk-5QFPTDQF.js";import"./chunk-4IU5BSVE.js";import"./chunk-K7U4RWXJ.js";import"./chunk-VH6GB73Q.js";import"./chunk-KIBL6M3T.js";import"./chunk-J75ZT2JQ.js";import{LoadingSpinner as n}from"./chunk-Q5MD3VY6.js";import"./chunk-MRJKZWWV.js";import"./chunk-6KO5VTL7.js";import"./chunk-22S6LG6D.js";import"./chunk-PGN5ME7B.js";import"./chunk-62LW225J.js";import"./chunk-GLUJS42B.js";import"./chunk-D65T4H6J.js";import"./chunk-DTJRIWFR.js";import"./chunk-TWVUQUUD.js";import"./chunk-E6UCGCOC.js";import"./chunk-C3QOHMR6.js";import{useState as s,useCallback as a,useEffect as o}from"react";import{jsxs as c,Fragment as i,jsx as l}from"react/jsx-runtime";var m=["USD","CNY","AUD","GBP","EUR","JPY","CAD","THB","NZD","SGD","HKD","CHF","KRW","INR","MXN","BRL"],u=[["USD","CNY"],["USD","AUD"],["GBP","USD"],["USD","JPY"]],p="currency_pairs",h="currency_appearance",d="currency_rates_cache";function g(t){try{const e=JSON.parse(localStorage.getItem(d)||"{}")[t];if(e&&Date.now()-e.timestamp<36e5)return e.rates}catch{}return null}function k(t,e){try{const r=JSON.parse(localStorage.getItem(d)||"{}");r[t]={rates:e,timestamp:Date.now()},localStorage.setItem(d,JSON.stringify(r))}catch{}}function N(){try{const t=JSON.parse(localStorage.getItem(p)||"");if(Array.isArray(t)&&t.length)return t.slice(0,4)}catch{}return u}var f={USD:"🇺🇸",CNY:"🇨🇳",AUD:"🇦🇺",GBP:"🇬🇧",JPY:"🇯🇵",CAD:"🇨🇦",EUR:"🇪🇺",THB:"🇹🇭",NZD:"🇳🇿",SGD:"🇸🇬",HKD:"🇭🇰",CHF:"🇨🇭",KRW:"🇰🇷",INR:"🇮🇳",MXN:"🇲🇽",BRL:"🇧🇷"};function j(){const[u,d]=s(N),[j,y]=s(()=>t(h)),[x,b]=s({}),[S,D]=s(!1),[C,v]=s(!1),[U,J]=s([]),[R,K]=s(j),[L,W]=s("USD"),[B,G]=s("CNY");r(a(()=>{J([...u]),K({...j}),v(!0)},[u,j])),o(()=>{const t=[...new Set(u.map(([t])=>t))];let e=!0;return async function(){D(!0);const r={};for(const e of t){const t=g(e);if(t)r[e]=t;else try{const t=await fetch(`https://open.er-api.com/v6/latest/${e}`),n=await t.json();n.rates&&(r[e]=n.rates,k(e,n.rates))}catch{}}e&&(b(r),D(!1))}(),()=>{e=!1}},[u]);/* @__PURE__ */
1
+ import{loadAppearance as t,WidgetSettingsModal as e}from"./chunk-5OX6KXWY.js";import{useWidgetSettings as r}from"./chunk-2AHHM4SK.js";import"./chunk-CY5N5OA3.js";import"./chunk-AW7TOB6N.js";import"./chunk-KNUR2UEG.js";import"./chunk-JDCM2VHG.js";import"./chunk-SEXLHFMR.js";import"./chunk-5A7MWTXX.js";import"./chunk-Y53KNQKL.js";import"./chunk-EW6FRPFJ.js";import"./chunk-2WL3Q7VW.js";import"./chunk-TW6WYYBC.js";import"./chunk-VWGWZY7A.js";import"./chunk-PKXQDCNR.js";import"./chunk-4GVH4ZUH.js";import"./chunk-UGTRSRIW.js";import"./chunk-CDAJKLGL.js";import"./chunk-D323R2FT.js";import"./chunk-KC3EX26K.js";import"./chunk-FKZEGBLK.js";import"./chunk-5QFPTDQF.js";import"./chunk-QR4RM7PO.js";import"./chunk-4IU5BSVE.js";import"./chunk-K7U4RWXJ.js";import"./chunk-2SHYR3RA.js";import"./chunk-J75ZT2JQ.js";import"./chunk-VH6GB73Q.js";import{LoadingSpinner as n}from"./chunk-Q5MD3VY6.js";import"./chunk-MRJKZWWV.js";import"./chunk-6KO5VTL7.js";import"./chunk-22S6LG6D.js";import"./chunk-PGN5ME7B.js";import"./chunk-62LW225J.js";import"./chunk-GLUJS42B.js";import"./chunk-D65T4H6J.js";import"./chunk-DTJRIWFR.js";import"./chunk-TWVUQUUD.js";import"./chunk-E6UCGCOC.js";import"./chunk-C3QOHMR6.js";import{useState as s,useCallback as a,useEffect as o}from"react";import{jsxs as c,Fragment as i,jsx as l}from"react/jsx-runtime";var m=["USD","CNY","AUD","GBP","EUR","JPY","CAD","THB","NZD","SGD","HKD","CHF","KRW","INR","MXN","BRL"],u=[["USD","CNY"],["USD","AUD"],["GBP","USD"],["USD","JPY"]],p="currency_pairs",h="currency_appearance",d="currency_rates_cache";function g(t){try{const e=JSON.parse(localStorage.getItem(d)||"{}")[t];if(e&&Date.now()-e.timestamp<36e5)return e.rates}catch{}return null}function k(t,e){try{const r=JSON.parse(localStorage.getItem(d)||"{}");r[t]={rates:e,timestamp:Date.now()},localStorage.setItem(d,JSON.stringify(r))}catch{}}function f(){try{const t=JSON.parse(localStorage.getItem(p)||"");if(Array.isArray(t)&&t.length)return t.slice(0,4)}catch{}return u}var j={USD:"🇺🇸",CNY:"🇨🇳",AUD:"🇦🇺",GBP:"🇬🇧",JPY:"🇯🇵",CAD:"🇨🇦",EUR:"🇪🇺",THB:"🇹🇭",NZD:"🇳🇿",SGD:"🇸🇬",HKD:"🇭🇰",CHF:"🇨🇭",KRW:"🇰🇷",INR:"🇮🇳",MXN:"🇲🇽",BRL:"🇧🇷"};function N(){const[u,d]=s(f),[N,y]=s(()=>t(h)),[x,b]=s({}),[S,D]=s(!1),[v,C]=s(!1),[R,U]=s([]),[J,W]=s(N),[K,B]=s("USD"),[G,L]=s("CNY");r(a(()=>{U([...u]),W({...N}),C(!0)},[u,N])),o(()=>{const t=[...new Set(u.map(([t])=>t))];let e=!0;return async function(){D(!0);const r={};for(const e of t){const t=g(e);if(t)r[e]=t;else try{const t=await fetch(`https://open.er-api.com/v6/latest/${e}`),n=await t.json();n.rates&&(r[e]=n.rates,k(e,n.rates))}catch{}}e&&(b(r),D(!1))}(),()=>{e=!1}},[u]);/* @__PURE__ */
2
2
  return c(i,{children:[
3
- /* @__PURE__ */l("div",{style:{backgroundColor:`rgb(var(--taskbar-bg-rgb, 243 244 246) / ${j.activeOpacity/100})`,backdropFilter:j.activeBlur>0?`blur(${j.activeBlur}px)`:void 0},children:/* @__PURE__ */c("div",{className:"px-4 py-3 space-y-1",children:[S&&/* @__PURE__ */l(n,{size:"sm",padding:"py-4",label:"Loading rates"}),u.map(([t,e],r)=>{const n=x[t]?.[e];/* @__PURE__ */
3
+ /* @__PURE__ */l("div",{style:{backgroundColor:`rgb(var(--taskbar-bg-rgb, 243 244 246) / ${N.activeOpacity/100})`,backdropFilter:N.activeBlur>0?`blur(${N.activeBlur}px)`:void 0},children:/* @__PURE__ */c("div",{className:"px-4 py-3 space-y-1",children:[S&&/* @__PURE__ */l(n,{size:"sm",padding:"py-4",label:"Loading rates"}),u.map(([t,e],r)=>{const n=x[t]?.[e];/* @__PURE__ */
4
4
  return c("button",{onClick:()=>{const t=u.map((t,e)=>e===r?[t[1],t[0]]:t);d(t),localStorage.setItem(p,JSON.stringify(t))},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:[
5
5
  /* @__PURE__ */c("div",{className:"flex items-center gap-2",children:[
6
- /* @__PURE__ */l("span",{className:"text-base",children:f[t]||""}),
6
+ /* @__PURE__ */l("span",{className:"text-base",children:j[t]||""}),
7
7
  /* @__PURE__ */l("span",{className:"text-sm font-semibold text-gray-700",children:t}),
8
8
  /* @__PURE__ */l("svg",{className:"h-3 w-3 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:/* @__PURE__ */l("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4"})}),
9
- /* @__PURE__ */l("span",{className:"text-base",children:f[e]||""}),
9
+ /* @__PURE__ */l("span",{className:"text-base",children:j[e]||""}),
10
10
  /* @__PURE__ */l("span",{className:"text-sm font-semibold text-gray-700",children:e})]}),
11
11
  /* @__PURE__ */l("div",{className:"text-base font-mono font-semibold text-gray-900 tabular-nums",children:null!=n?n.toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:4}):"—"})]},`${t}-${e}-${r}`)})]})}),
12
- /* @__PURE__ */l(e,{open:C,onClose:()=>v(!1),title:"Currency Settings",appearance:R,onAppearanceChange:K,onSave:()=>{if(0===U.length)return;const t=U.slice(0,4);d(t),y(R),localStorage.setItem(p,JSON.stringify(t)),localStorage.setItem(h,JSON.stringify(R)),v(!1)},children:/* @__PURE__ */c("div",{children:[
12
+ /* @__PURE__ */l(e,{open:v,onClose:()=>C(!1),title:"Currency Settings",appearance:J,onAppearanceChange:W,onSave:()=>{if(0===R.length)return;const t=R.slice(0,4);d(t),y(J),localStorage.setItem(p,JSON.stringify(t)),localStorage.setItem(h,JSON.stringify(J)),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
- /* @__PURE__ */c("span",{className:"text-2xs font-normal text-gray-400",children:["(",U.length,"/",4,")"]})]}),
15
- /* @__PURE__ */l("div",{className:"space-y-1 mb-2",children:U.map(([t,e],r)=>/* @__PURE__ */c("div",{className:"flex items-center justify-between py-1 px-2 bg-gray-50 rounded",children:[
16
- /* @__PURE__ */c("span",{className:"text-sm",children:[f[t]||""," ",t," → ",f[e]||""," ",e]}),
17
- /* @__PURE__ */l("button",{onClick:()=>J(t=>t.filter((t,e)=>e!==r)),className:"text-red-400 hover:text-red-600",children:"×"})]},r))}),U.length<4?/* @__PURE__ */c("div",{className:"flex items-center gap-2",children:[
18
- /* @__PURE__ */l("select",{value:L,onChange:t=>W(t.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:m.map(t=>/* @__PURE__ */l("option",{children:t},t))}),
14
+ /* @__PURE__ */c("span",{className:"text-2xs font-normal text-gray-400",children:["(",R.length,"/",4,")"]})]}),
15
+ /* @__PURE__ */l("div",{className:"space-y-1 mb-2",children:R.map(([t,e],r)=>/* @__PURE__ */c("div",{className:"flex items-center justify-between py-1 px-2 bg-gray-50 rounded",children:[
16
+ /* @__PURE__ */c("span",{className:"text-sm",children:[j[t]||""," ",t," → ",j[e]||""," ",e]}),
17
+ /* @__PURE__ */l("button",{onClick:()=>U(t=>t.filter((t,e)=>e!==r)),className:"text-red-400 hover:text-red-600",children:"×"})]},r))}),R.length<4?/* @__PURE__ */c("div",{className:"flex items-center gap-2",children:[
18
+ /* @__PURE__ */l("select",{value:K,onChange:t=>B(t.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:m.map(t=>/* @__PURE__ */l("option",{children:t},t))}),
19
19
  /* @__PURE__ */l("span",{className:"text-gray-400",children:"→"}),
20
- /* @__PURE__ */l("select",{value:B,onChange:t=>G(t.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:m.map(t=>/* @__PURE__ */l("option",{children:t},t))}),
21
- /* @__PURE__ */l("button",{onClick:()=>{L!==B&&U.length<4&&J(t=>[...t,[L,B]])},className:"text-sm font-medium text-blue-600 hover:text-blue-800 px-2",children:"+ Add"})]}):/* @__PURE__ */c("p",{className:"text-2xs text-gray-400 italic",children:["Max ",4," pairs — remove one to add another."]})]})})]})}export{j as default};
20
+ /* @__PURE__ */l("select",{value:G,onChange:t=>L(t.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:m.map(t=>/* @__PURE__ */l("option",{children:t},t))}),
21
+ /* @__PURE__ */l("button",{onClick:()=>{K!==G&&R.length<4&&U(t=>[...t,[K,G]])},className:"text-sm font-medium text-blue-600 hover:text-blue-800 px-2",children:"+ Add"})]}):/* @__PURE__ */c("p",{className:"text-2xs text-gray-400 italic",children:["Max ",4," pairs — remove one to add another."]})]})})]})}export{N as default};
@@ -1,14 +1,14 @@
1
- import{escapeHtml as e}from"./chunk-G6DKCCWH.js";import{AboutApp as t}from"./chunk-WFWDABGV.js";import{WindowTitle as n}from"./chunk-L3NYH4QV.js";import"./chunk-CY5N5OA3.js";import"./chunk-AW7TOB6N.js";import"./chunk-KNUR2UEG.js";import"./chunk-JDCM2VHG.js";import"./chunk-HVX37PKU.js";import"./chunk-5A7MWTXX.js";import"./chunk-Y53KNQKL.js";import"./chunk-FL2PUQX7.js";import"./chunk-ZN3O2KJ7.js";import"./chunk-YCQVEJOT.js";import"./chunk-KC3EX26K.js";import"./chunk-VWGWZY7A.js";import"./chunk-PKXQDCNR.js";import{toast_default as r}from"./chunk-4NXMMWL6.js";import"./chunk-UGTRSRIW.js";import"./chunk-XWLWG4HS.js";import"./chunk-CDAJKLGL.js";import"./chunk-D323R2FT.js";import"./chunk-R3XAXBYV.js";import{PopupMenu as o,PopupMenuLabel as i,PopupMenuItem as l,PopupMenuDivider as a}from"./chunk-PJCVNFWM.js";import"./chunk-QR4RM7PO.js";import"./chunk-5QFPTDQF.js";import"./chunk-4IU5BSVE.js";import"./chunk-K7U4RWXJ.js";import"./chunk-VH6GB73Q.js";import{Icon as s}from"./chunk-KIBL6M3T.js";import"./chunk-J75ZT2JQ.js";import{LoadingSpinner as c}from"./chunk-Q5MD3VY6.js";import"./chunk-MRJKZWWV.js";import"./chunk-6KO5VTL7.js";import"./chunk-22S6LG6D.js";import"./chunk-PGN5ME7B.js";import"./chunk-62LW225J.js";import"./chunk-GLUJS42B.js";import"./chunk-D65T4H6J.js";import"./chunk-DTJRIWFR.js";import"./chunk-TWVUQUUD.js";import"./chunk-E6UCGCOC.js";import"./chunk-C3QOHMR6.js";import{useState as m,useRef as d}from"react";import{jsxs as h,jsx as u}from"react/jsx-runtime";var p=/* @__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"]),g=/* @__PURE__ */new Set(["docx"]),x={filename:"Untitled",kind:"docx",content:"",ext:"docx"};function f(){const[f,y]=m(x),[k,v]=m(!1),[b,w]=m(!1),[j,N]=m(!1),[C,D]=m(null),L=d(null),M=d(null),U=d(null),W=(e,t)=>{U.current?.focus(),document.execCommand(e,!1,t),N(!0)},R=e=>{for(const t of e){if(!t.type.startsWith("image/"))continue;const e=new FileReader;e.onload=()=>{U.current?.focus(),document.execCommand("insertImage",!1,String(e.result)),N(!0)},e.readAsDataURL(t)}},T=e=>{C&&(C.el.removeAttribute("width"),C.el.removeAttribute("height"),C.el.style.width=e??"",C.el.style.height=e?"auto":"",N(!0),D(null))},B=async t=>{const n=(t.name.split(".").pop()||"").toLowerCase();v(!0);try{if(p.has(n)||!g.has(n)&&t.type.startsWith("text/")){const r=await t.text(),o=e(r).replace(/\n/g,"<br>");y({filename:t.name,kind:"text",content:o,ext:n}),N(!1)}else if(g.has(n))try{const e=await(import(
1
+ import{escapeHtml as e}from"./chunk-G6DKCCWH.js";import{AboutApp as t}from"./chunk-4RNF6MNW.js";import{WindowTitle as n}from"./chunk-2AHHM4SK.js";import"./chunk-CY5N5OA3.js";import"./chunk-AW7TOB6N.js";import"./chunk-KNUR2UEG.js";import"./chunk-JDCM2VHG.js";import"./chunk-SEXLHFMR.js";import"./chunk-5A7MWTXX.js";import"./chunk-Y53KNQKL.js";import"./chunk-EW6FRPFJ.js";import"./chunk-2WL3Q7VW.js";import"./chunk-TW6WYYBC.js";import"./chunk-VWGWZY7A.js";import"./chunk-PKXQDCNR.js";import{toast_default as r}from"./chunk-4NXMMWL6.js";import"./chunk-4GVH4ZUH.js";import"./chunk-UGTRSRIW.js";import"./chunk-CDAJKLGL.js";import"./chunk-D323R2FT.js";import"./chunk-KC3EX26K.js";import"./chunk-BZMZTPS6.js";import{PopupMenu as o,PopupMenuLabel as i,PopupMenuItem as l,PopupMenuDivider as a}from"./chunk-FKZEGBLK.js";import"./chunk-5QFPTDQF.js";import"./chunk-QR4RM7PO.js";import"./chunk-4IU5BSVE.js";import"./chunk-K7U4RWXJ.js";import{Icon as s}from"./chunk-2SHYR3RA.js";import"./chunk-J75ZT2JQ.js";import"./chunk-VH6GB73Q.js";import{LoadingSpinner as c}from"./chunk-Q5MD3VY6.js";import"./chunk-MRJKZWWV.js";import"./chunk-6KO5VTL7.js";import"./chunk-22S6LG6D.js";import"./chunk-PGN5ME7B.js";import"./chunk-62LW225J.js";import"./chunk-GLUJS42B.js";import"./chunk-D65T4H6J.js";import"./chunk-DTJRIWFR.js";import"./chunk-TWVUQUUD.js";import"./chunk-E6UCGCOC.js";import"./chunk-C3QOHMR6.js";import{useState as m,useRef as d}from"react";import{jsxs as h,jsx as u}from"react/jsx-runtime";var p=/* @__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"]),g=/* @__PURE__ */new Set(["docx"]),x={filename:"Untitled",kind:"docx",content:"",ext:"docx"};function f(){const[f,y]=m(x),[k,v]=m(!1),[b,w]=m(!1),[j,N]=m(!1),[C,D]=m(null),L=d(null),M=d(null),R=d(null),W=(e,t)=>{R.current?.focus(),document.execCommand(e,!1,t),N(!0)},U=e=>{for(const t of e){if(!t.type.startsWith("image/"))continue;const e=new FileReader;e.onload=()=>{R.current?.focus(),document.execCommand("insertImage",!1,String(e.result)),N(!0)},e.readAsDataURL(t)}},T=e=>{C&&(C.el.removeAttribute("width"),C.el.removeAttribute("height"),C.el.style.width=e??"",C.el.style.height=e?"auto":"",N(!0),D(null))},B=async t=>{const n=(t.name.split(".").pop()||"").toLowerCase();v(!0);try{if(p.has(n)||!g.has(n)&&t.type.startsWith("text/")){const r=await t.text(),o=e(r).replace(/\n/g,"<br>");y({filename:t.name,kind:"text",content:o,ext:n}),N(!1)}else if(g.has(n))try{const e=await(import(
2
2
  /* @vite-ignore */
3
- "mammoth")),r=await t.arrayBuffer(),o=await e.convertToHtml({arrayBuffer:r});y({filename:t.name,kind:"docx",content:o.value||"<p><em>(empty document)</em></p>",ext:n}),N(!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{v(!1)}},O=f?.filename?(A=f.filename).length>24?`${A.slice(0,23)}…`:A:"Untitled";var A;/* @__PURE__ */
4
- return h("div",{className:"relative flex flex-col h-full",onDragOver:e=>{e.preventDefault(),b||w(!0)},onDragLeave:e=>{e.currentTarget===e.target&&w(!1)},onDrop:e=>{e.preventDefault(),w(!1);const t=Array.from(e.dataTransfer.files??[]);0!==t.length&&(t.every(e=>e.type.startsWith("image/"))?R(t):B(t[0]))},children:[
5
- /* @__PURE__ */u(n,{title:`${O}${j?" •":""} - Documents`}),
3
+ "mammoth")),r=await t.arrayBuffer(),o=await e.convertToHtml({arrayBuffer:r});y({filename:t.name,kind:"docx",content:o.value||"<p><em>(empty document)</em></p>",ext:n}),N(!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{v(!1)}},S=f?.filename?(A=f.filename).length>24?`${A.slice(0,23)}…`:A:"Untitled";var A;/* @__PURE__ */
4
+ return h("div",{className:"relative flex flex-col h-full",onDragOver:e=>{e.preventDefault(),b||w(!0)},onDragLeave:e=>{e.currentTarget===e.target&&w(!1)},onDrop:e=>{e.preventDefault(),w(!1);const t=Array.from(e.dataTransfer.files??[]);0!==t.length&&(t.every(e=>e.type.startsWith("image/"))?U(t):B(t[0]))},children:[
5
+ /* @__PURE__ */u(n,{title:`${S}${j?" •":""} - Documents`}),
6
6
  /* @__PURE__ */u(t,{app:"documents"}),
7
7
  /* @__PURE__ */h("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
8
  /* @__PURE__ */u("input",{ref:L,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&&B(t),L.current&&(L.current.value="")},className:"hidden"}),
9
9
  /* @__PURE__ */h("button",{onClick:()=>L.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__ */u(s,{name:"folder-open",className:"h-3.5 w-3.5",strokeWidth:1.5}),"Open"]}),
11
- /* @__PURE__ */u("button",{onClick:()=>{if(!f)return;const t=U.current?.innerHTML??"";if("text"===f.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(f.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=`${f.filename.replace(/\.[^.]+$/,"")}.html`,o.click(),URL.revokeObjectURL(r)}else{const e=U.current?.innerText??"",t=new Blob([e],{type:"text/plain"}),n=URL.createObjectURL(t),r=document.createElement("a");r.href=n,r.download=f.filename,r.click(),URL.revokeObjectURL(n)}}else{const n=new Blob([`<!doctype html><meta charset="utf-8"><title>${e(f.filename)}</title>${t}`],{type:"text/html"}),r=URL.createObjectURL(n),o=document.createElement("a");o.href=r,o.download=`${f.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"}),
11
+ /* @__PURE__ */u("button",{onClick:()=>{if(!f)return;const t=R.current?.innerHTML??"";if("text"===f.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(f.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=`${f.filename.replace(/\.[^.]+$/,"")}.html`,o.click(),URL.revokeObjectURL(r)}else{const e=R.current?.innerText??"",t=new Blob([e],{type:"text/plain"}),n=URL.createObjectURL(t),r=document.createElement("a");r.href=n,r.download=f.filename,r.click(),URL.revokeObjectURL(n)}}else{const n=new Blob([`<!doctype html><meta charset="utf-8"><title>${e(f.filename)}</title>${t}`],{type:"text/html"}),r=URL.createObjectURL(n),o=document.createElement("a");o.href=r,o.download=`${f.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__ */u("span",{className:"text-2xs text-gray-400 ml-1",children:"TXT · DOCX · Code"}),
13
13
  /* @__PURE__ */u("div",{className:"h-4 w-px bg-gray-300 mx-1"}),
14
14
  /* @__PURE__ */h("span",{className:"text-xs font-medium text-gray-700 truncate max-w-[200px]",title:f.filename,children:[f.filename,j?" •":""]}),
@@ -38,10 +38,10 @@ return h("div",{className:"relative flex flex-col h-full",onDragOver:e=>{e.preve
38
38
  /* @__PURE__ */u("button",{onMouseDown:e=>e.preventDefault(),onClick:()=>W("justifyRight"),className:"px-2 py-1 rounded text-gray-700 hover:bg-gray-200 transition-colors",title:"Align right",children:/* @__PURE__ */u("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:/* @__PURE__ */u("path",{strokeLinecap:"round",d:"M3.75 6h16.5M10.5 12h9.75M6 18h14.25"})})}),
39
39
  /* @__PURE__ */u("button",{onMouseDown:e=>e.preventDefault(),onClick:()=>W("justifyFull"),className:"px-2 py-1 rounded text-gray-700 hover:bg-gray-200 transition-colors",title:"Justify",children:/* @__PURE__ */u("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:/* @__PURE__ */u("path",{strokeLinecap:"round",d:"M3.75 6h16.5M3.75 12h16.5M3.75 18h16.5"})})})]}),
40
40
  /* @__PURE__ */u("div",{className:"h-4 w-px bg-gray-300 mx-1"}),
41
- /* @__PURE__ */u("input",{ref:M,type:"file",accept:"image/*",multiple:!0,className:"hidden",onChange:e=>{e.target.files?.length&&R(Array.from(e.target.files)),M.current&&(M.current.value="")}}),
41
+ /* @__PURE__ */u("input",{ref:M,type:"file",accept:"image/*",multiple:!0,className:"hidden",onChange:e=>{e.target.files?.length&&U(Array.from(e.target.files)),M.current&&(M.current.value="")}}),
42
42
  /* @__PURE__ */h("button",{onClick:()=>M.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__ */u(s,{name:"image",className:"h-3.5 w-3.5",strokeWidth:1.5}),"Image"]})]}),
44
- /* @__PURE__ */u("div",{className:"flex-1 min-h-0 overflow-hidden",children:k?/* @__PURE__ */u(c,{size:"sm",padding:"",className:"h-full",label:"Loading"}):/* @__PURE__ */u("div",{className:"h-full overflow-auto "+("docx"===f.kind?"bg-gray-100 px-6 py-8":"bg-white"),children:/* @__PURE__ */u("div",{ref:U,contentEditable:!0,suppressContentEditableWarning:!0,spellCheck:!1,onInput:()=>N(!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(),R(t))},onClick:e=>{const t=e.target;"IMG"===t.tagName&&(e.preventDefault(),D({x:e.clientX,y:e.clientY,el:t}))},dangerouslySetInnerHTML:{__html:f.content},className:"docx"===f.kind?"docs-editor mx-auto w-[8.5in] min-h-[11in] bg-white p-[1in] shadow text-sm 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-sm leading-relaxed text-gray-800 bg-white outline-none whitespace-pre-wrap"})})}),b&&/* @__PURE__ */u("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__ */u("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"})}),C&&/* @__PURE__ */h(o,{minWidth:150,style:{left:C.x,top:C.y},onClose:()=>D(null),children:[
44
+ /* @__PURE__ */u("div",{className:"flex-1 min-h-0 overflow-hidden",children:k?/* @__PURE__ */u(c,{size:"sm",padding:"",className:"h-full",label:"Loading"}):/* @__PURE__ */u("div",{className:"h-full overflow-auto "+("docx"===f.kind?"bg-gray-100 px-6 py-8":"bg-white"),children:/* @__PURE__ */u("div",{ref:R,contentEditable:!0,suppressContentEditableWarning:!0,spellCheck:!1,onInput:()=>N(!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(),D({x:e.clientX,y:e.clientY,el:t}))},dangerouslySetInnerHTML:{__html:f.content},className:"docx"===f.kind?"docs-editor mx-auto w-[8.5in] min-h-[11in] bg-white p-[1in] shadow text-sm 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-sm leading-relaxed text-gray-800 bg-white outline-none whitespace-pre-wrap"})})}),b&&/* @__PURE__ */u("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__ */u("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"})}),C&&/* @__PURE__ */h(o,{minWidth:150,style:{left:C.x,top:C.y},onClose:()=>D(null),children:[
45
45
  /* @__PURE__ */u(i,{children:"Image width"}),
46
46
  /* @__PURE__ */u(l,{onClick:()=>T("25%"),children:"25%"}),
47
47
  /* @__PURE__ */u(l,{onClick:()=>T("50%"),children:"50%"}),