optikos 0.3.0 → 0.5.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 (466) hide show
  1. package/CHANGELOG.md +58 -1
  2. package/dist/bind.js +1 -1
  3. package/dist/bind.js.map +4 -4
  4. package/dist/build.js +2 -0
  5. package/dist/build.js.map +7 -0
  6. package/dist/chunk-2CVMT3IW.js +3 -0
  7. package/dist/chunk-2CVMT3IW.js.map +7 -0
  8. package/dist/{chunk-5JEXM5S7.js → chunk-2GKIF7A6.js} +2 -2
  9. package/dist/{chunk-5BC72727.js → chunk-2I4Y7I7C.js} +2 -2
  10. package/dist/{chunk-Z2Z52GFT.js → chunk-2I7HDIOU.js} +2 -2
  11. package/dist/chunk-2QMI2RRB.js +2 -0
  12. package/dist/chunk-2QMI2RRB.js.map +7 -0
  13. package/dist/chunk-34KVSA2V.js +3 -0
  14. package/dist/chunk-34KVSA2V.js.map +7 -0
  15. package/dist/chunk-37PYJAA2.js +2 -0
  16. package/dist/{chunk-UXXJOU5J.js.map → chunk-37PYJAA2.js.map} +1 -1
  17. package/dist/{chunk-ZPPELYNJ.js → chunk-3BG75P7T.js} +2 -2
  18. package/dist/{chunk-GNU4VOOE.js → chunk-3F4MN2BU.js} +2 -2
  19. package/dist/{chunk-5DJTP53N.js → chunk-3FK52VQX.js} +2 -2
  20. package/dist/chunk-3OA3P37P.js +2 -0
  21. package/dist/chunk-3OA3P37P.js.map +7 -0
  22. package/dist/chunk-3TCITFUU.js +2 -0
  23. package/dist/chunk-3TCITFUU.js.map +7 -0
  24. package/dist/chunk-3VDLX7ET.js +2 -0
  25. package/dist/chunk-3VDLX7ET.js.map +7 -0
  26. package/dist/{chunk-REW4LR46.js → chunk-4OB2IM5L.js} +2 -2
  27. package/dist/chunk-5G5PHOZJ.js +2 -0
  28. package/dist/chunk-5G5PHOZJ.js.map +7 -0
  29. package/dist/{chunk-EDUMAMK4.js → chunk-5GCTM37D.js} +2 -2
  30. package/dist/chunk-5PYJ6FJK.js +2 -0
  31. package/dist/chunk-5PYJ6FJK.js.map +7 -0
  32. package/dist/chunk-632LUU52.js +2 -0
  33. package/dist/chunk-632LUU52.js.map +7 -0
  34. package/dist/{chunk-JOFQJGZK.js → chunk-6BOM5KZR.js} +2 -2
  35. package/dist/{chunk-Z2JBUHKA.js → chunk-6NP4AEV4.js} +2 -2
  36. package/dist/chunk-6PPRYSLN.js +2 -0
  37. package/dist/chunk-6PPRYSLN.js.map +7 -0
  38. package/dist/{chunk-NXSTUFS7.js → chunk-6TZJO2G2.js} +2 -2
  39. package/dist/chunk-7Y2GHQRB.js +2 -0
  40. package/dist/chunk-A36JFIA3.js +2 -0
  41. package/dist/chunk-A36JFIA3.js.map +7 -0
  42. package/dist/{chunk-G2KUK6AT.js → chunk-ADHKL2GM.js} +2 -2
  43. package/dist/{chunk-JI265XFO.js → chunk-AJN66F32.js} +2 -2
  44. package/dist/{chunk-YHEMA56R.js → chunk-AQ3RTHG5.js} +2 -2
  45. package/dist/{chunk-ZVK4L5GK.js → chunk-BCVOUMJJ.js} +2 -2
  46. package/dist/{chunk-HOF4JGMQ.js → chunk-BIGL3ZVD.js} +2 -2
  47. package/dist/{chunk-ZWNQREWS.js → chunk-BQEFLPDA.js} +2 -2
  48. package/dist/{chunk-ZWNQREWS.js.map → chunk-BQEFLPDA.js.map} +2 -2
  49. package/dist/{chunk-HXDTGP2K.js → chunk-BRGT4O6Q.js} +2 -2
  50. package/dist/{chunk-OGRFQTXA.js → chunk-BTGJ3MP4.js} +2 -2
  51. package/dist/{chunk-TOLTUOZS.js → chunk-CWIE74NX.js} +2 -2
  52. package/dist/{chunk-M242VYZA.js → chunk-CXZKCBQE.js} +2 -2
  53. package/dist/{chunk-4EZJ5FKJ.js → chunk-DIOJGTUN.js} +2 -2
  54. package/dist/chunk-DJUSVBD5.js +2 -0
  55. package/dist/chunk-DJUSVBD5.js.map +7 -0
  56. package/dist/chunk-DLRGB5NY.js +2 -0
  57. package/dist/chunk-DLRGB5NY.js.map +7 -0
  58. package/dist/chunk-DY3ZYMXD.js +2 -0
  59. package/dist/chunk-DY3ZYMXD.js.map +7 -0
  60. package/dist/chunk-EO777UIN.js +2 -0
  61. package/dist/chunk-EO777UIN.js.map +7 -0
  62. package/dist/chunk-ESCLDVFS.js +2 -0
  63. package/dist/{chunk-YBAYEU25.js.map → chunk-ESCLDVFS.js.map} +1 -1
  64. package/dist/{chunk-2ZUZ5HDL.js → chunk-ESRS5ZQV.js} +2 -2
  65. package/dist/{chunk-RNN55473.js → chunk-FNZI6MFG.js} +2 -2
  66. package/dist/{chunk-RNN55473.js.map → chunk-FNZI6MFG.js.map} +1 -1
  67. package/dist/{chunk-JK74QK3M.js → chunk-FSR6BDVO.js} +2 -2
  68. package/dist/{chunk-6VBK2I5B.js → chunk-G26R2F3W.js} +2 -2
  69. package/dist/{chunk-G2DAD3MQ.js → chunk-GEJKFE4X.js} +2 -2
  70. package/dist/chunk-GFJRGBQR.js +2 -0
  71. package/dist/chunk-GFJRGBQR.js.map +7 -0
  72. package/dist/chunk-GLAY4RJF.js +2 -0
  73. package/dist/chunk-GLAY4RJF.js.map +7 -0
  74. package/dist/chunk-GNKVLJ5H.js +2 -0
  75. package/dist/chunk-GNKVLJ5H.js.map +7 -0
  76. package/dist/chunk-GZIDE5K2.js +2 -0
  77. package/dist/chunk-GZIDE5K2.js.map +7 -0
  78. package/dist/{chunk-5Q76ACVI.js → chunk-H25XXQVH.js} +2 -2
  79. package/dist/chunk-HG7OOHGD.js +2 -0
  80. package/dist/chunk-HG7OOHGD.js.map +7 -0
  81. package/dist/chunk-HRW25TMU.js +2 -0
  82. package/dist/chunk-HX6TWXTX.js +2 -0
  83. package/dist/chunk-HX6TWXTX.js.map +7 -0
  84. package/dist/chunk-I5A74NMJ.js +2 -0
  85. package/dist/chunk-I5A74NMJ.js.map +7 -0
  86. package/dist/chunk-IODSL7KU.js +2 -0
  87. package/dist/chunk-IODSL7KU.js.map +7 -0
  88. package/dist/chunk-J2TCHWYD.js +2 -0
  89. package/dist/chunk-J2TCHWYD.js.map +7 -0
  90. package/dist/chunk-J5BZAKC6.js +2 -0
  91. package/dist/chunk-J5BZAKC6.js.map +7 -0
  92. package/dist/chunk-JBOKM5YA.js +2 -0
  93. package/dist/{chunk-KLLAY2IM.js.map → chunk-JBOKM5YA.js.map} +2 -2
  94. package/dist/chunk-L5SQQFO7.js +2 -0
  95. package/dist/chunk-L5SQQFO7.js.map +7 -0
  96. package/dist/chunk-L6DOWGBO.js +2 -0
  97. package/dist/chunk-L6DOWGBO.js.map +7 -0
  98. package/dist/{chunk-W3H7GTJY.js → chunk-LHWY6G6Q.js} +2 -2
  99. package/dist/chunk-LLHDEUIA.js +2 -0
  100. package/dist/chunk-LLHDEUIA.js.map +7 -0
  101. package/dist/chunk-LXWCTCZV.js +2 -0
  102. package/dist/chunk-LXWCTCZV.js.map +7 -0
  103. package/dist/chunk-M2ZRKHE4.js +2 -0
  104. package/dist/chunk-M2ZRKHE4.js.map +7 -0
  105. package/dist/{chunk-Q26YZYTD.js → chunk-M7HLHGQV.js} +2 -2
  106. package/dist/{chunk-IHE2MQ3W.js → chunk-MGSCSS7X.js} +2 -2
  107. package/dist/chunk-MM2OC66E.js +4 -0
  108. package/dist/{chunk-XX2MVWFS.js.map → chunk-MM2OC66E.js.map} +1 -1
  109. package/dist/{chunk-DBMWS3O5.js → chunk-MQ5BYGFY.js} +2 -2
  110. package/dist/chunk-MQEALOU3.js +3 -0
  111. package/dist/chunk-MQEALOU3.js.map +7 -0
  112. package/dist/chunk-NAUSRVB6.js +2 -0
  113. package/dist/chunk-NAUSRVB6.js.map +7 -0
  114. package/dist/chunk-NEVDHDJ4.js +3 -0
  115. package/dist/chunk-NEVDHDJ4.js.map +7 -0
  116. package/dist/{chunk-5QUY72FX.js → chunk-NWHH3CYH.js} +2 -2
  117. package/dist/chunk-OADWLPSF.js +2 -0
  118. package/dist/chunk-OADWLPSF.js.map +7 -0
  119. package/dist/{chunk-3TAW4AKH.js → chunk-OB3VIRQR.js} +2 -2
  120. package/dist/{chunk-MB3MU6HR.js → chunk-PGVLRMTQ.js} +2 -2
  121. package/dist/chunk-Q6FY4L2F.js +2 -0
  122. package/dist/chunk-Q6FY4L2F.js.map +7 -0
  123. package/dist/{chunk-TZOQWCVH.js → chunk-QOSTS5I3.js} +2 -2
  124. package/dist/chunk-QVBDBGS4.js +2 -0
  125. package/dist/chunk-QVBDBGS4.js.map +7 -0
  126. package/dist/{chunk-3S24ZRPK.js → chunk-RMATRKXV.js} +2 -2
  127. package/dist/{chunk-I4SP6JTU.js → chunk-S3ILIWSW.js} +2 -2
  128. package/dist/chunk-S4QD5NID.js +2 -0
  129. package/dist/chunk-S4QD5NID.js.map +7 -0
  130. package/dist/{chunk-XHOBNSBO.js → chunk-SEUIIPHS.js} +2 -2
  131. package/dist/{chunk-23XLG2EM.js → chunk-SEW5OCQF.js} +2 -2
  132. package/dist/chunk-T5OGUCY2.js +2 -0
  133. package/dist/chunk-T5OGUCY2.js.map +7 -0
  134. package/dist/chunk-TMBGEZSD.js +2 -0
  135. package/dist/chunk-TMBGEZSD.js.map +7 -0
  136. package/dist/chunk-TVO3Z2BM.js +2 -0
  137. package/dist/chunk-TVO3Z2BM.js.map +7 -0
  138. package/dist/{chunk-LQRFNQ2N.js → chunk-U25QSLAH.js} +2 -2
  139. package/dist/chunk-UCWICDYG.js +2 -0
  140. package/dist/chunk-UCWICDYG.js.map +7 -0
  141. package/dist/chunk-UDXO3KM3.js +2 -0
  142. package/dist/chunk-UDXO3KM3.js.map +7 -0
  143. package/dist/{chunk-FEHGU6EP.js → chunk-UL364TLO.js} +2 -2
  144. package/dist/chunk-UUAGMZD2.js +2 -0
  145. package/dist/chunk-UUAGMZD2.js.map +7 -0
  146. package/dist/chunk-V5G5JECN.js +2 -0
  147. package/dist/chunk-V5G5JECN.js.map +7 -0
  148. package/dist/chunk-XFDNXSU5.js +2 -0
  149. package/dist/chunk-XFDNXSU5.js.map +7 -0
  150. package/dist/{chunk-JBLRAM7Z.js → chunk-XNRZJP4E.js} +2 -2
  151. package/dist/chunk-YJTUFK4P.js +2 -0
  152. package/dist/chunk-YLFSCQL3.js +2 -0
  153. package/dist/chunk-YLFSCQL3.js.map +7 -0
  154. package/dist/chunk-Z6HZY2YG.js +2 -0
  155. package/dist/chunk-Z6HZY2YG.js.map +7 -0
  156. package/dist/chunk-ZEIE2OCQ.js +2 -0
  157. package/dist/chunk-ZEIE2OCQ.js.map +7 -0
  158. package/dist/{chunk-2YZB6XQR.js → chunk-ZLYZFHEN.js} +2 -2
  159. package/dist/components/avatar.js +2 -0
  160. package/dist/components/avatar.js.map +7 -0
  161. package/dist/components/badge.js +1 -1
  162. package/dist/components/breadcrumb.js +1 -1
  163. package/dist/components/button.js +1 -1
  164. package/dist/components/calendar.js +1 -1
  165. package/dist/components/carousel.js +2 -0
  166. package/dist/components/carousel.js.map +7 -0
  167. package/dist/components/cellediting.js +1 -1
  168. package/dist/components/chart.js +2 -0
  169. package/dist/components/chart.js.map +7 -0
  170. package/dist/components/chat.js +1 -1
  171. package/dist/components/checkbox.js +1 -1
  172. package/dist/components/checkboxgroup.js +1 -1
  173. package/dist/components/chip.js +1 -1
  174. package/dist/components/codeviewer.js +1 -1
  175. package/dist/components/columntotals.js +2 -0
  176. package/dist/components/columntotals.js.map +7 -0
  177. package/dist/components/combobox.js +1 -1
  178. package/dist/components/commandpalette.js +1 -1
  179. package/dist/components/container.js +1 -1
  180. package/dist/components/dataview.js +1 -1
  181. package/dist/components/datefield.js +1 -1
  182. package/dist/components/daterangefield.js +1 -1
  183. package/dist/components/datetimefield.js +2 -0
  184. package/dist/components/datetimefield.js.map +7 -0
  185. package/dist/components/dial.js +1 -1
  186. package/dist/components/dropdown.js +1 -1
  187. package/dist/components/exportbar.js +2 -0
  188. package/dist/components/exportbar.js.map +7 -0
  189. package/dist/components/fieldgroup.js +1 -1
  190. package/dist/components/fieldlist.js +1 -1
  191. package/dist/components/fieldset.js +1 -1
  192. package/dist/components/filterbuilder.js +1 -1
  193. package/dist/components/form.js +1 -1
  194. package/dist/components/formactions.js +1 -1
  195. package/dist/components/formerrors.js +1 -1
  196. package/dist/components/formsection.js +1 -1
  197. package/dist/components/grid.js +1 -1
  198. package/dist/components/gridexport.js +2 -0
  199. package/dist/components/gridexport.js.map +7 -0
  200. package/dist/components/gridstate.js +2 -0
  201. package/dist/components/gridstate.js.map +7 -0
  202. package/dist/components/grouping.js +2 -0
  203. package/dist/components/grouping.js.map +7 -0
  204. package/dist/components/icon.js +1 -1
  205. package/dist/components/image.js +2 -0
  206. package/dist/components/image.js.map +7 -0
  207. package/dist/components/imagecanvas.js +2 -0
  208. package/dist/components/imagecanvas.js.map +7 -0
  209. package/dist/components/imagefield.js +2 -0
  210. package/dist/components/imagefield.js.map +7 -0
  211. package/dist/components/inputgroup.js +1 -1
  212. package/dist/components/label.js +1 -1
  213. package/dist/components/listbox.js +1 -1
  214. package/dist/components/lookupfield.js +1 -1
  215. package/dist/components/maskfield.js +2 -0
  216. package/dist/components/maskfield.js.map +7 -0
  217. package/dist/components/menu.js +1 -1
  218. package/dist/components/messagebox.js +1 -1
  219. package/dist/components/navmenu.js +1 -1
  220. package/dist/components/numberfield.js +1 -1
  221. package/dist/components/pagination.js +1 -1
  222. package/dist/components/panel.js +1 -1
  223. package/dist/components/pickerfield.js +1 -1
  224. package/dist/components/radiogroup.js +1 -1
  225. package/dist/components/rowediting.js +2 -0
  226. package/dist/components/rowediting.js.map +7 -0
  227. package/dist/components/searchgrid.js +1 -1
  228. package/dist/components/secretfield.js +1 -1
  229. package/dist/components/select.js +1 -1
  230. package/dist/components/shortcuts.js +2 -0
  231. package/dist/components/shortcuts.js.map +7 -0
  232. package/dist/components/slider.js +1 -1
  233. package/dist/components/spacer.js +1 -1
  234. package/dist/components/spinner.js +1 -1
  235. package/dist/components/stat.js +2 -0
  236. package/dist/components/stat.js.map +7 -0
  237. package/dist/components/stepform.js +1 -1
  238. package/dist/components/stepper.js +1 -1
  239. package/dist/components/suggestfield.js +1 -1
  240. package/dist/components/table.js +1 -1
  241. package/dist/components/tabs.js +1 -1
  242. package/dist/components/textarea.js +1 -1
  243. package/dist/components/textfield.js +1 -1
  244. package/dist/components/timeentry.js +2 -0
  245. package/dist/components/timeentry.js.map +7 -0
  246. package/dist/components/timefield.js +2 -0
  247. package/dist/components/timefield.js.map +7 -0
  248. package/dist/components/timeline.js +2 -0
  249. package/dist/components/timeline.js.map +7 -0
  250. package/dist/components/toast.js +1 -1
  251. package/dist/components/toggle.js +1 -1
  252. package/dist/components/toolbar.js +1 -1
  253. package/dist/components/tree.js +1 -1
  254. package/dist/components/treegrid.js +2 -0
  255. package/dist/components/treegrid.js.map +7 -0
  256. package/dist/components/viewmanager.js +1 -1
  257. package/dist/components/viewport.js +1 -1
  258. package/dist/components/widget.js +1 -1
  259. package/dist/components/window.js +1 -1
  260. package/dist/core.js +1 -1
  261. package/dist/css/avatar.css +68 -0
  262. package/dist/css/base.css +9 -0
  263. package/dist/css/carousel.css +119 -0
  264. package/dist/css/chart.css +168 -0
  265. package/dist/css/columntotals.css +56 -0
  266. package/dist/css/core.css +36 -0
  267. package/dist/css/datetimefield.css +15 -0
  268. package/dist/css/exportbar.css +9 -0
  269. package/dist/css/grid.css +52 -0
  270. package/dist/css/gridexport.css +35 -0
  271. package/dist/css/grouping.css +56 -0
  272. package/dist/css/image.css +46 -0
  273. package/dist/css/imagecanvas.css +75 -0
  274. package/dist/css/imagefield.css +103 -0
  275. package/dist/css/rowediting.css +39 -0
  276. package/dist/css/shortcuts.css +34 -0
  277. package/dist/css/stat.css +64 -0
  278. package/dist/css/stepform.css +1 -0
  279. package/dist/css/timeentry.css +116 -0
  280. package/dist/css/timeline.css +185 -0
  281. package/dist/css/treegrid.css +35 -0
  282. package/dist/css/window.css +2 -2
  283. package/dist/data.js +1 -1
  284. package/dist/dev.js +2 -0
  285. package/dist/dev.js.map +7 -0
  286. package/dist/index.js +16 -5
  287. package/dist/index.js.map +4 -4
  288. package/dist/optikos.css +1480 -142
  289. package/dist/testing.js +2 -0
  290. package/dist/testing.js.map +7 -0
  291. package/dist/themes/dark.css +7 -0
  292. package/dist/types/bind/index.d.ts +1 -1
  293. package/dist/types/bind/viewmodel.d.ts +33 -0
  294. package/dist/types/build/build.d.ts +49 -0
  295. package/dist/types/build/index.d.ts +1 -0
  296. package/dist/types/components/avatar.d.ts +1 -0
  297. package/dist/types/components/base/avatar/avatar.d.ts +22 -0
  298. package/dist/types/components/base/image/image.d.ts +25 -0
  299. package/dist/types/components/base/imagecanvas/imagecanvas.d.ts +39 -0
  300. package/dist/types/components/carousel.d.ts +1 -0
  301. package/dist/types/components/chart.d.ts +1 -0
  302. package/dist/types/components/charts/chart/chart.d.ts +64 -0
  303. package/dist/types/components/charts/stat/stat.d.ts +34 -0
  304. package/dist/types/components/columntotals.d.ts +1 -0
  305. package/dist/types/components/data/cellediting/cellediting.d.ts +3 -0
  306. package/dist/types/components/data/columntotals/columntotals.d.ts +24 -0
  307. package/dist/types/components/data/exportbar/exportbar.d.ts +24 -0
  308. package/dist/types/components/data/grid/footer.d.ts +6 -0
  309. package/dist/types/components/data/grid/grid.d.ts +37 -0
  310. package/dist/types/components/data/gridexport/gridexport.d.ts +29 -0
  311. package/dist/types/components/data/gridstate/gridstate.d.ts +23 -0
  312. package/dist/types/components/data/grouping/controls.d.ts +27 -0
  313. package/dist/types/components/data/grouping/grouping.d.ts +43 -0
  314. package/dist/types/components/data/rowediting/rowediting.d.ts +13 -0
  315. package/dist/types/components/data/searchgrid/searchgrid.d.ts +9 -2
  316. package/dist/types/components/data/timeentry/timeentry.d.ts +37 -0
  317. package/dist/types/components/data/timeline/timeline.d.ts +63 -0
  318. package/dist/types/components/data/treegrid/treegrid.d.ts +32 -0
  319. package/dist/types/components/datetimefield.d.ts +1 -0
  320. package/dist/types/components/exportbar.d.ts +1 -0
  321. package/dist/types/components/fields/datetimefield/datetimefield.d.ts +28 -0
  322. package/dist/types/components/fields/imagefield/imagefield.d.ts +48 -0
  323. package/dist/types/components/fields/maskfield/maskfield.d.ts +28 -0
  324. package/dist/types/components/fields/numberfield/numberfield.d.ts +9 -0
  325. package/dist/types/components/fields/pickerfield/pickerfield.d.ts +3 -0
  326. package/dist/types/components/fields/timefield/timefield.d.ts +24 -0
  327. package/dist/types/components/form/fieldlist/fieldlist.d.ts +2 -0
  328. package/dist/types/components/form/form/form.d.ts +5 -0
  329. package/dist/types/components/form/stepform/stepform.d.ts +1 -1
  330. package/dist/types/components/gridexport.d.ts +1 -0
  331. package/dist/types/components/gridstate.d.ts +1 -0
  332. package/dist/types/components/grouping.d.ts +1 -0
  333. package/dist/types/components/image.d.ts +1 -0
  334. package/dist/types/components/imagecanvas.d.ts +1 -0
  335. package/dist/types/components/imagefield.d.ts +1 -0
  336. package/dist/types/components/layout/carousel/carousel.d.ts +58 -0
  337. package/dist/types/components/maskfield.d.ts +1 -0
  338. package/dist/types/components/navigation/navmenu/navmenu.d.ts +2 -0
  339. package/dist/types/components/overlays/commandpalette/commandpalette.d.ts +2 -0
  340. package/dist/types/components/overlays/menu/menu.d.ts +4 -1
  341. package/dist/types/components/overlays/shortcuts/shortcuts.d.ts +27 -0
  342. package/dist/types/components/overlays/window/window.d.ts +14 -1
  343. package/dist/types/components/rowediting.d.ts +1 -0
  344. package/dist/types/components/shortcuts.d.ts +1 -0
  345. package/dist/types/components/stat.d.ts +1 -0
  346. package/dist/types/components/timeentry.d.ts +1 -0
  347. package/dist/types/components/timefield.d.ts +1 -0
  348. package/dist/types/components/timeline.d.ts +1 -0
  349. package/dist/types/components/treegrid.d.ts +1 -0
  350. package/dist/types/core/component.d.ts +7 -0
  351. package/dist/types/core/container.d.ts +10 -1
  352. package/dist/types/core/dev.d.ts +2 -0
  353. package/dist/types/core/field.d.ts +4 -0
  354. package/dist/types/core/i18n.d.ts +2 -0
  355. package/dist/types/core/index.d.ts +4 -1
  356. package/dist/types/core/path.d.ts +2 -0
  357. package/dist/types/core/permission.d.ts +11 -0
  358. package/dist/types/core/state.d.ts +9 -0
  359. package/dist/types/data/column.d.ts +11 -1
  360. package/dist/types/data/index.d.ts +1 -1
  361. package/dist/types/data/model.d.ts +2 -0
  362. package/dist/types/data/store.d.ts +21 -0
  363. package/dist/types/dev/index.d.ts +2 -0
  364. package/dist/types/dev/keys.d.ts +1 -0
  365. package/dist/types/index.d.ts +21 -0
  366. package/dist/types/testing/index.d.ts +25 -0
  367. package/dist/types/themes/color.d.ts +14 -0
  368. package/dist/types/themes/contrast.d.ts +15 -0
  369. package/dist/types/themes/define.d.ts +25 -3
  370. package/dist/types/themes/index.d.ts +3 -1
  371. package/dist/types/themes/seeds.d.ts +11 -0
  372. package/dist/types/ui/ui.d.ts +6 -0
  373. package/dist/ui.js +1 -1
  374. package/package.json +13 -1
  375. package/dist/chunk-2ZRNGG2N.js +0 -2
  376. package/dist/chunk-2ZRNGG2N.js.map +0 -7
  377. package/dist/chunk-4EQEHJB3.js +0 -2
  378. package/dist/chunk-4EQEHJB3.js.map +0 -7
  379. package/dist/chunk-4LZZ244E.js +0 -2
  380. package/dist/chunk-4LZZ244E.js.map +0 -7
  381. package/dist/chunk-4SYIIX5A.js +0 -2
  382. package/dist/chunk-4SYIIX5A.js.map +0 -7
  383. package/dist/chunk-7KMIFXHZ.js +0 -2
  384. package/dist/chunk-7KMIFXHZ.js.map +0 -7
  385. package/dist/chunk-A2NKDOYN.js +0 -2
  386. package/dist/chunk-A2NKDOYN.js.map +0 -7
  387. package/dist/chunk-CKXS375P.js +0 -2
  388. package/dist/chunk-CKXS375P.js.map +0 -7
  389. package/dist/chunk-EJGWCKE4.js +0 -2
  390. package/dist/chunk-EJGWCKE4.js.map +0 -7
  391. package/dist/chunk-ELYARUCN.js +0 -2
  392. package/dist/chunk-EV73ADN2.js +0 -2
  393. package/dist/chunk-EV73ADN2.js.map +0 -7
  394. package/dist/chunk-GD5JGKM7.js +0 -2
  395. package/dist/chunk-GD5JGKM7.js.map +0 -7
  396. package/dist/chunk-GZ7X34QP.js +0 -2
  397. package/dist/chunk-KCEUD232.js +0 -2
  398. package/dist/chunk-KCEUD232.js.map +0 -7
  399. package/dist/chunk-KLLAY2IM.js +0 -2
  400. package/dist/chunk-LBJSMXLV.js +0 -2
  401. package/dist/chunk-LBJSMXLV.js.map +0 -7
  402. package/dist/chunk-LW2WRUVL.js +0 -2
  403. package/dist/chunk-LW2WRUVL.js.map +0 -7
  404. package/dist/chunk-MW3RWBZ7.js +0 -2
  405. package/dist/chunk-MW3RWBZ7.js.map +0 -7
  406. package/dist/chunk-OEAXCCVM.js +0 -2
  407. package/dist/chunk-OEAXCCVM.js.map +0 -7
  408. package/dist/chunk-UB5RYS7T.js +0 -2
  409. package/dist/chunk-UB5RYS7T.js.map +0 -7
  410. package/dist/chunk-UXXJOU5J.js +0 -2
  411. package/dist/chunk-VU3GIDZ3.js +0 -2
  412. package/dist/chunk-VU3GIDZ3.js.map +0 -7
  413. package/dist/chunk-W2BAFOCN.js +0 -3
  414. package/dist/chunk-W2BAFOCN.js.map +0 -7
  415. package/dist/chunk-WFGTQZIQ.js +0 -2
  416. package/dist/chunk-WFGTQZIQ.js.map +0 -7
  417. package/dist/chunk-XX2MVWFS.js +0 -4
  418. package/dist/chunk-XYZ6VZ5T.js +0 -2
  419. package/dist/chunk-YBAYEU25.js +0 -2
  420. package/dist/chunk-YF75HKL6.js +0 -2
  421. package/dist/chunk-YF75HKL6.js.map +0 -7
  422. /package/dist/{chunk-5JEXM5S7.js.map → chunk-2GKIF7A6.js.map} +0 -0
  423. /package/dist/{chunk-5BC72727.js.map → chunk-2I4Y7I7C.js.map} +0 -0
  424. /package/dist/{chunk-Z2Z52GFT.js.map → chunk-2I7HDIOU.js.map} +0 -0
  425. /package/dist/{chunk-ZPPELYNJ.js.map → chunk-3BG75P7T.js.map} +0 -0
  426. /package/dist/{chunk-GNU4VOOE.js.map → chunk-3F4MN2BU.js.map} +0 -0
  427. /package/dist/{chunk-5DJTP53N.js.map → chunk-3FK52VQX.js.map} +0 -0
  428. /package/dist/{chunk-REW4LR46.js.map → chunk-4OB2IM5L.js.map} +0 -0
  429. /package/dist/{chunk-EDUMAMK4.js.map → chunk-5GCTM37D.js.map} +0 -0
  430. /package/dist/{chunk-JOFQJGZK.js.map → chunk-6BOM5KZR.js.map} +0 -0
  431. /package/dist/{chunk-Z2JBUHKA.js.map → chunk-6NP4AEV4.js.map} +0 -0
  432. /package/dist/{chunk-NXSTUFS7.js.map → chunk-6TZJO2G2.js.map} +0 -0
  433. /package/dist/{chunk-GZ7X34QP.js.map → chunk-7Y2GHQRB.js.map} +0 -0
  434. /package/dist/{chunk-G2KUK6AT.js.map → chunk-ADHKL2GM.js.map} +0 -0
  435. /package/dist/{chunk-JI265XFO.js.map → chunk-AJN66F32.js.map} +0 -0
  436. /package/dist/{chunk-YHEMA56R.js.map → chunk-AQ3RTHG5.js.map} +0 -0
  437. /package/dist/{chunk-ZVK4L5GK.js.map → chunk-BCVOUMJJ.js.map} +0 -0
  438. /package/dist/{chunk-HOF4JGMQ.js.map → chunk-BIGL3ZVD.js.map} +0 -0
  439. /package/dist/{chunk-HXDTGP2K.js.map → chunk-BRGT4O6Q.js.map} +0 -0
  440. /package/dist/{chunk-OGRFQTXA.js.map → chunk-BTGJ3MP4.js.map} +0 -0
  441. /package/dist/{chunk-TOLTUOZS.js.map → chunk-CWIE74NX.js.map} +0 -0
  442. /package/dist/{chunk-M242VYZA.js.map → chunk-CXZKCBQE.js.map} +0 -0
  443. /package/dist/{chunk-4EZJ5FKJ.js.map → chunk-DIOJGTUN.js.map} +0 -0
  444. /package/dist/{chunk-2ZUZ5HDL.js.map → chunk-ESRS5ZQV.js.map} +0 -0
  445. /package/dist/{chunk-JK74QK3M.js.map → chunk-FSR6BDVO.js.map} +0 -0
  446. /package/dist/{chunk-6VBK2I5B.js.map → chunk-G26R2F3W.js.map} +0 -0
  447. /package/dist/{chunk-G2DAD3MQ.js.map → chunk-GEJKFE4X.js.map} +0 -0
  448. /package/dist/{chunk-5Q76ACVI.js.map → chunk-H25XXQVH.js.map} +0 -0
  449. /package/dist/{chunk-XYZ6VZ5T.js.map → chunk-HRW25TMU.js.map} +0 -0
  450. /package/dist/{chunk-W3H7GTJY.js.map → chunk-LHWY6G6Q.js.map} +0 -0
  451. /package/dist/{chunk-Q26YZYTD.js.map → chunk-M7HLHGQV.js.map} +0 -0
  452. /package/dist/{chunk-IHE2MQ3W.js.map → chunk-MGSCSS7X.js.map} +0 -0
  453. /package/dist/{chunk-DBMWS3O5.js.map → chunk-MQ5BYGFY.js.map} +0 -0
  454. /package/dist/{chunk-5QUY72FX.js.map → chunk-NWHH3CYH.js.map} +0 -0
  455. /package/dist/{chunk-3TAW4AKH.js.map → chunk-OB3VIRQR.js.map} +0 -0
  456. /package/dist/{chunk-MB3MU6HR.js.map → chunk-PGVLRMTQ.js.map} +0 -0
  457. /package/dist/{chunk-TZOQWCVH.js.map → chunk-QOSTS5I3.js.map} +0 -0
  458. /package/dist/{chunk-3S24ZRPK.js.map → chunk-RMATRKXV.js.map} +0 -0
  459. /package/dist/{chunk-I4SP6JTU.js.map → chunk-S3ILIWSW.js.map} +0 -0
  460. /package/dist/{chunk-XHOBNSBO.js.map → chunk-SEUIIPHS.js.map} +0 -0
  461. /package/dist/{chunk-23XLG2EM.js.map → chunk-SEW5OCQF.js.map} +0 -0
  462. /package/dist/{chunk-LQRFNQ2N.js.map → chunk-U25QSLAH.js.map} +0 -0
  463. /package/dist/{chunk-FEHGU6EP.js.map → chunk-UL364TLO.js.map} +0 -0
  464. /package/dist/{chunk-JBLRAM7Z.js.map → chunk-XNRZJP4E.js.map} +0 -0
  465. /package/dist/{chunk-ELYARUCN.js.map → chunk-YJTUFK4P.js.map} +0 -0
  466. /package/dist/{chunk-2YZB6XQR.js.map → chunk-ZLYZFHEN.js.map} +0 -0
