optikos 0.1.0 → 0.2.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 (386) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/README.md +13 -11
  3. package/dist/chunk-23XLG2EM.js +2 -0
  4. package/dist/{chunk-666O2GKD.js.map → chunk-23XLG2EM.js.map} +1 -1
  5. package/dist/chunk-27UZFEXD.js +2 -0
  6. package/dist/chunk-27UZFEXD.js.map +7 -0
  7. package/dist/chunk-2ZRNGG2N.js +2 -0
  8. package/dist/chunk-2ZRNGG2N.js.map +7 -0
  9. package/dist/chunk-2ZUZ5HDL.js +2 -0
  10. package/dist/chunk-2ZUZ5HDL.js.map +7 -0
  11. package/dist/chunk-3DBEZGOY.js +2 -0
  12. package/dist/chunk-3DBEZGOY.js.map +7 -0
  13. package/dist/chunk-3S24ZRPK.js +2 -0
  14. package/dist/chunk-3S24ZRPK.js.map +7 -0
  15. package/dist/chunk-3TAW4AKH.js +2 -0
  16. package/dist/chunk-3TAW4AKH.js.map +7 -0
  17. package/dist/chunk-4EZJ5FKJ.js +2 -0
  18. package/dist/{chunk-IHAYOSBR.js.map → chunk-4EZJ5FKJ.js.map} +1 -1
  19. package/dist/chunk-4LZZ244E.js +2 -0
  20. package/dist/chunk-4LZZ244E.js.map +7 -0
  21. package/dist/chunk-4SYIIX5A.js +2 -0
  22. package/dist/chunk-4SYIIX5A.js.map +7 -0
  23. package/dist/chunk-5BC72727.js +2 -0
  24. package/dist/chunk-5BC72727.js.map +7 -0
  25. package/dist/chunk-5DJTP53N.js +2 -0
  26. package/dist/{chunk-ODWPBBVL.js.map → chunk-5DJTP53N.js.map} +1 -1
  27. package/dist/{chunk-NWTTHDIM.js → chunk-5JEXM5S7.js} +2 -2
  28. package/dist/chunk-5Q76ACVI.js +2 -0
  29. package/dist/{chunk-O4DCHALR.js.map → chunk-5Q76ACVI.js.map} +1 -1
  30. package/dist/chunk-5QUY72FX.js +2 -0
  31. package/dist/chunk-5QUY72FX.js.map +7 -0
  32. package/dist/chunk-5YS7OD5E.js +2 -0
  33. package/dist/{chunk-GZNQPENR.js.map → chunk-5YS7OD5E.js.map} +1 -1
  34. package/dist/{chunk-NV5AIBQP.js → chunk-6VBK2I5B.js} +2 -2
  35. package/dist/{chunk-ZYUXCZX7.js → chunk-7KMIFXHZ.js} +2 -2
  36. package/dist/{chunk-IYPKPLCU.js → chunk-A2NKDOYN.js} +2 -2
  37. package/dist/chunk-A2NKDOYN.js.map +7 -0
  38. package/dist/chunk-ATFJ7PNA.js +2 -0
  39. package/dist/chunk-ATFJ7PNA.js.map +7 -0
  40. package/dist/chunk-BXYWVRKJ.js +2 -0
  41. package/dist/chunk-BXYWVRKJ.js.map +7 -0
  42. package/dist/chunk-CKXS375P.js +2 -0
  43. package/dist/chunk-CKXS375P.js.map +7 -0
  44. package/dist/chunk-CUN5QO4T.js +2 -0
  45. package/dist/{chunk-4DHQKECB.js.map → chunk-CUN5QO4T.js.map} +1 -1
  46. package/dist/chunk-DBMWS3O5.js +2 -0
  47. package/dist/chunk-DBMWS3O5.js.map +7 -0
  48. package/dist/chunk-E4VNLYO2.js +2 -0
  49. package/dist/chunk-E4VNLYO2.js.map +7 -0
  50. package/dist/chunk-EDUMAMK4.js +2 -0
  51. package/dist/chunk-EDUMAMK4.js.map +7 -0
  52. package/dist/chunk-ELYARUCN.js +2 -0
  53. package/dist/{chunk-Z25NC4CS.js → chunk-EV73ADN2.js} +2 -2
  54. package/dist/{chunk-LV6HXFHU.js → chunk-FEHGU6EP.js} +3 -3
  55. package/dist/chunk-FEHGU6EP.js.map +7 -0
  56. package/dist/chunk-FHM5NUS4.js +3 -0
  57. package/dist/chunk-FHM5NUS4.js.map +7 -0
  58. package/dist/chunk-G2DAD3MQ.js +2 -0
  59. package/dist/chunk-G2DAD3MQ.js.map +7 -0
  60. package/dist/chunk-G2KUK6AT.js +2 -0
  61. package/dist/chunk-GBPLNXMP.js +2 -0
  62. package/dist/chunk-GBPLNXMP.js.map +7 -0
  63. package/dist/{chunk-LBCWEWPN.js → chunk-GNU4VOOE.js} +2 -2
  64. package/dist/{chunk-IW7PK4VS.js → chunk-GZ7X34QP.js} +2 -2
  65. package/dist/chunk-HOF4JGMQ.js +2 -0
  66. package/dist/chunk-HOF4JGMQ.js.map +7 -0
  67. package/dist/chunk-HXDTGP2K.js +2 -0
  68. package/dist/chunk-HXDTGP2K.js.map +7 -0
  69. package/dist/{chunk-QEQIJAAB.js → chunk-I4SP6JTU.js} +2 -2
  70. package/dist/chunk-IHE2MQ3W.js +2 -0
  71. package/dist/{chunk-OW2ZSMGS.js.map → chunk-IHE2MQ3W.js.map} +1 -1
  72. package/dist/chunk-II6ITOA6.js +2 -0
  73. package/dist/chunk-II6ITOA6.js.map +7 -0
  74. package/dist/chunk-JBLRAM7Z.js +2 -0
  75. package/dist/{chunk-JZNEB7A7.js.map → chunk-JBLRAM7Z.js.map} +1 -1
  76. package/dist/{chunk-4SUKNSCY.js → chunk-JI265XFO.js} +2 -2
  77. package/dist/chunk-JK74QK3M.js +2 -0
  78. package/dist/chunk-JK74QK3M.js.map +7 -0
  79. package/dist/chunk-JOFQJGZK.js +2 -0
  80. package/dist/chunk-JOFQJGZK.js.map +7 -0
  81. package/dist/chunk-KCEUD232.js +2 -0
  82. package/dist/chunk-KCEUD232.js.map +7 -0
  83. package/dist/chunk-KLLAY2IM.js +2 -0
  84. package/dist/chunk-KLLAY2IM.js.map +7 -0
  85. package/dist/chunk-LBJSMXLV.js +2 -0
  86. package/dist/chunk-LBJSMXLV.js.map +7 -0
  87. package/dist/chunk-LQRFNQ2N.js +2 -0
  88. package/dist/chunk-LQRFNQ2N.js.map +7 -0
  89. package/dist/{chunk-NDBFYIL6.js → chunk-LW2WRUVL.js} +2 -2
  90. package/dist/{chunk-NDBFYIL6.js.map → chunk-LW2WRUVL.js.map} +2 -2
  91. package/dist/chunk-M242VYZA.js +2 -0
  92. package/dist/{chunk-XVIC24AW.js.map → chunk-M242VYZA.js.map} +1 -1
  93. package/dist/chunk-MB3MU6HR.js +2 -0
  94. package/dist/chunk-MB3MU6HR.js.map +7 -0
  95. package/dist/chunk-MW3RWBZ7.js +2 -0
  96. package/dist/chunk-MW3RWBZ7.js.map +7 -0
  97. package/dist/chunk-NXSTUFS7.js +2 -0
  98. package/dist/chunk-NXSTUFS7.js.map +7 -0
  99. package/dist/chunk-OEAXCCVM.js +2 -0
  100. package/dist/chunk-OEAXCCVM.js.map +7 -0
  101. package/dist/chunk-OGRFQTXA.js +2 -0
  102. package/dist/chunk-OGRFQTXA.js.map +7 -0
  103. package/dist/chunk-REW4LR46.js +2 -0
  104. package/dist/chunk-REW4LR46.js.map +7 -0
  105. package/dist/chunk-RNN55473.js +2 -0
  106. package/dist/chunk-RNN55473.js.map +7 -0
  107. package/dist/{chunk-6NJW7QFD.js → chunk-SA53QUBF.js} +2 -2
  108. package/dist/chunk-TIPK3SCJ.js +2 -0
  109. package/dist/chunk-TIPK3SCJ.js.map +7 -0
  110. package/dist/{chunk-TBLICXWW.js → chunk-TOLTUOZS.js} +2 -2
  111. package/dist/{chunk-DXO3UJKL.js → chunk-TZOQWCVH.js} +2 -2
  112. package/dist/chunk-VF7BGP6L.js +2 -0
  113. package/dist/chunk-VF7BGP6L.js.map +7 -0
  114. package/dist/chunk-VU3GIDZ3.js +2 -0
  115. package/dist/chunk-VU3GIDZ3.js.map +7 -0
  116. package/dist/{chunk-SNTHW4K2.js → chunk-W3H7GTJY.js} +2 -2
  117. package/dist/{chunk-ZHVSHDLH.js → chunk-XHOBNSBO.js} +2 -2
  118. package/dist/chunk-XX2MVWFS.js +4 -0
  119. package/dist/chunk-XX2MVWFS.js.map +7 -0
  120. package/dist/chunk-XYZ6VZ5T.js +2 -0
  121. package/dist/chunk-XYZ6VZ5T.js.map +7 -0
  122. package/dist/chunk-YBAYEU25.js +2 -0
  123. package/dist/chunk-YBAYEU25.js.map +7 -0
  124. package/dist/chunk-YHEMA56R.js +2 -0
  125. package/dist/{chunk-5GNEFX6F.js.map → chunk-YHEMA56R.js.map} +1 -1
  126. package/dist/chunk-Z2JBUHKA.js +2 -0
  127. package/dist/chunk-Z2JBUHKA.js.map +7 -0
  128. package/dist/{chunk-6O2BXCRN.js → chunk-Z2Z52GFT.js} +2 -2
  129. package/dist/chunk-ZPPELYNJ.js +2 -0
  130. package/dist/chunk-ZPPELYNJ.js.map +7 -0
  131. package/dist/chunk-ZVK4L5GK.js +2 -0
  132. package/dist/chunk-ZVK4L5GK.js.map +7 -0
  133. package/dist/chunk-ZWNQREWS.js +2 -0
  134. package/dist/chunk-ZWNQREWS.js.map +7 -0
  135. package/dist/components/badge.js +2 -0
  136. package/dist/components/badge.js.map +7 -0
  137. package/dist/components/breadcrumb.js +1 -1
  138. package/dist/components/button.js +1 -1
  139. package/dist/components/calendar.js +1 -1
  140. package/dist/components/cellediting.js +2 -0
  141. package/dist/components/cellediting.js.map +7 -0
  142. package/dist/components/chat.js +1 -1
  143. package/dist/components/checkbox.js +1 -1
  144. package/dist/components/checkboxgroup.js +2 -0
  145. package/dist/components/checkboxgroup.js.map +7 -0
  146. package/dist/components/chip.js +2 -0
  147. package/dist/components/chip.js.map +7 -0
  148. package/dist/components/codeviewer.js +2 -0
  149. package/dist/components/codeviewer.js.map +7 -0
  150. package/dist/components/combobox.js +1 -1
  151. package/dist/components/commandpalette.js +1 -1
  152. package/dist/components/container.js +1 -1
  153. package/dist/components/dataview.js +1 -1
  154. package/dist/components/datefield.js +1 -1
  155. package/dist/components/daterangefield.js +1 -1
  156. package/dist/components/dial.js +2 -0
  157. package/dist/components/dial.js.map +7 -0
  158. package/dist/components/dropdown.js +1 -1
  159. package/dist/components/fieldgroup.js +2 -0
  160. package/dist/components/fieldgroup.js.map +7 -0
  161. package/dist/components/fieldlist.js +2 -0
  162. package/dist/components/fieldlist.js.map +7 -0
  163. package/dist/components/fieldset.js +1 -1
  164. package/dist/components/filterbuilder.js +1 -1
  165. package/dist/components/form.js +1 -1
  166. package/dist/components/formactions.js +2 -0
  167. package/dist/components/formactions.js.map +7 -0
  168. package/dist/components/formerrors.js +2 -0
  169. package/dist/components/formerrors.js.map +7 -0
  170. package/dist/components/formsection.js +2 -0
  171. package/dist/components/formsection.js.map +7 -0
  172. package/dist/components/grid.js +1 -1
  173. package/dist/components/icon.js +1 -1
  174. package/dist/components/inputgroup.js +2 -0
  175. package/dist/components/inputgroup.js.map +7 -0
  176. package/dist/components/label.js +1 -1
  177. package/dist/components/listbox.js +1 -1
  178. package/dist/components/lookupfield.js +1 -1
  179. package/dist/components/menu.js +1 -1
  180. package/dist/components/messagebox.js +1 -1
  181. package/dist/components/navmenu.js +1 -1
  182. package/dist/components/numberfield.js +1 -1
  183. package/dist/components/pagination.js +1 -1
  184. package/dist/components/panel.js +1 -1
  185. package/dist/components/pickerfield.js +1 -1
  186. package/dist/components/radiogroup.js +1 -1
  187. package/dist/components/searchgrid.js +1 -1
  188. package/dist/components/secretfield.js +1 -1
  189. package/dist/components/select.js +1 -1
  190. package/dist/components/slider.js +1 -1
  191. package/dist/components/spacer.js +1 -1
  192. package/dist/components/spinner.js +1 -1
  193. package/dist/components/stepform.js +1 -1
  194. package/dist/components/stepper.js +1 -1
  195. package/dist/components/suggestfield.js +1 -1
  196. package/dist/components/table.js +1 -1
  197. package/dist/components/tabs.js +1 -1
  198. package/dist/components/textarea.js +1 -1
  199. package/dist/components/textfield.js +1 -1
  200. package/dist/components/toast.js +1 -1
  201. package/dist/components/toggle.js +2 -0
  202. package/dist/components/toggle.js.map +7 -0
  203. package/dist/components/toolbar.js +1 -1
  204. package/dist/components/tooltip.js +1 -1
  205. package/dist/components/tree.js +2 -0
  206. package/dist/components/tree.js.map +7 -0
  207. package/dist/components/viewmanager.js +1 -1
  208. package/dist/components/viewport.js +1 -1
  209. package/dist/components/widget.js +1 -1
  210. package/dist/components/window.js +1 -1
  211. package/dist/core.js +1 -1
  212. package/dist/css/badge.css +39 -0
  213. package/dist/css/base.css +71 -51
  214. package/dist/css/button.css +2 -0
  215. package/dist/css/cellediting.css +33 -0
  216. package/dist/css/chat.css +0 -1
  217. package/dist/css/checkboxgroup.css +12 -0
  218. package/dist/css/chip.css +64 -0
  219. package/dist/css/codeviewer.css +109 -0
  220. package/dist/css/dial.css +203 -0
  221. package/dist/css/fieldgroup.css +26 -0
  222. package/dist/css/fieldlist.css +84 -0
  223. package/dist/css/fieldset.css +36 -0
  224. package/dist/css/formactions.css +40 -0
  225. package/dist/css/formerrors.css +39 -0
  226. package/dist/css/formsection.css +45 -0
  227. package/dist/css/grid.css +14 -3
  228. package/dist/css/inputgroup.css +58 -0
  229. package/dist/css/menu.css +45 -0
  230. package/dist/css/panel.css +8 -1
  231. package/dist/css/stepper.css +7 -2
  232. package/dist/css/tabs.css +12 -3
  233. package/dist/css/toggle.css +39 -0
  234. package/dist/css/tree.css +94 -0
  235. package/dist/css/widget.css +58 -0
  236. package/dist/css/window.css +4 -0
  237. package/dist/data.js +1 -1
  238. package/dist/index.js +3 -3
  239. package/dist/index.js.map +3 -3
  240. package/dist/optikos.css +1194 -99
  241. package/dist/themes/dark.css +47 -32
  242. package/dist/types/components/badge.d.ts +1 -0
  243. package/dist/types/components/base/badge/badge.d.ts +18 -0
  244. package/dist/types/components/base/chip/chip.d.ts +27 -0
  245. package/dist/types/components/base/codeviewer/codeviewer.d.ts +48 -0
  246. package/dist/types/components/cellediting.d.ts +1 -0
  247. package/dist/types/components/checkboxgroup.d.ts +1 -0
  248. package/dist/types/components/chip.d.ts +1 -0
  249. package/dist/types/components/codeviewer.d.ts +1 -0
  250. package/dist/types/components/data/cellediting/cellediting.d.ts +10 -0
  251. package/dist/types/components/data/filterbuilder/filterbuilder.d.ts +3 -1
  252. package/dist/types/components/data/grid/grid.d.ts +42 -16
  253. package/dist/types/components/data/tree/tree.d.ts +71 -0
  254. package/dist/types/components/dial.d.ts +1 -0
  255. package/dist/types/components/fieldgroup.d.ts +1 -0
  256. package/dist/types/components/fieldlist.d.ts +1 -0
  257. package/dist/types/components/fields/checkboxgroup/checkboxgroup.d.ts +27 -0
  258. package/dist/types/components/fields/dial/dial.d.ts +84 -0
  259. package/dist/types/components/fields/toggle/toggle.d.ts +9 -0
  260. package/dist/types/components/form/fieldgroup/fieldgroup.d.ts +33 -0
  261. package/dist/types/components/form/fieldlist/fieldlist.d.ts +58 -0
  262. package/dist/types/components/form/form/form.d.ts +19 -2
  263. package/dist/types/components/form/formactions/formactions.d.ts +34 -0
  264. package/dist/types/components/form/formerrors/formerrors.d.ts +23 -0
  265. package/dist/types/components/form/formsection/formsection.d.ts +26 -0
  266. package/dist/types/components/form/inputgroup/inputgroup.d.ts +28 -0
  267. package/dist/types/components/form/stepform/stepform.d.ts +2 -0
  268. package/dist/types/components/formactions.d.ts +1 -0
  269. package/dist/types/components/formerrors.d.ts +1 -0
  270. package/dist/types/components/formsection.d.ts +1 -0
  271. package/dist/types/components/inputgroup.d.ts +1 -0
  272. package/dist/types/components/layout/fieldset/fieldset.d.ts +9 -0
  273. package/dist/types/components/layout/panel/panel.d.ts +6 -0
  274. package/dist/types/components/layout/panel/reload.d.ts +1 -0
  275. package/dist/types/components/navigation/tabs/tabs.d.ts +8 -0
  276. package/dist/types/components/overlays/menu/menu.d.ts +15 -0
  277. package/dist/types/components/overlays/messagebox/messagebox.d.ts +8 -0
  278. package/dist/types/components/overlays/widget/widget.d.ts +13 -0
  279. package/dist/types/components/overlays/window/window.d.ts +8 -1
  280. package/dist/types/components/toggle.d.ts +1 -0
  281. package/dist/types/components/tree.d.ts +1 -0
  282. package/dist/types/core/component.d.ts +6 -2
  283. package/dist/types/core/i18n.d.ts +5 -0
  284. package/dist/types/core/index.d.ts +1 -1
  285. package/dist/types/core/position.d.ts +4 -1
  286. package/dist/types/data/column.d.ts +9 -4
  287. package/dist/types/index.d.ts +14 -0
  288. package/dist/types/themes/define.d.ts +4 -3
  289. package/dist/types/ui/enums.d.ts +0 -6
  290. package/dist/types/ui/ui.d.ts +12 -3
  291. package/dist/ui.js +1 -1
  292. package/package.json +6 -1
  293. package/dist/chunk-4COBH4QJ.js +0 -2
  294. package/dist/chunk-4COBH4QJ.js.map +0 -7
  295. package/dist/chunk-4DHQKECB.js +0 -2
  296. package/dist/chunk-4Q67QI7J.js +0 -2
  297. package/dist/chunk-4Q67QI7J.js.map +0 -7
  298. package/dist/chunk-5AXLYDKU.js +0 -2
  299. package/dist/chunk-5AXLYDKU.js.map +0 -7
  300. package/dist/chunk-5GNEFX6F.js +0 -2
  301. package/dist/chunk-5Q6Y6CM4.js +0 -2
  302. package/dist/chunk-5Q6Y6CM4.js.map +0 -7
  303. package/dist/chunk-666O2GKD.js +0 -2
  304. package/dist/chunk-A66MDXHL.js +0 -2
  305. package/dist/chunk-A66MDXHL.js.map +0 -7
  306. package/dist/chunk-ARCW54L2.js +0 -2
  307. package/dist/chunk-ARCW54L2.js.map +0 -7
  308. package/dist/chunk-BIYNHKSA.js +0 -2
  309. package/dist/chunk-BIYNHKSA.js.map +0 -7
  310. package/dist/chunk-BNPVRIFT.js +0 -2
  311. package/dist/chunk-BNPVRIFT.js.map +0 -7
  312. package/dist/chunk-C3N7QTQB.js +0 -2
  313. package/dist/chunk-C3N7QTQB.js.map +0 -7
  314. package/dist/chunk-CEXY5A4T.js +0 -2
  315. package/dist/chunk-CN7USUJR.js +0 -2
  316. package/dist/chunk-CN7USUJR.js.map +0 -7
  317. package/dist/chunk-CQRHNTEX.js +0 -2
  318. package/dist/chunk-CUPAPOKC.js +0 -2
  319. package/dist/chunk-CUPAPOKC.js.map +0 -7
  320. package/dist/chunk-GZNQPENR.js +0 -2
  321. package/dist/chunk-HFFK6K4K.js +0 -2
  322. package/dist/chunk-HFFK6K4K.js.map +0 -7
  323. package/dist/chunk-IHAYOSBR.js +0 -2
  324. package/dist/chunk-IO66A6G5.js +0 -2
  325. package/dist/chunk-IO66A6G5.js.map +0 -7
  326. package/dist/chunk-IYPKPLCU.js.map +0 -7
  327. package/dist/chunk-JTYWZMSZ.js +0 -2
  328. package/dist/chunk-JTYWZMSZ.js.map +0 -7
  329. package/dist/chunk-JVEPKW5X.js +0 -2
  330. package/dist/chunk-JVEPKW5X.js.map +0 -7
  331. package/dist/chunk-JZNEB7A7.js +0 -2
  332. package/dist/chunk-K2DGY6MP.js +0 -2
  333. package/dist/chunk-K2DGY6MP.js.map +0 -7
  334. package/dist/chunk-LEE2FEEL.js +0 -2
  335. package/dist/chunk-LEE2FEEL.js.map +0 -7
  336. package/dist/chunk-LMGCV35W.js +0 -2
  337. package/dist/chunk-LMGCV35W.js.map +0 -7
  338. package/dist/chunk-LV6HXFHU.js.map +0 -7
  339. package/dist/chunk-MA5BJL3S.js +0 -2
  340. package/dist/chunk-MA5BJL3S.js.map +0 -7
  341. package/dist/chunk-NHVEP72K.js +0 -2
  342. package/dist/chunk-NHVEP72K.js.map +0 -7
  343. package/dist/chunk-O4DCHALR.js +0 -2
  344. package/dist/chunk-ODWPBBVL.js +0 -2
  345. package/dist/chunk-OW2ZSMGS.js +0 -2
  346. package/dist/chunk-PSPQH35P.js +0 -2
  347. package/dist/chunk-PSPQH35P.js.map +0 -7
  348. package/dist/chunk-T4OYVG2X.js +0 -2
  349. package/dist/chunk-T4OYVG2X.js.map +0 -7
  350. package/dist/chunk-TK2RC3T5.js +0 -2
  351. package/dist/chunk-TK2RC3T5.js.map +0 -7
  352. package/dist/chunk-U3X2FW6U.js +0 -2
  353. package/dist/chunk-U3X2FW6U.js.map +0 -7
  354. package/dist/chunk-UPOBGNJ5.js +0 -2
  355. package/dist/chunk-UPOBGNJ5.js.map +0 -7
  356. package/dist/chunk-XVIC24AW.js +0 -2
  357. package/dist/chunk-XZ5CUZZP.js +0 -2
  358. package/dist/chunk-XZ5CUZZP.js.map +0 -7
  359. package/dist/chunk-XZEOSW3Q.js +0 -2
  360. package/dist/chunk-XZEOSW3Q.js.map +0 -7
  361. package/dist/chunk-YET5PM6F.js +0 -2
  362. package/dist/chunk-YET5PM6F.js.map +0 -7
  363. package/dist/chunk-ZCAAM4NH.js +0 -2
  364. package/dist/chunk-ZCAAM4NH.js.map +0 -7
  365. package/dist/themes/brand.css +0 -240
  366. package/dist/themes/brutal.css +0 -100
  367. package/dist/themes/corporate.css +0 -112
  368. package/dist/themes/editorial.css +0 -110
  369. package/dist/themes/soft.css +0 -101
  370. package/dist/themes/terminal.css +0 -91
  371. /package/dist/{chunk-NWTTHDIM.js.map → chunk-5JEXM5S7.js.map} +0 -0
  372. /package/dist/{chunk-NV5AIBQP.js.map → chunk-6VBK2I5B.js.map} +0 -0
  373. /package/dist/{chunk-ZYUXCZX7.js.map → chunk-7KMIFXHZ.js.map} +0 -0
  374. /package/dist/{chunk-CEXY5A4T.js.map → chunk-ELYARUCN.js.map} +0 -0
  375. /package/dist/{chunk-Z25NC4CS.js.map → chunk-EV73ADN2.js.map} +0 -0
  376. /package/dist/{chunk-CQRHNTEX.js.map → chunk-G2KUK6AT.js.map} +0 -0
  377. /package/dist/{chunk-LBCWEWPN.js.map → chunk-GNU4VOOE.js.map} +0 -0
  378. /package/dist/{chunk-IW7PK4VS.js.map → chunk-GZ7X34QP.js.map} +0 -0
  379. /package/dist/{chunk-QEQIJAAB.js.map → chunk-I4SP6JTU.js.map} +0 -0
  380. /package/dist/{chunk-4SUKNSCY.js.map → chunk-JI265XFO.js.map} +0 -0
  381. /package/dist/{chunk-6NJW7QFD.js.map → chunk-SA53QUBF.js.map} +0 -0
  382. /package/dist/{chunk-TBLICXWW.js.map → chunk-TOLTUOZS.js.map} +0 -0
  383. /package/dist/{chunk-DXO3UJKL.js.map → chunk-TZOQWCVH.js.map} +0 -0
  384. /package/dist/{chunk-SNTHW4K2.js.map → chunk-W3H7GTJY.js.map} +0 -0
  385. /package/dist/{chunk-ZHVSHDLH.js.map → chunk-XHOBNSBO.js.map} +0 -0
  386. /package/dist/{chunk-6O2BXCRN.js.map → chunk-Z2Z52GFT.js.map} +0 -0
