efficient-shell 9.1.0 → 9.9.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 (451) hide show
  1. package/README.md +70 -20
  2. package/dist/Browser-ZPOVP4Z7.js +43 -0
  3. package/dist/Calculator-CSYRZAS5.js +29 -0
  4. package/dist/CurrencyConverter-SSR2XDIC.js +21 -0
  5. package/dist/{Documents-BOVXZFYC.js → Documents-T7JYO223.js} +27 -27
  6. package/dist/Files-HBGW3JWI.js +88 -0
  7. package/dist/Notepad-GO2QT55C.js +25 -0
  8. package/dist/PdfViewer-XSISAJZP.js +1 -0
  9. package/dist/{PomodoroTimer-ZCJBTFV5.js → PomodoroTimer-EV6D4OFU.js} +28 -28
  10. package/dist/Preview-Z2CRCDHA.js +177 -0
  11. package/dist/Sidebar-Y4DTQYW2.js +43 -0
  12. package/dist/Spreadsheet-GEE77GD3.js +37 -0
  13. package/dist/Stock-6ZIQHGPH.js +16 -0
  14. package/dist/Weather-II7NFRMK.js +60 -0
  15. package/dist/WorldClock-NBLNO63Q.js +32 -0
  16. package/dist/ai/index.d.ts +34 -3
  17. package/dist/ai/index.js +53 -53
  18. package/dist/ai.css +1 -1
  19. package/dist/apps/index.js +1 -1
  20. package/dist/bin/media-host-check.js +1 -1
  21. package/dist/bin/ui-check.js +1 -1
  22. package/dist/brand.css +1 -1
  23. package/dist/charts/BoxPlotChart.js +1 -1
  24. package/dist/charts/CandlestickChart.js +1 -1
  25. package/dist/charts/CartesianPlot.js +1 -1
  26. package/dist/charts/ChartBrush.js +1 -1
  27. package/dist/charts/ChartFrame.js +1 -1
  28. package/dist/charts/ChartSkeleton.js +1 -1
  29. package/dist/charts/ChartTooltip.js +1 -1
  30. package/dist/charts/ChordChart.js +1 -1
  31. package/dist/charts/ColumnChart.js +1 -1
  32. package/dist/charts/FunnelChart.js +1 -1
  33. package/dist/charts/HeatmapChart.js +1 -1
  34. package/dist/charts/HistogramChart.js +1 -1
  35. package/dist/charts/Meter.js +1 -1
  36. package/dist/charts/PieChart.js +1 -1
  37. package/dist/charts/RadarChart.js +1 -1
  38. package/dist/charts/RadialBarChart.js +1 -1
  39. package/dist/charts/RangeChart.js +1 -1
  40. package/dist/charts/RankedBars.js +1 -1
  41. package/dist/charts/SankeyChart.js +1 -1
  42. package/dist/charts/ScatterChart.js +1 -1
  43. package/dist/charts/SpecChart.js +1 -1
  44. package/dist/charts/StatTile.js +1 -1
  45. package/dist/charts/SunburstChart.js +1 -1
  46. package/dist/charts/TimeSeriesChart.js +1 -1
  47. package/dist/charts/TreemapChart.js +1 -1
  48. package/dist/charts/WaterfallChart.js +1 -1
  49. package/dist/chunk-24K6GVNM.js +28 -0
  50. package/dist/{chunk-ZEKM6HAA.js → chunk-2HEJDLPP.js} +2 -2
  51. package/dist/{chunk-BRHIRE4D.js → chunk-2MLRK7IO.js} +2 -2
  52. package/dist/chunk-2R3BVU75.js +26 -0
  53. package/dist/chunk-2YLG32JY.js +2 -0
  54. package/dist/{chunk-TZSPJIP4.js → chunk-32VV2J22.js} +1 -1
  55. package/dist/{chunk-QQCHLRKG.js → chunk-3APSMJPN.js} +1 -1
  56. package/dist/{chunk-6SMQNPWS.js → chunk-43ONX6UZ.js} +1 -1
  57. package/dist/{chunk-L7IKTEOC.js → chunk-442FFHQJ.js} +13 -13
  58. package/dist/chunk-4MVRSCQE.js +1 -0
  59. package/dist/{chunk-BT3XDH3L.js → chunk-56RAOI7O.js} +6 -6
  60. package/dist/chunk-5F7HMNCX.js +5 -0
  61. package/dist/chunk-5GUBNCTP.js +1 -0
  62. package/dist/{chunk-LGLZTJ2W.js → chunk-5JRL5LXD.js} +6 -6
  63. package/dist/{chunk-OFHCDTJM.js → chunk-5VOVNIOU.js} +1 -1
  64. package/dist/{chunk-NID6MGGC.js → chunk-5VRMQTKV.js} +8 -8
  65. package/dist/chunk-6453ISTQ.js +4 -0
  66. package/dist/chunk-6FEL5D56.js +8 -0
  67. package/dist/{chunk-MVQBVPWP.js → chunk-6KBDNYRW.js} +1 -1
  68. package/dist/{chunk-D2AUUIKG.js → chunk-6MVHRNWC.js} +1 -1
  69. package/dist/{chunk-TW7TA2AB.js → chunk-6ZHX56NM.js} +1 -1
  70. package/dist/{chunk-RNBM5JZI.js → chunk-7JGR7WPD.js} +4 -4
  71. package/dist/{chunk-BIJ7ADTZ.js → chunk-7WGOLPGM.js} +1 -1
  72. package/dist/{chunk-SXSMIMFY.js → chunk-A6RB4PIX.js} +4 -4
  73. package/dist/chunk-AC373WIU.js +8 -0
  74. package/dist/{chunk-BMPBVI7P.js → chunk-AGUA3O5O.js} +1 -1
  75. package/dist/{chunk-UVUBZL7K.js → chunk-ANFLQSGX.js} +5 -5
  76. package/dist/chunk-ARWMJSQJ.js +3 -0
  77. package/dist/chunk-AYZY3YNC.js +1 -0
  78. package/dist/{chunk-BSNWVZHW.js → chunk-B4KMHEFZ.js} +1 -1
  79. package/dist/chunk-B6YOP2IX.js +6 -0
  80. package/dist/{chunk-4VLKDANH.js → chunk-BBEOFKLY.js} +1 -1
  81. package/dist/{chunk-22S6LG6D.js → chunk-BCDG4N6L.js} +1 -1
  82. package/dist/{chunk-DFDDRKIJ.js → chunk-BCUQXILM.js} +1 -1
  83. package/dist/chunk-BGRT775Y.js +2 -0
  84. package/dist/{chunk-5TFTSYOD.js → chunk-BVTNGW5S.js} +1 -1
  85. package/dist/{chunk-TVJRENCQ.js → chunk-BWUU565Y.js} +9 -9
  86. package/dist/{chunk-TFMC2WAS.js → chunk-BZBMZDLD.js} +1 -1
  87. package/dist/chunk-BZG5E7GF.js +6 -0
  88. package/dist/{chunk-SBHFEWR6.js → chunk-C4UL2UNR.js} +1 -1
  89. package/dist/{chunk-DOCUM3K7.js → chunk-CAG3TSV2.js} +1 -1
  90. package/dist/chunk-CE5BARZI.js +16 -0
  91. package/dist/chunk-CJB73MHF.js +2 -0
  92. package/dist/{chunk-N6DTTOB6.js → chunk-CKPVXDKX.js} +3 -3
  93. package/dist/chunk-CO5RKOVX.js +20 -0
  94. package/dist/chunk-CRXFSN5K.js +20 -0
  95. package/dist/chunk-CVNJSD2J.js +18 -0
  96. package/dist/{chunk-RYBJ6MMM.js → chunk-CXMTDYVI.js} +1 -1
  97. package/dist/chunk-D7IXMMZT.js +9 -0
  98. package/dist/{chunk-LBLV64XG.js → chunk-DLNYXXNE.js} +2 -2
  99. package/dist/chunk-DNWV6N4P.js +5 -0
  100. package/dist/{chunk-KZHPX4FM.js → chunk-DWBZ3Z34.js} +2 -2
  101. package/dist/chunk-DZTAGMNY.js +100 -0
  102. package/dist/chunk-E4E7MACR.js +20 -0
  103. package/dist/{chunk-DZNG34DC.js → chunk-EFFF3FCS.js} +23 -23
  104. package/dist/{chunk-CPK7JTN3.js → chunk-EGAV5LSX.js} +1 -1
  105. package/dist/{chunk-M5P6A7KS.js → chunk-ENL5L6NR.js} +1 -1
  106. package/dist/chunk-EW3L4W2I.js +14 -0
  107. package/dist/{chunk-6GWZ5UPX.js → chunk-EWVOGTEX.js} +1 -1
  108. package/dist/{chunk-I7HDD4IM.js → chunk-EXNAAHN4.js} +2 -2
  109. package/dist/{chunk-YDYDR72S.js → chunk-F4DIVARP.js} +1 -1
  110. package/dist/{chunk-WYN5KVU4.js → chunk-F7F6Z64G.js} +3 -3
  111. package/dist/{chunk-5PY4H4ZJ.js → chunk-FBUUXK5G.js} +1 -1
  112. package/dist/chunk-FKNJSD6B.js +14 -0
  113. package/dist/{chunk-D7FT2PXG.js → chunk-FLEG5KP5.js} +5 -5
  114. package/dist/{chunk-4OFD6ICH.js → chunk-FLQZ7GQ3.js} +10 -10
  115. package/dist/{chunk-DXTKNHWG.js → chunk-FPGRKHUW.js} +12 -12
  116. package/dist/chunk-G6CTTBKE.js +9 -0
  117. package/dist/{chunk-3CST4ZDP.js → chunk-GS5AISRS.js} +4 -4
  118. package/dist/{chunk-4Y4PWKMM.js → chunk-GVC535IA.js} +3 -3
  119. package/dist/chunk-HEEY4TVP.js +8 -0
  120. package/dist/chunk-HJWTWS5E.js +8 -0
  121. package/dist/{chunk-VH6GB73Q.js → chunk-HL6JSDN3.js} +1 -1
  122. package/dist/chunk-HNQPF5QZ.js +2 -0
  123. package/dist/{chunk-WRORJNS5.js → chunk-HQMN5THW.js} +10 -10
  124. package/dist/chunk-HUF34LSW.js +15 -0
  125. package/dist/chunk-IB4333CI.js +14 -0
  126. package/dist/chunk-IGNZULKG.js +17 -0
  127. package/dist/{chunk-EZULNHQH.js → chunk-IJIESSTX.js} +5 -5
  128. package/dist/{chunk-S7VSXUKS.js → chunk-IJWFKUYA.js} +4 -4
  129. package/dist/chunk-IK2WXW2E.js +27 -0
  130. package/dist/{chunk-UZMZ2EDW.js → chunk-IMOPDLMA.js} +1 -1
  131. package/dist/{chunk-2FLYC6I2.js → chunk-IN4KV3SJ.js} +1 -1
  132. package/dist/chunk-IPTCV6CQ.js +69 -0
  133. package/dist/{chunk-ZWAVSUWT.js → chunk-IQWIYZB5.js} +2 -2
  134. package/dist/chunk-IX6QMUJQ.js +9 -0
  135. package/dist/{chunk-4G5VLI7E.js → chunk-JDQGHQ2C.js} +1 -1
  136. package/dist/{chunk-3S3DYAVB.js → chunk-JIW5CJXC.js} +2 -2
  137. package/dist/{chunk-P42YNSKI.js → chunk-JKDEE35P.js} +1 -1
  138. package/dist/{chunk-CKZ6ZDU5.js → chunk-JS6ZSEZJ.js} +1 -1
  139. package/dist/chunk-K4D63NP3.js +12 -0
  140. package/dist/chunk-KEK47CP3.js +12 -0
  141. package/dist/chunk-KWT6GT4M.js +29 -0
  142. package/dist/chunk-L4TN4EWK.js +1 -0
  143. package/dist/{chunk-SR4XAYLC.js → chunk-L67VXJMF.js} +1 -1
  144. package/dist/chunk-LAEXWXJA.js +9 -0
  145. package/dist/{chunk-D323R2FT.js → chunk-LNARMEEZ.js} +1 -1
  146. package/dist/{chunk-CZ25A5RS.js → chunk-LNQVTH5S.js} +1 -1
  147. package/dist/chunk-LUWRPPJA.js +7 -0
  148. package/dist/chunk-M554OMPA.js +2 -0
  149. package/dist/{chunk-BVW5U7QQ.js → chunk-M5GMIQ47.js} +3 -3
  150. package/dist/{chunk-GX2GSDJP.js → chunk-MAMWQCJ6.js} +1 -1
  151. package/dist/{chunk-ZTB6EMC7.js → chunk-MV6WDGB6.js} +1 -1
  152. package/dist/chunk-MWIT4UN2.js +14 -0
  153. package/dist/{chunk-JPRJQ6B7.js → chunk-N3JXHNID.js} +10 -10
  154. package/dist/{chunk-EYKUKN32.js → chunk-N7T63BVD.js} +4 -4
  155. package/dist/chunk-NHH2MXFU.js +2 -0
  156. package/dist/chunk-NHVXVHUR.js +23 -0
  157. package/dist/{chunk-EYX6KLCZ.js → chunk-NWCW22U6.js} +2 -2
  158. package/dist/{chunk-J47HXHSL.js → chunk-O5LQBBW2.js} +7 -7
  159. package/dist/{chunk-IHQX4GYD.js → chunk-OQ2EDMB2.js} +1 -1
  160. package/dist/chunk-OUSKOWNP.js +12 -0
  161. package/dist/chunk-OV2SWQPT.js +22 -0
  162. package/dist/chunk-OX2DOOOI.js +8 -0
  163. package/dist/{chunk-6KO5VTL7.js → chunk-OZAAIE4E.js} +1 -1
  164. package/dist/chunk-P3OBE43Q.js +8 -0
  165. package/dist/{chunk-Z2YGQBLZ.js → chunk-P3Y5RFI4.js} +2 -2
  166. package/dist/{chunk-2UXAI77F.js → chunk-P4XTWAKJ.js} +1 -1
  167. package/dist/{chunk-7PCI6AUU.js → chunk-PB7G6CJ7.js} +1 -1
  168. package/dist/chunk-PDB5W7VI.js +6 -0
  169. package/dist/chunk-PDXPMHG3.js +4 -0
  170. package/dist/chunk-POCQ7ZL4.js +3 -0
  171. package/dist/chunk-PVR4KU7H.js +7 -0
  172. package/dist/{chunk-2RBWQVDC.js → chunk-PYLNMN6E.js} +13 -13
  173. package/dist/chunk-Q7KTTDUS.js +11 -0
  174. package/dist/{chunk-3PGK3VFS.js → chunk-QC6OK3ED.js} +1 -1
  175. package/dist/{chunk-MEJK6PBN.js → chunk-QSJR7EI7.js} +3 -3
  176. package/dist/chunk-QWHQJNKL.js +1 -0
  177. package/dist/chunk-QXWY3CJ2.js +11 -0
  178. package/dist/{chunk-QDLGU62M.js → chunk-QZKWIVZW.js} +1 -1
  179. package/dist/chunk-R2VKEMZH.js +3 -0
  180. package/dist/{chunk-EXWGPXOS.js → chunk-RBD7SB6M.js} +1 -1
  181. package/dist/chunk-RC6UHOAV.js +4 -0
  182. package/dist/{chunk-45S6M77O.js → chunk-RULVWW4A.js} +6 -6
  183. package/dist/chunk-RUTUVS4H.js +1 -0
  184. package/dist/{chunk-MAOJENIB.js → chunk-RWJCKZEY.js} +1 -1
  185. package/dist/chunk-S4Z657L6.js +6 -0
  186. package/dist/{chunk-Q3OCGLW7.js → chunk-SOP447EP.js} +2 -2
  187. package/dist/{chunk-CDRXZBVR.js → chunk-TBPHW42V.js} +1 -1
  188. package/dist/chunk-TLRCTNUF.js +6 -0
  189. package/dist/{chunk-KWX6NAOR.js → chunk-TVL3JPMY.js} +1 -1
  190. package/dist/{chunk-VYXDI63I.js → chunk-U4OGRIP6.js} +1 -1
  191. package/dist/chunk-U5N6PSXO.js +9 -0
  192. package/dist/{chunk-SZIENHKR.js → chunk-UKDJUYIV.js} +1 -1
  193. package/dist/chunk-UQYNPYF4.js +1 -0
  194. package/dist/chunk-URHGHXDN.js +1 -0
  195. package/dist/{chunk-6WWAQC5V.js → chunk-VG2R6PZV.js} +1 -1
  196. package/dist/{chunk-RWGSMZGS.js → chunk-VVAJ23SD.js} +1 -1
  197. package/dist/chunk-VVGL5O4F.js +8 -0
  198. package/dist/chunk-VVJIKS47.js +1 -0
  199. package/dist/chunk-WE7CYRZT.js +7 -0
  200. package/dist/{chunk-B2XDNBR3.js → chunk-WFHYU66E.js} +1 -1
  201. package/dist/{chunk-NGBT7AHL.js → chunk-WH3JHMEA.js} +8 -8
  202. package/dist/chunk-WUKN5WUM.js +11 -0
  203. package/dist/{chunk-ET2EF5CI.js → chunk-X7PM7JOD.js} +1 -1
  204. package/dist/{chunk-4NXMMWL6.js → chunk-XD34TCRG.js} +1 -1
  205. package/dist/chunk-XI4HKNFI.js +19 -0
  206. package/dist/{chunk-Y4MI6NRI.js → chunk-XNWQ72WA.js} +1 -1
  207. package/dist/{chunk-Y6IQYQYN.js → chunk-XS4HFUTW.js} +2 -2
  208. package/dist/{chunk-Y5T257HX.js → chunk-XZYAFTW4.js} +4 -4
  209. package/dist/{chunk-KFJIO5ED.js → chunk-Y44ABEW3.js} +1 -1
  210. package/dist/chunk-YWGC7J6B.js +11 -0
  211. package/dist/{chunk-MMFJBWJC.js → chunk-Z3JW77LH.js} +1 -1
  212. package/dist/chunk-ZAU2HIRH.js +21 -0
  213. package/dist/{chunk-Y53KNQKL.js → chunk-ZDMZM7HD.js} +2 -2
  214. package/dist/{chunk-ZCHBOAPA.js → chunk-ZHHEMSOD.js} +2 -2
  215. package/dist/chunk-ZOHQVSB3.js +27 -0
  216. package/dist/{chunk-G63BCOQ6.js → chunk-ZTL2RPNY.js} +1 -1
  217. package/dist/{chunk-U4BMS5EV.js → chunk-ZYDZY6ED.js} +1 -1
  218. package/dist/data/DataTable.js +1 -1
  219. package/dist/data/Kanban.js +1 -1
  220. package/dist/data/ListFooter.js +1 -1
  221. package/dist/data/ListLoadError.js +1 -1
  222. package/dist/data/Pagination.js +1 -1
  223. package/dist/file-intake/index.js +1 -1
  224. package/dist/forms/AlignmentGrid.js +1 -1
  225. package/dist/forms/BorderInput.js +1 -1
  226. package/dist/forms/BrandAssetEditor.js +1 -1
  227. package/dist/forms/Button.js +1 -1
  228. package/dist/forms/Calendar.js +1 -1
  229. package/dist/forms/ColorPicker.js +1 -1
  230. package/dist/forms/ComposerAttachments.js +1 -1
  231. package/dist/forms/CornersInput.js +1 -1
  232. package/dist/forms/DatePicker.js +1 -1
  233. package/dist/forms/DateRangePicker.js +1 -1
  234. package/dist/forms/DateTimePicker.js +1 -1
  235. package/dist/forms/DisplayChips.js +1 -1
  236. package/dist/forms/FilePicker.js +1 -1
  237. package/dist/forms/FormErrorSummary.js +1 -1
  238. package/dist/forms/FormField.js +1 -1
  239. package/dist/forms/IconButton.js +1 -1
  240. package/dist/forms/IconPicker.js +1 -1
  241. package/dist/forms/ImageFocusPoint.js +1 -1
  242. package/dist/forms/Input.js +1 -1
  243. package/dist/forms/InputNumber.js +1 -1
  244. package/dist/forms/LinkPicker.js +1 -1
  245. package/dist/forms/MediaLibrary.d.ts +6 -1
  246. package/dist/forms/MediaLibrary.js +1 -1
  247. package/dist/forms/MediaUploadField.js +1 -1
  248. package/dist/forms/MediaUploadGrid.js +1 -1
  249. package/dist/forms/MediaUsedInList.js +1 -1
  250. package/dist/forms/NumericKeypad.js +1 -1
  251. package/dist/forms/PictureTiles.js +1 -1
  252. package/dist/forms/PositionInput.js +1 -1
  253. package/dist/forms/RadioGroup.js +1 -1
  254. package/dist/forms/Segmented.js +1 -1
  255. package/dist/forms/Select.d.ts +6 -0
  256. package/dist/forms/Select.js +1 -1
  257. package/dist/forms/SidesInput.js +1 -1
  258. package/dist/forms/Slider.js +1 -1
  259. package/dist/forms/Snippet.js +1 -1
  260. package/dist/forms/SplitButton.js +1 -1
  261. package/dist/forms/TagInput.js +1 -1
  262. package/dist/forms/TextToolbar.js +1 -1
  263. package/dist/forms/Textarea.js +1 -1
  264. package/dist/forms/TimePicker.js +1 -1
  265. package/dist/forms/WidthsBar.d.ts +7 -8
  266. package/dist/forms/WidthsBar.js +1 -1
  267. package/dist/forms/buttonStyles.js +1 -1
  268. package/dist/forms/mediaLibraryMenu.js +1 -1
  269. package/dist/forms/mediaMoveItems.js +1 -1
  270. package/dist/forms/styles.d.ts +2 -2
  271. package/dist/forms/styles.js +1 -1
  272. package/dist/forms/textAlign.js +1 -1
  273. package/dist/forms/useFileIntake.js +1 -1
  274. package/dist/hooks/useTheme.d.ts +1 -1
  275. package/dist/icons/efficient-glyphs.js +1 -1
  276. package/dist/icons/efficient-looks.js +1 -1
  277. package/dist/icons/efficient.js +1 -1
  278. package/dist/icons/glyphs/SpinnerIcon.js +1 -1
  279. package/dist/icons/looks/map.js +1 -1
  280. package/dist/icons/sets.js +1 -1
  281. package/dist/index.d.ts +3 -1
  282. package/dist/index.js +695 -695
  283. package/dist/locales/zh-Hans.js +1 -1
  284. package/dist/map/index.js +12 -12
  285. package/dist/markdown/index.js +5 -5
  286. package/dist/page-tabs/index.js +5 -5
  287. package/dist/pdf/index.js +1 -1
  288. package/dist/shell/Accordion.js +1 -1
  289. package/dist/shell/AppUpdateBanner.js +1 -1
  290. package/dist/shell/Avatar.js +1 -1
  291. package/dist/shell/Banner.js +1 -1
  292. package/dist/shell/Breadcrumbs.js +1 -1
  293. package/dist/shell/BudgetBar.js +1 -1
  294. package/dist/shell/Card.js +1 -1
  295. package/dist/shell/ColoredBadge.js +1 -1
  296. package/dist/shell/ConfirmDialog.js +1 -1
  297. package/dist/shell/ContainerFillChart.js +1 -1
  298. package/dist/shell/ContextMenu.js +1 -1
  299. package/dist/shell/CountBadge.js +1 -1
  300. package/dist/shell/Dialog.js +1 -1
  301. package/dist/shell/Drawer.js +1 -1
  302. package/dist/shell/DropdownMenu.js +1 -1
  303. package/dist/shell/EditableGrid.js +1 -1
  304. package/dist/shell/EmptyState.js +1 -1
  305. package/dist/shell/EmptyValue.js +1 -1
  306. package/dist/shell/GlobalSearch.js +1 -1
  307. package/dist/shell/HelpCenter.js +1 -1
  308. package/dist/shell/IconRail.js +1 -1
  309. package/dist/shell/ImageLightbox.js +1 -1
  310. package/dist/shell/ItemCount.d.ts +20 -0
  311. package/dist/shell/ItemCount.js +1 -0
  312. package/dist/shell/Kbd.js +1 -1
  313. package/dist/shell/LanguageSelect.js +1 -1
  314. package/dist/shell/Markdown.js +1 -1
  315. package/dist/shell/MetricBar.js +1 -1
  316. package/dist/shell/MetricBarLegend.js +1 -1
  317. package/dist/shell/MilestoneTimeline.js +1 -1
  318. package/dist/shell/PageHeader.js +1 -1
  319. package/dist/shell/Popover.js +1 -1
  320. package/dist/shell/PopupMenu.js +1 -1
  321. package/dist/shell/ProductionTimeline.js +1 -1
  322. package/dist/shell/ResizeHandle.js +1 -1
  323. package/dist/shell/Result.js +1 -1
  324. package/dist/shell/SearchableSelect.js +1 -1
  325. package/dist/shell/SettingReset.js +1 -1
  326. package/dist/shell/SettingRow.js +1 -1
  327. package/dist/shell/SidebarLayout.js +1 -1
  328. package/dist/shell/SidebarNav.d.ts +19 -5
  329. package/dist/shell/SidebarNav.js +1 -1
  330. package/dist/shell/SortableList.js +1 -1
  331. package/dist/shell/Spinner.js +1 -1
  332. package/dist/shell/Statistic.js +1 -1
  333. package/dist/shell/StatusBadge.js +1 -1
  334. package/dist/shell/StepChain.js +1 -1
  335. package/dist/shell/Tabs.js +1 -1
  336. package/dist/shell/TimeAgo.js +1 -1
  337. package/dist/shell/TimelineTrack.js +1 -1
  338. package/dist/shell/Tooltip.js +1 -1
  339. package/dist/shell/TopNav.js +1 -1
  340. package/dist/shell/TransferProgress.js +1 -1
  341. package/dist/shell/Tree.d.ts +15 -6
  342. package/dist/shell/Tree.js +1 -1
  343. package/dist/shell/language.js +1 -1
  344. package/dist/shell/strings.d.ts +24 -2
  345. package/dist/shell/strings.js +1 -1
  346. package/dist/shell/toast.js +1 -1
  347. package/dist/telemetry/index.js +1 -1
  348. package/dist/templates/AuthScreen.js +1 -1
  349. package/dist/templates/ChatTemplate.js +1 -1
  350. package/dist/templates/CheckoutTemplate.js +1 -1
  351. package/dist/templates/DashboardTemplate.js +1 -1
  352. package/dist/templates/DataTablePage.js +1 -1
  353. package/dist/templates/EmailTemplate.js +1 -1
  354. package/dist/templates/ErrorBoundary.d.ts +1 -1
  355. package/dist/templates/ErrorBoundary.js +1 -1
  356. package/dist/templates/ErrorPage.js +1 -1
  357. package/dist/templates/FormLayoutPage.js +1 -1
  358. package/dist/templates/GalleryTemplate.js +1 -1
  359. package/dist/themes.css +101 -0
  360. package/dist/tokens/colour.d.ts +42 -0
  361. package/dist/tokens/colour.js +1 -0
  362. package/dist/tokens/elevation.d.ts +3 -1
  363. package/dist/tokens/elevation.js +1 -1
  364. package/dist/ui/index.d.ts +2 -0
  365. package/dist/ui/index.js +1 -1
  366. package/dist/ui.css +266 -24
  367. package/dist/version.js +1 -1
  368. package/package.json +1 -1
  369. package/dist/Browser-FTCJCMD3.js +0 -43
  370. package/dist/Calculator-7O7HXEKH.js +0 -29
  371. package/dist/CurrencyConverter-IVJJCYZ7.js +0 -21
  372. package/dist/Files-YWBBU2FZ.js +0 -87
  373. package/dist/Notepad-KKKCTUB3.js +0 -25
  374. package/dist/PdfViewer-KJCJ6EPG.js +0 -1
  375. package/dist/Preview-CHV67AA7.js +0 -177
  376. package/dist/Sidebar-6I4FC5AK.js +0 -43
  377. package/dist/Spreadsheet-SNLKLOLL.js +0 -37
  378. package/dist/Stock-PHY6Z26A.js +0 -16
  379. package/dist/Weather-YQA5CAFQ.js +0 -60
  380. package/dist/WorldClock-J6L7FWI2.js +0 -32
  381. package/dist/chunk-2NMT3Y5H.js +0 -20
  382. package/dist/chunk-3WC6ITJ3.js +0 -11
  383. package/dist/chunk-3ZHFKOFX.js +0 -14
  384. package/dist/chunk-454DAGYG.js +0 -19
  385. package/dist/chunk-4CANQ3B3.js +0 -1
  386. package/dist/chunk-4CFOKYVR.js +0 -12
  387. package/dist/chunk-4IU5BSVE.js +0 -2
  388. package/dist/chunk-4IVT244O.js +0 -8
  389. package/dist/chunk-4SZDP3JF.js +0 -12
  390. package/dist/chunk-63EK6S3W.js +0 -3
  391. package/dist/chunk-64WSMLXG.js +0 -2
  392. package/dist/chunk-6BCFVOG7.js +0 -22
  393. package/dist/chunk-6NMDKOQA.js +0 -7
  394. package/dist/chunk-7C56GLLI.js +0 -28
  395. package/dist/chunk-7DKPJUGU.js +0 -2
  396. package/dist/chunk-7MSFHQAY.js +0 -8
  397. package/dist/chunk-7OCNF4AI.js +0 -5
  398. package/dist/chunk-AAW27HJY.js +0 -3
  399. package/dist/chunk-BI6ZLD4X.js +0 -11
  400. package/dist/chunk-BIYL7CEI.js +0 -2
  401. package/dist/chunk-BOBUSE33.js +0 -2
  402. package/dist/chunk-BUGAWNOC.js +0 -14
  403. package/dist/chunk-CRLSG5AY.js +0 -9
  404. package/dist/chunk-DITCVBR7.js +0 -15
  405. package/dist/chunk-DODH46ZQ.js +0 -8
  406. package/dist/chunk-E5ALJIXV.js +0 -9
  407. package/dist/chunk-E6UCGCOC.js +0 -1
  408. package/dist/chunk-EGDJEY4K.js +0 -27
  409. package/dist/chunk-EL2RLUT6.js +0 -20
  410. package/dist/chunk-ET32NQHX.js +0 -2
  411. package/dist/chunk-EZ3BQ6PK.js +0 -18
  412. package/dist/chunk-FRPNTDP4.js +0 -8
  413. package/dist/chunk-GATKJSGL.js +0 -8
  414. package/dist/chunk-GNPTNAZH.js +0 -4
  415. package/dist/chunk-JPP7UWQA.js +0 -4
  416. package/dist/chunk-K7KQDPLW.js +0 -27
  417. package/dist/chunk-K7U4RWXJ.js +0 -1
  418. package/dist/chunk-KJY57QPT.js +0 -100
  419. package/dist/chunk-LGAN7DNC.js +0 -9
  420. package/dist/chunk-MEYYQC43.js +0 -8
  421. package/dist/chunk-MVP6Q6KV.js +0 -1
  422. package/dist/chunk-NDO24PK6.js +0 -21
  423. package/dist/chunk-OSA24YH6.js +0 -19
  424. package/dist/chunk-P5BOTIJU.js +0 -6
  425. package/dist/chunk-PCQPV6MS.js +0 -6
  426. package/dist/chunk-PF3ANJFI.js +0 -1
  427. package/dist/chunk-PXEEDRPW.js +0 -14
  428. package/dist/chunk-Q23EHOXW.js +0 -17
  429. package/dist/chunk-Q5MD3VY6.js +0 -3
  430. package/dist/chunk-QR4RM7PO.js +0 -1
  431. package/dist/chunk-REVC6YPT.js +0 -7
  432. package/dist/chunk-RSO67DWS.js +0 -8
  433. package/dist/chunk-S2OIRC5H.js +0 -12
  434. package/dist/chunk-SB7OTZI4.js +0 -69
  435. package/dist/chunk-SRKSGUGT.js +0 -23
  436. package/dist/chunk-SURSVJA2.js +0 -6
  437. package/dist/chunk-TH6EAYMO.js +0 -29
  438. package/dist/chunk-TIQKDAON.js +0 -11
  439. package/dist/chunk-TVDVVPTN.js +0 -1
  440. package/dist/chunk-VU6VPKM3.js +0 -11
  441. package/dist/chunk-W5M6P4DZ.js +0 -8
  442. package/dist/chunk-X6PPP6NX.js +0 -14
  443. package/dist/chunk-XLD53X4P.js +0 -9
  444. package/dist/chunk-XSPDPN5O.js +0 -26
  445. package/dist/chunk-Y37PBT4H.js +0 -9
  446. package/dist/chunk-YAEUF3GP.js +0 -1
  447. package/dist/chunk-YALPQIBR.js +0 -7
  448. package/dist/chunk-ZK2SULCA.js +0 -16
  449. package/dist/chunk-ZOSIPTXM.js +0 -6
  450. package/dist/chunk-ZSFUNXRD.js +0 -5
  451. /package/dist/{chunk-KJRYEKQP.js → chunk-DSIDJYH7.js} +0 -0