package/dist/optikos.css CHANGED
@@ -61,6 +61,15 @@
61
61
  --op-color-warning-soft: #fcecc9;
62
62
  --op-color-info: #1f5fa8;
63
63
  --op-color-info-soft: #dfeaf8;
64
+
65
+ /* categorical series colors (charts, avatars): distinct for color-blind eyes, 3:1 or more on the surface; the first one, unless a theme sets it, is its primary */
66
+ --op-chart-2: #b45309;
67
+ --op-chart-3: #1e7a4d;
68
+ --op-chart-4: #7e3fa8;
69
+ --op-chart-5: #0e7490;
70
+ --op-chart-6: #b3261e;
71
+ --op-chart-7: #8a6d00;
72
+ --op-chart-8: #5b6676;
64
73
  --op-color-focus: #2f7bd6;
65
74
  --op-color-disabled-fg: #9aa4b2;
66
75
  --op-color-disabled-bg: #eef1f5;
@@ -266,6 +275,42 @@
266
275
  outline: var(--op-focus-width) solid var(--op-color-focus);
267
276
  outline-offset: var(--op-focus-offset);
268
277
  }
278
+
279
+ /* print: the page, not the application chrome (Grid has printGrid for what its virtual list does not render) */
280
+ @media print {
281
+ .op-no-print,
282
+ .op-layer,
283
+ .op-navmenu,
284
+ .op-formactions,
285
+ .op-pagination,
286
+ .op-toast,
287
+ .op-mask,
288
+ .op-tabs__list,
289
+ .op-viewport > .op-toolbar,
290
+ .op-button {
291
+ display: none !important;
292
+ }
293
+ .op-viewport,
294
+ .op-viewport > *,
295
+ .op-panel,
296
+ .op-form {
297
+ position: static !important;
298
+ overflow: visible !important;
299
+ block-size: auto !important;
300
+ box-shadow: none !important;
301
+ }
302
+ .op-field,
303
+ .op-panel,
304
+ .op-fieldset {
305
+ break-inside: avoid;
306
+ }
307
+ .op-field__control input,
308
+ .op-field__control textarea {
309
+ border-color: transparent;
310
+ background: none;
311
+ padding-inline: 0;
312
+ }
313
+ }
269
314
  }