package/dist/optikos.css CHANGED
@@ -37,74 +37,74 @@
37
37
  --op-amber-600: #d97706;
38
38
  --op-amber-700: #b45309;
39
39
 
40
- /* semantic colors */
41
- --op-color-bg: var(--op-gray-50);
40
+ /* semantic colors: steel blue on cool grey, made for long sessions in grids and forms */
41
+ --op-color-bg: #edf0f4;
42
42
  --op-color-surface: var(--op-gray-0);
43
- --op-color-surface-2: var(--op-gray-100);
44
- --op-color-fg: var(--op-gray-900);
45
- --op-color-fg-muted: var(--op-gray-500);
46
- --op-color-border: var(--op-gray-200);
47
- --op-color-border-strong: var(--op-gray-300);
48
- --op-color-hover: var(--op-gray-100);
49
- --op-color-selected: var(--op-blue-100);
50
- --op-color-primary: var(--op-blue-600);
51
- --op-color-primary-hover: var(--op-blue-700);
43
+ --op-color-surface-2: #f3f5f8;
44
+ --op-color-fg: #1b2430;
45
+ --op-color-fg-muted: #5b6676; /* keeps 4.5:1 on surface-2 */
46
+ --op-color-border: #d8dee6;
47
+ --op-color-border-strong: #a9b3c1;
48
+ --op-color-hover: #eaeff6;
49
+ --op-color-selected: #d9e6f7;
50
+ --op-color-primary: #1f4e8c;
51
+ --op-color-primary-hover: #173d6f;
52
52
  --op-color-primary-fg: var(--op-gray-0);
