optikos 0.3.0 → 0.4.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 (432) hide show
  1. package/CHANGELOG.md +39 -1
  2. package/dist/bind.js +1 -1
  3. package/dist/bind.js.map +4 -4
  4. package/dist/{chunk-5JEXM5S7.js → chunk-2GKIF7A6.js} +2 -2
  5. package/dist/chunk-2HNQ2XRY.js +2 -0
  6. package/dist/chunk-2HNQ2XRY.js.map +7 -0
  7. package/dist/chunk-2QMI2RRB.js +2 -0
  8. package/dist/chunk-2QMI2RRB.js.map +7 -0
  9. package/dist/{chunk-W3H7GTJY.js → chunk-2YRQULDC.js} +2 -2
  10. package/dist/{chunk-ZPPELYNJ.js → chunk-3BG75P7T.js} +2 -2
  11. package/dist/{chunk-GNU4VOOE.js → chunk-3F4MN2BU.js} +2 -2
  12. package/dist/chunk-3FCIZKIN.js +2 -0
  13. package/dist/chunk-3FCIZKIN.js.map +7 -0
  14. package/dist/{chunk-5DJTP53N.js → chunk-3FK52VQX.js} +2 -2
  15. package/dist/chunk-3QRA3XOA.js +2 -0
  16. package/dist/chunk-3QRA3XOA.js.map +7 -0
  17. package/dist/chunk-3TCITFUU.js +2 -0
  18. package/dist/chunk-3TCITFUU.js.map +7 -0
  19. package/dist/chunk-3VDLX7ET.js +2 -0
  20. package/dist/chunk-3VDLX7ET.js.map +7 -0
  21. package/dist/{chunk-3TAW4AKH.js → chunk-4AZ44KV4.js} +2 -2
  22. package/dist/{chunk-TZOQWCVH.js → chunk-4CWYF4O7.js} +2 -2
  23. package/dist/{chunk-REW4LR46.js → chunk-4OB2IM5L.js} +2 -2
  24. package/dist/{chunk-2YZB6XQR.js → chunk-4S3HRFQB.js} +2 -2
  25. package/dist/chunk-5BMG5ZBY.js +2 -0
  26. package/dist/{chunk-KLLAY2IM.js.map → chunk-5BMG5ZBY.js.map} +2 -2
  27. package/dist/chunk-5PWPAN62.js +2 -0
  28. package/dist/chunk-5PWPAN62.js.map +7 -0
  29. package/dist/chunk-5PYJ6FJK.js +2 -0
  30. package/dist/chunk-5PYJ6FJK.js.map +7 -0
  31. package/dist/{chunk-OGRFQTXA.js → chunk-643FOYQB.js} +2 -2
  32. package/dist/{chunk-JOFQJGZK.js → chunk-6BOM5KZR.js} +2 -2
  33. package/dist/chunk-6LJK4QWF.js +2 -0
  34. package/dist/chunk-6LJK4QWF.js.map +7 -0
  35. package/dist/{chunk-JK74QK3M.js → chunk-6PZPBPAD.js} +2 -2
  36. package/dist/chunk-7Y2GHQRB.js +2 -0
  37. package/dist/{chunk-YHEMA56R.js → chunk-AQ3RTHG5.js} +2 -2
  38. package/dist/{chunk-M242VYZA.js → chunk-AT7VFZRB.js} +2 -2
  39. package/dist/{chunk-ZVK4L5GK.js → chunk-BCVOUMJJ.js} +2 -2
  40. package/dist/{chunk-HOF4JGMQ.js → chunk-BIGL3ZVD.js} +2 -2
  41. package/dist/chunk-BJWREA76.js +2 -0
  42. package/dist/chunk-BJWREA76.js.map +7 -0
  43. package/dist/{chunk-ZWNQREWS.js → chunk-BQEFLPDA.js} +2 -2
  44. package/dist/{chunk-ZWNQREWS.js.map → chunk-BQEFLPDA.js.map} +2 -2
  45. package/dist/{chunk-FEHGU6EP.js → chunk-C3MWS7P2.js} +2 -2
  46. package/dist/{chunk-G2KUK6AT.js → chunk-CFGCB37K.js} +2 -2
  47. package/dist/{chunk-JI265XFO.js → chunk-CMV3F6HR.js} +2 -2
  48. package/dist/{chunk-TOLTUOZS.js → chunk-CWIE74NX.js} +2 -2
  49. package/dist/{chunk-4EZJ5FKJ.js → chunk-DIOJGTUN.js} +2 -2
  50. package/dist/chunk-DJUSVBD5.js +2 -0
  51. package/dist/chunk-DJUSVBD5.js.map +7 -0
  52. package/dist/{chunk-HXDTGP2K.js → chunk-DWA45BWR.js} +2 -2
  53. package/dist/chunk-DWTDNKXX.js +2 -0
  54. package/dist/chunk-DWTDNKXX.js.map +7 -0
  55. package/dist/chunk-ESCLDVFS.js +2 -0
  56. package/dist/{chunk-YBAYEU25.js.map → chunk-ESCLDVFS.js.map} +1 -1
  57. package/dist/chunk-EXIADWI7.js +2 -0
  58. package/dist/chunk-EXIADWI7.js.map +7 -0
  59. package/dist/{chunk-5QUY72FX.js → chunk-F4HZUAKM.js} +2 -2
  60. package/dist/chunk-FCJI2JF7.js +3 -0
  61. package/dist/chunk-FCJI2JF7.js.map +7 -0
  62. package/dist/{chunk-Q26YZYTD.js → chunk-FPU53CCV.js} +2 -2
  63. package/dist/{chunk-3S24ZRPK.js → chunk-GEBAYD6N.js} +2 -2
  64. package/dist/{chunk-G2DAD3MQ.js → chunk-GEJKFE4X.js} +2 -2
  65. package/dist/chunk-GFFZTFQH.js +2 -0
  66. package/dist/chunk-GFFZTFQH.js.map +7 -0
  67. package/dist/chunk-GFJRGBQR.js +2 -0
  68. package/dist/chunk-GFJRGBQR.js.map +7 -0
  69. package/dist/chunk-GZIDE5K2.js +2 -0
  70. package/dist/chunk-GZIDE5K2.js.map +7 -0
  71. package/dist/{chunk-5Q76ACVI.js → chunk-H25XXQVH.js} +2 -2
  72. package/dist/chunk-HG7OOHGD.js +2 -0
  73. package/dist/chunk-HG7OOHGD.js.map +7 -0
  74. package/dist/{chunk-2ZUZ5HDL.js → chunk-HLS5FI55.js} +2 -2
  75. package/dist/chunk-HRW25TMU.js +2 -0
  76. package/dist/chunk-HX6TWXTX.js +2 -0
  77. package/dist/chunk-HX6TWXTX.js.map +7 -0
  78. package/dist/chunk-I5A74NMJ.js +2 -0
  79. package/dist/chunk-I5A74NMJ.js.map +7 -0
  80. package/dist/chunk-IUOEPAWG.js +2 -0
  81. package/dist/chunk-IUOEPAWG.js.map +7 -0
  82. package/dist/{chunk-IHE2MQ3W.js → chunk-J5QPFJ7M.js} +2 -2
  83. package/dist/chunk-JE56CJX2.js +2 -0
  84. package/dist/chunk-JE56CJX2.js.map +7 -0
  85. package/dist/chunk-JJLOUMCJ.js +2 -0
  86. package/dist/chunk-JJLOUMCJ.js.map +7 -0
  87. package/dist/chunk-JLKIHXZP.js +3 -0
  88. package/dist/chunk-JLKIHXZP.js.map +7 -0
  89. package/dist/{chunk-5BC72727.js → chunk-JSEI44A7.js} +2 -2
  90. package/dist/chunk-L5SQQFO7.js +2 -0
  91. package/dist/chunk-L5SQQFO7.js.map +7 -0
  92. package/dist/chunk-M2ZRKHE4.js +2 -0
  93. package/dist/chunk-M2ZRKHE4.js.map +7 -0
  94. package/dist/chunk-M7FNPRV4.js +2 -0
  95. package/dist/chunk-M7FNPRV4.js.map +7 -0
  96. package/dist/chunk-MNSDGJKA.js +3 -0
  97. package/dist/chunk-MNSDGJKA.js.map +7 -0
  98. package/dist/{chunk-DBMWS3O5.js → chunk-MQ5BYGFY.js} +2 -2
  99. package/dist/chunk-N2LS4JD6.js +2 -0
  100. package/dist/chunk-N2LS4JD6.js.map +7 -0
  101. package/dist/chunk-NJ5IFOPR.js +4 -0
  102. package/dist/{chunk-XX2MVWFS.js.map → chunk-NJ5IFOPR.js.map} +1 -1
  103. package/dist/{chunk-NXSTUFS7.js → chunk-NNR2FNHG.js} +2 -2
  104. package/dist/chunk-NQV4THNE.js +2 -0
  105. package/dist/{chunk-UXXJOU5J.js.map → chunk-NQV4THNE.js.map} +1 -1
  106. package/dist/{chunk-XHOBNSBO.js → chunk-P4O57S6N.js} +2 -2
  107. package/dist/{chunk-MB3MU6HR.js → chunk-PGVLRMTQ.js} +2 -2
  108. package/dist/chunk-PMOXLQ72.js +2 -0
  109. package/dist/chunk-PMOXLQ72.js.map +7 -0
  110. package/dist/chunk-Q6FY4L2F.js +2 -0
  111. package/dist/chunk-Q6FY4L2F.js.map +7 -0
  112. package/dist/chunk-R32HPK7R.js +2 -0
  113. package/dist/chunk-R32HPK7R.js.map +7 -0
  114. package/dist/{chunk-Z2JBUHKA.js → chunk-RG6SHPHF.js} +2 -2
  115. package/dist/{chunk-EDUMAMK4.js → chunk-S2CMWKVB.js} +2 -2
  116. package/dist/chunk-S4QD5NID.js +2 -0
  117. package/dist/chunk-S4QD5NID.js.map +7 -0
  118. package/dist/chunk-SB4ICXBV.js +2 -0
  119. package/dist/chunk-SB4ICXBV.js.map +7 -0
  120. package/dist/{chunk-23XLG2EM.js → chunk-SEW5OCQF.js} +2 -2
  121. package/dist/chunk-SWCB2GMN.js +2 -0
  122. package/dist/chunk-SWCB2GMN.js.map +7 -0
  123. package/dist/chunk-TQPQ4UEA.js +2 -0
  124. package/dist/chunk-TQPQ4UEA.js.map +7 -0
  125. package/dist/{chunk-Z2Z52GFT.js → chunk-U5L76VVB.js} +2 -2
  126. package/dist/chunk-UDXO3KM3.js +2 -0
  127. package/dist/chunk-UDXO3KM3.js.map +7 -0
  128. package/dist/{chunk-LQRFNQ2N.js → chunk-UQRQH2JW.js} +2 -2
  129. package/dist/chunk-V5G5JECN.js +2 -0
  130. package/dist/chunk-V5G5JECN.js.map +7 -0
  131. package/dist/{chunk-JBLRAM7Z.js → chunk-XFIREDWO.js} +2 -2
  132. package/dist/chunk-XQHATUKN.js +2 -0
  133. package/dist/{chunk-LW2WRUVL.js.map → chunk-XQHATUKN.js.map} +4 -4
  134. package/dist/chunk-XR677UYD.js +2 -0
  135. package/dist/chunk-XR677UYD.js.map +7 -0
  136. package/dist/{chunk-RNN55473.js → chunk-YDX2PCVL.js} +2 -2
  137. package/dist/{chunk-RNN55473.js.map → chunk-YDX2PCVL.js.map} +1 -1
  138. package/dist/chunk-YJTUFK4P.js +2 -0
  139. package/dist/chunk-YLFSCQL3.js +2 -0
  140. package/dist/chunk-YLFSCQL3.js.map +7 -0
  141. package/dist/chunk-YXOKWCYS.js +2 -0
  142. package/dist/chunk-YXOKWCYS.js.map +7 -0
  143. package/dist/{chunk-I4SP6JTU.js → chunk-Z6L55FTN.js} +2 -2
  144. package/dist/{chunk-6VBK2I5B.js → chunk-ZSPJZ3ZH.js} +2 -2
  145. package/dist/components/avatar.js +2 -0
  146. package/dist/components/avatar.js.map +7 -0
  147. package/dist/components/badge.js +1 -1
  148. package/dist/components/breadcrumb.js +1 -1
  149. package/dist/components/button.js +1 -1
  150. package/dist/components/calendar.js +1 -1
  151. package/dist/components/carousel.js +2 -0
  152. package/dist/components/carousel.js.map +7 -0
  153. package/dist/components/cellediting.js +1 -1
  154. package/dist/components/chart.js +2 -0
  155. package/dist/components/chart.js.map +7 -0
  156. package/dist/components/chat.js +1 -1
  157. package/dist/components/checkbox.js +1 -1
  158. package/dist/components/checkboxgroup.js +1 -1
  159. package/dist/components/chip.js +1 -1
  160. package/dist/components/codeviewer.js +1 -1
  161. package/dist/components/combobox.js +1 -1
  162. package/dist/components/commandpalette.js +1 -1
  163. package/dist/components/container.js +1 -1
  164. package/dist/components/dataview.js +1 -1
  165. package/dist/components/datefield.js +1 -1
  166. package/dist/components/daterangefield.js +1 -1
  167. package/dist/components/datetimefield.js +2 -0
  168. package/dist/components/datetimefield.js.map +7 -0
  169. package/dist/components/dial.js +1 -1
  170. package/dist/components/dropdown.js +1 -1
  171. package/dist/components/fieldgroup.js +1 -1
  172. package/dist/components/fieldlist.js +1 -1
  173. package/dist/components/fieldset.js +1 -1
  174. package/dist/components/filterbuilder.js +1 -1
  175. package/dist/components/form.js +1 -1
  176. package/dist/components/formactions.js +1 -1
  177. package/dist/components/formerrors.js +1 -1
  178. package/dist/components/formsection.js +1 -1
  179. package/dist/components/grid.js +1 -1
  180. package/dist/components/gridexport.js +2 -0
  181. package/dist/components/gridexport.js.map +7 -0
  182. package/dist/components/gridstate.js +2 -0
  183. package/dist/components/gridstate.js.map +7 -0
  184. package/dist/components/grouping.js +2 -0
  185. package/dist/components/grouping.js.map +7 -0
  186. package/dist/components/icon.js +1 -1
  187. package/dist/components/image.js +2 -0
  188. package/dist/components/image.js.map +7 -0
  189. package/dist/components/imagecanvas.js +2 -0
  190. package/dist/components/imagecanvas.js.map +7 -0
  191. package/dist/components/imagefield.js +2 -0
  192. package/dist/components/imagefield.js.map +7 -0
  193. package/dist/components/inputgroup.js +1 -1
  194. package/dist/components/label.js +1 -1
  195. package/dist/components/listbox.js +1 -1
  196. package/dist/components/lookupfield.js +1 -1
  197. package/dist/components/maskfield.js +2 -0
  198. package/dist/components/maskfield.js.map +7 -0
  199. package/dist/components/menu.js +1 -1
  200. package/dist/components/messagebox.js +1 -1
  201. package/dist/components/navmenu.js +1 -1
  202. package/dist/components/numberfield.js +1 -1
  203. package/dist/components/pagination.js +1 -1
  204. package/dist/components/panel.js +1 -1
  205. package/dist/components/pickerfield.js +1 -1
  206. package/dist/components/radiogroup.js +1 -1
  207. package/dist/components/rowediting.js +2 -0
  208. package/dist/components/rowediting.js.map +7 -0
  209. package/dist/components/searchgrid.js +1 -1
  210. package/dist/components/secretfield.js +1 -1
  211. package/dist/components/select.js +1 -1
  212. package/dist/components/shortcuts.js +2 -0
  213. package/dist/components/shortcuts.js.map +7 -0
  214. package/dist/components/slider.js +1 -1
  215. package/dist/components/spacer.js +1 -1
  216. package/dist/components/spinner.js +1 -1
  217. package/dist/components/stat.js +2 -0
  218. package/dist/components/stat.js.map +7 -0
  219. package/dist/components/stepform.js +1 -1
  220. package/dist/components/stepper.js +1 -1
  221. package/dist/components/suggestfield.js +1 -1
  222. package/dist/components/table.js +1 -1
  223. package/dist/components/tabs.js +1 -1
  224. package/dist/components/textarea.js +1 -1
  225. package/dist/components/textfield.js +1 -1
  226. package/dist/components/timefield.js +2 -0
  227. package/dist/components/timefield.js.map +7 -0
  228. package/dist/components/timeline.js +2 -0
  229. package/dist/components/timeline.js.map +7 -0
  230. package/dist/components/toast.js +1 -1
  231. package/dist/components/toggle.js +1 -1
  232. package/dist/components/toolbar.js +1 -1
  233. package/dist/components/tree.js +1 -1
  234. package/dist/components/treegrid.js +2 -0
  235. package/dist/components/treegrid.js.map +7 -0
  236. package/dist/components/viewmanager.js +1 -1
  237. package/dist/components/viewport.js +1 -1
  238. package/dist/components/widget.js +1 -1
  239. package/dist/components/window.js +1 -1
  240. package/dist/core.js +1 -1
  241. package/dist/css/avatar.css +68 -0
  242. package/dist/css/base.css +9 -0
  243. package/dist/css/carousel.css +119 -0
  244. package/dist/css/chart.css +168 -0
  245. package/dist/css/core.css +36 -0
  246. package/dist/css/datetimefield.css +15 -0
  247. package/dist/css/grid.css +40 -0
  248. package/dist/css/gridexport.css +35 -0
  249. package/dist/css/grouping.css +49 -0
  250. package/dist/css/image.css +46 -0
  251. package/dist/css/imagecanvas.css +75 -0
  252. package/dist/css/imagefield.css +103 -0
  253. package/dist/css/rowediting.css +39 -0
  254. package/dist/css/shortcuts.css +34 -0
  255. package/dist/css/stat.css +64 -0
  256. package/dist/css/stepform.css +1 -0
  257. package/dist/css/timeline.css +140 -0
  258. package/dist/css/treegrid.css +35 -0
  259. package/dist/css/window.css +2 -2
  260. package/dist/data.js +1 -1
  261. package/dist/dev.js +2 -0
  262. package/dist/dev.js.map +7 -0
  263. package/dist/index.js +16 -5
  264. package/dist/index.js.map +4 -4
  265. package/dist/optikos.css +1111 -21
  266. package/dist/testing.js +2 -0
  267. package/dist/testing.js.map +7 -0
  268. package/dist/themes/dark.css +7 -0
  269. package/dist/types/bind/index.d.ts +1 -1
  270. package/dist/types/bind/viewmodel.d.ts +33 -0
  271. package/dist/types/components/avatar.d.ts +1 -0
  272. package/dist/types/components/base/avatar/avatar.d.ts +22 -0
  273. package/dist/types/components/base/image/image.d.ts +25 -0
  274. package/dist/types/components/base/imagecanvas/imagecanvas.d.ts +39 -0
  275. package/dist/types/components/carousel.d.ts +1 -0
  276. package/dist/types/components/chart.d.ts +1 -0
  277. package/dist/types/components/charts/chart/chart.d.ts +64 -0
  278. package/dist/types/components/charts/stat/stat.d.ts +34 -0
  279. package/dist/types/components/data/cellediting/cellediting.d.ts +3 -0
  280. package/dist/types/components/data/grid/grid.d.ts +37 -0
  281. package/dist/types/components/data/gridexport/gridexport.d.ts +29 -0
  282. package/dist/types/components/data/gridstate/gridstate.d.ts +23 -0
  283. package/dist/types/components/data/grouping/grouping.d.ts +31 -0
  284. package/dist/types/components/data/rowediting/rowediting.d.ts +13 -0
  285. package/dist/types/components/data/searchgrid/searchgrid.d.ts +9 -2
  286. package/dist/types/components/data/timeline/timeline.d.ts +60 -0
  287. package/dist/types/components/data/treegrid/treegrid.d.ts +32 -0
  288. package/dist/types/components/datetimefield.d.ts +1 -0
  289. package/dist/types/components/fields/datetimefield/datetimefield.d.ts +28 -0
  290. package/dist/types/components/fields/imagefield/imagefield.d.ts +48 -0
  291. package/dist/types/components/fields/maskfield/maskfield.d.ts +28 -0
  292. package/dist/types/components/fields/numberfield/numberfield.d.ts +9 -0
  293. package/dist/types/components/fields/pickerfield/pickerfield.d.ts +3 -0
  294. package/dist/types/components/fields/timefield/timefield.d.ts +24 -0
  295. package/dist/types/components/form/fieldlist/fieldlist.d.ts +2 -0
  296. package/dist/types/components/form/form/form.d.ts +5 -0
  297. package/dist/types/components/form/stepform/stepform.d.ts +1 -1
  298. package/dist/types/components/gridexport.d.ts +1 -0
  299. package/dist/types/components/gridstate.d.ts +1 -0
  300. package/dist/types/components/grouping.d.ts +1 -0
  301. package/dist/types/components/image.d.ts +1 -0
  302. package/dist/types/components/imagecanvas.d.ts +1 -0
  303. package/dist/types/components/imagefield.d.ts +1 -0
  304. package/dist/types/components/layout/carousel/carousel.d.ts +58 -0
  305. package/dist/types/components/maskfield.d.ts +1 -0
  306. package/dist/types/components/navigation/navmenu/navmenu.d.ts +2 -0
  307. package/dist/types/components/overlays/commandpalette/commandpalette.d.ts +2 -0
  308. package/dist/types/components/overlays/menu/menu.d.ts +4 -1
  309. package/dist/types/components/overlays/shortcuts/shortcuts.d.ts +27 -0
  310. package/dist/types/components/overlays/window/window.d.ts +14 -1
  311. package/dist/types/components/rowediting.d.ts +1 -0
  312. package/dist/types/components/shortcuts.d.ts +1 -0
  313. package/dist/types/components/stat.d.ts +1 -0
  314. package/dist/types/components/timefield.d.ts +1 -0
  315. package/dist/types/components/timeline.d.ts +1 -0
  316. package/dist/types/components/treegrid.d.ts +1 -0
  317. package/dist/types/core/component.d.ts +7 -0
  318. package/dist/types/core/container.d.ts +10 -1
  319. package/dist/types/core/dev.d.ts +2 -0
  320. package/dist/types/core/field.d.ts +4 -0
  321. package/dist/types/core/i18n.d.ts +2 -0
  322. package/dist/types/core/index.d.ts +4 -1
  323. package/dist/types/core/path.d.ts +2 -0
  324. package/dist/types/core/permission.d.ts +11 -0
  325. package/dist/types/core/state.d.ts +9 -0
  326. package/dist/types/data/column.d.ts +8 -0
  327. package/dist/types/data/index.d.ts +1 -1
  328. package/dist/types/data/model.d.ts +2 -0
  329. package/dist/types/data/store.d.ts +21 -0
  330. package/dist/types/dev/index.d.ts +2 -0
  331. package/dist/types/dev/keys.d.ts +1 -0
  332. package/dist/types/index.d.ts +17 -0
  333. package/dist/types/testing/index.d.ts +25 -0
  334. package/dist/types/themes/color.d.ts +14 -0
  335. package/dist/types/themes/contrast.d.ts +15 -0
  336. package/dist/types/themes/define.d.ts +25 -3
  337. package/dist/types/themes/index.d.ts +3 -1
  338. package/dist/types/themes/seeds.d.ts +11 -0
  339. package/dist/types/ui/ui.d.ts +6 -0
  340. package/dist/ui.js +1 -1
  341. package/package.json +9 -1
  342. package/dist/chunk-2ZRNGG2N.js +0 -2
  343. package/dist/chunk-2ZRNGG2N.js.map +0 -7
  344. package/dist/chunk-4EQEHJB3.js +0 -2
  345. package/dist/chunk-4EQEHJB3.js.map +0 -7
  346. package/dist/chunk-4LZZ244E.js +0 -2
  347. package/dist/chunk-4LZZ244E.js.map +0 -7
  348. package/dist/chunk-4SYIIX5A.js +0 -2
  349. package/dist/chunk-4SYIIX5A.js.map +0 -7
  350. package/dist/chunk-7KMIFXHZ.js +0 -2
  351. package/dist/chunk-7KMIFXHZ.js.map +0 -7
  352. package/dist/chunk-A2NKDOYN.js +0 -2
  353. package/dist/chunk-A2NKDOYN.js.map +0 -7
  354. package/dist/chunk-CKXS375P.js +0 -2
  355. package/dist/chunk-CKXS375P.js.map +0 -7
  356. package/dist/chunk-EJGWCKE4.js +0 -2
  357. package/dist/chunk-EJGWCKE4.js.map +0 -7
  358. package/dist/chunk-ELYARUCN.js +0 -2
  359. package/dist/chunk-EV73ADN2.js +0 -2
  360. package/dist/chunk-EV73ADN2.js.map +0 -7
  361. package/dist/chunk-GD5JGKM7.js +0 -2
  362. package/dist/chunk-GD5JGKM7.js.map +0 -7
  363. package/dist/chunk-GZ7X34QP.js +0 -2
  364. package/dist/chunk-KCEUD232.js +0 -2
  365. package/dist/chunk-KCEUD232.js.map +0 -7
  366. package/dist/chunk-KLLAY2IM.js +0 -2
  367. package/dist/chunk-LBJSMXLV.js +0 -2
  368. package/dist/chunk-LBJSMXLV.js.map +0 -7
  369. package/dist/chunk-LW2WRUVL.js +0 -2
  370. package/dist/chunk-MW3RWBZ7.js +0 -2
  371. package/dist/chunk-MW3RWBZ7.js.map +0 -7
  372. package/dist/chunk-OEAXCCVM.js +0 -2
  373. package/dist/chunk-OEAXCCVM.js.map +0 -7
  374. package/dist/chunk-UB5RYS7T.js +0 -2
  375. package/dist/chunk-UB5RYS7T.js.map +0 -7
  376. package/dist/chunk-UXXJOU5J.js +0 -2
  377. package/dist/chunk-VU3GIDZ3.js +0 -2
  378. package/dist/chunk-VU3GIDZ3.js.map +0 -7
  379. package/dist/chunk-W2BAFOCN.js +0 -3
  380. package/dist/chunk-W2BAFOCN.js.map +0 -7
  381. package/dist/chunk-WFGTQZIQ.js +0 -2
  382. package/dist/chunk-WFGTQZIQ.js.map +0 -7
  383. package/dist/chunk-XX2MVWFS.js +0 -4
  384. package/dist/chunk-XYZ6VZ5T.js +0 -2
  385. package/dist/chunk-YBAYEU25.js +0 -2
  386. package/dist/chunk-YF75HKL6.js +0 -2
  387. package/dist/chunk-YF75HKL6.js.map +0 -7
  388. /package/dist/{chunk-5JEXM5S7.js.map → chunk-2GKIF7A6.js.map} +0 -0
  389. /package/dist/{chunk-W3H7GTJY.js.map → chunk-2YRQULDC.js.map} +0 -0
  390. /package/dist/{chunk-ZPPELYNJ.js.map → chunk-3BG75P7T.js.map} +0 -0
  391. /package/dist/{chunk-GNU4VOOE.js.map → chunk-3F4MN2BU.js.map} +0 -0
  392. /package/dist/{chunk-5DJTP53N.js.map → chunk-3FK52VQX.js.map} +0 -0
  393. /package/dist/{chunk-3TAW4AKH.js.map → chunk-4AZ44KV4.js.map} +0 -0
  394. /package/dist/{chunk-TZOQWCVH.js.map → chunk-4CWYF4O7.js.map} +0 -0
  395. /package/dist/{chunk-REW4LR46.js.map → chunk-4OB2IM5L.js.map} +0 -0
  396. /package/dist/{chunk-2YZB6XQR.js.map → chunk-4S3HRFQB.js.map} +0 -0
  397. /package/dist/{chunk-OGRFQTXA.js.map → chunk-643FOYQB.js.map} +0 -0
  398. /package/dist/{chunk-JOFQJGZK.js.map → chunk-6BOM5KZR.js.map} +0 -0
  399. /package/dist/{chunk-JK74QK3M.js.map → chunk-6PZPBPAD.js.map} +0 -0
  400. /package/dist/{chunk-GZ7X34QP.js.map → chunk-7Y2GHQRB.js.map} +0 -0
  401. /package/dist/{chunk-YHEMA56R.js.map → chunk-AQ3RTHG5.js.map} +0 -0
  402. /package/dist/{chunk-M242VYZA.js.map → chunk-AT7VFZRB.js.map} +0 -0
  403. /package/dist/{chunk-ZVK4L5GK.js.map → chunk-BCVOUMJJ.js.map} +0 -0
  404. /package/dist/{chunk-HOF4JGMQ.js.map → chunk-BIGL3ZVD.js.map} +0 -0
  405. /package/dist/{chunk-FEHGU6EP.js.map → chunk-C3MWS7P2.js.map} +0 -0
  406. /package/dist/{chunk-G2KUK6AT.js.map → chunk-CFGCB37K.js.map} +0 -0
  407. /package/dist/{chunk-JI265XFO.js.map → chunk-CMV3F6HR.js.map} +0 -0
  408. /package/dist/{chunk-TOLTUOZS.js.map → chunk-CWIE74NX.js.map} +0 -0
  409. /package/dist/{chunk-4EZJ5FKJ.js.map → chunk-DIOJGTUN.js.map} +0 -0
  410. /package/dist/{chunk-HXDTGP2K.js.map → chunk-DWA45BWR.js.map} +0 -0
  411. /package/dist/{chunk-5QUY72FX.js.map → chunk-F4HZUAKM.js.map} +0 -0
  412. /package/dist/{chunk-Q26YZYTD.js.map → chunk-FPU53CCV.js.map} +0 -0
  413. /package/dist/{chunk-3S24ZRPK.js.map → chunk-GEBAYD6N.js.map} +0 -0
  414. /package/dist/{chunk-G2DAD3MQ.js.map → chunk-GEJKFE4X.js.map} +0 -0
  415. /package/dist/{chunk-5Q76ACVI.js.map → chunk-H25XXQVH.js.map} +0 -0
  416. /package/dist/{chunk-2ZUZ5HDL.js.map → chunk-HLS5FI55.js.map} +0 -0
  417. /package/dist/{chunk-XYZ6VZ5T.js.map → chunk-HRW25TMU.js.map} +0 -0
  418. /package/dist/{chunk-IHE2MQ3W.js.map → chunk-J5QPFJ7M.js.map} +0 -0
  419. /package/dist/{chunk-5BC72727.js.map → chunk-JSEI44A7.js.map} +0 -0
  420. /package/dist/{chunk-DBMWS3O5.js.map → chunk-MQ5BYGFY.js.map} +0 -0
  421. /package/dist/{chunk-NXSTUFS7.js.map → chunk-NNR2FNHG.js.map} +0 -0
  422. /package/dist/{chunk-XHOBNSBO.js.map → chunk-P4O57S6N.js.map} +0 -0
  423. /package/dist/{chunk-MB3MU6HR.js.map → chunk-PGVLRMTQ.js.map} +0 -0
  424. /package/dist/{chunk-Z2JBUHKA.js.map → chunk-RG6SHPHF.js.map} +0 -0
  425. /package/dist/{chunk-EDUMAMK4.js.map → chunk-S2CMWKVB.js.map} +0 -0
  426. /package/dist/{chunk-23XLG2EM.js.map → chunk-SEW5OCQF.js.map} +0 -0
  427. /package/dist/{chunk-Z2Z52GFT.js.map → chunk-U5L76VVB.js.map} +0 -0
  428. /package/dist/{chunk-LQRFNQ2N.js.map → chunk-UQRQH2JW.js.map} +0 -0
  429. /package/dist/{chunk-JBLRAM7Z.js.map → chunk-XFIREDWO.js.map} +0 -0
  430. /package/dist/{chunk-ELYARUCN.js.map → chunk-YJTUFK4P.js.map} +0 -0
  431. /package/dist/{chunk-I4SP6JTU.js.map → chunk-Z6L55FTN.js.map} +0 -0
  432. /package/dist/{chunk-6VBK2I5B.js.map → chunk-ZSPJZ3ZH.js.map} +0 -0
