@react-x11/components 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 (783) hide show
  1. package/README.md +979 -21
  2. package/dist/ansi/cast.d.ts +48 -0
  3. package/dist/ansi/cast.d.ts.map +1 -0
  4. package/dist/ansi/cast.js +135 -0
  5. package/dist/ansi/cast.js.map +1 -0
  6. package/dist/ansi/index.d.ts +10 -0
  7. package/dist/ansi/index.d.ts.map +1 -0
  8. package/dist/ansi/index.js +27 -0
  9. package/dist/ansi/index.js.map +1 -0
  10. package/dist/ansi/palette.d.ts +79 -0
  11. package/dist/ansi/palette.d.ts.map +1 -0
  12. package/dist/ansi/palette.js +155 -0
  13. package/dist/ansi/palette.js.map +1 -0
  14. package/dist/ansi/parse.d.ts +114 -0
  15. package/dist/ansi/parse.d.ts.map +1 -0
  16. package/dist/ansi/parse.js +687 -0
  17. package/dist/ansi/parse.js.map +1 -0
  18. package/dist/ansi/sgr.d.ts +87 -0
  19. package/dist/ansi/sgr.d.ts.map +1 -0
  20. package/dist/ansi/sgr.js +302 -0
  21. package/dist/ansi/sgr.js.map +1 -0
  22. package/dist/ansi/utf8.d.ts +15 -0
  23. package/dist/ansi/utf8.d.ts.map +1 -0
  24. package/dist/ansi/utf8.js +82 -0
  25. package/dist/ansi/utf8.js.map +1 -0
  26. package/dist/calendar/Calendar.d.ts +136 -0
  27. package/dist/calendar/Calendar.d.ts.map +1 -0
  28. package/dist/calendar/Calendar.js +460 -0
  29. package/dist/calendar/Calendar.js.map +1 -0
  30. package/dist/calendar/DatePicker.d.ts +52 -0
  31. package/dist/calendar/DatePicker.d.ts.map +1 -0
  32. package/dist/calendar/DatePicker.js +257 -0
  33. package/dist/calendar/DatePicker.js.map +1 -0
  34. package/dist/calendar/dates.d.ts +90 -0
  35. package/dist/calendar/dates.d.ts.map +1 -0
  36. package/dist/calendar/dates.js +236 -0
  37. package/dist/calendar/dates.js.map +1 -0
  38. package/dist/calendar/index.d.ts +8 -0
  39. package/dist/calendar/index.d.ts.map +1 -0
  40. package/dist/calendar/index.js +15 -0
  41. package/dist/calendar/index.js.map +1 -0
  42. package/dist/charts/components.d.ts +141 -0
  43. package/dist/charts/components.d.ts.map +1 -0
  44. package/dist/charts/components.js +580 -0
  45. package/dist/charts/components.js.map +1 -0
  46. package/dist/charts/data.d.ts +198 -0
  47. package/dist/charts/data.d.ts.map +1 -0
  48. package/dist/charts/data.js +616 -0
  49. package/dist/charts/data.js.map +1 -0
  50. package/dist/charts/hx.d.ts +21 -0
  51. package/dist/charts/hx.d.ts.map +1 -0
  52. package/dist/charts/hx.js +15 -0
  53. package/dist/charts/hx.js.map +1 -0
  54. package/dist/charts/index.d.ts +27 -0
  55. package/dist/charts/index.d.ts.map +1 -0
  56. package/dist/charts/index.js +38 -0
  57. package/dist/charts/index.js.map +1 -0
  58. package/dist/charts/node.d.ts +96 -0
  59. package/dist/charts/node.d.ts.map +1 -0
  60. package/dist/charts/node.js +720 -0
  61. package/dist/charts/node.js.map +1 -0
  62. package/dist/charts/render.d.ts +153 -0
  63. package/dist/charts/render.d.ts.map +1 -0
  64. package/dist/charts/render.js +762 -0
  65. package/dist/charts/render.js.map +1 -0
  66. package/dist/charts/scale.d.ts +42 -0
  67. package/dist/charts/scale.d.ts.map +1 -0
  68. package/dist/charts/scale.js +173 -0
  69. package/dist/charts/scale.js.map +1 -0
  70. package/dist/charts/spec.d.ts +91 -0
  71. package/dist/charts/spec.d.ts.map +1 -0
  72. package/dist/charts/spec.js +33 -0
  73. package/dist/charts/spec.js.map +1 -0
  74. package/dist/charts/timers.d.ts +6 -0
  75. package/dist/charts/timers.d.ts.map +1 -0
  76. package/dist/charts/timers.js +14 -0
  77. package/dist/charts/timers.js.map +1 -0
  78. package/dist/code/hx.d.ts +24 -0
  79. package/dist/code/hx.d.ts.map +1 -0
  80. package/dist/code/hx.js +25 -0
  81. package/dist/code/hx.js.map +1 -0
  82. package/dist/code/index.d.ts +45 -0
  83. package/dist/code/index.d.ts.map +1 -0
  84. package/dist/code/index.js +93 -0
  85. package/dist/code/index.js.map +1 -0
  86. package/dist/code-editor/completion.d.ts +26 -0
  87. package/dist/code-editor/completion.d.ts.map +1 -0
  88. package/dist/code-editor/completion.js +129 -0
  89. package/dist/code-editor/completion.js.map +1 -0
  90. package/dist/code-editor/doc.d.ts +35 -0
  91. package/dist/code-editor/doc.d.ts.map +1 -0
  92. package/dist/code-editor/doc.js +162 -0
  93. package/dist/code-editor/doc.js.map +1 -0
  94. package/dist/code-editor/hx.d.ts +13 -0
  95. package/dist/code-editor/hx.d.ts.map +1 -0
  96. package/dist/code-editor/hx.js +10 -0
  97. package/dist/code-editor/hx.js.map +1 -0
  98. package/dist/code-editor/index.d.ts +88 -0
  99. package/dist/code-editor/index.d.ts.map +1 -0
  100. package/dist/code-editor/index.js +401 -0
  101. package/dist/code-editor/index.js.map +1 -0
  102. package/dist/code-editor/node.d.ts +343 -0
  103. package/dist/code-editor/node.d.ts.map +1 -0
  104. package/dist/code-editor/node.js +1521 -0
  105. package/dist/code-editor/node.js.map +1 -0
  106. package/dist/code-language/hljs.d.ts +47 -0
  107. package/dist/code-language/hljs.d.ts.map +1 -0
  108. package/dist/code-language/hljs.js +211 -0
  109. package/dist/code-language/hljs.js.map +1 -0
  110. package/dist/code-language/index.d.ts +22 -0
  111. package/dist/code-language/index.d.ts.map +1 -0
  112. package/dist/code-language/index.js +20 -0
  113. package/dist/code-language/index.js.map +1 -0
  114. package/dist/code-language/languages/glsl.d.ts +4 -0
  115. package/dist/code-language/languages/glsl.d.ts.map +1 -0
  116. package/dist/code-language/languages/glsl.js +99 -0
  117. package/dist/code-language/languages/glsl.js.map +1 -0
  118. package/dist/code-language/languages/javascript.d.ts +10 -0
  119. package/dist/code-language/languages/javascript.d.ts.map +1 -0
  120. package/dist/code-language/languages/javascript.js +360 -0
  121. package/dist/code-language/languages/javascript.js.map +1 -0
  122. package/dist/code-language/languages/json.d.ts +4 -0
  123. package/dist/code-language/languages/json.d.ts.map +1 -0
  124. package/dist/code-language/languages/json.js +68 -0
  125. package/dist/code-language/languages/json.js.map +1 -0
  126. package/dist/code-language/languages/shell.d.ts +4 -0
  127. package/dist/code-language/languages/shell.d.ts.map +1 -0
  128. package/dist/code-language/languages/shell.js +189 -0
  129. package/dist/code-language/languages/shell.js.map +1 -0
  130. package/dist/code-language/languages/sql.d.ts +11 -0
  131. package/dist/code-language/languages/sql.d.ts.map +1 -0
  132. package/dist/code-language/languages/sql.js +133 -0
  133. package/dist/code-language/languages/sql.js.map +1 -0
  134. package/dist/code-language/lezer.d.ts +24 -0
  135. package/dist/code-language/lezer.d.ts.map +1 -0
  136. package/dist/code-language/lezer.js +148 -0
  137. package/dist/code-language/lezer.js.map +1 -0
  138. package/dist/code-language/registry.d.ts +19 -0
  139. package/dist/code-language/registry.d.ts.map +1 -0
  140. package/dist/code-language/registry.js +56 -0
  141. package/dist/code-language/registry.js.map +1 -0
  142. package/dist/code-language/runs.d.ts +35 -0
  143. package/dist/code-language/runs.d.ts.map +1 -0
  144. package/dist/code-language/runs.js +88 -0
  145. package/dist/code-language/runs.js.map +1 -0
  146. package/dist/code-language/stream.d.ts +70 -0
  147. package/dist/code-language/stream.d.ts.map +1 -0
  148. package/dist/code-language/stream.js +243 -0
  149. package/dist/code-language/stream.js.map +1 -0
  150. package/dist/code-language/textmate.d.ts +27 -0
  151. package/dist/code-language/textmate.d.ts.map +1 -0
  152. package/dist/code-language/textmate.js +86 -0
  153. package/dist/code-language/textmate.js.map +1 -0
  154. package/dist/code-language/theme.d.ts +26 -0
  155. package/dist/code-language/theme.d.ts.map +1 -0
  156. package/dist/code-language/theme.js +108 -0
  157. package/dist/code-language/theme.js.map +1 -0
  158. package/dist/code-language/timers.d.ts +7 -0
  159. package/dist/code-language/timers.d.ts.map +1 -0
  160. package/dist/code-language/timers.js +22 -0
  161. package/dist/code-language/timers.js.map +1 -0
  162. package/dist/code-language/types.d.ts +173 -0
  163. package/dist/code-language/types.d.ts.map +1 -0
  164. package/dist/code-language/types.js +41 -0
  165. package/dist/code-language/types.js.map +1 -0
  166. package/dist/codeblock/index.d.ts +69 -0
  167. package/dist/codeblock/index.d.ts.map +1 -0
  168. package/dist/codeblock/index.js +85 -0
  169. package/dist/codeblock/index.js.map +1 -0
  170. package/dist/color-picker/ColorField.d.ts +39 -0
  171. package/dist/color-picker/ColorField.d.ts.map +1 -0
  172. package/dist/color-picker/ColorField.js +239 -0
  173. package/dist/color-picker/ColorField.js.map +1 -0
  174. package/dist/color-picker/ColorPicker.d.ts +109 -0
  175. package/dist/color-picker/ColorPicker.d.ts.map +1 -0
  176. package/dist/color-picker/ColorPicker.js +757 -0
  177. package/dist/color-picker/ColorPicker.js.map +1 -0
  178. package/dist/color-picker/color.d.ts +105 -0
  179. package/dist/color-picker/color.d.ts.map +1 -0
  180. package/dist/color-picker/color.js +313 -0
  181. package/dist/color-picker/color.js.map +1 -0
  182. package/dist/color-picker/index.d.ts +8 -0
  183. package/dist/color-picker/index.d.ts.map +1 -0
  184. package/dist/color-picker/index.js +19 -0
  185. package/dist/color-picker/index.js.map +1 -0
  186. package/dist/desktop-calendar/eds.d.ts +102 -0
  187. package/dist/desktop-calendar/eds.d.ts.map +1 -0
  188. package/dist/desktop-calendar/eds.js +356 -0
  189. package/dist/desktop-calendar/eds.js.map +1 -0
  190. package/dist/desktop-calendar/ical.d.ts +63 -0
  191. package/dist/desktop-calendar/ical.d.ts.map +1 -0
  192. package/dist/desktop-calendar/ical.js +57 -0
  193. package/dist/desktop-calendar/ical.js.map +1 -0
  194. package/dist/desktop-calendar/index.d.ts +72 -0
  195. package/dist/desktop-calendar/index.d.ts.map +1 -0
  196. package/dist/desktop-calendar/index.js +213 -0
  197. package/dist/desktop-calendar/index.js.map +1 -0
  198. package/dist/embed/client.d.ts +121 -0
  199. package/dist/embed/client.d.ts.map +1 -0
  200. package/dist/embed/client.js +203 -0
  201. package/dist/embed/client.js.map +1 -0
  202. package/dist/embed/host.d.ts +96 -0
  203. package/dist/embed/host.d.ts.map +1 -0
  204. package/dist/embed/host.js +266 -0
  205. package/dist/embed/host.js.map +1 -0
  206. package/dist/embed/index.d.ts +5 -0
  207. package/dist/embed/index.d.ts.map +1 -0
  208. package/dist/embed/index.js +13 -0
  209. package/dist/embed/index.js.map +1 -0
  210. package/dist/embed/timers.d.ts +6 -0
  211. package/dist/embed/timers.d.ts.map +1 -0
  212. package/dist/embed/timers.js +16 -0
  213. package/dist/embed/timers.js.map +1 -0
  214. package/dist/flow/draw.d.ts +45 -0
  215. package/dist/flow/draw.d.ts.map +1 -0
  216. package/dist/flow/draw.js +295 -0
  217. package/dist/flow/draw.js.map +1 -0
  218. package/dist/flow/index.d.ts +64 -0
  219. package/dist/flow/index.d.ts.map +1 -0
  220. package/dist/flow/index.js +306 -0
  221. package/dist/flow/index.js.map +1 -0
  222. package/dist/flow/model.d.ts +158 -0
  223. package/dist/flow/model.d.ts.map +1 -0
  224. package/dist/flow/model.js +566 -0
  225. package/dist/flow/model.js.map +1 -0
  226. package/dist/flow/node.d.ts +429 -0
  227. package/dist/flow/node.d.ts.map +1 -0
  228. package/dist/flow/node.js +3025 -0
  229. package/dist/flow/node.js.map +1 -0
  230. package/dist/flow/paths.d.ts +43 -0
  231. package/dist/flow/paths.d.ts.map +1 -0
  232. package/dist/flow/paths.js +327 -0
  233. package/dist/flow/paths.js.map +1 -0
  234. package/dist/flow/types.d.ts +561 -0
  235. package/dist/flow/types.d.ts.map +1 -0
  236. package/dist/flow/types.js +2 -0
  237. package/dist/flow/types.js.map +1 -0
  238. package/dist/formula/hx.d.ts +24 -0
  239. package/dist/formula/hx.d.ts.map +1 -0
  240. package/dist/formula/hx.js +25 -0
  241. package/dist/formula/hx.js.map +1 -0
  242. package/dist/formula/index.d.ts +74 -0
  243. package/dist/formula/index.d.ts.map +1 -0
  244. package/dist/formula/index.js +155 -0
  245. package/dist/formula/index.js.map +1 -0
  246. package/dist/formula/katex.d.ts +78 -0
  247. package/dist/formula/katex.d.ts.map +1 -0
  248. package/dist/formula/katex.js +130 -0
  249. package/dist/formula/katex.js.map +1 -0
  250. package/dist/formula/layout.d.ts +103 -0
  251. package/dist/formula/layout.d.ts.map +1 -0
  252. package/dist/formula/layout.js +716 -0
  253. package/dist/formula/layout.js.map +1 -0
  254. package/dist/formula/node.d.ts +50 -0
  255. package/dist/formula/node.d.ts.map +1 -0
  256. package/dist/formula/node.js +351 -0
  257. package/dist/formula/node.js.map +1 -0
  258. package/dist/html/controls.d.ts +48 -0
  259. package/dist/html/controls.d.ts.map +1 -0
  260. package/dist/html/controls.js +195 -0
  261. package/dist/html/controls.js.map +1 -0
  262. package/dist/html/css/cascade.d.ts +51 -0
  263. package/dist/html/css/cascade.d.ts.map +1 -0
  264. package/dist/html/css/cascade.js +552 -0
  265. package/dist/html/css/cascade.js.map +1 -0
  266. package/dist/html/css/parse.d.ts +74 -0
  267. package/dist/html/css/parse.d.ts.map +1 -0
  268. package/dist/html/css/parse.js +464 -0
  269. package/dist/html/css/parse.js.map +1 -0
  270. package/dist/html/css/style.d.ts +142 -0
  271. package/dist/html/css/style.d.ts.map +1 -0
  272. package/dist/html/css/style.js +1145 -0
  273. package/dist/html/css/style.js.map +1 -0
  274. package/dist/html/css/ua.d.ts +5 -0
  275. package/dist/html/css/ua.d.ts.map +1 -0
  276. package/dist/html/css/ua.js +171 -0
  277. package/dist/html/css/ua.js.map +1 -0
  278. package/dist/html/css/values.d.ts +78 -0
  279. package/dist/html/css/values.d.ts.map +1 -0
  280. package/dist/html/css/values.js +330 -0
  281. package/dist/html/css/values.js.map +1 -0
  282. package/dist/html/dom.d.ts +112 -0
  283. package/dist/html/dom.d.ts.map +1 -0
  284. package/dist/html/dom.js +374 -0
  285. package/dist/html/dom.js.map +1 -0
  286. package/dist/html/hx.d.ts +24 -0
  287. package/dist/html/hx.d.ts.map +1 -0
  288. package/dist/html/hx.js +29 -0
  289. package/dist/html/hx.js.map +1 -0
  290. package/dist/html/index.d.ts +137 -0
  291. package/dist/html/index.d.ts.map +1 -0
  292. package/dist/html/index.js +339 -0
  293. package/dist/html/index.js.map +1 -0
  294. package/dist/html/layout/block.d.ts +58 -0
  295. package/dist/html/layout/block.d.ts.map +1 -0
  296. package/dist/html/layout/block.js +724 -0
  297. package/dist/html/layout/block.js.map +1 -0
  298. package/dist/html/layout/boxes.d.ts +261 -0
  299. package/dist/html/layout/boxes.d.ts.map +1 -0
  300. package/dist/html/layout/boxes.js +725 -0
  301. package/dist/html/layout/boxes.js.map +1 -0
  302. package/dist/html/layout/flex.d.ts +16 -0
  303. package/dist/html/layout/flex.d.ts.map +1 -0
  304. package/dist/html/layout/flex.js +242 -0
  305. package/dist/html/layout/flex.js.map +1 -0
  306. package/dist/html/layout/floats.d.ts +50 -0
  307. package/dist/html/layout/floats.d.ts.map +1 -0
  308. package/dist/html/layout/floats.js +110 -0
  309. package/dist/html/layout/floats.js.map +1 -0
  310. package/dist/html/layout/inline.d.ts +44 -0
  311. package/dist/html/layout/inline.d.ts.map +1 -0
  312. package/dist/html/layout/inline.js +700 -0
  313. package/dist/html/layout/inline.js.map +1 -0
  314. package/dist/html/layout/table.d.ts +5 -0
  315. package/dist/html/layout/table.d.ts.map +1 -0
  316. package/dist/html/layout/table.js +340 -0
  317. package/dist/html/layout/table.js.map +1 -0
  318. package/dist/html/node.d.ts +149 -0
  319. package/dist/html/node.d.ts.map +1 -0
  320. package/dist/html/node.js +861 -0
  321. package/dist/html/node.js.map +1 -0
  322. package/dist/html/paint.d.ts +48 -0
  323. package/dist/html/paint.d.ts.map +1 -0
  324. package/dist/html/paint.js +495 -0
  325. package/dist/html/paint.js.map +1 -0
  326. package/dist/html/resources.d.ts +48 -0
  327. package/dist/html/resources.d.ts.map +1 -0
  328. package/dist/html/resources.js +156 -0
  329. package/dist/html/resources.js.map +1 -0
  330. package/dist/index.d.ts +48 -0
  331. package/dist/index.d.ts.map +1 -0
  332. package/dist/index.js +92 -0
  333. package/dist/index.js.map +1 -0
  334. package/dist/internal/heights.d.ts +81 -0
  335. package/dist/internal/heights.d.ts.map +1 -0
  336. package/dist/internal/heights.js +193 -0
  337. package/dist/internal/heights.js.map +1 -0
  338. package/dist/internal/hx.d.ts +24 -0
  339. package/dist/internal/hx.d.ts.map +1 -0
  340. package/dist/internal/hx.js +27 -0
  341. package/dist/internal/hx.js.map +1 -0
  342. package/dist/internal/text.d.ts +6 -0
  343. package/dist/internal/text.d.ts.map +1 -0
  344. package/dist/internal/text.js +44 -0
  345. package/dist/internal/text.js.map +1 -0
  346. package/dist/internal/timers.d.ts +8 -0
  347. package/dist/internal/timers.d.ts.map +1 -0
  348. package/dist/internal/timers.js +22 -0
  349. package/dist/internal/timers.js.map +1 -0
  350. package/dist/internal/widget.d.ts +40 -0
  351. package/dist/internal/widget.d.ts.map +1 -0
  352. package/dist/internal/widget.js +44 -0
  353. package/dist/internal/widget.js.map +1 -0
  354. package/dist/markdown/ast.d.ts +126 -0
  355. package/dist/markdown/ast.d.ts.map +1 -0
  356. package/dist/markdown/ast.js +8 -0
  357. package/dist/markdown/ast.js.map +1 -0
  358. package/dist/markdown/hx.d.ts +24 -0
  359. package/dist/markdown/hx.d.ts.map +1 -0
  360. package/dist/markdown/hx.js +25 -0
  361. package/dist/markdown/hx.js.map +1 -0
  362. package/dist/markdown/index.d.ts +90 -0
  363. package/dist/markdown/index.d.ts.map +1 -0
  364. package/dist/markdown/index.js +413 -0
  365. package/dist/markdown/index.js.map +1 -0
  366. package/dist/markdown/parse.d.ts +8 -0
  367. package/dist/markdown/parse.d.ts.map +1 -0
  368. package/dist/markdown/parse.js +911 -0
  369. package/dist/markdown/parse.js.map +1 -0
  370. package/dist/markdown/spans.d.ts +20 -0
  371. package/dist/markdown/spans.d.ts.map +1 -0
  372. package/dist/markdown/spans.js +96 -0
  373. package/dist/markdown/spans.js.map +1 -0
  374. package/dist/media-player/backends.d.ts +64 -0
  375. package/dist/media-player/backends.d.ts.map +1 -0
  376. package/dist/media-player/backends.js +110 -0
  377. package/dist/media-player/backends.js.map +1 -0
  378. package/dist/media-player/control.d.ts +40 -0
  379. package/dist/media-player/control.d.ts.map +1 -0
  380. package/dist/media-player/control.js +44 -0
  381. package/dist/media-player/control.js.map +1 -0
  382. package/dist/media-player/hx.d.ts +24 -0
  383. package/dist/media-player/hx.d.ts.map +1 -0
  384. package/dist/media-player/hx.js +25 -0
  385. package/dist/media-player/hx.js.map +1 -0
  386. package/dist/media-player/index.d.ts +107 -0
  387. package/dist/media-player/index.d.ts.map +1 -0
  388. package/dist/media-player/index.js +219 -0
  389. package/dist/media-player/index.js.map +1 -0
  390. package/dist/media-player/mpv.d.ts +4 -0
  391. package/dist/media-player/mpv.d.ts.map +1 -0
  392. package/dist/media-player/mpv.js +120 -0
  393. package/dist/media-player/mpv.js.map +1 -0
  394. package/dist/media-player/vlc.d.ts +8 -0
  395. package/dist/media-player/vlc.d.ts.map +1 -0
  396. package/dist/media-player/vlc.js +83 -0
  397. package/dist/media-player/vlc.js.map +1 -0
  398. package/dist/richtext/index.d.ts +19 -0
  399. package/dist/richtext/index.d.ts.map +1 -0
  400. package/dist/richtext/index.js +4 -0
  401. package/dist/richtext/index.js.map +1 -0
  402. package/dist/richtext/links.d.ts +12 -0
  403. package/dist/richtext/links.d.ts.map +1 -0
  404. package/dist/richtext/links.js +64 -0
  405. package/dist/richtext/links.js.map +1 -0
  406. package/dist/richtext/menu.d.ts +11 -0
  407. package/dist/richtext/menu.d.ts.map +1 -0
  408. package/dist/richtext/menu.js +43 -0
  409. package/dist/richtext/menu.js.map +1 -0
  410. package/dist/richtext/node.d.ts +151 -0
  411. package/dist/richtext/node.d.ts.map +1 -0
  412. package/dist/richtext/node.js +255 -0
  413. package/dist/richtext/node.js.map +1 -0
  414. package/dist/richtext/runs.d.ts +92 -0
  415. package/dist/richtext/runs.d.ts.map +1 -0
  416. package/dist/richtext/runs.js +158 -0
  417. package/dist/richtext/runs.js.map +1 -0
  418. package/dist/table/hx.d.ts +24 -0
  419. package/dist/table/hx.d.ts.map +1 -0
  420. package/dist/table/hx.js +25 -0
  421. package/dist/table/hx.js.map +1 -0
  422. package/dist/table/index.d.ts +169 -0
  423. package/dist/table/index.d.ts.map +1 -0
  424. package/dist/table/index.js +844 -0
  425. package/dist/table/index.js.map +1 -0
  426. package/dist/table/rows.d.ts +136 -0
  427. package/dist/table/rows.d.ts.map +1 -0
  428. package/dist/table/rows.js +146 -0
  429. package/dist/table/rows.js.map +1 -0
  430. package/dist/terminal/backends.d.ts +105 -0
  431. package/dist/terminal/backends.d.ts.map +1 -0
  432. package/dist/terminal/backends.js +185 -0
  433. package/dist/terminal/backends.js.map +1 -0
  434. package/dist/terminal/hx.d.ts +24 -0
  435. package/dist/terminal/hx.d.ts.map +1 -0
  436. package/dist/terminal/hx.js +25 -0
  437. package/dist/terminal/hx.js.map +1 -0
  438. package/dist/terminal/index.d.ts +160 -0
  439. package/dist/terminal/index.d.ts.map +1 -0
  440. package/dist/terminal/index.js +344 -0
  441. package/dist/terminal/index.js.map +1 -0
  442. package/dist/terminal/title.d.ts +24 -0
  443. package/dist/terminal/title.d.ts.map +1 -0
  444. package/dist/terminal/title.js +129 -0
  445. package/dist/terminal/title.js.map +1 -0
  446. package/dist/terminal/vt/colors.d.ts +63 -0
  447. package/dist/terminal/vt/colors.d.ts.map +1 -0
  448. package/dist/terminal/vt/colors.js +203 -0
  449. package/dist/terminal/vt/colors.js.map +1 -0
  450. package/dist/terminal/vt/diff.d.ts +117 -0
  451. package/dist/terminal/vt/diff.d.ts.map +1 -0
  452. package/dist/terminal/vt/diff.js +358 -0
  453. package/dist/terminal/vt/diff.js.map +1 -0
  454. package/dist/terminal/vt/fonts.d.ts +92 -0
  455. package/dist/terminal/vt/fonts.d.ts.map +1 -0
  456. package/dist/terminal/vt/fonts.js +178 -0
  457. package/dist/terminal/vt/fonts.js.map +1 -0
  458. package/dist/terminal/vt/index.d.ts +78 -0
  459. package/dist/terminal/vt/index.d.ts.map +1 -0
  460. package/dist/terminal/vt/index.js +312 -0
  461. package/dist/terminal/vt/index.js.map +1 -0
  462. package/dist/terminal/vt/keys.d.ts +74 -0
  463. package/dist/terminal/vt/keys.d.ts.map +1 -0
  464. package/dist/terminal/vt/keys.js +309 -0
  465. package/dist/terminal/vt/keys.js.map +1 -0
  466. package/dist/terminal/vt/mouse.d.ts +44 -0
  467. package/dist/terminal/vt/mouse.d.ts.map +1 -0
  468. package/dist/terminal/vt/mouse.js +106 -0
  469. package/dist/terminal/vt/mouse.js.map +1 -0
  470. package/dist/terminal/vt/node.d.ts +246 -0
  471. package/dist/terminal/vt/node.d.ts.map +1 -0
  472. package/dist/terminal/vt/node.js +1068 -0
  473. package/dist/terminal/vt/node.js.map +1 -0
  474. package/dist/terminal/vt/pty.d.ts +81 -0
  475. package/dist/terminal/vt/pty.d.ts.map +1 -0
  476. package/dist/terminal/vt/pty.js +201 -0
  477. package/dist/terminal/vt/pty.js.map +1 -0
  478. package/dist/terminal/vt/renderer.d.ts +179 -0
  479. package/dist/terminal/vt/renderer.d.ts.map +1 -0
  480. package/dist/terminal/vt/renderer.js +357 -0
  481. package/dist/terminal/vt/renderer.js.map +1 -0
  482. package/dist/terminal/vt/timers.d.ts +6 -0
  483. package/dist/terminal/vt/timers.d.ts.map +1 -0
  484. package/dist/terminal/vt/timers.js +16 -0
  485. package/dist/terminal/vt/timers.js.map +1 -0
  486. package/dist/terminal/vt/xterm.d.ts +142 -0
  487. package/dist/terminal/vt/xterm.d.ts.map +1 -0
  488. package/dist/terminal/vt/xterm.js +32 -0
  489. package/dist/terminal/vt/xterm.js.map +1 -0
  490. package/dist/terminal-output/hx.d.ts +24 -0
  491. package/dist/terminal-output/hx.d.ts.map +1 -0
  492. package/dist/terminal-output/hx.js +25 -0
  493. package/dist/terminal-output/hx.js.map +1 -0
  494. package/dist/terminal-output/index.d.ts +92 -0
  495. package/dist/terminal-output/index.d.ts.map +1 -0
  496. package/dist/terminal-output/index.js +179 -0
  497. package/dist/terminal-output/index.js.map +1 -0
  498. package/dist/terminal-output/runs.d.ts +27 -0
  499. package/dist/terminal-output/runs.d.ts.map +1 -0
  500. package/dist/terminal-output/runs.js +66 -0
  501. package/dist/terminal-output/runs.js.map +1 -0
  502. package/dist/three/canvas.d.ts +46 -0
  503. package/dist/three/canvas.d.ts.map +1 -0
  504. package/dist/three/canvas.js +305 -0
  505. package/dist/three/canvas.js.map +1 -0
  506. package/dist/three/events.d.ts +64 -0
  507. package/dist/three/events.d.ts.map +1 -0
  508. package/dist/three/events.js +146 -0
  509. package/dist/three/events.js.map +1 -0
  510. package/dist/three/geometries.d.ts +89 -0
  511. package/dist/three/geometries.d.ts.map +1 -0
  512. package/dist/three/geometries.js +345 -0
  513. package/dist/three/geometries.js.map +1 -0
  514. package/dist/three/globals.d.ts +7 -0
  515. package/dist/three/globals.d.ts.map +1 -0
  516. package/dist/three/globals.js +20 -0
  517. package/dist/three/globals.js.map +1 -0
  518. package/dist/three/hx.d.ts +9 -0
  519. package/dist/three/hx.d.ts.map +1 -0
  520. package/dist/three/hx.js +10 -0
  521. package/dist/three/hx.js.map +1 -0
  522. package/dist/three/index.d.ts +22 -0
  523. package/dist/three/index.d.ts.map +1 -0
  524. package/dist/three/index.js +24 -0
  525. package/dist/three/index.js.map +1 -0
  526. package/dist/three/jsx-dev-runtime.d.ts +19 -0
  527. package/dist/three/jsx-dev-runtime.d.ts.map +1 -0
  528. package/dist/three/jsx-dev-runtime.js +2 -0
  529. package/dist/three/jsx-dev-runtime.js.map +1 -0
  530. package/dist/three/jsx-runtime.d.ts +19 -0
  531. package/dist/three/jsx-runtime.d.ts.map +1 -0
  532. package/dist/three/jsx-runtime.js +2 -0
  533. package/dist/three/jsx-runtime.js.map +1 -0
  534. package/dist/three/jsx.d.ts +198 -0
  535. package/dist/three/jsx.d.ts.map +1 -0
  536. package/dist/three/jsx.js +2 -0
  537. package/dist/three/jsx.js.map +1 -0
  538. package/dist/three/materials.d.ts +125 -0
  539. package/dist/three/materials.d.ts.map +1 -0
  540. package/dist/three/materials.js +229 -0
  541. package/dist/three/materials.js.map +1 -0
  542. package/dist/three/math.d.ts +146 -0
  543. package/dist/three/math.d.ts.map +1 -0
  544. package/dist/three/math.js +464 -0
  545. package/dist/three/math.js.map +1 -0
  546. package/dist/three/objects.d.ts +185 -0
  547. package/dist/three/objects.d.ts.map +1 -0
  548. package/dist/three/objects.js +309 -0
  549. package/dist/three/objects.js.map +1 -0
  550. package/dist/three/passes.d.ts +54 -0
  551. package/dist/three/passes.d.ts.map +1 -0
  552. package/dist/three/passes.js +78 -0
  553. package/dist/three/passes.js.map +1 -0
  554. package/dist/three/postprocess.d.ts +85 -0
  555. package/dist/three/postprocess.d.ts.map +1 -0
  556. package/dist/three/postprocess.js +503 -0
  557. package/dist/three/postprocess.js.map +1 -0
  558. package/dist/three/raycast.d.ts +24 -0
  559. package/dist/three/raycast.d.ts.map +1 -0
  560. package/dist/three/raycast.js +138 -0
  561. package/dist/three/raycast.js.map +1 -0
  562. package/dist/three/reconciler.d.ts +48 -0
  563. package/dist/three/reconciler.d.ts.map +1 -0
  564. package/dist/three/reconciler.js +416 -0
  565. package/dist/three/reconciler.js.map +1 -0
  566. package/dist/three/renderer-direct.d.ts +102 -0
  567. package/dist/three/renderer-direct.d.ts.map +1 -0
  568. package/dist/three/renderer-direct.js +782 -0
  569. package/dist/three/renderer-direct.js.map +1 -0
  570. package/dist/three/renderer-indirect.d.ts +68 -0
  571. package/dist/three/renderer-indirect.d.ts.map +1 -0
  572. package/dist/three/renderer-indirect.js +438 -0
  573. package/dist/three/renderer-indirect.js.map +1 -0
  574. package/dist/three/store.d.ts +81 -0
  575. package/dist/three/store.d.ts.map +1 -0
  576. package/dist/three/store.js +110 -0
  577. package/dist/three/store.js.map +1 -0
  578. package/dist/timeline/hx.d.ts +18 -0
  579. package/dist/timeline/hx.d.ts.map +1 -0
  580. package/dist/timeline/hx.js +10 -0
  581. package/dist/timeline/hx.js.map +1 -0
  582. package/dist/timeline/index.d.ts +152 -0
  583. package/dist/timeline/index.d.ts.map +1 -0
  584. package/dist/timeline/index.js +383 -0
  585. package/dist/timeline/index.js.map +1 -0
  586. package/dist/tray-host/hx.d.ts +24 -0
  587. package/dist/tray-host/hx.d.ts.map +1 -0
  588. package/dist/tray-host/hx.js +25 -0
  589. package/dist/tray-host/hx.js.map +1 -0
  590. package/dist/tray-host/index.d.ts +110 -0
  591. package/dist/tray-host/index.d.ts.map +1 -0
  592. package/dist/tray-host/index.js +191 -0
  593. package/dist/tray-host/index.js.map +1 -0
  594. package/dist/tray-host/manager.d.ts +137 -0
  595. package/dist/tray-host/manager.d.ts.map +1 -0
  596. package/dist/tray-host/manager.js +462 -0
  597. package/dist/tray-host/manager.js.map +1 -0
  598. package/dist/tray-host/notify.d.ts +22 -0
  599. package/dist/tray-host/notify.d.ts.map +1 -0
  600. package/dist/tray-host/notify.js +74 -0
  601. package/dist/tray-host/notify.js.map +1 -0
  602. package/dist/tray-host/protocol.d.ts +106 -0
  603. package/dist/tray-host/protocol.d.ts.map +1 -0
  604. package/dist/tray-host/protocol.js +191 -0
  605. package/dist/tray-host/protocol.js.map +1 -0
  606. package/dist/tree/hx.d.ts +24 -0
  607. package/dist/tree/hx.d.ts.map +1 -0
  608. package/dist/tree/hx.js +25 -0
  609. package/dist/tree/hx.js.map +1 -0
  610. package/dist/tree/index.d.ts +221 -0
  611. package/dist/tree/index.d.ts.map +1 -0
  612. package/dist/tree/index.js +716 -0
  613. package/dist/tree/index.js.map +1 -0
  614. package/dist/tree/internal.d.ts +18 -0
  615. package/dist/tree/internal.d.ts.map +1 -0
  616. package/dist/tree/internal.js +66 -0
  617. package/dist/tree/internal.js.map +1 -0
  618. package/dist/tree/rows.d.ts +177 -0
  619. package/dist/tree/rows.d.ts.map +1 -0
  620. package/dist/tree/rows.js +179 -0
  621. package/dist/tree/rows.js.map +1 -0
  622. package/package.json +166 -12
  623. package/src/ansi/cast.ts +159 -0
  624. package/src/ansi/index.ts +53 -0
  625. package/src/ansi/palette.ts +226 -0
  626. package/src/ansi/parse.ts +780 -0
  627. package/src/ansi/sgr.ts +380 -0
  628. package/src/ansi/utf8.ts +84 -0
  629. package/src/calendar/Calendar.ts +744 -0
  630. package/src/calendar/DatePicker.ts +368 -0
  631. package/src/calendar/dates.ts +307 -0
  632. package/src/calendar/index.ts +51 -0
  633. package/src/charts/components.ts +864 -0
  634. package/src/charts/data.ts +776 -0
  635. package/src/charts/hx.ts +39 -0
  636. package/src/charts/index.ts +99 -0
  637. package/src/charts/node.ts +932 -0
  638. package/src/charts/render.ts +982 -0
  639. package/src/charts/scale.ts +214 -0
  640. package/src/charts/spec.ts +122 -0
  641. package/src/charts/timers.ts +24 -0
  642. package/src/code/hx.ts +51 -0
  643. package/src/code/index.ts +174 -0
  644. package/src/code-editor/completion.ts +161 -0
  645. package/src/code-editor/doc.ts +198 -0
  646. package/src/code-editor/hx.ts +26 -0
  647. package/src/code-editor/index.ts +615 -0
  648. package/src/code-editor/node.ts +1926 -0
  649. package/src/code-language/hljs.ts +302 -0
  650. package/src/code-language/index.ts +51 -0
  651. package/src/code-language/languages/glsl.ts +120 -0
  652. package/src/code-language/languages/javascript.ts +419 -0
  653. package/src/code-language/languages/json.ts +72 -0
  654. package/src/code-language/languages/shell.ts +221 -0
  655. package/src/code-language/languages/sql.ts +165 -0
  656. package/src/code-language/lezer.ts +190 -0
  657. package/src/code-language/registry.ts +66 -0
  658. package/src/code-language/runs.ts +128 -0
  659. package/src/code-language/stream.ts +306 -0
  660. package/src/code-language/textmate.ts +134 -0
  661. package/src/code-language/theme.ts +124 -0
  662. package/src/code-language/timers.ts +36 -0
  663. package/src/code-language/types.ts +252 -0
  664. package/src/codeblock/index.ts +146 -0
  665. package/src/color-picker/ColorField.ts +333 -0
  666. package/src/color-picker/ColorPicker.ts +1069 -0
  667. package/src/color-picker/color.ts +399 -0
  668. package/src/color-picker/index.ts +50 -0
  669. package/src/desktop-calendar/eds.ts +484 -0
  670. package/src/desktop-calendar/ical.ts +119 -0
  671. package/src/desktop-calendar/index.ts +287 -0
  672. package/src/embed/client.ts +311 -0
  673. package/src/embed/host.ts +432 -0
  674. package/src/embed/index.ts +33 -0
  675. package/src/embed/timers.ts +32 -0
  676. package/src/flow/draw.ts +418 -0
  677. package/src/flow/index.ts +473 -0
  678. package/src/flow/model.ts +687 -0
  679. package/src/flow/node.ts +3694 -0
  680. package/src/flow/paths.ts +403 -0
  681. package/src/flow/types.ts +634 -0
  682. package/src/formula/hx.ts +51 -0
  683. package/src/formula/index.ts +243 -0
  684. package/src/formula/katex.ts +209 -0
  685. package/src/formula/layout.ts +876 -0
  686. package/src/formula/node.ts +467 -0
  687. package/src/html/controls.ts +244 -0
  688. package/src/html/css/cascade.ts +606 -0
  689. package/src/html/css/parse.ts +500 -0
  690. package/src/html/css/style.ts +1371 -0
  691. package/src/html/css/ua.ts +174 -0
  692. package/src/html/css/values.ts +358 -0
  693. package/src/html/dom.ts +410 -0
  694. package/src/html/hx.ts +55 -0
  695. package/src/html/index.ts +545 -0
  696. package/src/html/layout/block.ts +876 -0
  697. package/src/html/layout/boxes.ts +981 -0
  698. package/src/html/layout/flex.ts +297 -0
  699. package/src/html/layout/floats.ts +125 -0
  700. package/src/html/layout/inline.ts +870 -0
  701. package/src/html/layout/table.ts +380 -0
  702. package/src/html/node.ts +967 -0
  703. package/src/html/paint.ts +605 -0
  704. package/src/html/resources.ts +214 -0
  705. package/src/index.ts +638 -0
  706. package/src/internal/heights.ts +211 -0
  707. package/src/internal/hx.ts +53 -0
  708. package/src/internal/text.ts +44 -0
  709. package/src/internal/timers.ts +44 -0
  710. package/src/internal/widget.ts +92 -0
  711. package/src/markdown/ast.ts +163 -0
  712. package/src/markdown/hx.ts +51 -0
  713. package/src/markdown/index.ts +686 -0
  714. package/src/markdown/parse.ts +1037 -0
  715. package/src/markdown/spans.ts +143 -0
  716. package/src/media-player/backends.ts +155 -0
  717. package/src/media-player/control.ts +70 -0
  718. package/src/media-player/hx.ts +51 -0
  719. package/src/media-player/index.ts +378 -0
  720. package/src/media-player/mpv.ts +146 -0
  721. package/src/media-player/vlc.ts +97 -0
  722. package/src/richtext/index.ts +42 -0
  723. package/src/richtext/links.ts +78 -0
  724. package/src/richtext/menu.ts +49 -0
  725. package/src/richtext/node.ts +406 -0
  726. package/src/richtext/runs.ts +253 -0
  727. package/src/table/hx.ts +51 -0
  728. package/src/table/index.ts +1219 -0
  729. package/src/table/rows.ts +275 -0
  730. package/src/terminal/backends.ts +242 -0
  731. package/src/terminal/hx.ts +51 -0
  732. package/src/terminal/index.ts +574 -0
  733. package/src/terminal/title.ts +172 -0
  734. package/src/terminal/vt/colors.ts +247 -0
  735. package/src/terminal/vt/diff.ts +467 -0
  736. package/src/terminal/vt/fonts.ts +233 -0
  737. package/src/terminal/vt/index.ts +443 -0
  738. package/src/terminal/vt/keys.ts +369 -0
  739. package/src/terminal/vt/mouse.ts +144 -0
  740. package/src/terminal/vt/node.ts +1242 -0
  741. package/src/terminal/vt/pty.ts +334 -0
  742. package/src/terminal/vt/renderer.ts +555 -0
  743. package/src/terminal/vt/timers.ts +31 -0
  744. package/src/terminal/vt/xterm.ts +193 -0
  745. package/src/terminal-output/hx.ts +51 -0
  746. package/src/terminal-output/index.ts +340 -0
  747. package/src/terminal-output/runs.ts +79 -0
  748. package/src/three/canvas.ts +451 -0
  749. package/src/three/events.ts +197 -0
  750. package/src/three/geometries.ts +429 -0
  751. package/src/three/globals.ts +34 -0
  752. package/src/three/hx.ts +22 -0
  753. package/src/three/index.ts +98 -0
  754. package/src/three/jsx-dev-runtime.ts +27 -0
  755. package/src/three/jsx-runtime.ts +38 -0
  756. package/src/three/jsx.ts +275 -0
  757. package/src/three/materials.ts +270 -0
  758. package/src/three/math.ts +585 -0
  759. package/src/three/objects.ts +397 -0
  760. package/src/three/passes.ts +90 -0
  761. package/src/three/postprocess.ts +677 -0
  762. package/src/three/raycast.ts +189 -0
  763. package/src/three/react-reconciler.d.ts +50 -0
  764. package/src/three/reconciler.ts +624 -0
  765. package/src/three/renderer-direct.ts +1055 -0
  766. package/src/three/renderer-indirect.ts +570 -0
  767. package/src/three/store.ts +207 -0
  768. package/src/timeline/hx.ts +31 -0
  769. package/src/timeline/index.ts +603 -0
  770. package/src/tray-host/hx.ts +51 -0
  771. package/src/tray-host/index.ts +331 -0
  772. package/src/tray-host/manager.ts +639 -0
  773. package/src/tray-host/notify.ts +102 -0
  774. package/src/tray-host/protocol.ts +235 -0
  775. package/src/tree/hx.ts +51 -0
  776. package/src/tree/index.ts +1087 -0
  777. package/src/tree/internal.ts +87 -0
  778. package/src/tree/rows.ts +334 -0
  779. package/src/index.d.ts +0 -2
  780. package/src/index.js +0 -9
  781. package/src/sparkline/index.d.ts +0 -29
  782. package/src/sparkline/index.js +0 -50
  783. package/src/sparkline/node.js +0 -72