53
- --op-color-primary-soft: var(--op-blue-50);
54
- --op-color-danger: var(--op-red-600);
55
- --op-color-danger-hover: var(--op-red-700);
53
+ --op-color-primary-soft: #e4edf8;
54
+ --op-color-danger: #b3261e;
55
+ --op-color-danger-hover: #8f1d17;
56
56
  --op-color-danger-fg: var(--op-gray-0);
57
- --op-color-danger-soft: var(--op-red-50);
58
- --op-color-success: var(--op-green-600);
59
- --op-color-success-soft: var(--op-green-50);
60
- --op-color-warning: var(--op-amber-600);
61
- --op-color-warning-soft: var(--op-amber-50);
62
- --op-color-info: var(--op-blue-600);
63
- --op-color-info-soft: var(--op-blue-50);
64
- --op-color-focus: var(--op-blue-500);
65
- --op-color-disabled-fg: var(--op-gray-400);
66
- --op-color-disabled-bg: var(--op-gray-100);
67
- --op-color-overlay: rgb(15 23 42 / 0.5);
68
- --op-color-inverse-bg: var(--op-gray-800);
69
- --op-color-inverse-fg: var(--op-gray-50);
57
+ --op-color-danger-soft: #fbe4e2;
58
+ --op-color-success: #1e7a4d;
59
+ --op-color-success-soft: #dff2e8;
60
+ --op-color-warning: #9a5b00;
61
+ --op-color-warning-soft: #fcecc9;
62
+ --op-color-info: #1f5fa8;
63
+ --op-color-info-soft: #dfeaf8;
64
+ --op-color-focus: #2f7bd6;
65
+ --op-color-disabled-fg: #9aa4b2;
66
+ --op-color-disabled-bg: #eef1f5;
67
+ --op-color-overlay: rgb(16 24 38 / 0.5);
68
+ --op-color-inverse-bg: #14213a;
69
+ --op-color-inverse-fg: #eaf0fa;
70
70
 
71
71
  /* typography */
72
- --op-font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
72
+ --op-font-family: 'Segoe UI', Inter, Roboto, 'Helvetica Neue', Arial, system-ui, sans-serif;
73
73
  --op-font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;
74
- --op-font-size: 0.875rem;
75
- --op-font-size-sm: 0.75rem;
76
- --op-font-size-lg: 1rem;
77
- --op-font-size-xl: 1.25rem;
78
- --op-line-height: 1.4;
74
+ --op-font-size: 0.9375rem;
75
+ --op-font-size-sm: 0.8125rem;
76
+ --op-font-size-lg: 1.0625rem;
77
+ --op-font-size-xl: 1.3125rem;
78
+ --op-line-height: 1.45;
79
79
  --op-font-weight: 400;
80
80
  --op-font-weight-medium: 500;
81
81
  --op-font-weight-bold: 600;
82
82
 
83
- /* spacing, density, shape */
83
+ /* spacing, density, shape: comfortable, small radii, hairline borders */
84
84
  --op-space-1: 0.25rem;
85
85
  --op-space-2: 0.5rem;
86
- --op-space-3: 0.75rem;
87
- --op-space-4: 1rem;
86
+ --op-space-3: 0.875rem;
87
+ --op-space-4: 1.125rem;
88
88
  --op-space-5: 1.5rem;
89
- --op-space-6: 2rem;
90
- --op-control-height: 2.25rem;
91
- --op-control-padding-x: 0.75rem;
92
- --op-row-height: 2.25rem;
89
+ --op-space-6: 2.25rem;
90
+ --op-control-height: 2.375rem;
91
+ --op-control-padding-x: 0.875rem;
92
+ --op-row-height: 2.75rem;
93
93
  --op-border-width: 1px;
94
- --op-radius-sm: 0.25rem;
95
- --op-radius: 0.375rem;
96
- --op-radius-lg: 0.75rem;
94
+ --op-radius-sm: 0.1875rem;
95
+ --op-radius: 0.25rem;
96
+ --op-radius-lg: 0.375rem;
97
97
  --op-radius-pill: 62.5rem;
98
98
  --op-focus-width: 2px;
99
- --op-focus-offset: 2px;
100
- --op-icon-size: 1.25em;
101
- --op-icon-stroke: 2;
99
+ --op-focus-offset: 1px;
100
+ --op-icon-size: 1.3em;
101
+ --op-icon-stroke: 1.75;
102
102
 
103
- /* elevation and motion */
104
- --op-shadow-sm: 0 1px 2px rgb(15 23 42 / 0.08);
105
- --op-shadow: 0 4px 12px rgb(15 23 42 / 0.12);
106
- --op-shadow-lg: 0 12px 32px rgb(15 23 42 / 0.2);
107
- --op-duration: 120ms;
103
+ /* elevation and motion: flat at rest, shadows only on what floats */
104
+ --op-shadow-sm: none;
105
+ --op-shadow: 0 2px 6px rgb(16 24 38 / 0.14);
106
+ --op-shadow-lg: 0 10px 28px rgb(16 24 38 / 0.28);
107
+ --op-duration: 90ms;
108
108
 
109
109
  /* scrollbars follow the theme: thin, thumb from the strong border, track transparent */
110
110
  --op-scrollbar-width: thin;
@@ -115,6 +115,26 @@
115
115
  --op-z-layer: 1000;
116
116
  }
117
117
 
118
+ /* The light look's component colors (a navy sidebar, a tinted grid header). Literal values, and not on :root under
119
+ another theme, so a theme that does not set them keeps the component defaults. dark.css sets its own. */
120
+ :root:not([data-op-theme]),
121
+ [data-op-theme~='light'],
122
+ [data-op-theme='compact'] {
123
+ --op-navmenu-item-height: 2.5rem;
124
+ --op-navmenu-bg: #14213a;
125
+ --op-navmenu-fg: #d5ddeb;
126
+ --op-navmenu-group-fg: #8195b4;
127
+ --op-navmenu-item-hover-bg: #1d2f52;
128
+ --op-navmenu-active-bg: #203c6a;
129
+ --op-navmenu-active-fg: #ffffff;
130
+ --op-navmenu-active-bar: #5ea6f5;
131
+ --op-navmenu-badge-bg: #5ea6f5;
132
+ --op-navmenu-badge-fg: #0a1730;
133
+ --op-grid-header-bg: #e6ebf1;
134
+ --op-grid-header-fg: #2a3547;
135
+ --op-field-label-weight: 600;
136
+ }
137
+
118
138
  @media (prefers-reduced-motion: reduce) {
119
139
  :root,
120
140
  [data-op-theme] {
@@ -428,9 +448,50 @@
428
448
  }
429
449
  }
430
450
 
