optikos 0.1.0 → 0.3.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 (390) hide show
  1. package/CHANGELOG.md +135 -0
  2. package/README.md +13 -11
  3. package/dist/chunk-23XLG2EM.js +2 -0
  4. package/dist/{chunk-666O2GKD.js.map → chunk-23XLG2EM.js.map} +1 -1
  5. package/dist/chunk-2YZB6XQR.js +2 -0
  6. package/dist/chunk-2YZB6XQR.js.map +7 -0
  7. package/dist/chunk-2ZRNGG2N.js +2 -0
  8. package/dist/chunk-2ZRNGG2N.js.map +7 -0
  9. package/dist/chunk-2ZUZ5HDL.js +2 -0
  10. package/dist/chunk-2ZUZ5HDL.js.map +7 -0
  11. package/dist/chunk-3S24ZRPK.js +2 -0
  12. package/dist/chunk-3S24ZRPK.js.map +7 -0
  13. package/dist/chunk-3TAW4AKH.js +2 -0
  14. package/dist/chunk-3TAW4AKH.js.map +7 -0
  15. package/dist/chunk-4EQEHJB3.js +2 -0
  16. package/dist/chunk-4EQEHJB3.js.map +7 -0
  17. package/dist/chunk-4EZJ5FKJ.js +2 -0
  18. package/dist/{chunk-IHAYOSBR.js.map → chunk-4EZJ5FKJ.js.map} +1 -1
  19. package/dist/chunk-4LZZ244E.js +2 -0
  20. package/dist/chunk-4LZZ244E.js.map +7 -0
  21. package/dist/chunk-4SYIIX5A.js +2 -0
  22. package/dist/chunk-4SYIIX5A.js.map +7 -0
  23. package/dist/chunk-5BC72727.js +2 -0
  24. package/dist/chunk-5BC72727.js.map +7 -0
  25. package/dist/chunk-5DJTP53N.js +2 -0
  26. package/dist/{chunk-ODWPBBVL.js.map → chunk-5DJTP53N.js.map} +1 -1
  27. package/dist/{chunk-NWTTHDIM.js → chunk-5JEXM5S7.js} +2 -2
  28. package/dist/chunk-5Q76ACVI.js +2 -0
  29. package/dist/{chunk-O4DCHALR.js.map → chunk-5Q76ACVI.js.map} +1 -1
  30. package/dist/chunk-5QUY72FX.js +2 -0
  31. package/dist/chunk-5QUY72FX.js.map +7 -0
  32. package/dist/{chunk-NV5AIBQP.js → chunk-6VBK2I5B.js} +2 -2
  33. package/dist/{chunk-ZYUXCZX7.js → chunk-7KMIFXHZ.js} +2 -2
  34. package/dist/{chunk-IYPKPLCU.js → chunk-A2NKDOYN.js} +2 -2
  35. package/dist/chunk-A2NKDOYN.js.map +7 -0
  36. package/dist/chunk-CKXS375P.js +2 -0
  37. package/dist/chunk-CKXS375P.js.map +7 -0
  38. package/dist/chunk-DBMWS3O5.js +2 -0
  39. package/dist/chunk-DBMWS3O5.js.map +7 -0
  40. package/dist/chunk-E4VNLYO2.js +2 -0
  41. package/dist/chunk-E4VNLYO2.js.map +7 -0
  42. package/dist/chunk-EDUMAMK4.js +2 -0
  43. package/dist/chunk-EDUMAMK4.js.map +7 -0
  44. package/dist/chunk-EJGWCKE4.js +2 -0
  45. package/dist/{chunk-4DHQKECB.js.map → chunk-EJGWCKE4.js.map} +1 -1
  46. package/dist/chunk-ELYARUCN.js +2 -0
  47. package/dist/{chunk-Z25NC4CS.js → chunk-EV73ADN2.js} +2 -2
  48. package/dist/{chunk-LV6HXFHU.js → chunk-FEHGU6EP.js} +3 -3
  49. package/dist/chunk-FEHGU6EP.js.map +7 -0
  50. package/dist/chunk-G2DAD3MQ.js +2 -0
  51. package/dist/chunk-G2DAD3MQ.js.map +7 -0
  52. package/dist/chunk-G2KUK6AT.js +2 -0
  53. package/dist/chunk-GD5JGKM7.js +2 -0
  54. package/dist/chunk-GD5JGKM7.js.map +7 -0
  55. package/dist/{chunk-LBCWEWPN.js → chunk-GNU4VOOE.js} +2 -2
  56. package/dist/{chunk-IW7PK4VS.js → chunk-GZ7X34QP.js} +2 -2
  57. package/dist/chunk-HOF4JGMQ.js +2 -0
  58. package/dist/chunk-HOF4JGMQ.js.map +7 -0
  59. package/dist/chunk-HXDTGP2K.js +2 -0
  60. package/dist/chunk-HXDTGP2K.js.map +7 -0
  61. package/dist/{chunk-QEQIJAAB.js → chunk-I4SP6JTU.js} +2 -2
  62. package/dist/chunk-IHE2MQ3W.js +2 -0
  63. package/dist/{chunk-OW2ZSMGS.js.map → chunk-IHE2MQ3W.js.map} +1 -1
  64. package/dist/chunk-JBLRAM7Z.js +2 -0
  65. package/dist/{chunk-JZNEB7A7.js.map → chunk-JBLRAM7Z.js.map} +1 -1
  66. package/dist/{chunk-4SUKNSCY.js → chunk-JI265XFO.js} +2 -2
  67. package/dist/chunk-JK74QK3M.js +2 -0
  68. package/dist/chunk-JK74QK3M.js.map +7 -0
  69. package/dist/chunk-JOFQJGZK.js +2 -0
  70. package/dist/chunk-JOFQJGZK.js.map +7 -0
  71. package/dist/chunk-KCEUD232.js +2 -0
  72. package/dist/chunk-KCEUD232.js.map +7 -0
  73. package/dist/chunk-KLLAY2IM.js +2 -0
  74. package/dist/chunk-KLLAY2IM.js.map +7 -0
  75. package/dist/chunk-LBJSMXLV.js +2 -0
  76. package/dist/chunk-LBJSMXLV.js.map +7 -0
  77. package/dist/chunk-LQRFNQ2N.js +2 -0
  78. package/dist/chunk-LQRFNQ2N.js.map +7 -0
  79. package/dist/{chunk-NDBFYIL6.js → chunk-LW2WRUVL.js} +2 -2
  80. package/dist/{chunk-NDBFYIL6.js.map → chunk-LW2WRUVL.js.map} +2 -2
  81. package/dist/chunk-M242VYZA.js +2 -0
  82. package/dist/{chunk-XVIC24AW.js.map → chunk-M242VYZA.js.map} +1 -1
  83. package/dist/chunk-MB3MU6HR.js +2 -0
  84. package/dist/chunk-MB3MU6HR.js.map +7 -0
  85. package/dist/chunk-MW3RWBZ7.js +2 -0
  86. package/dist/chunk-MW3RWBZ7.js.map +7 -0
  87. package/dist/chunk-NXSTUFS7.js +2 -0
  88. package/dist/chunk-NXSTUFS7.js.map +7 -0
  89. package/dist/chunk-OEAXCCVM.js +2 -0
  90. package/dist/chunk-OEAXCCVM.js.map +7 -0
  91. package/dist/chunk-OGRFQTXA.js +2 -0
  92. package/dist/chunk-OGRFQTXA.js.map +7 -0
  93. package/dist/chunk-Q26YZYTD.js +2 -0
  94. package/dist/chunk-Q26YZYTD.js.map +7 -0
  95. package/dist/chunk-REW4LR46.js +2 -0
  96. package/dist/chunk-REW4LR46.js.map +7 -0
  97. package/dist/chunk-RNN55473.js +2 -0
  98. package/dist/chunk-RNN55473.js.map +7 -0
  99. package/dist/{chunk-6NJW7QFD.js → chunk-SA53QUBF.js} +2 -2
  100. package/dist/chunk-TIPK3SCJ.js +2 -0
  101. package/dist/chunk-TIPK3SCJ.js.map +7 -0
  102. package/dist/{chunk-TBLICXWW.js → chunk-TOLTUOZS.js} +2 -2
  103. package/dist/{chunk-DXO3UJKL.js → chunk-TZOQWCVH.js} +2 -2
  104. package/dist/chunk-UB5RYS7T.js +2 -0
  105. package/dist/chunk-UB5RYS7T.js.map +7 -0
  106. package/dist/chunk-UXXJOU5J.js +2 -0
  107. package/dist/chunk-UXXJOU5J.js.map +7 -0
  108. package/dist/chunk-VU3GIDZ3.js +2 -0
  109. package/dist/chunk-VU3GIDZ3.js.map +7 -0
  110. package/dist/chunk-W2BAFOCN.js +3 -0
  111. package/dist/chunk-W2BAFOCN.js.map +7 -0
  112. package/dist/{chunk-SNTHW4K2.js → chunk-W3H7GTJY.js} +2 -2
  113. package/dist/chunk-WFGTQZIQ.js +2 -0
  114. package/dist/chunk-WFGTQZIQ.js.map +7 -0
  115. package/dist/{chunk-ZHVSHDLH.js → chunk-XHOBNSBO.js} +2 -2
  116. package/dist/chunk-XX2MVWFS.js +4 -0
  117. package/dist/chunk-XX2MVWFS.js.map +7 -0
  118. package/dist/chunk-XYZ6VZ5T.js +2 -0
  119. package/dist/chunk-XYZ6VZ5T.js.map +7 -0
  120. package/dist/chunk-YBAYEU25.js +2 -0
  121. package/dist/chunk-YBAYEU25.js.map +7 -0
  122. package/dist/chunk-YF75HKL6.js +2 -0
  123. package/dist/chunk-YF75HKL6.js.map +7 -0
  124. package/dist/chunk-YHEMA56R.js +2 -0
  125. package/dist/{chunk-5GNEFX6F.js.map → chunk-YHEMA56R.js.map} +1 -1
  126. package/dist/chunk-Z2JBUHKA.js +2 -0
  127. package/dist/chunk-Z2JBUHKA.js.map +7 -0
  128. package/dist/{chunk-6O2BXCRN.js → chunk-Z2Z52GFT.js} +2 -2
  129. package/dist/chunk-ZPPELYNJ.js +2 -0
  130. package/dist/chunk-ZPPELYNJ.js.map +7 -0
  131. package/dist/chunk-ZVK4L5GK.js +2 -0
  132. package/dist/chunk-ZVK4L5GK.js.map +7 -0
  133. package/dist/chunk-ZWNQREWS.js +2 -0
  134. package/dist/chunk-ZWNQREWS.js.map +7 -0
  135. package/dist/components/badge.js +2 -0
  136. package/dist/components/badge.js.map +7 -0
  137. package/dist/components/breadcrumb.js +1 -1
  138. package/dist/components/button.js +1 -1
  139. package/dist/components/calendar.js +1 -1
  140. package/dist/components/cellediting.js +2 -0
  141. package/dist/components/cellediting.js.map +7 -0
  142. package/dist/components/chat.js +1 -1
  143. package/dist/components/checkbox.js +1 -1
  144. package/dist/components/checkboxgroup.js +2 -0
  145. package/dist/components/checkboxgroup.js.map +7 -0
  146. package/dist/components/chip.js +2 -0
  147. package/dist/components/chip.js.map +7 -0
  148. package/dist/components/codeviewer.js +2 -0
  149. package/dist/components/codeviewer.js.map +7 -0
  150. package/dist/components/combobox.js +1 -1
  151. package/dist/components/commandpalette.js +1 -1
  152. package/dist/components/container.js +1 -1
  153. package/dist/components/dataview.js +1 -1
  154. package/dist/components/datefield.js +1 -1
  155. package/dist/components/daterangefield.js +1 -1
  156. package/dist/components/dial.js +2 -0
  157. package/dist/components/dial.js.map +7 -0
  158. package/dist/components/dropdown.js +1 -1
  159. package/dist/components/fieldgroup.js +2 -0
  160. package/dist/components/fieldgroup.js.map +7 -0
  161. package/dist/components/fieldlist.js +2 -0
  162. package/dist/components/fieldlist.js.map +7 -0
  163. package/dist/components/fieldset.js +1 -1
  164. package/dist/components/filterbuilder.js +1 -1
  165. package/dist/components/form.js +1 -1
  166. package/dist/components/formactions.js +2 -0
  167. package/dist/components/formactions.js.map +7 -0
  168. package/dist/components/formerrors.js +2 -0
  169. package/dist/components/formerrors.js.map +7 -0
  170. package/dist/components/formsection.js +2 -0
  171. package/dist/components/formsection.js.map +7 -0
  172. package/dist/components/grid.js +1 -1
  173. package/dist/components/icon.js +1 -1
  174. package/dist/components/inputgroup.js +2 -0
  175. package/dist/components/inputgroup.js.map +7 -0
  176. package/dist/components/label.js +1 -1
  177. package/dist/components/listbox.js +1 -1
  178. package/dist/components/lookupfield.js +1 -1
  179. package/dist/components/menu.js +1 -1
  180. package/dist/components/messagebox.js +1 -1
  181. package/dist/components/navmenu.js +1 -1
  182. package/dist/components/numberfield.js +1 -1
  183. package/dist/components/pagination.js +1 -1
  184. package/dist/components/panel.js +1 -1
  185. package/dist/components/pickerfield.js +1 -1
  186. package/dist/components/radiogroup.js +1 -1
  187. package/dist/components/searchgrid.js +1 -1
  188. package/dist/components/secretfield.js +1 -1
  189. package/dist/components/select.js +1 -1
  190. package/dist/components/slider.js +1 -1
  191. package/dist/components/spacer.js +1 -1
  192. package/dist/components/spinner.js +1 -1
  193. package/dist/components/stepform.js +1 -1
  194. package/dist/components/stepper.js +1 -1
  195. package/dist/components/suggestfield.js +1 -1
  196. package/dist/components/table.js +1 -1
  197. package/dist/components/tabs.js +1 -1
  198. package/dist/components/textarea.js +1 -1
  199. package/dist/components/textfield.js +1 -1
  200. package/dist/components/toast.js +1 -1
  201. package/dist/components/toggle.js +2 -0
  202. package/dist/components/toggle.js.map +7 -0
  203. package/dist/components/toolbar.js +1 -1
  204. package/dist/components/tooltip.js +1 -1
  205. package/dist/components/tree.js +2 -0
  206. package/dist/components/tree.js.map +7 -0
  207. package/dist/components/viewmanager.js +1 -1
  208. package/dist/components/viewport.js +1 -1
  209. package/dist/components/widget.js +1 -1
  210. package/dist/components/window.js +1 -1
  211. package/dist/core.js +1 -1
  212. package/dist/css/badge.css +39 -0
  213. package/dist/css/base.css +71 -51
  214. package/dist/css/button.css +2 -0
  215. package/dist/css/cellediting.css +33 -0
  216. package/dist/css/chat.css +0 -1
  217. package/dist/css/checkboxgroup.css +12 -0
  218. package/dist/css/chip.css +64 -0
  219. package/dist/css/codeviewer.css +109 -0
  220. package/dist/css/dial.css +203 -0
  221. package/dist/css/fieldgroup.css +26 -0
  222. package/dist/css/fieldlist.css +84 -0
  223. package/dist/css/fieldset.css +36 -0
  224. package/dist/css/formactions.css +40 -0
  225. package/dist/css/formerrors.css +39 -0
  226. package/dist/css/formsection.css +45 -0
  227. package/dist/css/grid.css +14 -3
  228. package/dist/css/inputgroup.css +58 -0
  229. package/dist/css/menu.css +54 -0
  230. package/dist/css/navmenu.css +9 -7
  231. package/dist/css/panel.css +8 -1
  232. package/dist/css/stepform.css +9 -0
  233. package/dist/css/stepper.css +7 -2
  234. package/dist/css/tabs.css +12 -3
  235. package/dist/css/toggle.css +39 -0
  236. package/dist/css/tree.css +94 -0
  237. package/dist/css/widget.css +58 -0
  238. package/dist/css/window.css +4 -0
  239. package/dist/data.js +1 -1
  240. package/dist/index.js +3 -3
  241. package/dist/index.js.map +3 -3
  242. package/dist/optikos.css +1221 -106
  243. package/dist/themes/dark.css +47 -32
  244. package/dist/types/components/badge.d.ts +1 -0
  245. package/dist/types/components/base/badge/badge.d.ts +18 -0
  246. package/dist/types/components/base/chip/chip.d.ts +27 -0
  247. package/dist/types/components/base/codeviewer/codeviewer.d.ts +48 -0
  248. package/dist/types/components/cellediting.d.ts +1 -0
  249. package/dist/types/components/checkboxgroup.d.ts +1 -0
  250. package/dist/types/components/chip.d.ts +1 -0
  251. package/dist/types/components/codeviewer.d.ts +1 -0
  252. package/dist/types/components/data/cellediting/cellediting.d.ts +10 -0
  253. package/dist/types/components/data/filterbuilder/filterbuilder.d.ts +3 -1
  254. package/dist/types/components/data/grid/grid.d.ts +42 -16
  255. package/dist/types/components/data/tree/tree.d.ts +71 -0
  256. package/dist/types/components/dial.d.ts +1 -0
  257. package/dist/types/components/fieldgroup.d.ts +1 -0
  258. package/dist/types/components/fieldlist.d.ts +1 -0
  259. package/dist/types/components/fields/checkboxgroup/checkboxgroup.d.ts +27 -0
  260. package/dist/types/components/fields/dial/dial.d.ts +84 -0
  261. package/dist/types/components/fields/toggle/toggle.d.ts +9 -0
  262. package/dist/types/components/form/fieldgroup/fieldgroup.d.ts +33 -0
  263. package/dist/types/components/form/fieldlist/fieldlist.d.ts +58 -0
  264. package/dist/types/components/form/form/form.d.ts +19 -2
  265. package/dist/types/components/form/formactions/formactions.d.ts +34 -0
  266. package/dist/types/components/form/formerrors/formerrors.d.ts +23 -0
  267. package/dist/types/components/form/formsection/formsection.d.ts +26 -0
  268. package/dist/types/components/form/inputgroup/inputgroup.d.ts +28 -0
  269. package/dist/types/components/form/stepform/stepform.d.ts +30 -4
  270. package/dist/types/components/formactions.d.ts +1 -0
  271. package/dist/types/components/formerrors.d.ts +1 -0
  272. package/dist/types/components/formsection.d.ts +1 -0
  273. package/dist/types/components/inputgroup.d.ts +1 -0
  274. package/dist/types/components/layout/fieldset/fieldset.d.ts +9 -0
  275. package/dist/types/components/layout/panel/panel.d.ts +6 -0
  276. package/dist/types/components/layout/panel/reload.d.ts +1 -0
  277. package/dist/types/components/navigation/navmenu/navmenu.d.ts +6 -0
  278. package/dist/types/components/navigation/tabs/tabs.d.ts +8 -0
  279. package/dist/types/components/overlays/menu/menu.d.ts +17 -0
  280. package/dist/types/components/overlays/messagebox/messagebox.d.ts +8 -0
  281. package/dist/types/components/overlays/widget/widget.d.ts +13 -0
  282. package/dist/types/components/overlays/window/window.d.ts +8 -1
  283. package/dist/types/components/toggle.d.ts +1 -0
  284. package/dist/types/components/tree.d.ts +1 -0
  285. package/dist/types/core/component.d.ts +6 -2
  286. package/dist/types/core/i18n.d.ts +5 -0
  287. package/dist/types/core/index.d.ts +1 -1
  288. package/dist/types/core/position.d.ts +4 -1
  289. package/dist/types/data/column.d.ts +9 -4
  290. package/dist/types/index.d.ts +14 -0
  291. package/dist/types/themes/define.d.ts +4 -3
  292. package/dist/types/ui/enums.d.ts +0 -6
  293. package/dist/types/ui/ui.d.ts +12 -3
  294. package/dist/ui.js +1 -1
  295. package/package.json +6 -1
  296. package/dist/chunk-4COBH4QJ.js +0 -2
  297. package/dist/chunk-4COBH4QJ.js.map +0 -7
  298. package/dist/chunk-4DHQKECB.js +0 -2
  299. package/dist/chunk-4Q67QI7J.js +0 -2
  300. package/dist/chunk-4Q67QI7J.js.map +0 -7
  301. package/dist/chunk-5AXLYDKU.js +0 -2
  302. package/dist/chunk-5AXLYDKU.js.map +0 -7
  303. package/dist/chunk-5GNEFX6F.js +0 -2
  304. package/dist/chunk-5Q6Y6CM4.js +0 -2
  305. package/dist/chunk-5Q6Y6CM4.js.map +0 -7
  306. package/dist/chunk-666O2GKD.js +0 -2
  307. package/dist/chunk-A66MDXHL.js +0 -2
  308. package/dist/chunk-A66MDXHL.js.map +0 -7
  309. package/dist/chunk-ARCW54L2.js +0 -2
  310. package/dist/chunk-ARCW54L2.js.map +0 -7
  311. package/dist/chunk-BIYNHKSA.js +0 -2
  312. package/dist/chunk-BIYNHKSA.js.map +0 -7
  313. package/dist/chunk-BNPVRIFT.js +0 -2
  314. package/dist/chunk-BNPVRIFT.js.map +0 -7
  315. package/dist/chunk-C3N7QTQB.js +0 -2
  316. package/dist/chunk-C3N7QTQB.js.map +0 -7
  317. package/dist/chunk-CEXY5A4T.js +0 -2
  318. package/dist/chunk-CN7USUJR.js +0 -2
  319. package/dist/chunk-CN7USUJR.js.map +0 -7
  320. package/dist/chunk-CQRHNTEX.js +0 -2
  321. package/dist/chunk-CUPAPOKC.js +0 -2
  322. package/dist/chunk-CUPAPOKC.js.map +0 -7
  323. package/dist/chunk-GZNQPENR.js +0 -2
  324. package/dist/chunk-GZNQPENR.js.map +0 -7
  325. package/dist/chunk-HFFK6K4K.js +0 -2
  326. package/dist/chunk-HFFK6K4K.js.map +0 -7
  327. package/dist/chunk-IHAYOSBR.js +0 -2
  328. package/dist/chunk-IO66A6G5.js +0 -2
  329. package/dist/chunk-IO66A6G5.js.map +0 -7
  330. package/dist/chunk-IYPKPLCU.js.map +0 -7
  331. package/dist/chunk-JTYWZMSZ.js +0 -2
  332. package/dist/chunk-JTYWZMSZ.js.map +0 -7
  333. package/dist/chunk-JVEPKW5X.js +0 -2
  334. package/dist/chunk-JVEPKW5X.js.map +0 -7
  335. package/dist/chunk-JZNEB7A7.js +0 -2
  336. package/dist/chunk-K2DGY6MP.js +0 -2
  337. package/dist/chunk-K2DGY6MP.js.map +0 -7
  338. package/dist/chunk-LEE2FEEL.js +0 -2
  339. package/dist/chunk-LEE2FEEL.js.map +0 -7
  340. package/dist/chunk-LMGCV35W.js +0 -2
  341. package/dist/chunk-LMGCV35W.js.map +0 -7
  342. package/dist/chunk-LV6HXFHU.js.map +0 -7
  343. package/dist/chunk-MA5BJL3S.js +0 -2
  344. package/dist/chunk-MA5BJL3S.js.map +0 -7
  345. package/dist/chunk-NHVEP72K.js +0 -2
  346. package/dist/chunk-NHVEP72K.js.map +0 -7
  347. package/dist/chunk-O4DCHALR.js +0 -2
  348. package/dist/chunk-ODWPBBVL.js +0 -2
  349. package/dist/chunk-OW2ZSMGS.js +0 -2
  350. package/dist/chunk-PSPQH35P.js +0 -2
  351. package/dist/chunk-PSPQH35P.js.map +0 -7
  352. package/dist/chunk-T4OYVG2X.js +0 -2
  353. package/dist/chunk-T4OYVG2X.js.map +0 -7
  354. package/dist/chunk-TK2RC3T5.js +0 -2
  355. package/dist/chunk-TK2RC3T5.js.map +0 -7
  356. package/dist/chunk-U3X2FW6U.js +0 -2
  357. package/dist/chunk-U3X2FW6U.js.map +0 -7
  358. package/dist/chunk-UPOBGNJ5.js +0 -2
  359. package/dist/chunk-UPOBGNJ5.js.map +0 -7
  360. package/dist/chunk-XVIC24AW.js +0 -2
  361. package/dist/chunk-XZ5CUZZP.js +0 -2
  362. package/dist/chunk-XZ5CUZZP.js.map +0 -7
  363. package/dist/chunk-XZEOSW3Q.js +0 -2
  364. package/dist/chunk-XZEOSW3Q.js.map +0 -7
  365. package/dist/chunk-YET5PM6F.js +0 -2
  366. package/dist/chunk-YET5PM6F.js.map +0 -7
  367. package/dist/chunk-ZCAAM4NH.js +0 -2
  368. package/dist/chunk-ZCAAM4NH.js.map +0 -7
  369. package/dist/themes/brand.css +0 -240
  370. package/dist/themes/brutal.css +0 -100
  371. package/dist/themes/corporate.css +0 -112
  372. package/dist/themes/editorial.css +0 -110
  373. package/dist/themes/soft.css +0 -101
  374. package/dist/themes/terminal.css +0 -91
  375. /package/dist/{chunk-NWTTHDIM.js.map → chunk-5JEXM5S7.js.map} +0 -0
  376. /package/dist/{chunk-NV5AIBQP.js.map → chunk-6VBK2I5B.js.map} +0 -0
  377. /package/dist/{chunk-ZYUXCZX7.js.map → chunk-7KMIFXHZ.js.map} +0 -0
  378. /package/dist/{chunk-CEXY5A4T.js.map → chunk-ELYARUCN.js.map} +0 -0
  379. /package/dist/{chunk-Z25NC4CS.js.map → chunk-EV73ADN2.js.map} +0 -0
  380. /package/dist/{chunk-CQRHNTEX.js.map → chunk-G2KUK6AT.js.map} +0 -0
  381. /package/dist/{chunk-LBCWEWPN.js.map → chunk-GNU4VOOE.js.map} +0 -0
  382. /package/dist/{chunk-IW7PK4VS.js.map → chunk-GZ7X34QP.js.map} +0 -0
  383. /package/dist/{chunk-QEQIJAAB.js.map → chunk-I4SP6JTU.js.map} +0 -0
  384. /package/dist/{chunk-4SUKNSCY.js.map → chunk-JI265XFO.js.map} +0 -0
  385. /package/dist/{chunk-6NJW7QFD.js.map → chunk-SA53QUBF.js.map} +0 -0
  386. /package/dist/{chunk-TBLICXWW.js.map → chunk-TOLTUOZS.js.map} +0 -0
  387. /package/dist/{chunk-DXO3UJKL.js.map → chunk-TZOQWCVH.js.map} +0 -0
  388. /package/dist/{chunk-SNTHW4K2.js.map → chunk-W3H7GTJY.js.map} +0 -0
  389. /package/dist/{chunk-ZHVSHDLH.js.map → chunk-XHOBNSBO.js.map} +0 -0
  390. /package/dist/{chunk-6O2BXCRN.js.map → chunk-Z2Z52GFT.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/fields/secretfield/secretfield.ts"],
4
- "sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { iconEl } from '../../base/icon/icon';\nimport { MessageBox } from '../../overlays/messagebox/messagebox';\n\nexport interface SecretFieldConfig extends TextFieldConfig<string | null> {\n /** A secret is already saved. It can never be shown; it can only be replaced. `form.load({ key: true })` sets it too. */\n stored?: boolean;\n /** Ask before replacing a saved secret. Default true. */\n confirmReplace?: boolean;\n replaceTitle?: string;\n replaceText?: string;\n /** The eye hides the value again when the field loses focus. Default true. */\n autoHide?: boolean;\n}\n\nconst MASK = '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022';\n\n/**\n * A field for secrets. While you type you can peek at what you typed (the eye); once a secret is saved it is shown only as a\n * mask and can never be read back: to change it you replace it, after a warning. `getValue()` is `null` while untouched\n * (keep what is saved), the new text once typed, `''` when replaced and left empty.\n */\nexport class SecretField extends TextField<string | null, SecretFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-secret';\n private stored = false;\n private initialStored = false;\n private replacing = false;\n private revealed = false;\n private eyeBtn!: HTMLButtonElement;\n private replaceBtn!: HTMLButtonElement;\n private keepBtn!: HTMLButtonElement;\n private hint!: HTMLElement;\n\n constructor(config: SecretFieldConfig = {}) {\n super({ autocomplete: 'new-password', ...config, inputType: 'password' });\n this.stored = this.initialStored = !!config.stored;\n }\n\n protected override emptyValue(): string | null {\n return null;\n }\n /** A saved secret that was not touched counts as filled in (so `required` is satisfied). */\n protected override isEmpty(v: string | null) {\n return !this.stored && (v == null || v === '');\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const input = this.input;\n input.spellcheck = false;\n this.eyeBtn = h('button', 'op-secret__eye', { type: 'button', 'aria-pressed': 'false' });\n this.replaceBtn = h('button', 'op-secret__replace', { type: 'button' }, t('secretReplace'));\n this.keepBtn = h('button', 'op-secret__keep', { type: 'button' }, t('secretKeep'));\n this.hint = h('div', 'op-secret__hint', { id: `${this.id}-hint` }, h('span', 'op-secret__note', {}, t('secretStored')), this.keepBtn);\n this.listen(this.eyeBtn, 'mousedown', (e: Event) => e.preventDefault()); // keep the focus in the input (it would hide the value)\n this.listen(this.eyeBtn, 'click', () => this.setRevealed(!this.revealed));\n this.listen(this.replaceBtn, 'click', () => void this.replace());\n this.listen(this.keepBtn, 'click', () => this.keep());\n // a saved secret is opened for replacement by clicking or pressing a key in the (read-only) field\n this.listen(input, 'click', () => this.stored && void this.replace());\n this.listen(input, 'keydown', (e: KeyboardEvent) => {\n if (this.stored && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n void this.replace();\n }\n });\n this.on('blur', () => this.config.autoHide !== false && this.setRevealed(false));\n wrap.append(this.eyeBtn, this.replaceBtn);\n return h('div', 'op-secret__box', {}, wrap, this.hint);\n }\n\n protected override onRender() {\n super.onRender();\n this.paint();\n }\n\n // ---- state ---------------------------------------------------------------------------------\n\n isStored(): boolean {\n return this.stored;\n }\n /** The user chose to replace a saved secret and has not finished. */\n isReplacing(): boolean {\n return this.replacing;\n }\n isRevealed(): boolean {\n return this.revealed;\n }\n\n /** Says whether a secret is saved (a saved secret is never given to the field, only the fact that it exists). */\n setStored(stored: boolean): void {\n this.stored = stored;\n this.replacing = false;\n this.revealed = false;\n super.setValue(null, true);\n this.paint();\n this.emit('stored-change', stored);\n }\n\n /** `true` (what `form.load` passes for \"a secret exists\") means saved; a string is a new value typed or set by code. */\n override setValue(v: string | boolean | null, silent = false): void {\n if (v === true) return this.setStored(true);\n if (v === false) v = null;\n if (this.stored && v != null) {\n this.stored = false;\n this.replacing = true;\n }\n super.setValue(v, silent);\n this.paint();\n }\n\n override markClean(): void {\n super.markClean();\n this.initialStored = this.stored;\n }\n /** Back to what was loaded: the saved secret, untouched. */\n override reset(): void {\n this.setStored(this.initialStored);\n super.reset();\n }\n\n /** Warns, then turns a saved secret into an empty field to type the new value in. Resolves to whether it was replaced. */\n async replace(): Promise<boolean> {\n if (!this.stored || this.config.readonly || this.config.disabled || this.emit('before-replace') === false) return false;\n if (this.config.confirmReplace !== false) {\n const ok = await MessageBox.confirm(this.config.replaceText ?? t('secretWarn'), { danger: true, title: this.config.replaceTitle ?? t('secretWarnTitle'), okText: t('secretReplace') });\n if (!ok) return false;\n }\n this.stored = false;\n this.replacing = true;\n super.setValue('', false);\n this.paint();\n this.input.focus();\n this.emit('replace');\n return true;\n }\n\n /** Gives up replacing: the saved secret stays as it was. */\n keep(): void {\n if (!this.replacing) return;\n this.stored = true;\n this.replacing = false;\n this.revealed = false;\n super.setValue(null, false);\n this.paint();\n this.emit('keep');\n }\n\n setRevealed(on: boolean): void {\n if (this.stored) on = false; // there is nothing to see\n this.revealed = on;\n this.paint();\n }\n\n /** Never reveals: a mask when there is something, nothing otherwise. */\n override getDisplayText(): string {\n return this.stored || (this.value ?? '') !== '' ? MASK : '';\n }\n\n // ---- view ----------------------------------------------------------------------------------\n\n private paint(): void {\n if (!this.rendered) return;\n const input = this.input as HTMLInputElement;\n const on = this.revealed && !this.stored;\n input.type = on ? 'text' : 'password';\n input.readOnly = this.stored || !!this.config.readonly;\n input.placeholder = this.stored ? MASK : (this.config.placeholder ?? '');\n if (this.stored) input.value = '';\n input.setAttribute('aria-describedby', this.stored || this.replacing ? this.hint.id : '');\n if (!this.stored && !this.replacing) input.removeAttribute('aria-describedby');\n this.eyeBtn.hidden = this.stored;\n this.eyeBtn.setAttribute('aria-pressed', String(on));\n this.eyeBtn.setAttribute('aria-label', t(on ? 'secretHide' : 'secretShow'));\n this.eyeBtn.replaceChildren(iconEl(on ? 'eye-off' : 'eye'));\n this.replaceBtn.hidden = !this.stored;\n this.hint.hidden = !this.stored && !this.replacing;\n (this.hint.querySelector('.op-secret__note') as HTMLElement).hidden = !this.stored;\n this.keepBtn.hidden = !this.replacing;\n this.el.classList.toggle('is-stored', this.stored);\n this.el.classList.toggle('is-replacing', this.replacing);\n this.el.classList.toggle('is-revealed', on);\n this.el.classList.toggle('has-value', this.stored || !!input.value);\n }\n}\nregister('secretfield', SecretField);\n"],
5
- "mappings": "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",
6
- "names": ["MASK", "SecretField", "TextField", "config", "v", "wrap", "input", "h", "t", "e", "stored", "silent", "MessageBox", "on", "iconEl", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as d}from"./chunk-5Q6Y6CM4.js";import{a as m}from"./chunk-ZCAAM4NH.js";import{a as v}from"./chunk-XZEOSW3Q.js";import{a as f,b as c}from"./chunk-IYPKPLCU.js";import{b as l}from"./chunk-PZSHOSOS.js";import{e as n}from"./chunk-MA5BJL3S.js";var w=()=>globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`;function P(a,e=localStorage){let t=()=>{try{let r=JSON.parse(e.getItem(a)??"[]");return Array.isArray(r)?r:[]}catch{return[]}},i=r=>e.setItem(a,JSON.stringify(r));return{list:t,save(r){let s={...r,id:r.id??w()},o=t(),u=o.findIndex(p=>p.id===s.id);return u<0?o.push(s):o[u]=s,i(o),s},remove(r){i(t().filter(s=>s.id!==r.id))}}}function M(a){let e=async(t,i="",r)=>{let s=await(a.fetch??fetch)(a.url+i,{method:t,headers:{"Content-Type":"application/json",...a.headers},body:r===void 0?void 0:JSON.stringify(r)});if(!s.ok)throw new Error(`Optikos views: ${t} ${a.url+i} \u2192 ${s.status}`);return s.status===204?void 0:s.json().catch(()=>{})};return{list:()=>e("GET"),save:t=>t.id?e("PUT",`/${encodeURIComponent(t.id)}`,t):e("POST","",t),remove:t=>e("DELETE",`/${encodeURIComponent(t.id)}`).then(()=>{})}}var h=class extends f{baseCls="op-viewmanager";btn;menu;views=[];current;initial={};build(){return this.btn=new v({text:n("views"),icon:"menu",variant:"ghost",handler:()=>this.openMenu()}),this.btn.el.setAttribute("aria-haspopup","menu"),this.own(()=>(this.btn.destroy(),this.menu?.destroy())),l("span",this.baseCls,{},this.btn.el)}onRender(){this.config.grid.render(),this.config.filters?.render(),this.initial=this.getState(),this.config.autoLoad!==!1&&this.reload()}notifyMount(){super.notifyMount(),this.btn.notifyMount()}getState(){let{grid:e,filters:t,extra:i}=this.config,r={columns:e.getColumnState(),filter:t?.getFilter()??null,sorters:[...e.getStore().getSorters()]};return i&&(r.extra=Object.fromEntries(Object.entries(i).map(([s,o])=>[s,o.get()]))),r}setState(e){let{grid:t,filters:i,extra:r}=this.config;e.columns&&t.setColumnState(e.columns);let s=e.sorters?.[0];t.getStore().sort(s?.field??null,s?.dir),i&&(i.setFilter(e.filter??null),i.apply());for(let o in e.extra)r?.[o]?.set(e.extra[o])}getViews(){return this.views}getCurrent(){return this.current}async reload(){await this.run(async()=>{this.views=await this.config.storage.list()??[],this.current=this.current&&this.views.find(t=>t.id===this.current.id);let e=this.views.find(t=>t.default);!this.current&&e&&this.config.autoLoad!==!1&&this.apply(e),this.paint()}),this.emit("load",this.views)}apply(e){let t=typeof e=="string"?this.views.find(i=>i.id===e):e;!t||this.emit("before-apply",t)===!1||(this.current=t,this.setState(t.state),this.paint(),this.emit("apply",t))}async save(){if(!this.current)return this.saveAs();await this.store({...this.current,state:this.getState()})}async saveAs(e){if(e??=await d.prompt(n("viewsName"),{title:n("viewsSaveAs")})??"",e=e.trim(),!e)return;let t=this.views.find(i=>i.name.toLowerCase()===e.toLowerCase());await this.store({...t,name:e,state:this.getState()})}async setDefault(e=!0){if(this.current){for(let t of this.views)t!==this.current&&t.default&&await this.store({...t,default:!1},!1);await this.store({...this.current,default:e})}}async remove(e=this.current){!e||!await d.confirm(n("viewsConfirmDelete",{n:e.name}),{danger:!0,okText:n("viewsDelete")})||await this.run(async()=>{await this.config.storage.remove(e),this.views=this.views.filter(t=>t!==e&&t.id!==e.id),this.current?.id===e.id&&(this.current=void 0),this.paint(),this.emit("remove",e)})}reset(){this.current=void 0,this.setState(this.initial),this.paint(),this.emit("reset")}async store(e,t=!0){await this.run(async()=>{let i=await this.config.storage.save(e)||e,r=this.views.findIndex(s=>i.id&&s.id===i.id||s===e);r<0?this.views.push(i):this.views[r]=i,t&&(this.current=i),this.paint(),this.emit("save",i)})}async run(e){try{await e()}catch(t){this.emit("error",t)}}paint(){this.btn.setText(this.current?.name??n("views"))}openMenu(){let e=this.current,t=[...this.views.map(i=>({text:i.default?`${i.name} \u2605`:i.name,checked:i===e||!!e?.id&&i.id===e.id,handler:()=>this.apply(i)})),...this.views.length?["-"]:[],{text:n("viewsSave"),handler:()=>{this.save()}},{text:n("viewsSaveAs"),handler:()=>{this.saveAs()}},...e?[{text:n("viewsDefault"),checked:!!e.default,handler:()=>{this.setDefault(!e.default)}},{text:n("viewsDelete"),handler:()=>{this.remove()}}]:[],"-",{text:n("viewsReset"),handler:()=>this.reset()}];this.menu??=new m({}),this.menu.setItems(t),this.menu.showBy(this.btn.el)}};c("viewmanager",h);export{P as a,M as b,h as c};
2
- //# sourceMappingURL=chunk-TK2RC3T5.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/data/viewmanager/viewmanager.ts"],
4
- "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport type { FilterGroup, Sorter } from '../../../data/proxy';\nimport { Button } from '../../base/button/button';\nimport { Menu, type MenuEntry } from '../../overlays/menu/menu';\nimport { MessageBox } from '../../overlays/messagebox/messagebox';\nimport type { Grid, ColumnState } from '../grid/grid';\nimport type { FilterBuilder } from '../filterbuilder/filterbuilder';\n\n/** Everything a view remembers: plain JSON, so it can travel to any backend. */\nexport interface ViewState {\n columns?: ColumnState[];\n filter?: FilterGroup | null;\n sorters?: Sorter[];\n /** Whatever the app registered in `extra` (panel collapsed, density...). */\n extra?: Record<string, unknown>;\n}\nexport interface SavedView {\n id?: string;\n name: string;\n default?: boolean;\n state: ViewState;\n}\n\n/** Where views live. Implement it for your endpoint; `localViewStorage` and `restViewStorage` are ready-made. */\nexport interface ViewStorage {\n list(): Promise<SavedView[]> | SavedView[];\n /** Create (no `id`) or update. May return the stored view (with the id the server gave it). */\n save(view: SavedView): Promise<SavedView | void> | SavedView | void;\n remove(view: SavedView): Promise<void> | void;\n}\n\nconst newId = () => globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n/** Views in the browser (`localStorage` by default) under one key. */\nexport function localViewStorage(key: string, storage: Storage = localStorage): ViewStorage {\n const read = (): SavedView[] => {\n try {\n const v = JSON.parse(storage.getItem(key) ?? '[]');\n return Array.isArray(v) ? v : [];\n } catch {\n return [];\n }\n };\n const write = (v: SavedView[]) => storage.setItem(key, JSON.stringify(v));\n return {\n list: read,\n save(view) {\n const saved = { ...view, id: view.id ?? newId() };\n const all = read();\n const i = all.findIndex((x) => x.id === saved.id);\n if (i < 0) all.push(saved);\n else all[i] = saved;\n write(all);\n return saved;\n },\n remove(view) {\n write(read().filter((x) => x.id !== view.id));\n },\n };\n}\n\nexport interface RestViewStorageConfig {\n /** `GET url` lists, `POST url` creates, `PUT url/:id` updates, `DELETE url/:id` removes. JSON in and out. */\n url: string;\n headers?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\n/** Views on your server. Responses must be JSON (the list as an array, create/update returning the stored view). */\nexport function restViewStorage(cfg: RestViewStorageConfig): ViewStorage {\n const call = async (method: string, path = '', body?: unknown) => {\n const res = await (cfg.fetch ?? fetch)(cfg.url + path, { method, headers: { 'Content-Type': 'application/json', ...cfg.headers }, body: body === undefined ? undefined : JSON.stringify(body) });\n if (!res.ok) throw new Error(`Optikos views: ${method} ${cfg.url + path} \u2192 ${res.status}`);\n return res.status === 204 ? undefined : res.json().catch(() => undefined);\n };\n return {\n list: () => call('GET'),\n save: (v) => (v.id ? call('PUT', `/${encodeURIComponent(v.id)}`, v) : call('POST', '', v)),\n remove: (v) => call('DELETE', `/${encodeURIComponent(v.id!)}`).then(() => undefined),\n };\n}\n\nexport interface ViewManagerConfig extends ComponentConfig {\n grid: Grid;\n /** Its filter tree is part of the view. */\n filters?: FilterBuilder;\n storage: ViewStorage;\n /** Extra things to remember: `{ density: { get: () => ..., set: (v) => ... } }`. Stored in `state.extra`. */\n extra?: Record<string, { get(): unknown; set(value: unknown): void }>;\n /** Apply the default view when it opens. Default true. */\n autoLoad?: boolean;\n}\n\n/**\n * \"Views\" button for a Grid (and its FilterBuilder): saves and restores the visible columns and their order, the filters\n * (including nested AND/OR groups) and the sort, under a name, in the storage you give it.\n */\nexport class ViewManager extends Component<ViewManagerConfig> {\n protected override baseCls = 'op-viewmanager';\n private btn!: Button;\n private menu?: Menu;\n private views: SavedView[] = [];\n private current?: SavedView;\n private initial: ViewState = {};\n\n protected override build() {\n this.btn = new Button({ text: t('views'), icon: 'menu', variant: 'ghost', handler: () => this.openMenu() });\n this.btn.el.setAttribute('aria-haspopup', 'menu');\n this.own(() => (this.btn.destroy(), this.menu?.destroy()));\n return h('span', this.baseCls, {}, this.btn.el);\n }\n\n protected override onRender() {\n this.config.grid.render();\n this.config.filters?.render();\n this.initial = this.getState();\n if (this.config.autoLoad !== false) void this.reload();\n }\n\n override notifyMount() {\n super.notifyMount();\n this.btn.notifyMount();\n }\n\n // ---- state ---------------------------------------------------------------------------------\n\n /** The grid's and filter's current setup. */\n getState(): ViewState {\n const { grid, filters, extra } = this.config;\n const state: ViewState = { columns: grid.getColumnState(), filter: filters?.getFilter() ?? null, sorters: [...grid.getStore().getSorters()] };\n if (extra) state.extra = Object.fromEntries(Object.entries(extra).map(([k, e]) => [k, e.get()]));\n return state;\n }\n\n /** Puts a setup on the grid and the filter. */\n setState(s: ViewState): void {\n const { grid, filters, extra } = this.config;\n if (s.columns) grid.setColumnState(s.columns);\n const sort = s.sorters?.[0];\n grid.getStore().sort(sort?.field ?? null, sort?.dir);\n if (filters) {\n filters.setFilter(s.filter ?? null);\n filters.apply();\n }\n for (const k in s.extra) extra?.[k]?.set(s.extra[k]);\n }\n\n // ---- views ---------------------------------------------------------------------------------\n\n getViews(): SavedView[] {\n return this.views;\n }\n getCurrent(): SavedView | undefined {\n return this.current;\n }\n\n /** Reads the views from the storage and applies the default one (unless a view is already active). */\n async reload(): Promise<void> {\n await this.run(async () => {\n this.views = (await this.config.storage.list()) ?? [];\n this.current = this.current && this.views.find((v) => v.id === this.current!.id);\n const def = this.views.find((v) => v.default);\n if (!this.current && def && this.config.autoLoad !== false) this.apply(def);\n this.paint();\n });\n this.emit('load', this.views);\n }\n\n /** Applies a saved view (object or id). */\n apply(view: SavedView | string): void {\n const v = typeof view === 'string' ? this.views.find((x) => x.id === view) : view;\n if (!v || this.emit('before-apply', v) === false) return;\n this.current = v;\n this.setState(v.state);\n this.paint();\n this.emit('apply', v);\n }\n\n /** Saves the current setup into the active view; with none active, asks for a name first. */\n async save(): Promise<void> {\n if (!this.current) return this.saveAs();\n await this.store({ ...this.current, state: this.getState() });\n }\n\n /** Saves the current setup as a view with that name (asked for when omitted); an existing name is overwritten. */\n async saveAs(name?: string): Promise<void> {\n name ??= (await MessageBox.prompt(t('viewsName'), { title: t('viewsSaveAs') })) ?? '';\n name = name.trim();\n if (!name) return;\n const same = this.views.find((v) => v.name.toLowerCase() === name!.toLowerCase());\n await this.store({ ...same, name, state: this.getState() });\n }\n\n /** Marks the active view as the one applied on open (and unmarks the others). */\n async setDefault(on = true): Promise<void> {\n if (!this.current) return;\n for (const v of this.views) if (v !== this.current && v.default) await this.store({ ...v, default: false }, false);\n await this.store({ ...this.current, default: on });\n }\n\n async remove(view = this.current): Promise<void> {\n if (!view || !(await MessageBox.confirm(t('viewsConfirmDelete', { n: view.name }), { danger: true, okText: t('viewsDelete') }))) return;\n await this.run(async () => {\n await this.config.storage.remove(view);\n this.views = this.views.filter((v) => v !== view && v.id !== view.id);\n if (this.current?.id === view.id) this.current = undefined;\n this.paint();\n this.emit('remove', view);\n });\n }\n\n /** Back to the setup the grid had when the manager opened. */\n reset(): void {\n this.current = undefined;\n this.setState(this.initial);\n this.paint();\n this.emit('reset');\n }\n\n private async store(view: SavedView, makeCurrent = true): Promise<void> {\n await this.run(async () => {\n const saved = (await this.config.storage.save(view)) || view;\n const i = this.views.findIndex((v) => (saved.id && v.id === saved.id) || v === view);\n if (i < 0) this.views.push(saved);\n else this.views[i] = saved;\n if (makeCurrent) this.current = saved;\n this.paint();\n this.emit('save', saved);\n });\n }\n\n private async run(fn: () => Promise<void>): Promise<void> {\n try {\n await fn();\n } catch (err) {\n this.emit('error', err);\n }\n }\n\n // ---- UI ------------------------------------------------------------------------------------\n\n private paint(): void {\n this.btn.setText(this.current?.name ?? t('views'));\n }\n\n private openMenu(): void {\n const cur = this.current;\n const items: MenuEntry[] = [\n ...this.views.map((v) => ({ text: v.default ? `${v.name} \u2605` : v.name, checked: v === cur || (!!cur?.id && v.id === cur.id), handler: () => this.apply(v) })),\n ...(this.views.length ? (['-'] as const) : []),\n { text: t('viewsSave'), handler: () => void this.save() },\n { text: t('viewsSaveAs'), handler: () => void this.saveAs() },\n ...(cur ? [{ text: t('viewsDefault'), checked: !!cur.default, handler: () => void this.setDefault(!cur.default) }, { text: t('viewsDelete'), handler: () => void this.remove() }] : []),\n '-',\n { text: t('viewsReset'), handler: () => this.reset() },\n ];\n this.menu ??= new Menu({});\n this.menu.setItems(items);\n this.menu.showBy(this.btn.el);\n }\n}\nregister('viewmanager', ViewManager);\n"],
5
- "mappings": "uPAkCA,IAAMA,EAAQ,IAAM,WAAW,QAAQ,aAAa,GAAK,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,GAGtG,SAASC,EAAiBC,EAAaC,EAAmB,aAA2B,CAC1F,IAAMC,EAAO,IAAmB,CAC9B,GAAI,CACF,IAAMC,EAAI,KAAK,MAAMF,EAAQ,QAAQD,CAAG,GAAK,IAAI,EACjD,OAAO,MAAM,QAAQG,CAAC,EAAIA,EAAI,CAAC,CACjC,MAAQ,CACN,MAAO,CAAC,CACV,CACF,EACMC,EAASD,GAAmBF,EAAQ,QAAQD,EAAK,KAAK,UAAUG,CAAC,CAAC,EACxE,MAAO,CACL,KAAMD,EACN,KAAKG,EAAM,CACT,IAAMC,EAAQ,CAAE,GAAGD,EAAM,GAAIA,EAAK,IAAMP,EAAM,CAAE,EAC1CS,EAAML,EAAK,EACXM,EAAID,EAAI,UAAWE,GAAMA,EAAE,KAAOH,EAAM,EAAE,EAChD,OAAIE,EAAI,EAAGD,EAAI,KAAKD,CAAK,EACpBC,EAAIC,CAAC,EAAIF,EACdF,EAAMG,CAAG,EACFD,CACT,EACA,OAAOD,EAAM,CACXD,EAAMF,EAAK,EAAE,OAAQO,GAAMA,EAAE,KAAOJ,EAAK,EAAE,CAAC,CAC9C,CACF,CACF,CAUO,SAASK,EAAgBC,EAAyC,CACvE,IAAMC,EAAO,MAAOC,EAAgBC,EAAO,GAAIC,IAAmB,CAChE,IAAMC,EAAM,MAAOL,EAAI,OAAS,OAAOA,EAAI,IAAMG,EAAM,CAAE,OAAAD,EAAQ,QAAS,CAAE,eAAgB,mBAAoB,GAAGF,EAAI,OAAQ,EAAG,KAAMI,IAAS,OAAY,OAAY,KAAK,UAAUA,CAAI,CAAE,CAAC,EAC/L,GAAI,CAACC,EAAI,GAAI,MAAM,IAAI,MAAM,kBAAkBH,CAAM,IAAIF,EAAI,IAAMG,CAAI,WAAME,EAAI,MAAM,EAAE,EACzF,OAAOA,EAAI,SAAW,IAAM,OAAYA,EAAI,KAAK,EAAE,MAAM,IAAG,EAAY,CAC1E,EACA,MAAO,CACL,KAAM,IAAMJ,EAAK,KAAK,EACtB,KAAOT,GAAOA,EAAE,GAAKS,EAAK,MAAO,IAAI,mBAAmBT,EAAE,EAAE,CAAC,GAAIA,CAAC,EAAIS,EAAK,OAAQ,GAAIT,CAAC,EACxF,OAASA,GAAMS,EAAK,SAAU,IAAI,mBAAmBT,EAAE,EAAG,CAAC,EAAE,EAAE,KAAK,IAAG,EAAY,CACrF,CACF,CAiBO,IAAMc,EAAN,cAA0BC,CAA6B,CACzC,QAAU,iBACrB,IACA,KACA,MAAqB,CAAC,EACtB,QACA,QAAqB,CAAC,EAEX,OAAQ,CACzB,YAAK,IAAM,IAAIC,EAAO,CAAE,KAAMC,EAAE,OAAO,EAAG,KAAM,OAAQ,QAAS,QAAS,QAAS,IAAM,KAAK,SAAS,CAAE,CAAC,EAC1G,KAAK,IAAI,GAAG,aAAa,gBAAiB,MAAM,EAChD,KAAK,IAAI,KAAO,KAAK,IAAI,QAAQ,EAAG,KAAK,MAAM,QAAQ,EAAE,EAClDC,EAAE,OAAQ,KAAK,QAAS,CAAC,EAAG,KAAK,IAAI,EAAE,CAChD,CAEmB,UAAW,CAC5B,KAAK,OAAO,KAAK,OAAO,EACxB,KAAK,OAAO,SAAS,OAAO,EAC5B,KAAK,QAAU,KAAK,SAAS,EACzB,KAAK,OAAO,WAAa,IAAY,KAAK,OAAO,CACvD,CAES,aAAc,CACrB,MAAM,YAAY,EAClB,KAAK,IAAI,YAAY,CACvB,CAKA,UAAsB,CACpB,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,MAAAC,CAAM,EAAI,KAAK,OAChCC,EAAmB,CAAE,QAASH,EAAK,eAAe,EAAG,OAAQC,GAAS,UAAU,GAAK,KAAM,QAAS,CAAC,GAAGD,EAAK,SAAS,EAAE,WAAW,CAAC,CAAE,EAC5I,OAAIE,IAAOC,EAAM,MAAQ,OAAO,YAAY,OAAO,QAAQD,CAAK,EAAE,IAAI,CAAC,CAACE,EAAGC,CAAC,IAAM,CAACD,EAAGC,EAAE,IAAI,CAAC,CAAC,CAAC,GACxFF,CACT,CAGA,SAASG,EAAoB,CAC3B,GAAM,CAAE,KAAAN,EAAM,QAAAC,EAAS,MAAAC,CAAM,EAAI,KAAK,OAClCI,EAAE,SAASN,EAAK,eAAeM,EAAE,OAAO,EAC5C,IAAMC,EAAOD,EAAE,UAAU,CAAC,EAC1BN,EAAK,SAAS,EAAE,KAAKO,GAAM,OAAS,KAAMA,GAAM,GAAG,EAC/CN,IACFA,EAAQ,UAAUK,EAAE,QAAU,IAAI,EAClCL,EAAQ,MAAM,GAEhB,QAAWG,KAAKE,EAAE,MAAOJ,IAAQE,CAAC,GAAG,IAAIE,EAAE,MAAMF,CAAC,CAAC,CACrD,CAIA,UAAwB,CACtB,OAAO,KAAK,KACd,CACA,YAAoC,CAClC,OAAO,KAAK,OACd,CAGA,MAAM,QAAwB,CAC5B,MAAM,KAAK,IAAI,SAAY,CACzB,KAAK,MAAS,MAAM,KAAK,OAAO,QAAQ,KAAK,GAAM,CAAC,EACpD,KAAK,QAAU,KAAK,SAAW,KAAK,MAAM,KAAMvB,GAAMA,EAAE,KAAO,KAAK,QAAS,EAAE,EAC/E,IAAM2B,EAAM,KAAK,MAAM,KAAM3B,GAAMA,EAAE,OAAO,EACxC,CAAC,KAAK,SAAW2B,GAAO,KAAK,OAAO,WAAa,IAAO,KAAK,MAAMA,CAAG,EAC1E,KAAK,MAAM,CACb,CAAC,EACD,KAAK,KAAK,OAAQ,KAAK,KAAK,CAC9B,CAGA,MAAMzB,EAAgC,CACpC,IAAMF,EAAI,OAAOE,GAAS,SAAW,KAAK,MAAM,KAAMI,GAAMA,EAAE,KAAOJ,CAAI,EAAIA,EACzE,CAACF,GAAK,KAAK,KAAK,eAAgBA,CAAC,IAAM,KAC3C,KAAK,QAAUA,EACf,KAAK,SAASA,EAAE,KAAK,EACrB,KAAK,MAAM,EACX,KAAK,KAAK,QAASA,CAAC,EACtB,CAGA,MAAM,MAAsB,CAC1B,GAAI,CAAC,KAAK,QAAS,OAAO,KAAK,OAAO,EACtC,MAAM,KAAK,MAAM,CAAE,GAAG,KAAK,QAAS,MAAO,KAAK,SAAS,CAAE,CAAC,CAC9D,CAGA,MAAM,OAAO4B,EAA8B,CAGzC,GAFAA,IAAU,MAAMC,EAAW,OAAOZ,EAAE,WAAW,EAAG,CAAE,MAAOA,EAAE,aAAa,CAAE,CAAC,GAAM,GACnFW,EAAOA,EAAK,KAAK,EACb,CAACA,EAAM,OACX,IAAME,EAAO,KAAK,MAAM,KAAM9B,GAAMA,EAAE,KAAK,YAAY,IAAM4B,EAAM,YAAY,CAAC,EAChF,MAAM,KAAK,MAAM,CAAE,GAAGE,EAAM,KAAAF,EAAM,MAAO,KAAK,SAAS,CAAE,CAAC,CAC5D,CAGA,MAAM,WAAWG,EAAK,GAAqB,CACzC,GAAK,KAAK,QACV,SAAW/B,KAAK,KAAK,MAAWA,IAAM,KAAK,SAAWA,EAAE,SAAS,MAAM,KAAK,MAAM,CAAE,GAAGA,EAAG,QAAS,EAAM,EAAG,EAAK,EACjH,MAAM,KAAK,MAAM,CAAE,GAAG,KAAK,QAAS,QAAS+B,CAAG,CAAC,EACnD,CAEA,MAAM,OAAO7B,EAAO,KAAK,QAAwB,CAC3C,CAACA,GAAQ,CAAE,MAAM2B,EAAW,QAAQZ,EAAE,qBAAsB,CAAE,EAAGf,EAAK,IAAK,CAAC,EAAG,CAAE,OAAQ,GAAM,OAAQe,EAAE,aAAa,CAAE,CAAC,GAC7H,MAAM,KAAK,IAAI,SAAY,CACzB,MAAM,KAAK,OAAO,QAAQ,OAAOf,CAAI,EACrC,KAAK,MAAQ,KAAK,MAAM,OAAQF,GAAMA,IAAME,GAAQF,EAAE,KAAOE,EAAK,EAAE,EAChE,KAAK,SAAS,KAAOA,EAAK,KAAI,KAAK,QAAU,QACjD,KAAK,MAAM,EACX,KAAK,KAAK,SAAUA,CAAI,CAC1B,CAAC,CACH,CAGA,OAAc,CACZ,KAAK,QAAU,OACf,KAAK,SAAS,KAAK,OAAO,EAC1B,KAAK,MAAM,EACX,KAAK,KAAK,OAAO,CACnB,CAEA,MAAc,MAAMA,EAAiB8B,EAAc,GAAqB,CACtE,MAAM,KAAK,IAAI,SAAY,CACzB,IAAM7B,EAAS,MAAM,KAAK,OAAO,QAAQ,KAAKD,CAAI,GAAMA,EAClDG,EAAI,KAAK,MAAM,UAAWL,GAAOG,EAAM,IAAMH,EAAE,KAAOG,EAAM,IAAOH,IAAME,CAAI,EAC/EG,EAAI,EAAG,KAAK,MAAM,KAAKF,CAAK,EAC3B,KAAK,MAAME,CAAC,EAAIF,EACjB6B,IAAa,KAAK,QAAU7B,GAChC,KAAK,MAAM,EACX,KAAK,KAAK,OAAQA,CAAK,CACzB,CAAC,CACH,CAEA,MAAc,IAAI8B,EAAwC,CACxD,GAAI,CACF,MAAMA,EAAG,CACX,OAASC,EAAK,CACZ,KAAK,KAAK,QAASA,CAAG,CACxB,CACF,CAIQ,OAAc,CACpB,KAAK,IAAI,QAAQ,KAAK,SAAS,MAAQjB,EAAE,OAAO,CAAC,CACnD,CAEQ,UAAiB,CACvB,IAAMkB,EAAM,KAAK,QACXC,EAAqB,CACzB,GAAG,KAAK,MAAM,IAAKpC,IAAO,CAAE,KAAMA,EAAE,QAAU,GAAGA,EAAE,IAAI,UAAOA,EAAE,KAAM,QAASA,IAAMmC,GAAQ,CAAC,CAACA,GAAK,IAAMnC,EAAE,KAAOmC,EAAI,GAAK,QAAS,IAAM,KAAK,MAAMnC,CAAC,CAAE,EAAE,EAC3J,GAAI,KAAK,MAAM,OAAU,CAAC,GAAG,EAAc,CAAC,EAC5C,CAAE,KAAMiB,EAAE,WAAW,EAAG,QAAS,IAAG,CAAQ,KAAK,KAAK,EAAE,EACxD,CAAE,KAAMA,EAAE,aAAa,EAAG,QAAS,IAAG,CAAQ,KAAK,OAAO,EAAE,EAC5D,GAAIkB,EAAM,CAAC,CAAE,KAAMlB,EAAE,cAAc,EAAG,QAAS,CAAC,CAACkB,EAAI,QAAS,QAAS,IAAG,CAAQ,KAAK,WAAW,CAACA,EAAI,OAAO,EAAE,EAAG,CAAE,KAAMlB,EAAE,aAAa,EAAG,QAAS,IAAG,CAAQ,KAAK,OAAO,EAAE,CAAC,EAAI,CAAC,EACrL,IACA,CAAE,KAAMA,EAAE,YAAY,EAAG,QAAS,IAAM,KAAK,MAAM,CAAE,CACvD,EACA,KAAK,OAAS,IAAIoB,EAAK,CAAC,CAAC,EACzB,KAAK,KAAK,SAASD,CAAK,EACxB,KAAK,KAAK,OAAO,KAAK,IAAI,EAAE,CAC9B,CACF,EACAE,EAAS,cAAexB,CAAW",
6
- "names": ["newId", "localViewStorage", "key", "storage", "read", "v", "write", "view", "saved", "all", "i", "x", "restViewStorage", "cfg", "call", "method", "path", "body", "res", "ViewManager", "Component", "Button", "t", "h", "grid", "filters", "extra", "state", "k", "e", "s", "sort", "def", "name", "MessageBox", "same", "on", "makeCurrent", "fn", "err", "cur", "items", "Menu", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as f}from"./chunk-4COBH4QJ.js";import{a as u}from"./chunk-ARCW54L2.js";import{a as h}from"./chunk-SNTHW4K2.js";import{f as o,g as p}from"./chunk-NWTTHDIM.js";import{c}from"./chunk-IHAYOSBR.js";import{b as l}from"./chunk-IYPKPLCU.js";import{b as d}from"./chunk-PZSHOSOS.js";import{e as n}from"./chunk-MA5BJL3S.js";var a=class extends h{baseCls="op-field op-textfield op-picker op-datefield";cal;dd;garbage=!1;emptyValue(){return null}isEmpty(e){return!e}parse(e){let t=p(e);return this.garbage=!!e.trim()&&!t,t}display(e){return e?o(e,{day:"2-digit",month:"2-digit",year:"numeric"}):""}createControl(){let e=super.createControl(),t=this.input;t.setAttribute("aria-haspopup","dialog"),t.setAttribute("aria-expanded","false");let r=d("button","op-picker__trigger",{type:"button",tabindex:-1,"aria-label":n("calOpen")},c("calendar"));this.listen(r,"mousedown",s=>s.preventDefault()),this.listen(r,"click",()=>{!this.config.disabled&&!this.config.readonly&&this.toggle()}),e.append(r);let i=this.config;return this.cal=new f({value:i.value,min:i.min,max:i.max,firstDay:i.firstDay}),this.dd=new u({anchor:e,content:this.cal,role:"presentation"}),this.cal.on("select",s=>{this.dd.close(),this.setValue(s),t.focus()}),this.dd.on("open",()=>{t.setAttribute("aria-expanded","true"),this.el.classList.add("is-open"),this.cal.setValue(this.value),this.cal.focusDay(),this.emit("expand")}),this.dd.on("close",()=>{t.setAttribute("aria-expanded","false"),this.el.classList.remove("is-open"),this.emit("collapse")}),this.own(()=>this.dd.destroy()),this.on("blur",()=>this.later(()=>{let s=document.activeElement;!this.el.contains(s)&&!this.dd.el.contains(s)&&this.dd.close()},0)),e}onKey(e){e.key==="ArrowDown"&&!this.dd.isOpen()?(e.preventDefault(),this.open()):super.onKey(e)}onInput(){super.onInput(),this.garbage?this.setError(n("date")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1}onDisabled(e){super.onDisabled(e),this.el.querySelector(".op-picker__trigger").disabled=e}check(){if(this.garbage)return n("date");let e=super.check(),t=this.value;if(e||!t)return e;let{min:r,max:i}=this.config;return r&&t<r?n("dateMin",{n:o(r)}):i&&t>i?n("dateMax",{n:o(i)}):""}open(){this.config.disabled||this.config.readonly||!this.rendered||this.dd.open()}close(){this.dd?.close()}toggle(){this.dd.isOpen()?this.close():this.open()}expand(){this.open()}collapse(){this.close()}setMin(e){this.config.min=e,this.cal?.setMin(e)}setMax(e){this.config.max=e,this.cal?.setMax(e)}};l("datefield",a);export{a};
2
- //# sourceMappingURL=chunk-U3X2FW6U.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/fields/datefield/datefield.ts"],
4
- "sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { parseDate, formatDate } from '../../../core/date';\nimport { iconEl } from '../../base/icon/icon';\nimport { Dropdown } from '../../overlays/dropdown/dropdown';\nimport { Calendar } from '../../dates/calendar/calendar';\n\nexport interface DateFieldConfig extends TextFieldConfig<string | null> {\n min?: string;\n max?: string;\n firstDay?: number;\n}\n\n/** Value is an ISO date string (`YYYY-MM-DD`) or null; the text shown and accepted follows the locale. */\nexport class DateField extends TextField<string | null, DateFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-picker op-datefield';\n private cal!: Calendar;\n private dd!: Dropdown;\n private garbage = false;\n\n protected override emptyValue() {\n return null;\n }\n protected override isEmpty(v: string | null) {\n return !v;\n }\n\n protected override parse(text: string): string | null {\n const iso = parseDate(text);\n this.garbage = !!text.trim() && !iso;\n return iso;\n }\n protected override display(v: string | null) {\n return v ? formatDate(v, { day: '2-digit', month: '2-digit', year: 'numeric' }) : '';\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const input = this.input;\n input.setAttribute('aria-haspopup', 'dialog');\n input.setAttribute('aria-expanded', 'false');\n const trigger = h('button', 'op-picker__trigger', { type: 'button', tabindex: -1, 'aria-label': t('calOpen') }, iconEl('calendar'));\n this.listen(trigger, 'mousedown', (e: Event) => e.preventDefault());\n this.listen(trigger, 'click', () => {\n if (!this.config.disabled && !this.config.readonly) this.toggle();\n });\n wrap.append(trigger);\n const c = this.config;\n this.cal = new Calendar({ value: c.value, min: c.min, max: c.max, firstDay: c.firstDay });\n this.dd = new Dropdown({ anchor: wrap, content: this.cal, role: 'presentation' });\n this.cal.on('select', (iso: string) => {\n this.dd.close();\n this.setValue(iso);\n input.focus();\n });\n this.dd.on('open', () => {\n input.setAttribute('aria-expanded', 'true');\n this.el.classList.add('is-open');\n this.cal.setValue(this.value);\n this.cal.focusDay();\n this.emit('expand');\n });\n this.dd.on('close', () => {\n input.setAttribute('aria-expanded', 'false');\n this.el.classList.remove('is-open');\n this.emit('collapse');\n });\n this.own(() => this.dd.destroy());\n this.on('blur', () =>\n this.later(() => {\n const a = document.activeElement;\n if (!this.el.contains(a) && !this.dd.el.contains(a)) this.dd.close();\n }, 0),\n );\n return wrap;\n }\n\n protected override onKey(e: KeyboardEvent) {\n if (e.key === 'ArrowDown' && !this.dd.isOpen()) {\n e.preventDefault();\n this.open();\n } else super.onKey(e);\n }\n\n protected override onInput() {\n super.onInput();\n if (this.garbage) this.setError(t('date'));\n else if (this.error) this.validate();\n }\n protected override applyValue(v: string | null) {\n super.applyValue(v);\n this.garbage = false;\n }\n protected override onDisabled(disabled: boolean) {\n super.onDisabled(disabled);\n (this.el.querySelector('.op-picker__trigger') as HTMLButtonElement).disabled = disabled;\n }\n\n protected override check(): string {\n if (this.garbage) return t('date');\n const base = super.check();\n const v = this.value;\n if (base || !v) return base;\n const { min, max } = this.config;\n if (min && v < min) return t('dateMin', { n: formatDate(min) });\n if (max && v > max) return t('dateMax', { n: formatDate(max) });\n return '';\n }\n\n open() {\n if (this.config.disabled || this.config.readonly || !this.rendered) return;\n this.dd.open();\n }\n close() {\n this.dd?.close();\n }\n toggle() {\n if (this.dd.isOpen()) this.close();\n else this.open();\n }\n expand() {\n this.open();\n }\n collapse() {\n this.close();\n }\n setMin(min: string | undefined) {\n this.config.min = min;\n this.cal?.setMin(min);\n }\n setMax(max: string | undefined) {\n this.config.max = max;\n this.cal?.setMax(max);\n }\n}\nregister('datefield', DateField);\n"],
5
- "mappings": "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",
6
- "names": ["DateField", "TextField", "v", "text", "iso", "parseDate", "formatDate", "wrap", "input", "trigger", "h", "t", "iconEl", "e", "c", "Calendar", "Dropdown", "a", "disabled", "base", "min", "max", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as y,d as m}from"./chunk-IYPKPLCU.js";import{e as l}from"./chunk-PZSHOSOS.js";var g=new Map;function u(i,t){g.set(i,t)}function h(i){if(typeof i=="object"&&"init"in i)return i;let t=typeof i=="string"?{type:i}:i,o=g.get(t.type);if(!o)throw new Error(`Optikos: unknown layout "${t.type}"`);return o(t)}function c(i,t,o){let e=i.getBody(),n=!1,r=d=>{d!==n&&(n=d,e.classList.toggle("is-narrow",d),o?.(d),i.emit("narrow-change",d))};if(typeof ResizeObserver<"u"){let d=new ResizeObserver(()=>e.clientWidth>0&&r(e.clientWidth<t));d.observe(e),i.own(()=>d.disconnect())}return{isNarrow:()=>n,setNarrow:r}}var f=(i,t=[])=>o=>({init(e){let n=e.getBody();n.classList.add("op-layout",`op-layout-${i}`);for(let r of t)o[r]!=null&&n.style.setProperty(`--op-layout-${r}`,l(o[r]))}});u("fit",f("fit"));var w=f("hbox",["gap","align","justify","wrap"]);u("hbox",i=>{let t=w(i),o;return{...t,init(e){t.init(e),i.stackBelow&&(e.getBody().classList.add("op-layout-stack"),o=c(e,Number(i.stackBelow)))},isNarrow:()=>!!o?.isNarrow(),setNarrow:e=>o?.setNarrow(e)}});u("vbox",f("vbox",["gap","align","justify","wrap"]));u("grid",i=>{let t;return{init(o){let e=o.getBody();e.classList.add("op-layout","op-layout-grid"),i.gap!=null&&e.style.setProperty("--op-layout-gap",l(i.gap));let n=i.columns??1;if(typeof n=="number"){e.style.setProperty("--op-layout-columns",String(n));let r=i.narrowBelow==null?480:Number(i.narrowBelow);r>0&&n>1&&(t=c(o,r))}else e.style.gridTemplateColumns=n},add(o,e){let n=e.config.colspan;n&&(e.el.style.gridColumn=`span ${n}`)},isNarrow:()=>!!t?.isNarrow(),setNarrow:o=>t?.setNarrow(o)}});u("border",i=>{let t,o,e=()=>Array.from(o.getBody().children).filter(s=>s instanceof HTMLElement&&(s.dataset.region==="west"||s.dataset.region==="east")),n=s=>e().find(a=>a.dataset.region===s),r=()=>o.getBody().classList.toggle("has-open-region",e().some(s=>s.classList.contains("is-open"))),d=s=>{for(let a of e())(!s||a.dataset.region===s)&&a.classList.remove("is-open");r()};return{init(s){o=s;let a=s.getBody();a.classList.add("op-layout","op-layout-border"),i.gap!=null&&a.style.setProperty("--op-layout-gap",l(i.gap)),t=c(s,i.narrowBelow==null?768:Number(i.narrowBelow),p=>{p?i.open&&(n(String(i.open))?.classList.add("is-open"),r()):d()}),s.listen(a,"click",p=>p.target===a&&d()),s.listen(a,"keydown",p=>{p.key==="Escape"&&a.classList.contains("has-open-region")&&a.classList.contains("is-narrow")&&(p.stopPropagation(),d())})},add(s,a){let p=a.config.region??"center";a.el.style.gridArea=p,a.el.dataset.region=p},openRegion(s){let a=n(s);!a||!t?.isNarrow()||(d(),a.classList.add("is-open"),r(),(a.querySelector("input,button,[tabindex]")??a).focus?.())},closeRegion:d,toggleRegion(s){n(s)?.classList.contains("is-open")?d(s):this.openRegion(s)},isRegionOpen:s=>!!n(s)?.classList.contains("is-open"),isNarrow:()=>!!t?.isNarrow(),setNarrow:s=>t?.setNarrow(s)}});u("card",i=>{let t,o=(e,n)=>{t=n;for(let r of e.items)r.rendered?r.el.hidden=r!==n:r.config.hidden=r!==n;e.emit("activate",n)};return{init(e){e.getBody().classList.add("op-layout","op-layout-fit");let n=i.activeItem??e.config.activeItem??0;o(e,typeof n=="number"?e.items[n]:e.items.find(r=>r.id===n))},add(e,n){n.el.hidden=n!==t&&!!t,t||o(e,n)},remove(e,n,r){n===t&&o(e,e.items[Math.min(r,e.items.length-1)])},activate:o,getActive:()=>t}});var C=class i extends y{baseCls="op-container";defaultLayout;items=[];layout;constructor(t={}){super(t),this.items=(t.items??[]).map(o=>this.make(o))}getBody(){return this.el}shorthand(t){throw new Error(`Optikos: no shorthand for item "${t}" in ${this.baseCls}`)}make(t){typeof t=="string"&&(t=this.shorthand(t));let o=t instanceof y?t:m({type:this.config.defaultType,...this.config.defaults,...t});return o.parent=this,o}onRender(){let t=this.config.layout??this.defaultLayout;t&&(this.layout=h(t)).init(this),this.items.forEach((o,e)=>this.attach(o,e))}attach(t,o){let e=this.getBody(),n=this.items.slice(o+1).find(r=>r.rendered&&r.el.parentNode===e);e.insertBefore(t.el,n?.el??null),this.layout?.add?.(this,t,o),this.mounted&&t.notifyMount()}add(t){return this.insert(this.items.length,t)}insert(t,o){let e=this.make(o);return this.items.splice(t,0,e),this.rendered&&this.attach(e,t),this.emit("add",e),e}remove(t,o=!0){let e=typeof t=="number"?t:this.items.findIndex(r=>r===t||r.id===t),n=this.items[e];if(n)return this.items.splice(e,1),n.parent=void 0,this.layout?.remove?.(this,n,e),o?n.destroy():n.rendered&&n.el.remove(),this.emit("remove",n),n}removeAll(t=!0){for(let o of[...this.items])this.remove(o,t)}getItems(){return this.items}get(t){return this.items.find(o=>o.id===t)}query(t){let o=[];for(let e of this.items)t(e)&&o.push(e),e instanceof i&&o.push(...e.query(t));return o}getActiveItem(){return this.layout?.getActive?.(this)}setActiveItem(t){let o=typeof t=="number"?this.items[t]:this.items.find(e=>e===t||e.id===t);o&&this.layout?.activate?.(this,o)}notifyMount(){super.notifyMount();for(let t of this.items)t.notifyMount()}onDestroy(){for(let t of[...this.items])t.destroy()}setDisabled(t){super.setDisabled(t);for(let o of this.items)o.setDisabled(t)}};export{u as a,h as b,C as c};
2
- //# sourceMappingURL=chunk-UPOBGNJ5.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/layout/layout.ts", "../src/core/container.ts"],
4
- "sourcesContent": ["import type { Component } from '../core/component';\nimport type { Container } from '../core/container';\nimport { px } from '../core/dom';\n\nexport interface Layout {\n init(c: Container): void;\n add?(c: Container, cmp: Component, index: number): void;\n remove?(c: Container, cmp: Component, index: number): void;\n /** Card only. */\n activate?(c: Container, cmp: Component): void;\n getActive?(c: Container): Component | undefined;\n /** Border only: below `narrowBelow` the west/east regions become drawers; these open and close them. */\n openRegion?(name: string): void;\n closeRegion?(name?: string): void;\n toggleRegion?(name: string): void;\n isRegionOpen?(name: string): boolean;\n /** Layouts that adapt to the width: whether the container is currently narrow, and a way to force it (tests, previews). */\n isNarrow?(): boolean;\n setNarrow?(narrow: boolean): void;\n}\n\nexport type LayoutConfig = { type: string; [option: string]: unknown };\nexport type LayoutSpec = string | LayoutConfig | Layout;\nexport type LayoutFactory = (config: Record<string, any>) => Layout;\n\nconst factories = new Map<string, LayoutFactory>();\n\n/** Registers a layout strategy under a name; users add their own the same way. */\nexport function registerLayout(name: string, factory: LayoutFactory): void {\n factories.set(name, factory);\n}\n\nexport function createLayout(spec: LayoutSpec): Layout {\n if (typeof spec === 'object' && 'init' in spec) return spec as Layout;\n const cfg = (typeof spec === 'string' ? { type: spec } : spec) as LayoutConfig;\n const f = factories.get(cfg.type);\n if (!f) throw new Error(`Optikos: unknown layout \"${cfg.type}\"`);\n return f(cfg);\n}\n\n/**\n * Keeps the class `is-narrow` on the container body while it is narrower than `below` px (a ResizeObserver on the\n * container itself, not the window, so a layout inside a small panel adapts too). Emits `narrow-change` on the container.\n */\nfunction watchNarrow(c: Container, below: number, on?: (narrow: boolean) => void) {\n const body = c.getBody();\n let narrow = false;\n const set = (n: boolean) => {\n if (n === narrow) return;\n narrow = n;\n body.classList.toggle('is-narrow', n);\n on?.(n);\n c.emit('narrow-change', n);\n };\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver(() => body.clientWidth > 0 && set(body.clientWidth < below));\n ro.observe(body);\n c.own(() => ro.disconnect());\n }\n return { isNarrow: () => narrow, setNarrow: set };\n}\n\n/** Layouts that are only a class plus custom properties; the CSS does the work. */\nconst cssLayout =\n (name: string, vars: string[] = []): LayoutFactory =>\n (cfg) => ({\n init(c) {\n const body = c.getBody();\n body.classList.add('op-layout', `op-layout-${name}`);\n for (const v of vars) if (cfg[v] != null) body.style.setProperty(`--op-layout-${v}`, px(cfg[v]));\n },\n });\n\nregisterLayout('fit', cssLayout('fit'));\nconst hbox = cssLayout('hbox', ['gap', 'align', 'justify', 'wrap']);\n/** `stackBelow: 600`: under that width the row becomes a column. */\nregisterLayout('hbox', (cfg) => {\n const base = hbox(cfg);\n let w: ReturnType<typeof watchNarrow> | undefined;\n return {\n ...base,\n init(c) {\n base.init(c);\n if (cfg.stackBelow) {\n c.getBody().classList.add('op-layout-stack');\n w = watchNarrow(c, Number(cfg.stackBelow));\n }\n },\n isNarrow: () => !!w?.isNarrow(),\n setNarrow: (n) => w?.setNarrow(n),\n };\n});\nregisterLayout('vbox', cssLayout('vbox', ['gap', 'align', 'justify', 'wrap']));\n\n/** Numeric `columns` collapse to one column under `narrowBelow` px (default 480; `0` turns it off). */\nregisterLayout('grid', (cfg) => {\n let w: ReturnType<typeof watchNarrow> | undefined;\n return {\n init(c) {\n const body = c.getBody();\n body.classList.add('op-layout', 'op-layout-grid');\n if (cfg.gap != null) body.style.setProperty('--op-layout-gap', px(cfg.gap));\n const cols = cfg.columns ?? 1;\n if (typeof cols === 'number') {\n body.style.setProperty('--op-layout-columns', String(cols));\n const below = cfg.narrowBelow == null ? 480 : Number(cfg.narrowBelow);\n if (below > 0 && cols > 1) w = watchNarrow(c, below);\n } else body.style.gridTemplateColumns = cols;\n },\n add(_c, cmp) {\n const span = cmp.config.colspan;\n if (span) cmp.el.style.gridColumn = `span ${span}`;\n },\n isNarrow: () => !!w?.isNarrow(),\n setNarrow: (n) => w?.setNarrow(n),\n };\n});\n\n/**\n * Regions around a center. Under `narrowBelow` px (default 768) the west and east regions leave the grid and become\n * drawers over the center, closed until `openRegion('west')` (or `open: 'west'` in the layout config, to start open).\n * A scrim behind an open drawer closes it on click; Esc closes it too.\n */\nregisterLayout('border', (cfg) => {\n let w: ReturnType<typeof watchNarrow> | undefined;\n let cont!: Container;\n const regions = () => Array.from(cont.getBody().children).filter((e): e is HTMLElement => e instanceof HTMLElement && (e.dataset.region === 'west' || e.dataset.region === 'east'));\n const find = (name: string) => regions().find((e) => e.dataset.region === name);\n const sync = () => cont.getBody().classList.toggle('has-open-region', regions().some((e) => e.classList.contains('is-open')));\n const close = (name?: string) => {\n for (const e of regions()) if (!name || e.dataset.region === name) e.classList.remove('is-open');\n sync();\n };\n return {\n init(c) {\n cont = c;\n const body = c.getBody();\n body.classList.add('op-layout', 'op-layout-border');\n if (cfg.gap != null) body.style.setProperty('--op-layout-gap', px(cfg.gap));\n w = watchNarrow(c, cfg.narrowBelow == null ? 768 : Number(cfg.narrowBelow), (narrow) => {\n if (!narrow) close();\n else if (cfg.open) find(String(cfg.open))?.classList.add('is-open'), sync();\n });\n // the scrim is the body's own ::after: a click that lands on the body itself (not a child) closes the drawer\n c.listen(body, 'click', (e: Event) => e.target === body && close());\n c.listen(body, 'keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape' && body.classList.contains('has-open-region') && body.classList.contains('is-narrow')) {\n e.stopPropagation();\n close();\n }\n });\n },\n add(_c, cmp) {\n const region = cmp.config.region ?? 'center';\n cmp.el.style.gridArea = region;\n cmp.el.dataset.region = region;\n },\n openRegion(name) {\n const e = find(name);\n if (!e || !w?.isNarrow()) return;\n close();\n e.classList.add('is-open');\n sync();\n (e.querySelector<HTMLElement>('input,button,[tabindex]') ?? e).focus?.();\n },\n closeRegion: close,\n toggleRegion(name) {\n if (find(name)?.classList.contains('is-open')) close(name);\n else this.openRegion!(name);\n },\n isRegionOpen: (name) => !!find(name)?.classList.contains('is-open'),\n isNarrow: () => !!w?.isNarrow(),\n setNarrow: (n) => w?.setNarrow(n),\n };\n});\n\nregisterLayout('card', (cfg) => {\n let active: Component | undefined;\n // children that were never rendered (lazy tabs) only get the flag; their DOM is not built just to hide it\n const show = (c: Container, cmp: Component | undefined) => {\n active = cmp;\n for (const i of c.items) {\n if (i.rendered) i.el.hidden = i !== cmp;\n else i.config.hidden = i !== cmp;\n }\n c.emit('activate', cmp);\n };\n return {\n init(c) {\n c.getBody().classList.add('op-layout', 'op-layout-fit');\n const a = cfg.activeItem ?? c.config.activeItem ?? 0;\n show(c, typeof a === 'number' ? c.items[a] : c.items.find((i) => i.id === a));\n },\n add(c, cmp) {\n cmp.el.hidden = cmp !== active && !!active;\n if (!active) show(c, cmp);\n },\n remove(c, cmp, index) {\n if (cmp === active) show(c, c.items[Math.min(index, c.items.length - 1)]);\n },\n activate: show,\n getActive: () => active,\n };\n});\n", "import { Component, type ComponentConfig, type Parent } from './component';\nimport { create, type AnyConfig } from './registry';\nimport { createLayout, type Layout, type LayoutSpec } from '../layout/layout';\n\nexport interface ContainerConfig extends ComponentConfig {\n items?: Array<AnyConfig | Component | string>;\n layout?: LayoutSpec;\n /** Config merged into every item that does not set the key itself. */\n defaults?: Record<string, unknown>;\n /** `type` used by items that do not declare one. */\n defaultType?: string;\n /** Layout `card`: initial visible child (index or id). */\n activeItem?: number | string;\n}\n\nexport class Container<C extends ContainerConfig = ContainerConfig> extends Component<C> implements Parent {\n protected override baseCls = 'op-container';\n protected defaultLayout: LayoutSpec | undefined;\n items: Component[] = [];\n layout?: Layout;\n\n constructor(config: C = {} as C) {\n super(config);\n this.items = (config.items ?? []).map((i) => this.make(i));\n }\n\n /** Element that holds the children. Panels override it. */\n getBody(): HTMLElement {\n return this.el;\n }\n\n /** Turns shorthand strings (`'->'`) into configs. Subclasses override; the base has none. */\n protected shorthand(s: string): AnyConfig {\n throw new Error(`Optikos: no shorthand for item \"${s}\" in ${this.baseCls}`);\n }\n\n private make(item: AnyConfig | Component | string): Component {\n if (typeof item === 'string') item = this.shorthand(item);\n const c = item instanceof Component ? item : create({ type: this.config.defaultType, ...this.config.defaults, ...item });\n c.parent = this;\n return c;\n }\n\n protected override onRender(): void {\n const spec = this.config.layout ?? this.defaultLayout;\n if (spec) (this.layout = createLayout(spec)).init(this);\n this.items.forEach((c, i) => this.attach(c, i));\n }\n\n protected attach(c: Component, index: number): void {\n const body = this.getBody();\n const next = this.items.slice(index + 1).find((x) => x.rendered && x.el.parentNode === body);\n body.insertBefore(c.el, next?.el ?? null);\n this.layout?.add?.(this, c, index);\n if (this.mounted) c.notifyMount();\n }\n\n add(item: AnyConfig | Component | string): Component {\n return this.insert(this.items.length, item);\n }\n\n insert(index: number, item: AnyConfig | Component | string): Component {\n const c = this.make(item);\n this.items.splice(index, 0, c);\n if (this.rendered) this.attach(c, index);\n this.emit('add', c);\n return c;\n }\n\n /** Removes a child (by instance, id or index). Destroys it unless `destroy` is `false`. */\n remove(child: Component | string | number, destroy = true): Component | undefined {\n const i = typeof child === 'number' ? child : this.items.findIndex((c) => c === child || c.id === child);\n const c = this.items[i];\n if (!c) return;\n this.items.splice(i, 1);\n c.parent = undefined;\n this.layout?.remove?.(this, c, i);\n if (destroy) c.destroy();\n else if (c.rendered) c.el.remove();\n this.emit('remove', c);\n return c;\n }\n\n removeAll(destroy = true): void {\n for (const c of [...this.items]) this.remove(c, destroy);\n }\n\n getItems(): Component[] {\n return this.items;\n }\n\n /** Direct child by id. */\n get(id: string): Component | undefined {\n return this.items.find((c) => c.id === id);\n }\n\n /** All descendants (depth-first) matching `fn`. */\n query(fn: (c: Component) => boolean): Component[] {\n const out: Component[] = [];\n for (const c of this.items) {\n if (fn(c)) out.push(c);\n if (c instanceof Container) out.push(...c.query(fn));\n }\n return out;\n }\n\n /** Layout `card`: which child is visible. */\n getActiveItem(): Component | undefined {\n return this.layout?.getActive?.(this);\n }\n setActiveItem(item: Component | string | number): void {\n const c = typeof item === 'number' ? this.items[item] : this.items.find((x) => x === item || x.id === item);\n if (c) this.layout?.activate?.(this, c);\n }\n\n override notifyMount(): void {\n super.notifyMount();\n for (const c of this.items) c.notifyMount();\n }\n\n protected override onDestroy(): void {\n for (const c of [...this.items]) c.destroy();\n }\n\n override setDisabled(disabled: boolean): void {\n super.setDisabled(disabled);\n for (const c of this.items) c.setDisabled(disabled);\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["factories", "registerLayout", "name", "factory", "createLayout", "spec", "cfg", "f", "watchNarrow", "c", "below", "on", "body", "narrow", "set", "n", "ro", "cssLayout", "vars", "v", "px", "hbox", "base", "w", "cols", "_c", "cmp", "span", "cont", "regions", "e", "find", "sync", "close", "region", "active", "show", "i", "a", "index", "Container", "_Container", "Component", "config", "i", "s", "item", "c", "create", "spec", "createLayout", "index", "body", "next", "x", "child", "destroy", "id", "fn", "out", "disabled"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as f}from"./chunk-LMGCV35W.js";import{c as m}from"./chunk-JTYWZMSZ.js";import{e as p}from"./chunk-4AA4FQEM.js";import{a as c,b as d}from"./chunk-IYPKPLCU.js";import{b as a}from"./chunk-PZSHOSOS.js";import{e as l}from"./chunk-MA5BJL3S.js";var h=class extends c{baseCls="op-dataview";store;itemsEl;emptyEl;pager;selected=new Set;active=0;anchor=-1;offStore;build(){let t=this.config,e=a("div",this.baseCls,{role:"listbox","aria-multiselectable":t.selection==="multi"?"true":null});return this.itemsEl=a("div","op-dataview__items"),this.emptyEl=a("div","op-dataview__empty"),e.append(this.itemsEl,this.emptyEl),t.itemWidth&&e.style.setProperty("--op-dataview-item-width",t.itemWidth),t.gap&&e.style.setProperty("--op-dataview-gap",t.gap),t.paging&&(this.pager=new f({cls:"op-dataview__pager"}),e.append(this.pager.el)),e}onRender(){let t=this.config;this.bindStore(t.store??new m({data:t.data??[]})),this.listen(this.itemsEl,"click",e=>this.onClick(e,"item-click")),this.listen(this.itemsEl,"dblclick",e=>this.onClick(e,"item-dblclick")),this.listen(this.itemsEl,"keydown",e=>this.onKey(e)),this.listen(this.itemsEl,"focusin",e=>{let i=this.indexOf(e);i>=0&&this.setActive(i,!1)}),this.pager&&(this.pager.setStore(this.store),this.store.pageSize||this.store.setPageSize(t.pageSize??24)),this.own(()=>this.pager?.destroy()),this.paint(!0)}notifyMount(){super.notifyMount(),this.pager?.notifyMount()}bindStore(t){this.offStore?.(),this.store=t;let e=t.subscribe(s=>this.rendered&&this.paint(["load","page","filter","sort"].includes(s.type))),i=t.on("loading",s=>this.setLoading(s));this.offStore=()=>(e(),i()),this.own(()=>this.offStore?.())}setStore(t){this.config.store=t,this.selected.clear(),this.active=0,this.rendered&&(this.bindStore(t),this.pager?.setStore(t),this.paint())}getStore(){return this.render(),this.store}paint(t=!1){let e=this.config;for(let s of this.selected)this.store.indexOf(s)<0&&this.selected.delete(s);this.active=Math.min(this.active,Math.max(0,this.store.count-1));let i=e.selection??"single";this.itemsEl.replaceChildren(...this.store.getRange().map((s,o)=>{let n=a("div",`op-dataview__item${this.selected.has(s)?" is-selected":""}${o===this.active?" is-active":""}${e.itemCls?` ${e.itemCls(s)}`:""}`,{role:"option",id:`${this.id}-i${o}`,"data-i":o,tabindex:o===this.active?0:-1,"aria-selected":i==="none"?null:String(this.selected.has(s))});return n.append(e.renderer(s,o)),n})),t&&e.stagger!==!1&&p(this.items(),{dy:8}),this.emptyEl.textContent=e.emptyText??l("empty"),this.emptyEl.hidden=this.store.count>0,this.el.classList.toggle("is-empty",this.store.count===0)}refresh(){this.rendered&&this.paint()}items(){return Array.from(this.itemsEl.children)}indexOf(t){let e=t.target.closest(".op-dataview__item");return e?Number(e.dataset.i):-1}columns(){let t=this.items();return t.length?Math.max(1,t.filter(e=>e.offsetTop===t[0].offsetTop).length):1}getSelection(){return[...this.selected]}select(t,e={}){let i=typeof t=="number"?this.store.getAt(t):t,s=this.config.selection??"single";!i||s==="none"||((s==="single"||!e.add)&&this.selected.clear(),this.selected.add(i),this.changed())}selectAll(){this.config.selection==="multi"&&(this.store.each(t=>this.selected.add(t)),this.changed())}deselectAll(){this.selected.size&&(this.selected.clear(),this.changed())}changed(){this.paintSelection(),this.emit("select",this.getSelection())}paintSelection(){this.items().forEach((t,e)=>{let i=this.selected.has(this.store.getAt(e));t.classList.toggle("is-selected",i),(this.config.selection??"single")!=="none"&&t.setAttribute("aria-selected",String(i))})}pick(t,e){let i=this.config.selection??"single",s=this.store.getAt(t);if(!(!s||i==="none")){if(i==="multi"&&e.shiftKey&&this.anchor>=0){this.selected.clear();for(let o of this.store.getRange(Math.min(this.anchor,t),Math.max(this.anchor,t)+1))this.selected.add(o)}else i==="multi"&&(e.ctrlKey||e.metaKey)?(this.selected.delete(s)||this.selected.add(s),this.anchor=t):(this.selected.clear(),this.selected.add(s),this.anchor=t);this.changed()}}onClick(t,e){let i=this.indexOf(t),s=this.store.getAt(i);if(!s)return;let o=t.target.closest("[data-op-action]");if(o){e==="item-click"&&this.emit("item-action",o.dataset.opAction,s,t);return}e==="item-click"&&(this.setActive(i,!1),this.pick(i,t)),this.emit(e,s,i,t)}setActive(t,e=!0){this.active=t,this.items().forEach((i,s)=>{i.tabIndex=s===t?0:-1,i.classList.toggle("is-active",s===t)}),e&&this.items()[t]?.focus(),this.emit("active-change",t)}focusItem(t){this.render(),this.setActive(Math.max(0,Math.min(t,this.store.count-1)))}onKey(t){let e=this.store.count;if(!e)return;let i=this.columns(),s=Math.max(1,Math.floor(this.el.clientHeight/Math.max(1,this.items()[0]?.offsetHeight??1))||3),o=this.active,n={ArrowRight:Math.min(e-1,o+1),ArrowLeft:Math.max(0,o-1),ArrowDown:Math.min(e-1,o+i),ArrowUp:Math.max(0,o-i),Home:0,End:e-1,PageDown:Math.min(e-1,o+i*s),PageUp:Math.max(0,o-i*s)},r=this.config.selection??"single";t.key in n?(t.preventDefault(),this.setActive(n[t.key]),r==="multi"&&t.shiftKey?this.pick(n[t.key],{shiftKey:!0}):r==="single"&&!t.ctrlKey&&this.pick(n[t.key],{}),r==="multi"&&t.shiftKey&&this.anchor<0&&(this.anchor=o)):t.key===" "?(t.preventDefault(),this.pick(o,r==="multi"?{ctrlKey:!0}:{})):t.key==="Enter"?this.emit("item-activate",this.store.getAt(o),o):(t.key==="a"||t.key==="A")&&(t.ctrlKey||t.metaKey)&&r==="multi"&&(t.preventDefault(),this.selectAll())}onDestroy(){this.pager?.destroy()}};d("dataview",h);export{h as a};
2
- //# sourceMappingURL=chunk-XVIC24AW.js.map
@@ -1,2 +0,0 @@
1
- import{a as c}from"./chunk-LBCWEWPN.js";import{c as h}from"./chunk-UPOBGNJ5.js";import{a as b}from"./chunk-XZEOSW3Q.js";import{c as a}from"./chunk-IHAYOSBR.js";import{b as p}from"./chunk-IYPKPLCU.js";import{b as i,c as r}from"./chunk-PZSHOSOS.js";import{e as l}from"./chunk-MA5BJL3S.js";var d=class extends h{baseCls="op-panel";headerEl;titleEl;bodyEl;toolsEl;iconHost;toggleBtn;bars=[];bodyId=r("op-body");titleId=r("op-title");getBody(){return this.bodyEl}build(){let t=this.config,e=i("div",this.baseCls,{role:"region","aria-labelledby":this.titleId});this.iconHost=i("span","op-panel__icon"),this.titleEl=i("span","op-panel__title",{id:this.titleId}),this.toolsEl=i("div","op-panel__tools"),this.headerEl=i("div","op-panel__header",{},this.iconHost,this.titleEl,this.toolsEl),this.bodyEl=i("div",`op-panel__body ${t.bodyCls??""}`,{id:this.bodyId}),e.append(this.headerEl);let o=(s,f)=>{let n=new c({items:s,cls:f});return n.parent=this,this.bars.push(n),n.el};return t.tbar&&e.append(o(t.tbar,"op-panel__tbar")),e.append(this.bodyEl),t.bbar&&e.append(o(t.bbar,"op-panel__bbar")),t.buttons&&e.append(o(["->",...t.buttons.map(s=>new b(s))],"op-panel__footer")),e}onRender(){super.onRender();let t=this.config;this.setTitle(t.title??""),this.setIcon(t.icon??"");for(let e of t.tools??[])this.addTool(e.icon,e.label,o=>e.handler?.(this,o));t.collapsible&&(this.toggleBtn=this.addTool("chevron-up",l("collapse"),()=>this.toggle()),this.toggleBtn.setAttribute("aria-controls",this.bodyId),this.el.classList.add("op-panel--collapsible"),this.listen(this.titleEl,"click",()=>this.toggle())),t.closable&&this.addTool("x",l("close"),()=>this.close()),this.setCollapsed(!!t.collapsed),this.updateHeader()}addTool(t,e,o){let s=i("button","op-panel__tool",{type:"button","aria-label":e,"data-op-tip":e},a(t));return this.listen(s,"click",o),this.toolsEl.append(s),s}updateHeader(){let t=this.config;this.headerEl.hidden=!t.title&&!t.icon&&!t.collapsible&&!t.closable&&!t.tools?.length}setTitle(t){this.config.title=t,this.rendered&&(this.titleEl.textContent=t,this.updateHeader())}setIcon(t){this.config.icon=t,this.rendered&&(this.iconHost.replaceChildren(...t?[a(t)]:[]),this.iconHost.hidden=!t,this.updateHeader())}setCollapsed(t){if(this.config.collapsed=t,!!this.rendered){this.el.classList.toggle("is-collapsed",t);for(let e of[this.bodyEl,...this.bars.map(o=>o.el)])e.hidden=t;this.toggleBtn&&(this.toggleBtn.setAttribute("aria-expanded",String(!t)),this.toggleBtn.setAttribute("aria-label",l(t?"expand":"collapse")))}}collapse(){this.config.collapsed||this.emit("before-collapse")===!1||(this.setCollapsed(!0),this.emit("collapse"))}expand(){!this.config.collapsed||this.emit("before-expand")===!1||(this.setCollapsed(!1),this.emit("expand"))}toggle(){this.config.collapsed?this.expand():this.collapse()}close(){this.emit("before-close")!==!1&&(this.emit("close"),this.config.closeAction==="hide"?this.hide():this.destroy())}onDestroy(){super.onDestroy(),this.bars.forEach(t=>t.destroy())}};p("panel",d);export{d as a};
2
- //# sourceMappingURL=chunk-XZ5CUZZP.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/layout/panel/panel.ts"],
4
- "sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { register } from '../../../core/registry';\nimport { h, uid } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { iconEl } from '../../base/icon/icon';\nimport { Toolbar, type ToolbarConfig } from '../toolbar/toolbar';\nimport { Button } from '../../base/button/button';\nimport type { ButtonConfig } from '../../base/button/button';\n\nexport interface PanelTool {\n icon: string;\n label: string;\n handler?: (panel: Panel, ev: MouseEvent) => void;\n}\n\nexport interface PanelConfig extends ContainerConfig {\n title?: string;\n icon?: string;\n collapsible?: boolean;\n collapsed?: boolean;\n closable?: boolean;\n closeAction?: 'destroy' | 'hide';\n tools?: PanelTool[];\n tbar?: ToolbarConfig['items'];\n bbar?: ToolbarConfig['items'];\n buttons?: ButtonConfig[];\n bodyCls?: string;\n}\n\nexport class Panel<C extends PanelConfig = PanelConfig> extends Container<C> {\n protected override baseCls = 'op-panel';\n protected headerEl!: HTMLElement;\n protected titleEl!: HTMLElement;\n protected bodyEl!: HTMLElement;\n private toolsEl!: HTMLElement;\n private iconHost!: HTMLElement;\n private toggleBtn?: HTMLButtonElement;\n private bars: Toolbar[] = [];\n private bodyId = uid('op-body');\n private titleId = uid('op-title');\n\n override getBody() {\n return this.bodyEl;\n }\n\n protected override build() {\n const c = this.config;\n const el = h('div', this.baseCls, { role: 'region', 'aria-labelledby': this.titleId });\n this.iconHost = h('span', 'op-panel__icon');\n this.titleEl = h('span', 'op-panel__title', { id: this.titleId });\n this.toolsEl = h('div', 'op-panel__tools');\n this.headerEl = h('div', 'op-panel__header', {}, this.iconHost, this.titleEl, this.toolsEl);\n this.bodyEl = h('div', `op-panel__body ${c.bodyCls ?? ''}`, { id: this.bodyId });\n el.append(this.headerEl);\n const bar = (cfg: ToolbarConfig['items'], cls: string) => {\n const tb = new Toolbar({ items: cfg, cls });\n tb.parent = this;\n this.bars.push(tb);\n return tb.el;\n };\n if (c.tbar) el.append(bar(c.tbar, 'op-panel__tbar'));\n el.append(this.bodyEl);\n if (c.bbar) el.append(bar(c.bbar, 'op-panel__bbar'));\n if (c.buttons) el.append(bar(['->', ...c.buttons.map((b) => new Button(b))], 'op-panel__footer'));\n return el;\n }\n\n protected override onRender() {\n super.onRender();\n const c = this.config;\n this.setTitle(c.title ?? '');\n this.setIcon(c.icon ?? '');\n for (const tool of c.tools ?? []) this.addTool(tool.icon, tool.label, (e) => tool.handler?.(this, e));\n if (c.collapsible) {\n this.toggleBtn = this.addTool('chevron-up', t('collapse'), () => this.toggle());\n this.toggleBtn.setAttribute('aria-controls', this.bodyId);\n this.el.classList.add('op-panel--collapsible');\n this.listen(this.titleEl, 'click', () => this.toggle());\n }\n if (c.closable) this.addTool('x', t('close'), () => this.close());\n this.setCollapsed(!!c.collapsed);\n this.updateHeader();\n }\n\n private addTool(icon: string, label: string, onClick: (e: MouseEvent) => void) {\n const b = h('button', 'op-panel__tool', { type: 'button', 'aria-label': label, 'data-op-tip': label }, iconEl(icon));\n this.listen(b, 'click', onClick);\n this.toolsEl.append(b);\n return b;\n }\n\n private updateHeader() {\n const c = this.config;\n this.headerEl.hidden = !c.title && !c.icon && !c.collapsible && !c.closable && !c.tools?.length;\n }\n\n setTitle(title: string) {\n this.config.title = title;\n if (!this.rendered) return;\n this.titleEl.textContent = title;\n this.updateHeader();\n }\n\n setIcon(name: string) {\n this.config.icon = name;\n if (!this.rendered) return;\n this.iconHost.replaceChildren(...(name ? [iconEl(name)] : []));\n this.iconHost.hidden = !name;\n this.updateHeader();\n }\n\n /** Collapses/expands without events. Use `collapse()`/`expand()` for the full behavior. */\n setCollapsed(collapsed: boolean) {\n this.config.collapsed = collapsed;\n if (!this.rendered) return;\n this.el.classList.toggle('is-collapsed', collapsed);\n for (const e of [this.bodyEl, ...this.bars.map((b) => b.el)]) e.hidden = collapsed;\n if (this.toggleBtn) {\n this.toggleBtn.setAttribute('aria-expanded', String(!collapsed));\n this.toggleBtn.setAttribute('aria-label', t(collapsed ? 'expand' : 'collapse'));\n }\n }\n\n collapse() {\n if (this.config.collapsed || this.emit('before-collapse') === false) return;\n this.setCollapsed(true);\n this.emit('collapse');\n }\n expand() {\n if (!this.config.collapsed || this.emit('before-expand') === false) return;\n this.setCollapsed(false);\n this.emit('expand');\n }\n toggle() {\n if (this.config.collapsed) this.expand();\n else this.collapse();\n }\n\n close() {\n if (this.emit('before-close') === false) return;\n this.emit('close');\n if (this.config.closeAction === 'hide') this.hide();\n else this.destroy();\n }\n\n protected override onDestroy() {\n super.onDestroy();\n this.bars.forEach((b) => b.destroy());\n }\n}\nregister('panel', Panel);\n"],
5
- "mappings": "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",
6
- "names": ["Panel", "Container", "uid", "c", "el", "h", "bar", "cfg", "cls", "tb", "Toolbar", "b", "Button", "tool", "e", "t", "icon", "label", "onClick", "iconEl", "title", "name", "collapsed", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{g as r}from"./chunk-4AA4FQEM.js";import{c as l}from"./chunk-IHAYOSBR.js";import{a as o,b as n}from"./chunk-IYPKPLCU.js";import{b as i}from"./chunk-PZSHOSOS.js";var s=class extends o{baseCls="op-button";tag="button";textEl;busyTextEl;iconHost;build(){let t=this.config,e=i("button","op-button",{type:t.htmlType??"button"});return this.iconHost=i("span","op-button__icon"),this.textEl=i("span","op-button__text"),this.busyTextEl=i("span","op-button__busy-text"),e.append(i("span","op-button__face",{},this.iconHost,this.textEl),i("span","op-button__busy",{"aria-hidden":"true"},i("span","op-spinner op-button__spinner"),this.busyTextEl)),e}onRender(){let t=this.config;this.setText(t.text??""),this.setIcon(t.icon??""),this.setVariant(t.variant??"default"),this.setPressed(!!t.pressed),!t.text&&!t.ariaLabel&&!t.tooltip&&console.warn("Optikos: icon-only Button needs ariaLabel"),this.listen(this.el,"click",e=>{if(t.disabled||t.loading||(t.toggle&&(this.setPressed(!t.pressed),this.emit("toggle",t.pressed)),this.emit("click",e)===!1))return e.preventDefault();t.handler?.(this,e)})}onDisabled(t){this.el.disabled=t}setText(t){this.config.text=t,this.rendered&&(this.textEl.textContent=t,this.textEl.hidden=!t,this.busyTextEl.textContent=this.config.loadingText??t)}setIcon(t){this.config.icon=t,this.rendered&&(this.iconHost.replaceChildren(...t?[l(t)]:[]),this.iconHost.hidden=!t,this.el.classList.toggle("op-button--icon-right",this.config.iconPos==="right"))}setVariant(t){if(this.config.variant=t,!!this.rendered)for(let e of["default","primary","danger","ghost"])this.el.classList.toggle(`op-button--${e}`,e===t)}setPressed(t){this.config.pressed=t,this.rendered&&(this.el.classList.toggle("is-pressed",t),this.config.toggle&&this.el.setAttribute("aria-pressed",String(t)))}setLoading(t){this.config.loading=t,typeof t=="string"&&this.setLoadingText(t),this.rendered&&(this.el.classList.toggle("is-loading",!!t),t?this.el.setAttribute("aria-busy","true"):this.el.removeAttribute("aria-busy"))}setLoadingText(t){this.config.loadingText=t,this.rendered&&(this.busyTextEl.textContent=t)}pulse(){r(this.el)}click(){this.el.click()}};n("button",s);export{s as a};
2
- //# sourceMappingURL=chunk-XZEOSW3Q.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/base/button/button.ts"],
4
- "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { iconEl } from '../icon/icon';\nimport { pulse } from '../../../motion/core';\n\nexport interface ButtonConfig extends ComponentConfig {\n text?: string;\n icon?: string;\n iconPos?: 'left' | 'right';\n variant?: 'default' | 'primary' | 'danger' | 'ghost';\n htmlType?: 'button' | 'submit' | 'reset';\n handler?: (button: Button, ev: MouseEvent) => unknown;\n /** Behaves as a toggle button (`aria-pressed`). */\n toggle?: boolean;\n pressed?: boolean;\n /** Text shown while loading. Default: `text`. Passing a string to `loading` sets it too. */\n loadingText?: string;\n}\n\nexport class Button extends Component<ButtonConfig> {\n protected override baseCls = 'op-button';\n protected override tag = 'button' as const;\n private textEl!: HTMLElement;\n private busyTextEl!: HTMLElement;\n private iconHost!: HTMLElement;\n\n protected override build() {\n const c = this.config;\n const el = h('button', 'op-button', { type: c.htmlType ?? 'button' });\n this.iconHost = h('span', 'op-button__icon');\n this.textEl = h('span', 'op-button__text');\n // Two layers share one grid cell: the normal face and the loading face. The inactive one is hidden by CSS,\n // so the button is as wide as the wider of the two and never jumps when loading starts.\n this.busyTextEl = h('span', 'op-button__busy-text');\n el.append(\n h('span', 'op-button__face', {}, this.iconHost, this.textEl),\n h('span', 'op-button__busy', { 'aria-hidden': 'true' }, h('span', 'op-spinner op-button__spinner'), this.busyTextEl),\n );\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n this.setText(c.text ?? '');\n this.setIcon(c.icon ?? '');\n this.setVariant(c.variant ?? 'default');\n this.setPressed(!!c.pressed);\n if (!c.text && !c.ariaLabel && !c.tooltip) console.warn('Optikos: icon-only Button needs ariaLabel');\n this.listen(this.el, 'click', (e: MouseEvent) => {\n if (c.disabled || c.loading) return e.preventDefault();\n if (c.toggle) {\n this.setPressed(!c.pressed);\n this.emit('toggle', c.pressed);\n }\n if (this.emit('click', e) === false) return e.preventDefault();\n c.handler?.(this, e);\n });\n }\n\n protected override onDisabled(disabled: boolean) {\n (this.el as HTMLButtonElement).disabled = disabled;\n }\n\n setText(text: string) {\n this.config.text = text;\n if (!this.rendered) return;\n this.textEl.textContent = text;\n this.textEl.hidden = !text;\n this.busyTextEl.textContent = this.config.loadingText ?? text;\n }\n\n setIcon(name: string) {\n this.config.icon = name;\n if (!this.rendered) return;\n this.iconHost.replaceChildren(...(name ? [iconEl(name)] : []));\n this.iconHost.hidden = !name;\n this.el.classList.toggle('op-button--icon-right', this.config.iconPos === 'right');\n }\n\n setVariant(variant: NonNullable<ButtonConfig['variant']>) {\n this.config.variant = variant;\n if (!this.rendered) return;\n for (const v of ['default', 'primary', 'danger', 'ghost']) this.el.classList.toggle(`op-button--${v}`, v === variant);\n }\n\n setPressed(pressed: boolean) {\n this.config.pressed = pressed;\n if (!this.rendered) return;\n this.el.classList.toggle('is-pressed', pressed);\n if (this.config.toggle) this.el.setAttribute('aria-pressed', String(pressed));\n }\n\n /** The button shows its own spinner (no mask) and ignores clicks while loading. A string is the loading text. */\n override setLoading(loading: boolean | string) {\n this.config.loading = loading;\n if (typeof loading === 'string') this.setLoadingText(loading);\n if (!this.rendered) return;\n this.el.classList.toggle('is-loading', !!loading);\n if (loading) this.el.setAttribute('aria-busy', 'true');\n else this.el.removeAttribute('aria-busy');\n }\n\n setLoadingText(text: string) {\n this.config.loadingText = text;\n if (this.rendered) this.busyTextEl.textContent = text;\n }\n\n /** A subtle ring that confirms the action worked (motion rule 8). */\n pulse(): void {\n void pulse(this.el);\n }\n\n click() {\n (this.el as HTMLButtonElement).click();\n }\n}\nregister('button', Button);\n"],
5
- "mappings": "uKAoBO,IAAMA,EAAN,cAAqBC,CAAwB,CAC/B,QAAU,YACV,IAAM,SACjB,OACA,WACA,SAEW,OAAQ,CACzB,IAAMC,EAAI,KAAK,OACTC,EAAKC,EAAE,SAAU,YAAa,CAAE,KAAMF,EAAE,UAAY,QAAS,CAAC,EACpE,YAAK,SAAWE,EAAE,OAAQ,iBAAiB,EAC3C,KAAK,OAASA,EAAE,OAAQ,iBAAiB,EAGzC,KAAK,WAAaA,EAAE,OAAQ,sBAAsB,EAClDD,EAAG,OACDC,EAAE,OAAQ,kBAAmB,CAAC,EAAG,KAAK,SAAU,KAAK,MAAM,EAC3DA,EAAE,OAAQ,kBAAmB,CAAE,cAAe,MAAO,EAAGA,EAAE,OAAQ,+BAA+B,EAAG,KAAK,UAAU,CACrH,EACOD,CACT,CAEmB,UAAW,CAC5B,IAAMD,EAAI,KAAK,OACf,KAAK,QAAQA,EAAE,MAAQ,EAAE,EACzB,KAAK,QAAQA,EAAE,MAAQ,EAAE,EACzB,KAAK,WAAWA,EAAE,SAAW,SAAS,EACtC,KAAK,WAAW,CAAC,CAACA,EAAE,OAAO,EACvB,CAACA,EAAE,MAAQ,CAACA,EAAE,WAAa,CAACA,EAAE,SAAS,QAAQ,KAAK,2CAA2C,EACnG,KAAK,OAAO,KAAK,GAAI,QAAU,GAAkB,CAM/C,GALIA,EAAE,UAAYA,EAAE,UAChBA,EAAE,SACJ,KAAK,WAAW,CAACA,EAAE,OAAO,EAC1B,KAAK,KAAK,SAAUA,EAAE,OAAO,GAE3B,KAAK,KAAK,QAAS,CAAC,IAAM,IAAO,OAAO,EAAE,eAAe,EAC7DA,EAAE,UAAU,KAAM,CAAC,CACrB,CAAC,CACH,CAEmB,WAAWG,EAAmB,CAC9C,KAAK,GAAyB,SAAWA,CAC5C,CAEA,QAAQC,EAAc,CACpB,KAAK,OAAO,KAAOA,EACd,KAAK,WACV,KAAK,OAAO,YAAcA,EAC1B,KAAK,OAAO,OAAS,CAACA,EACtB,KAAK,WAAW,YAAc,KAAK,OAAO,aAAeA,EAC3D,CAEA,QAAQC,EAAc,CACpB,KAAK,OAAO,KAAOA,EACd,KAAK,WACV,KAAK,SAAS,gBAAgB,GAAIA,EAAO,CAACC,EAAOD,CAAI,CAAC,EAAI,CAAC,CAAE,EAC7D,KAAK,SAAS,OAAS,CAACA,EACxB,KAAK,GAAG,UAAU,OAAO,wBAAyB,KAAK,OAAO,UAAY,OAAO,EACnF,CAEA,WAAWE,EAA+C,CAExD,GADA,KAAK,OAAO,QAAUA,EAClB,EAAC,KAAK,SACV,QAAWC,IAAK,CAAC,UAAW,UAAW,SAAU,OAAO,EAAG,KAAK,GAAG,UAAU,OAAO,cAAcA,CAAC,GAAIA,IAAMD,CAAO,CACtH,CAEA,WAAWE,EAAkB,CAC3B,KAAK,OAAO,QAAUA,EACjB,KAAK,WACV,KAAK,GAAG,UAAU,OAAO,aAAcA,CAAO,EAC1C,KAAK,OAAO,QAAQ,KAAK,GAAG,aAAa,eAAgB,OAAOA,CAAO,CAAC,EAC9E,CAGS,WAAWC,EAA2B,CAC7C,KAAK,OAAO,QAAUA,EAClB,OAAOA,GAAY,UAAU,KAAK,eAAeA,CAAO,EACvD,KAAK,WACV,KAAK,GAAG,UAAU,OAAO,aAAc,CAAC,CAACA,CAAO,EAC5CA,EAAS,KAAK,GAAG,aAAa,YAAa,MAAM,EAChD,KAAK,GAAG,gBAAgB,WAAW,EAC1C,CAEA,eAAeN,EAAc,CAC3B,KAAK,OAAO,YAAcA,EACtB,KAAK,WAAU,KAAK,WAAW,YAAcA,EACnD,CAGA,OAAc,CACPO,EAAM,KAAK,EAAE,CACpB,CAEA,OAAQ,CACL,KAAK,GAAyB,MAAM,CACvC,CACF,EACAC,EAAS,SAAUd,CAAM",
6
- "names": ["Button", "Component", "c", "el", "h", "disabled", "text", "name", "iconEl", "variant", "v", "pressed", "loading", "pulse", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{c as n}from"./chunk-UPOBGNJ5.js";import{c as r}from"./chunk-IHAYOSBR.js";import{b as s}from"./chunk-IYPKPLCU.js";import{b as t}from"./chunk-PZSHOSOS.js";import{e as l}from"./chunk-MA5BJL3S.js";var o=class extends n{baseCls="op-fieldset";tag="fieldset";legend;bodyEl;toggleBtn;getBody(){return this.bodyEl}build(){let e=super.build();return this.legend=t("legend","op-fieldset__legend"),this.bodyEl=t("div","op-fieldset__body"),e.append(this.legend,this.bodyEl),e}onRender(){this.config.layout??={type:"vbox"},super.onRender(),this.config.collapsible&&(this.toggleBtn=t("button","op-fieldset__toggle",{type:"button"},r("chevron-up")),this.listen(this.toggleBtn,"click",()=>this.toggle()),this.legend.prepend(this.toggleBtn)),this.setTitle(this.config.title??""),this.setCollapsed(!!this.config.collapsed)}setTitle(e){if(this.config.title=e,!this.rendered)return;let i=this.legend.querySelector(".op-fieldset__title");i||this.legend.append(i=t("span","op-fieldset__title")),i.textContent=e,this.legend.hidden=!e&&!this.config.collapsible}setCollapsed(e){this.config.collapsed=e,this.rendered&&(this.el.classList.toggle("is-collapsed",e),this.bodyEl.hidden=e,this.toggleBtn?.setAttribute("aria-expanded",String(!e)),this.toggleBtn?.setAttribute("aria-label",l(e?"expand":"collapse")))}collapse(){this.config.collapsed||this.emit("before-collapse")===!1||(this.setCollapsed(!0),this.emit("collapse"))}expand(){!this.config.collapsed||this.emit("before-expand")===!1||(this.setCollapsed(!1),this.emit("expand"))}toggle(){this.config.collapsed?this.expand():this.collapse()}};s("fieldset",o);export{o as a};
2
- //# sourceMappingURL=chunk-YET5PM6F.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/layout/fieldset/fieldset.ts"],
4
- "sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { iconEl } from '../../base/icon/icon';\n\nexport interface FieldSetConfig extends ContainerConfig {\n title?: string;\n collapsible?: boolean;\n collapsed?: boolean;\n}\n\nexport class FieldSet extends Container<FieldSetConfig> {\n protected override baseCls = 'op-fieldset';\n protected override tag = 'fieldset' as const;\n private legend!: HTMLElement;\n private bodyEl!: HTMLElement;\n private toggleBtn?: HTMLButtonElement;\n\n override getBody() {\n return this.bodyEl;\n }\n\n protected override build() {\n const el = super.build();\n this.legend = h('legend', 'op-fieldset__legend');\n this.bodyEl = h('div', 'op-fieldset__body');\n el.append(this.legend, this.bodyEl);\n return el;\n }\n\n protected override onRender() {\n this.config.layout ??= { type: 'vbox' };\n super.onRender();\n if (this.config.collapsible) {\n this.toggleBtn = h('button', 'op-fieldset__toggle', { type: 'button' }, iconEl('chevron-up'));\n this.listen(this.toggleBtn, 'click', () => this.toggle());\n this.legend.prepend(this.toggleBtn);\n }\n this.setTitle(this.config.title ?? '');\n this.setCollapsed(!!this.config.collapsed);\n }\n\n setTitle(title: string) {\n this.config.title = title;\n if (!this.rendered) return;\n let text = this.legend.querySelector('.op-fieldset__title');\n if (!text) this.legend.append((text = h('span', 'op-fieldset__title')));\n text.textContent = title;\n this.legend.hidden = !title && !this.config.collapsible;\n }\n\n setCollapsed(collapsed: boolean) {\n this.config.collapsed = collapsed;\n if (!this.rendered) return;\n this.el.classList.toggle('is-collapsed', collapsed);\n this.bodyEl.hidden = collapsed;\n this.toggleBtn?.setAttribute('aria-expanded', String(!collapsed));\n this.toggleBtn?.setAttribute('aria-label', t(collapsed ? 'expand' : 'collapse'));\n }\n collapse() {\n if (this.config.collapsed || this.emit('before-collapse') === false) return;\n this.setCollapsed(true);\n this.emit('collapse');\n }\n expand() {\n if (!this.config.collapsed || this.emit('before-expand') === false) return;\n this.setCollapsed(false);\n this.emit('expand');\n }\n toggle() {\n if (this.config.collapsed) this.expand();\n else this.collapse();\n }\n}\nregister('fieldset', FieldSet);\n"],
5
- "mappings": "wMAYO,IAAMA,EAAN,cAAuBC,CAA0B,CACnC,QAAU,cACV,IAAM,WACjB,OACA,OACA,UAEC,SAAU,CACjB,OAAO,KAAK,MACd,CAEmB,OAAQ,CACzB,IAAMC,EAAK,MAAM,MAAM,EACvB,YAAK,OAASC,EAAE,SAAU,qBAAqB,EAC/C,KAAK,OAASA,EAAE,MAAO,mBAAmB,EAC1CD,EAAG,OAAO,KAAK,OAAQ,KAAK,MAAM,EAC3BA,CACT,CAEmB,UAAW,CAC5B,KAAK,OAAO,SAAW,CAAE,KAAM,MAAO,EACtC,MAAM,SAAS,EACX,KAAK,OAAO,cACd,KAAK,UAAYC,EAAE,SAAU,sBAAuB,CAAE,KAAM,QAAS,EAAGC,EAAO,YAAY,CAAC,EAC5F,KAAK,OAAO,KAAK,UAAW,QAAS,IAAM,KAAK,OAAO,CAAC,EACxD,KAAK,OAAO,QAAQ,KAAK,SAAS,GAEpC,KAAK,SAAS,KAAK,OAAO,OAAS,EAAE,EACrC,KAAK,aAAa,CAAC,CAAC,KAAK,OAAO,SAAS,CAC3C,CAEA,SAASC,EAAe,CAEtB,GADA,KAAK,OAAO,MAAQA,EAChB,CAAC,KAAK,SAAU,OACpB,IAAIC,EAAO,KAAK,OAAO,cAAc,qBAAqB,EACrDA,GAAM,KAAK,OAAO,OAAQA,EAAOH,EAAE,OAAQ,oBAAoB,CAAE,EACtEG,EAAK,YAAcD,EACnB,KAAK,OAAO,OAAS,CAACA,GAAS,CAAC,KAAK,OAAO,WAC9C,CAEA,aAAaE,EAAoB,CAC/B,KAAK,OAAO,UAAYA,EACnB,KAAK,WACV,KAAK,GAAG,UAAU,OAAO,eAAgBA,CAAS,EAClD,KAAK,OAAO,OAASA,EACrB,KAAK,WAAW,aAAa,gBAAiB,OAAO,CAACA,CAAS,CAAC,EAChE,KAAK,WAAW,aAAa,aAAcC,EAAED,EAAY,SAAW,UAAU,CAAC,EACjF,CACA,UAAW,CACL,KAAK,OAAO,WAAa,KAAK,KAAK,iBAAiB,IAAM,KAC9D,KAAK,aAAa,EAAI,EACtB,KAAK,KAAK,UAAU,EACtB,CACA,QAAS,CACH,CAAC,KAAK,OAAO,WAAa,KAAK,KAAK,eAAe,IAAM,KAC7D,KAAK,aAAa,EAAK,EACvB,KAAK,KAAK,QAAQ,EACpB,CACA,QAAS,CACH,KAAK,OAAO,UAAW,KAAK,OAAO,EAClC,KAAK,SAAS,CACrB,CACF,EACAE,EAAS,WAAYT,CAAQ",
6
- "names": ["FieldSet", "Container", "el", "h", "iconEl", "title", "text", "collapsed", "t", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as p}from"./chunk-ARCW54L2.js";import{c as d}from"./chunk-VV7CFMPZ.js";import{e as l}from"./chunk-4AA4FQEM.js";import{c as s}from"./chunk-IHAYOSBR.js";import{a as u,b as h}from"./chunk-IYPKPLCU.js";import{b as i}from"./chunk-PZSHOSOS.js";var r=".op-menu__item",a=class m extends u{baseCls="op-menu";parentMenu;dd;sub;subOwner;opener=null;hoverCancel;build(){return i("div","op-menu",{role:"menu"})}onRender(){this.renderItems();let e=d(this.el,{selector:r,orientation:"vertical"});this.own(()=>e.destroy()),this.listen(this.el,"click",t=>{let n=t.target.closest(r);n&&this.activate(n)}),this.listen(this.el,"keydown",t=>{let n=t.target.closest(r);if(t.key==="Tab")return this.closeAll();n&&(t.key==="Enter"||t.key===" "?(t.preventDefault(),this.activate(n)):t.key==="ArrowRight"&&n.getAttribute("aria-haspopup")?(t.preventDefault(),this.openSub(n,!0)):t.key==="ArrowLeft"&&this.parentMenu&&(t.preventDefault(),this.hide()))}),this.listen(this.el,"pointerover",t=>{let n=t.target.closest(r);!n||n.getAttribute("aria-disabled")==="true"||(this.hoverCancel?.(),n.focus(),n.getAttribute("aria-haspopup")?this.hoverCancel=this.later(()=>this.openSub(n,!1),150):this.sub?.hide())})}entries(){return this.config.items??[]}renderItems(){this.el.replaceChildren(...this.entries().map((e,t)=>{if(e==="-")return i("div","op-menu__sep",{role:"separator"});let n=e.checked!==void 0,o=i("div","op-menu__item",{role:n?"menuitemcheckbox":"menuitem",tabindex:-1,"data-i":t,"aria-disabled":e.disabled?"true":null,"aria-checked":n?String(!!e.checked):null,"aria-haspopup":e.items?"menu":null,"aria-expanded":e.items?"false":null});return o.append(i("span","op-menu__icon",{},e.icon?s(e.icon):n&&e.checked?s("check"):null),i("span","op-menu__text",{},e.text??"")),e.items&&o.append(i("span","op-menu__arrow",{},s("chevron-right"))),o}))}setItems(e){this.config.items=e,this.rendered&&this.renderItems()}activate(e){let t=this.entries()[Number(e.dataset.i)];if(!(!t||t.disabled)){if(t.items)return this.openSub(e,!0);t.checked!==void 0&&(t.checked=!t.checked),t.handler?.(t),this.root().emit("click",t),this.root().hide()}}root(){return this.parentMenu?this.parentMenu.root():this}openSub(e,t){let n=this.entries()[Number(e.dataset.i)];if(this.sub&&this.subOwner===e&&this.sub.isOpen())return t?this.sub.focusFirst():void 0;this.sub?.destroy(),this.sub=new m({items:n.items}),this.sub.parentMenu=this,this.subOwner=e,this.sub.on("hide",()=>e.setAttribute("aria-expanded","false")),e.setAttribute("aria-expanded","true"),this.sub.showBy(e,"right-start",t)}isOpen(){return!!this.dd?.isOpen()}focusFirst(){this.el.querySelector(`${r}:not([aria-disabled=true])`)?.focus()}showBy(e,t="bottom-start",n=!0){this.open({anchor:e,placement:t},n)}showAt(e,t){this.open({anchor:{x:e,y:t},placement:"bottom-start"},!0)}open(e,t){this.opener=document.activeElement,this.dd?(this.dd.setAnchor(e.anchor),this.dd.setPlacement(e.placement)):(this.dd=new p({...e,content:this.el,role:"presentation",flip:!0}),this.dd.on("close",()=>{this.sub?.hide(),this.emit("hide")})),this.dd.open(),l(Array.from(this.el.querySelectorAll(r)),{dy:4}),t&&this.focusFirst(),this.emit("show")}hide(){if(!this.dd?.isOpen())return;this.dd.close();let e=this.parentMenu?this.parentMenu.subOwner:this.opener;e instanceof HTMLElement&&e.isConnected&&e.focus()}closeAll(){this.root().hide()}onDestroy(){this.sub?.destroy(),this.dd?.destroy()}};h("menu",a);export{a};
2
- //# sourceMappingURL=chunk-ZCAAM4NH.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/overlays/menu/menu.ts"],
4
- "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { roving } from '../../../core/focus';\nimport type { Placement } from '../../../core/position';\nimport { iconEl } from '../../base/icon/icon';\nimport { Dropdown } from '../dropdown/dropdown';\nimport { stagger } from '../../../motion/core';\n\nexport interface MenuItem {\n text?: string;\n icon?: string;\n handler?: (item: MenuItem) => void;\n disabled?: boolean;\n /** Present (true/false) makes it a checkable item. */\n checked?: boolean;\n items?: MenuEntry[];\n}\nexport type MenuEntry = MenuItem | '-';\n\nexport interface MenuConfig extends ComponentConfig {\n items?: MenuEntry[];\n}\n\nconst ITEM = '.op-menu__item';\n\n/** Floating menu with submenus. Use `showBy(button)` for button menus and `showAt(x, y)` for context menus. */\nexport class Menu extends Component<MenuConfig> {\n protected override baseCls = 'op-menu';\n parentMenu?: Menu;\n private dd?: Dropdown;\n private sub?: Menu;\n private subOwner?: HTMLElement;\n private opener: Element | null = null;\n private hoverCancel?: () => void;\n\n protected override build() {\n return h('div', 'op-menu', { role: 'menu' });\n }\n\n protected override onRender() {\n this.renderItems();\n const rover = roving(this.el, { selector: ITEM, orientation: 'vertical' });\n this.own(() => rover.destroy());\n this.listen(this.el, 'click', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>(ITEM);\n if (row) this.activate(row);\n });\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>(ITEM);\n if (e.key === 'Tab') return this.closeAll();\n if (!row) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.activate(row);\n } else if (e.key === 'ArrowRight' && row.getAttribute('aria-haspopup')) {\n e.preventDefault();\n this.openSub(row, true);\n } else if (e.key === 'ArrowLeft' && this.parentMenu) {\n e.preventDefault();\n this.hide();\n }\n });\n this.listen(this.el, 'pointerover', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>(ITEM);\n if (!row || row.getAttribute('aria-disabled') === 'true') return;\n this.hoverCancel?.();\n row.focus();\n if (row.getAttribute('aria-haspopup')) this.hoverCancel = this.later(() => this.openSub(row, false), 150);\n else this.sub?.hide();\n });\n }\n\n private entries(): MenuEntry[] {\n return this.config.items ?? [];\n }\n\n private renderItems() {\n this.el.replaceChildren(\n ...this.entries().map((it, i) => {\n if (it === '-') return h('div', 'op-menu__sep', { role: 'separator' });\n const checkable = it.checked !== undefined;\n const row = h('div', 'op-menu__item', {\n role: checkable ? 'menuitemcheckbox' : 'menuitem',\n tabindex: -1,\n 'data-i': i,\n 'aria-disabled': it.disabled ? 'true' : null,\n 'aria-checked': checkable ? String(!!it.checked) : null,\n 'aria-haspopup': it.items ? 'menu' : null,\n 'aria-expanded': it.items ? 'false' : null,\n });\n row.append(h('span', 'op-menu__icon', {}, it.icon ? iconEl(it.icon) : checkable && it.checked ? iconEl('check') : null), h('span', 'op-menu__text', {}, it.text ?? ''));\n if (it.items) row.append(h('span', 'op-menu__arrow', {}, iconEl('chevron-right')));\n return row;\n }),\n );\n }\n\n setItems(items: MenuEntry[]) {\n this.config.items = items;\n if (this.rendered) this.renderItems();\n }\n\n private activate(row: HTMLElement) {\n const item = this.entries()[Number(row.dataset.i)] as MenuItem;\n if (!item || item.disabled) return;\n if (item.items) return this.openSub(row, true);\n if (item.checked !== undefined) item.checked = !item.checked;\n item.handler?.(item);\n this.root().emit('click', item);\n this.root().hide();\n }\n\n private root(): Menu {\n return this.parentMenu ? this.parentMenu.root() : this;\n }\n\n private openSub(row: HTMLElement, focus: boolean) {\n const item = this.entries()[Number(row.dataset.i)] as MenuItem;\n if (this.sub && this.subOwner === row && this.sub.isOpen()) return focus ? this.sub.focusFirst() : undefined;\n this.sub?.destroy();\n this.sub = new Menu({ items: item.items });\n this.sub.parentMenu = this;\n this.subOwner = row;\n this.sub.on('hide', () => row.setAttribute('aria-expanded', 'false'));\n row.setAttribute('aria-expanded', 'true');\n this.sub.showBy(row, 'right-start', focus);\n }\n\n isOpen(): boolean {\n return !!this.dd?.isOpen();\n }\n\n private focusFirst() {\n this.el.querySelector<HTMLElement>(`${ITEM}:not([aria-disabled=true])`)?.focus();\n }\n\n showBy(anchor: HTMLElement | Component, placement: Placement = 'bottom-start', focus = true) {\n this.open({ anchor, placement }, focus);\n }\n\n showAt(x: number, y: number) {\n this.open({ anchor: { x, y }, placement: 'bottom-start' }, true);\n }\n\n private open(cfg: { anchor: HTMLElement | Component | { x: number; y: number }; placement: Placement }, focus: boolean) {\n this.opener = document.activeElement;\n if (!this.dd) {\n this.dd = new Dropdown({ ...cfg, content: this.el, role: 'presentation', flip: true });\n this.dd.on('close', () => {\n this.sub?.hide();\n this.emit('hide');\n });\n } else {\n this.dd.setAnchor(cfg.anchor);\n this.dd.setPlacement(cfg.placement);\n }\n this.dd.open();\n void stagger(Array.from(this.el.querySelectorAll(ITEM)), { dy: 4 }); // the rows settle one after the other\n if (focus) this.focusFirst();\n this.emit('show');\n }\n\n override hide() {\n if (!this.dd?.isOpen()) return;\n this.dd.close();\n // Closing a submenu returns to its parent item; closing the root returns to whatever opened it.\n const back = this.parentMenu ? this.parentMenu.subOwner : this.opener;\n if (back instanceof HTMLElement && back.isConnected) back.focus();\n }\n\n closeAll() {\n this.root().hide();\n }\n\n protected override onDestroy() {\n this.sub?.destroy();\n this.dd?.destroy();\n }\n}\nregister('menu', Menu);\n"],
5
- "mappings": "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",
6
- "names": ["ITEM", "Menu", "_Menu", "Component", "h", "rover", "roving", "e", "row", "it", "i", "checkable", "iconEl", "items", "item", "focus", "anchor", "placement", "x", "y", "cfg", "Dropdown", "stagger", "back", "register"]
7
- }
@@ -1,240 +0,0 @@
1
- /* Brand: luxury / jewelry, made to be used all day. Champagne and ivory surfaces, onyx text, antique gold, high-contrast
2
- serif, hairline rules, letterspaced capitals, gilded buttons, onyx bands for titles.
3
- data-op-theme="brand"; add "night" (data-op-theme="brand night") for the dark onyx version. */
4
- @layer optikos {
5
- [data-op-theme~='brand'] {
6
- color-scheme: light;
7
- --op-brand-gold: #c9a24b;
8
- --op-brand-gold-light: #ecd28c;
9
- --op-brand-gold-deep: #9a7426;
10
-
11
- --op-brand-onyx: #1c1710;
12
- --op-color-bg: #f5efe2;
13
- --op-color-surface: #fffdf8;
14
- --op-color-surface-2: #f2eadb;
15
- --op-color-fg: #231d14;
16
- --op-color-fg-muted: #7b6d55;
17
- --op-color-border: #e3d7bb;
18
- --op-color-border-strong: #bda265;
19
- --op-color-hover: #f7efdc;
20
- --op-color-selected: #f1e3bd;
21
- --op-color-primary: var(--op-brand-gold);
22
- --op-color-primary-hover: var(--op-brand-gold-deep);
23
- --op-color-primary-fg: #1c1710;
24
- --op-color-primary-soft: #f8edcf;
25
- --op-color-danger: #b8324d;
26
- --op-color-danger-hover: #9c263f;
27
- --op-color-danger-fg: #fff8f0;
28
- --op-color-danger-soft: #f8dfe4;
29
- --op-color-success: #2b8a69;
30
- --op-color-success-soft: #dcf0e8;
31
- --op-color-warning: #b8791a;
32
- --op-color-warning-soft: #f8e8c6;
33
- --op-color-info: #3f6db3;
34
- --op-color-info-soft: #dde8f6;
35
- --op-color-focus: var(--op-brand-gold-deep);
36
- --op-color-disabled-fg: #b3a68a;
37
- --op-color-disabled-bg: #efe8d6;
38
- --op-color-overlay: rgb(28 23 16 / 0.55);
39
- --op-color-inverse-bg: #1c1710;
40
- --op-color-inverse-fg: #f5efe2;
41
-
42
- --op-font-family: 'Cormorant Garamond', 'Playfair Display', Didot, 'Bodoni MT', 'Hoefler Text', Georgia, serif;
43
- --op-font-size: 1rem;
44
- --op-font-size-sm: 0.8125rem;
45
- --op-font-size-lg: 1.1875rem;
46
- --op-font-size-xl: 1.5rem;
47
- --op-line-height: 1.55;
48
- --op-font-weight: 400;
49
- --op-font-weight-medium: 500;
50
- --op-font-weight-bold: 600;
51
-
52
- --op-space-1: 0.3125rem;
53
- --op-space-2: 0.625rem;
54
- --op-space-3: 1rem;
55
- --op-space-4: 1.375rem;
56
- --op-space-5: 2rem;
57
- --op-space-6: 3rem;
58
- --op-control-height: 2.875rem;
59
- --op-control-padding-x: 1.25rem;
60
- --op-row-height: 3.25rem;
61
- --op-border-width: 1px;
62
- --op-radius-sm: 0;
63
- --op-radius: 0.125rem;
64
- --op-radius-lg: 0.25rem;
65
- --op-radius-pill: 62.5rem;
66
- --op-focus-width: 1px;
67
- --op-focus-offset: 3px;
68
- --op-icon-stroke: 1.25;
69
-
70
- --op-shadow-sm: 0 1px 2px rgb(90 66 20 / 0.12);
71
- --op-shadow: 0 8px 24px rgb(90 66 20 / 0.16), 0 0 0 1px rgb(189 162 101 / 0.35);
72
- --op-shadow-lg: 0 24px 56px rgb(60 42 10 / 0.3), 0 0 0 1px rgb(189 162 101 / 0.55);
73
- --op-duration: 260ms;
74
- --op-easing: cubic-bezier(0.3, 0.7, 0.2, 1);
75
-
76
- --op-panel-border: var(--op-color-border);
77
- --op-panel-header-bg: var(--op-brand-onyx);
78
- --op-panel-header-fg: var(--op-brand-gold-light);
79
- --op-grid-header-bg: var(--op-color-surface-2);
80
- --op-grid-header-fg: var(--op-brand-gold-deep);
81
- --op-grid-border: var(--op-color-border);
82
- --op-field-label-weight: 500;
83
- --op-tabs-tab-active-border: var(--op-brand-gold);
84
- --op-tabs-tab-active-fg: var(--op-brand-onyx);
85
- --op-listbox-item-selected-fg: var(--op-brand-gold-deep);
86
- --op-grid-check-accent: var(--op-brand-gold-deep);
87
- --op-filterbuilder-chip-on-fg: var(--op-brand-gold-deep);
88
- --op-chat-bg: #efe6d2;
89
- --op-chat-bubble-me-bg: #f1e3bd;
90
- --op-chat-bubble-me-fg: var(--op-color-fg);
91
- --op-chat-bubble-them-bg: #fffdf8;
92
- --op-chat-reply-bg: rgb(184 137 58 / 0.14);
93
- }
94
-
95
- /* gilded buttons: a hairline of gold, capitals with air between the letters; primary is solid gold leaf */
96
- [data-op-theme~='brand'] .op-button {
97
- font-size: var(--op-font-size-sm);
98
- letter-spacing: 0.2em;
99
- text-transform: uppercase;
100
- --_border: var(--op-brand-gold-deep);
101
- background: transparent;
102
- }
103
- [data-op-theme~='brand'] .op-button:hover:not(:disabled) {
104
- color: var(--op-brand-gold-deep);
105
- border-color: var(--op-brand-gold);
106
- background: var(--op-color-primary-soft);
107
- }
108
- [data-op-theme~='brand'] .op-button--primary {
109
- color: var(--op-color-primary-fg);
110
- background: linear-gradient(135deg, var(--op-brand-gold-light) 0%, var(--op-brand-gold) 48%, var(--op-brand-gold-deep) 100%);
111
- border-color: var(--op-brand-gold-light);
112
- box-shadow: 0 4px 12px rgb(154 116 38 / 0.28), inset 0 1px 0 rgb(255 255 255 / 0.45);
113
- }
114
- [data-op-theme~='brand'] .op-button--primary:hover:not(:disabled) {
115
- color: var(--op-color-primary-fg);
116
- background: linear-gradient(135deg, #f6e3a6 0%, var(--op-brand-gold-light) 50%, var(--op-brand-gold) 100%);
117
- box-shadow: 0 6px 20px rgb(154 116 38 / 0.38), inset 0 1px 0 rgb(255 255 255 / 0.55);
118
- }
119
- [data-op-theme~='brand'] .op-button--ghost {
120
- border-color: transparent;
121
- letter-spacing: 0.14em;
122
- }
123
- [data-op-theme~='brand'] .op-button--danger {
124
- color: var(--op-color-danger);
125
- border-color: var(--op-color-danger);
126
- }
127
- [data-op-theme~='brand'] .op-button--danger:hover:not(:disabled) {
128
- color: var(--op-color-danger-fg);
129
- background: var(--op-color-danger);
130
- }
131
-
132
- /* titles: gold capitals with a small diamond, on a hairline */
133
- [data-op-theme~='brand'] .op-panel__header {
134
- padding-block: var(--op-space-3);
135
- font-size: var(--op-font-size-sm);
136
- letter-spacing: 0.22em;
137
- text-transform: uppercase;
138
- border-block-end: 2px solid var(--op-brand-gold);
139
- }
140
- [data-op-theme~='brand'] .op-panel__title::before {
141
- content: '◆';
142
- margin-inline-end: var(--op-space-2);
143
- color: var(--op-brand-gold);
144
- font-size: 0.6em;
145
- vertical-align: 0.15em;
146
- }
147
- [data-op-theme~='brand'] .op-field__label {
148
- color: var(--op-color-fg-muted);
149
- font-size: var(--op-font-size-sm);
150
- letter-spacing: 0.16em;
151
- text-transform: uppercase;
152
- }
153
-
154
- /* fields: clean ivory with a gold hairline; focus lights the whole edge */
155
- [data-op-theme~='brand'] .op-textfield__input {
156
- background: var(--op-color-surface);
157
- border-color: var(--op-color-border-strong);
158
- letter-spacing: 0.02em;
159
- }
160
- [data-op-theme~='brand'] .op-textfield__input:focus {
161
- outline: none;
162
- border-color: var(--op-brand-gold-deep);
163
- box-shadow: 0 0 0 1px var(--op-brand-gold-deep), 0 0 18px rgb(201 162 75 / 0.3);
164
- }
165
-
166
- /* data: capitals in the header, hairline rows, a gold bar marks the selected row */
167
- [data-op-theme~='brand'] .op-grid__header {
168
- border-block-end: 2px solid var(--op-brand-gold);
169
- font-size: var(--op-font-size-sm);
170
- letter-spacing: 0.18em;
171
- text-transform: uppercase;
172
- }
173
- [data-op-theme~='brand'] .op-grid__body-row.is-selected {
174
- box-shadow: inset 3px 0 0 var(--op-brand-gold);
175
- }
176
- [data-op-theme~='brand'] :is(.op-tabs__tab, .op-pagination button) {
177
- letter-spacing: 0.12em;
178
- text-transform: uppercase;
179
- font-size: var(--op-font-size-sm);
180
- }
181
- [data-op-theme~='brand'] .op-window,
182
- [data-op-theme~='brand'].op-window {
183
- border: 1px solid var(--op-brand-gold-deep);
184
- box-shadow: var(--op-shadow-lg), inset 0 0 0 4px var(--op-color-surface), inset 0 0 0 5px var(--op-brand-gold);
185
- }
186
- [data-op-theme~='brand'] ::selection {
187
- color: var(--op-color-primary-fg);
188
- background: var(--op-brand-gold);
189
- }
190
-
191
- /* "brand night": the same jewelry, on onyx */
192
- [data-op-theme~='brand'][data-op-theme~='night'] {
193
- color-scheme: dark;
194
- --op-color-bg: #0d0b09;
195
- --op-color-surface: #16120e;
196
- --op-color-surface-2: #1d1812;
197
- --op-color-fg: #f3ead7;
198
- --op-color-fg-muted: #a99b80;
199
- --op-color-border: #3a2f1d;
200
- --op-color-border-strong: #8a7036;
201
- --op-color-hover: #231c12;
202
- --op-color-selected: #2c2313;
203
- --op-color-primary-hover: var(--op-brand-gold-light);
204
- --op-color-primary-soft: #2a2110;
205
- --op-color-danger: #d1506b;
206
- --op-color-danger-hover: #e0708a;
207
- --op-color-danger-fg: #1a0a0f;
208
- --op-color-danger-soft: #331119;
209
- --op-color-success: #3fae88;
210
- --op-color-success-soft: #0f2a21;
211
- --op-color-warning: #e0a23a;
212
- --op-color-warning-soft: #33250c;
213
- --op-color-info: #6b95d6;
214
- --op-color-info-soft: #14213a;
215
- --op-color-focus: var(--op-brand-gold-light);
216
- --op-color-disabled-fg: #6f6552;
217
- --op-color-disabled-bg: #1a1610;
218
- --op-color-overlay: rgb(6 4 2 / 0.78);
219
- --op-color-inverse-bg: #f3ead7;
220
- --op-color-inverse-fg: #15100a;
221
- --op-panel-header-bg: transparent;
222
- --op-panel-header-fg: var(--op-brand-gold-light);
223
- --op-grid-header-bg: transparent;
224
- --op-grid-header-fg: var(--op-brand-gold);
225
- --op-tabs-tab-active-fg: var(--op-brand-gold-light);
226
- --op-listbox-item-selected-fg: var(--op-brand-gold-light);
227
- --op-chat-bg: #0d0b09;
228
- --op-chat-bubble-me-bg: #2c2313;
229
- --op-chat-bubble-them-bg: var(--op-color-surface-2);
230
- --op-chat-reply-bg: rgb(201 162 75 / 0.12);
231
- --op-shadow: 0 10px 28px rgb(0 0 0 / 0.55), 0 0 0 1px rgb(201 162 75 / 0.22);
232
- --op-shadow-lg: 0 26px 60px rgb(0 0 0 / 0.7), 0 0 0 1px rgb(201 162 75 / 0.4);
233
- }
234
- [data-op-theme~='brand'][data-op-theme~='night'] .op-panel__header {
235
- background: transparent;
236
- }
237
- [data-op-theme~='brand'][data-op-theme~='night'] .op-textfield__input {
238
- background: var(--op-color-bg);
239
- }
240
- }