270
315
 
271
316
  @layer optikos {
@@ -448,6 +493,75 @@
448
493
  }
449
494
  }
450
495
 
496
+ @layer optikos {
497
+ :root {
498
+ --op-avatar-size: 2.25rem;
499
+ --op-avatar-dot: 0.625rem;
500
+ --op-avatar-size-sm: 1.5rem;
501
+ --op-avatar-size-lg: 3rem;
502
+ --op-avatar-size-xl: 4.5rem;
503
+ --op-avatar-ring: 2px;
504
+ }
505
+ .op-avatar {
506
+ position: relative;
507
+ display: inline-flex;
508
+ align-items: center;
509
+ justify-content: center;
510
+ flex: none;
511
+ inline-size: var(--op-avatar-size);
512
+ block-size: var(--op-avatar-size);
513
+ background: var(--op-avatar-c, var(--op-chart-1, var(--op-color-primary)));
514
+ color: var(--op-color-surface);
515
+ font-family: var(--op-font-family);
516
+ font-size: calc(var(--op-avatar-size) * 0.4);
517
+ font-weight: 600;
518
+ line-height: 1;
519
+ user-select: none;
520
+ }
521
+ .op-avatar--circle {
522
+ border-radius: 50%;
523
+ }
524
+ .op-avatar--square {
525
+ border-radius: var(--op-avatar-radius, var(--op-radius));
526
+ }
527
+ .op-avatar--sm {
528
+ --op-avatar-size: var(--op-avatar-size-sm);
529
+ }
530
+ .op-avatar--lg {
531
+ --op-avatar-size: var(--op-avatar-size-lg);
532
+ }
533
+ .op-avatar--xl {
534
+ --op-avatar-size: var(--op-avatar-size-xl);
535
+ }
536
+ .op-avatar__img {
537
+ position: absolute;
538
+ inset: 0;
539
+ inline-size: 100%;
540
+ block-size: 100%;
541
+ object-fit: cover;
542
+ border-radius: inherit;
543
+ }
544
+ .op-avatar__status {
545
+ position: absolute;
546
+ inset-block-end: 0;
547
+ inset-inline-end: 0;
548
+ inline-size: var(--op-avatar-dot);
549
+ block-size: var(--op-avatar-dot);
550
+ border-radius: 50%;
551
+ background: var(--op-color-fg-muted);
552
+ box-shadow: 0 0 0 var(--op-avatar-ring) var(--op-color-surface);
553
+ }
554
+ .op-avatar__status.is-online {
555
+ background: var(--op-color-success);
556
+ }
557
+ .op-avatar__status.is-away {
558
+ background: var(--op-color-warning);
559
+ }
560
+ .op-avatar__status.is-busy {
561
+ background: var(--op-color-danger);
562
+ }
563
+ }
564
+
451
565
  @layer optikos {
452
566
  :root {
453
567
  --op-badge-dot-size: 0.5rem;
@@ -784,6 +898,129 @@
784
898
  }
785
899
  }
786
900
 