451
+ @layer optikos {
452
+ :root {
453
+ --op-badge-dot-size: 0.5rem;
454
+ --op-badge-height: 1.5em;
455
+ --op-badge-icon-size: 1em;
456
+ }
457
+ .op-badge {
458
+ --_fg: var(--op-color-fg);
459
+ --_bg: var(--op-color-surface-2);
460
+ display: inline-flex;
461
+ align-items: center;
462
+ gap: var(--op-space-1);
463
+ padding: 0 var(--op-badge-padding-x, var(--op-space-2));
464
+ min-block-size: var(--op-badge-height);
465
+ box-sizing: border-box;
466
+ color: var(--op-badge-fg, var(--_fg));
467
+ background: var(--op-badge-bg, var(--_bg));
468
+ border-radius: var(--op-badge-radius, var(--op-radius-pill));
469
+ font-size: var(--op-font-size-sm);
470
+ font-weight: var(--op-badge-font-weight, var(--op-font-weight-bold));
471
+ line-height: 1;
472
+ white-space: nowrap;
473
+ vertical-align: middle;
474
+ }
475
+ .op-badge--primary { --_fg: var(--op-color-primary-text, var(--op-color-primary)); --_bg: var(--op-color-primary-soft); }
476
+ .op-badge--success { --_fg: var(--op-color-success); --_bg: var(--op-color-success-soft); }
477
+ .op-badge--warning { --_fg: var(--op-color-warning); --_bg: var(--op-color-warning-soft); }
478
+ .op-badge--danger { --_fg: var(--op-color-danger); --_bg: var(--op-color-danger-soft); }
479
+ .op-badge--info { --_fg: var(--op-color-info); --_bg: var(--op-color-info-soft); }
480
+ .op-badge__dot {
481
+ inline-size: var(--op-badge-dot-size);
482
+ block-size: var(--op-badge-dot-size);
483
+ border-radius: 50%;
484
+ background: currentColor;
485
+ }
486
+ .op-badge .op-icon {
487
+ --op-icon-size: var(--op-badge-icon-size);
488
+ }
489
+ }
490
+
431
491
  @layer optikos {
432
492
  :root {
433
493
  --op-button-spinner-size: 1em;
494
+ --op-button-primary-shadow: inset 0 -1px 0 rgb(0 0 0 / 0.25);
434
495
  }
435
496
 
436
497
  .op-button {
@@ -502,6 +563,7 @@
502
563
  --_border: var(--op-button-primary-bg, var(--op-color-primary));
503
564
  --_hover: var(--op-button-primary-hover-bg, var(--op-color-primary-hover));
504
565
  --_active: var(--op-button-primary-hover-bg, var(--op-color-primary-hover));
566
+ box-shadow: var(--op-button-primary-shadow);
505
567
  }
506
568
  .op-button--danger {
507
569
  --_bg: var(--op-button-danger-bg, var(--op-color-danger));
@@ -530,6 +592,181 @@
530
592
  }
531
593
  }
532
594
 
595
+ @layer optikos {
596
+ .op-chip {
597
+ display: inline-flex;
598
+ align-items: center;
599
+ max-inline-size: 100%;
600
+ box-sizing: border-box;
601
+ min-block-size: var(--op-chip-height, calc(var(--op-control-height) * 0.8));
602
+ color: var(--op-chip-fg, var(--op-color-fg));
603
+ background: var(--op-chip-bg, var(--op-color-surface));
604
+ border: var(--op-border-width) solid var(--op-chip-border, var(--op-color-border-strong));
605
+ border-radius: var(--op-chip-radius, var(--op-radius-pill));
606
+ font-size: var(--op-font-size-sm);
607
+ vertical-align: middle;
608
+ }
609
+ .op-chip__main,
610
+ .op-chip__remove {
611
+ display: inline-flex;
612
+ align-items: center;
613
+ gap: var(--op-space-1);
614
+ padding: 0 var(--op-space-3);
615
+ min-block-size: inherit;
616
+ color: inherit;
617
+ background: none;
618
+ border: 0;
619
+ border-radius: inherit;
620
+ font: inherit;
621
+ cursor: pointer;
622
+ }
623
+ .op-chip__main {
624
+ min-inline-size: 0;
625
+ }
626
+ .op-chip__text {
627
+ overflow: hidden;
628
+ text-overflow: ellipsis;
629
+ white-space: nowrap;
630
+ }
631
+ .op-chip__remove {
632
+ padding-inline: var(--op-space-1) var(--op-space-2);
633
+ color: var(--op-color-fg-muted);
634
+ }
635
+ .op-chip__remove:hover:not(:disabled) {
636
+ color: var(--op-color-danger);
637
+ }
638
+ .op-chip__main:focus-visible,
639
+ .op-chip__remove:focus-visible {
640
+ outline: var(--op-focus-width) solid var(--op-color-focus);
641
+ outline-offset: calc(var(--op-focus-width) * -1);
642
+ }
643
+ .op-chip:hover:not(.is-disabled) {
644
+ border-color: var(--op-chip-hover-border, var(--op-color-primary));
645
+ }
646
+ .op-chip.is-selected {
647
+ color: var(--op-chip-selected-fg, var(--op-color-primary-text, var(--op-color-primary)));
648
+ background: var(--op-chip-selected-bg, var(--op-color-primary-soft));
649
+ border-color: var(--op-chip-selected-border, var(--op-color-primary));
650
+ }
651
+ .op-chip.is-disabled {
652
+ color: var(--op-color-disabled-fg);
653
+ border-color: var(--op-color-border);
654
+ }
655
+ .op-chip.is-disabled button {
656
+ cursor: default;
657
+ }
658
+ }
659
+
660
+ @layer optikos {
661
+ :root {
662
+ --op-codeviewer-font-size: 0.8125rem;
663
+ --op-codeviewer-line-height: 1.6;
664
+ --op-codeviewer-tab-size: 2;
665
+ --op-codeviewer-gutter-gap: 1.25rem;
666
+ --op-codeviewer-max-height: 32rem;
667
+ }
668
+ .op-codeviewer {
669
+ overflow: hidden;
670
+ color: var(--op-codeviewer-fg, var(--op-color-fg));
671
+ background: var(--op-codeviewer-bg, var(--op-color-surface-2));
672
+ border: var(--op-border-width) solid var(--op-color-border);
673
+ border-radius: var(--op-radius-lg);
674
+ }
675
+ .op-codeviewer__bar {
676
+ display: flex;
677
+ align-items: center;
678
+ justify-content: space-between;
679
+ gap: var(--op-space-2);
680
+ min-block-size: var(--op-control-height);
681
+ padding-inline: var(--op-space-3) var(--op-space-1);
682
+ color: var(--op-color-fg-muted);
683
+ border-block-end: var(--op-border-width) solid var(--op-color-border);
684
+ font-size: var(--op-font-size-sm);
685
+ }
686
+ .op-codeviewer__title {
687
+ overflow: hidden;
688
+ text-overflow: ellipsis;
689
+ white-space: nowrap;
690
+ }
691
+ .op-codeviewer__pre {
692
+ margin: 0;
693
+ padding: var(--op-space-3) var(--op-space-4);
694
+ max-block-size: var(--op-codeviewer-max-height);
695
+ overflow: auto;
696
+ font-family: var(--op-font-mono);
697
+ font-size: var(--op-codeviewer-font-size);
698
+ line-height: var(--op-codeviewer-line-height);
699
+ tab-size: var(--op-codeviewer-tab-size);
700
+ }
701
+ .op-codeviewer__pre:focus-visible {
702
+ outline: var(--op-focus-width) solid var(--op-color-focus);
703
+ outline-offset: calc(var(--op-focus-width) * -1);
704
+ }
705
+ /* the global op-* rule would give lines and tokens the base font: everything inside the code keeps the mono one */
706
+ .op-codeviewer__pre * {
707
+ font-family: inherit;
708
+ font-size: inherit;
709
+ }
710
+ /* lines stretch to the widest one, so a marked line is marked across the whole scroll width */
711
+ .op-codeviewer__code {
712
+ display: block;
713
+ min-inline-size: 100%;
714
+ inline-size: max-content;
715
+ font: inherit;
716
+ }
717
+ .op-codeviewer.is-wrapped .op-codeviewer__code {
718
+ inline-size: auto;
719
+ white-space: pre-wrap;
720
+ overflow-wrap: anywhere;
721
+ }
722
+ .op-codeviewer__line {
723
+ position: relative;
724
+ display: block;
725
+ margin-inline: calc(var(--op-space-4) * -1);
726
+ padding-inline: var(--op-space-4);
727
+ }
728
+ .op-codeviewer__line.is-marked {
729
+ background: var(--op-codeviewer-mark-bg, var(--op-color-selected));
730
+ box-shadow: inset calc(var(--op-border-width) * 3) 0 0 var(--op-color-primary);
731
+ }
732
+ /* line numbers: a CSS counter in the gutter, never part of the text (selection and screen readers skip it) */
733
+ .op-codeviewer.has-numbers .op-codeviewer__line {
734
+ padding-inline-start: calc(var(--op-space-4) + var(--op-codeviewer-gutter, 2ch) + var(--op-codeviewer-gutter-gap));
735
+ }
736
+ .op-codeviewer.has-numbers .op-codeviewer__line::before {
737
+ counter-increment: op-codeline;
738
+ content: counter(op-codeline);
739
+ position: absolute;
740
+ inset-inline-start: var(--op-space-4);
741
+ inline-size: var(--op-codeviewer-gutter, 2ch);
742
+ color: var(--op-codeviewer-gutter-fg, var(--op-color-fg-muted));
743
+ text-align: end;
744
+ user-select: none;
745
+ }
746
+ /* syntax colors are pulled towards the text color, so they keep their contrast in every theme */
747
+ .op-codeviewer__tok--keyword {
748
+ color: var(--op-codeviewer-keyword, color-mix(in srgb, var(--op-color-primary) 80%, var(--op-color-fg)));
749
+ font-weight: var(--op-font-weight-bold);
750
+ }
751
+ .op-codeviewer__tok--string {
752
+ color: var(--op-codeviewer-string, color-mix(in srgb, var(--op-color-success) 70%, var(--op-color-fg)));
753
+ }
754
+ .op-codeviewer__tok--comment {
755
+ color: var(--op-codeviewer-comment, var(--op-color-fg-muted));
756
+ font-style: italic;
757
+ }
758
+ .op-codeviewer__tok--number {
759
+ color: var(--op-codeviewer-number, color-mix(in srgb, var(--op-color-warning) 65%, var(--op-color-fg)));
760
+ }
761
+ .op-codeviewer__tok--property,
762
+ .op-codeviewer__tok--attr {
763
+ color: var(--op-codeviewer-property, color-mix(in srgb, var(--op-color-info) 70%, var(--op-color-fg)));
764
+ }
765
+ .op-codeviewer__tok--tag {
766
+ color: var(--op-codeviewer-tag, color-mix(in srgb, var(--op-color-danger) 70%, var(--op-color-fg)));
767
+ }
768
+ }
769
+
533
770
  @layer optikos {
534
771
  .op-icon {
535
772
  display: inline-flex;
@@ -677,7 +914,6 @@
677
914
  margin-inline-start: var(--op-space-3);
678
915
  margin-block-start: var(--op-space-2);
679
916
  font-size: var(--op-font-size-sm);
680
- opacity: 0.7;
681
917
  }
682
918
  .op-chat__status {
683
919
  display: inline-flex;
@@ -794,6 +1030,40 @@
794
1030
  }
795
1031
  }
796
1032
 