@@ -3,21 +3,32 @@ export * from './data/index.js';
3
3
  export * from './themes/index.js';
4
4
  export * from './motion/index.js';
5
5
  export * from './ui/index.js';
6
+ export * from './components/base/avatar/avatar.js';
6
7
  export * from './components/base/badge/badge.js';
7
8
  export * from './components/base/button/button.js';
8
9
  export * from './components/base/chip/chip.js';
9
10
  export * from './components/base/codeviewer/codeviewer.js';
10
11
  export * from './components/base/icon/icon.js';
12
+ export * from './components/base/image/image.js';
13
+ export * from './components/base/imagecanvas/imagecanvas.js';
11
14
  export * from './components/base/label/label.js';
15
+ export * from './components/charts/chart/chart.js';
16
+ export * from './components/charts/stat/stat.js';
12
17
  export * from './components/chat/chat/chat.js';
13
18
  export * from './components/data/cellediting/cellediting.js';
14
19
  export * from './components/data/dataview/dataview.js';
15
20
  export * from './components/data/filterbuilder/filterbuilder.js';
16
21
  export * from './components/data/grid/grid.js';
22
+ export * from './components/data/gridexport/gridexport.js';
23
+ export * from './components/data/gridstate/gridstate.js';
24
+ export * from './components/data/grouping/grouping.js';
17
25
  export * from './components/data/pagination/pagination.js';
26
+ export * from './components/data/rowediting/rowediting.js';
18
27
  export * from './components/data/searchgrid/searchgrid.js';
19
28
  export * from './components/data/table/table.js';
29
+ export * from './components/data/timeline/timeline.js';
20
30
  export * from './components/data/tree/tree.js';
31
+ export * from './components/data/treegrid/treegrid.js';
21
32
  export * from './components/data/viewmanager/viewmanager.js';
22
33
  export * from './components/dates/calendar/calendar.js';
23
34
  export * from './components/feedback/spinner/spinner.js';
@@ -26,9 +37,12 @@ export * from './components/fields/checkboxgroup/checkboxgroup.js';
26
37
  export * from './components/fields/combobox/combobox.js';
27
38
  export * from './components/fields/datefield/datefield.js';
28
39
  export * from './components/fields/daterangefield/daterangefield.js';
40
+ export * from './components/fields/datetimefield/datetimefield.js';
29
41
  export * from './components/fields/dial/dial.js';
42
+ export * from './components/fields/imagefield/imagefield.js';
30
43
  export * from './components/fields/listbox/listbox.js';
31
44
  export * from './components/fields/lookupfield/lookupfield.js';
45
+ export * from './components/fields/maskfield/maskfield.js';
32
46
  export * from './components/fields/numberfield/numberfield.js';
33
47
  export * from './components/fields/pickerfield/pickerfield.js';
34
48
  export * from './components/fields/radiogroup/radiogroup.js';
@@ -38,6 +52,7 @@ export * from './components/fields/slider/slider.js';
38
52
  export * from './components/fields/suggestfield/suggestfield.js';
39
53
  export * from './components/fields/textarea/textarea.js';
40
54
  export * from './components/fields/textfield/textfield.js';
55
+ export * from './components/fields/timefield/timefield.js';
41
56
  export * from './components/fields/toggle/toggle.js';
42
57
  export * from './components/form/fieldgroup/fieldgroup.js';
43
58
  export * from './components/form/fieldlist/fieldlist.js';
@@ -47,6 +62,7 @@ export * from './components/form/formerrors/formerrors.js';
47
62
  export * from './components/form/formsection/formsection.js';
48
63
  export * from './components/form/inputgroup/inputgroup.js';
49
64
  export * from './components/form/stepform/stepform.js';
65
+ export * from './components/layout/carousel/carousel.js';
50
66
  export * from './components/layout/container/container.js';
51
67
  export * from './components/layout/fieldset/fieldset.js';