901
+ @layer optikos {
902
+ :root {
903
+ --op-image-icon-size: 2em;
904
+ }
905
+ .op-image {
906
+ position: relative;
907
+ display: block;
908
+ overflow: hidden;
909
+ background: var(--op-image-bg, var(--op-color-surface-2));
910
+ color: var(--op-color-fg-muted);
911
+ min-inline-size: 0;
912
+ }
913
+ .op-image--rounded {
914
+ border-radius: var(--op-image-radius, var(--op-radius));
915
+ }
916
+ .op-image__fallback {
917
+ position: absolute;
918
+ inset: 0;
919
+ display: flex;
920
+ align-items: center;
921
+ justify-content: center;
922
+ font-size: var(--op-image-icon-size);
923
+ }
924
+ .op-image__img {
925
+ position: absolute;
926
+ inset: 0;
927
+ inline-size: 100%;
928
+ block-size: 100%;
929
+ opacity: 0;
930
+ transition: opacity var(--op-duration) var(--op-easing);
931
+ }
932
+ .op-image.has-image .op-image__img {
933
+ opacity: 1;
934
+ }
935
+ .op-image--cover .op-image__img {
936
+ object-fit: cover;
937
+ }
938
+ .op-image--contain .op-image__img {
939
+ object-fit: contain;
940
+ }
941
+ @media (prefers-reduced-motion: reduce) {
942
+ .op-image__img {
943
+ transition: none;
944
+ }
945
+ }
946
+ }
947
+
948
+ @layer optikos {
949
+ .op-imagecanvas {
950
+ position: relative;
951
+ overflow: hidden;
952
+ aspect-ratio: 4 / 3;
953
+ background: var(--op-imagecanvas-bg, var(--op-color-surface-2));
954
+ border-radius: var(--op-imagecanvas-radius, var(--op-radius));
955
+ font-family: var(--op-font-family);
956
+ }
957
+ .op-imagecanvas__stage {
958
+ position: absolute;
959
+ inset: 0;
960
+ overflow: hidden;
961
+ touch-action: none;
962
+ }
963
+ .op-imagecanvas.is-zoomed .op-imagecanvas__stage {
964
+ cursor: grab;
965
+ }
966
+ .op-imagecanvas.is-dragging .op-imagecanvas__stage {
967
+ cursor: grabbing;
968
+ }
969
+ .op-imagecanvas__stage:focus-visible {
970
+ outline: var(--op-focus-width) solid var(--op-color-focus);
971
+ outline-offset: calc(var(--op-focus-width) * -1);
972
+ }
973
+ .op-imagecanvas__img {
974
+ display: block;
975
+ inline-size: 100%;
976
+ block-size: 100%;
977
+ user-select: none;
978
+ transition: transform var(--op-duration) var(--op-easing);
979
+ }
980
+ .op-imagecanvas.is-dragging .op-imagecanvas__img {
981
+ transition: none;
982
+ }
983
+ .op-imagecanvas.is-error .op-imagecanvas__img {
984
+ visibility: hidden;
985
+ }
986
+ .op-imagecanvas__status {
987
+ position: absolute;
988
+ inset: 0;
989
+ display: grid;
990
+ place-items: center;
991
+ padding: var(--op-space-3);
992
+ color: var(--op-color-fg-muted);
993
+ font-size: var(--op-font-size-sm);
994
+ text-align: center;
995
+ pointer-events: none;
996
+ }
997
+ .op-imagecanvas__tools {
998
+ position: absolute;
999
+ inset-block-end: var(--op-space-2);
1000
+ inset-inline-end: var(--op-space-2);
1001
+ display: flex;
1002
+ gap: var(--op-border-width);
1003
+ overflow: hidden;
1004
+ border-radius: var(--op-radius);
1005
+ box-shadow: var(--op-shadow);
1006
+ }
1007
+ .op-imagecanvas__tool {
1008
+ display: inline-flex;
1009
+ padding: var(--op-space-2);
1010
+ color: var(--op-imagecanvas-tools-fg, var(--op-color-fg));
1011
+ background: var(--op-imagecanvas-tools-bg, var(--op-color-surface));
1012
+ border: 0;
1013
+ cursor: pointer;
1014
+ }
1015
+ .op-imagecanvas__tool:hover {
1016
+ background: var(--op-color-primary-soft);
1017
+ }
1018
+ .op-imagecanvas__tool:focus-visible {
1019
+ outline: var(--op-focus-width) solid var(--op-color-focus);
1020
+ outline-offset: calc(var(--op-focus-width) * -1);
1021
+ }
1022
+ }
1023
+
787
1024
  @layer optikos {
788
1025
  .op-label {
789
1026
  color: var(--op-label-fg, var(--op-color-fg));
@@ -799,133 +1036,367 @@
799
1036
 
800
1037
  @layer optikos {
801
1038
  :root {
802
- --op-chat-max-width: 75%;
803
- --op-chat-input-max-height: 8rem;
804
- --op-chat-dot-size: 0.4rem;
805
- --op-chat-reply-bg: rgb(0 0 0 / 0.07);
806
- }
807
- .op-chat {
1039
+ --op-chart-line-width: 2px;
1040
+ --op-chart-font-size: 0.75rem;
1041
+ --op-chart-area-opacity: 0.18;
1042
+ --op-chart-tip-width: 11rem;
1043
+ --op-chart-swatch: 0.625rem;
1044
+ --op-chart-total-size: 1.125rem;
1045
+ --op-chart-bar-radius: 2px;
1046
+ }
1047
+ .op-chart {
808
1048
  display: flex;
809
1049
  flex-direction: column;
1050
+ gap: var(--op-space-2);
810
1051
  min-inline-size: 0;
811
- min-block-size: 0;
812
- color: var(--op-color-fg);
813
- background: var(--op-chat-bg, var(--op-color-bg));
1052
+ font-family: var(--op-font-family);
1053
+ color: var(--op-chart-fg, var(--op-color-fg));
814
1054
  }
815
- .op-chat__log {
816
- display: flex;
817
- flex: 1;
818
- flex-direction: column;
819
- gap: var(--op-chat-gap, var(--op-space-1));
820
- min-block-size: 0;
821
- padding: var(--op-space-3) var(--op-space-4);
822
- overflow: auto;
1055
+ .op-chart__plot {
1056
+ position: relative;
823
1057
  }
824
- .op-chat__log:focus-visible {
1058
+ .op-chart__svg {
1059
+ display: block;
1060
+ inline-size: 100%;
1061
+ overflow: visible;
1062
+ touch-action: pan-y;
1063
+ }
1064
+ .op-chart__svg:focus-visible {
825
1065
  outline: var(--op-focus-width) solid var(--op-color-focus);
826
- outline-offset: calc(var(--op-focus-width) * -1);
1066
+ outline-offset: var(--op-focus-offset);
827
1067
  }
828
- .op-chat__empty {
829
- margin: auto;
830
- color: var(--op-color-fg-muted);
1068
+ .op-chart__grid line {
1069
+ stroke: var(--op-chart-grid, var(--op-color-border));
1070
+ stroke-width: var(--op-border-width);
831
1071
  }
832
- .op-chat__empty[hidden] {
833
- display: none;
1072
+ .op-chart__grid .op-chart__axis {
1073
+ stroke: var(--op-color-border-strong);
834
1074
  }
835
- .op-chat__day {
836
- display: flex;
837
- justify-content: center;
838
- margin-block: var(--op-space-3);
1075
+ .op-chart__tick,
1076
+ .op-chart__empty {
1077
+ fill: var(--op-color-fg-muted);
1078
+ font-size: var(--op-chart-font-size);
839
1079
  }
840
- .op-chat__day > span {
841
- padding: var(--op-space-1) var(--op-space-3);
842
- color: var(--op-chat-day-fg, var(--op-color-fg-muted));
843
- background: var(--op-chat-day-bg, var(--op-color-surface-2));
844
- border-radius: var(--op-radius);
845
- font-size: var(--op-font-size-sm);
1080
+ .op-chart__total {
1081
+ fill: var(--op-chart-fg, var(--op-color-fg));
1082
+ font-size: var(--op-chart-total-size);
1083
+ font-weight: 600;
846
1084
  }
847
- .op-chat__msg {
848
- display: flex;
849
- max-inline-size: 100%;
1085
+ .op-chart__series {
1086
+ --op-chart-c: var(--op-chart-1, var(--op-color-primary));
850
1087
  }
851
- .op-chat__msg.is-me {
852
- justify-content: flex-end;
1088
+ .op-chart__bar {
1089
+ fill: var(--op-chart-c);
853
1090
  }
854
- .op-chat__msg.is-first {
855
- margin-block-start: var(--op-space-2);
1091
+ .op-chart__line {
1092
+ fill: none;
1093
+ stroke: var(--op-chart-c);
1094
+ stroke-width: var(--op-chart-line-width);
1095
+ stroke-linejoin: round;
1096
+ stroke-linecap: round;
856
1097
  }
857
- .op-chat__bubble {
858
- box-sizing: border-box;
859
- max-inline-size: var(--op-chat-max-width);
860
- padding: var(--op-space-2) var(--op-space-3);
861
- overflow-wrap: anywhere;
862
- color: var(--op-chat-bubble-them-fg, var(--op-color-fg));
863
- background: var(--op-chat-bubble-them-bg, var(--op-color-surface));
864
- border-radius: var(--op-chat-bubble-radius, var(--op-radius-lg));
865
- box-shadow: var(--op-chat-bubble-shadow, var(--op-shadow-sm));
1098
+ .op-chart__area {
1099
+ fill: var(--op-chart-c);
1100
+ fill-opacity: var(--op-chart-area-opacity);
1101
+ stroke: none;
866
1102
  }
867
- .op-chat__msg.is-me .op-chat__bubble {
868
- color: var(--op-chat-bubble-me-fg, var(--op-color-primary-fg));
869
- background: var(--op-chat-bubble-me-bg, var(--op-color-primary));
1103
+ .op-chart__dot {
1104
+ fill: var(--op-color-surface);
1105
+ stroke: var(--op-chart-c);
1106
+ stroke-width: var(--op-chart-line-width);
870
1107
  }
871
- /* inside a run the corners next to the neighbour are squared, like a stack of bubbles */
872
- .op-chat__msg.is-them:not(.is-first) .op-chat__bubble {
873
- border-start-start-radius: var(--op-radius-sm);
1108
+ .op-chart--sparkline .op-chart__dot {
1109
+ fill: var(--op-chart-c);
874
1110
  }
875
- .op-chat__msg.is-them:not(.is-last) .op-chat__bubble {
876
- border-end-start-radius: var(--op-radius-sm);
1111
+ .op-chart__slice {
1112
+ fill: var(--op-chart-c);
1113
+ stroke: var(--op-color-surface);
1114
+ stroke-width: var(--op-chart-line-width);
1115
+ transition: opacity var(--op-duration) var(--op-easing);
877
1116
  }
878
- .op-chat__msg.is-me:not(.is-first) .op-chat__bubble {
879
- border-start-end-radius: var(--op-radius-sm);
1117
+ .op-chart__svg:has(.is-active) .op-chart__slice:not(.is-active) {
1118
+ opacity: 0.55;
880
1119
  }
881
- .op-chat__msg.is-me:not(.is-last) .op-chat__bubble {
882
- border-end-end-radius: var(--op-radius-sm);
1120
+ .op-chart__hit {
1121
+ fill: transparent;
883
1122
  }
884
- .op-chat__author {
885
- font-size: var(--op-font-size-sm);
886
- font-weight: var(--op-font-weight-bold);
1123
+ .op-chart__guide {
1124
+ stroke: var(--op-color-border-strong);
1125
+ stroke-width: var(--op-border-width);
1126
+ visibility: hidden;
887
1127
  }
888
- .op-chat__author[hidden] {
889
- display: none;
1128
+ .op-chart__guide.is-on {
1129
+ visibility: visible;
890
1130
  }
891
- .op-chat__reply {
892
- margin-block-end: var(--op-space-1);
893
- padding: var(--op-space-1) var(--op-space-2);
894
- border-inline-start: var(--op-space-1) solid currentColor;
895
- border-radius: var(--op-radius-sm);
896
- background: var(--op-chat-reply-bg);
897
- font-size: var(--op-font-size-sm);
898
- opacity: 0.85;
1131
+ .op-chart__tip {
1132
+ position: absolute;
1133
+ inset-block-start: 0;
1134
+ z-index: 1;
1135
+ inline-size: max-content;
1136
+ max-inline-size: var(--op-chart-tip-width);
1137
+ padding: var(--op-space-2) var(--op-space-3);
1138
+ transform: translateX(var(--op-space-3));
1139
+ background: var(--op-color-surface);
1140
+ color: var(--op-color-fg);
1141
+ border: var(--op-border-width) solid var(--op-color-border);
1142
+ border-radius: var(--op-radius);
1143
+ box-shadow: var(--op-shadow);
1144
+ font-size: var(--op-chart-font-size);
1145
+ pointer-events: none;
899
1146
  }
900
- .op-chat__reply strong {
901
- display: block;
1147
+ .op-chart__tip.is-left {
1148
+ transform: translateX(calc(-100% - var(--op-space-3)));
902
1149
  }
903
- .op-chat__code {
904
- padding: 0 var(--op-space-1);
905
- font-family: var(--op-font-mono);
906
- background: var(--op-chat-reply-bg);
907
- border-radius: var(--op-radius-sm);
1150
+ .op-chart__tip-head {
1151
+ font-weight: 600;
1152
+ margin-block-end: var(--op-space-1);
908
1153
  }
909
- .op-chat__meta {
910
- display: inline-flex;
911
- float: inline-end;
1154
+ .op-chart__tip-row {
1155
+ display: flex;
912
1156
  align-items: center;
913
- gap: var(--op-space-1);
914
- margin-inline-start: var(--op-space-3);
915
- margin-block-start: var(--op-space-2);
916
- font-size: var(--op-font-size-sm);
917
- }
918
- .op-chat__status {
919
- display: inline-flex;
1157
+ gap: var(--op-space-2);
920
1158
  }
921
- .op-chat__status .op-icon:nth-child(2) {
922
- margin-inline-start: calc(var(--op-icon-size) * -0.6);
1159
+ .op-chart__tip-row b {
1160
+ margin-inline-start: auto;
1161
+ padding-inline-start: var(--op-space-3);
1162
+ font-variant-numeric: tabular-nums;
923
1163
  }
924
- .op-chat__status.is-read {
925
- color: var(--op-chat-read-fg, var(--op-color-info));
926
- opacity: 1;
1164
+ .op-chart__legend {
1165
+ display: flex;
1166
+ flex-wrap: wrap;
1167
+ gap: var(--op-space-1) var(--op-space-3);
927
1168
  }
928
- .op-chat__status.is-error {
1169
+ .op-chart__key {
1170
+ display: inline-flex;
1171
+ align-items: center;
1172
+ gap: var(--op-space-2);
1173
+ padding: 0;
1174
+ border: 0;
1175
+ background: none;
1176
+ font: inherit;
1177
+ font-size: var(--op-chart-font-size);
1178
+ color: var(--op-color-fg);
1179
+ cursor: pointer;
1180
+ }
1181
+ .op-chart__key.is-off {
1182
+ color: var(--op-color-fg-muted);
1183
+ text-decoration: line-through;
1184
+ }
1185
+ .op-chart__key:focus-visible {
1186
+ outline: var(--op-focus-width) solid var(--op-color-focus);
1187
+ outline-offset: var(--op-focus-offset);
1188
+ }
1189
+ .op-chart__swatch {
1190
+ inline-size: var(--op-chart-swatch);
1191
+ block-size: var(--op-chart-swatch);
1192
+ border-radius: var(--op-chart-bar-radius);
1193
+ background: var(--op-chart-c);
1194
+ flex: none;
1195
+ }
1196
+ .op-chart__key.is-off .op-chart__swatch {
1197
+ opacity: 0.35;
1198
+ }
1199
+ @media (prefers-reduced-motion: reduce) {
1200
+ .op-chart__slice {
1201
+ transition: none;
1202
+ }
1203
+ }
1204
+ }
1205
+
1206
+ @layer optikos {
1207
+ :root {
1208
+ --op-stat-value-size: 1.75rem;
1209
+ --op-stat-spark-width: 6rem;
1210
+ }
1211
+ .op-stat {
1212
+ position: relative;
1213
+ display: flex;
1214
+ flex-direction: column;
1215
+ gap: var(--op-space-1);
1216
+ padding: var(--op-space-4);
1217
+ background: var(--op-stat-bg, var(--op-color-surface));
1218
+ color: var(--op-color-fg);
1219
+ border: var(--op-border-width) solid var(--op-color-border);
1220
+ border-radius: var(--op-stat-radius, var(--op-radius));
1221
+ font-family: var(--op-font-family);
1222
+ min-inline-size: 0;
1223
+ }
1224
+ .op-stat__label {
1225
+ display: flex;
1226
+ align-items: center;
1227
+ gap: var(--op-space-2);
1228
+ color: var(--op-color-fg-muted);
1229
+ font-size: var(--op-font-size-sm);
1230
+ }
1231
+ .op-stat__row {
1232
+ display: flex;
1233
+ align-items: baseline;
1234
+ flex-wrap: wrap;
1235
+ gap: var(--op-space-2);
1236
+ }
1237
+ .op-stat__value {
1238
+ font-size: var(--op-stat-value-size);
1239
+ font-weight: 600;
1240
+ line-height: 1.1;
1241
+ font-variant-numeric: tabular-nums;
1242
+ }
1243
+ .op-stat__delta {
1244
+ display: inline-flex;
1245
+ align-items: center;
1246
+ gap: var(--op-space-1);
1247
+ font-size: var(--op-font-size-sm);
1248
+ font-weight: 600;
1249
+ }
1250
+ .op-stat__delta.is-good {
1251
+ color: var(--op-color-success);
1252
+ }
1253
+ .op-stat__delta.is-bad {
1254
+ color: var(--op-color-danger);
1255
+ }
1256
+ .op-stat__delta.is-flat {
1257
+ color: var(--op-color-fg-muted);
1258
+ }
1259
+ .op-stat__caption {
1260
+ color: var(--op-color-fg-muted);
1261
+ font-size: var(--op-font-size-sm);
1262
+ }
1263
+ .op-stat__spark {
1264
+ position: absolute;
1265
+ inset-block-end: var(--op-space-3);
1266
+ inset-inline-end: var(--op-space-4);
1267
+ inline-size: var(--op-stat-spark-width);
1268
+ }
1269
+ }
1270
+
1271
+ @layer optikos {
1272
+ :root {
1273
+ --op-chat-max-width: 75%;
1274
+ --op-chat-input-max-height: 8rem;
1275
+ --op-chat-dot-size: 0.4rem;
1276
+ --op-chat-reply-bg: rgb(0 0 0 / 0.07);
1277
+ }
1278
+ .op-chat {
1279
+ display: flex;
1280
+ flex-direction: column;
1281
+ min-inline-size: 0;
1282
+ min-block-size: 0;
1283
+ color: var(--op-color-fg);
1284
+ background: var(--op-chat-bg, var(--op-color-bg));
1285
+ }
1286
+ .op-chat__log {
1287
+ display: flex;
1288
+ flex: 1;
1289
+ flex-direction: column;
1290
+ gap: var(--op-chat-gap, var(--op-space-1));
1291
+ min-block-size: 0;
1292
+ padding: var(--op-space-3) var(--op-space-4);
1293
+ overflow: auto;
1294
+ }
1295
+ .op-chat__log:focus-visible {
1296
+ outline: var(--op-focus-width) solid var(--op-color-focus);
1297
+ outline-offset: calc(var(--op-focus-width) * -1);
1298
+ }
1299
+ .op-chat__empty {
1300
+ margin: auto;
1301
+ color: var(--op-color-fg-muted);
1302
+ }
1303
+ .op-chat__empty[hidden] {
1304
+ display: none;
1305
+ }
1306
+ .op-chat__day {
1307
+ display: flex;
1308
+ justify-content: center;
1309
+ margin-block: var(--op-space-3);
1310
+ }
1311
+ .op-chat__day > span {
1312
+ padding: var(--op-space-1) var(--op-space-3);
1313
+ color: var(--op-chat-day-fg, var(--op-color-fg-muted));
1314
+ background: var(--op-chat-day-bg, var(--op-color-surface-2));
1315
+ border-radius: var(--op-radius);
1316
+ font-size: var(--op-font-size-sm);
1317
+ }
1318
+ .op-chat__msg {
1319
+ display: flex;
1320
+ max-inline-size: 100%;
1321
+ }
1322
+ .op-chat__msg.is-me {
1323
+ justify-content: flex-end;
1324
+ }
1325
+ .op-chat__msg.is-first {
1326
+ margin-block-start: var(--op-space-2);
1327
+ }
1328
+ .op-chat__bubble {
1329
+ box-sizing: border-box;
1330
+ max-inline-size: var(--op-chat-max-width);
1331
+ padding: var(--op-space-2) var(--op-space-3);
1332
+ overflow-wrap: anywhere;
1333
+ color: var(--op-chat-bubble-them-fg, var(--op-color-fg));
1334
+ background: var(--op-chat-bubble-them-bg, var(--op-color-surface));
1335
+ border-radius: var(--op-chat-bubble-radius, var(--op-radius-lg));
1336
+ box-shadow: var(--op-chat-bubble-shadow, var(--op-shadow-sm));
1337
+ }
1338
+ .op-chat__msg.is-me .op-chat__bubble {
1339
+ color: var(--op-chat-bubble-me-fg, var(--op-color-primary-fg));
1340
+ background: var(--op-chat-bubble-me-bg, var(--op-color-primary));
1341
+ }
1342
+ /* inside a run the corners next to the neighbour are squared, like a stack of bubbles */
1343
+ .op-chat__msg.is-them:not(.is-first) .op-chat__bubble {
1344
+ border-start-start-radius: var(--op-radius-sm);
1345
+ }
1346
+ .op-chat__msg.is-them:not(.is-last) .op-chat__bubble {
1347
+ border-end-start-radius: var(--op-radius-sm);
1348
+ }
1349
+ .op-chat__msg.is-me:not(.is-first) .op-chat__bubble {
1350
+ border-start-end-radius: var(--op-radius-sm);
1351
+ }
1352
+ .op-chat__msg.is-me:not(.is-last) .op-chat__bubble {
1353
+ border-end-end-radius: var(--op-radius-sm);
1354
+ }
1355
+ .op-chat__author {
1356
+ font-size: var(--op-font-size-sm);
1357
+ font-weight: var(--op-font-weight-bold);
1358
+ }
1359
+ .op-chat__author[hidden] {
1360
+ display: none;
1361
+ }
1362
+ .op-chat__reply {
1363
+ margin-block-end: var(--op-space-1);
1364
+ padding: var(--op-space-1) var(--op-space-2);
1365
+ border-inline-start: var(--op-space-1) solid currentColor;
1366
+ border-radius: var(--op-radius-sm);
1367
+ background: var(--op-chat-reply-bg);
1368
+ font-size: var(--op-font-size-sm);
1369
+ opacity: 0.85;
1370
+ }
1371
+ .op-chat__reply strong {
1372
+ display: block;
1373
+ }
1374
+ .op-chat__code {
1375
+ padding: 0 var(--op-space-1);
1376
+ font-family: var(--op-font-mono);
1377
+ background: var(--op-chat-reply-bg);
1378
+ border-radius: var(--op-radius-sm);
1379
+ }
1380
+ .op-chat__meta {
1381
+ display: inline-flex;
1382
+ float: inline-end;
1383
+ align-items: center;
1384
+ gap: var(--op-space-1);
1385
+ margin-inline-start: var(--op-space-3);
1386
+ margin-block-start: var(--op-space-2);
1387
+ font-size: var(--op-font-size-sm);
1388
+ }
1389
+ .op-chat__status {
1390
+ display: inline-flex;
1391
+ }
1392
+ .op-chat__status .op-icon:nth-child(2) {
1393
+ margin-inline-start: calc(var(--op-icon-size) * -0.6);
1394
+ }
1395
+ .op-chat__status.is-read {
1396
+ color: var(--op-chat-read-fg, var(--op-color-info));
1397
+ opacity: 1;
1398
+ }
1399
+ .op-chat__status.is-error {
929
1400
  color: var(--op-color-danger);
930
1401
  }
931
1402
  .op-chat__status.is-sending::before {
@@ -1064,6 +1535,63 @@
1064
1535
  }
1065
1536
  }
1066
1537
 
1538
+ @layer optikos {
1539
+ .op-columntotals {
1540
+ display: grid;
1541
+ grid-template-columns: var(--op-grid-cols);
1542
+ box-sizing: border-box;
1543
+ flex: none;
1544
+ overflow: hidden;
1545
+ min-block-size: var(--op-grid-row-height, var(--op-row-height));
1546
+ border-block-start: var(--op-border-width) solid var(--op-grid-header-border, var(--op-color-border-strong));
1547
+ background: var(--op-grid-total-bg, var(--op-color-surface-2));
1548
+ font-weight: var(--op-font-weight-bold);
1549
+ }
1550
+ .op-columntotals[hidden] {
1551
+ display: none;
1552
+ }
1553
+ .op-columntotals__cell {
1554
+ display: flex;
1555
+ align-items: center;
1556
+ gap: var(--op-space-2);
1557
+ min-inline-size: 0;
1558
+ padding-inline: var(--op-grid-cell-padding-x, var(--op-control-padding-x));
1559
+ overflow: hidden;
1560
+ white-space: nowrap;
1561
+ }
1562
+ .op-columntotals__cell--right { justify-content: flex-end; }
1563
+ .op-columntotals__cell--center { justify-content: center; }
1564
+ .op-columntotals__op {
1565
+ color: var(--op-color-fg-muted);
1566
+ font-size: var(--op-font-size-sm);
1567
+ font-weight: var(--op-font-weight-normal, normal);
1568
+ }
1569
+ .op-columntotals__btn {
1570
+ display: inline-flex;
1571
+ flex: none;
1572
+ align-items: center;
1573
+ margin-inline-start: auto;
1574
+ padding: var(--op-space-1);
1575
+ border: 0;
1576
+ border-radius: var(--op-radius-sm);
1577
+ background: transparent;
1578
+ color: var(--op-color-fg-muted);
1579
+ cursor: pointer;
1580
+ }
1581
+ .op-columntotals__btn:hover {
1582
+ background: var(--op-color-hover);
1583
+ color: var(--op-color-fg);
1584
+ }
1585
+ .op-columntotals__btn:focus-visible {
1586
+ outline: var(--op-focus-width) solid var(--op-color-focus);
1587
+ outline-offset: var(--op-focus-offset);
1588
+ }
1589
+ .op-columntotals--top {
1590
+ border-block-start: 0;
1591
+ border-block-end: var(--op-border-width) solid var(--op-grid-header-border, var(--op-color-border-strong));
1592
+ }
1593
+ }
1594
+
1067
1595
  @layer optikos {
1068
1596
  :root {
1069
1597
  --op-dataview-item-width: 10rem;
@@ -1121,6 +1649,16 @@
1121
1649
  }
1122
1650
  }
1123
1651
 
1652
+ @layer optikos {
1653
+ .op-exportbar {
1654
+ display: flex;
1655
+ flex: none;
1656
+ gap: var(--op-space-1);
1657
+ margin-inline-start: auto;
1658
+ padding-inline: var(--op-space-2);
1659
+ }
1660
+ }
1661
+
1124
1662
  @layer optikos {
1125
1663
  :root {
1126
1664
  --op-filterbuilder-gap: var(--op-space-2);
@@ -1259,6 +1797,7 @@
1259
1797
  --op-grid-action-idle-opacity: 0.45;
1260
1798
  --op-grid-action-disabled-opacity: 0.3;
1261
1799
  --op-grid-selected-bar-width: 0.125rem;
1800
+ --op-grid-lock-shadow-size: 0.375rem;
1262
1801
  }
1263
1802
  .op-grid {
1264
1803
  --_border: var(--op-grid-border, var(--op-color-border));
@@ -1381,13 +1920,25 @@
1381
1920
  padding: var(--op-space-2);
1382
1921
  border-block-start: var(--op-border-width) solid var(--_border);
1383
1922
  }
1384
- .op-grid .op-virtual {
1385
- min-inline-size: var(--op-grid-min-width);
1386
- }
1387
- .op-grid__check {
1388
- margin: 0;
1389
- accent-color: var(--op-grid-check-accent, var(--op-color-primary));
1390
- cursor: pointer;
1923
+ .op-grid__footer {
1924
+ display: flex;
1925
+ flex: none;
1926
+ flex-wrap: wrap;
1927
+ align-items: center;
1928
+ justify-content: space-between;
1929
+ border-block-start: var(--op-border-width) solid var(--_border);
1930
+ }
1931
+ .op-grid__footer .op-grid__pager {
1932
+ flex: 1 1 auto;
1933
+ border-block-start: 0;
1934
+ }
1935
+ .op-grid .op-virtual {
1936
+ min-inline-size: var(--op-grid-min-width);
1937
+ }
1938
+ .op-grid__check {
1939
+ margin: 0;
1940
+ accent-color: var(--op-grid-check-accent, var(--op-color-primary));
1941
+ cursor: pointer;
1391
1942
  }
1392
1943
  /* the checkbox and action columns are narrow: the frame gives them their own padding instead of the text-cell one */
1393
1944
  .op-grid__selcell,
@@ -1624,6 +2175,138 @@
1624
2175
  .op-grid__colgroup ~ .op-grid__colitem {
1625
2176
  padding-inline-start: var(--op-space-4);
1626
2177
  }
2178
+
2179
+ /* locked columns: body cells stick, header cells are shifted by the scroll (the header scrolls by script, not natively) */
2180
+ .op-grid__cell.is-locked {
2181
+ z-index: 1;
2182
+ background: var(--op-grid-bg, var(--op-color-surface));
2183
+ }
2184
+ .op-grid__body-row .is-locked-start {
2185
+ position: sticky;
2186
+ inset-inline-start: var(--_lock);
2187
+ }
2188
+ .op-grid__body-row .is-locked-end {
2189
+ position: sticky;
2190
+ inset-inline-end: var(--_lock);
2191
+ }
2192
+ .op-grid__hcell.is-locked {
2193
+ position: relative;
2194
+ background: var(--op-grid-header-bg, var(--op-color-surface-2));
2195
+ }
2196
+ .op-grid__hcell.is-locked-start {
2197
+ inset-inline-start: var(--op-grid-scroll-x);
2198
+ }
2199
+ .op-grid__hcell.is-locked-end {
2200
+ inset-inline-start: calc(-1 * var(--op-grid-scroll-end));
2201
+ }
2202
+ .op-grid__body-row:hover .is-locked {
2203
+ background: var(--op-grid-row-hover-bg, var(--op-color-hover));
2204
+ }
2205
+ .op-grid--striped .op-grid__body-row.is-odd .is-locked {
2206
+ background: var(--op-grid-row-stripe-bg, var(--op-color-surface-2));
2207
+ }
2208
+ .op-grid__body-row.is-selected .is-locked {
2209
+ background: var(--op-grid-row-selected-bg, var(--op-color-selected));
2210
+ }
2211
+ .op-grid.is-scrolled-start .is-lock-edge.is-locked-start {
2212
+ box-shadow: var(--op-grid-lock-shadow-size) 0 var(--op-grid-lock-shadow-size) calc(-1 * var(--op-grid-lock-shadow-size)) var(--op-color-border-strong);
2213
+ }
2214
+ .op-grid.is-scrolled-end .is-lock-edge.is-locked-end {
2215
+ box-shadow: calc(-1 * var(--op-grid-lock-shadow-size)) 0 var(--op-grid-lock-shadow-size) calc(-1 * var(--op-grid-lock-shadow-size)) var(--op-color-border-strong);
2216
+ }
2217
+ }
2218
+
2219
+ @layer optikos {
2220
+ .op-print-sheet {
2221
+ display: none;
2222
+ }
2223
+ @media print {
2224
+ html.op-printing body > *:not(.op-print-sheet) {
2225
+ display: none !important;
2226
+ }
2227
+ html.op-printing .op-print-sheet {
2228
+ display: block;
2229
+ font-family: var(--op-font-family);
2230
+ color: var(--op-color-fg);
2231
+ }
2232
+ .op-print-sheet table {
2233
+ inline-size: 100%;
2234
+ border-collapse: collapse;
2235
+ font-size: var(--op-font-size-sm);
2236
+ }
2237
+ .op-print-sheet thead {
2238
+ display: table-header-group;
2239
+ }
2240
+ .op-print-sheet tr {
2241
+ break-inside: avoid;
2242
+ }
2243
+ .op-print-sheet th,
2244
+ .op-print-sheet td {
2245
+ padding: var(--op-space-1) var(--op-space-2);
2246
+ border-block-end: var(--op-border-width) solid var(--op-color-border);
2247
+ text-align: start;
2248
+ }
2249
+ .op-print-sheet th {
2250
+ border-block-end-color: var(--op-color-fg);
2251
+ }
2252
+ }
2253
+ }
2254
+
2255
+ @layer optikos {
2256
+ .op-grid__row--group {
2257
+ display: flex;
2258
+ background: var(--op-grid-group-bg, var(--op-color-surface-2));
2259
+ font-weight: var(--op-font-weight-bold);
2260
+ cursor: pointer;
2261
+ }
2262
+ .op-grid__row--group .op-grid__cell {
2263
+ flex: none;
2264
+ }
2265
+ .op-grid__row--group .op-grid__cell.is-group-label {
2266
+ flex: 1;
2267
+ gap: var(--op-space-2);
2268
+ }
2269
+ .op-grid__row--group .op-grid__cell:not(.is-group-label):not(.op-grid__selcell) {
2270
+ display: none;
2271
+ }
2272
+ .op-grid__twist {
2273
+ display: inline-flex;
2274
+ transition: transform var(--op-duration) var(--op-easing);
2275
+ }
2276
+ .op-grid__row--group[aria-expanded='false'] .op-grid__twist {
2277
+ transform: rotate(-90deg);
2278
+ }
2279
+ .op-grid__group-count {
2280
+ color: var(--op-color-fg-muted);
2281
+ font-weight: normal;
2282
+ }
2283
+ .op-grid__row--total {
2284
+ font-weight: var(--op-font-weight-bold);
2285
+ background: var(--op-grid-total-bg, var(--op-color-surface-2));
2286
+ cursor: default;
2287
+ }
2288
+ .op-grid__row--total.is-grand-total {
2289
+ border-block-start: var(--op-border-width) solid var(--op-color-border-strong);
2290
+ }
2291
+ .op-grid__row--total:hover {
2292
+ background: var(--op-grid-total-bg, var(--op-color-surface-2));
2293
+ }
2294
+ .op-grid__body-row.is-grouped > .op-grid__cell:first-child:not(.op-grid__selcell),
2295
+ .op-grid__body-row.is-grouped > .op-grid__selcell + .op-grid__cell {
2296
+ padding-inline-start: calc(var(--op-grid-cell-padding-x, var(--op-control-padding-x)) + var(--op-grid-indent, var(--op-space-4)));
2297
+ }
2298
+ @media (prefers-reduced-motion: reduce) {
2299
+ .op-grid__twist {
2300
+ transition: none;
2301
+ }
2302
+ }
2303
+ .op-groupcontrols {
2304
+ display: flex;
2305
+ flex: none;
2306
+ gap: var(--op-space-1);
2307
+ margin-inline-start: auto;
2308
+ padding-inline: var(--op-space-2);
2309
+ }
1627
2310
  }
1628
2311
 
1629
2312
  @layer optikos {
@@ -1650,6 +2333,46 @@
1650
2333
  }
1651
2334
  }
1652
2335
 
2336
+ @layer optikos {
2337
+ .op-grid__body-row.is-row-editing {
2338
+ z-index: 2;
2339
+ background: var(--op-grid-row-selected-bg, var(--op-color-selected));
2340
+ }
2341
+ .op-grid__rowbar {
2342
+ position: absolute;
2343
+ z-index: 1;
2344
+ inset-block-start: 100%;
2345
+ inset-inline-start: var(--op-grid-scroll-x);
2346
+ display: flex;
2347
+ gap: var(--op-space-2);
2348
+ padding: var(--op-space-2);
2349
+ background: var(--op-color-surface);
2350
+ border: var(--op-border-width) solid var(--op-color-border-strong);
2351
+ border-block-start: 0;
2352
+ border-end-start-radius: var(--op-radius);
2353
+ border-end-end-radius: var(--op-radius);
2354
+ box-shadow: var(--op-shadow);
2355
+ }
2356
+ .op-grid__rowbtn {
2357
+ padding: var(--op-space-1) var(--op-space-3);
2358
+ color: var(--op-color-fg);
2359
+ background: var(--op-color-surface);
2360
+ border: var(--op-border-width) solid var(--op-color-border-strong);
2361
+ border-radius: var(--op-radius);
2362
+ font: inherit;
2363
+ cursor: pointer;
2364
+ }
2365
+ .op-grid__rowbtn.is-primary {
2366
+ color: var(--op-color-primary-fg);
2367
+ background: var(--op-color-primary);
2368
+ border-color: var(--op-color-primary);
2369
+ }
2370
+ .op-grid__rowbtn:focus-visible {
2371
+ outline: var(--op-focus-width) solid var(--op-color-focus);
2372
+ outline-offset: var(--op-focus-offset);
2373
+ }
2374
+ }
2375
+
1653
2376
  @layer optikos {
1654
2377
  :root {
1655
2378
  --op-searchgrid-gap: var(--op-space-3);
@@ -1677,51 +2400,354 @@
1677
2400
  flex: 1 1 var(--op-searchgrid-field-width);
1678
2401
  min-inline-size: 0;
1679
2402
  }
1680
- .op-searchgrid__buttons {
1681
- display: flex;
1682
- gap: var(--op-space-2);
1683
- margin-inline-start: auto;
2403
+ .op-searchgrid__buttons {
2404
+ display: flex;
2405
+ gap: var(--op-space-2);
2406
+ margin-inline-start: auto;
2407
+ }
2408
+ .op-searchgrid > .op-grid {
2409
+ flex: 1;
2410
+ min-block-size: var(--op-searchgrid-grid-min-height);
2411
+ }
2412
+ }
2413
+
2414
+ @layer optikos {
2415
+ .op-table {
2416
+ inline-size: 100%;
2417
+ border-collapse: collapse;
2418
+ color: var(--op-color-fg);
2419
+ font-size: var(--op-font-size);
2420
+ }
2421
+ .op-table caption {
2422
+ padding: var(--op-space-2);
2423
+ text-align: start;
2424
+ color: var(--op-color-fg-muted);
2425
+ }
2426
+ .op-table th,
2427
+ .op-table td {
2428
+ padding: var(--op-table-cell-padding-y, var(--op-space-2)) var(--op-table-cell-padding-x, var(--op-space-3));
2429
+ text-align: start;
2430
+ border-block-end: var(--op-border-width) solid var(--op-table-border, var(--op-color-border));
2431
+ }
2432
+ .op-table th {
2433
+ background: var(--op-table-header-bg, var(--op-color-surface-2));
2434
+ font-weight: var(--op-font-weight-bold);
2435
+ }
2436
+ .op-table--striped tbody tr:nth-child(even) {
2437
+ background: var(--op-table-stripe-bg, var(--op-color-surface-2));
2438
+ }
2439
+ .op-table .op-table__cell--right {
2440
+ text-align: end;
2441
+ }
2442
+ .op-table .op-table__cell--center {
2443
+ text-align: center;
2444
+ }
2445
+ .op-table__empty td {
2446
+ text-align: center;
2447
+ color: var(--op-color-fg-muted);
2448
+ }
2449
+ }
2450
+
2451
+ @layer optikos {
2452
+ :root {
2453
+ --op-timeentry-handle: 0.5rem;
2454
+ --op-timeentry-cursor: 0.125rem;
2455
+ --op-timeentry-grip: 0.125rem;
2456
+ }
2457
+ .op-timeline--entry .op-timeline__lane {
2458
+ cursor: crosshair;
2459
+ border-radius: var(--op-radius);
2460
+ }
2461
+ .op-timeline--entry .op-timeline__lane:focus-visible {
2462
+ outline: var(--op-focus-width) solid var(--op-color-focus);
2463
+ outline-offset: var(--op-focus-offset);
2464
+ }
2465
+ .op-timeline--entry .op-timeline__track {
2466
+ touch-action: pan-y;
2467
+ }
2468
+ .op-timeline--entry .op-timeline__bar {
2469
+ cursor: grab;
2470
+ touch-action: none;
2471
+ user-select: none;
2472
+ }
2473
+ .op-timeline--entry .op-timeline__bar.is-dragging {
2474
+ cursor: grabbing;
2475
+ z-index: 1;
2476
+ box-shadow: var(--op-shadow);
2477
+ }
2478
+ .op-timeline--entry .op-timeline__bar.is-locked {
2479
+ cursor: not-allowed;
2480
+ opacity: 0.6;
2481
+ }
2482
+ .op-timeline--entry .op-timeline__bar.is-invalid,
2483
+ .op-timeentry__ghost.is-invalid {
2484
+ --op-timeline-c: var(--op-color-danger);
2485
+ }
2486
+ .is-time-dragging {
2487
+ user-select: none;
2488
+ }
2489
+ .op-timeentry__handle {
2490
+ position: absolute;
2491
+ inset-block: 0;
2492
+ inline-size: var(--op-timeentry-handle);
2493
+ cursor: ew-resize;
2494
+ }
2495
+ .op-timeentry__handle--start { inset-inline-start: 0; }
2496
+ .op-timeentry__handle--end { inset-inline-end: 0; }
2497
+ .op-timeentry__handle::after {
2498
+ content: '';
2499
+ position: absolute;
2500
+ inset-block: 25%;
2501
+ inset-inline-start: 40%;
2502
+ inline-size: var(--op-timeentry-grip);
2503
+ border-radius: var(--op-timeentry-grip);
2504
+ background: currentColor;
2505
+ opacity: 0.6;
2506
+ }
2507
+ .op-timeentry__ghost {
2508
+ --op-timeline-c: var(--op-color-primary);
2509
+ position: absolute;
2510
+ inset-block: 0;
2511
+ border: var(--op-border-width) dashed var(--op-timeline-c);
2512
+ border-radius: var(--op-radius);
2513
+ background: color-mix(in srgb, var(--op-timeline-c) 25%, transparent);
2514
+ pointer-events: none;
2515
+ }
2516
+ .op-timeentry__cursor {
2517
+ position: absolute;
2518
+ inset-block: 0;
2519
+ inline-size: var(--op-timeentry-cursor);
2520
+ background: var(--op-color-focus);
2521
+ pointer-events: none;
2522
+ }
2523
+ .op-timeentry__lane.is-under .op-timeline__lane-name { color: var(--op-color-warning); }
2524
+ .op-timeentry__lane.is-met .op-timeline__lane-name { color: var(--op-color-success); }
2525
+ .op-timeentry__lane.is-over .op-timeline__lane-name { color: var(--op-color-danger); }
2526
+ .op-timeentry__grand {
2527
+ display: flex;
2528
+ justify-content: space-between;
2529
+ gap: var(--op-space-3);
2530
+ padding: var(--op-space-2);
2531
+ border-block-start: var(--op-border-width) solid var(--op-color-border-strong);
2532
+ font-size: var(--op-font-size-sm);
2533
+ }
2534
+
2535
+ .op-timeline--vertical.op-timeline--entry .op-timeline__track {
2536
+ touch-action: auto;
2537
+ }
2538
+ .op-timeline--vertical .op-timeentry__handle {
2539
+ inset-block: auto;
2540
+ inset-inline: 0;
2541
+ inline-size: auto;
2542
+ block-size: var(--op-timeentry-handle);
2543
+ cursor: ns-resize;
2544
+ }
2545
+ .op-timeline--vertical .op-timeentry__handle--start { inset-block-start: 0; }
2546
+ .op-timeline--vertical .op-timeentry__handle--end { inset-block-end: 0; }
2547
+ .op-timeline--vertical .op-timeentry__handle::after {
2548
+ inset-block: 40% auto;
2549
+ inset-inline: 25%;
2550
+ inline-size: auto;
2551
+ block-size: var(--op-timeentry-grip);
2552
+ }
2553
+ .op-timeline--vertical .op-timeentry__ghost {
2554
+ inset-block: auto;
2555
+ inset-inline: 0;
2556
+ }
2557
+ .op-timeline--vertical .op-timeentry__cursor {
2558
+ inset-block: auto;
2559
+ inset-inline: 0;
2560
+ inline-size: auto;
2561
+ block-size: var(--op-timeentry-cursor);
2562
+ }
2563
+ .op-timeline--vertical .op-timeentry__grand {
2564
+ grid-column: 1 / -1;
2565
+ }
2566
+ }
2567
+
2568
+ @layer optikos {
2569
+ :root {
2570
+ --op-timeline-marker: 0.875rem;
2571
+ --op-timeline-when-width: 8rem;
2572
+ --op-timeline-lane-width: 8rem;
2573
+ --op-timeline-axis-width: 4rem;
2574
+ --op-timeline-height: 32rem;
2575
+ --op-timeline-bar-height: 1.75rem;
2576
+ --op-timeline-line: 2px;
2577
+ }
2578
+ .op-timeline {
2579
+ font-family: var(--op-font-family);
2580
+ color: var(--op-color-fg);
2581
+ min-inline-size: 0;
2582
+ }
2583
+ .op-timeline--list {
2584
+ display: flex;
2585
+ flex-direction: column;
2586
+ }
2587
+ .op-timeline__item {
2588
+ --op-timeline-c: var(--op-color-border-strong);
2589
+ display: grid;
2590
+ grid-template-columns: var(--op-timeline-when-width) var(--op-timeline-marker) 1fr;
2591
+ gap: var(--op-space-3);
2592
+ padding-block-end: var(--op-space-4);
2593
+ border-radius: var(--op-radius);
2594
+ }
2595
+ .op-timeline__item:focus-visible,
2596
+ .op-timeline__bar:focus-visible {
2597
+ outline: var(--op-focus-width) solid var(--op-color-focus);
2598
+ outline-offset: var(--op-focus-offset);
2599
+ }
2600
+ .op-timeline__item.is-success { --op-timeline-c: var(--op-color-success); }
2601
+ .op-timeline__item.is-warning { --op-timeline-c: var(--op-color-warning); }
2602
+ .op-timeline__item.is-danger { --op-timeline-c: var(--op-color-danger); }
2603
+ .op-timeline__item.is-info { --op-timeline-c: var(--op-color-info); }
2604
+ .op-timeline__when {
2605
+ color: var(--op-color-fg-muted);
2606
+ font-size: var(--op-font-size-sm);
2607
+ text-align: end;
2608
+ padding-block-start: var(--op-space-1);
2609
+ }
2610
+ .op-timeline__marker {
2611
+ position: relative;
2612
+ display: flex;
2613
+ align-items: center;
2614
+ justify-content: center;
2615
+ inline-size: var(--op-timeline-marker);
2616
+ block-size: var(--op-timeline-marker);
2617
+ margin-block-start: var(--op-space-1);
2618
+ border-radius: 50%;
2619
+ background: var(--op-timeline-c);
2620
+ color: var(--op-color-surface);
2621
+ font-size: var(--op-font-size-sm);
2622
+ }
2623
+ .op-timeline__marker::after {
2624
+ content: '';
2625
+ position: absolute;
2626
+ inset-block-start: 100%;
2627
+ inset-inline-start: calc(50% - var(--op-timeline-line) / 2);
2628
+ block-size: calc(100% + var(--op-space-5));
2629
+ inline-size: var(--op-timeline-line);
2630
+ background: var(--op-color-border);
2631
+ }
2632
+ .op-timeline__item:last-child .op-timeline__marker::after {
2633
+ display: none;
2634
+ }
2635
+ .op-timeline__title {
2636
+ font-weight: 600;
2637
+ }
2638
+ .op-timeline__text {
2639
+ color: var(--op-color-fg-muted);
2640
+ font-size: var(--op-font-size-sm);
2641
+ }
2642
+
2643
+ .op-timeline__axis,
2644
+ .op-timeline__lane,
2645
+ .op-timeline__nowrow {
2646
+ display: grid;
2647
+ grid-template-columns: var(--op-timeline-lane-width) 1fr;
2648
+ gap: var(--op-space-2);
2649
+ align-items: center;
2650
+ }
2651
+ .op-timeline__lane {
2652
+ border-block-start: var(--op-border-width) solid var(--op-color-border);
2653
+ padding-block: var(--op-space-1);
2654
+ }
2655
+ .op-timeline__lane-name {
2656
+ font-size: var(--op-font-size-sm);
2657
+ overflow: hidden;
2658
+ text-overflow: ellipsis;
2659
+ white-space: nowrap;
2660
+ }
2661
+ .op-timeline__track {
2662
+ position: relative;
2663
+ block-size: var(--op-timeline-bar-height);
2664
+ }
2665
+ .op-timeline__axis .op-timeline__track {
2666
+ block-size: auto;
2667
+ min-block-size: var(--op-space-4);
2668
+ }
2669
+ .op-timeline__tick {
2670
+ position: absolute;
2671
+ color: var(--op-color-fg-muted);
2672
+ font-size: var(--op-font-size-sm);
2673
+ white-space: nowrap;
2674
+ }
2675
+ .op-timeline__bar {
2676
+ --op-timeline-c: var(--op-color-primary);
2677
+ position: absolute;
2678
+ inset-block: 0;
2679
+ display: flex;
2680
+ align-items: center;
2681
+ gap: var(--op-space-1);
2682
+ padding-inline: var(--op-space-2);
2683
+ overflow: hidden;
2684
+ background: var(--op-timeline-c);
2685
+ color: var(--op-color-primary-fg);
2686
+ border-radius: var(--op-radius);
2687
+ font-size: var(--op-font-size-sm);
2688
+ cursor: pointer;
2689
+ }
2690
+ .op-timeline__bar.is-success { --op-timeline-c: var(--op-color-success); color: var(--op-color-surface); }
2691
+ .op-timeline__bar.is-warning { --op-timeline-c: var(--op-color-warning); color: var(--op-color-surface); }
2692
+ .op-timeline__bar.is-danger { --op-timeline-c: var(--op-color-danger); color: var(--op-color-danger-fg); }
2693
+ .op-timeline__bar.is-info { --op-timeline-c: var(--op-color-info); color: var(--op-color-surface); }
2694
+ .op-timeline__bar-text {
2695
+ overflow: hidden;
2696
+ text-overflow: ellipsis;
2697
+ white-space: nowrap;
2698
+ }
2699
+ .op-timeline__nowrow {
2700
+ block-size: 0;
1684
2701
  }
1685
- .op-searchgrid > .op-grid {
1686
- flex: 1;
1687
- min-block-size: var(--op-searchgrid-grid-min-height);
2702
+ .op-timeline__now {
2703
+ position: absolute;
2704
+ inset-block: calc(-1 * var(--op-space-6)) 0;
2705
+ inline-size: var(--op-timeline-line);
2706
+ background: var(--op-color-danger);
2707
+ pointer-events: none;
1688
2708
  }
1689
- }
1690
2709
 
1691
- @layer optikos {
1692
- .op-table {
1693
- inline-size: 100%;
1694
- border-collapse: collapse;
1695
- color: var(--op-color-fg);
1696
- font-size: var(--op-font-size);
2710
+ .op-timeline--vertical.op-timeline--range {
2711
+ display: grid;
2712
+ gap: var(--op-space-2);
1697
2713
  }
1698
- .op-table caption {
1699
- padding: var(--op-space-2);
1700
- text-align: start;
1701
- color: var(--op-color-fg-muted);
2714
+ .op-timeline--vertical .op-timeline__axis,
2715
+ .op-timeline--vertical .op-timeline__lane {
2716
+ display: flex;
2717
+ flex-direction: column;
2718
+ align-items: stretch;
2719
+ border-block-start: 0;
2720
+ border-inline-start: var(--op-border-width) solid var(--op-color-border);
2721
+ padding-block: 0;
2722
+ padding-inline: var(--op-space-1);
2723
+ min-inline-size: 0;
1702
2724
  }
1703
- .op-table th,
1704
- .op-table td {
1705
- padding: var(--op-table-cell-padding-y, var(--op-space-2)) var(--op-table-cell-padding-x, var(--op-space-3));
1706
- text-align: start;
1707
- border-block-end: var(--op-border-width) solid var(--op-table-border, var(--op-color-border));
2725
+ .op-timeline--vertical .op-timeline__axis {
2726
+ border-inline-start: 0;
1708
2727
  }
1709
- .op-table th {
1710
- background: var(--op-table-header-bg, var(--op-color-surface-2));
1711
- font-weight: var(--op-font-weight-bold);
2728
+ .op-timeline--vertical .op-timeline__lane-name {
2729
+ text-align: center;
2730
+ padding-block-end: var(--op-space-1);
1712
2731
  }
1713
- .op-table--striped tbody tr:nth-child(even) {
1714
- background: var(--op-table-stripe-bg, var(--op-color-surface-2));
2732
+ .op-timeline--vertical .op-timeline__track,
2733
+ .op-timeline--vertical .op-timeline__axis .op-timeline__track {
2734
+ block-size: var(--op-timeline-height);
1715
2735
  }
1716
- .op-table .op-table__cell--right {
1717
- text-align: end;
2736
+ .op-timeline--vertical .op-timeline__tick {
2737
+ inset-inline-start: 0;
2738
+ transform: translateY(-50%);
1718
2739
  }
1719
- .op-table .op-table__cell--center {
1720
- text-align: center;
2740
+ .op-timeline--vertical .op-timeline__bar {
2741
+ inset-block: auto;
2742
+ inset-inline: 0;
2743
+ align-items: flex-start;
2744
+ padding-block: var(--op-space-1);
1721
2745
  }
1722
- .op-table__empty td {
1723
- text-align: center;
1724
- color: var(--op-color-fg-muted);
2746
+ .op-timeline--vertical .op-timeline__now {
2747
+ inset-block: auto;
2748
+ inset-inline: 0;
2749
+ inline-size: auto;
2750
+ block-size: var(--op-timeline-line);
1725
2751
  }
1726
2752
  }
1727
2753
 
@@ -1820,6 +2846,42 @@
1820
2846
  }
1821
2847
  }
1822
2848
 
2849
+ @layer optikos {
2850
+ :root {
2851
+ --op-grid-indent: 1.25rem;
2852
+ --op-grid-expander-size: 1.25rem;
2853
+ }
2854
+ .op-grid--tree .op-grid__cell:has(> .op-grid__expander) {
2855
+ padding-inline-start: calc(var(--op-grid-cell-padding-x, var(--op-control-padding-x)) + var(--_depth, 0) * var(--op-grid-indent));
2856
+ }
2857
+ .op-grid__expander {
2858
+ display: inline-flex;
2859
+ flex: none;
2860
+ align-items: center;
2861
+ justify-content: center;
2862
+ inline-size: var(--op-grid-expander-size);
2863
+ block-size: var(--op-grid-expander-size);
2864
+ margin-inline-end: var(--op-space-1);
2865
+ color: var(--op-color-fg-muted);
2866
+ cursor: pointer;
2867
+ transition: transform var(--op-duration) var(--op-easing);
2868
+ }
2869
+ .op-grid__body-row[aria-expanded='false'] .op-grid__expander:not(.is-leaf) {
2870
+ transform: rotate(-90deg);
2871
+ }
2872
+ .op-grid__expander.is-leaf {
2873
+ cursor: default;
2874
+ }
2875
+ .op-grid__expander.is-loading {
2876
+ cursor: progress;
2877
+ }
2878
+ @media (prefers-reduced-motion: reduce) {
2879
+ .op-grid__expander {
2880
+ transition: none;
2881
+ }
2882
+ }
2883
+ }
2884
+
1823
2885
  @layer optikos {
1824
2886
  :root {
1825
2887
  --op-calendar-day-size: 2.25rem;
@@ -2007,6 +3069,22 @@
2007
3069
  }
2008
3070
  }
2009
3071
 
3072
+ @layer optikos {
3073
+ .op-datetimefield__parts {
3074
+ display: flex;
3075
+ gap: var(--op-datetimefield-gap, var(--op-space-2));
3076
+ }
3077
+ .op-datetimefield__parts > .op-field {
3078
+ margin: 0;
3079
+ }
3080
+ .op-datetimefield__parts > .op-field:first-child {
3081
+ flex: 1 1 60%;
3082
+ }
3083
+ .op-datetimefield__parts > .op-field:last-child {
3084
+ flex: 1 1 40%;
3085
+ }
3086
+ }
3087
+
2010
3088
  @layer optikos {
2011
3089
  :root {
2012
3090
  --op-dial-spacing: 0.75rem;
@@ -2211,6 +3289,110 @@
2211
3289
  }
2212
3290
  }
2213
3291
 
3292
+ @layer optikos {
3293
+ :root {
3294
+ --op-imagefield-thumb-size: 4rem;
3295
+ --op-imagefield-remove-icon: 0.875rem;
3296
+ }
3297
+ .op-imagefield__box {
3298
+ display: flex;
3299
+ flex-direction: column;
3300
+ gap: var(--op-space-2);
3301
+ }
3302
+ .op-imagefield__picker {
3303
+ display: none;
3304
+ }
3305
+ .op-imagefield__zone {
3306
+ display: flex;
3307
+ flex-direction: column;
3308
+ align-items: center;
3309
+ justify-content: center;
3310
+ gap: var(--op-space-2);
3311
+ padding: var(--op-space-4);
3312
+ min-block-size: calc(var(--op-imagefield-thumb-size) * 1.5);
3313
+ box-sizing: border-box;
3314
+ color: var(--op-color-fg-muted);
3315
+ background: var(--op-imagefield-zone-bg, var(--op-color-surface));
3316
+ border: var(--op-border-width) dashed var(--op-imagefield-zone-border, var(--op-color-border-strong));
3317
+ border-radius: var(--op-imagefield-radius, var(--op-radius));
3318
+ font: inherit;
3319
+ font-size: var(--op-font-size-sm);
3320
+ text-align: center;
3321
+ cursor: pointer;
3322
+ }
3323
+ .op-imagefield__zone[hidden] {
3324
+ display: none;
3325
+ }
3326
+ .op-imagefield__zone:hover:not(:disabled),
3327
+ .op-imagefield.is-dragover .op-imagefield__zone {
3328
+ background: var(--op-imagefield-zone-hover-bg, var(--op-color-primary-soft));
3329
+ border-color: var(--op-color-primary);
3330
+ }
3331
+ .op-imagefield__zone:focus-visible,
3332
+ .op-imagefield__remove:focus-visible {
3333
+ outline: var(--op-focus-width) solid var(--op-color-focus);
3334
+ outline-offset: var(--op-focus-offset);
3335
+ }
3336
+ .op-imagefield__zone:disabled {
3337
+ cursor: not-allowed;
3338
+ opacity: 0.6;
3339
+ }
3340
+ .op-imagefield.is-invalid .op-imagefield__zone {
3341
+ border-color: var(--op-color-danger);
3342
+ }
3343
+ .op-imagefield__list {
3344
+ display: flex;
3345
+ flex-wrap: wrap;
3346
+ gap: var(--op-space-2);
3347
+ }
3348
+ .op-imagefield__list:empty {
3349
+ display: none;
3350
+ }
3351
+ .op-imagefield__item {
3352
+ position: relative;
3353
+ inline-size: var(--op-imagefield-thumb-size);
3354
+ }
3355
+ .op-imagefield__img {
3356
+ display: block;
3357
+ inline-size: 100%;
3358
+ aspect-ratio: 1;
3359
+ object-fit: cover;
3360
+ background: var(--op-color-surface-2, var(--op-color-bg));
3361
+ border: var(--op-border-width) solid var(--op-color-border);
3362
+ border-radius: var(--op-imagefield-radius, var(--op-radius));
3363
+ }
3364
+ .op-imagefield__name {
3365
+ display: block;
3366
+ overflow: hidden;
3367
+ color: var(--op-color-fg-muted);
3368
+ font-size: var(--op-font-size-sm);
3369
+ text-overflow: ellipsis;
3370
+ white-space: nowrap;
3371
+ }
3372
+ .op-imagefield__remove {
3373
+ position: absolute;
3374
+ inset-block-start: var(--op-space-1);
3375
+ inset-inline-end: var(--op-space-1);
3376
+ display: inline-flex;
3377
+ padding: var(--op-space-1);
3378
+ color: var(--op-color-fg);
3379
+ background: var(--op-color-surface);
3380
+ border: var(--op-border-width) solid var(--op-color-border-strong);
3381
+ border-radius: 50%;
3382
+ cursor: pointer;
3383
+ }
3384
+ .op-imagefield__remove[hidden] {
3385
+ display: none;
3386
+ }
3387
+ .op-imagefield__remove:hover:not(:disabled) {
3388
+ color: var(--op-color-danger);
3389
+ }
3390
+ .op-imagefield__remove .op-icon {
3391
+ inline-size: var(--op-imagefield-remove-icon);
3392
+ block-size: var(--op-imagefield-remove-icon);
3393
+ }
3394
+ }
3395
+
2214
3396
  @layer optikos {
2215
3397
  :root {
2216
3398
  --op-listbox-max-height: 15rem;
@@ -3047,6 +4229,7 @@
3047
4229
  .op-stepform__review-list dd {
3048
4230
  margin: 0;
3049
4231
  overflow-wrap: anywhere;
4232
+ white-space: pre-line; /* FieldList: one line per row */
3050
4233
  }
3051
4234
  /* a step's general message (its validate returned a string) */
3052
4235
  .op-stepform__note {
@@ -3059,6 +4242,126 @@
3059
4242
  }
3060
4243
  }
3061
4244
 
4245
+ @layer optikos {
4246
+ :root {
4247
+ --op-carousel-dot-size: 0.5rem;
4248
+ --op-carousel-gap: 0rem;
4249
+ }
4250
+ .op-carousel {
4251
+ display: flex;
4252
+ flex-direction: column;
4253
+ gap: var(--op-space-2);
4254
+ min-inline-size: 0;
4255
+ font-family: var(--op-font-family);
4256
+ }
4257
+ .op-carousel__viewport {
4258
+ position: relative;
4259
+ }
4260
+ .op-carousel__track {
4261
+ position: relative;
4262
+ display: flex;
4263
+ gap: var(--op-carousel-gap);
4264
+ overflow-x: auto;
4265
+ scroll-snap-type: x mandatory;
4266
+ scroll-behavior: smooth;
4267
+ scrollbar-width: none;
4268
+ border-radius: var(--op-carousel-radius, var(--op-radius));
4269
+ }
4270
+ .op-carousel__track::-webkit-scrollbar {
4271
+ display: none;
4272
+ }
4273
+ .op-carousel__track:focus-visible {
4274
+ outline: var(--op-focus-width) solid var(--op-color-focus);
4275
+ outline-offset: var(--op-focus-offset);
4276
+ }
4277
+ .op-carousel__track > * {
4278
+ flex: 0 0 calc((100% - (var(--op-carousel-per-view, 1) - 1) * var(--op-carousel-gap)) / var(--op-carousel-per-view, 1));
4279
+ min-inline-size: 0;
4280
+ scroll-snap-align: start;
4281
+ }
4282
+ .op-carousel__prev,
4283
+ .op-carousel__next {
4284
+ position: absolute;
4285
+ inset-block-start: 50%;
4286
+ translate: 0 -50%;
4287
+ display: inline-flex;
4288
+ padding: var(--op-space-2);
4289
+ color: var(--op-carousel-arrow-fg, var(--op-color-fg));
4290
+ background: var(--op-carousel-arrow-bg, var(--op-color-surface));
4291
+ border: var(--op-border-width) solid var(--op-color-border);
4292
+ border-radius: 50%;
4293
+ box-shadow: var(--op-shadow);
4294
+ cursor: pointer;
4295
+ }
4296
+ .op-carousel__prev {
4297
+ inset-inline-start: var(--op-space-2);
4298
+ }
4299
+ .op-carousel__next {
4300
+ inset-inline-end: var(--op-space-2);
4301
+ }
4302
+ [dir='rtl'] .op-carousel__prev .op-icon,
4303
+ [dir='rtl'] .op-carousel__next .op-icon {
4304
+ scale: -1 1;
4305
+ }
4306
+ .op-carousel__prev:disabled,
4307
+ .op-carousel__next:disabled {
4308
+ opacity: 0.4;
4309
+ cursor: default;
4310
+ }
4311
+ .op-carousel__bar {
4312
+ display: flex;
4313
+ align-items: center;
4314
+ justify-content: center;
4315
+ gap: var(--op-space-3);
4316
+ }
4317
+ .op-carousel__bar:not(:has(:not([hidden]))) {
4318
+ display: none;
4319
+ }
4320
+ .op-carousel__dots {
4321
+ display: flex;
4322
+ gap: var(--op-space-1);
4323
+ }
4324
+ .op-carousel__dot {
4325
+ inline-size: var(--op-carousel-dot-size);
4326
+ block-size: var(--op-carousel-dot-size);
4327
+ padding: 0;
4328
+ background: var(--op-carousel-dot-bg, var(--op-color-border-strong));
4329
+ border: 0;
4330
+ border-radius: 50%;
4331
+ cursor: pointer;
4332
+ }
4333
+ .op-carousel__dot[aria-current] {
4334
+ background: var(--op-carousel-dot-active-bg, var(--op-color-primary));
4335
+ }
4336
+ .op-carousel__toggle {
4337
+ display: inline-flex;
4338
+ padding: var(--op-space-1);
4339
+ color: var(--op-color-fg);
4340
+ background: none;
4341
+ border: 0;
4342
+ border-radius: var(--op-radius);
4343
+ cursor: pointer;
4344
+ }
4345
+ .op-carousel__prev:focus-visible,
4346
+ .op-carousel__next:focus-visible,
4347
+ .op-carousel__dot:focus-visible,
4348
+ .op-carousel__toggle:focus-visible {
4349
+ outline: var(--op-focus-width) solid var(--op-color-focus);
4350
+ outline-offset: var(--op-focus-offset);
4351
+ }
4352
+ .op-carousel__prev[hidden],
4353
+ .op-carousel__next[hidden],
4354
+ .op-carousel__toggle[hidden],
4355
+ .op-carousel__dots[hidden] {
4356
+ display: none;
4357
+ }
4358
+ @media (prefers-reduced-motion: reduce) {
4359
+ .op-carousel__track {
4360
+ scroll-behavior: auto;
4361
+ }
4362
+ }
4363
+ }
4364
+
3062
4365
  @layer optikos {
3063
4366
  .op-container {
3064
4367
  min-width: 0;
@@ -3947,6 +5250,41 @@
3947
5250
  }
3948
5251
  }
3949
5252
 
5253
+ @layer optikos {
5254
+ .op-shortcuts {
5255
+ display: flex;
5256
+ flex-direction: column;
5257
+ gap: var(--op-space-1);
5258
+ padding: var(--op-space-3) var(--op-space-4);
5259
+ font-family: var(--op-font-family);
5260
+ }
5261
+ .op-shortcuts__group {
5262
+ margin: var(--op-space-3) 0 var(--op-space-1);
5263
+ color: var(--op-color-fg-muted);
5264
+ font-size: var(--op-font-size-sm);
5265
+ font-weight: 600;
5266
+ text-transform: uppercase;
5267
+ }
5268
+ .op-shortcuts__group:first-child {
5269
+ margin-block-start: 0;
5270
+ }
5271
+ .op-shortcuts__row {
5272
+ display: flex;
5273
+ justify-content: space-between;
5274
+ gap: var(--op-space-4);
5275
+ padding-block: var(--op-space-1);
5276
+ }
5277
+ .op-shortcuts__kbd {
5278
+ padding: 0 var(--op-space-2);
5279
+ background: var(--op-color-surface-2);
5280
+ border: var(--op-border-width) solid var(--op-color-border);
5281
+ border-radius: var(--op-radius);
5282
+ font-family: inherit;
5283
+ font-size: var(--op-font-size-sm);
5284
+ white-space: nowrap;
5285
+ }
5286
+ }
5287
+
3950
5288
  @layer optikos {
3951
5289
  :root {
3952
5290
  --op-toast-width: 22rem;
@@ -4196,6 +5534,7 @@
4196
5534
  @layer optikos {
4197
5535
  :root {
4198
5536
  --op-window-width: 28rem;
5537
+ --op-window-max-height: 85dvh;
4199
5538
  }
4200
5539
  .op-window-backdrop {
4201
5540
  position: fixed;
@@ -4210,8 +5549,7 @@
4210
5549
  position: fixed;
4211
5550
  inline-size: var(--op-window-width);
4212
5551
  max-inline-size: calc(100vw - var(--op-space-4));
4213
- max-block-size: calc(100vh - var(--op-space-4));
4214
- max-block-size: calc(100dvh - var(--op-space-4));
5552
+ max-block-size: var(--op-window-max-height);
4215
5553
  background: var(--op-window-bg, var(--op-color-surface));
4216
5554
  border-radius: var(--op-window-radius, var(--op-radius-lg));
4217
5555
  box-shadow: var(--op-window-shadow, var(--op-shadow-lg));