1033
+ @layer optikos {
1034
+ /* the editor fills the cell: no label, no error line, the row height */
1035
+ .op-grid__cell.is-editing {
1036
+ position: relative;
1037
+ padding-block: 0;
1038
+ padding-inline: var(--op-grid-editor-inset, var(--op-space-1));
1039
+ overflow: visible;
1040
+ }
1041
+ .op-grid__editor {
1042
+ inline-size: 100%;
1043
+ }
1044
+ .op-grid__editor .op-textfield__input {
1045
+ min-block-size: 0;
1046
+ block-size: calc(var(--op-grid-row-height, var(--op-row-height)) - 2 * var(--op-space-1));
1047
+ }
1048
+ .op-grid__editor.is-invalid .op-textfield__input {
1049
+ border-color: var(--op-color-danger);
1050
+ }
1051
+ .op-grid__editor .op-field__error {
1052
+ position: absolute;
1053
+ z-index: 1;
1054
+ inset-block-start: 100%;
1055
+ padding: var(--op-space-1) var(--op-space-2);
1056
+ color: var(--op-color-danger-fg);
1057
+ background: var(--op-color-danger);
1058
+ border-radius: var(--op-radius-sm);
1059
+ font-size: var(--op-font-size-sm);
1060
+ white-space: nowrap;
1061
+ }
1062
+ .op-grid__editor .op-field__error:empty {
1063
+ display: none;
1064
+ }
1065
+ }
1066
+
797
1067
  @layer optikos {
798
1068
  :root {
799
1069
  --op-dataview-item-width: 10rem;
@@ -988,6 +1258,7 @@
988
1258
  --op-grid-action-gap: var(--op-space-1);
989
1259
  --op-grid-action-idle-opacity: 0.45;
990
1260
  --op-grid-action-disabled-opacity: 0.3;
1261
+ --op-grid-selected-bar-width: 0.125rem;
991
1262
  }
992
1263
  .op-grid {
993
1264
  --_border: var(--op-grid-border, var(--op-color-border));
@@ -1002,9 +1273,18 @@
1002
1273
  border-radius: var(--op-grid-radius, var(--op-radius));
1003
1274
  overflow: hidden;
1004
1275
  }
1005
- .op-grid:focus-visible {
1276
+ /* header + rows: the focusable role=grid part, between the bulk bar and the pager */
1277
+ .op-grid__table {
1278
+ display: flex;
1279
+ flex: 1 1 auto;
1280
+ flex-direction: column;
1281
+ position: relative;
1282
+ min-inline-size: 0;
1283
+ min-block-size: 0;
1284
+ }
1285
+ .op-grid__table:focus-visible {
1006
1286
  outline: var(--op-focus-width) solid var(--op-color-focus);
1007
- outline-offset: 0;
1287
+ outline-offset: calc(var(--op-focus-width) * -1);
1008
1288
  }
1009
1289
  .op-grid__header {
1010
1290
  position: relative;
@@ -1012,7 +1292,7 @@
1012
1292
  overflow: hidden;
1013
1293
  color: var(--op-grid-header-fg, var(--op-color-fg));
1014
1294
  background: var(--op-grid-header-bg, var(--op-color-surface-2));
1015
- border-block-end: var(--op-border-width) solid var(--_border);
1295
+ border-block-end: var(--op-border-width) solid var(--op-grid-header-border, var(--op-color-border-strong));
1016
1296
  font-weight: var(--op-font-weight-bold);
1017
1297
  }
1018
1298
  .op-grid__row {
@@ -1041,6 +1321,7 @@
1041
1321
  }
1042
1322
  .op-grid__body-row.is-selected {
1043
1323
  background: var(--op-grid-row-selected-bg, var(--op-color-selected));
1324
+ box-shadow: inset var(--op-grid-selected-bar-width) 0 0 var(--op-grid-selected-bar, var(--op-color-primary));
1044
1325
  }
1045
1326
  .op-grid__body-row.is-active {
1046
1327
  outline: var(--op-focus-width) solid var(--op-color-focus);
@@ -1444,6 +1725,101 @@
1444
1725
  }
1445
1726
  }
1446
1727
 
1728
+ @layer optikos {
1729
+ :root {
1730
+ --op-tree-indent: 1.25rem;
1731
+ --op-tree-check-size: 1rem;
1732
+ --op-tree-check-icon-size: 0.8em;
1733
+ }
1734
+ .op-tree {
1735
+ display: block;
1736
+ min-inline-size: 0;
1737
+ overflow: auto;
1738
+ color: var(--op-tree-fg, var(--op-color-fg));
1739
+ background: var(--op-tree-bg, transparent);
1740
+ }
1741
+ .op-tree__root,
1742
+ .op-tree__group {
1743
+ margin: 0;
1744
+ padding: 0;
1745
+ list-style: none;
1746
+ }
1747
+ .op-tree__item {
1748
+ display: flex;
1749
+ align-items: center;
1750
+ gap: var(--op-space-2);
1751
+ box-sizing: border-box;
1752
+ min-block-size: var(--op-tree-item-height, var(--op-row-height));
1753
+ padding-inline: var(--op-space-1) var(--op-space-3);
1754
+ padding-inline-start: calc(var(--op-space-1) + var(--_level, 0) * var(--op-tree-indent));
1755
+ border-radius: var(--op-radius-sm);
1756
+ cursor: pointer;
1757
+ user-select: none;
1758
+ }
1759
+ .op-tree__item:hover:not(.is-disabled) {
1760
+ background: var(--op-tree-hover-bg, var(--op-color-hover));
1761
+ }
1762
+ .op-tree__item:focus-visible {
1763
+ outline: var(--op-focus-width) solid var(--op-color-focus);
1764
+ outline-offset: calc(var(--op-focus-width) * -1);
1765
+ }
1766
+ .op-tree__item.is-selected {
1767
+ color: var(--op-tree-selected-fg, var(--op-color-fg));
1768
+ background: var(--op-tree-selected-bg, var(--op-color-selected));
1769
+ }
1770
+ .op-tree__item.is-disabled {
1771
+ color: var(--op-color-disabled-fg);
1772
+ cursor: default;
1773
+ }
1774
+ .op-tree__toggle {
1775
+ display: inline-grid;
1776
+ place-items: center;
1777
+ flex: none;
1778
+ inline-size: var(--op-tree-indent);
1779
+ color: var(--op-color-fg-muted);
1780
+ }
1781
+ .op-tree__toggle .op-icon {
1782
+ transition: transform var(--op-duration) var(--op-easing);
1783
+ }
1784
+ .op-tree__item.is-expanded > .op-tree__toggle .op-icon {
1785
+ transform: rotate(90deg);
1786
+ }
1787
+ .op-tree__spinner {
1788
+ --op-spinner-size: var(--op-tree-check-size);
1789
+ }
1790
+ .op-tree__check {
1791
+ display: inline-grid;
1792
+ place-items: center;
1793
+ flex: none;
1794
+ box-sizing: border-box;
1795
+ inline-size: var(--op-tree-check-size);
1796
+ block-size: var(--op-tree-check-size);
1797
+ border: var(--op-border-width) solid var(--op-color-border-strong);
1798
+ border-radius: var(--op-radius-sm);
1799
+ background: var(--op-color-surface);
1800
+ --op-icon-size: var(--op-tree-check-icon-size);
1801
+ }
1802
+ .op-tree__check.is-checked,
1803
+ .op-tree__check.is-mixed {
1804
+ color: var(--op-color-primary-fg);
1805
+ background: var(--op-color-primary);
1806
+ border-color: var(--op-color-primary);
1807
+ }
1808
+ .op-tree__icon {
1809
+ display: inline-flex;
1810
+ color: var(--op-tree-icon-fg, var(--op-color-fg-muted));
1811
+ }
1812
+ .op-tree__text {
1813
+ overflow: hidden;
1814
+ text-overflow: ellipsis;
1815
+ white-space: nowrap;
1816
+ }
1817
+ .op-tree__empty {
1818
+ padding: var(--op-space-3);
1819
+ color: var(--op-color-fg-muted);
1820
+ }
1821
+ }
1822
+
1447
1823
  @layer optikos {
1448
1824
  :root {
1449
1825
  --op-calendar-day-size: 2.25rem;
@@ -1619,55 +1995,272 @@
1619
1995
  }
1620
1996
 
1621
1997
  @layer optikos {
1622
- :root {
1623
- --op-listbox-max-height: 15rem;
1998
+ .op-checkboxgroup__options {
1999
+ display: flex;
2000
+ flex-direction: column;
2001
+ gap: var(--op-checkboxgroup-gap, var(--op-space-1));
1624
2002
  }
1625
- .op-listbox {
1626
- position: relative;
1627
- box-sizing: border-box;
1628
- max-block-size: var(--op-listbox-max-height);
1629
- overflow: auto;
1630
- background: var(--op-listbox-bg, var(--op-color-surface));
1631
- color: var(--op-color-fg);
2003
+ .op-checkboxgroup__options--horizontal {
2004
+ flex-direction: row;
2005
+ flex-wrap: wrap;
2006
+ gap: var(--op-checkboxgroup-gap, var(--op-space-4));
1632
2007
  }
1633
- .op-listbox__item {
1634
- box-sizing: border-box;
2008
+ }
2009
+
2010
+ @layer optikos {
2011
+ :root {
2012
+ --op-dial-spacing: 0.75rem;
2013
+ --op-dial-item-spacing: 3.5rem;
2014
+ --op-dial-height: 3.75rem;
2015
+ --op-dial-size: 13rem;
2016
+ --op-dial-readout-size: 2.75rem;
2017
+ --op-dial-readout-size-circle: 2rem;
2018
+ --op-dial-roll-duration: 380ms;
2019
+ --op-dial-tick-height: 0.75rem;
2020
+ --op-dial-major-height: 1.375rem;
2021
+ --op-dial-needle-width: 0.1875rem;
2022
+ --op-dial-label-gap: 0.25rem;
2023
+ --op-dial-ring-inset: 0.5rem;
2024
+ --op-dial-hub: 0.625rem;
2025
+ --op-dial-digit-height: 1em; /* one line of the readout: a reel moves by this per digit */
2026
+ }
2027
+ .op-dial {
2028
+ --_sp: var(--op-dial-spacing);
2029
+ }
2030
+ .op-dial--list {
2031
+ --_sp: var(--op-dial-item-spacing);
2032
+ }
2033
+ .op-dial__box {
1635
2034
  display: flex;
2035
+ flex-direction: column;
1636
2036
  align-items: center;
1637
- padding: var(--op-listbox-item-padding-y, 0) var(--op-listbox-item-padding-x, var(--op-control-padding-x));
1638
- cursor: pointer;
1639
- white-space: nowrap;
1640
- overflow: hidden;
1641
- text-overflow: ellipsis;
1642
- }
1643
- .op-listbox__item.is-active {
1644
- background: var(--op-listbox-item-active-bg, var(--op-color-hover));
2037
+ gap: var(--op-space-2);
1645
2038
  }
1646
- .op-listbox__item.is-selected {
1647
- color: var(--op-listbox-item-selected-fg, var(--op-color-primary));
2039
+
2040
+ /* the readout: digits roll like an odometer (each reel is the column 0–9, moved by --d) */
2041
+ .op-dial__readout {
2042
+ display: flex;
2043
+ justify-content: center;
2044
+ min-block-size: var(--op-dial-digit-height);
2045
+ color: var(--op-dial-readout-fg, var(--op-color-fg));
2046
+ font-size: var(--op-dial-readout-size);
1648
2047
  font-weight: var(--op-font-weight-bold);
2048
+ font-variant-numeric: tabular-nums;
2049
+ line-height: 1;
2050
+ white-space: pre;
1649
2051
  }
1650
- .op-listbox__item.is-disabled {
1651
- color: var(--op-color-disabled-fg);
1652
- cursor: not-allowed;
2052
+ .op-dial__digit,
2053
+ .op-dial__reel {
2054
+ font-size: inherit; /* the global op-* rule would reset them to the base size */
1653
2055
  }
1654
- .op-listbox__mark {
1655
- color: inherit;
1656
- background: var(--op-color-primary-soft);
1657
- font-weight: var(--op-font-weight-bold);
2056
+ .op-dial__digit {
2057
+ display: inline-block;
2058
+ block-size: var(--op-dial-digit-height);
2059
+ overflow: hidden;
1658
2060
  }
1659
- .op-listbox__hint {
1660
- margin-inline-start: auto;
1661
- padding-inline-start: var(--op-space-3);
1662
- color: var(--op-listbox-hint-fg, var(--op-color-fg-muted));
1663
- font-size: var(--op-font-size-sm);
1664
- font-weight: normal;
2061
+ .op-dial__reel {
2062
+ display: flex;
2063
+ flex-direction: column;
2064
+ transform: translateY(calc(var(--d, 0) * -10%));
2065
+ transition: transform var(--op-dial-roll-duration) var(--op-motion-ease-out);
1665
2066
  }
1666
- .op-listbox__empty {
1667
- padding: var(--op-space-3);
1668
- color: var(--op-listbox-empty-fg, var(--op-color-fg-muted));
2067
+ .op-dial__reel > span {
2068
+ display: block;
2069
+ block-size: var(--op-dial-digit-height);
1669
2070
  }
1670
- }
2071
+
2072
+ /* the face: a flat ruler sliding under a fixed needle */
2073
+ .op-dial__face {
2074
+ position: relative;
2075
+ inline-size: 100%;
2076
+ block-size: var(--op-dial-height);
2077
+ border-radius: var(--op-radius);
2078
+ cursor: grab;
2079
+ touch-action: none;
2080
+ user-select: none;
2081
+ }
2082
+ .op-dial__face:focus-visible {
2083
+ outline: var(--op-focus-width) solid var(--op-color-focus);
2084
+ outline-offset: var(--op-focus-offset);
2085
+ }
2086
+ .op-dial.is-dragging .op-dial__face {
2087
+ cursor: grabbing;
2088
+ }
2089
+ .op-dial__window {
2090
+ position: absolute;
2091
+ inset: 0;
2092
+ overflow: hidden;
2093
+ mask-image: linear-gradient(to right, transparent, black 20%, black 80%, transparent);
2094
+ }
2095
+ .op-dial__tape {
2096
+ position: absolute;
2097
+ inset-block: 0;
2098
+ inset-inline-start: 50%;
2099
+ /* --pos (set by the component) is the item under the needle, fractional while dragging */
2100
+ transform: translateX(calc(var(--pos, 0) * -1 * var(--_sp)));
2101
+ transition: transform var(--op-dial-roll-duration) var(--op-motion-ease-out);
2102
+ }
2103
+ .op-dial.is-dragging .op-dial__tape {
2104
+ transition: none;
2105
+ }
2106
+ .op-dial.is-gliding .op-dial__tape {
2107
+ transition-timing-function: var(--op-motion-ease-out);
2108
+ }
2109
+ .op-dial__tick {
2110
+ position: absolute;
2111
+ inset-block-start: 0;
2112
+ inset-inline-start: calc(var(--i) * var(--_sp));
2113
+ inline-size: var(--op-border-width);
2114
+ block-size: var(--op-dial-tick-height);
2115
+ background: var(--op-dial-tick-fg, var(--op-color-border-strong));
2116
+ transform: translateX(-50%);
2117
+ }
2118
+ .op-dial__tick.is-major {
2119
+ inline-size: calc(var(--op-border-width) * 2);
2120
+ block-size: var(--op-dial-major-height);
2121
+ background: var(--op-dial-major-fg, var(--op-color-fg-muted));
2122
+ }
2123
+ .op-dial__tick-label {
2124
+ position: absolute;
2125
+ inset-block-start: calc(100% + var(--op-dial-label-gap));
2126
+ inset-inline-start: 50%;
2127
+ color: var(--op-color-fg-muted);
2128
+ font-size: var(--op-font-size-sm);
2129
+ white-space: nowrap;
2130
+ transform: translateX(-50%);
2131
+ transition: color var(--op-duration) var(--op-easing);
2132
+ }
2133
+ .op-dial__tick.is-current .op-dial__tick-label {
2134
+ color: var(--op-color-primary-text, var(--op-color-primary));
2135
+ font-weight: var(--op-font-weight-bold);
2136
+ }
2137
+ .op-dial__needle {
2138
+ position: absolute;
2139
+ inset-block-start: 0;
2140
+ inset-inline-start: 50%;
2141
+ inline-size: var(--op-dial-needle-width);
2142
+ block-size: calc(var(--op-dial-major-height) + var(--op-space-1));
2143
+ background: var(--op-dial-needle, var(--op-color-primary));
2144
+ border-radius: var(--op-radius-pill);
2145
+ transform: translateX(-50%);
2146
+ pointer-events: none;
2147
+ }
2148
+
2149
+ /* circle: a clock face, the ticks around the ring and a hand from the center */
2150
+ .op-dial--circle .op-dial__face {
2151
+ inline-size: var(--op-dial-size);
2152
+ block-size: var(--op-dial-size);
2153
+ border: var(--op-border-width) solid var(--op-color-border);
2154
+ border-radius: 50%;
2155
+ }
2156
+ .op-dial--circle .op-dial__window {
2157
+ overflow: visible;
2158
+ mask-image: none;
2159
+ }
2160
+ .op-dial--circle .op-dial__tape {
2161
+ inset: 0;
2162
+ transform: none;
2163
+ transition: none;
2164
+ }
2165
+ .op-dial--circle .op-dial__tick {
2166
+ inset-block-start: var(--op-dial-ring-inset);
2167
+ inset-inline-start: 50%;
2168
+ transform-origin: 50% calc(var(--op-dial-size) / 2 - var(--op-dial-ring-inset) - var(--op-border-width));
2169
+ transform: translateX(-50%) rotate(var(--a));
2170
+ }
2171
+ .op-dial--circle .op-dial__tick-label {
2172
+ transform: translateX(-50%) rotate(calc(var(--a) * -1));
2173
+ }
2174
+ .op-dial--circle .op-dial__needle {
2175
+ inset-block-start: auto;
2176
+ inset-block-end: 50%;
2177
+ block-size: calc(var(--op-dial-size) / 2 - var(--op-dial-ring-inset) - var(--op-dial-major-height) - var(--op-space-5) - var(--op-space-2));
2178
+ transform-origin: 50% 100%;
2179
+ transition: transform var(--op-dial-roll-duration) var(--op-motion-ease-out);
2180
+ }
2181
+ .op-dial--circle.is-dragging .op-dial__needle {
2182
+ transition: none;
2183
+ }
2184
+ /* the hub the hand turns on */
2185
+ .op-dial--circle .op-dial__needle::after {
2186
+ content: '';
2187
+ position: absolute;
2188
+ inset-block-end: calc(var(--op-dial-hub) / -2);
2189
+ inset-inline-start: 50%;
2190
+ inline-size: var(--op-dial-hub);
2191
+ block-size: var(--op-dial-hub);
2192
+ background: inherit;
2193
+ border-radius: 50%;
2194
+ transform: translateX(-50%);
2195
+ }
2196
+ .op-dial--circle .op-dial__readout {
2197
+ font-size: var(--op-dial-readout-size-circle);
2198
+ }
2199
+
2200
+ .op-dial.is-disabled .op-dial__face {
2201
+ cursor: not-allowed;
2202
+ opacity: 0.5;
2203
+ }
2204
+ .op-dial.is-readonly .op-dial__face {
2205
+ cursor: default;
2206
+ }
2207
+ .op-motion-off .op-dial__reel,
2208
+ .op-motion-off .op-dial__tape,
2209
+ .op-motion-off .op-dial__needle {
2210
+ transition: none;
2211
+ }
2212
+ }
2213
+
2214
+ @layer optikos {
2215
+ :root {
2216
+ --op-listbox-max-height: 15rem;
2217
+ }
2218
+ .op-listbox {
2219
+ position: relative;
2220
+ box-sizing: border-box;
2221
+ max-block-size: var(--op-listbox-max-height);
2222
+ overflow: auto;
2223
+ background: var(--op-listbox-bg, var(--op-color-surface));
2224
+ color: var(--op-color-fg);
2225
+ }
2226
+ .op-listbox__item {
2227
+ box-sizing: border-box;
2228
+ display: flex;
2229
+ align-items: center;
2230
+ padding: var(--op-listbox-item-padding-y, 0) var(--op-listbox-item-padding-x, var(--op-control-padding-x));
2231
+ cursor: pointer;
2232
+ white-space: nowrap;
2233
+ overflow: hidden;
2234
+ text-overflow: ellipsis;
2235
+ }
2236
+ .op-listbox__item.is-active {
2237
+ background: var(--op-listbox-item-active-bg, var(--op-color-hover));
2238
+ }
2239
+ .op-listbox__item.is-selected {
2240
+ color: var(--op-listbox-item-selected-fg, var(--op-color-primary));
2241
+ font-weight: var(--op-font-weight-bold);
2242
+ }
2243
+ .op-listbox__item.is-disabled {
2244
+ color: var(--op-color-disabled-fg);
2245
+ cursor: not-allowed;
2246
+ }
2247
+ .op-listbox__mark {
2248
+ color: inherit;
2249
+ background: var(--op-color-primary-soft);
2250
+ font-weight: var(--op-font-weight-bold);
2251
+ }
2252
+ .op-listbox__hint {
2253
+ margin-inline-start: auto;
2254
+ padding-inline-start: var(--op-space-3);
2255
+ color: var(--op-listbox-hint-fg, var(--op-color-fg-muted));
2256
+ font-size: var(--op-font-size-sm);
2257
+ font-weight: normal;
2258
+ }
2259
+ .op-listbox__empty {
2260
+ padding: var(--op-space-3);
2261
+ color: var(--op-listbox-empty-fg, var(--op-color-fg-muted));
2262
+ }
2263
+ }
1671
2264
 
1672
2265
  @layer optikos {
1673
2266
  .op-picker__trigger {
@@ -2063,6 +2656,158 @@
2063
2656
  }
2064
2657
  }
2065
2658
 
2659
+ @layer optikos {
2660
+ :root {
2661
+ --op-toggle-width: 2.25rem;
2662
+ --op-toggle-height: 1.25rem;
2663
+ --op-toggle-knob-inset: 0.1875rem;
2664
+ }
2665
+ /* the checkbox box becomes a track; its knob is a pseudo-element that slides */
2666
+ .op-toggle .op-checkbox__box {
2667
+ inline-size: var(--op-toggle-width);
2668
+ block-size: var(--op-toggle-height);
2669
+ border-radius: var(--op-radius-pill);
2670
+ background: var(--op-toggle-track-bg, var(--op-color-border-strong));
2671
+ border-color: transparent;
2672
+ transition: background var(--op-duration) var(--op-easing);
2673
+ }
2674
+ .op-toggle .op-checkbox__box > * {
2675
+ display: none;
2676
+ }
2677
+ .op-toggle .op-checkbox__box::after {
2678
+ content: '';
2679
+ position: absolute;
2680
+ inset-block: var(--op-toggle-knob-inset);
2681
+ inset-inline-start: var(--op-toggle-knob-inset);
2682
+ aspect-ratio: 1;
2683
+ border-radius: 50%;
2684
+ background: var(--op-toggle-knob-bg, var(--op-color-surface));
2685
+ box-shadow: var(--op-shadow-sm);
2686
+ transition: translate var(--op-duration) var(--op-easing);
2687
+ }
2688
+ .op-toggle.is-checked .op-checkbox__box {
2689
+ background: var(--op-toggle-on-bg, var(--op-color-primary));
2690
+ }
2691
+ .op-toggle.is-checked .op-checkbox__box::after {
2692
+ translate: calc(var(--op-toggle-width) - var(--op-toggle-height)) 0;
2693
+ }
2694
+ [dir='rtl'] .op-toggle.is-checked .op-checkbox__box::after {
2695
+ translate: calc((var(--op-toggle-width) - var(--op-toggle-height)) * -1) 0;
2696
+ }
2697
+ }
2698
+
2699
+ @layer optikos {
2700
+ .op-fieldgroup__body {
2701
+ --op-layout-gap: var(--op-fieldgroup-gap, var(--op-space-2));
2702
+ }
2703
+ /* the fields share the row; each still has its label for screen readers, but only the group's label shows */
2704
+ .op-fieldgroup__body > .op-field {
2705
+ flex: 1 1 0;
2706
+ min-inline-size: 0;
2707
+ }
2708
+ .op-fieldgroup__body .op-field__label {
2709
+ position: absolute;
2710
+ inline-size: 0;
2711
+ block-size: 0;
2712
+ overflow: hidden;
2713
+ clip-path: inset(50%);
2714
+ white-space: nowrap;
2715
+ }
2716
+ .op-fieldgroup__body .op-field__help,
2717
+ .op-fieldgroup__body .op-field__error,
2718
+ .op-fieldgroup__body .op-field.op-stable > .op-field__error:empty {
2719
+ display: none; /* the group has the one error line (and beats the reserved line of stableSize) */
2720
+ }
2721
+ .op-fieldgroup > .op-field__label {
2722
+ cursor: default;
2723
+ }
2724
+ }
2725
+
2726
+ @layer optikos {
2727
+ .op-fieldlist__box {
2728
+ display: flex;
2729
+ flex-direction: column;
2730
+ align-items: flex-start;
2731
+ gap: var(--op-fieldlist-gap, var(--op-space-2));
2732
+ }
2733
+ .op-fieldlist__rows {
2734
+ display: flex;
2735
+ flex-direction: column;
2736
+ gap: var(--op-fieldlist-row-gap, var(--op-space-2));
2737
+ align-self: stretch;
2738
+ }
2739
+ .op-fieldlist__row {
2740
+ --op-layout-gap: var(--op-space-2);
2741
+ }
2742
+ .op-fieldlist__row > .op-field {
2743
+ flex: 1 1 0;
2744
+ min-inline-size: 0;
2745
+ }
2746
+ /* the labels read as a column header: shown on the first row, kept for screen readers on the others */
2747
+ .op-fieldlist__row:not(.is-first) .op-field__label {
2748
+ position: absolute;
2749
+ inline-size: 0;
2750
+ block-size: 0;
2751
+ overflow: hidden;
2752
+ clip-path: inset(50%);
2753
+ white-space: nowrap;
2754
+ }
2755
+ .op-fieldlist__row:not(.is-first) .op-field__help {
2756
+ display: none;
2757
+ }
2758
+ .op-fieldlist__tools {
2759
+ display: flex;
2760
+ flex: none;
2761
+ gap: var(--op-space-1);
2762
+ align-self: flex-start;
2763
+ min-block-size: var(--op-control-height);
2764
+ align-items: center;
2765
+ }
2766
+ /* on the first row the tools line up with the inputs, under the labels */
2767
+ .op-fieldlist__row.is-first > .op-fieldlist__tools {
2768
+ margin-block-start: calc(var(--op-font-size) * var(--op-line-height) + var(--op-field-gap, var(--op-space-1)));
2769
+ }
2770
+ .op-fieldlist__tool,
2771
+ .op-fieldlist__add {
2772
+ display: inline-flex;
2773
+ align-items: center;
2774
+ gap: var(--op-space-1);
2775
+ color: var(--op-color-fg-muted);
2776
+ background: transparent;
2777
+ border: 0;
2778
+ border-radius: var(--op-radius-sm);
2779
+ font: inherit;
2780
+ cursor: pointer;
2781
+ }
2782
+ .op-fieldlist__tool {
2783
+ padding: var(--op-space-1);
2784
+ }
2785
+ .op-fieldlist__add {
2786
+ padding: var(--op-space-1) var(--op-space-2);
2787
+ color: var(--op-color-primary-text, var(--op-color-primary));
2788
+ font-weight: var(--op-font-weight-medium);
2789
+ }
2790
+ .op-fieldlist__tool:hover:not(:disabled),
2791
+ .op-fieldlist__add:hover:not(:disabled) {
2792
+ color: var(--op-color-fg);
2793
+ background: var(--op-color-hover);
2794
+ }
2795
+ .op-fieldlist__tool:disabled,
2796
+ .op-fieldlist__add:disabled {
2797
+ color: var(--op-color-disabled-fg);
2798
+ cursor: not-allowed;
2799
+ }
2800
+ .op-fieldlist__tool:focus-visible,
2801
+ .op-fieldlist__add:focus-visible {
2802
+ outline: var(--op-focus-width) solid var(--op-color-focus);
2803
+ outline-offset: var(--op-focus-offset);
2804
+ }
2805
+ .op-fieldlist__empty {
2806
+ color: var(--op-color-fg-muted);
2807
+ font-size: var(--op-font-size-sm);
2808
+ }
2809
+ }
2810
+
2066
2811
  @layer optikos {
2067
2812
  .op-form {
2068
2813
  --op-layout-gap: var(--op-form-gap, var(--op-space-3));
@@ -2072,6 +2817,192 @@
2072
2817
  }
2073
2818
  }
2074
2819
 
2820
+ @layer optikos {
2821
+ .op-formactions {
2822
+ display: flex;
2823
+ flex-wrap: wrap;
2824
+ align-items: center;
2825
+ gap: var(--op-space-2) var(--op-space-3);
2826
+ padding: var(--op-formactions-padding, var(--op-space-3) 0 0);
2827
+ border-block-start: var(--op-border-width) solid var(--op-formactions-border, var(--op-color-border));
2828
+ }
2829
+ .op-formactions__status {
2830
+ flex: 1;
2831
+ min-inline-size: 0;
2832
+ color: var(--op-color-fg-muted);
2833
+ font-size: var(--op-font-size-sm);
2834
+ }
2835
+ .op-formactions__status:not(:empty)::before {
2836
+ content: '';
2837
+ display: inline-block;
2838
+ inline-size: var(--op-space-2);
2839
+ block-size: var(--op-space-2);
2840
+ margin-inline-end: var(--op-space-2);
2841
+ background: var(--op-color-warning);
2842
+ border-radius: 50%;
2843
+ }
2844
+ .op-formactions__buttons {
2845
+ display: flex;
2846
+ flex-wrap: wrap;
2847
+ gap: var(--op-space-2);
2848
+ margin-inline-start: auto;
2849
+ }
2850
+ /* sticky: stays at the bottom of the scrolling area while the form scrolls under it */
2851
+ .op-formactions.is-sticky {
2852
+ position: sticky;
2853
+ inset-block-end: 0;
2854
+ z-index: 1;
2855
+ padding: var(--op-formactions-padding, var(--op-space-3));
2856
+ background: var(--op-formactions-bg, var(--op-color-surface));
2857
+ box-shadow: var(--op-shadow-sm);
2858
+ }
2859
+ }
2860
+
2861
+ @layer optikos {
2862
+ .op-formerrors {
2863
+ padding: var(--op-space-3) var(--op-space-4);
2864
+ color: var(--op-formerrors-fg, var(--op-color-fg));
2865
+ background: var(--op-formerrors-bg, var(--op-color-danger-soft));
2866
+ border: var(--op-border-width) solid var(--op-formerrors-border, var(--op-color-danger));
2867
+ border-inline-start-width: calc(var(--op-border-width) * 4);
2868
+ border-radius: var(--op-radius);
2869
+ }
2870
+ .op-formerrors:focus-visible {
2871
+ outline: var(--op-focus-width) solid var(--op-color-focus);
2872
+ outline-offset: var(--op-focus-offset);
2873
+ }
2874
+ .op-formerrors__title {
2875
+ font-weight: var(--op-font-weight-bold);
2876
+ }
2877
+ .op-formerrors__list {
2878
+ margin: var(--op-space-2) 0 0;
2879
+ padding-inline-start: var(--op-space-4);
2880
+ }
2881
+ .op-formerrors__link {
2882
+ padding: 0;
2883
+ color: var(--op-color-danger);
2884
+ background: none;
2885
+ border: 0;
2886
+ font: inherit;
2887
+ text-align: start;
2888
+ text-decoration: underline;
2889
+ cursor: pointer;
2890
+ }
2891
+ .op-formerrors__link:hover {
2892
+ text-decoration-thickness: calc(var(--op-border-width) * 2);
2893
+ }
2894
+ .op-formerrors__link:focus-visible {
2895
+ outline: var(--op-focus-width) solid var(--op-color-focus);
2896
+ outline-offset: var(--op-focus-offset);
2897
+ border-radius: var(--op-radius-sm);
2898
+ }
2899
+ }
2900
+
2901
+ @layer optikos {
2902
+ :root {
2903
+ --op-formsection-aside-width: 16rem;
2904
+ --op-formsection-gap: var(--op-space-6);
2905
+ }
2906
+ /* side by side when the section itself is wide enough: a container query, so it works inside any panel or window */
2907
+ .op-formsection {
2908
+ display: flow-root; /* holds the floated aside */
2909
+ container-type: inline-size;
2910
+ min-inline-size: 0;
2911
+ }
2912
+ .op-formsection__aside,
2913
+ .op-formsection__body {
2914
+ min-inline-size: 0;
2915
+ }
2916
+ .op-formsection__body {
2917
+ --op-layout-gap: var(--op-form-gap, var(--op-space-3));
2918
+ margin-block-start: var(--op-space-3);
2919
+ }
2920
+ .op-formsection__title {
2921
+ margin: 0;
2922
+ font-size: var(--op-font-size-lg);
2923
+ font-weight: var(--op-font-weight-bold);
2924
+ }
2925
+ .op-formsection__desc {
2926
+ margin: var(--op-space-1) 0 0;
2927
+ color: var(--op-color-fg-muted);
2928
+ font-size: var(--op-font-size-sm);
2929
+ }
2930
+ .op-formsection--divided + .op-formsection--divided {
2931
+ margin-block-start: var(--op-space-4);
2932
+ padding-block-start: var(--op-space-5);
2933
+ border-block-start: var(--op-border-width) solid var(--op-formsection-divider, var(--op-color-border));
2934
+ }
2935
+ @container (min-width: 40rem) {
2936
+ .op-formsection:not(.op-formsection--stacked) > .op-formsection__aside {
2937
+ float: inline-start;
2938
+ inline-size: var(--op-formsection-aside-width);
2939
+ }
2940
+ .op-formsection:not(.op-formsection--stacked) > .op-formsection__body {
2941
+ margin-block-start: 0;
2942
+ margin-inline-start: calc(var(--op-formsection-aside-width) + var(--op-formsection-gap));
2943
+ }
2944
+ }
2945
+ }
2946
+
2947
+ @layer optikos {
2948
+ /* the field's control becomes a row: [prefix][input box][suffix], the inner corners squared off */
2949
+ .op-inputgroup__row {
2950
+ display: flex;
2951
+ align-items: stretch;
2952
+ }
2953
+ .op-inputgroup__row > :not(.op-inputgroup__affix) {
2954
+ flex: 1;
2955
+ min-inline-size: 0;
2956
+ }
2957
+ .op-inputgroup__affix {
2958
+ display: inline-flex;
2959
+ align-items: center;
2960
+ gap: var(--op-space-1);
2961
+ padding-inline: var(--op-control-padding-x);
2962
+ color: var(--op-inputgroup-affix-fg, var(--op-color-fg-muted));
2963
+ background: var(--op-inputgroup-affix-bg, var(--op-color-surface-2));
2964
+ border: var(--op-border-width) solid var(--op-textfield-border, var(--op-color-border-strong));
2965
+ white-space: nowrap;
2966
+ }
2967
+ .op-inputgroup__btn {
2968
+ color: var(--op-color-fg);
2969
+ font: inherit;
2970
+ font-weight: var(--op-font-weight-medium);
2971
+ cursor: pointer;
2972
+ }
2973
+ .op-inputgroup__btn:hover {
2974
+ background: var(--op-color-hover);
2975
+ }
2976
+ .op-inputgroup__btn:focus-visible {
2977
+ position: relative;
2978
+ z-index: 1;
2979
+ outline: var(--op-focus-width) solid var(--op-color-focus);
2980
+ }
2981
+ .op-inputgroup__affix--prefix {
2982
+ margin-inline-end: calc(var(--op-border-width) * -1);
2983
+ border-start-start-radius: var(--op-textfield-radius, var(--op-radius));
2984
+ border-end-start-radius: var(--op-textfield-radius, var(--op-radius));
2985
+ }
2986
+ .op-inputgroup__affix--suffix {
2987
+ margin-inline-start: calc(var(--op-border-width) * -1);
2988
+ border-start-end-radius: var(--op-textfield-radius, var(--op-radius));
2989
+ border-end-end-radius: var(--op-textfield-radius, var(--op-radius));
2990
+ }
2991
+ /* every text-based field (Select, DateField, NumberField...) draws its box on .op-textfield__input */
2992
+ .op-inputgroup .has-prefix .op-textfield__input {
2993
+ border-start-start-radius: 0;
2994
+ border-end-start-radius: 0;
2995
+ }
2996
+ .op-inputgroup .has-suffix .op-textfield__input {
2997
+ border-start-end-radius: 0;
2998
+ border-end-end-radius: 0;
2999
+ }
3000
+ .op-inputgroup .op-textfield__input:focus {
3001
+ position: relative;
3002
+ z-index: 1; /* the focus ring stays above the joined segments */
3003
+ }
3004
+ }
3005
+
2075
3006
  @layer optikos {
2076
3007
  :root {
2077
3008
  --op-stepform-review-label-width: 9rem;
@@ -2156,6 +3087,42 @@
2156
3087
  .op-fieldset.is-collapsed {
2157
3088
  padding-block-end: 0;
2158
3089
  }
3090
+ .op-fieldset__desc {
3091
+ margin: 0 0 var(--op-space-3);
3092
+ padding-inline: var(--op-space-1);
3093
+ color: var(--op-color-fg-muted);
3094
+ font-size: var(--op-font-size-sm);
3095
+ }
3096
+ .op-fieldset__body {
3097
+ --op-layout-gap: var(--op-form-gap, var(--op-space-3));
3098
+ }
3099
+ /* line: no frame, a rule under the legend; plain: just the legend */
3100
+ .op-fieldset--line,
3101
+ .op-fieldset--plain {
3102
+ padding: 0;
3103
+ border: 0;
3104
+ border-radius: 0;
3105
+ }
3106
+ .op-fieldset--line > .op-fieldset__legend,
3107
+ .op-fieldset--plain > .op-fieldset__legend {
3108
+ inline-size: 100%;
3109
+ margin-block-end: var(--op-space-3);
3110
+ padding: 0;
3111
+ }
3112
+ .op-fieldset--line > .op-fieldset__legend {
3113
+ padding-block-end: var(--op-space-2);
3114
+ border-block-end: var(--op-border-width) solid var(--op-fieldset-border, var(--op-color-border));
3115
+ }
3116
+ .op-fieldset--line > .op-fieldset__desc,
3117
+ .op-fieldset--plain > .op-fieldset__desc {
3118
+ margin-block-start: calc(var(--op-space-2) * -1);
3119
+ padding: 0;
3120
+ }
3121
+ .op-fieldset--collapsible-title .op-fieldset__title,
3122
+ .op-fieldset__toggle + .op-fieldset__title {
3123
+ cursor: pointer;
3124
+ user-select: none;
3125
+ }
2159
3126
  }
2160
3127
 
2161
3128
  @layer optikos {
@@ -2179,7 +3146,7 @@
2179
3146
  padding: var(--op-panel-header-padding, var(--op-space-2) var(--op-space-3));
2180
3147
  background: var(--op-panel-header-bg, var(--op-color-surface-2));
2181
3148
  color: var(--op-panel-header-fg, var(--op-color-fg));
2182
- border-block-end: var(--op-border-width) solid var(--op-panel-border, var(--op-color-border));
3149
+ border-block-end: var(--op-border-width) solid var(--op-panel-header-border, var(--op-panel-border, var(--op-color-border-strong)));
2183
3150
  font-weight: var(--op-font-weight-bold);
2184
3151
  }
2185
3152
  .op-panel__title {
@@ -2234,6 +3201,13 @@
2234
3201
  border-block-end: 0;
2235
3202
  border-block-start: var(--op-border-width) solid var(--op-color-border);
2236
3203
  }
3204
+ /* the ↻ tool turns while the panel reloads */
3205
+ .op-panel.is-reloading > .op-panel__header .op-panel__tool svg {
3206
+ animation: op-spin 700ms linear infinite;
3207
+ }
3208
+ .op-motion-off .op-panel.is-reloading > .op-panel__header .op-panel__tool svg {
3209
+ animation: none;
3210
+ }
2237
3211
  }
2238
3212
 
2239
3213
  @layer optikos {
@@ -2543,10 +3517,15 @@
2543
3517
  .op-stepper__step.is-error .op-stepper__btn {
2544
3518
  color: var(--op-color-danger);
2545
3519
  }
2546
- /* phones: only the current step keeps its words */
3520
+ /* phones: only the current step shows its words; the others keep them for screen readers (the button's name) */
2547
3521
  @media (max-width: 40rem) {
2548
3522
  .op-stepper__step:not(.is-current) .op-stepper__text {
2549
- display: none;
3523
+ position: absolute;
3524
+ inline-size: 0;
3525
+ block-size: 0;
3526
+ overflow: hidden;
3527
+ clip-path: inset(50%);
3528
+ white-space: nowrap;
2550
3529
  }
2551
3530
  .op-stepper__step:not(.is-current) {
2552
3531
  flex: none;
@@ -2575,7 +3554,7 @@
2575
3554
  display: flex;
2576
3555
  flex: none;
2577
3556
  gap: var(--op-tabs-gap, var(--op-space-1));
2578
- background: var(--op-tabs-bar-bg, var(--op-color-surface));
3557
+ background: var(--op-tabs-bar-bg, var(--op-color-surface-2));
2579
3558
  border-block-end: var(--op-border-width) solid var(--op-color-border);
2580
3559
  overflow-x: auto;
2581
3560
  overflow-y: hidden;
@@ -2616,13 +3595,22 @@
2616
3595
  color: var(--op-color-disabled-fg);
2617
3596
  cursor: not-allowed;
2618
3597
  }
2619
- .op-tabs__close {
3598
+ .op-tabs__close,
3599
+ .op-tabs__reload {
2620
3600
  display: inline-flex;
2621
3601
  border-radius: var(--op-radius-sm);
2622
3602
  }
2623
- .op-tabs__close:hover {
3603
+ .op-tabs__close:hover,
3604
+ .op-tabs__reload:hover {
2624
3605
  background: var(--op-color-hover);
2625
3606
  }
3607
+ /* the ↻ turns while the tab reloads */
3608
+ .op-tabs__tab.is-reloading .op-tabs__reload svg {
3609
+ animation: op-spin 700ms linear infinite;
3610
+ }
3611
+ .op-motion-off .op-tabs__tab.is-reloading .op-tabs__reload svg {
3612
+ animation: none;
3613
+ }
2626
3614
  .op-tabs__panels {
2627
3615
  flex: 1;
2628
3616
  min-width: 0;
@@ -2842,6 +3830,8 @@
2842
3830
  @layer optikos {
2843
3831
  :root {
2844
3832
  --op-menu-min-width: 10rem;
3833
+ --op-menu-max-height: 22rem;
3834
+ --op-menu-group-tracking: 0.04em;
2845
3835
  }
2846
3836
  .op-menu {
2847
3837
  box-sizing: border-box;
@@ -2885,6 +3875,49 @@
2885
3875
  block-size: var(--op-border-width);
2886
3876
  background: var(--op-menu-sep, var(--op-color-border));
2887
3877
  }
3878
+ /* with search: the field on top, the items scroll under it */
3879
+ .op-menu__search {
3880
+ box-sizing: border-box;
3881
+ inline-size: 100%;
3882
+ min-block-size: var(--op-control-height);
3883
+ margin-block-end: var(--op-space-1);
3884
+ padding: 0 var(--op-space-2);
3885
+ color: var(--op-color-fg);
3886
+ background: var(--op-color-surface);
3887
+ border: var(--op-border-width) solid var(--op-color-border-strong);
3888
+ border-radius: var(--op-radius-sm);
3889
+ font: inherit;
3890
+ }
3891
+ .op-menu__search:focus-visible {
3892
+ outline: var(--op-focus-width) solid var(--op-color-focus);
3893
+ outline-offset: calc(var(--op-focus-width) * -1);
3894
+ }
3895
+ .op-menu__list {
3896
+ max-block-size: var(--op-menu-max-height);
3897
+ overflow: auto;
3898
+ }
3899
+ .op-menu__empty {
3900
+ padding: var(--op-space-2) var(--op-space-3);
3901
+ color: var(--op-color-fg-muted);
3902
+ font-size: var(--op-font-size-sm);
3903
+ }
3904
+ .op-menu.is-searching .op-menu__sep,
3905
+ .op-menu__group:not(:has(.op-menu__item:not([hidden]))) {
3906
+ display: none;
3907
+ }
3908
+ /* groups: a quiet header over the items that share it */
3909
+ .op-menu__group + .op-menu__group,
3910
+ .op-menu__item + .op-menu__group {
3911
+ margin-block-start: var(--op-space-1);
3912
+ }
3913
+ .op-menu__group-label {
3914
+ padding: var(--op-space-2) var(--op-space-3) var(--op-space-1) var(--op-space-2);
3915
+ color: var(--op-menu-group-fg, var(--op-color-fg-muted));
3916
+ font-size: var(--op-font-size-sm);
3917
+ font-weight: var(--op-font-weight-bold);
3918
+ letter-spacing: var(--op-menu-group-tracking);
3919
+ text-transform: uppercase;
3920
+ }
2888
3921
  }
2889
3922
 
2890
3923
  @layer optikos {
@@ -3010,6 +4043,8 @@
3010
4043
  --op-widget-height: 26rem;
3011
4044
  --op-widget-wide: 36rem;
3012
4045
  --op-widget-offset: var(--op-space-4);
4046
+ --op-widget-grip: 0.5rem;
4047
+ --op-widget-corner: 1rem;
3013
4048
  }
3014
4049
  .op-widget {
3015
4050
  min-block-size: 0;
@@ -3080,6 +4115,62 @@
3080
4115
  .op-widget.is-dragging {
3081
4116
  transition: none;
3082
4117
  }
4118
+ /* resize: an invisible strip on the inner edge (a line shows on hover/focus); a corner grip once the widget was moved */
4119
+ .op-widget__resize {
4120
+ position: absolute;
4121
+ z-index: 1;
4122
+ touch-action: none;
4123
+ }
4124
+ .op-widget--right .op-widget__resize,
4125
+ .op-widget--left .op-widget__resize {
4126
+ inset-block: 0;
4127
+ inline-size: var(--op-widget-grip);
4128
+ cursor: ew-resize;
4129
+ }
4130
+ .op-widget--right .op-widget__resize {
4131
+ inset-inline-start: calc(var(--op-widget-grip) / -2);
4132
+ }
4133
+ .op-widget--left .op-widget__resize {
4134
+ inset-inline-end: calc(var(--op-widget-grip) / -2);
4135
+ }
4136
+ .op-widget--top .op-widget__resize,
4137
+ .op-widget--bottom .op-widget__resize {
4138
+ inset-inline: 0;
4139
+ block-size: var(--op-widget-grip);
4140
+ cursor: ns-resize;
4141
+ }
4142
+ .op-widget--top .op-widget__resize {
4143
+ inset-block-end: calc(var(--op-widget-grip) / -2);
4144
+ }
4145
+ .op-widget--bottom .op-widget__resize {
4146
+ inset-block-start: calc(var(--op-widget-grip) / -2);
4147
+ }
4148
+ .op-widget__resize:hover,
4149
+ .op-widget__resize:focus-visible,
4150
+ .op-widget.is-resizing .op-widget__resize {
4151
+ background: linear-gradient(var(--op-color-primary), var(--op-color-primary)) center / var(--op-focus-width) 100% no-repeat;
4152
+ outline: none;
4153
+ }
4154
+ .op-widget--top .op-widget__resize:is(:hover, :focus-visible),
4155
+ .op-widget--bottom .op-widget__resize:is(:hover, :focus-visible),
4156
+ .op-widget--top.is-resizing .op-widget__resize,
4157
+ .op-widget--bottom.is-resizing .op-widget__resize {
4158
+ background-size: 100% var(--op-focus-width);
4159
+ }
4160
+ .op-widget.is-moved .op-widget__resize {
4161
+ inset: auto 0 0 auto;
4162
+ inline-size: var(--op-widget-corner);
4163
+ block-size: var(--op-widget-corner);
4164
+ background: linear-gradient(135deg, transparent 55%, var(--op-color-border-strong) 55% 62%, transparent 62% 75%, var(--op-color-border-strong) 75% 82%, transparent 82%);
4165
+ cursor: nwse-resize;
4166
+ }
4167
+ .op-widget.is-moved .op-widget__resize:focus-visible {
4168
+ outline: var(--op-focus-width) solid var(--op-color-focus);
4169
+ }
4170
+ .op-widget.is-resizing {
4171
+ transition: none;
4172
+ user-select: none;
4173
+ }
3083
4174
  }
3084
4175
 
3085
4176
  @layer optikos {
@@ -3091,6 +4182,10 @@
3091
4182
  inset: 0;
3092
4183
  background: var(--op-backdrop-bg, var(--op-color-overlay));
3093
4184
  }
4185
+ /* mask: false — still modal (the page is inert and takes no clicks), just not dimmed */
4186
+ .op-window-backdrop.is-clear {
4187
+ background: transparent;
4188
+ }
3094
4189
  .op-window {
3095
4190
  position: fixed;
3096
4191
  inline-size: var(--op-window-width);