package/dist/ui.css CHANGED
@@ -328,12 +328,23 @@ html.rosh-reduce-transparency *::after {
328
328
  * gray-400 ink. Keep the two blocks in step.
329
329
  */
330
330
  :root {
331
- --surface: #ffffff;
332
- --surface-sunken: #f9fafb;
333
- --surface-raised: #f3f4f6;
334
- --line-subtle: #f3f4f6;
335
- --line: #e5e7eb;
336
- --line-strong: #d1d5db;
331
+ /* The BASE tier: the untinted surfaces and lines. No theme sets these; a
332
+ host that wants its own greys does. The roles below read them, and an
333
+ accent theme (themes.css) sets the roles to its tint instead — the base
334
+ stays, for the few parts that must never tint (the fold band, the glass). */
335
+ --base-surface: #ffffff;
336
+ --base-surface-sunken: #f9fafb;
337
+ --base-surface-raised: #f3f4f6;
338
+ --base-line-subtle: #f3f4f6;
339
+ --base-line: #e5e7eb;
340
+ --base-line-strong: #d1d5db;
341
+
342
+ --surface: var(--base-surface);
343
+ --surface-sunken: var(--base-surface-sunken);
344
+ --surface-raised: var(--base-surface-raised);
345
+ --line-subtle: var(--base-line-subtle);
346
+ --line: var(--base-line);
347
+ --line-strong: var(--base-line-strong);
337
348
  --ink-faintest: #9ca3af;
338
349
  --ink-faint: #6b7280;
339
350
  --ink-muted: #4b5563;
@@ -371,12 +382,20 @@ html.rosh-reduce-transparency *::after {
371
382
  * replaces, because in a light theme the numbers run the other way round
372
383
  * while the roles do not.
373
384
  */
374
- --surface: #1e1e2e;
375
- --surface-sunken: #181825;
376
- --surface-raised: #313244;
377
- --line-subtle: #2a2a3c;
378
- --line: #313244;
379
- --line-strong: #45475a;
385
+ --base-surface: #1e1e2e;
386
+ --base-surface-sunken: #181825;
387
+ --base-surface-raised: #313244;
388
+ --base-line-subtle: #2a2a3c;
389
+ --base-line: #313244;
390
+ --base-line-strong: #45475a;
391
+ /* Re-declared here, not inherited from :root: on a `.dark` subtree inside a
392
+ light page, a role declared only on :root would keep the light base. */
393
+ --surface: var(--base-surface);
394
+ --surface-sunken: var(--base-surface-sunken);
395
+ --surface-raised: var(--base-surface-raised);
396
+ --line-subtle: var(--base-line-subtle);
397
+ --line: var(--base-line);
398
+ --line-strong: var(--base-line-strong);
380
399
  --ink-faintest: #6c7086;
381
400
  /* 4.79:1 on --surface. Was #7f849c at 4.44:1 — under AA, and this step
382
401
  is what `.text-gray-500` renders as in dark, so it carries real text. */
@@ -406,6 +425,219 @@ html.rosh-reduce-transparency *::after {
406
425
  --ink-placeholder: var(--ink-faintest);
407
426
  }
408
427
 
428
+ /* ═══════════════════════════════════════════════════
429
+ Colour roles — every colour a component asks for
430
+ ═══════════════════════════════════════════════════ */
431
+ /*
432
+ * The ramp above names surfaces, lines and inks. These are the rest: the
433
+ * accent by job, the flat status colours, the status borders, and the few
434
+ * neutral jobs the ramp had no name for. src/tokens/colour.ts lists every
435
+ * role; tests/colourRoleUtilities.test.ts holds this file to it.
436
+ *
437
+ * Why they are here and not only in brand.css. The accent and the `-text`
438
+ * status inks used to live in brand.css alone, and a portal loads ui.css, not
439
+ * brand.css — so in a portal `var(--accent-text)` resolved to nothing and the
440
+ * only way to write the accent was a blue palette class. brand.css imports
441
+ * this file, so a brand surface still gets every value.
442
+ *
443
+ * The accent jobs read a scale, `--accent-50` … `--accent-700`, that this
444
+ * file does NOT declare: an accent theme (themes.css) or a custom accent
445
+ * (useTheme, inline on <html>) sets it. Unset, each job falls back to
446
+ * Tailwind's blue THROUGH its theme variable (`var(--color-blue-600)`), not a
447
+ * literal, so a host that maps `--color-blue-*` onto its own accent moves the
448
+ * jobs with it, as it already moves the blue utilities. Leaving the scale
449
+ * unset in the default theme is deliberate: kit code that already reads
450
+ * `var(--accent-600, <fallback>)` (the taskbar's start balloon and drop hint,
451
+ * the timeline accent) keeps drawing exactly what it drew.
452
+ *
453
+ * The roles new in this block, and the palette class each one replaces:
454
+ * --ink-disabled text-gray-300: a disabled label, an inactive sort arrow
455
+ * --ink-on-inverse text-white on --surface-inverse
456
+ * --surface-inverse bg-gray-900 / bg-gray-700: a dark chip in a light UI
457
+ * --row-hover hover:bg-gray-50 on a list or table row
458
+ * --status-X-line border-red-200 and the like: a status box's border
459
+ * --scrim-* bg-black/30, /60, /80 over media
460
+ * --identity-1..8 avatar and tag hues; the chart series, never themed
461
+ */
462
+ :root {
463
+ --accent-fill: var(--accent-600, var(--color-blue-600));
464
+ --accent-fill-hover: var(--accent-700, var(--color-blue-700));
465
+ --accent-tint: var(--accent-50, var(--color-blue-50));
466
+ --accent-tint-strong: var(--accent-100, var(--color-blue-100));
467
+ --accent-border: var(--accent-500, var(--color-blue-500));
468
+ --accent-text: #1d4ed8; /* 6.70:1 on --surface — blue-700 */
469
+ --on-accent: #ffffff; /* 5.17:1 on --accent-600 */
470
+
471
+ --danger: #dc2626;
472
+ --warning: #f59e0b;
473
+ --success: #16a34a;
474
+ --danger-text: #dc2626; /* 4.83:1 on --surface */
475
+ --warning-text: #b45309; /* 5.02:1 — amber-700; #f59e0b is 2.15:1 here */
476
+ --success-text: #15803d; /* 5.02:1 */
477
+
478
+ --surface-inverse: #111827;
479
+ --ink-on-inverse: #ffffff;
480
+ --ink-disabled: #d1d5db;
481
+ --row-hover: var(--surface-sunken);
482
+
483
+ --status-success-line: #bbf7d0;
484
+ --status-active-line: #bfdbfe;
485
+ --status-queued-line: #c7d2fe;
486
+ --status-info-line: #bae6fd;
487
+ --status-pending-line: #fef08a;
488
+ --status-warning-line: #fed7aa;
489
+ --status-danger-line: #fecaca;
490
+ --status-draft-line: #d1d5db;
491
+ --status-neutral-line: #e5e7eb;
492
+
493
+ --scrim-soft: rgba(0, 0, 0, 0.3);
494
+ --scrim-mid: var(--rosh-media-scrim);
495
+ --scrim-strong: rgba(0, 0, 0, 0.8);
496
+
497
+ --identity-1: var(--viz-series-1);
498
+ --identity-2: var(--viz-series-2);
499
+ --identity-3: var(--viz-series-3);
500
+ --identity-4: var(--viz-series-4);
501
+ --identity-5: var(--viz-series-5);
502
+ --identity-6: var(--viz-series-6);
503
+ --identity-7: var(--viz-series-7);
504
+ --identity-8: var(--viz-series-8);
505
+ }
506
+
507
+ /*
508
+ * Dark. The fills hold; what moves is anything read AGAINST the surface, which
509
+ * moved. The accent washes and line are the values the dark blue-utility
510
+ * remaps below already paint (`rgba(var(--rosh-dark-accent-rgb), 0.26)` for
511
+ * bg-blue-50, and so on), so a role and the class it replaces look the same.
512
+ * The status borders are each group's hue at the alpha the dark border remaps
513
+ * use (0.32 – 0.35).
514
+ */
515
+ :is([data-theme="dark"], .dark) {
516
+ --accent-tint: rgba(var(--rosh-dark-accent-rgb), 0.26);
517
+ --accent-tint-strong: rgba(var(--rosh-dark-accent-rgb), 0.22);
518
+ --accent-border: rgb(var(--rosh-dark-accent-line-rgb));
519
+ --accent-text: #60a5fa; /* 6.45:1 — blue-400 */
520
+
521
+ --danger-text: #f87171; /* 5.93:1 on the dark --surface */
522
+ --warning-text: #f59e0b; /* 7.64:1 */
523
+ --success-text: #16a34a; /* 4.98:1 */
524
+
525
+ --surface-inverse: #cdd6f4;
526
+ --ink-on-inverse: #1e1e2e;
527
+ --ink-disabled: #585b70;
528
+ --row-hover: var(--line-subtle);
529
+
530
+ --status-success-line: rgba(34, 197, 94, 0.32);
531
+ --status-active-line: rgba(59, 130, 246, 0.35);
532
+ --status-queued-line: rgba(99, 102, 241, 0.35);
533
+ --status-info-line: rgba(14, 165, 233, 0.35);
534
+ --status-pending-line: rgba(234, 179, 8, 0.32);
535
+ --status-warning-line: rgba(249, 115, 22, 0.35);
536
+ --status-danger-line: rgba(239, 68, 68, 0.35);
537
+ --status-draft-line: var(--line-strong);
538
+ --status-neutral-line: var(--line);
539
+ }
540
+
541
+ /*
542
+ * Each role as a utility class: the text, background and border utility of
543
+ * `ink`, `surface`, `line`, `accent-fill`, `status-danger-line` and the rest —
544
+ * and every other colour utility Tailwind derives (ring, divide, fill, stroke,
545
+ * outline, from/via/to). Class names are not written out here: a class named
546
+ * in any file of this repository ships in brand.css (AGENTS.md).
547
+ *
548
+ * `inline`: the class writes `var(--ink)` itself, so it follows dark mode and
549
+ * a host's ramp at run time instead of freezing the light value. `default`: an
550
+ * app's own `@theme` still wins (see the shape-and-type block at the top).
551
+ *
552
+ * The accent SCALE (`--accent-50` … `-700`) is deliberately not here: a
553
+ * component asks for a job (the accent tint), never a step.
554
+ */
555
+ @theme inline default {
556
+ --color-surface: var(--surface);
557
+ --color-surface-sunken: var(--surface-sunken);
558
+ --color-surface-raised: var(--surface-raised);
559
+ --color-surface-inverse: var(--surface-inverse);
560
+ --color-line-subtle: var(--line-subtle);
561
+ --color-line: var(--line);
562
+ --color-line-strong: var(--line-strong);
563
+ --color-ink-faintest: var(--ink-faintest);
564
+ --color-ink-faint: var(--ink-faint);
565
+ --color-ink-muted: var(--ink-muted);
566
+ --color-ink: var(--ink);
567
+ --color-ink-strong: var(--ink-strong);
568
+ --color-ink-strongest: var(--ink-strongest);
569
+ --color-ink-placeholder: var(--ink-placeholder);
570
+ --color-ink-disabled: var(--ink-disabled);
571
+ --color-ink-on-inverse: var(--ink-on-inverse);
572
+ --color-row-hover: var(--row-hover);
573
+
574
+ --color-accent-fill: var(--accent-fill);
575
+ --color-accent-fill-hover: var(--accent-fill-hover);
576
+ --color-accent-tint: var(--accent-tint);
577
+ --color-accent-tint-strong: var(--accent-tint-strong);
578
+ --color-accent-border: var(--accent-border);
579
+ --color-accent-text: var(--accent-text);
580
+ --color-on-accent: var(--on-accent);
581
+
582
+ --color-danger: var(--danger);
583
+ --color-warning: var(--warning);
584
+ --color-success: var(--success);
585
+ --color-danger-text: var(--danger-text);
586
+ --color-warning-text: var(--warning-text);
587
+ --color-success-text: var(--success-text);
588
+
589
+ --color-status-success-soft: var(--status-success-soft);
590
+ --color-status-success-soft-ink: var(--status-success-soft-ink);
591
+ --color-status-success-solid: var(--status-success-solid);
592
+ --color-status-success-line: var(--status-success-line);
593
+ --color-status-active-soft: var(--status-active-soft);
594
+ --color-status-active-soft-ink: var(--status-active-soft-ink);
595
+ --color-status-active-solid: var(--status-active-solid);
596
+ --color-status-active-line: var(--status-active-line);
597
+ --color-status-queued-soft: var(--status-queued-soft);
598
+ --color-status-queued-soft-ink: var(--status-queued-soft-ink);
599
+ --color-status-queued-solid: var(--status-queued-solid);
600
+ --color-status-queued-line: var(--status-queued-line);
601
+ --color-status-info-soft: var(--status-info-soft);
602
+ --color-status-info-soft-ink: var(--status-info-soft-ink);
603
+ --color-status-info-solid: var(--status-info-solid);
604
+ --color-status-info-line: var(--status-info-line);
605
+ --color-status-pending-soft: var(--status-pending-soft);
606
+ --color-status-pending-soft-ink: var(--status-pending-soft-ink);
607
+ --color-status-pending-solid: var(--status-pending-solid);
608
+ --color-status-pending-line: var(--status-pending-line);
609
+ --color-status-warning-soft: var(--status-warning-soft);
610
+ --color-status-warning-soft-ink: var(--status-warning-soft-ink);
611
+ --color-status-warning-solid: var(--status-warning-solid);
612
+ --color-status-warning-line: var(--status-warning-line);
613
+ --color-status-danger-soft: var(--status-danger-soft);
614
+ --color-status-danger-soft-ink: var(--status-danger-soft-ink);
615
+ --color-status-danger-solid: var(--status-danger-solid);
616
+ --color-status-danger-line: var(--status-danger-line);
617
+ --color-status-draft-soft: var(--status-draft-soft);
618
+ --color-status-draft-soft-ink: var(--status-draft-soft-ink);
619
+ --color-status-draft-solid: var(--status-draft-solid);
620
+ --color-status-draft-line: var(--status-draft-line);
621
+ --color-status-neutral-soft: var(--status-neutral-soft);
622
+ --color-status-neutral-soft-ink: var(--status-neutral-soft-ink);
623
+ --color-status-neutral-solid: var(--status-neutral-solid);
624
+ --color-status-neutral-line: var(--status-neutral-line);
625
+ --color-status-on-solid: var(--status-on-solid);
626
+
627
+ --color-scrim-soft: var(--scrim-soft);
628
+ --color-scrim-mid: var(--scrim-mid);
629
+ --color-scrim-strong: var(--scrim-strong);
630
+
631
+ --color-identity-1: var(--identity-1);
632
+ --color-identity-2: var(--identity-2);
633
+ --color-identity-3: var(--identity-3);
634
+ --color-identity-4: var(--identity-4);
635
+ --color-identity-5: var(--identity-5);
636
+ --color-identity-6: var(--identity-6);
637
+ --color-identity-7: var(--identity-7);
638
+ --color-identity-8: var(--identity-8);
639
+ }
640
+
409
641
  /* ── The compact settings row (owner 2026-10-17, R2) ───────────────────────
410
642
  * One rule for every row in an editor-panel group, not one per row:
411
643
  * - every number box straight in a compact SettingRow's value slot is ONE
@@ -437,16 +669,16 @@ html.rosh-reduce-transparency *::after {
437
669
 
438
670
  /* ── The fold band (owner 2026-10-17, R2: Accordion's `band` tier) ─────────
439
671
  * Lewis's fold sign option F: a group band is one grey step darker than the
440
- * panel, and one step further on hover. Roles read from the neutral ramp
441
- * above, so an accent theme's tinted greys do not reach it and a host's own
442
- * ramp does. */
672
+ * panel, and one step further on hover. It reads the BASE tier, not the
673
+ * roles: an accent theme tints the roles, and its tint must not reach the
674
+ * band; a host's own base does. */
443
675
  :root {
444
- --rosh-fold-band: var(--line);
445
- --rosh-fold-band-hover: var(--line-strong);
676
+ --rosh-fold-band: var(--base-line);
677
+ --rosh-fold-band-hover: var(--base-line-strong);
446
678
  }
447
679
  :is([data-theme="dark"], .dark) {
448
- --rosh-fold-band: var(--line-strong);
449
- --rosh-fold-band-hover: color-mix(in srgb, var(--line-strong) 80%, var(--ink-faintest));
680
+ --rosh-fold-band: var(--base-line-strong);
681
+ --rosh-fold-band-hover: color-mix(in srgb, var(--base-line-strong) 80%, var(--ink-faintest));
450
682
  }
451
683
 
452
684
  /* ── Chart tokens ───────────────────────────────────────────────────────────
@@ -846,11 +1078,12 @@ html.rosh-reduce-transparency *::after {
846
1078
  /* glassStyle() — every menu, popup and listbox in the kit; a Tooltip
847
1079
  bubble is always the solid one (solidSurfaceStyle()). The
848
1080
  surface a popup is tinted from (frosted) or painted in (solid), and the
849
- stop across the middle of its gradient. Both chain to the ramp, so a host
850
- that restyles `--surface` moves its popups with it; one that wants its
1081
+ stop across the middle of its gradient. Both chain to the BASE tier, not
1082
+ the tinted roles, so an accent theme does not tint the glass while a host
1083
+ that restyles its base moves its popups with it; one that wants its
851
1084
  popups in a colour of their own sets `--rosh-glass-surface` alone. */
852
- --rosh-glass-surface: var(--surface);
853
- --rosh-glass-surface-mid: var(--surface);
1085
+ --rosh-glass-surface: var(--base-surface);
1086
+ --rosh-glass-surface-mid: var(--base-surface);
854
1087
  /* The frosted edge and its depth: a white hairline and an inner highlight
855
1088
  (the glass SURFACE), lifted by the popup level, the one popup shadow
856
1089
  (GG for Lewis, 2026-10-13; it was its own 0 8px 32px + 0 2px 8px). */
@@ -896,7 +1129,7 @@ html.rosh-reduce-transparency *::after {
896
1129
  * like every dark rule once the kit follows a `dark` class as well as
897
1130
  * `data-theme` (feat/ui-dark-class): `:is()` has the specificity of either. */
898
1131
  :is([data-theme="dark"], .dark) {
899
- --rosh-glass-surface-mid: var(--surface-sunken);
1132
+ --rosh-glass-surface-mid: var(--base-surface-sunken);
900
1133
  --rosh-glass-border: rgba(255, 255, 255, 0.08);
901
1134
  --rosh-glass-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06), inset 0 -1px 0 rgba(0, 0, 0, 0.4),
902
1135
  var(--elevation-popup);
@@ -919,11 +1152,20 @@ html.rosh-reduce-transparency *::after {
919
1152
  * panel is the side-panel shadow efficient-easel drew for itself. Black at an
920
1153
  * alpha composites on either theme. A component class or inline style reads
921
1154
  * these; nothing in the kit does yet, so nothing renders differently.
1155
+ *
1156
+ * Four more, each the shadow an editor drew for itself, at the value it drew
1157
+ * (GG for Lewis, 2026-10-24: a level each, so nothing moves; a later design
1158
+ * pass may merge them): bar (the editor's top bar) · handle (the canvas drag
1159
+ * handle) · tag (the picker's tag) · frame (the preview frame).
922
1160
  */
923
1161
  :root {
924
1162
  --elevation-none: none;
1163
+ --elevation-bar: 0 1px 3px rgb(0 0 0 / 0.06);
925
1164
  --elevation-raised: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
1165
+ --elevation-handle: 0 2px 6px rgb(16 24 40 / 0.2);
1166
+ --elevation-tag: 0 4px 12px rgb(0 0 0 / 0.2);
926
1167
  --elevation-panel: 0 1px 2px rgb(0 0 0 / 0.05), 0 10px 30px rgb(0 0 0 / 0.06);
1168
+ --elevation-frame: 0 1px 2px rgb(0 0 0 / 0.06), 0 12px 36px rgb(0 0 0 / 0.1);
927
1169
  --elevation-popup: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
928
1170
  --elevation-dialog: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
929
1171
  }
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export{APP_VERSION,VERSION}from"./chunk-YAEUF3GP.js";
1
+ export{APP_VERSION,VERSION}from"./chunk-L4TN4EWK.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efficient-shell",
3
- "version": "9.1.0",
3
+ "version": "9.9.0",
4
4
  "description": "Desktop-style React UI shell — windows, taskbar, start menu, sticky notes, frosted glass theming, and bundled apps.",
5
5
  "license": "UNLICENSED",
6
6
  "author": "Efficient Pty Ltd",
@@ -1,43 +0,0 @@
1
- import{peekBrowserStartUrl as e,claimBrowserStartUrl as t}from"./chunk-LWLCNQY7.js";import{AboutApp as o}from"./chunk-Y37PBT4H.js";import{WindowTitle as r}from"./chunk-KJY57QPT.js";import"./chunk-CY5N5OA3.js";import"./chunk-AW7TOB6N.js";import"./chunk-KNUR2UEG.js";import"./chunk-JDCM2VHG.js";import"./chunk-BMPBVI7P.js";import"./chunk-5A7MWTXX.js";import"./chunk-Y53KNQKL.js";import"./chunk-6WWAQC5V.js";import{confirm as n}from"./chunk-EGDJEY4K.js";import"./chunk-GNPTNAZH.js";import"./chunk-KC3EX26K.js";import"./chunk-4AJRHTTB.js";import"./chunk-VWGWZY7A.js";import"./chunk-PKXQDCNR.js";import"./chunk-UGTRSRIW.js";import"./chunk-ET2EF5CI.js";import"./chunk-CDAJKLGL.js";import"./chunk-YAEUF3GP.js";import"./chunk-DXTKNHWG.js";import"./chunk-QR4RM7PO.js";import"./chunk-5QFPTDQF.js";import"./chunk-D323R2FT.js";import"./chunk-4IU5BSVE.js";import"./chunk-K7U4RWXJ.js";import"./chunk-VH6GB73Q.js";import{Icon as a}from"./chunk-FSPFV4MI.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,T]=l(0),[E,D]=l(0),[L,S]=l(x),[G,U]=l(!1),[K,P]=l(null),H=s(null),J=s(null);i(()=>{try{localStorage.setItem(d,JSON.stringify(L))}catch{}},[L]);const M=e=>{const t=k(e);t&&(y(t),C(t),R(e=>{const o=e.slice(0,z+1);return o.push(t),o}),T(e=>e+1),U(!1))},Q=()=>{"undefined"!=typeof window&&window.open(f,"_blank","noopener,noreferrer")},A=()=>{const e=K?.trim();e?(S(t=>[...t,{label:e,url:f}]),P(null)):P(null)};i(()=>{if(null===K)return;H.current?.focus(),H.current?.select();const e=e=>{const t=e.target;t?.closest("[data-bookmark-popover]")||P(null)},t=setTimeout(()=>document.addEventListener("mousedown",e),0);return()=>{clearTimeout(t),document.removeEventListener("mousedown",e)}},[null!==K]);const B=e=>{S(t=>t.filter((t,o)=>o!==e))},F=z>0,I=z<W.length-1,O=L.some(e=>e.url===f),V="p-2 rounded hover:bg-gray-200 transition-colors text-gray-600 disabled:opacity-30";/* @__PURE__ */
2
- return c("div",{className:"relative flex flex-col h-full bg-white",children:[
3
- /* @__PURE__ */m(r,{title:`Browser - ${v(f)}`}),
4
- /* @__PURE__ */m(o,{app:"browser"}),
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;T(e),y(W[e]),C(W[e]),U(!1)}},disabled:!F,className:V,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;T(e),y(W[e]),C(W[e]),U(!1)}},disabled:!I,className:V,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:V,title:"Refresh",children:/* @__PURE__ */m(a,{name:"refresh",className:"h-4 w-4",strokeWidth:1.8})}),
9
- /* @__PURE__ */m("button",{onClick:()=>M(g),className:V,title:"Home",children:/* @__PURE__ */m(a,{name:"home",className:"h-4 w-4",strokeWidth:1.8})}),
10
- /* @__PURE__ */m("form",{onSubmit:e=>{e.preventDefault(),M(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
- /* @__PURE__ */m("span",{className:"px-2 text-gray-400 text-xs",children:f.startsWith("https://")?"🔒":"⚠️"}),
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:()=>O?B(L.findIndex(e=>e.url===f)):void P(v(f)),className:V+" "+(O?"text-yellow-500":""),title:O?"Remove bookmark":"Add bookmark",children:/* @__PURE__ */m(a,{name:"star",className:"h-4 w-4",fill:O?"currentColor":"none",strokeWidth:1.5})}),
14
- /* @__PURE__ */m("button",{onClick:Q,className:V,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:V,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
- /* @__PURE__ */m("div",{className:"text-2xs font-semibold uppercase tracking-wide text-gray-500 mb-1",children:"Bookmark this page"}),
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:K,onChange:e=>P(e.target.value),onKeyDown:e=>{"Enter"===e.key?A():"Escape"===e.key&&P(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
- /* @__PURE__ */c("div",{className:"flex justify-end gap-1 mt-2",children:[
20
- /* @__PURE__ */m("button",{onClick:()=>P(null),className:"px-2 py-1 text-xs text-gray-600 hover:bg-gray-100 rounded",children:"Cancel"}),
21
- /* @__PURE__ */m("button",{onClick:A,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===L.length&&/* @__PURE__ */m("span",{className:"text-2xs text-gray-400 italic px-2",children:"No bookmarks yet — star the address bar to add one."}),L.map((e,t)=>/* @__PURE__ */c("button",{onClick:()=>M(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
- /* @__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
- /* @__PURE__ */m("div",{className:"flex-1"}),
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:E,iframeRef:J,openExternal:Q,showHelp:G,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
- /* @__PURE__ */m(a,{name:"no-symbol",className:"h-14 w-14 mx-auto text-gray-300 mb-3",strokeWidth:1.2}),
28
- /* @__PURE__ */c("h3",{className:"text-base font-semibold text-gray-800 mb-1",children:[v(e)," can't be embedded"]}),
29
- /* @__PURE__ */c("p",{className:"text-sm text-gray-500 mb-4",children:["This site sends an ",
30
- /* @__PURE__ */m("span",{className:"font-mono text-xs",children:"X-Frame-Options"})," ","or ",
31
- /* @__PURE__ */m("span",{className:"font-mono text-xs",children:"Content-Security-Policy"})," header that refuses iframe embedding. The browser blocks the load before our app can do anything about it."]}),
32
- /* @__PURE__ */c("div",{className:"flex flex-col items-center gap-2",children:[
33
- /* @__PURE__ */c("button",{onClick:r,className:"px-4 py-2 bg-blue-500 text-white text-sm rounded hover:bg-blue-600 inline-flex items-center gap-2",children:[
34
- /* @__PURE__ */m(a,{name:"external",className:"h-4 w-4",strokeWidth:1.5}),"Open in a new tab"]}),
35
- /* @__PURE__ */m("button",{onClick:()=>h(!0),className:"text-xs text-gray-500 hover:text-gray-800 underline",children:"Try loading it here anyway"})]})]})}):/* @__PURE__ */c(u,{children:[
36
- /* @__PURE__ */m("iframe",{ref:o,src:e,className:"absolute inset-0 w-full h-full bg-white",sandbox:"allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-modals",referrerPolicy:"no-referrer-when-downgrade"},t+e),n&&/* @__PURE__ */c("div",{className:"absolute top-2 right-2 max-w-sm bg-white border border-gray-200 rounded-md shadow-lg p-3 text-xs text-gray-700 z-10",children:[
37
- /* @__PURE__ */m("div",{className:"font-medium text-gray-900 mb-1",children:"Why is this page blank?"}),
38
- /* @__PURE__ */c("p",{className:"mb-2",children:["Most major sites (Google, GitHub, banks, news) refuse to be embedded in an iframe via ",
39
- /* @__PURE__ */m("span",{className:"font-mono",children:"X-Frame-Options"})," or Content Security Policy. There's no workaround — the browser blocks the load before our app can do anything."]}),
40
- /* @__PURE__ */c("p",{children:["Hit the ",
41
- /* @__PURE__ */m("span",{className:"font-medium",children:"↗"})," button to open the page in a real new tab. Sites that ",
42
- /* @__PURE__ */m("em",{children:"do"})," allow embedding (Wikipedia, DevDocs, your own apps) work fine in here."]}),
43
- /* @__PURE__ */m("button",{onClick:s,className:"mt-2 text-2xs text-blue-600 hover:underline",children:"Got it"})]})]})}export{y as default};
@@ -1,29 +0,0 @@
1
- import{loadAppearance as e,WidgetSettingsModal as t}from"./chunk-U4BMS5EV.js";import{useWidgetSettings as n}from"./chunk-KJY57QPT.js";import"./chunk-CY5N5OA3.js";import"./chunk-AW7TOB6N.js";import"./chunk-KNUR2UEG.js";import"./chunk-JDCM2VHG.js";import"./chunk-BMPBVI7P.js";import"./chunk-5A7MWTXX.js";import"./chunk-Y53KNQKL.js";import"./chunk-6WWAQC5V.js";import"./chunk-EGDJEY4K.js";import"./chunk-GNPTNAZH.js";import"./chunk-KC3EX26K.js";import"./chunk-4AJRHTTB.js";import"./chunk-VWGWZY7A.js";import"./chunk-PKXQDCNR.js";import"./chunk-UGTRSRIW.js";import"./chunk-ET2EF5CI.js";import"./chunk-CDAJKLGL.js";import"./chunk-DXTKNHWG.js";import"./chunk-QR4RM7PO.js";import"./chunk-5QFPTDQF.js";import"./chunk-D323R2FT.js";import"./chunk-4IU5BSVE.js";import"./chunk-K7U4RWXJ.js";import"./chunk-VH6GB73Q.js";import{Icon as r}from"./chunk-FSPFV4MI.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{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),[N,j]=c(!1),[y,x]=c(""),[C,f]=c([]),[v,$]=c(!1),[T,E]=c(()=>e(h)),[W,w]=c(!1),[D,J]=c(T),R=i(null);n(l(()=>{J({...T}),w(!0)},[T]));const S=l(e=>{x(""),k(t=>N||"0"===t?(j(!1),"."===e?"0.":e):"."===e&&t.includes(".")?t:t+e)},[N]),G=l(()=>{k("0"),d(null),g(null),j(!1)},[]),K=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}},[]),A=l(e=>{const t=parseFloat(m);if(null!==p&&b&&!N){const e=K(p,t,b);k(String(e)),d(e),f(n=>[`${p} ${b} ${t} = ${e}`,...n].slice(0,20))}else d(t);g(e),j(!0)},[m,p,b,N,K]),B=l(()=>{if(null===p||!b)return;const e=parseFloat(m),t=K(p,e,b),n=`${p} ${b} ${e} =`;f(e=>[`${n} ${t}`,...e].slice(0,20)),x(n),k(String(t)),d(null),g(null),j(!0)},[m,p,b,K]),F=l(()=>{k(e=>String(parseFloat(e)/100))},[]),Q=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"?S(e.key):"."===e.key?S("."):"+"===e.key?A("+"):"-"===e.key?A("-"):"*"===e.key?A("×"):"/"===e.key?(e.preventDefault(),A("÷")):"Enter"===e.key||"="===e.key?("Enter"===e.key&&e.target instanceof Node&&R.current?.contains(e.target)&&e.preventDefault(),B()):"Escape"===e.key?G():"Backspace"===e.key?k(e=>e.length>1?e.slice(0,-1):"0"):"%"===e.key&&F())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[S,A,B,G,F]);const U="flex items-center justify-center rounded-lg text-sm font-medium transition-colors",V=`${U} bg-white border border-gray-200 text-gray-900 hover:bg-gray-50 active:bg-gray-100`,M=`${U} bg-blue-50 border border-blue-200 text-blue-700 hover:bg-blue-100 active:bg-blue-200`,L=`${U} bg-gray-100 border border-gray-200 text-gray-600 hover:bg-gray-200 active:bg-gray-300`,P=`${U} bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800`;/* @__PURE__ */
2
- return s(a,{children:[
3
- /* @__PURE__ */s("div",{ref:R,className:"flex flex-col h-full",style:{opacity:T.activeOpacity/100,backdropFilter:T.activeBlur>0?`blur(${T.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:C.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} ${N?"":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:G,className:L,children:"AC"}),
11
- /* @__PURE__ */u("button",{onClick:Q,className:L,children:"+/−"}),
12
- /* @__PURE__ */u("button",{onClick:F,className:L,children:"%"}),
13
- /* @__PURE__ */u("button",{onClick:()=>A("÷"),className:`${M} ${"÷"===b?"ring-2 ring-blue-400":""}`,children:"÷"}),
14
- /* @__PURE__ */u("button",{onClick:()=>S("7"),className:V,children:"7"}),
15
- /* @__PURE__ */u("button",{onClick:()=>S("8"),className:V,children:"8"}),
16
- /* @__PURE__ */u("button",{onClick:()=>S("9"),className:V,children:"9"}),
17
- /* @__PURE__ */u("button",{onClick:()=>A("×"),className:`${M} ${"×"===b?"ring-2 ring-blue-400":""}`,children:"×"}),
18
- /* @__PURE__ */u("button",{onClick:()=>S("4"),className:V,children:"4"}),
19
- /* @__PURE__ */u("button",{onClick:()=>S("5"),className:V,children:"5"}),
20
- /* @__PURE__ */u("button",{onClick:()=>S("6"),className:V,children:"6"}),
21
- /* @__PURE__ */u("button",{onClick:()=>A("-"),className:`${M} ${"-"===b?"ring-2 ring-blue-400":""}`,children:"−"}),
22
- /* @__PURE__ */u("button",{onClick:()=>S("1"),className:V,children:"1"}),
23
- /* @__PURE__ */u("button",{onClick:()=>S("2"),className:V,children:"2"}),
24
- /* @__PURE__ */u("button",{onClick:()=>S("3"),className:V,children:"3"}),
25
- /* @__PURE__ */u("button",{onClick:()=>A("+"),className:`${M} ${"+"===b?"ring-2 ring-blue-400":""}`,children:"+"}),
26
- /* @__PURE__ */u("button",{onClick:()=>S("0"),className:`${V} col-span-2`,children:"0"}),
27
- /* @__PURE__ */u("button",{onClick:()=>S("."),className:V,children:"."}),
28
- /* @__PURE__ */u("button",{onClick:B,className:P,children:"="})]})]}),
29
- /* @__PURE__ */u(t,{open:W,onClose:()=>w(!1),title:"Calculator Settings",appearance:D,onAppearanceChange:J,onSave:()=>{E(D),localStorage.setItem(h,JSON.stringify(D)),w(!1)}})]})}export{m as default};
@@ -1,21 +0,0 @@
1
- import{loadAppearance as t,WidgetSettingsModal as e}from"./chunk-U4BMS5EV.js";import{useWidgetSettings as r}from"./chunk-KJY57QPT.js";import"./chunk-CY5N5OA3.js";import"./chunk-AW7TOB6N.js";import"./chunk-KNUR2UEG.js";import"./chunk-JDCM2VHG.js";import"./chunk-BMPBVI7P.js";import"./chunk-5A7MWTXX.js";import"./chunk-Y53KNQKL.js";import"./chunk-6WWAQC5V.js";import"./chunk-EGDJEY4K.js";import"./chunk-GNPTNAZH.js";import"./chunk-KC3EX26K.js";import"./chunk-4AJRHTTB.js";import"./chunk-VWGWZY7A.js";import"./chunk-PKXQDCNR.js";import"./chunk-UGTRSRIW.js";import"./chunk-ET2EF5CI.js";import"./chunk-CDAJKLGL.js";import"./chunk-DXTKNHWG.js";import"./chunk-QR4RM7PO.js";import"./chunk-5QFPTDQF.js";import"./chunk-D323R2FT.js";import"./chunk-4IU5BSVE.js";import"./chunk-K7U4RWXJ.js";import"./chunk-VH6GB73Q.js";import"./chunk-FSPFV4MI.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 j={USD:"🇺🇸",CNY:"🇨🇳",AUD:"🇦🇺",GBP:"🇬🇧",JPY:"🇯🇵",CAD:"🇨🇦",EUR:"🇪🇺",THB:"🇹🇭",NZD:"🇳🇿",SGD:"🇸🇬",HKD:"🇭🇰",CHF:"🇨🇭",KRW:"🇰🇷",INR:"🇮🇳",MXN:"🇲🇽",BRL:"🇧🇷"};function f(){const[u,d]=s(N),[f,y]=s(()=>t(h)),[x,b]=s({}),[D,S]=s(!1),[C,v]=s(!1),[J,U]=s([]),[R,B]=s(f),[G,T]=s("USD"),[A,K]=s("CNY");r(a(()=>{U([...u]),B({...f}),v(!0)},[u,f])),o(()=>{const t=[...new Set(u.map(([t])=>t))];let e=!0;return async function(){S(!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),S(!1))}(),()=>{e=!1}},[u]);/* @__PURE__ */
2
- return c(i,{children:[
3
- /* @__PURE__ */l("div",{style:{backgroundColor:`rgb(var(--taskbar-bg-rgb, 243 244 246) / ${f.activeOpacity/100})`,backdropFilter:f.activeBlur>0?`blur(${f.activeBlur}px)`:void 0},children:/* @__PURE__ */c("div",{className:"px-4 py-3 space-y-1",children:[D&&/* @__PURE__ */l(n,{size:"sm",padding:"py-4",label:"Loading rates"}),u.map(([t,e],r)=>{const n=x[t]?.[e];/* @__PURE__ */
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
- /* @__PURE__ */c("div",{className:"flex items-center gap-2",children:[
6
- /* @__PURE__ */l("span",{className:"text-base",children:j[t]||""}),
7
- /* @__PURE__ */l("span",{className:"text-sm font-semibold text-gray-700",children:t}),
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:j[e]||""}),
10
- /* @__PURE__ */l("span",{className:"text-sm font-semibold text-gray-700",children:e})]}),
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:B,onSave:()=>{if(0===J.length)return;const t=J.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:[
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:["(",J.length,"/",4,")"]})]}),
15
- /* @__PURE__ */l("div",{className:"space-y-1 mb-2",children:J.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))}),J.length<4?/* @__PURE__ */c("div",{className:"flex items-center gap-2",children:[
18
- /* @__PURE__ */l("select",{value:G,onChange:t=>T(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
- /* @__PURE__ */l("span",{className:"text-gray-400",children:"→"}),
20
- /* @__PURE__ */l("select",{value:A,onChange:t=>K(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:()=>{G!==A&&J.length<4&&U(t=>[...t,[G,A]])},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{f as default};