52
68
  export * from './components/layout/panel/panel.js';
@@ -61,6 +77,7 @@ export * from './components/overlays/commandpalette/commandpalette.js';
61
77
  export * from './components/overlays/dropdown/dropdown.js';
62
78
  export * from './components/overlays/menu/menu.js';
63
79
  export * from './components/overlays/messagebox/messagebox.js';
80
+ export * from './components/overlays/shortcuts/shortcuts.js';
64
81
  export * from './components/overlays/toast/toast.js';
65
82
  export * from './components/overlays/tooltip/tooltip.js';
66
83
  export * from './components/overlays/widget/widget.js';
@@ -0,0 +1,25 @@
1
+ import type { Form } from '../components/form/form/form.js';
2
+ import type { Grid } from '../components/data/grid/grid.js';
3
+ import type { Field } from '../core/field.js';
4
+ import type { Component } from '../core/component.js';
5
+ import type { Store } from '../data/store.js';
6
+ import type { Model } from '../data/model.js';
7
+ import type { LookupField } from '../components/fields/lookupfield/lookupfield.js';
8
+ /** Lets pending promises, microtasks and 0 ms timers run (after `fill`, `store.load()`, a debounce of `ms`...). */
9
+ export declare const flush: (ms?: number) => Promise<void>;
10
+ /** Types into a field the way a user does: sets the input and fires `input`, so parsing, masks and validation run. Falls back to `setValue`. */
11
+ export declare function type(field: Field<any> | HTMLInputElement, text: string): void;
12
+ /** Fills a form from an object (`{ 'address.city': 'Rio', name: 'Ada' }` or nested). Text fields are typed into; the rest get `setValue`. */
13
+ export declare function fill(form: Form, values: Record<string, any>): Form;
14
+ /** Fills and submits. Resolves with the values when the form was valid and submitted, or `null`. */
15
+ export declare function submit(form: Form, values?: Record<string, any>): Promise<Record<string, any> | null>;
16
+ /** What the form shows as errors: `{ fieldName: message }`. */
17
+ export declare function errors(form: Form): Record<string, string>;
18
+ /** Selects a grid row by index, or by the first record the predicate accepts; returns its record. */
19
+ export declare function clickRow<T extends Record<string, any>>(grid: Grid<T>, which: number | ((rec: Model<T>) => boolean)): Model<T>;
20
+ /** Waits until the store is not loading (and, if it has not started yet, until its first `load`). */
21
+ export declare function loaded<T extends Record<string, any>>(store: Store<T>): Promise<Store<T>>;
22
+ /** Opens a lookup's search window, selects the record at `row` and confirms. Resolves with what the field then holds. */
23
+ export declare function pickLookup(field: LookupField<any>, row?: number): Promise<unknown>;
24
+ /** The text a component shows, collapsed to single spaces. */
25
+ export declare const text: (c: Component | HTMLElement) => string;
@@ -0,0 +1,14 @@
1
+ export type RGB = [number, number, number];
2
+ export declare function parse(css: string): RGB | undefined;
3
+ export declare const toHex: (c: RGB) => string;
4
+ /** `t` of `b` over `a` (0 = a, 1 = b), in sRGB. */
5
+ export declare const mix: (a: RGB, b: RGB, t: number) => RGB;
6
+ export declare const luminance: (c: RGB) => number;
7
+ /** WCAG contrast ratio, 1 to 21. */
8
+ export declare function contrast(a: RGB, b: RGB): number;
9
+ export declare const WHITE: RGB;
10
+ export declare const BLACK: RGB;
11
+ /** Moves `c` toward black or white (whichever reaches it) until it has `min` contrast against `bg`. */
12
+ export declare function ensure(c: RGB, bg: RGB, min: number): RGB;
13
+ /** Black or white, whichever reads better on `bg`. */
14
+ export declare const readableOn: (bg: RGB) => RGB;
@@ -0,0 +1,15 @@
1
+ import { type RGB } from './color.js';
2
+ export interface ContrastIssue {
3
+ /** The pair, as the tokens that make it (`--op-color-fg on --op-color-surface`). */
4
+ pair: string;
5
+ ratio: number;
6
+ min: number;
7
+ }
8
+ /**
9
+ * Checks the theme in effect on `el` (default `<html>`) for text pairs under 4.5:1 and returns them.
10
+ * A pair whose token is not set is skipped. `warn` (default: in dev) also prints each to the console.
11
+ */
12
+ export declare function checkContrast(el?: HTMLElement, o?: {
13
+ warn?: boolean;
14
+ resolve?: (token: string) => RGB | undefined;
15
+ }): ContrastIssue[];
@@ -1,21 +1,41 @@
1
+ import { type Seeds } from './seeds.js';
1
2
  type Values = Record<string, string | number | undefined>;
2
3
  type ColorToken = 'bg' | 'surface' | 'surface-2' | 'fg' | 'fg-muted' | 'border' | 'border-strong' | 'hover' | 'selected' | 'primary' | 'primary-hover' | 'primary-fg' | 'primary-soft' | 'danger' | 'danger-hover' | 'danger-fg' | 'danger-soft' | 'success' | 'success-soft' | 'warning' | 'warning-soft' | 'info' | 'info-soft' | 'focus' | 'overlay';
4
+ export interface FontSpec {
5
+ family: string;
6
+ /** URL of the file (woff2 is enough for every current browser). */
7
+ url: string;
8
+ /** A weight or a range (`'400 700'` for a variable font). Default `400`. */
9
+ weight?: string | number;
10
+ style?: 'normal' | 'italic';
11
+ /** Default `swap`. */
12
+ display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';
13
+ }
3
14
  export interface ThemeDefinition {
15
+ /**
16
+ * A few brand colors in, a whole theme out: light under `name`, and dark under `name` + `dark` (`data-op-theme="name dark"`).
17
+ * Text pairs are kept at 4.5:1; navmenu and grid header colors come with it. Tokens you also give win.
18
+ */
19
+ seeds?: Seeds;
20
+ /** `@font-face` rules, so the font ships with the theme (a white-label tenant brings its own). Set the family with `font: { family }`. */
21
+ fonts?: FontSpec[];
4
22
  /** Semantic colors: `{ primary: '#06f' }` → `--op-color-primary`. camelCase keys are kebab-cased. */
5
23
  color?: Partial<Record<ColorToken | string, string>>;
6
24
  font?: Values;
7
25
  space?: Values;
8
- /** `radius: '0.5rem'` sets `--op-radius`; `radius: { sm, lg, pill }` sets `--op-radius-sm`... */
26
+ /** `radius: '0.5rem'` sets `--op-radius`; `radius: { sm, lg, pill }` sets `--op-radius-sm`...; `radius: { base: '0.5rem', sm: '0.25rem' }` sets both. */
9
27
  radius?: Values | string | number;
10
28
  shadow?: Values;
11
29
  control?: Values;
12
- /** Any other key is a component scope: `{ button: { radius: 0 } }` → `--op-button-radius`. A plain value sets the group's own token (`{ radius: 0 }` → `--op-radius`). */
13
- [group: string]: Values | string | number | undefined;
30
+ /** Any other key is a component scope: `{ button: { radius: 0 } }` → `--op-button-radius`. A plain value, or the key `base`, sets the group's own token (`{ radius: 0 }` or `{ radius: { base: 0, sm: 2 } }` → `--op-radius`). */
31
+ [group: string]: Values | string | number | Seeds | FontSpec[] | undefined;
14
32
  }