@@ -0,0 +1,757 @@
1
+ // <ColorPicker> — a saturation/value field over a hue slider, and whatever
2
+ // else the app asked for.
3
+ //
4
+ // Nothing here registers an element. The question `src/flow/` established is
5
+ // whether the feature's viewport is a *transform*; a picker's is not, so this
6
+ // is the `<Calendar>` shape — `<box>`, `<text>`, `<textinput>` and three
7
+ // `<canvas>` panes — and importing it has no side effect at all.
8
+ //
9
+ // The three panes are pictures, and they are cheap ones: ntk's 2d context
10
+ // hands out real XRender gradients, so the field is a hue fill plus two
11
+ // gradients rather than 36 000 pixels of JavaScript, and each pane carries a
12
+ // `cacheKey` naming everything its drawing reads. The **thumbs are not part
13
+ // of the drawing** — each is an absolutely positioned `<box>` — so a drag
14
+ // moves two numbers in a style and repaints a 12px node, instead of
15
+ // re-running the gradients on every pointer motion.
16
+ //
17
+ // The panes are square-cornered on purpose: ntk's rounded-rect fast path
18
+ // bails to polygon rasterization when the fill is not a plain colour (the
19
+ // `gradient` reason in `stats.shapes`), and a picker is the surface most
20
+ // likely to hit that cliff.
21
+ import React, { useImperativeHandle, useRef, useState } from 'react';
22
+ import { createStyles } from 'react-x11/style';
23
+ import { useEyedropper, useTheme } from 'react-x11';
24
+ import { XK_DOWN, XK_END, XK_ESCAPE, XK_HOME, XK_LEFT, XK_PAGE_DOWN, XK_PAGE_UP, XK_RETURN, XK_RIGHT, XK_TAB, XK_UP, } from 'react-x11/keysyms';
25
+ import { hx } from '../internal/hx.js';
26
+ import { changeEvent } from '../internal/widget.js';
27
+ import { channelsFromHsv, channelsFromRgb, contrastGrade, contrastRatio, formatColor, formatOf, opaqueHex, parseColor, } from './color.js';
28
+ // The geometry. Fixed rather than fluid, for the reason `CALENDAR_WIDTH`
29
+ // exists: `<ColorField>` has to size a real X window around this *before* it
30
+ // is laid out, and it is also what lets the panes carry a `cacheKey` — a key
31
+ // naming a width the pane might not have is a stale picture.
32
+ const PAD = 10;
33
+ const GAP = 8;
34
+ const CONTENT = 240;
35
+ const AREA_H = 150;
36
+ const STRIP_H = 12;
37
+ const ROW_H = 26;
38
+ const SWATCH = 20;
39
+ const SWATCH_GAP = 6;
40
+ const THUMB = 12;
41
+ /** The checker under anything translucent, in device pixels. */
42
+ const CHECKER = 6;
43
+ /** How wide a `<ColorPicker>` lays out. */
44
+ export const COLOR_PICKER_WIDTH = CONTENT + PAD * 2;
45
+ const s = createStyles({
46
+ root: {
47
+ padding: PAD,
48
+ gap: GAP,
49
+ alignItems: 'stretch',
50
+ width: COLOR_PICKER_WIDTH,
51
+ // The geometry is a promise the panes' `cacheKey`s and the thumbs'
52
+ // positions are both written against, so the panel does not shrink: a
53
+ // squashed field would put the thumb somewhere the colour is not.
54
+ flexShrink: 0,
55
+ },
56
+ area: {
57
+ width: CONTENT,
58
+ height: AREA_H,
59
+ flexShrink: 0,
60
+ position: 'relative',
61
+ cursor: 'crosshair',
62
+ },
63
+ strip: {
64
+ width: CONTENT,
65
+ height: STRIP_H,
66
+ flexShrink: 0,
67
+ position: 'relative',
68
+ cursor: 'pointer',
69
+ },
70
+ pane: { position: 'absolute', left: 0, top: 0, right: 0, bottom: 0 },
71
+ areaThumb: {
72
+ position: 'absolute',
73
+ width: THUMB,
74
+ height: THUMB,
75
+ borderRadius: THUMB / 2,
76
+ borderWidth: 2,
77
+ borderColor: 'white',
78
+ },
79
+ stripThumb: {
80
+ position: 'absolute',
81
+ top: -2,
82
+ width: 8,
83
+ height: STRIP_H + 4,
84
+ borderRadius: 3,
85
+ borderWidth: 2,
86
+ borderColor: 'white',
87
+ },
88
+ row: {
89
+ flexDirection: 'row',
90
+ alignItems: 'center',
91
+ gap: 6,
92
+ height: ROW_H,
93
+ flexShrink: 0,
94
+ },
95
+ preview: { width: ROW_H, height: ROW_H, flexShrink: 0 },
96
+ field: { flexGrow: 1, height: ROW_H, paddingLeft: 6, paddingRight: 6 },
97
+ readout: { flexGrow: 1 },
98
+ button: {
99
+ height: ROW_H,
100
+ paddingLeft: 8,
101
+ paddingRight: 8,
102
+ alignItems: 'center',
103
+ justifyContent: 'center',
104
+ cursor: 'pointer',
105
+ flexShrink: 0,
106
+ transition: { backgroundColor: 80 },
107
+ },
108
+ glyph: { width: 14, height: 14 },
109
+ swatches: { flexDirection: 'row', flexWrap: 'wrap', gap: SWATCH_GAP },
110
+ swatch: { width: SWATCH, height: SWATCH, cursor: 'pointer' },
111
+ contrast: {
112
+ flexDirection: 'row',
113
+ alignItems: 'center',
114
+ gap: 6,
115
+ height: ROW_H,
116
+ },
117
+ });
118
+ const swatchValue = (sw) => typeof sw === 'string' ? sw : sw.value;
119
+ const swatchLabel = (sw) => typeof sw === 'string' ? sw : (sw.label ?? sw.value);
120
+ function colorChangeEvent(name, value, color) {
121
+ return { ...changeEvent('color', name, value), color };
122
+ }
123
+ /** The rows a set of parts adds up to — `<ColorField>` needs the height of
124
+ * the panel before the panel exists. */
125
+ export function colorPickerHeight(parts, counts = {}) {
126
+ const perRow = Math.floor((CONTENT + SWATCH_GAP) / (SWATCH + SWATCH_GAP));
127
+ const rows = (n) => n
128
+ ? Math.ceil(n / perRow) * SWATCH +
129
+ (Math.ceil(n / perRow) - 1) * SWATCH_GAP
130
+ : 0;
131
+ const heightOf = (part) => {
132
+ switch (part) {
133
+ case 'area':
134
+ return AREA_H;
135
+ case 'hue':
136
+ case 'alpha':
137
+ return STRIP_H;
138
+ case 'fields':
139
+ case 'contrast':
140
+ return ROW_H;
141
+ case 'swatches':
142
+ return rows(counts.swatches ?? 0);
143
+ case 'recent':
144
+ return rows(counts.recent ?? 0);
145
+ default:
146
+ return 0;
147
+ }
148
+ };
149
+ const heights = parts.map(heightOf).filter((h) => h > 0);
150
+ return (PAD * 2 +
151
+ heights.reduce((sum, h) => sum + h, 0) +
152
+ Math.max(0, heights.length - 1) * GAP);
153
+ }
154
+ const clamp01 = (n) => (n < 0 ? 0 : n > 1 ? 1 : n);
155
+ /** The checkerboard under anything translucent. Two greys rather than a
156
+ * theme colour: it is a *hole*, and a hole looks the same on every palette. */
157
+ function drawChecker(ctx, width, height) {
158
+ ctx.fillStyle = '#ffffff';
159
+ ctx.fillRect(0, 0, width, height);
160
+ ctx.fillStyle = '#c8c8c8';
161
+ for (let y = 0; y < height; y += CHECKER) {
162
+ for (let x = 0; x < width; x += CHECKER) {
163
+ if (((x / CHECKER) & 1) === ((y / CHECKER) & 1))
164
+ continue;
165
+ ctx.fillRect(x, y, Math.min(CHECKER, width - x), Math.min(CHECKER, height - y));
166
+ }
167
+ }
168
+ }
169
+ /**
170
+ * The dropper glyph: the bulb at the top right, the stem running down to the
171
+ * left, and the tip it draws with. Three shapes rather than one clever path,
172
+ * because at 14 pixels a pipette reads only if the bulb and the tip are both
173
+ * solid — the first draft was a single stroke and looked like a slash.
174
+ */
175
+ function EyedropperGlyph({ color }) {
176
+ return hx('canvas', {
177
+ style: s.glyph,
178
+ cacheKey: `eyedropper:${color}`,
179
+ onDraw: (ctx, { width, height }) => {
180
+ ctx.fillStyle = color;
181
+ ctx.strokeStyle = color;
182
+ // the bulb
183
+ ctx.beginPath();
184
+ ctx.arc(width - 3.5, 3.5, 3, 0, Math.PI * 2);
185
+ ctx.fill();
186
+ // the stem
187
+ ctx.lineWidth = 2;
188
+ ctx.beginPath();
189
+ ctx.moveTo(width - 5, 5);
190
+ ctx.lineTo(4.5, height - 4.5);
191
+ ctx.stroke();
192
+ // the tip, pointing at what it will sample
193
+ ctx.beginPath();
194
+ ctx.moveTo(1, height - 1);
195
+ ctx.lineTo(5.5, height - 2.5);
196
+ ctx.lineTo(2.5, height - 5.5);
197
+ ctx.closePath();
198
+ ctx.fill();
199
+ },
200
+ });
201
+ }
202
+ /**
203
+ * `<ColorPicker value onChange>` — the colour panel.
204
+ *
205
+ * <ColorPicker value={accent} onChange={(ev) => setAccent(ev.value)} />
206
+ * <ColorPicker … alpha swatches={brand.colors} />
207
+ * <ColorPicker … parts={['swatches']} /> // the palette-only shape
208
+ *
209
+ * The value is a **CSS colour string**, the way a `<Calendar>`'s day is a
210
+ * `'YYYY-MM-DD'` string: it drops straight into `backgroundColor`, survives
211
+ * JSON, and needs no constructor. What it cannot carry is the hue behind a
212
+ * black or a grey, so the picker holds HSVA of its own and adopts the `value`
213
+ * prop only when that prop is not the string it last emitted. Drag the
214
+ * brightness to zero and back and the hue is still where it was.
215
+ */
216
+ export function ColorPicker(props) {
217
+ const { value, defaultValue, onChange, onChangeEnd, name, alpha = false, format = 'auto', swatches, recent, parts, eyedropper = true, contrast, disabled = false, focusable = true, focusVisible, style, children, ref, } = props;
218
+ const theme = useTheme();
219
+ const [model, setModel] = useState(() => parseColor(value ?? defaultValue ?? '') ?? channelsFromHsv(0, 0, 0, 1));
220
+ // What the last emitted string was, so that an app echoing it back is a
221
+ // no-op rather than a re-parse that loses the hue.
222
+ const emitted = useRef(null);
223
+ // The spelling `format="auto"` follows: whatever the last string that came
224
+ // *in* was written in.
225
+ const [sourceFormat, setSourceFormat] = useState(() => formatOf(value ?? defaultValue ?? '') ?? 'hex');
226
+ const [prevValue, setPrevValue] = useState(value);
227
+ const [dragging, setDragging] = useState(null);
228
+ const [active, setActive] = useState('area');
229
+ const [focused, setFocused] = useState(false);
230
+ const [typed, setTyped] = useState(null);
231
+ const [textModel, setTextModel] = useState('hex');
232
+ const areaRef = useRef(null);
233
+ const hueRef = useRef(null);
234
+ const alphaRef = useRef(null);
235
+ // Controlled reconciliation, at render — React's own "adjusting state when
236
+ // a prop changes" pattern. The hue of the model survives a value that has
237
+ // none of its own, which is what makes dragging through black work.
238
+ if (value !== undefined && value !== prevValue) {
239
+ setPrevValue(value);
240
+ if (value !== emitted.current) {
241
+ const parsed = parseColor(value);
242
+ if (parsed) {
243
+ setModel(channelsFromRgb(parsed.r, parsed.g, parsed.b, parsed.a, model.h));
244
+ setSourceFormat(formatOf(value) ?? sourceFormat);
245
+ setTyped(null);
246
+ }
247
+ }
248
+ }
249
+ const outputFormat = format === 'auto' ? sourceFormat : format;
250
+ const text = formatColor(model, outputFormat, alpha);
251
+ const dropper = useEyedropper();
252
+ const emit = (next, done,
253
+ // The spelling to emit in, when the caller already knows it: `setState`
254
+ // does not land until the next render, so a swatch or a typed value that
255
+ // brings its own format has to hand it over rather than set it and read
256
+ // it back in the same handler.
257
+ spelling = outputFormat) => {
258
+ const out = formatColor(next, spelling, alpha);
259
+ emitted.current = out;
260
+ setModel(next);
261
+ setTyped(null);
262
+ const ev = colorChangeEvent(name, out, next);
263
+ onChange?.(ev);
264
+ if (done)
265
+ onChangeEnd?.(ev);
266
+ };
267
+ /** Commit whatever the current model is — the release of a drag, and the
268
+ * end of a keyboard step. */
269
+ const commit = (next) => emit(next, true);
270
+ /** Take a colour from somewhere that is not this widget — the screen, or a
271
+ * swatch. The hue comes along when the new colour has none of its own, and
272
+ * the alpha only when there is a strip to show it on. */
273
+ const adopt = (colour) => {
274
+ const parsed = parseColor(colour);
275
+ if (!parsed)
276
+ return;
277
+ const spelling = formatOf(colour) ?? sourceFormat;
278
+ setSourceFormat(spelling);
279
+ emit(channelsFromRgb(parsed.r, parsed.g, parsed.b, alpha ? parsed.a : 1, model.h), true, format === 'auto' ? spelling : outputFormat);
280
+ };
281
+ // `eyedropper` is a switch and a seam at once: `true` takes core's sampler
282
+ // — `useEyedropper()` answers `supported: false` where there is none, which
283
+ // is the button's existence — and a function replaces it, which is both the
284
+ // kiosk case and how a test drives a pick without a server.
285
+ const ownDropper = typeof eyedropper === 'function' ? eyedropper : null;
286
+ const showDropper = !disabled &&
287
+ (ownDropper !== null || (eyedropper !== false && dropper.supported));
288
+ const pickFromScreen = () => {
289
+ const pick = ownDropper ?? dropper.pick;
290
+ void Promise.resolve(pick()).then((hex) => {
291
+ // null is a cancel, and a cancel leaves the colour alone.
292
+ if (hex)
293
+ adopt(hex);
294
+ });
295
+ };
296
+ const setHsv = (h, sat, v, done = false) => emit(channelsFromHsv(h, sat, v, model.a), done);
297
+ // --- pointer ------------------------------------------------------------
298
+ const fractionIn = (node, ev) => {
299
+ const box = node?.abs;
300
+ if (!box?.width || !box.height)
301
+ return null;
302
+ return {
303
+ x: clamp01((ev.x - box.x) / box.width),
304
+ y: clamp01((ev.y - box.y) / box.height),
305
+ };
306
+ };
307
+ const areaTo = (ev, done) => {
308
+ const at = fractionIn(areaRef.current, ev);
309
+ if (at)
310
+ setHsv(model.h, at.x, 1 - at.y, done);
311
+ };
312
+ const hueTo = (ev, done) => {
313
+ const at = fractionIn(hueRef.current, ev);
314
+ if (at)
315
+ setHsv(at.x * 360, model.s, model.v, done);
316
+ };
317
+ const alphaTo = (ev, done) => {
318
+ const at = fractionIn(alphaRef.current, ev);
319
+ if (at)
320
+ emit(channelsFromHsv(model.h, model.s, model.v, at.x), done);
321
+ };
322
+ const track = (axis, to) => disabled
323
+ ? {}
324
+ : {
325
+ onMouseDown: (ev) => {
326
+ ev.capturePointer();
327
+ setDragging(axis);
328
+ setActive(axis);
329
+ to(ev, false);
330
+ },
331
+ onMouseMove: (ev) => {
332
+ if (dragging === axis)
333
+ to(ev, false);
334
+ },
335
+ onMouseUp: (ev) => {
336
+ if (dragging !== axis)
337
+ return;
338
+ setDragging(null);
339
+ to(ev, true);
340
+ },
341
+ };
342
+ // --- keyboard -----------------------------------------------------------
343
+ const axes = () => ['area', 'hue', 'alpha'].filter((part) => shown.includes(part));
344
+ const step = (ev, coarse, fine) => ev.shiftKey ? coarse : fine;
345
+ const handleKey = (ev) => {
346
+ if (disabled)
347
+ return false;
348
+ const axis = axes().includes(active) ? active : (axes()[0] ?? 'area');
349
+ const dx = step(ev, 0.1, 0.01);
350
+ switch (ev.keysym) {
351
+ case XK_LEFT:
352
+ case XK_RIGHT: {
353
+ const dir = ev.keysym === XK_LEFT ? -1 : 1;
354
+ if (axis === 'hue')
355
+ setHsv(model.h + dir * step(ev, 10, 1), model.s, model.v, true);
356
+ else if (axis === 'alpha')
357
+ commit(channelsFromHsv(model.h, model.s, model.v, model.a + dir * dx));
358
+ else
359
+ setHsv(model.h, model.s + dir * dx, model.v, true);
360
+ return true;
361
+ }
362
+ case XK_UP:
363
+ case XK_DOWN: {
364
+ if (axis !== 'area')
365
+ return false;
366
+ const dir = ev.keysym === XK_UP ? 1 : -1;
367
+ setHsv(model.h, model.s, model.v + dir * dx, true);
368
+ return true;
369
+ }
370
+ case XK_HOME:
371
+ case XK_END: {
372
+ const end = ev.keysym === XK_END;
373
+ if (axis === 'hue')
374
+ setHsv(end ? 360 : 0, model.s, model.v, true);
375
+ else if (axis === 'alpha')
376
+ commit(channelsFromHsv(model.h, model.s, model.v, end ? 1 : 0));
377
+ else
378
+ setHsv(model.h, end ? 1 : 0, model.v, true);
379
+ return true;
380
+ }
381
+ case XK_PAGE_UP:
382
+ case XK_PAGE_DOWN: {
383
+ if (axis !== 'area')
384
+ return false;
385
+ setHsv(model.h, model.s, ev.keysym === XK_PAGE_UP ? 1 : 0, true);
386
+ return true;
387
+ }
388
+ case XK_TAB: {
389
+ // Only ours when the panel does not own the focus: a picker on a
390
+ // popup is fed its keys by the trigger, and without this its hue
391
+ // slider would be unreachable from the keyboard. Answering `false` at
392
+ // the ends is what lets Tab leave the picker.
393
+ if (focusable)
394
+ return false;
395
+ const list = axes();
396
+ const at = list.indexOf(axis);
397
+ const next = at + (ev.shiftKey ? -1 : 1);
398
+ if (next < 0 || next >= list.length)
399
+ return false;
400
+ setActive(list[next]);
401
+ return true;
402
+ }
403
+ default:
404
+ return false;
405
+ }
406
+ };
407
+ useImperativeHandle(ref, () => ({
408
+ focus: () => {
409
+ areaRef.current?.focus() ?? hueRef.current?.focus();
410
+ },
411
+ handleKey,
412
+ get value() {
413
+ return text;
414
+ },
415
+ get channels() {
416
+ return model;
417
+ },
418
+ }));
419
+ // --- the parts ----------------------------------------------------------
420
+ const shown = parts !== undefined
421
+ ? [...parts]
422
+ : [
423
+ 'area',
424
+ 'hue',
425
+ ...(alpha ? ['alpha'] : []),
426
+ 'fields',
427
+ ...(swatches?.length ? ['swatches'] : []),
428
+ ...(recent?.length ? ['recent'] : []),
429
+ ...(contrast ? ['contrast'] : []),
430
+ ];
431
+ const cursorShown = focusVisible ?? focused;
432
+ const hue = opaqueHex(channelsFromHsv(model.h, 1, 1));
433
+ const ink = disabled ? theme.textMuted : theme.text;
434
+ const axisProps = (axis, label, valueText, now, max) => ({
435
+ role: 'slider',
436
+ 'aria-label': label,
437
+ // The number alone means nothing read out loud, so every axis says what
438
+ // it is in words as well — the one part of React Aria's colour grammar
439
+ // that is pure gain.
440
+ 'aria-valuetext': valueText,
441
+ 'aria-valuenow': Math.round(now),
442
+ 'aria-valuemin': 0,
443
+ 'aria-valuemax': max,
444
+ 'aria-disabled': disabled || undefined,
445
+ focusable: focusable && !disabled,
446
+ onFocus: () => {
447
+ setFocused(true);
448
+ setActive(axis);
449
+ },
450
+ onBlur: () => setFocused(false),
451
+ onKeyDown: focusable ? handleKey : undefined,
452
+ });
453
+ const renderArea = () => hx('box', {
454
+ key: 'area',
455
+ ref: areaRef,
456
+ ...axisProps('area', 'Saturation and brightness', `saturation ${Math.round(model.s * 100)}%, brightness ${Math.round(model.v * 100)}%`, model.s * 100, 100),
457
+ style: [
458
+ s.area,
459
+ {
460
+ borderWidth: theme.borderWidth,
461
+ borderColor: cursorShown && active === 'area'
462
+ ? theme.borderFocus
463
+ : theme.border,
464
+ },
465
+ ],
466
+ ...track('area', areaTo),
467
+ }, hx('canvas', {
468
+ style: s.pane,
469
+ // Everything the drawing reads: the hue, and the size, which is a
470
+ // constant here precisely so this key can name it.
471
+ cacheKey: `sv:${Math.round(model.h)}:${CONTENT}x${AREA_H}`,
472
+ onDraw: (ctx, { width, height }) => {
473
+ ctx.fillStyle = hue;
474
+ ctx.fillRect(0, 0, width, height);
475
+ // Legacy comma spelling in the stops, for the same reason
476
+ // `formatColor` emits it: it is what ntk's parser understands.
477
+ const white = ctx.createLinearGradient(0, 0, width, 0);
478
+ white.addColorStop(0, 'rgb(255, 255, 255)');
479
+ white.addColorStop(1, 'rgba(255, 255, 255, 0)');
480
+ ctx.fillStyle = white;
481
+ ctx.fillRect(0, 0, width, height);
482
+ const black = ctx.createLinearGradient(0, 0, 0, height);
483
+ black.addColorStop(0, 'rgba(0, 0, 0, 0)');
484
+ black.addColorStop(1, 'rgb(0, 0, 0)');
485
+ ctx.fillStyle = black;
486
+ ctx.fillRect(0, 0, width, height);
487
+ },
488
+ }), hx('box', {
489
+ style: [
490
+ s.areaThumb,
491
+ {
492
+ left: model.s * CONTENT - THUMB / 2,
493
+ top: (1 - model.v) * AREA_H - THUMB / 2,
494
+ backgroundColor: opaqueHex(model),
495
+ },
496
+ ],
497
+ }));
498
+ const renderHue = () => hx('box', {
499
+ key: 'hue',
500
+ ref: hueRef,
501
+ ...axisProps('hue', 'Hue', `hue ${Math.round(model.h)} degrees`, model.h, 360),
502
+ style: [
503
+ s.strip,
504
+ {
505
+ borderWidth: theme.borderWidth,
506
+ borderColor: cursorShown && active === 'hue'
507
+ ? theme.borderFocus
508
+ : theme.border,
509
+ },
510
+ ],
511
+ ...track('hue', hueTo),
512
+ }, hx('canvas', {
513
+ style: s.pane,
514
+ cacheKey: `hue:${CONTENT}x${STRIP_H}`,
515
+ onDraw: (ctx, { width, height }) => {
516
+ const ramp = ctx.createLinearGradient(0, 0, width, 0);
517
+ for (let stop = 0; stop <= 6; stop += 1) {
518
+ ramp.addColorStop(stop / 6, opaqueHex(channelsFromHsv(stop * 60, 1, 1)));
519
+ }
520
+ ctx.fillStyle = ramp;
521
+ ctx.fillRect(0, 0, width, height);
522
+ },
523
+ }), hx('box', {
524
+ style: [
525
+ s.stripThumb,
526
+ { left: (model.h / 360) * CONTENT - 4, backgroundColor: hue },
527
+ ],
528
+ }));
529
+ const renderAlpha = () => hx('box', {
530
+ key: 'alpha',
531
+ ref: alphaRef,
532
+ ...axisProps('alpha', 'Opacity', `opacity ${Math.round(model.a * 100)}%`, model.a * 100, 100),
533
+ style: [
534
+ s.strip,
535
+ {
536
+ borderWidth: theme.borderWidth,
537
+ borderColor: cursorShown && active === 'alpha'
538
+ ? theme.borderFocus
539
+ : theme.border,
540
+ },
541
+ ],
542
+ ...track('alpha', alphaTo),
543
+ }, hx('canvas', {
544
+ style: s.pane,
545
+ cacheKey: `alpha:${opaqueHex(model)}:${CONTENT}x${STRIP_H}`,
546
+ onDraw: (ctx, { width, height }) => {
547
+ drawChecker(ctx, width, height);
548
+ const ramp = ctx.createLinearGradient(0, 0, width, 0);
549
+ const { r, g, b } = model;
550
+ ramp.addColorStop(0, `rgba(${r}, ${g}, ${b}, 0)`);
551
+ ramp.addColorStop(1, `rgb(${r}, ${g}, ${b})`);
552
+ ctx.fillStyle = ramp;
553
+ ctx.fillRect(0, 0, width, height);
554
+ },
555
+ }), hx('box', {
556
+ style: [
557
+ s.stripThumb,
558
+ { left: model.a * CONTENT - 4, backgroundColor: opaqueHex(model) },
559
+ ],
560
+ }));
561
+ /** A colour chip: the checkerboard, then the colour over it. Used for the
562
+ * preview and for every swatch, so a translucent preset reads as one. */
563
+ const chip = (
564
+ // `where` is part of the cache key, not decoration: every chip is the
565
+ // same drawing at a different size, and a key that named only the colour
566
+ // would let a 16px contrast chip composite a 26px preview's surface. The
567
+ // sizes are constants per call site, so the name is enough to separate
568
+ // them — this is the "a key that leaves an input out shows stale pixels"
569
+ // trap, found by looking at a real window.
570
+ where, colour, style, key) => hx('canvas', {
571
+ key,
572
+ style,
573
+ cacheKey: `chip:${where}:${formatColor(colour, 'hex', true)}`,
574
+ onDraw: (ctx, { width, height }) => {
575
+ if (colour.a < 1)
576
+ drawChecker(ctx, width, height);
577
+ const { r, g, b, a } = colour;
578
+ ctx.fillStyle =
579
+ a < 1 ? `rgba(${r}, ${g}, ${b}, ${a})` : opaqueHex(colour);
580
+ ctx.fillRect(0, 0, width, height);
581
+ },
582
+ });
583
+ /** What the field accepted, or a revert. A typed value that is not a colour
584
+ * is not an error state — the field simply goes back to the model, which
585
+ * is what every other picker does and what an escape key would have. */
586
+ const applyText = (raw) => {
587
+ if (parseColor(raw))
588
+ adopt(raw);
589
+ else
590
+ setTyped(null);
591
+ };
592
+ const modelText = () => {
593
+ if (textModel === 'hex')
594
+ return formatColor(model, 'hex', alpha);
595
+ if (textModel === 'rgb')
596
+ return formatColor(model, 'rgb', alpha);
597
+ return formatColor(model, 'hsl', alpha);
598
+ };
599
+ const renderFields = () => hx('box', { key: 'fields', style: s.row }, chip('preview', model, [
600
+ s.preview,
601
+ { borderWidth: theme.borderWidth, borderColor: theme.border },
602
+ ]),
603
+ // An override-redirect popup never takes the focus, so a `<textinput>`
604
+ // inside one could never be typed into — `<ColorField>` renders the
605
+ // value as a readout instead, and its own trigger is where a typed
606
+ // colour goes.
607
+ focusable
608
+ ? hx('textinput', {
609
+ value: typed ?? modelText(),
610
+ 'aria-label': 'Colour value',
611
+ disabled: disabled || undefined,
612
+ style: [
613
+ s.field,
614
+ {
615
+ borderWidth: theme.borderWidth,
616
+ borderRadius: theme.radius,
617
+ borderColor: theme.border,
618
+ backgroundColor: theme.surface,
619
+ fontFamily: theme.monoFamily,
620
+ },
621
+ ],
622
+ onChange: (ev) => setTyped(ev.value),
623
+ onSubmit: () => applyText(typed ?? ''),
624
+ onBlur: () => (typed === null ? undefined : applyText(typed)),
625
+ onKeyDown: (ev) => {
626
+ if (ev.keysym === XK_ESCAPE)
627
+ setTyped(null);
628
+ else if (ev.keysym === XK_RETURN)
629
+ applyText(typed ?? '');
630
+ },
631
+ })
632
+ : hx('text', {
633
+ style: [s.readout, { color: ink, fontFamily: theme.monoFamily }],
634
+ }, modelText()), hx('box', {
635
+ role: 'button',
636
+ 'aria-label': `Value as ${textModel.toUpperCase()} — press to change`,
637
+ focusable: focusable && !disabled,
638
+ style: [
639
+ s.button,
640
+ {
641
+ borderRadius: theme.radius,
642
+ ':hover': { backgroundColor: theme.surfaceHover },
643
+ ':active': { backgroundColor: theme.surfaceActive },
644
+ },
645
+ ],
646
+ onClick: disabled
647
+ ? undefined
648
+ : () => {
649
+ setTyped(null);
650
+ setTextModel(textModel === 'hex'
651
+ ? 'rgb'
652
+ : textModel === 'rgb'
653
+ ? 'hsl'
654
+ : 'hex');
655
+ },
656
+ }, hx('text', { style: { color: ink, fontSize: 11 } }, textModel.toUpperCase())), showDropper &&
657
+ hx('box', {
658
+ role: 'button',
659
+ 'aria-label': 'Pick a colour from the screen',
660
+ focusable: focusable && !disabled,
661
+ disabled: disabled || dropper.picking || undefined,
662
+ style: [
663
+ s.button,
664
+ {
665
+ borderRadius: theme.radius,
666
+ ':hover': { backgroundColor: theme.surfaceHover },
667
+ ':active': { backgroundColor: theme.surfaceActive },
668
+ },
669
+ ],
670
+ onClick: disabled || dropper.picking ? undefined : pickFromScreen,
671
+ }, React.createElement(EyedropperGlyph, { color: ink })));
672
+ const renderSwatches = (key, list) => hx('box', {
673
+ key,
674
+ role: 'group',
675
+ 'aria-label': key === 'recent' ? 'Recent colours' : 'Swatches',
676
+ style: s.swatches,
677
+ }, ...list.map((sw, i) => {
678
+ const parsed = parseColor(swatchValue(sw));
679
+ const chosen = parsed &&
680
+ formatColor(parsed, 'hex', true) === formatColor(model, 'hex', true);
681
+ return hx('box', {
682
+ key: `${key}:${i}`,
683
+ role: 'button',
684
+ 'aria-label': swatchLabel(sw),
685
+ 'aria-pressed': Boolean(chosen),
686
+ focusable: focusable && !disabled,
687
+ style: [
688
+ s.swatch,
689
+ {
690
+ borderRadius: theme.radius,
691
+ borderWidth: chosen ? 2 : theme.borderWidth,
692
+ borderColor: chosen ? theme.accent : theme.border,
693
+ },
694
+ ],
695
+ onClick: disabled ? undefined : () => adopt(swatchValue(sw)),
696
+ onKeyDown: (ev) => {
697
+ if (disabled)
698
+ return;
699
+ if (ev.keysym === XK_RETURN || ev.codepoint === 32)
700
+ adopt(swatchValue(sw));
701
+ },
702
+ }, parsed ? chip('swatch', parsed, s.pane) : null);
703
+ }));
704
+ const renderContrast = () => {
705
+ if (!contrast)
706
+ return null;
707
+ const ratio = contrastRatio(model, contrast);
708
+ if (ratio === null)
709
+ return null;
710
+ const grade = contrastGrade(ratio);
711
+ const colour = grade === 'fail'
712
+ ? theme.danger
713
+ : grade === 'AA'
714
+ ? theme.warning
715
+ : theme.success;
716
+ return hx('box', { key: 'contrast', style: s.contrast }, chip('contrast', parseColor(contrast) ?? model, [
717
+ {
718
+ width: 16,
719
+ height: 16,
720
+ borderWidth: theme.borderWidth,
721
+ borderColor: theme.border,
722
+ },
723
+ ]), hx('text', { style: { color: ink, fontSize: 11, flexGrow: 1 } }, `${ratio.toFixed(2)}:1`), hx('text', { style: { color: colour, fontSize: 11, fontWeight: 'bold' } }, grade));
724
+ };
725
+ const renderPart = (part) => {
726
+ switch (part) {
727
+ case 'area':
728
+ return renderArea();
729
+ case 'hue':
730
+ return renderHue();
731
+ case 'alpha':
732
+ return renderAlpha();
733
+ case 'fields':
734
+ return renderFields();
735
+ case 'swatches':
736
+ return swatches?.length ? renderSwatches('swatches', swatches) : null;
737
+ case 'recent':
738
+ return recent?.length ? renderSwatches('recent', recent) : null;
739
+ case 'contrast':
740
+ return renderContrast();
741
+ default:
742
+ return null;
743
+ }
744
+ };
745
+ // `data-testname` is a runtime convention — react-x11's queries read it off
746
+ // `props` — and its element declarations do not carry it, so it is attached
747
+ // past the type the way `<Terminal>` does.
748
+ return hx('box', {
749
+ theme,
750
+ role: 'group',
751
+ 'aria-label': 'Colour picker',
752
+ 'aria-disabled': disabled || undefined,
753
+ style: [s.root, style],
754
+ 'data-testname': props['data-testname'],
755
+ }, ...shown.map(renderPart), children);
756
+ }
757
+ //# sourceMappingURL=ColorPicker.js.map