15
33
  export interface Theme {
16
34
  name: string;
17
35
  /** CSS text, scoped to `[data-op-theme~="name"]`, inside `@layer optikos`. */
18
36
  css: string;
37
+ /** The fonts the theme declared, for `loadFonts`. */
38
+ fonts: FontSpec[];
19
39
  /** Injects the CSS once without activating it (e.g. to offer it in a theme picker). */
20
40
  inject(): void;
21
41
  /** Injects the CSS and activates the theme on `el` (default: `<html>`), keeping other themes (`"dark custom"`). */
@@ -28,4 +48,6 @@ export interface Theme {
28
48
  export declare function defineTheme(def: ThemeDefinition, name?: string): Theme;
29
49
  /** Activates themes on an element (default `<html>`): `setTheme('dark compact')` or `setTheme(['dark', 'custom'])`. */
30
50
  export declare function setTheme(names: string | string[], el?: HTMLElement): void;
51
+ /** Loads the fonts of a theme now (and resolves when they are ready), so the first paint does not flash the fallback. */
52
+ export declare function loadFonts(fonts: FontSpec[]): Promise<void>;
31
53
  export {};
@@ -1 +1,3 @@
1
- export { defineTheme, setTheme, type Theme, type ThemeDefinition } from './define.js';
1
+ export { defineTheme, setTheme, loadFonts, type Theme, type ThemeDefinition, type FontSpec } from './define.js';
2
+ export { checkContrast, type ContrastIssue } from './contrast.js';
3
+ export type { Seeds } from './seeds.js';
@@ -0,0 +1,11 @@
1
+ export interface Seeds {
2
+ /** The brand color. Used as is for fills; text uses a shade of it that keeps 4.5:1. */
3
+ primary: string;
4
+ /** Tints the grays (backgrounds, borders, text). Default: a cool gray. */
5
+ neutral?: string;
6
+ }
7
+ /** Light and dark token sets from a few seeds, with the text pairs kept at 4.5:1 or better. */
8
+ export declare function fromSeeds(seeds: Seeds): {
9
+ light: Record<string, string>;
10
+ dark: Record<string, string>;
11
+ };
@@ -1,6 +1,9 @@
1
1
  import { TextField } from '../components/fields/textfield/textfield.js';
2
2
  import { TextArea } from '../components/fields/textarea/textarea.js';
3
3
  import { NumberField } from '../components/fields/numberfield/numberfield.js';
4
+ import { MaskField } from '../components/fields/maskfield/maskfield.js';
5
+ import { TimeField } from '../components/fields/timefield/timefield.js';
6
+ import { DateTimeField } from '../components/fields/datetimefield/datetimefield.js';
4
7
  import { DateField } from '../components/fields/datefield/datefield.js';
5
8
  import { DateRangeField } from '../components/fields/daterangefield/daterangefield.js';
6
9
  import { Checkbox } from '../components/fields/checkbox/checkbox.js';
@@ -34,7 +37,10 @@ export declare const ui: {
34
37
  password: (name: string, label?: string, c?: Cfg) => TextField<string, any>;
35
38
  area: (name: string, label?: string, c?: Cfg) => TextArea;
36
39
  number: (name: string, label?: string, c?: Cfg) => NumberField;
40
+ mask: (name: string, label: string | undefined, mask: string | string[], c?: Cfg) => MaskField;
41
+ time: (name: string, label?: string, c?: Cfg) => TimeField;
37
42
  date: (name: string, label?: string, c?: Cfg) => DateField;
43
+ datetime: (name: string, label?: string, c?: Cfg) => DateTimeField;
38
44
  dateRange: (name: string, label?: string, c?: Cfg) => DateRangeField;
39
45
  secret: (name: string, label?: string, c?: Cfg) => SecretField;
40
46
  slider: (name: string, label?: string, c?: Cfg) => Slider;
package/dist/ui.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a,b,c,d,e,f,g,h,i,j,k}from"./chunk-4EQEHJB3.js";import"./chunk-HXDTGP2K.js";import"./chunk-VU3GIDZ3.js";import"./chunk-6VBK2I5B.js";import"./chunk-NXSTUFS7.js";import"./chunk-G2KUK6AT.js";import"./chunk-Z2Z52GFT.js";import"./chunk-XHOBNSBO.js";import"./chunk-I4SP6JTU.js";import"./chunk-OGRFQTXA.js";import"./chunk-JI265XFO.js";import"./chunk-EDUMAMK4.js";import"./chunk-JK74QK3M.js";import"./chunk-UB5RYS7T.js";import"./chunk-TZOQWCVH.js";import"./chunk-EV73ADN2.js";import"./chunk-5Q76ACVI.js";import"./chunk-EJGWCKE4.js";import"./chunk-YF75HKL6.js";import"./chunk-KLLAY2IM.js";import"./chunk-4LZZ244E.js";import"./chunk-LQRFNQ2N.js";import"./chunk-XYZ6VZ5T.js";import"./chunk-GNU4VOOE.js";import"./chunk-23XLG2EM.js";import"./chunk-YHEMA56R.js";import"./chunk-ZVK4L5GK.js";import"./chunk-7KMIFXHZ.js";import"./chunk-3TAW4AKH.js";import"./chunk-W2BAFOCN.js";import"./chunk-Z2JBUHKA.js";import"./chunk-W3H7GTJY.js";import"./chunk-G2DAD3MQ.js";import"./chunk-OWEQT2HN.js";import"./chunk-ZWNQREWS.js";import"./chunk-E4VNLYO2.js";import"./chunk-676AKAGF.js";import"./chunk-VV7CFMPZ.js";import"./chunk-2ZRNGG2N.js";import"./chunk-5JEXM5S7.js";import"./chunk-LW2WRUVL.js";import"./chunk-OEAXCCVM.js";import"./chunk-6NCXO5ZP.js";import"./chunk-2ZUZ5HDL.js";import"./chunk-4AA4FQEM.js";import"./chunk-2UPUC4RK.js";import"./chunk-4EZJ5FKJ.js";import"./chunk-A2NKDOYN.js";import"./chunk-PZSHOSOS.js";import"./chunk-TIPK3SCJ.js";import"./chunk-MW3RWBZ7.js";import"./chunk-4C666HHU.js";export{d as Direction,c as LabelPos,g as LayoutKind,j as Op,e as Region,h as Selection,f as Side,k as ThemeName,i as ToastType,b as Variant,a as ui};
1
+ import{a,b,c,d,e,f,g,h,i,j,k}from"./chunk-YXOKWCYS.js";import"./chunk-DWA45BWR.js";import"./chunk-3FCIZKIN.js";import"./chunk-ZSPJZ3ZH.js";import"./chunk-NNR2FNHG.js";import"./chunk-CFGCB37K.js";import"./chunk-U5L76VVB.js";import"./chunk-P4O57S6N.js";import"./chunk-S2CMWKVB.js";import"./chunk-TQPQ4UEA.js";import"./chunk-M7FNPRV4.js";import"./chunk-6PZPBPAD.js";import"./chunk-JJLOUMCJ.js";import"./chunk-4CWYF4O7.js";import"./chunk-5PWPAN62.js";import"./chunk-5BMG5ZBY.js";import"./chunk-JE56CJX2.js";import"./chunk-UQRQH2JW.js";import"./chunk-HRW25TMU.js";import"./chunk-3F4MN2BU.js";import"./chunk-SEW5OCQF.js";import"./chunk-Z6L55FTN.js";import"./chunk-643FOYQB.js";import"./chunk-CMV3F6HR.js";import"./chunk-N2LS4JD6.js";import"./chunk-H25XXQVH.js";import"./chunk-IUOEPAWG.js";import"./chunk-AQ3RTHG5.js";import"./chunk-R32HPK7R.js";import"./chunk-4AZ44KV4.js";import"./chunk-GEJKFE4X.js";import"./chunk-GFFZTFQH.js";import"./chunk-BCVOUMJJ.js";import"./chunk-MNSDGJKA.js";import"./chunk-RG6SHPHF.js";import"./chunk-2YRQULDC.js";import"./chunk-HLS5FI55.js";import"./chunk-DIOJGTUN.js";import"./chunk-BQEFLPDA.js";import"./chunk-2GKIF7A6.js";import"./chunk-OWEQT2HN.js";import"./chunk-E4VNLYO2.js";import"./chunk-676AKAGF.js";import"./chunk-XR677UYD.js";import"./chunk-VV7CFMPZ.js";import"./chunk-TIPK3SCJ.js";import"./chunk-2HNQ2XRY.js";import"./chunk-XQHATUKN.js";import"./chunk-L5SQQFO7.js";import"./chunk-6NCXO5ZP.js";import"./chunk-4AA4FQEM.js";import"./chunk-2UPUC4RK.js";import"./chunk-V5G5JECN.js";import"./chunk-UDXO3KM3.js";import"./chunk-PZSHOSOS.js";import"./chunk-3VDLX7ET.js";import"./chunk-S4QD5NID.js";import"./chunk-4C666HHU.js";export{d as Direction,c as LabelPos,g as LayoutKind,j as Op,e as Region,h as Selection,f as Side,k as ThemeName,i as ToastType,b as Variant,a as ui};
2
2
  //# sourceMappingURL=ui.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "optikos",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Declarative UI components in plain TypeScript: forms, grids, windows and themes. No runtime dependencies.",
5
5
  "keywords": [
6
6
  "ui",
@@ -51,6 +51,14 @@
51
51
  "types": "./dist/types/ui/index.d.ts",
52
52
  "import": "./dist/ui.js"
53
53
  },
54
+ "./testing": {
55
+ "types": "./dist/types/testing/index.d.ts",
56
+ "import": "./dist/testing.js"
57
+ },
58
+ "./dev": {
59
+ "types": "./dist/types/dev/index.d.ts",
60
+ "import": "./dist/dev.js"
61
+ },
54
62
  "./bind": {
55
63
  "types": "./dist/types/bind/index.d.ts",
56
64
  "import": "./dist/bind.js"
@@ -1,2 +0,0 @@
1
- import{a as o}from"./chunk-A2NKDOYN.js";import{b as r,c as s}from"./chunk-PZSHOSOS.js";import{f as l}from"./chunk-MW3RWBZ7.js";var n=class extends o{baseCls="op-field";value;original;error="";inputEl;labelEl;helpEl;errorEl;dirty=!1;cancelSettle;constructor(e={}){super(e),this.value=this.original=e.value??this.emptyValue()}get name(){return this.config.name}emptyValue(){return""}isEmpty(e){return e==null||e===""||Array.isArray(e)&&!e.length}isEqual(e,t){return e===t||JSON.stringify(e)===JSON.stringify(t)}build(){let e=this.config,t=r("div",`${this.baseCls}${e.labelPos==="left"?" op-field--label-left":""}`);this.labelEl=r("label","op-field__label");let i=r("div","op-field__control",{},this.createControl());return this.helpEl=r("div","op-field__help",{id:`${this.id}-help`}),this.errorEl=r("div","op-field__error",{id:`${this.id}-error`,role:"alert"}),t.append(this.labelEl,i,this.helpEl,this.errorEl),t}onRender(){let e=this.config,t=this.inputEl;t.id||=s("op-input"),this.labelEl.htmlFor=t.id,e.ariaLabel&&t!==this.el&&(t.setAttribute("aria-label",e.ariaLabel),this.el.removeAttribute("aria-label")),this.setLabel(e.label??""),this.setHelp(e.help??""),this.setRequired(!!e.required),this.setReadonly(!!e.readonly),this.applyValue(this.value),this.paintError(),this.listen(this.el,"focusin",()=>{this.el.classList.add("is-focused"),this.emit("focus")}),this.listen(this.el,"focusout",i=>{this.el.contains(i.relatedTarget)||(this.flushSettled(),this.el.classList.remove("is-focused"),(e.validateOn??"blur")==="blur"&&this.validate(),this.emit("blur"))})}focusEl(){return this.render(),this.inputEl}getValue(){return this.value}setValue(e,t=!1){let i=this.value;this.value=e,this.rendered&&this.applyValue(e),this.isEqual(i,e)||this.changed(i,t)}commit(e){let t=this.value;this.value=e,this.isEqual(t,e)||this.changed(t,!1)}changed(e,t){this.updateDirty(),!t&&((this.config.validateOn==="change"||this.error)&&this.validate(),this.emit("change",this.value,e),this.queueSettled())}queueSettled(){this.cancelSettle?.(),this.cancelSettle=void 0;let e=this.config.debounce;if(!e)return void this.emit("settled",this.value);this.cancelSettle=this.later(()=>{this.cancelSettle=void 0,this.emit("settled",this.value)},e)}flushSettled(){this.cancelSettle&&(this.cancelSettle(),this.cancelSettle=void 0,this.emit("settled",this.value))}updateDirty(){let e=this.isDirty();e!==this.dirty&&(this.dirty=e,this.rendered&&this.el.classList.toggle("is-dirty",e),this.emit("dirty-change",e))}getDisplayText(){let e=this.value;return this.isEmpty(e)?"":String(e)}clear(){this.setValue(this.emptyValue())}isDirty(){return!this.isEqual(this.value,this.original)}markClean(){this.original=this.value,this.updateDirty()}reset(){this.setValue(this.original,!0),this.clearError()}check(){let e=this.value;if(this.isEmpty(e))return this.config.required?l("required"):"";for(let t of this.config.validators??[]){let i=t(e,this);if(typeof i=="string")return i}return""}validate(){let e=this.check();return e?this.setError(e):this.clearError(),!e}isValid(){return!this.check()}getError(){return this.error}setError(e){let t=this.error;this.error=e,this.paintError(),e&&e!==t&&this.emit("invalid",e)}clearError(){this.error&&(this.error="",this.paintError(),this.emit("valid"))}paintError(){this.rendered&&(this.errorEl.textContent=this.error,this.el.classList.toggle("is-invalid",!!this.error),this.inputEl.setAttribute("aria-invalid",String(!!this.error)),this.describe())}describe(){let e=[this.error&&this.errorEl.id,this.config.help&&this.helpEl.id].filter(Boolean);e.length?this.inputEl.setAttribute("aria-describedby",e.join(" ")):this.inputEl.removeAttribute("aria-describedby")}setLabel(e){this.config.label=e,this.rendered&&(this.labelEl.textContent=e,this.labelEl.hidden=!e)}setHelp(e){this.config.help=e,this.rendered&&(this.helpEl.textContent=e,this.helpEl.hidden=!e,this.describe())}setRequired(e){this.config.required=e,this.rendered&&(this.el.classList.toggle("is-required",e),this.inputEl.setAttribute("aria-required",String(e)))}setReadonly(e){this.config.readonly=e,this.rendered&&(this.el.classList.toggle("is-readonly",e),this.onReadonly(e))}setValidators(e){this.config.validators=e}onReadonly(e){}};export{n as a};
2
- //# sourceMappingURL=chunk-2ZRNGG2N.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/core/field.ts"],
4
- "sourcesContent": ["import { Component, type ComponentConfig } from './component';\nimport { h, uid } from './dom';\nimport { t } from './i18n';\nimport type { Validator } from './validators';\n\nexport interface FieldConfig<V = unknown> extends ComponentConfig {\n name?: string;\n label?: string;\n labelPos?: 'top' | 'left';\n value?: V;\n required?: boolean;\n readonly?: boolean;\n help?: string;\n validators?: Validator<V>[];\n /** When to validate on its own. After the first error it revalidates on every change. Default `blur`. */\n validateOn?: 'blur' | 'change' | 'submit';\n /** ms of quiet after the last change before `settled` fires (0 = right away). `change` itself is never delayed. */\n debounce?: number;\n}\n\n/**\n * Base of every field: value, validation, dirty tracking, label and messages.\n * Subclasses implement `createControl` (build the control, assign `inputEl`), `applyValue` (value \u2192 DOM)\n * and call `commit` when the user edits (DOM \u2192 value).\n */\nexport abstract class Field<V = unknown, C extends FieldConfig<V> = FieldConfig<V>> extends Component<C> {\n protected override baseCls = 'op-field';\n protected value: V;\n protected original: V;\n protected error = '';\n /** The focusable control; `label for`, `aria-invalid` and `aria-describedby` point at it. */\n protected inputEl!: HTMLElement;\n private labelEl!: HTMLElement;\n private helpEl!: HTMLElement;\n private errorEl!: HTMLElement;\n private dirty = false;\n private cancelSettle?: () => void;\n\n constructor(config: C = {} as C) {\n super(config);\n this.value = this.original = config.value ?? this.emptyValue();\n }\n\n get name(): string | undefined {\n return this.config.name;\n }\n\n protected abstract createControl(): HTMLElement;\n protected abstract applyValue(value: V): void;\n protected emptyValue(): V {\n return '' as V;\n }\n protected isEmpty(v: V): boolean {\n return v == null || (v as unknown) === '' || (Array.isArray(v) && !v.length);\n }\n protected isEqual(a: V, b: V): boolean {\n return a === b || JSON.stringify(a) === JSON.stringify(b);\n }\n\n protected override build(): HTMLElement {\n const c = this.config;\n const el = h('div', `${this.baseCls}${c.labelPos === 'left' ? ' op-field--label-left' : ''}`);\n this.labelEl = h('label', 'op-field__label');\n const control = h('div', 'op-field__control', {}, this.createControl());\n this.helpEl = h('div', 'op-field__help', { id: `${this.id}-help` });\n this.errorEl = h('div', 'op-field__error', { id: `${this.id}-error`, role: 'alert' });\n el.append(this.labelEl, control, this.helpEl, this.errorEl);\n return el;\n }\n\n protected override onRender(): void {\n const c = this.config;\n const input = this.inputEl;\n input.id ||= uid('op-input');\n (this.labelEl as HTMLLabelElement).htmlFor = input.id;\n // a field without a visible label is named by `ariaLabel` on its control (the root is just a wrapper)\n if (c.ariaLabel && input !== this.el) {\n input.setAttribute('aria-label', c.ariaLabel);\n this.el.removeAttribute('aria-label');\n }\n this.setLabel(c.label ?? '');\n this.setHelp(c.help ?? '');\n this.setRequired(!!c.required);\n this.setReadonly(!!c.readonly);\n this.applyValue(this.value);\n this.paintError();\n this.listen(this.el, 'focusin', () => {\n this.el.classList.add('is-focused');\n this.emit('focus');\n });\n this.listen(this.el, 'focusout', (e: FocusEvent) => {\n if (this.el.contains(e.relatedTarget as Node)) return;\n this.flushSettled();\n this.el.classList.remove('is-focused');\n if ((c.validateOn ?? 'blur') === 'blur') this.validate();\n this.emit('blur');\n });\n }\n\n protected override focusEl(): HTMLElement {\n this.render();\n return this.inputEl;\n }\n\n // ---- value ---------------------------------------------------------------------------------\n\n getValue(): V {\n return this.value;\n }\n\n /** Sets the value programmatically. `silent` skips the `change` event and validation. */\n setValue(v: V, silent = false): void {\n const old = this.value;\n this.value = v;\n if (this.rendered) this.applyValue(v);\n if (!this.isEqual(old, v)) this.changed(old, silent);\n }\n\n /** For subclasses: the user edited the control and the DOM already shows `v`. */\n protected commit(v: V): void {\n const old = this.value;\n this.value = v;\n if (!this.isEqual(old, v)) this.changed(old, false);\n }\n\n private changed(old: V, silent: boolean): void {\n this.updateDirty();\n if (silent) return;\n if (this.config.validateOn === 'change' || this.error) this.validate();\n this.emit('change', this.value, old);\n this.queueSettled();\n }\n\n /** `settled(value)`: the value after the user stopped changing it for `debounce` ms (immediately without `debounce`). */\n private queueSettled(): void {\n this.cancelSettle?.();\n this.cancelSettle = undefined;\n const ms = this.config.debounce;\n if (!ms) return void this.emit('settled', this.value);\n this.cancelSettle = this.later(() => {\n this.cancelSettle = undefined;\n this.emit('settled', this.value);\n }, ms);\n }\n\n /** Fires a pending `settled` now (Enter, blur, end of a drag...). No-op when nothing is waiting. */\n protected flushSettled(): void {\n if (!this.cancelSettle) return;\n this.cancelSettle();\n this.cancelSettle = undefined;\n this.emit('settled', this.value);\n }\n\n private updateDirty(): void {\n const d = this.isDirty();\n if (d === this.dirty) return;\n this.dirty = d;\n if (this.rendered) this.el.classList.toggle('is-dirty', d);\n this.emit('dirty-change', d);\n }\n\n /** What the user sees as this field's value (a select's label, a formatted date); used by summaries such as the StepForm review. */\n getDisplayText(): string {\n const v = this.value;\n return this.isEmpty(v) ? '' : String(v);\n }\n\n /** Sets the empty value (`''`, `null`, `false`...) and emits `change`. */\n clear(): void {\n this.setValue(this.emptyValue());\n }\n\n isDirty(): boolean {\n return !this.isEqual(this.value, this.original);\n }\n\n /** The current value becomes the \"original\" (as after loading or saving). */\n markClean(): void {\n this.original = this.value;\n this.updateDirty();\n }\n\n reset(): void {\n this.setValue(this.original, true);\n this.clearError();\n }\n\n // ---- validation ----------------------------------------------------------------------------\n\n /** Returns the error message for the current value, or `''`. No UI side effects. */\n protected check(): string {\n const v = this.value;\n if (this.isEmpty(v)) return this.config.required ? t('required') : '';\n for (const fn of this.config.validators ?? []) {\n const r = fn(v, this as Field<any>);\n if (typeof r === 'string') return r;\n }\n return '';\n }\n\n validate(): boolean {\n const msg = this.check();\n if (msg) this.setError(msg);\n else this.clearError();\n return !msg;\n }\n\n isValid(): boolean {\n return !this.check();\n }\n\n getError(): string {\n return this.error;\n }\n\n setError(msg: string): void {\n const was = this.error;\n this.error = msg;\n this.paintError();\n if (msg && msg !== was) this.emit('invalid', msg);\n }\n\n clearError(): void {\n if (!this.error) return;\n this.error = '';\n this.paintError();\n this.emit('valid');\n }\n\n private paintError(): void {\n if (!this.rendered) return;\n this.errorEl.textContent = this.error;\n this.el.classList.toggle('is-invalid', !!this.error);\n this.inputEl.setAttribute('aria-invalid', String(!!this.error));\n this.describe();\n }\n\n private describe(): void {\n const ids = [this.error && this.errorEl.id, this.config.help && this.helpEl.id].filter(Boolean);\n if (ids.length) this.inputEl.setAttribute('aria-describedby', ids.join(' '));\n else this.inputEl.removeAttribute('aria-describedby');\n }\n\n // ---- setters -------------------------------------------------------------------------------\n\n setLabel(label: string): void {\n this.config.label = label;\n if (!this.rendered) return;\n this.labelEl.textContent = label;\n this.labelEl.hidden = !label;\n }\n\n setHelp(help: string): void {\n this.config.help = help;\n if (!this.rendered) return;\n this.helpEl.textContent = help;\n this.helpEl.hidden = !help;\n this.describe();\n }\n\n setRequired(required: boolean): void {\n this.config.required = required;\n if (!this.rendered) return;\n this.el.classList.toggle('is-required', required);\n this.inputEl.setAttribute('aria-required', String(required));\n }\n\n setReadonly(readonly: boolean): void {\n this.config.readonly = readonly;\n if (!this.rendered) return;\n this.el.classList.toggle('is-readonly', readonly);\n this.onReadonly(readonly);\n }\n\n setValidators(validators: Validator<V>[]): void {\n this.config.validators = validators;\n }\n\n protected onReadonly(_readonly: boolean): void {}\n}\n"],
5
- "mappings": "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",
6
- "names": ["Field", "Component", "config", "v", "a", "b", "c", "el", "h", "control", "input", "uid", "e", "silent", "old", "ms", "d", "t", "fn", "r", "msg", "was", "ids", "label", "help", "required", "readonly", "validators", "_readonly"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as c}from"./chunk-HXDTGP2K.js";import{a as R}from"./chunk-VU3GIDZ3.js";import{a as u}from"./chunk-6VBK2I5B.js";import{a as k}from"./chunk-NXSTUFS7.js";import{a as C}from"./chunk-G2KUK6AT.js";import{a as S}from"./chunk-Z2Z52GFT.js";import{a}from"./chunk-XHOBNSBO.js";import{a as l}from"./chunk-I4SP6JTU.js";import{a as d}from"./chunk-OGRFQTXA.js";import{a as x}from"./chunk-JI265XFO.js";import{a as y}from"./chunk-EDUMAMK4.js";import{a as L}from"./chunk-JK74QK3M.js";import{a as w}from"./chunk-UB5RYS7T.js";import{a as b}from"./chunk-TZOQWCVH.js";import{a as h}from"./chunk-LQRFNQ2N.js";import{a as T}from"./chunk-GNU4VOOE.js";import{a as f}from"./chunk-7KMIFXHZ.js";import{a as m}from"./chunk-3TAW4AKH.js";import{a as p}from"./chunk-W3H7GTJY.js";import{c as s}from"./chunk-ZWNQREWS.js";import{a as g}from"./chunk-2ZUZ5HDL.js";var n=(t,e,o,r={})=>new t({name:e,label:o,...r}),v={text:(t,e,o)=>n(p,t,e,o),email:(t,e,o)=>n(p,t,e,{inputType:"email",...o}),password:(t,e,o)=>n(p,t,e,{inputType:"password",...o}),area:(t,e,o)=>n(a,t,e,o),number:(t,e,o)=>n(f,t,e,o),date:(t,e,o)=>n(m,t,e,o),dateRange:(t,e,o)=>n(y,t,e,o),secret:(t,e,o)=>n(k,t,e,o),slider:(t,e,o)=>n(S,t,e,o),dial:(t,e,o)=>n(L,t,e,o),check:(t,e,o)=>n(l,t,void 0,{boxLabel:e,...o}),toggle:(t,e,o)=>n(c,t,void 0,{boxLabel:e,...o}),radio:(t,e,o,r)=>n(u,t,e,{options:o,...r}),checkGroup:(t,e,o,r)=>n(d,t,e,{options:o,...r}),select:(t,e,o,r)=>n(C,t,e,{options:o,...r}),combo:(t,e,o,r)=>n(x,t,e,{options:o,...r}),suggest:(t,e,o,r)=>n(b,t,e,{query:o,...r}),lookup:(t,e,o,r)=>n(w,t,e,{lookup:o,...r}),button:(t,e,o)=>new g({text:t,handler:e,...o}),primary:(t,e,o)=>new g({text:t,handler:e,variant:"primary",...o}),danger:(t,e,o)=>new g({text:t,handler:e,variant:"danger",...o}),row:(...t)=>new s({layout:"hbox",items:t}),col:(...t)=>new s({layout:"vbox",items:t}),grid:(t,...e)=>new s({layout:{type:"grid",columns:t},items:e}),panel:(t,e,o)=>new h({title:t,items:e,...o}),toolbar:(...t)=>new T({items:t}),form:(t,e)=>new R({items:t,...e})};var i=t=>t,Y=i({Default:"default",Primary:"primary",Danger:"danger",Ghost:"ghost"}),Z=i({Top:"top",Left:"left"}),_=i({Vertical:"vertical",Horizontal:"horizontal"}),$=i({North:"north",South:"south",West:"west",East:"east",Center:"center"}),tt=i({Right:"right",Left:"left",Top:"top",Bottom:"bottom"}),et=i({Fit:"fit",HBox:"hbox",VBox:"vbox",Border:"border",Grid:"grid",Card:"card"}),ot=i({None:"none",Single:"single",Multi:"multi"}),nt=i({Info:"info",Success:"success",Warning:"warning",Error:"error"}),rt=i({Eq:"eq",Ne:"ne",Contains:"contains",NotContains:"notContains",StartsWith:"startsWith",EndsWith:"endsWith",Gt:"gt",Ge:"ge",Lt:"lt",Le:"le",Between:"between",NotBetween:"notBetween",In:"in",Nin:"nin",Empty:"empty",NotEmpty:"notEmpty"}),it=i({Light:"light",Dark:"dark"});export{v as a,Y as b,Z as c,_ as d,$ as e,tt as f,et as g,ot as h,nt as i,rt as j,it as k};
2
- //# sourceMappingURL=chunk-4EQEHJB3.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/ui/ui.ts", "../src/ui/enums.ts"],
4
- "sourcesContent": ["// Short constructors for the things you write most. They return real component instances (the classes), so they can be\n// used anywhere a config goes: `items: [ui.text('name', 'Name', { required: true }), ui.select('plan', 'Plan', ['Free', 'Pro'])]`.\n// The last argument is always a config object that overrides or adds anything (`{ required: true, help: '\u2026' }`).\nimport { TextField, type TextFieldConfig } from '../components/fields/textfield/textfield';\nimport { TextArea } from '../components/fields/textarea/textarea';\nimport { NumberField } from '../components/fields/numberfield/numberfield';\nimport { DateField } from '../components/fields/datefield/datefield';\nimport { DateRangeField } from '../components/fields/daterangefield/daterangefield';\nimport { Checkbox } from '../components/fields/checkbox/checkbox';\nimport { Toggle } from '../components/fields/toggle/toggle';\nimport { CheckboxGroup } from '../components/fields/checkboxgroup/checkboxgroup';\nimport { RadioGroup, type RadioOption } from '../components/fields/radiogroup/radiogroup';\nimport { Select } from '../components/fields/select/select';\nimport { ComboBox } from '../components/fields/combobox/combobox';\nimport { SuggestField } from '../components/fields/suggestfield/suggestfield';\nimport { LookupField } from '../components/fields/lookupfield/lookupfield';\nimport { SecretField } from '../components/fields/secretfield/secretfield';\nimport { Slider } from '../components/fields/slider/slider';\nimport { Dial } from '../components/fields/dial/dial';\nimport { Button } from '../components/base/button/button';\nimport { Panel } from '../components/layout/panel/panel';\nimport { Toolbar } from '../components/layout/toolbar/toolbar';\nimport { Container } from '../core/container';\nimport { Form } from '../components/form/form/form';\nimport type { Component } from '../core/component';\nimport type { AnyConfig } from '../core/registry';\nimport type { Variant } from './enums';\n\ntype Cfg = Record<string, any>;\n// anything a container takes: an instance, a declarative config ({ type: 'fieldset', ... }) or a toolbar string ('->', '-')\ntype Item = Component | AnyConfig | string;\ntype Options = (string | number | { value: unknown; label: string; disabled?: boolean })[];\n\nconst field = <T>(Cls: new (c: any) => T, name: string, label: string | undefined, c: Cfg = {}): T => new Cls({ name, label, ...c });\n\nexport const ui = {\n // ---- fields: (name, label, config?) ----\n text: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, c),\n email: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, { inputType: 'email', ...c } satisfies TextFieldConfig),\n password: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, { inputType: 'password', ...c }),\n area: (name: string, label?: string, c?: Cfg) => field(TextArea, name, label, c),\n number: (name: string, label?: string, c?: Cfg) => field(NumberField, name, label, c),\n date: (name: string, label?: string, c?: Cfg) => field(DateField, name, label, c),\n dateRange: (name: string, label?: string, c?: Cfg) => field(DateRangeField, name, label, c),\n secret: (name: string, label?: string, c?: Cfg) => field(SecretField, name, label, c),\n slider: (name: string, label?: string, c?: Cfg) => field(Slider, name, label, c),\n dial: (name: string, label?: string, c?: Cfg) => field(Dial, name, label, c),\n /** `boxLabel` is the text beside the box. */\n check: (name: string, boxLabel?: string, c?: Cfg) => field(Checkbox, name, undefined, { boxLabel, ...c }),\n /** An on/off switch; `boxLabel` is the text beside it. */\n toggle: (name: string, boxLabel?: string, c?: Cfg) => field(Toggle, name, undefined, { boxLabel, ...c }),\n radio: (name: string, label: string, options: RadioOption[], c?: Cfg) => field(RadioGroup, name, label, { options, ...c }),\n /** Several choices; the value is the list of checked values. */\n checkGroup: (name: string, label: string, options: RadioOption[], c?: Cfg) => field(CheckboxGroup, name, label, { options, ...c }),\n select: (name: string, label: string, options: Options, c?: Cfg) => field(Select, name, label, { options, ...c }),\n combo: (name: string, label: string, options: Options, c?: Cfg) => field(ComboBox, name, label, { options, ...c }),\n suggest: (name: string, label: string, query: (text: string, o: { signal: AbortSignal }) => unknown, c?: Cfg) => field(SuggestField, name, label, { query, ...c }),\n /** `lookup` is a LookupDef or the name given to `registerLookup`. */\n lookup: (name: string, label: string, lookup: Cfg | string, c?: Cfg) => field(LookupField, name, label, { lookup, ...c }),\n\n // ---- actions ----\n button: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, ...c }),\n primary: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, variant: 'primary' satisfies Variant, ...c }),\n danger: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, variant: 'danger' satisfies Variant, ...c }),\n\n // ---- structure ----\n row: (...items: Item[]) => new Container({ layout: 'hbox', items } as Cfg),\n col: (...items: Item[]) => new Container({ layout: 'vbox', items } as Cfg),\n /** `columns`: a number (equal columns, one column on narrow containers) or a CSS `grid-template-columns`. */\n grid: (columns: number | string, ...items: Item[]) => new Container({ layout: { type: 'grid', columns }, items } as Cfg),\n panel: (title: string, items: Item[], c?: Cfg) => new Panel({ title, items, ...c } as Cfg),\n toolbar: (...items: Item[]) => new Toolbar({ items } as Cfg),\n form: (items: Item[], c?: Cfg) => new Form({ items, ...c } as Cfg),\n};\n", "// Named values for the options that are plain strings in configs. Each is a const object plus a type of the same name,\n// so `Variant.Primary` and `'primary'` are interchangeable: use whichever you like, the editor completes both.\nconst e = <T extends Record<string, string>>(o: T) => o;\n\nexport const Variant = e({ Default: 'default', Primary: 'primary', Danger: 'danger', Ghost: 'ghost' } as const);\nexport type Variant = (typeof Variant)[keyof typeof Variant];\n\nexport const LabelPos = e({ Top: 'top', Left: 'left' } as const);\nexport type LabelPos = (typeof LabelPos)[keyof typeof LabelPos];\n\nexport const Direction = e({ Vertical: 'vertical', Horizontal: 'horizontal' } as const);\nexport type Direction = (typeof Direction)[keyof typeof Direction];\n\n/** Layout `border` regions. */\nexport const Region = e({ North: 'north', South: 'south', West: 'west', East: 'east', Center: 'center' } as const);\nexport type Region = (typeof Region)[keyof typeof Region];\n\n/** Widget sides. */\nexport const Side = e({ Right: 'right', Left: 'left', Top: 'top', Bottom: 'bottom' } as const);\nexport type Side = (typeof Side)[keyof typeof Side];\n\nexport const LayoutKind = e({ Fit: 'fit', HBox: 'hbox', VBox: 'vbox', Border: 'border', Grid: 'grid', Card: 'card' } as const);\nexport type LayoutKind = (typeof LayoutKind)[keyof typeof LayoutKind];\n\nexport const Selection = e({ None: 'none', Single: 'single', Multi: 'multi' } as const);\nexport type Selection = (typeof Selection)[keyof typeof Selection];\n\nexport const ToastType = e({ Info: 'info', Success: 'success', Warning: 'warning', Error: 'error' } as const);\nexport type ToastType = (typeof ToastType)[keyof typeof ToastType];\n\n/** Filter operators (Store.filter, FilterBuilder, lookup filters). */\nexport const Op = e({\n Eq: 'eq', Ne: 'ne', Contains: 'contains', NotContains: 'notContains', StartsWith: 'startsWith', EndsWith: 'endsWith',\n Gt: 'gt', Ge: 'ge', Lt: 'lt', Le: 'le', Between: 'between', NotBetween: 'notBetween', In: 'in', Nin: 'nin', Empty: 'empty', NotEmpty: 'notEmpty',\n} as const);\nexport type Op = (typeof Op)[keyof typeof Op];\n\n/** The shipped themes (`setTheme(ThemeName.Dark)`; add `' compact'` for the dense variant). */\nexport const ThemeName = e({ Light: 'light', Dark: 'dark' } as const);\nexport type ThemeName = (typeof ThemeName)[keyof typeof ThemeName];\n"],
5
- "mappings": "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",
6
- "names": ["field", "Cls", "name", "label", "c", "ui", "TextField", "TextArea", "NumberField", "DateField", "DateRangeField", "SecretField", "Slider", "Dial", "boxLabel", "Checkbox", "Toggle", "options", "RadioGroup", "CheckboxGroup", "Select", "ComboBox", "query", "SuggestField", "lookup", "LookupField", "text", "handler", "Button", "items", "Container", "columns", "title", "Panel", "Toolbar", "Form", "e", "o", "Variant", "LabelPos", "Direction", "Region", "Side", "LayoutKind", "Selection", "ToastType", "Op", "ThemeName"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as b}from"./chunk-LQRFNQ2N.js";import{b as a,c as f}from"./chunk-676AKAGF.js";import{a as l,b as m}from"./chunk-VV7CFMPZ.js";import{b as v,c as u}from"./chunk-4AA4FQEM.js";import{c as n}from"./chunk-2UPUC4RK.js";import{b as h}from"./chunk-PZSHOSOS.js";import{a as p}from"./chunk-TIPK3SCJ.js";var d=class extends b{baseCls="op-panel op-window";backdrop;visible=!1;cleanup=[];opener=null;moved=!1;leaving=0;constructor(e={}){super({closable:!0,...e})}onRender(){super.onRender();let e=this.config;this.el.setAttribute("role","dialog"),this.el.tabIndex=-1,e.modal!==!1&&this.el.setAttribute("aria-modal","true"),e.draggable!==!1&&this.initDrag()}initDrag(){this.headerEl.classList.add("op-window__handle"),this.listen(this.headerEl,"pointerdown",e=>{if(e.target.closest(".op-panel__tool")||e.button)return;let t=this.el.getBoundingClientRect(),o=e.clientX-t.left,s=e.clientY-t.top;this.el.classList.add("is-dragging");let i=c=>{this.el.style.left=`${Math.max(0,Math.min(c.clientX-o,innerWidth-40))}px`,this.el.style.top=`${Math.max(0,Math.min(c.clientY-s,innerHeight-40))}px`,this.moved=!0},r=()=>{this.el.classList.remove("is-dragging"),document.removeEventListener("pointermove",i),document.removeEventListener("pointerup",r)};document.addEventListener("pointermove",i),document.addEventListener("pointerup",r),this.cleanup.push(r)})}setMask(e){this.config.mask=e,this.backdrop?.classList.toggle("is-clear",!e)}isVisible(){return this.visible}center(){let e=this.el;e.style.left=`${Math.max(0,(innerWidth-e.offsetWidth)/2)}px`,e.style.top=`${Math.max(0,(innerHeight-e.offsetHeight)/3)}px`}show(){if(this.visible||this.destroyed||this.emit("before-show")===!1)return;let e=this.config,t=this.el;this.opener=document.activeElement,e.modal!==!1?(this.backdrop=h("div",`op-window-backdrop${e.mask===!1?" is-clear":""}`,{},t),a(this.backdrop,this.opener),this.cleanup.push(f(this.backdrop)),this.listen(this.backdrop,"pointerdown",i=>{i.target===this.backdrop&&(e.closeOnBackdrop?this.close():t.focus())})):a(t,this.opener),this.visible=!0,this.leaving++,t.getAnimations?.().forEach(i=>i.cancel()),this.notifyMount(),this.center(),v(t,this.opener??void 0,"modal"),this.backdrop?.animate?.([{opacity:0},{opacity:1}],{duration:n.ms("modal"),easing:n.easing("enter")}),this.cleanup.push(m(t));let o=i=>{i.key==="Escape"&&e.closeOnEsc!==!1&&!i.defaultPrevented&&(i.stopPropagation(),this.close())};t.addEventListener("keydown",o);let s=()=>!this.moved&&this.center();window.addEventListener("resize",s),this.cleanup.push(()=>t.removeEventListener("keydown",o),()=>window.removeEventListener("resize",s)),e.autoFocus?this.focusFirst():t.focus(),this.emit("show")}focusFirst(){let e=l(this.bodyEl)[0],t=this.el.querySelector(".op-panel__footer .op-button--primary");(e??t??l(this.el).find(o=>!o.classList.contains("op-panel__tool"))??this.el).focus()}hide(){!this.visible||this.emit("before-hide")===!1||(this.release(),this.emit("hide"))}release(e=!0){this.visible=!1,this.cleanup.splice(0).reverse().forEach(i=>i());let t=this.backdrop;this.backdrop=void 0;let o=t??this.el,s=e?u(this.el,this.opener??void 0,"modal"):null;if(s){let i=++this.leaving;t?.animate?.([{opacity:1},{opacity:0}],{duration:n.ms("modal","exit"),easing:n.easing("exit"),fill:"forwards"}),s.then(()=>i===this.leaving&&!this.visible&&(o.remove(),t?.remove()))}else o.remove(),t?.remove();this.opener instanceof HTMLElement&&this.opener.isConnected&&this.opener.focus()}onDestroy(){this.visible?this.release(!1):this.leaving&&(this.el.closest(".op-window-backdrop")??this.el).remove(),super.onDestroy()}};p("window",d);export{d as a};
2
- //# sourceMappingURL=chunk-4LZZ244E.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/overlays/window/window.ts"],
4
- "sourcesContent": ["import { Panel, type PanelConfig } from '../../layout/panel/panel';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { toLayer, lockModal } from '../../../core/layer';\nimport { trapFocus, focusables } from '../../../core/focus';\nimport { popIn, popOut } from '../../../motion/core';\nimport { motion } from '../../../motion/config';\n\nexport interface WindowConfig extends PanelConfig {\n modal?: boolean;\n /** Dims the page behind a modal window. `false` keeps it modal (inert page, trapped focus) but clear. Default true. */\n mask?: boolean;\n draggable?: boolean;\n closeOnEsc?: boolean;\n closeOnBackdrop?: boolean;\n /**\n * On show the focus goes to the dialog itself (it is modal: the focus must be inside), so a phone keyboard does not\n * pop up. `true` focuses its first field instead. Default false.\n */\n autoFocus?: boolean;\n}\n\n/** Floating dialog. Modal by default: the page behind becomes inert and Tab stays inside. */\nexport class Window extends Panel<WindowConfig> {\n protected override baseCls = 'op-panel op-window';\n private backdrop?: HTMLElement;\n private visible = false;\n private cleanup: Array<() => void> = [];\n private opener: Element | null = null;\n private moved = false;\n private leaving = 0;\n\n constructor(config: WindowConfig = {}) {\n super({ closable: true, ...config });\n }\n\n protected override onRender() {\n super.onRender();\n const c = this.config;\n this.el.setAttribute('role', 'dialog');\n this.el.tabIndex = -1;\n if (c.modal !== false) this.el.setAttribute('aria-modal', 'true');\n if (c.draggable !== false) this.initDrag();\n }\n\n private initDrag() {\n this.headerEl.classList.add('op-window__handle');\n this.listen(this.headerEl, 'pointerdown', (e: PointerEvent) => {\n if ((e.target as HTMLElement).closest('.op-panel__tool') || e.button) return;\n const r = this.el.getBoundingClientRect();\n const dx = e.clientX - r.left;\n const dy = e.clientY - r.top;\n this.el.classList.add('is-dragging');\n const move = (m: PointerEvent) => {\n this.el.style.left = `${Math.max(0, Math.min(m.clientX - dx, innerWidth - 40))}px`;\n this.el.style.top = `${Math.max(0, Math.min(m.clientY - dy, innerHeight - 40))}px`;\n this.moved = true;\n };\n const up = () => {\n this.el.classList.remove('is-dragging');\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.cleanup.push(up);\n });\n }\n\n /** Dims (true) or not (false) the page behind the modal window. */\n setMask(mask: boolean): void {\n this.config.mask = mask;\n this.backdrop?.classList.toggle('is-clear', !mask);\n }\n\n isVisible(): boolean {\n return this.visible;\n }\n\n /** Centers in the viewport (also done on show and on resize until the user drags it). */\n center(): void {\n const el = this.el;\n el.style.left = `${Math.max(0, (innerWidth - el.offsetWidth) / 2)}px`;\n el.style.top = `${Math.max(0, (innerHeight - el.offsetHeight) / 3)}px`;\n }\n\n override show(): void {\n if (this.visible || this.destroyed || this.emit('before-show') === false) return;\n const c = this.config;\n const el = this.el;\n this.opener = document.activeElement;\n if (c.modal !== false) {\n this.backdrop = h('div', `op-window-backdrop${c.mask === false ? ' is-clear' : ''}`, {}, el);\n toLayer(this.backdrop, this.opener);\n this.cleanup.push(lockModal(this.backdrop));\n this.listen(this.backdrop, 'pointerdown', (e: Event) => {\n if (e.target !== this.backdrop) return;\n if (c.closeOnBackdrop) this.close();\n else el.focus();\n });\n } else toLayer(el, this.opener);\n this.visible = true;\n this.leaving++;\n el.getAnimations?.().forEach((a) => a.cancel());\n this.notifyMount();\n this.center();\n void popIn(el, this.opener ?? undefined, 'modal'); // grows out of the button that opened it\n this.backdrop?.animate?.([{ opacity: 0 }, { opacity: 1 }], { duration: motion.ms('modal'), easing: motion.easing('enter') });\n this.cleanup.push(trapFocus(el));\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && c.closeOnEsc !== false && !e.defaultPrevented) {\n e.stopPropagation();\n this.close();\n }\n };\n el.addEventListener('keydown', onKey);\n const onResize = () => !this.moved && this.center();\n window.addEventListener('resize', onResize);\n this.cleanup.push(() => el.removeEventListener('keydown', onKey), () => window.removeEventListener('resize', onResize));\n if (c.autoFocus) this.focusFirst();\n else el.focus();\n this.emit('show');\n }\n\n private focusFirst() {\n const inBody = focusables(this.bodyEl)[0];\n const primary = this.el.querySelector<HTMLElement>('.op-panel__footer .op-button--primary');\n (inBody ?? primary ?? focusables(this.el).find((e) => !e.classList.contains('op-panel__tool')) ?? this.el).focus();\n }\n\n override hide(): void {\n if (!this.visible || this.emit('before-hide') === false) return;\n this.release();\n this.emit('hide');\n }\n\n /** Cleans up at once (the page is usable again) and takes the window off the screen: shrinking toward its opener, 20 % faster than it came. */\n private release(animate = true) {\n this.visible = false;\n this.cleanup.splice(0).reverse().forEach((f) => f());\n const bd = this.backdrop;\n this.backdrop = undefined;\n const target = bd ?? this.el;\n const out = animate ? popOut(this.el, this.opener ?? undefined, 'modal') : null;\n if (out) {\n const id = ++this.leaving;\n bd?.animate?.([{ opacity: 1 }, { opacity: 0 }], { duration: motion.ms('modal', 'exit'), easing: motion.easing('exit'), fill: 'forwards' });\n void out.then(() => id === this.leaving && !this.visible && (target.remove(), bd?.remove()));\n } else {\n target.remove();\n bd?.remove();\n }\n if (this.opener instanceof HTMLElement && this.opener.isConnected) this.opener.focus();\n }\n\n protected override onDestroy() {\n if (this.visible) this.release(false);\n else if (this.leaving) (this.el.closest('.op-window-backdrop') ?? this.el).remove();\n super.onDestroy();\n }\n}\nregister('window', Window);\n"],
5
- "mappings": "6SAuBO,IAAMA,EAAN,cAAqBC,CAAoB,CAC3B,QAAU,qBACrB,SACA,QAAU,GACV,QAA6B,CAAC,EAC9B,OAAyB,KACzB,MAAQ,GACR,QAAU,EAElB,YAAYC,EAAuB,CAAC,EAAG,CACrC,MAAM,CAAE,SAAU,GAAM,GAAGA,CAAO,CAAC,CACrC,CAEmB,UAAW,CAC5B,MAAM,SAAS,EACf,IAAMC,EAAI,KAAK,OACf,KAAK,GAAG,aAAa,OAAQ,QAAQ,EACrC,KAAK,GAAG,SAAW,GACfA,EAAE,QAAU,IAAO,KAAK,GAAG,aAAa,aAAc,MAAM,EAC5DA,EAAE,YAAc,IAAO,KAAK,SAAS,CAC3C,CAEQ,UAAW,CACjB,KAAK,SAAS,UAAU,IAAI,mBAAmB,EAC/C,KAAK,OAAO,KAAK,SAAU,cAAgB,GAAoB,CAC7D,GAAK,EAAE,OAAuB,QAAQ,iBAAiB,GAAK,EAAE,OAAQ,OACtE,IAAMC,EAAI,KAAK,GAAG,sBAAsB,EAClCC,EAAK,EAAE,QAAUD,EAAE,KACnBE,EAAK,EAAE,QAAUF,EAAE,IACzB,KAAK,GAAG,UAAU,IAAI,aAAa,EACnC,IAAMG,EAAQC,GAAoB,CAChC,KAAK,GAAG,MAAM,KAAO,GAAG,KAAK,IAAI,EAAG,KAAK,IAAIA,EAAE,QAAUH,EAAI,WAAa,EAAE,CAAC,CAAC,KAC9E,KAAK,GAAG,MAAM,IAAM,GAAG,KAAK,IAAI,EAAG,KAAK,IAAIG,EAAE,QAAUF,EAAI,YAAc,EAAE,CAAC,CAAC,KAC9E,KAAK,MAAQ,EACf,EACMG,EAAK,IAAM,CACf,KAAK,GAAG,UAAU,OAAO,aAAa,EACtC,SAAS,oBAAoB,cAAeF,CAAI,EAChD,SAAS,oBAAoB,YAAaE,CAAE,CAC9C,EACA,SAAS,iBAAiB,cAAeF,CAAI,EAC7C,SAAS,iBAAiB,YAAaE,CAAE,EACzC,KAAK,QAAQ,KAAKA,CAAE,CACtB,CAAC,CACH,CAGA,QAAQC,EAAqB,CAC3B,KAAK,OAAO,KAAOA,EACnB,KAAK,UAAU,UAAU,OAAO,WAAY,CAACA,CAAI,CACnD,CAEA,WAAqB,CACnB,OAAO,KAAK,OACd,CAGA,QAAe,CACb,IAAMC,EAAK,KAAK,GAChBA,EAAG,MAAM,KAAO,GAAG,KAAK,IAAI,GAAI,WAAaA,EAAG,aAAe,CAAC,CAAC,KACjEA,EAAG,MAAM,IAAM,GAAG,KAAK,IAAI,GAAI,YAAcA,EAAG,cAAgB,CAAC,CAAC,IACpE,CAES,MAAa,CACpB,GAAI,KAAK,SAAW,KAAK,WAAa,KAAK,KAAK,aAAa,IAAM,GAAO,OAC1E,IAAMR,EAAI,KAAK,OACTQ,EAAK,KAAK,GAChB,KAAK,OAAS,SAAS,cACnBR,EAAE,QAAU,IACd,KAAK,SAAW,EAAE,MAAO,qBAAqBA,EAAE,OAAS,GAAQ,YAAc,EAAE,GAAI,CAAC,EAAGQ,CAAE,EAC3FC,EAAQ,KAAK,SAAU,KAAK,MAAM,EAClC,KAAK,QAAQ,KAAKC,EAAU,KAAK,QAAQ,CAAC,EAC1C,KAAK,OAAO,KAAK,SAAU,cAAgBC,GAAa,CAClDA,EAAE,SAAW,KAAK,WAClBX,EAAE,gBAAiB,KAAK,MAAM,EAC7BQ,EAAG,MAAM,EAChB,CAAC,GACIC,EAAQD,EAAI,KAAK,MAAM,EAC9B,KAAK,QAAU,GACf,KAAK,UACLA,EAAG,gBAAgB,EAAE,QAASI,GAAMA,EAAE,OAAO,CAAC,EAC9C,KAAK,YAAY,EACjB,KAAK,OAAO,EACPC,EAAML,EAAI,KAAK,QAAU,OAAW,OAAO,EAChD,KAAK,UAAU,UAAU,CAAC,CAAE,QAAS,CAAE,EAAG,CAAE,QAAS,CAAE,CAAC,EAAG,CAAE,SAAUM,EAAO,GAAG,OAAO,EAAG,OAAQA,EAAO,OAAO,OAAO,CAAE,CAAC,EAC3H,KAAK,QAAQ,KAAKC,EAAUP,CAAE,CAAC,EAC/B,IAAMQ,EAASL,GAAqB,CAC9BA,EAAE,MAAQ,UAAYX,EAAE,aAAe,IAAS,CAACW,EAAE,mBACrDA,EAAE,gBAAgB,EAClB,KAAK,MAAM,EAEf,EACAH,EAAG,iBAAiB,UAAWQ,CAAK,EACpC,IAAMC,EAAW,IAAM,CAAC,KAAK,OAAS,KAAK,OAAO,EAClD,OAAO,iBAAiB,SAAUA,CAAQ,EAC1C,KAAK,QAAQ,KAAK,IAAMT,EAAG,oBAAoB,UAAWQ,CAAK,EAAG,IAAM,OAAO,oBAAoB,SAAUC,CAAQ,CAAC,EAClHjB,EAAE,UAAW,KAAK,WAAW,EAC5BQ,EAAG,MAAM,EACd,KAAK,KAAK,MAAM,CAClB,CAEQ,YAAa,CACnB,IAAMU,EAASC,EAAW,KAAK,MAAM,EAAE,CAAC,EAClCC,EAAU,KAAK,GAAG,cAA2B,uCAAuC,GACzFF,GAAUE,GAAWD,EAAW,KAAK,EAAE,EAAE,KAAMR,GAAM,CAACA,EAAE,UAAU,SAAS,gBAAgB,CAAC,GAAK,KAAK,IAAI,MAAM,CACnH,CAES,MAAa,CAChB,CAAC,KAAK,SAAW,KAAK,KAAK,aAAa,IAAM,KAClD,KAAK,QAAQ,EACb,KAAK,KAAK,MAAM,EAClB,CAGQ,QAAQU,EAAU,GAAM,CAC9B,KAAK,QAAU,GACf,KAAK,QAAQ,OAAO,CAAC,EAAE,QAAQ,EAAE,QAASC,GAAMA,EAAE,CAAC,EACnD,IAAMC,EAAK,KAAK,SAChB,KAAK,SAAW,OAChB,IAAMC,EAASD,GAAM,KAAK,GACpBE,EAAMJ,EAAUK,EAAO,KAAK,GAAI,KAAK,QAAU,OAAW,OAAO,EAAI,KAC3E,GAAID,EAAK,CACP,IAAME,EAAK,EAAE,KAAK,QAClBJ,GAAI,UAAU,CAAC,CAAE,QAAS,CAAE,EAAG,CAAE,QAAS,CAAE,CAAC,EAAG,CAAE,SAAUT,EAAO,GAAG,QAAS,MAAM,EAAG,OAAQA,EAAO,OAAO,MAAM,EAAG,KAAM,UAAW,CAAC,EACpIW,EAAI,KAAK,IAAME,IAAO,KAAK,SAAW,CAAC,KAAK,UAAYH,EAAO,OAAO,EAAGD,GAAI,OAAO,EAAE,CAC7F,MACEC,EAAO,OAAO,EACdD,GAAI,OAAO,EAET,KAAK,kBAAkB,aAAe,KAAK,OAAO,aAAa,KAAK,OAAO,MAAM,CACvF,CAEmB,WAAY,CACzB,KAAK,QAAS,KAAK,QAAQ,EAAK,EAC3B,KAAK,UAAU,KAAK,GAAG,QAAQ,qBAAqB,GAAK,KAAK,IAAI,OAAO,EAClF,MAAM,UAAU,CAClB,CACF,EACAK,EAAS,SAAU/B,CAAM",
6
- "names": ["Window", "Panel", "config", "c", "r", "dx", "dy", "move", "m", "up", "mask", "el", "toLayer", "lockModal", "e", "a", "popIn", "motion", "trapFocus", "onKey", "onResize", "inBody", "focusables", "primary", "animate", "f", "bd", "target", "out", "popOut", "id", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{b as f,c as g}from"./chunk-676AKAGF.js";import{b as y}from"./chunk-VV7CFMPZ.js";import{c as p}from"./chunk-4EZJ5FKJ.js";import{a as u}from"./chunk-A2NKDOYN.js";import{b as o}from"./chunk-PZSHOSOS.js";import{a as v}from"./chunk-TIPK3SCJ.js";import{e as d,f as h}from"./chunk-MW3RWBZ7.js";d("en",{cpPlaceholder:"Type a command or search\u2026",cpLabel:"Command palette",cpFilters:"Categories",cpAll:"All",cpEmpty:"No matching commands",cpHint:"\u2191\u2193 navigate \xB7 Enter run \xB7 Esc close"});d("pt-BR",{cpPlaceholder:"Digite um comando ou pesquise\u2026",cpLabel:"Paleta de comandos",cpFilters:"Categorias",cpAll:"Todas",cpEmpty:"Nenhum comando encontrado",cpHint:"\u2191\u2193 navegar \xB7 Enter executar \xB7 Esc fechar"});var b=()=>/mac|iphone|ipad/i.test(navigator.platform||navigator.userAgent);function E(a,t){let e=t.toLowerCase().split("+"),i=e.pop(),n=r=>e.includes(r),s=b();return a.key.toLowerCase()===i&&a.ctrlKey===(n("ctrl")||n("mod")&&!s)&&a.metaKey===(n("meta")||n("mod")&&s)&&a.shiftKey===n("shift")&&a.altKey===n("alt")}var C=(a,t)=>{let e=0;for(let i of a)if(i===t[e]&&++e===t.length)return!0;return!t.length};function _(a,t){let e=a.title.toLowerCase(),i=[a.category,a.description,...a.keywords??[]].join(" ").toLowerCase(),n=0;for(let s of t.toLowerCase().split(/\s+/).filter(Boolean)){let r=e.indexOf(s),l=r===0?100:r>0?/[\s\-_/]/.test(e[r-1])?80:60:s.length>2&&C(e,s)?30:i.includes(s)?20:0;if(!l)return 0;n+=l}return n}function w(a,t){let e=t.toLowerCase().split(/\s+/).filter(Boolean),i=a.toLowerCase(),n=[];for(let l of e){let c=i.indexOf(l);c>=0&&n.push([c,c+l.length])}n.sort((l,c)=>l[0]-c[0]);let s=[],r=0;for(let[l,c]of n)l<r||(s.push(a.slice(r,l),o("mark","op-palette__mark",{},a.slice(l,c))),r=c);return s.push(a.slice(r)),s.filter(l=>l!=="")}var m=class extends u{baseCls="op-palette-backdrop";commands;levels=[];query="";cat=null;shown=[];active=0;opened=!1;opener=null;release=[];panel;input;filtersEl;listEl;live;crumb;constructor(t={}){super(t),this.commands=[...t.commands??[]];let e=t.hotkey===void 0?"mod+k":t.hotkey;e&&this.listen(document,"keydown",i=>{!E(i,e)||this.destroyed||(i.preventDefault(),this.toggle())},!0)}build(){let t=this.config;this.input=o("input","op-palette__input",{type:"text",role:"combobox","aria-expanded":"true","aria-autocomplete":"list",autocomplete:"off",spellcheck:"false",placeholder:t.placeholder??h("cpPlaceholder")}),this.crumb=o("span","op-palette__crumb"),this.crumb.hidden=!0,this.filtersEl=o("div","op-palette__filters",{role:"group","aria-label":h("cpFilters")}),this.listEl=o("div","op-palette__list",{role:"listbox",id:`${this.id}-list`}),this.input.setAttribute("aria-controls",this.listEl.id),this.live=o("div","op-sr-only",{"aria-live":"polite"}),this.panel=o("div","op-palette",{role:"dialog","aria-modal":"true","aria-label":h("cpLabel")},o("div","op-palette__search",{},p("search"),this.crumb,this.input),this.filtersEl,this.listEl,this.live,o("div","op-palette__hint",{},h("cpHint")));let e=o("div","op-palette-backdrop",{},this.panel);return this.listen(this.input,"input",()=>{this.query=this.input.value,this.active=0,this.paint()}),this.listen(this.panel,"keydown",i=>this.onKey(i)),this.listen(e,"pointerdown",i=>i.target===e&&this.close()),this.listen(this.listEl,"pointermove",i=>{let n=this.indexOf(i);n>=0&&n!==this.active&&this.setActive(n)}),this.listen(this.listEl,"click",i=>{let n=this.indexOf(i);n>=0&&this.choose(this.shown[n])}),this.listen(this.filtersEl,"click",i=>{let n=i.target.closest("[data-cat]");n&&(this.cat=n.dataset.cat||null,this.active=0,this.paint(),this.input.focus())}),e}getCommands(){return this.commands}setCommands(t){this.commands=[...t],this.levels[0]&&(this.levels[0].commands=this.commands),this.opened&&this.paint()}register(t){let e=Array.isArray(t)?t:[t];return this.commands.push(...e),this.opened&&this.paint(),()=>this.setCommands(this.commands.filter(i=>!e.includes(i)))}run(t){let e=this.commands.find(i=>i.id===t);return e?this.exec(e):Promise.resolve()}isOpen(){return this.opened}toggle(){this.opened?this.close():this.open()}open(){if(this.opened||this.destroyed||this.emit("before-open")===!1)return;this.opener=document.activeElement;let t=this.el;this.levels=[{title:"",commands:this.commands}],this.query=this.input.value="",this.cat=null,this.active=0,f(t,this.opener),this.release.push(g(t),y(this.panel)),this.opened=!0,t.classList.add("is-open"),this.notifyMount(),this.paint(),this.input.focus(),this.emit("open")}close(){this.opened&&(this.opened=!1,this.release.splice(0).reverse().forEach(t=>t()),this.el.classList.remove("is-open"),this.el.remove(),this.opener instanceof HTMLElement&&this.opener.isConnected&&this.opener.focus(),this.emit("close"))}onDestroy(){this.opened=!1,this.release.splice(0).forEach(t=>t()),this.panel&&this.el.remove()}level(){return this.levels[this.levels.length-1]}results(){let t=this.level().commands.filter(s=>!s.hidden?.()&&(!this.cat||s.category===this.cat)),e=this.query.trim();if(e)return t.map(s=>({c:s,s:_(s,e)})).filter(s=>s.s>0).sort((s,r)=>r.s-s.s).map(s=>s.c).slice(0,this.config.maxResults??50);let i=this.config.categories??[],n=s=>s.category===void 0?1e6:i.includes(s.category)?i.indexOf(s.category):i.length;return t.map((s,r)=>({c:s,i:r})).sort((s,r)=>n(s.c)-n(r.c)||s.i-r.i).map(s=>s.c).slice(0,this.config.maxResults??50)}paint(){let t=this.level();this.crumb.hidden=this.levels.length<2,this.crumb.textContent=t.title,this.paintFilters(),this.shown=this.results(),this.active=Math.min(this.active,Math.max(0,this.shown.length-1));let e=!!this.query.trim(),i=[],n;this.shown.forEach((s,r)=>{!e&&s.category!==n&&(n=s.category,n&&i.push(o("div","op-palette__group",{role:"presentation"},n)));let l=o("div",`op-palette__item${s.disabled?" is-disabled":""}`,{role:"option",id:`${this.id}-o${r}`,"aria-disabled":s.disabled?"true":null,"data-i":r},s.icon?o("span","op-palette__icon",{},p(s.icon)):o("span","op-palette__icon"),o("span","op-palette__text",{},o("span","op-palette__title",{},...w(s.title,this.query)),s.description?o("span","op-palette__desc",{},s.description):""),e&&s.category?o("span","op-palette__cat",{},s.category):"",s.children?o("span","op-palette__more",{"aria-hidden":"true"},p("chevron-right")):"",s.shortcut?o("kbd","op-palette__kbd",{},s.shortcut):"");i.push(l)}),this.shown.length||i.push(o("div","op-palette__empty",{},this.config.emptyText??h("cpEmpty"))),this.listEl.replaceChildren(...i),this.live.textContent=this.shown.length?h("results",{n:this.shown.length}):h("noResults"),this.setActive(this.active,!1)}paintFilters(){let t=[...new Set(this.level().commands.filter(i=>!i.hidden?.()&&i.category).map(i=>i.category))];this.filtersEl.hidden=this.config.filters===!1||t.length<2,this.cat&&!t.includes(this.cat)&&(this.cat=null);let e=(i,n)=>o("button",`op-palette__chip${(this.cat??"")===n?" is-on":""}`,{type:"button","data-cat":n,"aria-pressed":String((this.cat??"")===n)},i);this.filtersEl.replaceChildren(e(h("cpAll"),""),...t.map(i=>e(i,i)))}indexOf(t){let e=t.target.closest(".op-palette__item");return e?Number(e.dataset.i):-1}setActive(t,e=!0){this.active=t;for(let i of Array.from(this.listEl.querySelectorAll(".op-palette__item"))){let n=Number(i.dataset.i)===t;i.classList.toggle("is-active",n),i.setAttribute("aria-selected",String(n)),n&&(this.input.setAttribute("aria-activedescendant",i.id),e&&i.scrollIntoView?.({block:"nearest"}))}this.shown.length||this.input.removeAttribute("aria-activedescendant")}onKey(t){let e=this.shown.length;switch(t.key){case"ArrowDown":case"ArrowUp":t.preventDefault(),e&&this.setActive((this.active+(t.key==="ArrowDown"?1:e-1))%e);break;case"Home":case"End":t.target===this.input&&!this.input.value&&(t.preventDefault(),e&&this.setActive(t.key==="Home"?0:e-1));break;case"Enter":if(t.target.closest(".op-palette__chip"))return;t.preventDefault(),this.shown[this.active]&&this.choose(this.shown[this.active]);break;case"Escape":t.preventDefault(),t.stopPropagation(),this.levels.length>1?this.back():this.close();break;case"Backspace":!this.input.value&&this.levels.length>1&&(t.preventDefault(),this.back());break}}back(){this.levels.pop(),this.query=this.input.value="",this.cat=null,this.active=0,this.paint(),this.input.focus()}async choose(t){if(!(!t||t.disabled)){if(t.children){try{let e=typeof t.children=="function"?await t.children():t.children;this.levels.push({title:t.title,commands:e}),this.query=this.input.value="",this.cat=null,this.active=0,this.paint(),this.input.focus()}catch(e){this.emit("error",e)}return}this.close(),await this.exec(t)}}async exec(t){try{this.emit("run",t),await t.handler?.({palette:this,command:t})}catch(e){this.emit("error",e)}}};v("commandpalette",m);export{m as a};
2
- //# sourceMappingURL=chunk-4SYIIX5A.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/overlays/commandpalette/commandpalette.ts"],
4
- "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { toLayer, lockModal } from '../../../core/layer';\nimport { trapFocus } from '../../../core/focus';\nimport { iconEl } from '../../base/icon/icon';\n\naddMessages('en', {\n cpPlaceholder: 'Type a command or search\u2026',\n cpLabel: 'Command palette',\n cpFilters: 'Categories',\n cpAll: 'All',\n cpEmpty: 'No matching commands',\n cpHint: '\u2191\u2193 navigate \u00B7 Enter run \u00B7 Esc close',\n});\naddMessages('pt-BR', {\n cpPlaceholder: 'Digite um comando ou pesquise\u2026',\n cpLabel: 'Paleta de comandos',\n cpFilters: 'Categorias',\n cpAll: 'Todas',\n cpEmpty: 'Nenhum comando encontrado',\n cpHint: '\u2191\u2193 navegar \u00B7 Enter executar \u00B7 Esc fechar',\n});\n\nexport interface Command {\n id: string;\n title: string;\n /** Groups the command and gives it a filter chip. */\n category?: string;\n icon?: string;\n description?: string;\n /** Extra words that find the command. */\n keywords?: string[];\n /** Only displayed (the app binds the key itself). */\n shortcut?: string;\n disabled?: boolean;\n hidden?: () => boolean;\n /** Runs after the palette closed. Errors become the palette's `error` event. */\n handler?: (ctx: { palette: CommandPalette; command: Command }) => unknown;\n /** A second level: choosing this command shows these (Backspace on an empty field goes back). */\n children?: Command[] | (() => Command[] | Promise<Command[]>);\n}\n\nexport interface CommandPaletteConfig extends ComponentConfig {\n commands?: Command[];\n /** `mod` is Ctrl on Windows/Linux and \u2318 on macOS. `false` turns the global key off. Default `'mod+k'`. */\n hotkey?: string | false;\n placeholder?: string;\n emptyText?: string;\n maxResults?: number;\n /** Order of the category groups; the others follow. */\n categories?: string[];\n /** Category chips under the field. Default true. */\n filters?: boolean;\n}\n\ntype Level = { title: string; commands: Command[] };\n\nconst isMac = () => /mac|iphone|ipad/i.test(navigator.platform || navigator.userAgent);\n\nfunction matchesKey(e: KeyboardEvent, spec: string): boolean {\n const parts = spec.toLowerCase().split('+');\n const key = parts.pop()!;\n const has = (m: string) => parts.includes(m);\n const mac = isMac();\n return (\n e.key.toLowerCase() === key &&\n e.ctrlKey === (has('ctrl') || (has('mod') && !mac)) &&\n e.metaKey === (has('meta') || (has('mod') && mac)) &&\n e.shiftKey === has('shift') &&\n e.altKey === has('alt')\n );\n}\n\nconst subsequence = (text: string, q: string) => {\n let i = 0;\n for (const ch of text) if (ch === q[i] && ++i === q.length) return true;\n return !q.length;\n};\n\n/** How well a command answers the query (0 = not at all). Every word of the query must match somewhere. */\nfunction score(c: Command, query: string): number {\n const title = c.title.toLowerCase();\n const rest = [c.category, c.description, ...(c.keywords ?? [])].join(' ').toLowerCase();\n let total = 0;\n for (const w of query.toLowerCase().split(/\\s+/).filter(Boolean)) {\n const at = title.indexOf(w);\n const s = at === 0 ? 100 : at > 0 ? (/[\\s\\-_/]/.test(title[at - 1]) ? 80 : 60) : w.length > 2 && subsequence(title, w) ? 30 : rest.includes(w) ? 20 : 0;\n if (!s) return 0;\n total += s;\n }\n return total;\n}\n\n/** Title with the matched words marked. */\nfunction marked(title: string, query: string): Array<string | Node> {\n const words = query.toLowerCase().split(/\\s+/).filter(Boolean);\n const lower = title.toLowerCase();\n const spans: Array<[number, number]> = [];\n for (const w of words) {\n const at = lower.indexOf(w);\n if (at >= 0) spans.push([at, at + w.length]);\n }\n spans.sort((a, b) => a[0] - b[0]);\n const out: Array<string | Node> = [];\n let pos = 0;\n for (const [a, b] of spans) {\n if (a < pos) continue;\n out.push(title.slice(pos, a), h('mark', 'op-palette__mark', {}, title.slice(a, b)));\n pos = b;\n }\n out.push(title.slice(pos));\n return out.filter((x) => x !== '');\n}\n\n/**\n * Command palette: Ctrl/\u2318+K opens a searchable, categorized list of the actions the app registered. Choosing one closes\n * the palette and runs it; a command with `children` opens a second level instead.\n */\nexport class CommandPalette extends Component<CommandPaletteConfig> {\n protected override baseCls = 'op-palette-backdrop';\n private commands: Command[];\n private levels: Level[] = [];\n private query = '';\n private cat: string | null = null;\n private shown: Command[] = [];\n private active = 0;\n private opened = false;\n private opener: Element | null = null;\n private release: Array<() => void> = [];\n private panel!: HTMLElement;\n private input!: HTMLInputElement;\n private filtersEl!: HTMLElement;\n private listEl!: HTMLElement;\n private live!: HTMLElement;\n private crumb!: HTMLElement;\n\n constructor(config: CommandPaletteConfig = {}) {\n super(config);\n this.commands = [...(config.commands ?? [])];\n const key = config.hotkey === undefined ? 'mod+k' : config.hotkey;\n if (key) {\n this.listen(document, 'keydown', (e: KeyboardEvent) => {\n if (!matchesKey(e, key) || this.destroyed) return;\n e.preventDefault();\n this.toggle();\n }, true);\n }\n }\n\n protected override build() {\n const c = this.config;\n this.input = h('input', 'op-palette__input', { type: 'text', role: 'combobox', 'aria-expanded': 'true', 'aria-autocomplete': 'list', autocomplete: 'off', spellcheck: 'false', placeholder: c.placeholder ?? t('cpPlaceholder') });\n this.crumb = h('span', 'op-palette__crumb');\n this.crumb.hidden = true;\n this.filtersEl = h('div', 'op-palette__filters', { role: 'group', 'aria-label': t('cpFilters') });\n this.listEl = h('div', 'op-palette__list', { role: 'listbox', id: `${this.id}-list` });\n this.input.setAttribute('aria-controls', this.listEl.id);\n this.live = h('div', 'op-sr-only', { 'aria-live': 'polite' });\n this.panel = h('div', 'op-palette', { role: 'dialog', 'aria-modal': 'true', 'aria-label': t('cpLabel') },\n h('div', 'op-palette__search', {}, iconEl('search'), this.crumb, this.input),\n this.filtersEl, this.listEl, this.live,\n h('div', 'op-palette__hint', {}, t('cpHint')));\n const el = h('div', 'op-palette-backdrop', {}, this.panel);\n this.listen(this.input, 'input', () => {\n this.query = this.input.value;\n this.active = 0;\n this.paint();\n });\n this.listen(this.panel, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.listen(el, 'pointerdown', (e: Event) => e.target === el && this.close());\n this.listen(this.listEl, 'pointermove', (e: Event) => {\n const i = this.indexOf(e);\n if (i >= 0 && i !== this.active) this.setActive(i);\n });\n this.listen(this.listEl, 'click', (e: Event) => {\n const i = this.indexOf(e);\n if (i >= 0) void this.choose(this.shown[i]);\n });\n this.listen(this.filtersEl, 'click', (e: Event) => {\n const b = (e.target as HTMLElement).closest<HTMLElement>('[data-cat]');\n if (!b) return;\n this.cat = b.dataset.cat || null;\n this.active = 0;\n this.paint();\n this.input.focus();\n });\n return el;\n }\n\n // ---- commands ------------------------------------------------------------------------------\n\n getCommands(): Command[] {\n return this.commands;\n }\n setCommands(list: Command[]): void {\n this.commands = [...list];\n if (this.levels[0]) this.levels[0].commands = this.commands;\n if (this.opened) this.paint();\n }\n /** Adds commands; returns the function that removes them again. */\n register(cmd: Command | Command[]): () => void {\n const list = Array.isArray(cmd) ? cmd : [cmd];\n this.commands.push(...list);\n if (this.opened) this.paint();\n return () => this.setCommands(this.commands.filter((c) => !list.includes(c)));\n }\n /** Runs a command by id (searching every level that is not a submenu), without opening the palette. */\n run(id: string): Promise<void> {\n const c = this.commands.find((x) => x.id === id);\n return c ? this.exec(c) : Promise.resolve();\n }\n\n // ---- open / close --------------------------------------------------------------------------\n\n isOpen(): boolean {\n return this.opened;\n }\n toggle(): void {\n if (this.opened) this.close();\n else this.open();\n }\n\n open(): void {\n if (this.opened || this.destroyed || this.emit('before-open') === false) return;\n this.opener = document.activeElement;\n const el = this.el;\n this.levels = [{ title: '', commands: this.commands }];\n this.query = this.input.value = '';\n this.cat = null;\n this.active = 0;\n toLayer(el, this.opener);\n this.release.push(lockModal(el), trapFocus(this.panel));\n this.opened = true;\n el.classList.add('is-open');\n this.notifyMount();\n this.paint();\n this.input.focus();\n this.emit('open');\n }\n\n close(): void {\n if (!this.opened) return;\n this.opened = false;\n this.release.splice(0).reverse().forEach((f) => f());\n this.el.classList.remove('is-open');\n this.el.remove();\n if (this.opener instanceof HTMLElement && this.opener.isConnected) this.opener.focus();\n this.emit('close');\n }\n\n protected override onDestroy(): void {\n this.opened = false;\n this.release.splice(0).forEach((f) => f());\n if (this.panel) this.el.remove();\n }\n\n // ---- rendering -----------------------------------------------------------------------------\n\n private level(): Level {\n return this.levels[this.levels.length - 1];\n }\n\n /** Commands for the current query/filter, in display order. */\n private results(): Command[] {\n const pool = this.level().commands.filter((c) => !c.hidden?.() && (!this.cat || c.category === this.cat));\n const q = this.query.trim();\n if (q) {\n return pool\n .map((c) => ({ c, s: score(c, q) }))\n .filter((x) => x.s > 0)\n .sort((a, b) => b.s - a.s)\n .map((x) => x.c)\n .slice(0, this.config.maxResults ?? 50);\n }\n const order = this.config.categories ?? [];\n const rank = (c: Command) => (c.category === undefined ? 1e6 : order.includes(c.category) ? order.indexOf(c.category) : order.length);\n return pool.map((c, i) => ({ c, i })).sort((a, b) => rank(a.c) - rank(b.c) || a.i - b.i).map((x) => x.c).slice(0, this.config.maxResults ?? 50);\n }\n\n private paint(): void {\n const lvl = this.level();\n this.crumb.hidden = this.levels.length < 2;\n this.crumb.textContent = lvl.title;\n this.paintFilters();\n this.shown = this.results();\n this.active = Math.min(this.active, Math.max(0, this.shown.length - 1));\n const searching = !!this.query.trim();\n const rows: HTMLElement[] = [];\n let group: string | undefined;\n this.shown.forEach((c, i) => {\n if (!searching && c.category !== group) {\n group = c.category;\n if (group) rows.push(h('div', 'op-palette__group', { role: 'presentation' }, group));\n }\n const item = h('div', `op-palette__item${c.disabled ? ' is-disabled' : ''}`, { role: 'option', id: `${this.id}-o${i}`, 'aria-disabled': c.disabled ? 'true' : null, 'data-i': i },\n c.icon ? h('span', 'op-palette__icon', {}, iconEl(c.icon)) : h('span', 'op-palette__icon'),\n h('span', 'op-palette__text', {}, h('span', 'op-palette__title', {}, ...marked(c.title, this.query)), c.description ? h('span', 'op-palette__desc', {}, c.description) : ''),\n searching && c.category ? h('span', 'op-palette__cat', {}, c.category) : '',\n c.children ? h('span', 'op-palette__more', { 'aria-hidden': 'true' }, iconEl('chevron-right')) : '',\n c.shortcut ? h('kbd', 'op-palette__kbd', {}, c.shortcut) : '');\n rows.push(item);\n });\n if (!this.shown.length) rows.push(h('div', 'op-palette__empty', {}, this.config.emptyText ?? t('cpEmpty')));\n this.listEl.replaceChildren(...rows);\n this.live.textContent = this.shown.length ? t('results', { n: this.shown.length }) : t('noResults');\n this.setActive(this.active, false);\n }\n\n private paintFilters(): void {\n const cats = [...new Set(this.level().commands.filter((c) => !c.hidden?.() && c.category).map((c) => c.category!))];\n this.filtersEl.hidden = this.config.filters === false || cats.length < 2;\n if (this.cat && !cats.includes(this.cat)) this.cat = null;\n const chip = (label: string, cat: string) => h('button', `op-palette__chip${(this.cat ?? '') === cat ? ' is-on' : ''}`, { type: 'button', 'data-cat': cat, 'aria-pressed': String((this.cat ?? '') === cat) }, label);\n this.filtersEl.replaceChildren(chip(t('cpAll'), ''), ...cats.map((c) => chip(c, c)));\n }\n\n private indexOf(e: Event): number {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-palette__item');\n return row ? Number(row.dataset.i) : -1;\n }\n\n private setActive(i: number, scroll = true): void {\n this.active = i;\n for (const row of Array.from(this.listEl.querySelectorAll<HTMLElement>('.op-palette__item'))) {\n const on = Number(row.dataset.i) === i;\n row.classList.toggle('is-active', on);\n row.setAttribute('aria-selected', String(on));\n if (on) {\n this.input.setAttribute('aria-activedescendant', row.id);\n if (scroll) row.scrollIntoView?.({ block: 'nearest' });\n }\n }\n if (!this.shown.length) this.input.removeAttribute('aria-activedescendant');\n }\n\n // ---- behavior ------------------------------------------------------------------------------\n\n private onKey(e: KeyboardEvent): void {\n const n = this.shown.length;\n switch (e.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n e.preventDefault();\n if (n) this.setActive((this.active + (e.key === 'ArrowDown' ? 1 : n - 1)) % n);\n break;\n case 'Home':\n case 'End':\n if (e.target === this.input && !this.input.value) {\n e.preventDefault();\n if (n) this.setActive(e.key === 'Home' ? 0 : n - 1);\n }\n break;\n case 'Enter':\n if ((e.target as HTMLElement).closest('.op-palette__chip')) return;\n e.preventDefault();\n if (this.shown[this.active]) void this.choose(this.shown[this.active]);\n break;\n case 'Escape':\n e.preventDefault();\n e.stopPropagation();\n if (this.levels.length > 1) this.back();\n else this.close();\n break;\n case 'Backspace':\n if (!this.input.value && this.levels.length > 1) {\n e.preventDefault();\n this.back();\n }\n break;\n }\n }\n\n private back(): void {\n this.levels.pop();\n this.query = this.input.value = '';\n this.cat = null;\n this.active = 0;\n this.paint();\n this.input.focus();\n }\n\n private async choose(c: Command | undefined): Promise<void> {\n if (!c || c.disabled) return;\n if (c.children) {\n try {\n const kids = typeof c.children === 'function' ? await c.children() : c.children;\n this.levels.push({ title: c.title, commands: kids });\n this.query = this.input.value = '';\n this.cat = null;\n this.active = 0;\n this.paint();\n this.input.focus();\n } catch (err) {\n this.emit('error', err);\n }\n return;\n }\n this.close();\n await this.exec(c);\n }\n\n private async exec(c: Command): Promise<void> {\n try {\n this.emit('run', c);\n await c.handler?.({ palette: this, command: c });\n } catch (err) {\n this.emit('error', err);\n }\n }\n}\nregister('commandpalette', CommandPalette);\n"],
5
- "mappings": "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",
6
- "names": ["addMessages", "isMac", "matchesKey", "e", "spec", "parts", "key", "has", "m", "mac", "subsequence", "text", "q", "i", "ch", "score", "c", "query", "title", "rest", "total", "w", "at", "s", "marked", "words", "lower", "spans", "a", "b", "out", "pos", "h", "x", "CommandPalette", "Component", "config", "t", "iconEl", "el", "list", "cmd", "id", "toLayer", "lockModal", "trapFocus", "f", "pool", "order", "rank", "lvl", "searching", "rows", "group", "item", "cats", "chip", "label", "cat", "row", "scroll", "on", "n", "kids", "err", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as m}from"./chunk-W3H7GTJY.js";import{f as u}from"./chunk-PZSHOSOS.js";import{a as o}from"./chunk-TIPK3SCJ.js";import{d as a,f as n}from"./chunk-MW3RWBZ7.js";var l=class extends m{baseCls="op-field op-textfield op-numberfield";garbage=!1;emptyValue(){return null}isEmpty(e){return e==null}get decimalSep(){return a()._lang.startsWith("pt")?",":"."}parse(e){this.garbage=!1;let t=e.trim();if(!t)return null;let r=Number(this.decimalSep===","?t.replace(/\./g,"").replace(",","."):t.replace(/,/g,""));return Number.isNaN(r)?(this.garbage=!0,null):r}display(e){if(e==null)return"";let t=this.config.decimals;return(t==null?String(e):e.toFixed(t)).replace(".",this.decimalSep)}createControl(){let e=super.createControl(),t=this.input;return t.setAttribute("inputmode","decimal"),t.setAttribute("role","spinbutton"),this.syncAria(),this.listen(t,"blur",()=>{this.garbage||(this.input.value=this.display(this.value))}),e}syncAria(){let{min:e,max:t}=this.config,r=this.inputEl;e!=null?r.setAttribute("aria-valuemin",String(e)):r.removeAttribute("aria-valuemin"),t!=null?r.setAttribute("aria-valuemax",String(t)):r.removeAttribute("aria-valuemax"),this.value!=null?r.setAttribute("aria-valuenow",String(this.value)):r.removeAttribute("aria-valuenow")}onInput(){super.onInput(),this.syncAria(),this.garbage?this.setError(n("number")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1,this.syncAria()}check(){if(this.garbage)return n("number");let e=super.check(),t=this.value,{min:r,max:i}=this.config;return e||t==null?e:r!=null&&i!=null&&(t<r||t>i)?n("range",{min:r,max:i}):r!=null&&t<r?n("min",{n:r}):i!=null&&t>i?n("max",{n:i}):""}onKey(e){let t=e.key==="PageUp"||e.key==="PageDown";e.key==="ArrowUp"||e.key==="ArrowDown"||t?(e.preventDefault(),this.bump((e.key.endsWith("Up")?1:-1)*(t?10:1))):super.onKey(e)}bump(e){let{step:t=1,min:r,max:i,decimals:p}=this.config,s=(this.value??0)+t*e;(r!=null||i!=null)&&(s=u(s,r??-1/0,i??1/0)),s=Number(s.toFixed(p??10)),this.setValue(s)}increment(){this.bump(1)}decrement(){this.bump(-1)}setMin(e){this.config.min=e,this.rendered&&this.syncAria()}setMax(e){this.config.max=e,this.rendered&&this.syncAria()}setStep(e){this.config.step=e}setDecimals(e){this.config.decimals=e,this.rendered&&(this.input.value=this.display(this.value))}};o("numberfield",l);export{l as a};
2
- //# sourceMappingURL=chunk-7KMIFXHZ.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/fields/numberfield/numberfield.ts"],
4
- "sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { t, getLocale } from '../../../core/i18n';\nimport { clamp } from '../../../core/dom';\n\nexport interface NumberFieldConfig extends TextFieldConfig<number | null> {\n min?: number;\n max?: number;\n step?: number;\n /** Fixed decimals shown (and applied when the user leaves the field). */\n decimals?: number;\n}\n\nexport class NumberField extends TextField<number | null, NumberFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-numberfield';\n /** Text that is not a number: reported as an error instead of silently dropped. */\n private garbage = false;\n\n protected override emptyValue() {\n return null;\n }\n protected override isEmpty(v: number | null) {\n return v == null;\n }\n\n private get decimalSep() {\n return getLocale()._lang.startsWith('pt') ? ',' : '.';\n }\n\n protected override parse(text: string): number | null {\n this.garbage = false;\n const s = text.trim();\n if (!s) return null;\n const n = Number(this.decimalSep === ',' ? s.replace(/\\./g, '').replace(',', '.') : s.replace(/,/g, ''));\n if (Number.isNaN(n)) {\n this.garbage = true;\n return null;\n }\n return n;\n }\n\n protected override display(v: number | null): string {\n if (v == null) return '';\n const d = this.config.decimals;\n return (d == null ? String(v) : v.toFixed(d)).replace('.', this.decimalSep);\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const i = this.input;\n i.setAttribute('inputmode', 'decimal');\n i.setAttribute('role', 'spinbutton');\n this.syncAria();\n // on blur the text is normalized to the configured decimals\n this.listen(i, 'blur', () => {\n if (!this.garbage) this.input.value = this.display(this.value);\n });\n return wrap;\n }\n\n private syncAria() {\n const { min, max } = this.config;\n const i = this.inputEl;\n if (min != null) i.setAttribute('aria-valuemin', String(min)); else i.removeAttribute('aria-valuemin');\n if (max != null) i.setAttribute('aria-valuemax', String(max)); else i.removeAttribute('aria-valuemax');\n if (this.value != null) i.setAttribute('aria-valuenow', String(this.value)); else i.removeAttribute('aria-valuenow');\n }\n\n protected override onInput() {\n super.onInput();\n this.syncAria();\n if (this.garbage) this.setError(t('number'));\n else if (this.error) this.validate();\n }\n protected override applyValue(v: number | null) {\n super.applyValue(v);\n this.garbage = false;\n this.syncAria();\n }\n\n protected override check(): string {\n if (this.garbage) return t('number');\n const base = super.check();\n const v = this.value;\n const { min, max } = this.config;\n if (base || v == null) return base;\n if (min != null && max != null && (v < min || v > max)) return t('range', { min, max });\n if (min != null && v < min) return t('min', { n: min });\n if (max != null && v > max) return t('max', { n: max });\n return '';\n }\n\n protected override onKey(e: KeyboardEvent) {\n const big = e.key === 'PageUp' || e.key === 'PageDown';\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown' || big) {\n e.preventDefault();\n this.bump((e.key.endsWith('Up') ? 1 : -1) * (big ? 10 : 1));\n } else super.onKey(e);\n }\n\n private bump(times: number) {\n const { step = 1, min, max, decimals } = this.config;\n let n = (this.value ?? 0) + step * times;\n if (min != null || max != null) n = clamp(n, min ?? -Infinity, max ?? Infinity);\n n = Number(n.toFixed(decimals ?? 10));\n this.setValue(n);\n }\n increment() {\n this.bump(1);\n }\n decrement() {\n this.bump(-1);\n }\n\n setMin(min: number | undefined) {\n this.config.min = min;\n if (this.rendered) this.syncAria();\n }\n setMax(max: number | undefined) {\n this.config.max = max;\n if (this.rendered) this.syncAria();\n }\n setStep(step: number) {\n this.config.step = step;\n }\n setDecimals(decimals: number | undefined) {\n this.config.decimals = decimals;\n if (this.rendered) this.input.value = this.display(this.value);\n }\n}\nregister('numberfield', NumberField);\n"],
5
- "mappings": "uKAaO,IAAMA,EAAN,cAA0BC,CAA4C,CACxD,QAAU,uCAErB,QAAU,GAEC,YAAa,CAC9B,OAAO,IACT,CACmB,QAAQC,EAAkB,CAC3C,OAAOA,GAAK,IACd,CAEA,IAAY,YAAa,CACvB,OAAOC,EAAU,EAAE,MAAM,WAAW,IAAI,EAAI,IAAM,GACpD,CAEmB,MAAMC,EAA6B,CACpD,KAAK,QAAU,GACf,IAAMC,EAAID,EAAK,KAAK,EACpB,GAAI,CAACC,EAAG,OAAO,KACf,IAAMC,EAAI,OAAO,KAAK,aAAe,IAAMD,EAAE,QAAQ,MAAO,EAAE,EAAE,QAAQ,IAAK,GAAG,EAAIA,EAAE,QAAQ,KAAM,EAAE,CAAC,EACvG,OAAI,OAAO,MAAMC,CAAC,GAChB,KAAK,QAAU,GACR,MAEFA,CACT,CAEmB,QAAQJ,EAA0B,CACnD,GAAIA,GAAK,KAAM,MAAO,GACtB,IAAMK,EAAI,KAAK,OAAO,SACtB,OAAQA,GAAK,KAAO,OAAOL,CAAC,EAAIA,EAAE,QAAQK,CAAC,GAAG,QAAQ,IAAK,KAAK,UAAU,CAC5E,CAEmB,eAAgB,CACjC,IAAMC,EAAO,MAAM,cAAc,EAC3BC,EAAI,KAAK,MACf,OAAAA,EAAE,aAAa,YAAa,SAAS,EACrCA,EAAE,aAAa,OAAQ,YAAY,EACnC,KAAK,SAAS,EAEd,KAAK,OAAOA,EAAG,OAAQ,IAAM,CACtB,KAAK,UAAS,KAAK,MAAM,MAAQ,KAAK,QAAQ,KAAK,KAAK,EAC/D,CAAC,EACMD,CACT,CAEQ,UAAW,CACjB,GAAM,CAAE,IAAAE,EAAK,IAAAC,CAAI,EAAI,KAAK,OACpBF,EAAI,KAAK,QACXC,GAAO,KAAMD,EAAE,aAAa,gBAAiB,OAAOC,CAAG,CAAC,EAAQD,EAAE,gBAAgB,eAAe,EACjGE,GAAO,KAAMF,EAAE,aAAa,gBAAiB,OAAOE,CAAG,CAAC,EAAQF,EAAE,gBAAgB,eAAe,EACjG,KAAK,OAAS,KAAMA,EAAE,aAAa,gBAAiB,OAAO,KAAK,KAAK,CAAC,EAAQA,EAAE,gBAAgB,eAAe,CACrH,CAEmB,SAAU,CAC3B,MAAM,QAAQ,EACd,KAAK,SAAS,EACV,KAAK,QAAS,KAAK,SAASG,EAAE,QAAQ,CAAC,EAClC,KAAK,OAAO,KAAK,SAAS,CACrC,CACmB,WAAWV,EAAkB,CAC9C,MAAM,WAAWA,CAAC,EAClB,KAAK,QAAU,GACf,KAAK,SAAS,CAChB,CAEmB,OAAgB,CACjC,GAAI,KAAK,QAAS,OAAOU,EAAE,QAAQ,EACnC,IAAMC,EAAO,MAAM,MAAM,EACnBX,EAAI,KAAK,MACT,CAAE,IAAAQ,EAAK,IAAAC,CAAI,EAAI,KAAK,OAC1B,OAAIE,GAAQX,GAAK,KAAaW,EAC1BH,GAAO,MAAQC,GAAO,OAAST,EAAIQ,GAAOR,EAAIS,GAAaC,EAAE,QAAS,CAAE,IAAAF,EAAK,IAAAC,CAAI,CAAC,EAClFD,GAAO,MAAQR,EAAIQ,EAAYE,EAAE,MAAO,CAAE,EAAGF,CAAI,CAAC,EAClDC,GAAO,MAAQT,EAAIS,EAAYC,EAAE,MAAO,CAAE,EAAGD,CAAI,CAAC,EAC/C,EACT,CAEmB,MAAM,EAAkB,CACzC,IAAMG,EAAM,EAAE,MAAQ,UAAY,EAAE,MAAQ,WACxC,EAAE,MAAQ,WAAa,EAAE,MAAQ,aAAeA,GAClD,EAAE,eAAe,EACjB,KAAK,MAAM,EAAE,IAAI,SAAS,IAAI,EAAI,EAAI,KAAOA,EAAM,GAAK,EAAE,GACrD,MAAM,MAAM,CAAC,CACtB,CAEQ,KAAKC,EAAe,CAC1B,GAAM,CAAE,KAAAC,EAAO,EAAG,IAAAN,EAAK,IAAAC,EAAK,SAAAM,CAAS,EAAI,KAAK,OAC1CX,GAAK,KAAK,OAAS,GAAKU,EAAOD,GAC/BL,GAAO,MAAQC,GAAO,QAAML,EAAIY,EAAMZ,EAAGI,GAAO,KAAWC,GAAO,GAAQ,GAC9EL,EAAI,OAAOA,EAAE,QAAQW,GAAY,EAAE,CAAC,EACpC,KAAK,SAASX,CAAC,CACjB,CACA,WAAY,CACV,KAAK,KAAK,CAAC,CACb,CACA,WAAY,CACV,KAAK,KAAK,EAAE,CACd,CAEA,OAAOI,EAAyB,CAC9B,KAAK,OAAO,IAAMA,EACd,KAAK,UAAU,KAAK,SAAS,CACnC,CACA,OAAOC,EAAyB,CAC9B,KAAK,OAAO,IAAMA,EACd,KAAK,UAAU,KAAK,SAAS,CACnC,CACA,QAAQK,EAAc,CACpB,KAAK,OAAO,KAAOA,CACrB,CACA,YAAYC,EAA8B,CACxC,KAAK,OAAO,SAAWA,EACnB,KAAK,WAAU,KAAK,MAAM,MAAQ,KAAK,QAAQ,KAAK,KAAK,EAC/D,CACF,EACAE,EAAS,cAAenB,CAAW",
6
- "names": ["NumberField", "TextField", "v", "getLocale", "text", "s", "n", "d", "wrap", "i", "min", "max", "t", "base", "big", "times", "step", "decimals", "clamp", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{b as s,c as l,d as r,e as n}from"./chunk-PZSHOSOS.js";import{a as d,f as h}from"./chunk-MW3RWBZ7.js";var a=class extends d{static type;config;id;parent;rendered=!1;mounted=!1;destroyed=!1;baseCls="op-component";tag="div";_el;disposers=[];mask;constructor(e={}){super(),this.config={...e},this.id=e.id??l("op");for(let t in e.listeners)this.on(t,e.listeners[t])}get el(){return this._el??this.render()}build(){return s(this.tag,this.baseCls)}onRender(){}onMount(){}onDestroy(){}render(){if(this._el)return this._el;let e=this._el=this.build();this.rendered=!0;let t=this.config;if(e.id=this.id,t.cls&&e.classList.add(...t.cls.split(/\s+/).filter(Boolean)),typeof t.style=="string")e.style.cssText+=t.style;else if(t.style)for(let i in t.style)e.style.setProperty(r(i),String(t.style[i]));return t.width!=null&&(e.style.width=n(t.width)),t.height!=null&&(e.style.height=n(t.height)),t.flex!=null&&(e.style.flex=String(t.flex)),t.ariaLabel&&e.setAttribute("aria-label",t.ariaLabel),this.setStableSize(t.stableSize!==!1),t.hidden&&(e.hidden=!0),t.tooltip&&(e.dataset.opTip=t.tooltip),t.theme&&this.setTheme(t.theme),this.onRender(),t.disabled&&this.setDisabled(!0),t.loading&&this.setLoading(t.loading),e}mount(e=document.body){let t=typeof e=="string"?document.querySelector(e):e;if(!t)throw new Error(`Optikos: mount target not found: ${String(e)}`);return t.appendChild(this.el),this.notifyMount(),this}notifyMount(){this.mounted||this.destroyed||(this.mounted=!0,this.onMount(),this.emit("mount"))}destroy(){if(!this.destroyed){this.destroyed=!0,this.onDestroy();for(let e of this.disposers.splice(0).reverse())e();this.parent?.remove(this,!1),this.parent=void 0,this._el?.remove(),this.emit("destroy"),this.clearListeners()}}own(e){return this.disposers.push(e),e}listen(e,t,i,o){return e.addEventListener(t,i,o),this.own(()=>e.removeEventListener(t,i,o))}later(e,t){let i=setTimeout(e,t);return this.own(()=>clearTimeout(i))}onDisabled(e){}setDisabled(e){this.config.disabled=e,this.rendered&&(this.el.classList.toggle("is-disabled",e),this.onDisabled(e))}show(){this.config.hidden=!1,this.rendered&&(this.el.hidden=!1),this.emit("show")}hide(){this.config.hidden=!0,this.rendered&&(this.el.hidden=!0),this.emit("hide")}isHidden(){return!!this.config.hidden}addCls(e){this.el.classList.add(e)}removeCls(e){this.el.classList.remove(e)}toggleCls(e,t){this.el.classList.toggle(e,t)}setWidth(e){this.config.width=e,this.rendered&&(this.el.style.width=n(e))}setHeight(e){this.config.height=e,this.rendered&&(this.el.style.height=n(e))}setFlex(e){this.config.flex=e,this.rendered&&(this.el.style.flex=String(e))}setStableSize(e){this.config.stableSize=e,this.rendered&&this.el.classList.toggle("op-stable",e)}setTooltip(e){this.config.tooltip=e,this.rendered&&(e?this.el.dataset.opTip=e:delete this.el.dataset.opTip)}setTheme(e){let t="--"+this.baseCls+"-";for(let i in e)this.el.style.setProperty(i.startsWith("--")?i:t+r(i),String(e[i]))}setLoading(e){if(this.config.loading=e,!this.rendered)return;let t=this.el;this.mask?.remove(),this.mask=void 0,t.classList.toggle("is-loading",!!e),e?t.setAttribute("aria-busy","true"):t.removeAttribute("aria-busy"),e&&(this.mask=s("div","op-mask",{},s("span","op-spinner",{role:"progressbar","aria-label":h("loading")}),typeof e=="string"?s("div","op-mask__text",{},e):null),t.append(this.mask));for(let i of Array.from(t.children))i!==this.mask&&i.toggleAttribute("inert",!!e)}focusEl(){return this.el}focus(){this.focusEl().focus()}};export{a};
2
- //# sourceMappingURL=chunk-A2NKDOYN.js.map