@neural-charts/native 0.0.0-stage → 0.1.0-beta.1

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 (508) hide show
  1. package/README.md +58 -2
  2. package/THIRD-PARTY-NOTICES.md +15 -0
  3. package/docs/guide.md +783 -0
  4. package/library/annular-hit.d.ts +10 -0
  5. package/library/annular-hit.d.ts.map +1 -0
  6. package/library/annular-hit.js +43 -0
  7. package/library/annular-hit.js.map +1 -0
  8. package/library/chart-capabilities.d.ts +326 -0
  9. package/library/chart-capabilities.d.ts.map +1 -0
  10. package/library/chart-capabilities.js +39 -0
  11. package/library/chart-capabilities.js.map +1 -0
  12. package/library/circular-scene.d.ts +55 -0
  13. package/library/circular-scene.d.ts.map +1 -0
  14. package/library/circular-scene.js +39 -0
  15. package/library/circular-scene.js.map +1 -0
  16. package/library/comparison-render.d.ts +18 -0
  17. package/library/comparison-render.d.ts.map +1 -0
  18. package/library/comparison-render.js +33 -0
  19. package/library/comparison-render.js.map +1 -0
  20. package/library/comparison-scene.d.ts +40 -0
  21. package/library/comparison-scene.d.ts.map +1 -0
  22. package/library/comparison-scene.js +77 -0
  23. package/library/comparison-scene.js.map +1 -0
  24. package/library/composition-scene.d.ts +35 -0
  25. package/library/composition-scene.d.ts.map +1 -0
  26. package/library/composition-scene.js +55 -0
  27. package/library/composition-scene.js.map +1 -0
  28. package/library/contour-hit-index.d.ts +15 -0
  29. package/library/contour-hit-index.d.ts.map +1 -0
  30. package/library/contour-hit-index.js +75 -0
  31. package/library/contour-hit-index.js.map +1 -0
  32. package/library/contour-label-anchors.d.ts +9 -0
  33. package/library/contour-label-anchors.d.ts.map +1 -0
  34. package/library/contour-label-anchors.js +20 -0
  35. package/library/contour-label-anchors.js.map +1 -0
  36. package/library/contour-scene.d.ts +10 -0
  37. package/library/contour-scene.d.ts.map +1 -0
  38. package/library/contour-scene.js +76 -0
  39. package/library/contour-scene.js.map +1 -0
  40. package/library/contracts.d.ts +445 -0
  41. package/library/contracts.d.ts.map +1 -0
  42. package/library/contracts.js +2 -0
  43. package/library/contracts.js.map +1 -0
  44. package/library/dendrogram-scene.d.ts +7 -0
  45. package/library/dendrogram-scene.d.ts.map +1 -0
  46. package/library/dendrogram-scene.js +28 -0
  47. package/library/dendrogram-scene.js.map +1 -0
  48. package/library/empty-state.d.ts +8 -0
  49. package/library/empty-state.d.ts.map +1 -0
  50. package/library/empty-state.js +30 -0
  51. package/library/empty-state.js.map +1 -0
  52. package/library/heatmap-hit.d.ts +27 -0
  53. package/library/heatmap-hit.d.ts.map +1 -0
  54. package/library/heatmap-hit.js +56 -0
  55. package/library/heatmap-hit.js.map +1 -0
  56. package/library/heatmap-scene.d.ts +17 -0
  57. package/library/heatmap-scene.d.ts.map +1 -0
  58. package/library/heatmap-scene.js +85 -0
  59. package/library/heatmap-scene.js.map +1 -0
  60. package/library/index.d.ts +14 -0
  61. package/library/index.d.ts.map +1 -0
  62. package/library/index.js +4 -0
  63. package/library/index.js.map +1 -0
  64. package/library/interaction-content.d.ts +4 -0
  65. package/library/interaction-content.d.ts.map +1 -0
  66. package/library/interaction-content.js +28 -0
  67. package/library/interaction-content.js.map +1 -0
  68. package/library/interaction.d.ts +75 -0
  69. package/library/interaction.d.ts.map +1 -0
  70. package/library/interaction.js +523 -0
  71. package/library/interaction.js.map +1 -0
  72. package/library/marker-style.d.ts +24 -0
  73. package/library/marker-style.d.ts.map +1 -0
  74. package/library/marker-style.js +43 -0
  75. package/library/marker-style.js.map +1 -0
  76. package/library/parallel-scene.d.ts +11 -0
  77. package/library/parallel-scene.d.ts.map +1 -0
  78. package/library/parallel-scene.js +44 -0
  79. package/library/parallel-scene.js.map +1 -0
  80. package/library/path-validation.d.ts +3 -0
  81. package/library/path-validation.d.ts.map +1 -0
  82. package/library/path-validation.js +78 -0
  83. package/library/path-validation.js.map +1 -0
  84. package/library/pictorial-hit.d.ts +19 -0
  85. package/library/pictorial-hit.d.ts.map +1 -0
  86. package/library/pictorial-hit.js +73 -0
  87. package/library/pictorial-hit.js.map +1 -0
  88. package/library/pictorial-scene.d.ts +16 -0
  89. package/library/pictorial-scene.d.ts.map +1 -0
  90. package/library/pictorial-scene.js +73 -0
  91. package/library/pictorial-scene.js.map +1 -0
  92. package/library/point-label-placement.d.ts +34 -0
  93. package/library/point-label-placement.d.ts.map +1 -0
  94. package/library/point-label-placement.js +24 -0
  95. package/library/point-label-placement.js.map +1 -0
  96. package/library/polar-grid.d.ts +5 -0
  97. package/library/polar-grid.d.ts.map +1 -0
  98. package/library/polar-grid.js +28 -0
  99. package/library/polar-grid.js.map +1 -0
  100. package/library/polygon-hit.d.ts +18 -0
  101. package/library/polygon-hit.d.ts.map +1 -0
  102. package/library/polygon-hit.js +98 -0
  103. package/library/polygon-hit.js.map +1 -0
  104. package/library/profile-scene.d.ts +11 -0
  105. package/library/profile-scene.d.ts.map +1 -0
  106. package/library/profile-scene.js +51 -0
  107. package/library/profile-scene.js.map +1 -0
  108. package/library/relationship-hit-index.d.ts +12 -0
  109. package/library/relationship-hit-index.d.ts.map +1 -0
  110. package/library/relationship-hit-index.js +87 -0
  111. package/library/relationship-hit-index.js.map +1 -0
  112. package/library/relationship-scene.d.ts +12 -0
  113. package/library/relationship-scene.d.ts.map +1 -0
  114. package/library/relationship-scene.js +62 -0
  115. package/library/relationship-scene.js.map +1 -0
  116. package/library/scene-paint.d.ts +29 -0
  117. package/library/scene-paint.d.ts.map +1 -0
  118. package/library/scene-paint.js +123 -0
  119. package/library/scene-paint.js.map +1 -0
  120. package/library/scene-styles.d.ts +13 -0
  121. package/library/scene-styles.d.ts.map +1 -0
  122. package/library/scene-styles.js +135 -0
  123. package/library/scene-styles.js.map +1 -0
  124. package/library/scene.d.ts +49 -0
  125. package/library/scene.d.ts.map +1 -0
  126. package/library/scene.js +533 -0
  127. package/library/scene.js.map +1 -0
  128. package/library/temporal-hit-index.d.ts +13 -0
  129. package/library/temporal-hit-index.d.ts.map +1 -0
  130. package/library/temporal-hit-index.js +71 -0
  131. package/library/temporal-hit-index.js.map +1 -0
  132. package/library/temporal-scene.d.ts +6 -0
  133. package/library/temporal-scene.d.ts.map +1 -0
  134. package/library/temporal-scene.js +70 -0
  135. package/library/temporal-scene.js.map +1 -0
  136. package/library/tile-index.d.ts +11 -0
  137. package/library/tile-index.d.ts.map +1 -0
  138. package/library/tile-index.js +37 -0
  139. package/library/tile-index.js.map +1 -0
  140. package/library/tilemap-hit.d.ts +11 -0
  141. package/library/tilemap-hit.d.ts.map +1 -0
  142. package/library/tilemap-hit.js +63 -0
  143. package/library/tilemap-hit.js.map +1 -0
  144. package/library/tilemap-scene.d.ts +24 -0
  145. package/library/tilemap-scene.d.ts.map +1 -0
  146. package/library/tilemap-scene.js +125 -0
  147. package/library/tilemap-scene.js.map +1 -0
  148. package/library/uncertainty-scene.d.ts +11 -0
  149. package/library/uncertainty-scene.d.ts.map +1 -0
  150. package/library/uncertainty-scene.js +61 -0
  151. package/library/uncertainty-scene.js.map +1 -0
  152. package/library/venn-hit.d.ts +21 -0
  153. package/library/venn-hit.d.ts.map +1 -0
  154. package/library/venn-hit.js +37 -0
  155. package/library/venn-hit.js.map +1 -0
  156. package/library/venn-scene.d.ts +14 -0
  157. package/library/venn-scene.d.ts.map +1 -0
  158. package/library/venn-scene.js +84 -0
  159. package/library/venn-scene.js.map +1 -0
  160. package/library/wordcloud-scene.d.ts +19 -0
  161. package/library/wordcloud-scene.d.ts.map +1 -0
  162. package/library/wordcloud-scene.js +58 -0
  163. package/library/wordcloud-scene.js.map +1 -0
  164. package/native/activity.d.ts +14 -0
  165. package/native/activity.d.ts.map +1 -0
  166. package/native/activity.js +31 -0
  167. package/native/activity.js.map +1 -0
  168. package/native/bar-labels.d.ts +4 -0
  169. package/native/bar-labels.d.ts.map +1 -0
  170. package/native/bar-labels.js +16 -0
  171. package/native/bar-labels.js.map +1 -0
  172. package/native/bubble-entrance.d.ts +15 -0
  173. package/native/bubble-entrance.d.ts.map +1 -0
  174. package/native/bubble-entrance.js +27 -0
  175. package/native/bubble-entrance.js.map +1 -0
  176. package/native/chart-drilldown.d.ts +57 -0
  177. package/native/chart-drilldown.d.ts.map +1 -0
  178. package/native/chart-drilldown.js +118 -0
  179. package/native/chart-drilldown.js.map +1 -0
  180. package/native/chart-motion.d.ts +69 -0
  181. package/native/chart-motion.d.ts.map +1 -0
  182. package/native/chart-motion.js +165 -0
  183. package/native/chart-motion.js.map +1 -0
  184. package/native/chart-panels-options.d.ts +77 -0
  185. package/native/chart-panels-options.d.ts.map +1 -0
  186. package/native/chart-panels-options.js +2 -0
  187. package/native/chart-panels-options.js.map +1 -0
  188. package/native/chart-panels-state.d.ts +34 -0
  189. package/native/chart-panels-state.d.ts.map +1 -0
  190. package/native/chart-panels-state.js +198 -0
  191. package/native/chart-panels-state.js.map +1 -0
  192. package/native/chart-panels.d.ts +43 -0
  193. package/native/chart-panels.d.ts.map +1 -0
  194. package/native/chart-panels.js +107 -0
  195. package/native/chart-panels.js.map +1 -0
  196. package/native/chart-presentation.d.ts +40 -0
  197. package/native/chart-presentation.d.ts.map +1 -0
  198. package/native/chart-presentation.js +16 -0
  199. package/native/chart-presentation.js.map +1 -0
  200. package/native/chart-type.d.ts +65 -0
  201. package/native/chart-type.d.ts.map +1 -0
  202. package/native/chart-type.js +66 -0
  203. package/native/chart-type.js.map +1 -0
  204. package/native/chart.d.ts +571 -0
  205. package/native/chart.d.ts.map +1 -0
  206. package/native/chart.js +1417 -0
  207. package/native/chart.js.map +1 -0
  208. package/native/circular-options.d.ts +17 -0
  209. package/native/circular-options.d.ts.map +1 -0
  210. package/native/circular-options.js +2 -0
  211. package/native/circular-options.js.map +1 -0
  212. package/native/comparison-data.d.ts +64 -0
  213. package/native/comparison-data.d.ts.map +1 -0
  214. package/native/comparison-data.js +2 -0
  215. package/native/comparison-data.js.map +1 -0
  216. package/native/comparison-format.d.ts +16 -0
  217. package/native/comparison-format.d.ts.map +1 -0
  218. package/native/comparison-format.js +26 -0
  219. package/native/comparison-format.js.map +1 -0
  220. package/native/composition-options.d.ts +18 -0
  221. package/native/composition-options.d.ts.map +1 -0
  222. package/native/composition-options.js +2 -0
  223. package/native/composition-options.js.map +1 -0
  224. package/native/contour-data.d.ts +48 -0
  225. package/native/contour-data.d.ts.map +1 -0
  226. package/native/contour-data.js +2 -0
  227. package/native/contour-data.js.map +1 -0
  228. package/native/contour-format.d.ts +3 -0
  229. package/native/contour-format.d.ts.map +1 -0
  230. package/native/contour-format.js +11 -0
  231. package/native/contour-format.js.map +1 -0
  232. package/native/control-accessibility.d.ts +7 -0
  233. package/native/control-accessibility.d.ts.map +1 -0
  234. package/native/control-accessibility.js +9 -0
  235. package/native/control-accessibility.js.map +1 -0
  236. package/native/data-chart.d.ts +179 -0
  237. package/native/data-chart.d.ts.map +1 -0
  238. package/native/data-chart.js +415 -0
  239. package/native/data-chart.js.map +1 -0
  240. package/native/data-identities.d.ts +10 -0
  241. package/native/data-identities.d.ts.map +1 -0
  242. package/native/data-identities.js +50 -0
  243. package/native/data-identities.js.map +1 -0
  244. package/native/data-options.d.ts +566 -0
  245. package/native/data-options.d.ts.map +1 -0
  246. package/native/data-options.js +2 -0
  247. package/native/data-options.js.map +1 -0
  248. package/native/data-planning.d.ts +84 -0
  249. package/native/data-planning.d.ts.map +1 -0
  250. package/native/data-planning.js +174 -0
  251. package/native/data-planning.js.map +1 -0
  252. package/native/dendrogram-data.d.ts +27 -0
  253. package/native/dendrogram-data.d.ts.map +1 -0
  254. package/native/dendrogram-data.js +2 -0
  255. package/native/dendrogram-data.js.map +1 -0
  256. package/native/dendrogram-labels.d.ts +13 -0
  257. package/native/dendrogram-labels.d.ts.map +1 -0
  258. package/native/dendrogram-labels.js +12 -0
  259. package/native/dendrogram-labels.js.map +1 -0
  260. package/native/drilldown-options.d.ts +62 -0
  261. package/native/drilldown-options.d.ts.map +1 -0
  262. package/native/drilldown-options.js +2 -0
  263. package/native/drilldown-options.js.map +1 -0
  264. package/native/drilldown-state.d.ts +18 -0
  265. package/native/drilldown-state.d.ts.map +1 -0
  266. package/native/drilldown-state.js +130 -0
  267. package/native/drilldown-state.js.map +1 -0
  268. package/native/gauge-entrance.d.ts +8 -0
  269. package/native/gauge-entrance.d.ts.map +1 -0
  270. package/native/gauge-entrance.js +42 -0
  271. package/native/gauge-entrance.js.map +1 -0
  272. package/native/haptics.d.ts +21 -0
  273. package/native/haptics.d.ts.map +1 -0
  274. package/native/haptics.js +66 -0
  275. package/native/haptics.js.map +1 -0
  276. package/native/heatmap-data.d.ts +56 -0
  277. package/native/heatmap-data.d.ts.map +1 -0
  278. package/native/heatmap-data.js +2 -0
  279. package/native/heatmap-data.js.map +1 -0
  280. package/native/index.d.ts +26 -0
  281. package/native/index.d.ts.map +1 -0
  282. package/native/index.js +11 -0
  283. package/native/index.js.map +1 -0
  284. package/native/input-bridge.d.ts +32 -0
  285. package/native/input-bridge.d.ts.map +1 -0
  286. package/native/input-bridge.js +3 -0
  287. package/native/input-bridge.js.map +1 -0
  288. package/native/input-lease.d.ts +23 -0
  289. package/native/input-lease.d.ts.map +1 -0
  290. package/native/input-lease.js +28 -0
  291. package/native/input-lease.js.map +1 -0
  292. package/native/label-contrast.d.ts +7 -0
  293. package/native/label-contrast.d.ts.map +1 -0
  294. package/native/label-contrast.js +33 -0
  295. package/native/label-contrast.js.map +1 -0
  296. package/native/label-halo.d.ts +9 -0
  297. package/native/label-halo.d.ts.map +1 -0
  298. package/native/label-halo.js +23 -0
  299. package/native/label-halo.js.map +1 -0
  300. package/native/label-ink.d.ts +3 -0
  301. package/native/label-ink.d.ts.map +1 -0
  302. package/native/label-ink.js +6 -0
  303. package/native/label-ink.js.map +1 -0
  304. package/native/legend.d.ts +21 -0
  305. package/native/legend.d.ts.map +1 -0
  306. package/native/legend.js +66 -0
  307. package/native/legend.js.map +1 -0
  308. package/native/log-axis-labels.d.ts +6 -0
  309. package/native/log-axis-labels.d.ts.map +1 -0
  310. package/native/log-axis-labels.js +16 -0
  311. package/native/log-axis-labels.js.map +1 -0
  312. package/native/log-options.d.ts +5 -0
  313. package/native/log-options.d.ts.map +1 -0
  314. package/native/log-options.js +6 -0
  315. package/native/log-options.js.map +1 -0
  316. package/native/number-format.d.ts +5 -0
  317. package/native/number-format.d.ts.map +1 -0
  318. package/native/number-format.js +24 -0
  319. package/native/number-format.js.map +1 -0
  320. package/native/observation-format.d.ts +8 -0
  321. package/native/observation-format.d.ts.map +1 -0
  322. package/native/observation-format.js +80 -0
  323. package/native/observation-format.js.map +1 -0
  324. package/native/options-validation.d.ts +8 -0
  325. package/native/options-validation.d.ts.map +1 -0
  326. package/native/options-validation.js +612 -0
  327. package/native/options-validation.js.map +1 -0
  328. package/native/panel-viewport-contract.d.ts +15 -0
  329. package/native/panel-viewport-contract.d.ts.map +1 -0
  330. package/native/panel-viewport-contract.js +86 -0
  331. package/native/panel-viewport-contract.js.map +1 -0
  332. package/native/panel-viewport-sync.d.ts +27 -0
  333. package/native/panel-viewport-sync.d.ts.map +1 -0
  334. package/native/panel-viewport-sync.js +96 -0
  335. package/native/panel-viewport-sync.js.map +1 -0
  336. package/native/parallel-data.d.ts +49 -0
  337. package/native/parallel-data.d.ts.map +1 -0
  338. package/native/parallel-data.js +2 -0
  339. package/native/parallel-data.js.map +1 -0
  340. package/native/parallel-labels.d.ts +20 -0
  341. package/native/parallel-labels.d.ts.map +1 -0
  342. package/native/parallel-labels.js +54 -0
  343. package/native/parallel-labels.js.map +1 -0
  344. package/native/pictorial-data.d.ts +78 -0
  345. package/native/pictorial-data.d.ts.map +1 -0
  346. package/native/pictorial-data.js +2 -0
  347. package/native/pictorial-data.js.map +1 -0
  348. package/native/pictorial-format.d.ts +8 -0
  349. package/native/pictorial-format.d.ts.map +1 -0
  350. package/native/pictorial-format.js +14 -0
  351. package/native/pictorial-format.js.map +1 -0
  352. package/native/pictorial-options.d.ts +2 -0
  353. package/native/pictorial-options.d.ts.map +1 -0
  354. package/native/pictorial-options.js +61 -0
  355. package/native/pictorial-options.js.map +1 -0
  356. package/native/pictorial-paint.d.ts +19 -0
  357. package/native/pictorial-paint.d.ts.map +1 -0
  358. package/native/pictorial-paint.js +31 -0
  359. package/native/pictorial-paint.js.map +1 -0
  360. package/native/plan.d.ts +45 -0
  361. package/native/plan.d.ts.map +1 -0
  362. package/native/plan.js +109 -0
  363. package/native/plan.js.map +1 -0
  364. package/native/profile-data.d.ts +82 -0
  365. package/native/profile-data.d.ts.map +1 -0
  366. package/native/profile-data.js +2 -0
  367. package/native/profile-data.js.map +1 -0
  368. package/native/profile-labels.d.ts +5 -0
  369. package/native/profile-labels.d.ts.map +1 -0
  370. package/native/profile-labels.js +19 -0
  371. package/native/profile-labels.js.map +1 -0
  372. package/native/radial-entrance.d.ts +24 -0
  373. package/native/radial-entrance.d.ts.map +1 -0
  374. package/native/radial-entrance.js +25 -0
  375. package/native/radial-entrance.js.map +1 -0
  376. package/native/radial-layer.d.ts +26 -0
  377. package/native/radial-layer.d.ts.map +1 -0
  378. package/native/radial-layer.js +76 -0
  379. package/native/radial-layer.js.map +1 -0
  380. package/native/reference-labels.d.ts +21 -0
  381. package/native/reference-labels.d.ts.map +1 -0
  382. package/native/reference-labels.js +36 -0
  383. package/native/reference-labels.js.map +1 -0
  384. package/native/reference-options.d.ts +23 -0
  385. package/native/reference-options.d.ts.map +1 -0
  386. package/native/reference-options.js +58 -0
  387. package/native/reference-options.js.map +1 -0
  388. package/native/relationship-data.d.ts +63 -0
  389. package/native/relationship-data.d.ts.map +1 -0
  390. package/native/relationship-data.js +2 -0
  391. package/native/relationship-data.js.map +1 -0
  392. package/native/relationship-format.d.ts +13 -0
  393. package/native/relationship-format.d.ts.map +1 -0
  394. package/native/relationship-format.js +26 -0
  395. package/native/relationship-format.js.map +1 -0
  396. package/native/selection-outlines.d.ts +12 -0
  397. package/native/selection-outlines.d.ts.map +1 -0
  398. package/native/selection-outlines.js +20 -0
  399. package/native/selection-outlines.js.map +1 -0
  400. package/native/temporal-format.d.ts +29 -0
  401. package/native/temporal-format.d.ts.map +1 -0
  402. package/native/temporal-format.js +41 -0
  403. package/native/temporal-format.js.map +1 -0
  404. package/native/text-style.d.ts +16 -0
  405. package/native/text-style.d.ts.map +1 -0
  406. package/native/text-style.js +14 -0
  407. package/native/text-style.js.map +1 -0
  408. package/native/tilemap-color-axis.d.ts +23 -0
  409. package/native/tilemap-color-axis.d.ts.map +1 -0
  410. package/native/tilemap-color-axis.js +77 -0
  411. package/native/tilemap-color-axis.js.map +1 -0
  412. package/native/tilemap-data.d.ts +71 -0
  413. package/native/tilemap-data.d.ts.map +1 -0
  414. package/native/tilemap-data.js +2 -0
  415. package/native/tilemap-data.js.map +1 -0
  416. package/native/tilemap-format.d.ts +3 -0
  417. package/native/tilemap-format.d.ts.map +1 -0
  418. package/native/tilemap-format.js +14 -0
  419. package/native/tilemap-format.js.map +1 -0
  420. package/native/tilemap-selection.d.ts +12 -0
  421. package/native/tilemap-selection.d.ts.map +1 -0
  422. package/native/tilemap-selection.js +8 -0
  423. package/native/tilemap-selection.js.map +1 -0
  424. package/native/time-axis-labels.d.ts +5 -0
  425. package/native/time-axis-labels.d.ts.map +1 -0
  426. package/native/time-axis-labels.js +38 -0
  427. package/native/time-axis-labels.js.map +1 -0
  428. package/native/tooltip-layout.d.ts +16 -0
  429. package/native/tooltip-layout.d.ts.map +1 -0
  430. package/native/tooltip-layout.js +33 -0
  431. package/native/tooltip-layout.js.map +1 -0
  432. package/native/tooltip-metrics.d.ts +4 -0
  433. package/native/tooltip-metrics.d.ts.map +1 -0
  434. package/native/tooltip-metrics.js +11 -0
  435. package/native/tooltip-metrics.js.map +1 -0
  436. package/native/tooltip-motion.d.ts +35 -0
  437. package/native/tooltip-motion.d.ts.map +1 -0
  438. package/native/tooltip-motion.js +36 -0
  439. package/native/tooltip-motion.js.map +1 -0
  440. package/native/tooltip-occupancy.d.ts +21 -0
  441. package/native/tooltip-occupancy.d.ts.map +1 -0
  442. package/native/tooltip-occupancy.js +67 -0
  443. package/native/tooltip-occupancy.js.map +1 -0
  444. package/native/tooltip.d.ts +144 -0
  445. package/native/tooltip.d.ts.map +1 -0
  446. package/native/tooltip.js +146 -0
  447. package/native/tooltip.js.map +1 -0
  448. package/native/uncertainty-data.d.ts +110 -0
  449. package/native/uncertainty-data.d.ts.map +1 -0
  450. package/native/uncertainty-data.js +2 -0
  451. package/native/uncertainty-data.js.map +1 -0
  452. package/native/uncertainty-format.d.ts +3 -0
  453. package/native/uncertainty-format.d.ts.map +1 -0
  454. package/native/uncertainty-format.js +10 -0
  455. package/native/uncertainty-format.js.map +1 -0
  456. package/native/value-labels.d.ts +30 -0
  457. package/native/value-labels.d.ts.map +1 -0
  458. package/native/value-labels.js +206 -0
  459. package/native/value-labels.js.map +1 -0
  460. package/native/variwide-labels.d.ts +14 -0
  461. package/native/variwide-labels.d.ts.map +1 -0
  462. package/native/variwide-labels.js +22 -0
  463. package/native/variwide-labels.js.map +1 -0
  464. package/native/venn-data.d.ts +29 -0
  465. package/native/venn-data.d.ts.map +1 -0
  466. package/native/venn-data.js +2 -0
  467. package/native/venn-data.js.map +1 -0
  468. package/native/viewport-gestures.d.ts +32 -0
  469. package/native/viewport-gestures.d.ts.map +1 -0
  470. package/native/viewport-gestures.js +43 -0
  471. package/native/viewport-gestures.js.map +1 -0
  472. package/native/viewport-motion.d.ts +67 -0
  473. package/native/viewport-motion.d.ts.map +1 -0
  474. package/native/viewport-motion.js +182 -0
  475. package/native/viewport-motion.js.map +1 -0
  476. package/native/viewport-state.d.ts +20 -0
  477. package/native/viewport-state.d.ts.map +1 -0
  478. package/native/viewport-state.js +14 -0
  479. package/native/viewport-state.js.map +1 -0
  480. package/native/waterfall-appearance.d.ts +8 -0
  481. package/native/waterfall-appearance.d.ts.map +1 -0
  482. package/native/waterfall-appearance.js +18 -0
  483. package/native/waterfall-appearance.js.map +1 -0
  484. package/native/wordcloud-data.d.ts +40 -0
  485. package/native/wordcloud-data.d.ts.map +1 -0
  486. package/native/wordcloud-data.js +2 -0
  487. package/native/wordcloud-data.js.map +1 -0
  488. package/native/wordcloud-layer.d.ts +29 -0
  489. package/native/wordcloud-layer.d.ts.map +1 -0
  490. package/native/wordcloud-layer.js +58 -0
  491. package/native/wordcloud-layer.js.map +1 -0
  492. package/native/wordcloud-measurements.d.ts +47 -0
  493. package/native/wordcloud-measurements.d.ts.map +1 -0
  494. package/native/wordcloud-measurements.js +137 -0
  495. package/native/wordcloud-measurements.js.map +1 -0
  496. package/native/wordcloud-planning.d.ts +23 -0
  497. package/native/wordcloud-planning.d.ts.map +1 -0
  498. package/native/wordcloud-planning.js +25 -0
  499. package/native/wordcloud-planning.js.map +1 -0
  500. package/native/wordcloud-probes.d.ts +48 -0
  501. package/native/wordcloud-probes.d.ts.map +1 -0
  502. package/native/wordcloud-probes.js +111 -0
  503. package/native/wordcloud-probes.js.map +1 -0
  504. package/native/wordcloud-text-backend.d.ts +16 -0
  505. package/native/wordcloud-text-backend.d.ts.map +1 -0
  506. package/native/wordcloud-text-backend.js +3 -0
  507. package/native/wordcloud-text-backend.js.map +1 -0
  508. package/package.json +58 -4
@@ -0,0 +1,612 @@
1
+ import { pictorialShapeIssue } from './pictorial-options.js';
2
+ import { chartCapabilities, isChartFamily, supportsDataLabelLayout, supportsReferenceAxis } from '../library/chart-capabilities.js';
3
+ import { dataIdentities } from './data-identities.js';
4
+ import { identityKey } from '../library/contracts.js';
5
+ import { nativeReferenceBandGroups } from './reference-options.js';
6
+ const logScale = { type: ['log'], base: 'number' };
7
+ const textStyle = { align: ['left', 'center', 'right'], color: 'color', fontSize: 'fontSize', fontWeight: 'fontWeight' };
8
+ const rules = {
9
+ rendering: { active: 'boolean' },
10
+ colorAxis: { visible: 'boolean', scale: 'colorScale' }, title: 'string', subtitle: 'string', format: { unit: 'string', secondaryUnit: 'string' },
11
+ axes: { secondaryY: { visible: 'boolean', title: 'string', titleStyle: textStyle, referenceLines: 'referenceLines', referenceBands: 'referenceBands' }, visible: 'boolean', labels: 'boolean', ticks: 'boolean', grid: 'boolean', x: { scale: logScale, visible: 'boolean', title: 'string', titleStyle: textStyle, referenceLines: 'referenceLines', referenceBands: 'referenceBands' }, y: { scale: logScale, visible: 'boolean', title: 'string', titleStyle: textStyle, referenceLines: 'referenceLines', referenceBands: 'referenceBands' } },
12
+ legend: { visible: 'boolean', position: ['top', 'bottom', 'left', 'right'], interactive: 'boolean' },
13
+ tooltip: { mode: ['floating', 'docked', 'off'], content: ['point', 'shared'], pinnable: 'boolean', crosshair: 'boolean' },
14
+ animation: { enabled: 'boolean', durationMs: 'number', revision: 'number' },
15
+ interaction: { mode: ['explore', 'tap'], haptics: 'boolean', selectionControls: 'boolean' },
16
+ layout: { style: ['solid', 'needle'], endAngle: 'number', tickCount: 'number', bandwidth: 'number', resolution: 'number', normalization: ['width', 'area', 'count'], coordinates: ['cartesian', 'polar'], innerRadiusRatio: 'number', gapRatio: 'number', minFontSize: 'number', maxFontSize: 'number', padding: 'number', seed: 'number', maxWords: 'number', rotations: 'wordRotations', shape: 'pictorialShape', gap: 'number', background: 'boolean', tileShape: ['hexagon', 'circle', 'diamond', 'square'], levels: 'contourLevels', segmentBudget: 'number', startAngle: 'number', nodeRadius: 'number', linkWidth: 'number', bands: 'bulletBands', pointPadding: 'number', grouping: ['grouped', 'overlap'], rowPadding: 'number', labelPosition: ['alternate', 'above', 'below'], labelMaxWidth: 'number', orientation: ['horizontal', 'vertical'], nodeWidth: 'number', nodePadding: 'number', splitSeries: 'boolean', columns: 'number', minRadiusRatio: 'number', radiusScale: ['area', 'radius'], markerRadius: 'number', whiskerWidth: 'number', capWidth: 'number', neckWidth: 'number', neckHeight: 'number', reversed: 'boolean', stacking: ['sum', 'percent'], stackGroups: 'stackGroups', stackLabels: 'boolean' },
17
+ viewport: { axes: ['x', 'y', 'xy'], pinch: 'boolean', pan: 'boolean', controls: 'boolean', initial: { x: 'window', y: 'numericWindow' } },
18
+ appearance: { opacity: 'number', waterfall: { positiveColor: 'color', negativeColor: 'color', totalColor: 'color', connectorColor: 'color' }, locale: ['es', 'en'], theme: ['light', 'dark', 'system'], title: textStyle, subtitle: textStyle, plotHeight: 'number', minPlotWidth: 'number', lineWidth: 'number', markers: { visible: 'boolean', diameter: 'markerDiameter', shape: ['circle', 'square', 'diamond', 'triangle'], fillColor: 'color', borderColor: 'color', borderWidth: 'markerBorder' }, dataLabels: 'boolean', dataLabelLayout: ['auto', 'all', 'truncate'], axisLabelLayout: ['auto', 'all', 'truncate'], series: 'series', points: 'points' },
19
+ };
20
+ const invalid = (path, message = 'Unsupported chart option.') => ({ code: 'INVALID_CONFIG', reason: 'INVALID_CHART_OPTION', path, message });
21
+ function validate(value, rule, path, longSeries = false) {
22
+ if (value === undefined)
23
+ return null;
24
+ if (rule === 'stackGroups' || rule === 'sourceSeriesIds') {
25
+ const limit = rule === 'stackGroups' ? 8 : 16;
26
+ if (!Array.isArray(value) || value.length < 1 || value.length > limit)
27
+ return invalid(path, 'Expected a bounded nonempty partition.');
28
+ const ids = new Set();
29
+ for (let i = 0; i < value.length; i++) {
30
+ const d = Object.getOwnPropertyDescriptor(value, String(i));
31
+ if (!d || d.get || d.set)
32
+ return invalid(path + '.' + i);
33
+ const item = d.value;
34
+ if (rule === 'sourceSeriesIds') {
35
+ if (typeof item !== 'string' || !item || item.length > 64 || ids.has(item))
36
+ return invalid(path + '.' + i);
37
+ ids.add(item);
38
+ }
39
+ else {
40
+ const issue = validate(item, { id: 'string', label: 'string', seriesIds: 'sourceSeriesIds' }, path + '.' + i);
41
+ if (issue)
42
+ return issue;
43
+ if (!item || typeof item.id !== 'string' || !item.id || item.id.length > 64 || ids.has(item.id) || typeof item.label !== 'string' || !Array.isArray(item.seriesIds))
44
+ return invalid(path + '.' + i);
45
+ ids.add(item.id);
46
+ }
47
+ }
48
+ return null;
49
+ }
50
+ if (rule === 'pictorialShape') {
51
+ const issue = pictorialShapeIssue(value);
52
+ return issue ? invalid(path, issue) : null;
53
+ }
54
+ if (rule === 'colorScale') {
55
+ if (!value || typeof value !== 'object' || Array.isArray(value))
56
+ return invalid(path);
57
+ const type = Object.getOwnPropertyDescriptor(value, 'type')?.value;
58
+ return type === 'continuous' ? validate(value, { type: ['continuous'], domain: 'numericWindow', stops: 'colorStops', missingColor: 'color' }, path) : type === 'classes' ? validate(value, { type: ['classes'], classes: 'colorClasses', missingColor: 'color', unclassifiedColor: 'color' }, path) : invalid(path + '.type');
59
+ }
60
+ if (rule === 'colorStops' || rule === 'colorClasses') {
61
+ const limit = rule === 'colorStops' ? 8 : 16;
62
+ if (!Array.isArray(value) || value.length > (limit) || value.length < (rule === 'colorStops' ? 2 : 1))
63
+ return invalid(path);
64
+ for (let i = 0; i < value.length; i++) {
65
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(i));
66
+ if (!descriptor || descriptor.get || descriptor.set)
67
+ return invalid(path + '.' + i);
68
+ const error = validate(descriptor.value, rule === 'colorStops' ? { at: 'number', color: 'color' } : { id: 'string', label: 'string', minInclusive: 'referenceValue', maxExclusive: 'referenceValue', color: 'color' }, path + '.' + i);
69
+ if (error)
70
+ return error;
71
+ }
72
+ return null;
73
+ }
74
+ if (rule === 'wordRotations') {
75
+ if (!Array.isArray(value) || value.length < 1 || value.length > 2)
76
+ return invalid(path, 'Use zero and/or ninety degrees.');
77
+ const seen = new Set();
78
+ for (let i = 0; i < value.length; i++) {
79
+ const d = Object.getOwnPropertyDescriptor(value, String(i));
80
+ if (!d || d.get || d.set || (d.value !== 0 && d.value !== 90) || seen.has(d.value))
81
+ return invalid(path, 'Use unique rotations of zero or ninety degrees.');
82
+ seen.add(d.value);
83
+ }
84
+ return null;
85
+ }
86
+ if (rule === 'contourLevels') {
87
+ if (!Array.isArray(value) || value.length < 1 || value.length > 8)
88
+ return invalid(path, 'Use one to eight strictly increasing isoline thresholds.');
89
+ const ids = new Set();
90
+ let previous = -Infinity;
91
+ for (let index = 0; index < value.length; index++) {
92
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
93
+ if (!descriptor || descriptor.get || descriptor.set)
94
+ return invalid(path + '.' + index);
95
+ const item = descriptor.value, error = validate(item, { id: 'string', value: 'number' }, path + '.' + index);
96
+ if (error)
97
+ return error;
98
+ if (!item || typeof item.id !== 'string' || !item.id || item.id.length > 128 || ids.has(item.id) || !Number.isFinite(item.value) || item.value <= previous)
99
+ return invalid(path + '.' + index, 'Use unique IDs and strictly increasing finite values.');
100
+ ids.add(item.id);
101
+ previous = item.value;
102
+ }
103
+ return null;
104
+ }
105
+ if (rule === 'bulletBands') {
106
+ if (!Array.isArray(value) || value.length > 32)
107
+ return invalid(path, 'Maximum 32 qualitative bands.');
108
+ const ids = new Set();
109
+ for (let index = 0; index < value.length; index++) {
110
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
111
+ if (!descriptor || descriptor.get || descriptor.set)
112
+ return invalid(path + '.' + index);
113
+ const item = descriptor.value, error = validate(item, { id: 'string', from: 'number', to: 'number', label: 'string', color: 'color' }, path + '.' + index);
114
+ if (error)
115
+ return error;
116
+ if (!item || typeof item.id !== 'string' || !item.id || item.id.length > 128 || ids.has(item.id) || !Number.isFinite(item.from) || !Number.isFinite(item.to) || item.to <= item.from || item.label !== undefined && item.label.length > 256)
117
+ return invalid(path + '.' + index, 'Use unique IDs and increasing finite band bounds.');
118
+ ids.add(item.id);
119
+ }
120
+ return null;
121
+ }
122
+ if (rule === 'color')
123
+ return typeof value === 'string' && /^#[\da-f]{6}$/i.test(value) ? null : invalid(path, 'Use a #RRGGBB color.');
124
+ if (rule === 'fontWeight')
125
+ return typeof value === 'number' && [400, 500, 600, 700].includes(value) ? null : invalid(path, 'Use numeric font weight 400, 500, 600 or 700.');
126
+ if (rule === 'referenceWidth')
127
+ return typeof value === 'number' && Number.isFinite(value) && value >= .5 && value <= 6 ? null : invalid(path, 'Use 0.5–6 logical points.');
128
+ if (rule === 'referenceValue')
129
+ return typeof value === 'number' && Number.isFinite(value) || typeof value === 'string' && value.length > 0 && value.length <= 256 ? null : invalid(path, 'Use a finite number or category ID.');
130
+ if (rule === 'referenceOpacity')
131
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0 && value <= 1 ? null : invalid(path, 'Use opacity between 0 and 1.');
132
+ if (rule === 'referenceBands') {
133
+ if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype || value.length > 32)
134
+ return invalid(path, 'Use a plain array with at most 32 reference bands across all axes.');
135
+ const fields = Object.getOwnPropertyDescriptors(value);
136
+ if (Reflect.ownKeys(fields).some(key => typeof key !== 'string' || key !== 'length' && (!/^(0|[1-9]\d*)$/.test(key) || Number(key) >= value.length) || typeof key === 'string' && (fields[key]?.get || fields[key]?.set)))
137
+ return invalid(path, 'Reference band arrays cannot contain extra properties, symbols or accessors.');
138
+ const ids = new Set();
139
+ for (let index = 0; index < value.length; index++) {
140
+ const descriptor = fields[String(index)];
141
+ if (!descriptor || descriptor.get || descriptor.set)
142
+ return invalid(path + '.' + index);
143
+ const item = descriptor.value, error = validate(item, { id: 'string', from: 'referenceValue', to: 'referenceValue', label: 'string', color: 'color', opacity: 'referenceOpacity' }, path + '.' + index);
144
+ if (error)
145
+ return error;
146
+ if (!item || typeof item.id !== 'string' || !item.id || item.id.length > 64 || item.from === undefined || item.to === undefined || item.label !== undefined && item.label.length > 200)
147
+ return invalid(path + '.' + index, 'Use an ID, from/to endpoints and an optional label up to 200 characters.');
148
+ if (ids.has(item.id))
149
+ return invalid(path + '.' + index + '.id', 'Duplicate reference band ID.');
150
+ ids.add(item.id);
151
+ }
152
+ return null;
153
+ }
154
+ if (rule === 'points' || rule === 'referenceLines') {
155
+ const maximum = rule === 'points' ? 256 : 16;
156
+ if (!Array.isArray(value) || value.length > maximum)
157
+ return invalid(path, `Maximum ${maximum} entries.`);
158
+ const ids = new Set();
159
+ for (let index = 0; index < value.length; index++) {
160
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
161
+ if (!descriptor || descriptor.get || descriptor.set)
162
+ return invalid(path + '.' + index);
163
+ const item = descriptor.value, error = validate(item, rule === 'points' ? { seriesId: 'string', pointId: 'string', color: 'color' } : { id: 'string', value: 'referenceValue', label: 'string', color: 'color', width: 'referenceWidth', dash: ['solid', 'dash', 'dot'] }, path + '.' + index);
164
+ if (error)
165
+ return error;
166
+ if (!item || typeof item !== 'object')
167
+ return invalid(path + '.' + index);
168
+ if (rule === 'points') {
169
+ if (typeof item.seriesId !== 'string' || !item.seriesId || item.seriesId.length > 128 || typeof item.pointId !== 'string' || !item.pointId || item.pointId.length > 128 || typeof item.color !== 'string')
170
+ return invalid(path + '.' + index);
171
+ }
172
+ else if (typeof item.id !== 'string' || !item.id || item.id.length > 64 || item.value === undefined)
173
+ return invalid(path + '.' + index);
174
+ const key = rule === 'points' ? identityKey(item) : item.id;
175
+ if (ids.has(key))
176
+ return invalid(path + '.' + index, 'Duplicate identity.');
177
+ ids.add(key);
178
+ }
179
+ return null;
180
+ }
181
+ if (rule === 'fontSize' || rule === 'markerDiameter' || rule === 'markerBorder') {
182
+ const [minimum, maximum] = rule === 'fontSize' ? [10, 40] : rule === 'markerDiameter' ? [2, 12] : [0, 6];
183
+ return typeof value === 'number' && Number.isFinite(value) && value >= minimum && value <= maximum ? null : invalid(path, `Use ${minimum}–${maximum} logical points.`);
184
+ }
185
+ if (rule === 'window' || rule === 'numericWindow') {
186
+ if (Array.isArray(value)) {
187
+ if (value.length !== 2)
188
+ return invalid(path, 'Expected increasing numeric bounds.');
189
+ const low = Object.getOwnPropertyDescriptor(value, '0'), high = Object.getOwnPropertyDescriptor(value, '1');
190
+ if (!low || !high || low.get || low.set || high.get || high.set || typeof low.value !== 'number' || typeof high.value !== 'number' || !Number.isFinite(low.value) || !Number.isFinite(high.value) || low.value >= high.value)
191
+ return invalid(path, 'Expected finite increasing numeric bounds.');
192
+ return null;
193
+ }
194
+ if (rule === 'numericWindow')
195
+ return invalid(path, 'This axis requires a numeric window.');
196
+ const error = validate(value, { firstId: 'string', lastId: 'string' }, path);
197
+ if (error)
198
+ return error;
199
+ const descriptors = Object.getOwnPropertyDescriptors(value);
200
+ return descriptors['firstId']?.value && descriptors['lastId']?.value && descriptors['firstId'].value.length <= 128 && descriptors['lastId'].value.length <= 128 ? null : invalid(path, 'Expected firstId and lastId category identities.');
201
+ }
202
+ if (rule === 'series') {
203
+ if (!Array.isArray(value) || value.length > 16)
204
+ return invalid(path);
205
+ const ids = new Set();
206
+ for (let i = 0; i < value.length; i++) {
207
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(i));
208
+ if (!descriptor || descriptor.get || descriptor.set)
209
+ return invalid(path + '.' + i);
210
+ const item = descriptor.value, error = validate(item, { id: 'string', color: 'string', name: 'string' }, path + '.' + i, longSeries);
211
+ if (error)
212
+ return error;
213
+ if (!item?.id || item.id.length > 128 || ids.has(item.id) || typeof item.color !== 'string' || !/^#[\da-f]{6}$/i.test(item.color))
214
+ return invalid(path + '.' + i);
215
+ ids.add(item.id);
216
+ }
217
+ return null;
218
+ }
219
+ if (typeof rule === 'string') {
220
+ if (typeof value !== rule || rule === 'number' && !Number.isFinite(value))
221
+ return invalid(path);
222
+ if (rule === 'string') {
223
+ const maximum = longSeries && path.startsWith('options.appearance.series.') && path.endsWith('.name') ? 256 : path === 'options.subtitle' ? 1000 : path === 'options.format.unit' || path === 'options.format.secondaryUnit' ? 64 : 200;
224
+ if (value.length > maximum)
225
+ return invalid(path, `Maximum ${maximum} characters.`);
226
+ }
227
+ return null;
228
+ }
229
+ if (Array.isArray(rule))
230
+ return typeof value === 'string' && rule.includes(value) ? null : invalid(path);
231
+ if (!value || typeof value !== 'object' || Array.isArray(value) || Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)
232
+ return invalid(path);
233
+ const keys = Reflect.ownKeys(value);
234
+ if (keys.length > Object.keys(rule).length)
235
+ return invalid(path, 'Too many option properties.');
236
+ for (const key of keys) {
237
+ if (typeof key !== 'string' || !Object.hasOwn(rule, key))
238
+ return invalid(path + '.' + String(key));
239
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
240
+ if (descriptor.get || descriptor.set)
241
+ return invalid(path + '.' + key);
242
+ const error = validate(descriptor.value, rule[key], path + '.' + key, longSeries);
243
+ if (error)
244
+ return error;
245
+ }
246
+ return null;
247
+ }
248
+ export function optionsDiagnostic(data, options) {
249
+ const family = data && typeof data === 'object' ? Object.getOwnPropertyDescriptor(data, 'type')?.value : undefined;
250
+ const error = validate(options, rules, 'options', family === 'pictorial' || family === 'venn');
251
+ if (error)
252
+ return error;
253
+ if (!options || typeof options !== 'object')
254
+ return invalid('options');
255
+ if (isChartFamily(family)) {
256
+ if (options.appearance?.dataLabelLayout !== undefined && !supportsDataLabelLayout(family))
257
+ return invalid('options.appearance.dataLabelLayout', 'This chart uses its own data label layout.');
258
+ if (options.appearance?.axisLabelLayout !== undefined && chartCapabilities[family].axes !== 'cartesian')
259
+ return invalid('options.appearance.axisLabelLayout', 'This option applies to Cartesian axes.');
260
+ }
261
+ for (const axis of ['x', 'y']) {
262
+ const settings = options.axes?.[axis], scale = settings && 'scale' in settings ? settings.scale : undefined;
263
+ if (scale === undefined)
264
+ continue;
265
+ if (!['line', 'scatter', 'bubble'].includes(family) || scale.type !== 'log' || scale.base !== undefined && scale.base !== 10)
266
+ return invalid('options.axes.' + axis + '.scale', 'Logarithmic projection supports line, scatter and bubble with base 10 only.');
267
+ const source = Object.getOwnPropertyDescriptor(data, 'axes')?.value, coordinate = source && Object.getOwnPropertyDescriptor(source, axis)?.value;
268
+ if (!coordinate || coordinate.type !== 'linear' || coordinate.includeZero === true)
269
+ return invalid('options.axes.' + axis + '.scale', 'Use a positive numeric source axis without includeZero. Category/time axes cannot use a logarithmic projection.');
270
+ }
271
+ const circular = family === 'pie' || family === 'donut' || family === 'gauge', layout = options.layout;
272
+ if (layout && circular) {
273
+ const allowed = family === 'gauge' ? ['startAngle', 'endAngle', 'style', 'tickCount'] : ['startAngle', 'endAngle'];
274
+ if (Reflect.ownKeys(layout).some(key => typeof key !== 'string' || !allowed.includes(key)))
275
+ return invalid('options.layout', 'This circular chart supports only its arc and dial options.');
276
+ const start = 'startAngle' in layout ? layout.startAngle : undefined, end = 'endAngle' in layout ? layout.endAngle : undefined;
277
+ const ring = data.type === 'gauge' && data.preset === 'ring', from = start ?? (family === 'gauge' && !ring ? -90 : 0), to = end ?? (family === 'gauge' && !ring ? 90 : 360);
278
+ if (from < -360 || from > 360 || to < -359 || to > 720 || to - from < 1 || to - from > 360)
279
+ return invalid('options.layout', 'Use a clockwise sweep of 1–360 degrees within the documented angle bounds.');
280
+ const style = 'style' in layout ? layout.style : undefined, ticks = 'tickCount' in layout ? layout.tickCount : undefined;
281
+ if (ticks !== undefined && (style !== 'needle' || !Number.isInteger(ticks) || ticks < 2 || ticks > 12))
282
+ return invalid('options.layout.tickCount', 'Needle dials accept a target density of 2–12 ticks.');
283
+ }
284
+ if (layout && !circular && ['endAngle', 'style', 'tickCount'].some(key => Object.getOwnPropertyDescriptor(layout, key)?.value !== undefined))
285
+ return invalid('options.layout', 'Arc end and dial options require pie, donut or gauge data.');
286
+ const layoutStacking = options.layout && 'stacking' in options.layout ? options.layout.stacking : undefined;
287
+ const layoutStackLabels = options.layout && 'stackLabels' in options.layout ? options.layout.stackLabels : undefined;
288
+ const layoutNeckWidth = options.layout && 'neckWidth' in options.layout ? options.layout.neckWidth : undefined;
289
+ const layoutNeckHeight = options.layout && 'neckHeight' in options.layout ? options.layout.neckHeight : undefined;
290
+ const layoutReversed = options.layout && 'reversed' in options.layout ? options.layout.reversed : undefined;
291
+ const layoutWhiskerWidth = options.layout && 'whiskerWidth' in options.layout ? options.layout.whiskerWidth : undefined;
292
+ const layoutCapWidth = options.layout && 'capWidth' in options.layout ? options.layout.capWidth : undefined;
293
+ const layoutMarkerRadius = options.layout && 'markerRadius' in options.layout ? options.layout.markerRadius : undefined;
294
+ const layoutColumns = options.layout && 'columns' in options.layout ? options.layout.columns : undefined;
295
+ const layoutMinRadiusRatio = options.layout && 'minRadiusRatio' in options.layout ? options.layout.minRadiusRatio : undefined;
296
+ const layoutRadiusScale = options.layout && 'radiusScale' in options.layout ? options.layout.radiusScale : undefined;
297
+ const secondary = options.axes && 'secondaryY' in options.axes ? options.axes.secondaryY : undefined, secondaryUnit = options.format && 'secondaryUnit' in options.format ? options.format.secondaryUnit : undefined;
298
+ const sourceAxes = Object.getOwnPropertyDescriptor(data, 'axes')?.value, hasSecondary = family === 'mixed' && sourceAxes && typeof sourceAxes === 'object' && !!Object.getOwnPropertyDescriptor(sourceAxes, 'secondaryY');
299
+ if ((secondary !== undefined || secondaryUnit !== undefined) && !hasSecondary)
300
+ return invalid('options.axes.secondaryY', 'Declare data.axes.secondaryY and assign source series before styling its axis or unit.');
301
+ if (secondary?.referenceLines?.some(r => typeof r.value !== 'number' || !Number.isFinite(r.value)))
302
+ return invalid('options.axes.secondaryY.referenceLines', 'Secondary references require finite original numeric values.');
303
+ const groups = options.layout && 'stackGroups' in options.layout ? options.layout.stackGroups : undefined;
304
+ if (groups !== undefined) {
305
+ if (family !== 'column' || !layoutStacking)
306
+ return invalid('options.layout.stackGroups', 'Grouped stacks require column data and sum/percent stacking.');
307
+ const known = dataIdentities(data)?.series, assigned = new Set();
308
+ for (const g of groups)
309
+ for (const id of g.seriesIds) {
310
+ if (!known?.has(id) || assigned.has(id))
311
+ return invalid('options.layout.stackGroups', 'Every original series must belong to exactly one group.');
312
+ assigned.add(id);
313
+ }
314
+ if (assigned.size !== known?.size)
315
+ return invalid('options.layout.stackGroups', 'Every original series must belong to exactly one group.');
316
+ }
317
+ const referenceIds = [...['x', 'y'].flatMap(axis => options.axes?.[axis]?.referenceLines ?? []), ...(secondary?.referenceLines ?? [])].map(r => r.id);
318
+ if (referenceIds.length > 16 || new Set(referenceIds).size !== referenceIds.length)
319
+ return invalid('options.axes', 'Use at most 16 reference lines with unique IDs across all axes.');
320
+ const bandGroups = nativeReferenceBandGroups(options), bandIds = bandGroups.flatMap(group => group.bands.map(band => band.id));
321
+ if (bandIds.length > 32 || new Set(bandIds).size !== bandIds.length)
322
+ return invalid('options.axes', 'Use at most 32 reference bands with unique IDs across all axes.');
323
+ if (bandGroups.length && !['line', 'area', 'spline', 'areaspline', 'column', 'mixed', 'scatter', 'bubble'].includes(family))
324
+ return invalid('options.axes', 'Reference bands support line, area, spline, area spline, column/bar, mixed, scatter and bubble only.');
325
+ const bandIdentities = bandGroups.length ? dataIdentities(data) : undefined;
326
+ for (const group of bandGroups)
327
+ for (const [index, band] of group.bands.entries()) {
328
+ const path = 'options.axes.' + (group.valueAxis === 'secondary' ? 'secondaryY' : group.axis) + '.referenceBands.' + index;
329
+ if (group.axis === 'x' && bandIdentities?.xKind === 'category') {
330
+ const categories = [...bandIdentities.categories], first = typeof band.from === 'string' ? categories.indexOf(band.from) : -1, last = typeof band.to === 'string' ? categories.indexOf(band.to) : -1;
331
+ if (first < 0 || last < first)
332
+ return invalid(path, 'Use existing category IDs in source order; both endpoints are inclusive.');
333
+ }
334
+ else {
335
+ if (typeof band.from !== 'number' || typeof band.to !== 'number' || !Number.isFinite(band.from) || !Number.isFinite(band.to) || band.from >= band.to)
336
+ return invalid(path, 'Use increasing finite endpoints in the represented axis units (percent-stacked Y uses 0–100).');
337
+ if (group.axis === 'x' && bandIdentities?.xKind === 'time' && (!Number.isInteger(band.from) || !Number.isInteger(band.to) || Math.abs(band.from) > 8.64e15 || Math.abs(band.to) > 8.64e15))
338
+ return invalid(path, 'Time endpoints must be supported integer timestamps.');
339
+ }
340
+ }
341
+ if (family === 'heatmap') {
342
+ if (options.axes?.grid !== undefined)
343
+ return invalid('options.axes.grid', 'Matrix separation uses layout.gapRatio.');
344
+ if (options.legend !== undefined)
345
+ return invalid('options.legend', 'Use the quantitative colorAxis; matrix cells are not visibility series.');
346
+ if (options.tooltip?.crosshair !== undefined)
347
+ return invalid('options.tooltip.crosshair');
348
+ if (options.appearance?.series !== undefined)
349
+ return invalid('options.appearance.series', 'Use colorAxis.scale.');
350
+ if (options.axes?.x?.referenceLines !== undefined || options.axes?.y?.referenceLines !== undefined)
351
+ return invalid('options.axes', 'Reference lines are not supported on this category matrix.');
352
+ }
353
+ if (family === 'tilemap' && options.tooltip?.crosshair !== undefined)
354
+ return invalid('options.tooltip.crosshair', 'Tilemaps have no numeric crosshair.');
355
+ if (options.colorAxis && family !== 'tilemap' && family !== 'heatmap')
356
+ return invalid('options.colorAxis', 'Color axes apply to tilemaps.');
357
+ if (options.appearance?.opacity !== undefined && (!['heatmap', 'tilemap'].includes(family) || options.appearance.opacity < 0 || options.appearance.opacity > 1))
358
+ return invalid('options.appearance.opacity', 'Use opacity from zero to one on tilemaps.');
359
+ if (family === 'tilemap' && (options.appearance?.series !== undefined || options.appearance?.dataLabels !== undefined))
360
+ return invalid('options.appearance', 'Tilemap cell colors come from colorAxis.scale; inline data labels are unsupported.');
361
+ if (options.appearance?.waterfall && family !== 'waterfall')
362
+ return invalid('options.appearance.waterfall');
363
+ if (options.axes && (!isChartFamily(family) || chartCapabilities[family].axes === 'none' && family !== 'parallel' && family !== 'dendrogram'))
364
+ return invalid('options.axes', 'This chart family has no configurable axes.');
365
+ if (options.viewport && (!isChartFamily(family) || chartCapabilities[family].viewport === false))
366
+ return invalid('options.viewport', 'This chart type does not support viewport controls.');
367
+ if (family === 'pictorial') {
368
+ if (options.axes?.y !== undefined || options.axes?.grid !== undefined || options.axes?.x?.referenceLines !== undefined)
369
+ return invalid('options.axes', 'Pictorial supports category X labels and titles only.');
370
+ if (options.appearance?.dataLabels !== undefined)
371
+ return invalid('options.appearance.dataLabels', 'Pictorial values are available through touch and accessible navigation; inline labels are not supported.');
372
+ if (options.tooltip?.crosshair !== undefined)
373
+ return invalid('options.tooltip.crosshair', 'Pictorial has no numeric crosshair.');
374
+ }
375
+ if (family === 'timeline' && options.axes?.y !== undefined)
376
+ return invalid('options.axes.y', 'Timeline has no Y data axis; lane labels are derived from its series.');
377
+ if (family === 'timeline' && options.axes?.grid !== undefined)
378
+ return invalid('options.axes.grid', 'Timeline has no numeric grid.');
379
+ if (family === 'variwide' && options.viewport && (options.viewport.axes !== undefined && options.viewport.axes !== 'y' || options.viewport.initial !== undefined && Object.hasOwn(options.viewport.initial, 'x')))
380
+ return invalid('options.viewport', 'Variwide supports numeric Y zoom only; weighted X zoom is unavailable.');
381
+ if ((family === 'flame' || family === 'xrange' || family === 'timeline') && options.viewport && (options.viewport.axes !== undefined && options.viewport.axes !== 'x' || options.viewport.initial !== undefined && Object.hasOwn(options.viewport.initial, 'y')))
382
+ return invalid('options.viewport', 'Temporal charts support a numeric or UTC X viewport only.');
383
+ if ((family === 'xrange' || family === 'timeline') && options.axes?.y?.referenceLines !== undefined)
384
+ return invalid('options.axes.y.referenceLines', 'Temporal charts support X reference lines only.');
385
+ if (family === 'pareto' && options.viewport && (options.viewport.axes !== undefined && options.viewport.axes !== 'x' || options.viewport.initial !== undefined && Object.hasOwn(options.viewport.initial, 'y')))
386
+ return invalid('options.viewport', 'Pareto supports a category X viewport only.');
387
+ if (family === 'sankey' && options.viewport?.axes !== undefined && options.viewport.axes !== 'xy')
388
+ return invalid('options.viewport.axes', 'Sankey uses normalized XY layout zoom.');
389
+ if (family === 'packedbubble' && options.viewport?.axes !== undefined && options.viewport.axes !== 'xy')
390
+ return invalid('options.viewport.axes', 'Packed bubbles require equal-scale XY zoom.');
391
+ if (family === 'contour' && (!options.layout || !('levels' in options.layout) || options.layout.levels === undefined))
392
+ return invalid('options.layout.levels', 'Provide isoline threshold IDs and values.');
393
+ if (options.layout && !circular && !['flame', 'violin', 'dendrogram', 'parallel', 'windrose', 'radialbar', 'heatmap', 'venn', 'wordcloud', 'pictorial', 'tilemap', 'contour', 'dependencywheel', 'arcdiagram', 'chord', 'bullet', 'variwide', 'xrange', 'timeline', 'sankey', 'treegraph', 'organization', 'packedbubble', 'variablepie', 'item', 'lollipop', 'dumbbell', 'boxplot', 'errorbar', 'funnel', 'pyramid', 'column', 'area', 'areaspline'].includes(family))
394
+ return invalid('options.layout', 'Stacking applies to area, area spline, column and horizontal bar charts.');
395
+ if (family === 'wordcloud' && (options.tooltip?.crosshair !== undefined || options.appearance?.dataLabels !== undefined))
396
+ return invalid('options', 'Words are their own labels and do not use a numeric crosshair.');
397
+ if (options.axes && family !== 'parallel' && family !== 'dendrogram' && Reflect.ownKeys(options.axes).some(k => ['visible', 'labels', 'ticks'].includes(String(k))))
398
+ return invalid('options.axes', 'Independent-axis display flags apply only to parallel coordinates.');
399
+ if ((family === 'treegraph' || family === 'organization') && options.layout && Reflect.ownKeys(options.layout).some(key => key !== 'orientation'))
400
+ return invalid('options.layout', 'Tree and organization layouts accept orientation only.');
401
+ if (family === 'dendrogram') {
402
+ if (options.axes && Reflect.ownKeys(options.axes).some(k => k !== 'visible'))
403
+ return invalid('options.axes', 'Dendrogram exposes axes.visible only.');
404
+ if (options.format)
405
+ return invalid('options.format', 'Use the source distance unit, or explicitly computed topology levels.');
406
+ if (options.layout && Reflect.ownKeys(options.layout).some(k => k !== 'orientation'))
407
+ return invalid('options.layout', 'Dendrogram exposes orientation only.');
408
+ }
409
+ if (family === 'flame' || family === 'violin') {
410
+ if (options.format)
411
+ return invalid('options.format', 'Measurement units belong to source axes.');
412
+ if (family === 'violin' && (options.axes?.x?.referenceLines !== undefined || options.axes?.y?.referenceLines !== undefined))
413
+ return invalid('options.axes', 'Violin does not expose reference lines.');
414
+ if (family === 'flame' && options.axes?.y?.referenceLines !== undefined)
415
+ return invalid('options.axes.y.referenceLines', 'Flame supports X references only.');
416
+ }
417
+ if (family === 'parallel' && options.axes && Reflect.ownKeys(options.axes).some(k => !['visible', 'labels', 'ticks'].includes(String(k))))
418
+ return invalid('options.axes', 'Parallel coordinates use per-dimension source axes.');
419
+ if (family === 'parallel' && options.appearance?.dataLabels !== undefined)
420
+ return invalid('options.appearance.dataLabels', 'Use axis ticks and original point tooltips.');
421
+ if (family === 'parallel' && options.layout && 'coordinates' in options.layout && options.layout.coordinates === 'polar' && (options.appearance?.minPlotWidth ?? 0) > 0)
422
+ return invalid('options.appearance.minPlotWidth', 'Horizontal plot scrolling applies only to Cartesian parallel coordinates.');
423
+ if (options.layout) {
424
+ if (family === 'flame' && Reflect.ownKeys(options.layout).some(k => k !== 'rowPadding'))
425
+ return invalid('options.layout', 'Flame supports rowPadding only.');
426
+ if (family === 'violin' && Reflect.ownKeys(options.layout).some(k => !['bandwidth', 'resolution', 'normalization', 'gapRatio'].includes(String(k))))
427
+ return invalid('options.layout', 'Only density bandwidth, resolution, normalisation and spacing apply.');
428
+ if ('bandwidth' in options.layout && options.layout.bandwidth !== undefined && (family !== 'violin' || options.layout.bandwidth <= 0))
429
+ return invalid('options.layout.bandwidth');
430
+ if ('resolution' in options.layout && options.layout.resolution !== undefined && (family !== 'violin' || !Number.isInteger(options.layout.resolution) || options.layout.resolution < 32 || options.layout.resolution > 128))
431
+ return invalid('options.layout.resolution');
432
+ if ('normalization' in options.layout && options.layout.normalization !== undefined && family !== 'violin')
433
+ return invalid('options.layout.normalization');
434
+ if (family === 'parallel' && Reflect.ownKeys(options.layout).some(k => k !== 'coordinates'))
435
+ return invalid('options.layout', 'Parallel coordinates support coordinates only.');
436
+ if ('coordinates' in options.layout && family !== 'parallel')
437
+ return invalid('options.layout.coordinates');
438
+ if ((family === 'windrose' || family === 'radialbar') && Reflect.ownKeys(options.layout).some(key => !['gapRatio', family === 'windrose' ? 'stacking' : 'innerRadiusRatio'].includes(String(key))))
439
+ return invalid('options.layout', 'Only the typed circular band options apply.');
440
+ if ('innerRadiusRatio' in options.layout && options.layout.innerRadiusRatio !== undefined && (family !== 'radialbar' || options.layout.innerRadiusRatio < 0 || options.layout.innerRadiusRatio > .8))
441
+ return invalid('options.layout.innerRadiusRatio');
442
+ if (family === 'heatmap' && Reflect.ownKeys(options.layout).some(key => key !== 'gapRatio'))
443
+ return invalid('options.layout', 'Heatmap supports gapRatio only.');
444
+ if ('gapRatio' in options.layout && options.layout.gapRatio !== undefined && (!['violin', 'heatmap', 'windrose', 'radialbar'].includes(family) || options.layout.gapRatio < 0 || options.layout.gapRatio > (family === 'violin' ? .8 : .5)))
445
+ return invalid('options.layout.gapRatio');
446
+ if (family === 'venn' && Reflect.ownKeys(options.layout).some(key => key !== 'padding'))
447
+ return invalid('options.layout', 'Venn supports padding only; it does not stack or use axes.');
448
+ if (family === 'venn' && 'padding' in options.layout && options.layout.padding !== undefined && (options.layout.padding < 0 || options.layout.padding > 64))
449
+ return invalid('options.layout.padding', 'Use spacing from0 to64 logical points.');
450
+ const wordKeys = ['minFontSize', 'maxFontSize', 'padding', 'seed', 'maxWords', 'rotations'];
451
+ if (family === 'wordcloud' && Reflect.ownKeys(options.layout).some(key => typeof key !== 'string' || !wordKeys.includes(key)))
452
+ return invalid('options.layout', 'Wordcloud supports font sizes, padding, rotations, seed and maxWords only.');
453
+ for (const key of wordKeys)
454
+ if (Object.hasOwn(options.layout, key) && family !== 'wordcloud' && !(key === 'padding' && family === 'venn'))
455
+ return invalid('options.layout.' + key);
456
+ if (family === 'wordcloud') {
457
+ const l = options.layout;
458
+ for (const key of ['minFontSize', 'maxFontSize'])
459
+ if (l[key] !== undefined && (l[key] < 4 || l[key] > 128))
460
+ return invalid('options.layout.' + key, 'Use a measured logical font size from4 to128.');
461
+ if ((l.minFontSize ?? 12) > (l.maxFontSize ?? 48))
462
+ return invalid('options.layout.maxFontSize', 'Maximum font size must be at least the minimum.');
463
+ if (l.padding !== undefined && (l.padding < 0 || l.padding > 16))
464
+ return invalid('options.layout.padding');
465
+ if (l.maxWords !== undefined && (!Number.isInteger(l.maxWords) || l.maxWords < 1 || l.maxWords > 128))
466
+ return invalid('options.layout.maxWords');
467
+ if (l.seed !== undefined && (!Number.isInteger(l.seed) || l.seed < 0 || l.seed > 4294967295))
468
+ return invalid('options.layout.seed');
469
+ }
470
+ for (const key of ['shape', 'gap', 'background'])
471
+ if (Object.getOwnPropertyDescriptor(options.layout, key)?.value !== undefined && family !== 'pictorial')
472
+ return invalid('options.layout.' + key);
473
+ if (family === 'pictorial' && layoutStackLabels !== undefined)
474
+ return invalid('options.layout.stackLabels', 'Pictorial has no inline stack labels.');
475
+ if (family === 'pictorial' && 'gap' in options.layout && options.layout.gap !== undefined && (options.layout.gap < 0 || options.layout.gap > 64))
476
+ return invalid('options.layout.gap', 'Use logical spacing from 0 to 64.');
477
+ if ('tileShape' in options.layout && options.layout.tileShape !== undefined && family !== 'tilemap')
478
+ return invalid('options.layout.tileShape');
479
+ if (family === 'tilemap' && (layoutStacking !== undefined || layoutStackLabels !== undefined))
480
+ return invalid('options.layout', 'Tilemap does not support stacking.');
481
+ if ('levels' in options.layout && options.layout.levels !== undefined && family !== 'contour')
482
+ return invalid('options.layout.levels');
483
+ if ('segmentBudget' in options.layout && options.layout.segmentBudget !== undefined && (family !== 'contour' || !Number.isInteger(options.layout.segmentBudget) || options.layout.segmentBudget < 1 || options.layout.segmentBudget > 8192))
484
+ return invalid('options.layout.segmentBudget', 'Use an integer from1 to8192; overflow returns a diagnostic, never partial lines.');
485
+ if (family === 'contour' && Reflect.ownKeys(options.layout).some(key => key !== 'levels' && key !== 'segmentBudget'))
486
+ return invalid('options.layout', 'Contour supports levels and segmentBudget only.');
487
+ const relation = family === 'dependencywheel' || family === 'chord' || family === 'arcdiagram', ring = family === 'dependencywheel' || family === 'chord';
488
+ if (relation && (layoutStacking !== undefined || layoutStackLabels !== undefined))
489
+ return invalid('options.layout', 'Relationship charts do not support stacking.');
490
+ if ('startAngle' in options.layout && options.layout.startAngle !== undefined && (!ring && !circular || options.layout.startAngle < -360 || options.layout.startAngle > 360))
491
+ return invalid('options.layout.startAngle');
492
+ if ('nodeRadius' in options.layout && options.layout.nodeRadius !== undefined && (family !== 'arcdiagram' || options.layout.nodeRadius < 2 || options.layout.nodeRadius > 24))
493
+ return invalid('options.layout.nodeRadius');
494
+ if ('linkWidth' in options.layout && options.layout.linkWidth !== undefined && (family !== 'arcdiagram' || options.layout.linkWidth < 1 || options.layout.linkWidth > 48))
495
+ return invalid('options.layout.linkWidth');
496
+ if ((family === 'bullet' || family === 'variwide') && (layoutStacking !== undefined || layoutStackLabels !== undefined))
497
+ return invalid('options.layout', 'Comparison charts do not support stacking or stack labels.');
498
+ if ('pointPadding' in options.layout && options.layout.pointPadding !== undefined && (!['tilemap', 'bullet', 'variwide'].includes(family) || options.layout.pointPadding < 0 || options.layout.pointPadding > (family === 'tilemap' ? 32 : .9)))
499
+ return invalid('options.layout.pointPadding', 'Use a fraction from zero to0.9.');
500
+ if ('bands' in options.layout && options.layout.bands !== undefined && family !== 'bullet')
501
+ return invalid('options.layout.bands', 'Qualitative bands belong to bullet charts.');
502
+ if ((family === 'xrange' || family === 'timeline') && (layoutStacking !== undefined || layoutStackLabels !== undefined && layoutStackLabels !== false))
503
+ return invalid('options.layout', 'Temporal charts do not support stacking or stack labels.');
504
+ if ('grouping' in options.layout && options.layout.grouping !== undefined && family !== 'xrange')
505
+ return invalid('options.layout.grouping');
506
+ if ('rowPadding' in options.layout && options.layout.rowPadding !== undefined && (!['flame', 'xrange'].includes(family) || options.layout.rowPadding < 0 || options.layout.rowPadding > .9))
507
+ return invalid('options.layout.rowPadding');
508
+ if ('labelPosition' in options.layout && options.layout.labelPosition !== undefined && family !== 'timeline')
509
+ return invalid('options.layout.labelPosition');
510
+ if ('labelMaxWidth' in options.layout && options.layout.labelMaxWidth !== undefined && (family !== 'timeline' || options.layout.labelMaxWidth < 24 || options.layout.labelMaxWidth > 240))
511
+ return invalid('options.layout.labelMaxWidth');
512
+ const shape = family === 'funnel' || family === 'pyramid', glyph = family === 'variablepie' || family === 'item' || family === 'boxplot' || family === 'errorbar' || family === 'lollipop' || family === 'dumbbell';
513
+ if ('orientation' in options.layout && options.layout.orientation !== undefined && !['dendrogram', 'sankey', 'bullet', 'treegraph', 'organization'].includes(family))
514
+ return invalid('options.layout.orientation');
515
+ if ('nodeWidth' in options.layout && options.layout.nodeWidth !== undefined && (!['sankey', 'dependencywheel', 'chord'].includes(family) || options.layout.nodeWidth < 2 || options.layout.nodeWidth > 64))
516
+ return invalid('options.layout.nodeWidth');
517
+ if ('nodePadding' in options.layout && options.layout.nodePadding !== undefined && (!['sankey', 'dependencywheel', 'chord'].includes(family) || options.layout.nodePadding < 0 || options.layout.nodePadding > (ring ? 20 : 64)))
518
+ return invalid('options.layout.nodePadding');
519
+ if ('splitSeries' in options.layout && options.layout.splitSeries !== undefined && family !== 'packedbubble')
520
+ return invalid('options.layout.splitSeries');
521
+ if (layoutColumns !== undefined && (family !== 'item' || !Number.isInteger(layoutColumns) || layoutColumns < 1 || layoutColumns > 32))
522
+ return invalid('options.layout.columns');
523
+ if (layoutMinRadiusRatio !== undefined && (family !== 'variablepie' || layoutMinRadiusRatio < 0 || layoutMinRadiusRatio > 1))
524
+ return invalid('options.layout.minRadiusRatio');
525
+ if (layoutRadiusScale !== undefined && family !== 'variablepie')
526
+ return invalid('options.layout.radiusScale');
527
+ if (layoutMarkerRadius !== undefined && (!['timeline', 'lollipop', 'dumbbell'].includes(family) || layoutMarkerRadius < (family === 'timeline' ? 0 : 1) || layoutMarkerRadius > 16))
528
+ return invalid('options.layout.markerRadius');
529
+ if (glyph && (layoutStacking !== undefined || layoutStackLabels !== undefined))
530
+ return invalid('options.layout', 'Statistical glyphs have a fixed layout.');
531
+ if (layoutWhiskerWidth !== undefined && (family !== 'boxplot' || layoutWhiskerWidth < 0 || layoutWhiskerWidth > 1))
532
+ return invalid('options.layout.whiskerWidth');
533
+ if (layoutCapWidth !== undefined && (family !== 'errorbar' || layoutCapWidth < 0 || layoutCapWidth > 1))
534
+ return invalid('options.layout.capWidth');
535
+ if (shape && (layoutStacking !== undefined || layoutStackLabels !== undefined))
536
+ return invalid('options.layout', 'Funnel and pyramid do not support stacking.');
537
+ if (!shape && (layoutNeckWidth !== undefined || layoutNeckHeight !== undefined || layoutReversed !== undefined && family !== 'arcdiagram'))
538
+ return invalid('options.layout', 'Shape layout options require funnel or pyramid.');
539
+ if (family === 'pyramid' && (layoutNeckWidth !== undefined || layoutNeckHeight !== undefined))
540
+ return invalid('options.layout', 'A pyramid has no neck.');
541
+ for (const key of ['neckWidth', 'neckHeight']) {
542
+ const value = key === 'neckWidth' ? layoutNeckWidth : layoutNeckHeight;
543
+ if (value !== undefined && (value < 0 || value > 1))
544
+ return invalid('options.layout.' + key, 'Use a fraction from zero to one.');
545
+ }
546
+ }
547
+ if (layoutStackLabels && !layoutStacking)
548
+ return invalid('options.layout.stackLabels', 'Stack labels require sum or percent stacking.');
549
+ if (options.legend && (family === 'flame' || family === 'dendrogram' || family === 'gauge' || family === 'treemap'))
550
+ return invalid('options.legend', 'This chart has no visibility legend.');
551
+ if (family === 'parallel' && options.format)
552
+ return invalid('options.format', 'Each dimension declares its own unit in data.axes.');
553
+ if (options.format && ['gauge', 'vector', 'windbarb'].includes(family))
554
+ return invalid('options.format', 'This type uses its source unit; wind speeds are always m/s.');
555
+ if (family === 'gauge' && options.appearance?.series?.some(series => series.id !== 'reading'))
556
+ return invalid('options.appearance.series', 'Gauge appearance configures the reading ID. Semantic band colors belong to data.bands.');
557
+ if (options.tooltip?.content === 'shared' && !['fan', 'parallel', 'bullet', 'streamgraph', 'lollipop', 'dumbbell', 'columnpyramid', 'boxplot', 'errorbar', 'arearange', 'areasplinerange', 'columnrange', 'pareto', 'line', 'area', 'streamgraph', 'areaspline', 'spline', 'mixed', 'column'].includes(family))
558
+ return invalid('options.tooltip.content', 'Shared detail requires line or column/bar data.');
559
+ if (options.tooltip?.crosshair !== undefined && !['fan', 'regression', 'bullet', 'variwide', 'xrange', 'timeline', 'vector', 'windbarb', 'polygon', 'streamgraph', 'lollipop', 'dumbbell', 'columnpyramid', 'boxplot', 'errorbar', 'arearange', 'areasplinerange', 'columnrange', 'histogram', 'bellcurve', 'pareto', 'waterfall', 'line', 'area', 'streamgraph', 'areaspline', 'spline', 'mixed', 'scatter', 'column', 'bubble'].includes(family))
560
+ return invalid('options.tooltip.crosshair');
561
+ if (options.appearance?.markers !== undefined && !['fan', 'regression', 'pareto', 'radar', 'line', 'area', 'areaspline', 'spline', 'mixed'].includes(family) || options.appearance?.lineWidth !== undefined && !['fan', 'regression', 'violin', 'dendrogram', 'parallel', 'contour', 'pareto', 'radar', 'line', 'area', 'areaspline', 'spline', 'mixed'].includes(family))
562
+ return invalid('options.appearance', 'Markers and line width apply only to lines.');
563
+ if (options.appearance?.dataLabels !== undefined && family === 'gauge')
564
+ return invalid('options.appearance.dataLabels');
565
+ if (family === 'contour') {
566
+ const levels = options.layout && 'levels' in options.layout ? options.layout.levels : undefined;
567
+ const ids = new Set(levels?.map(level => level.id) ?? []);
568
+ if (options.appearance?.series?.some(series => !ids.has(series.id)))
569
+ return invalid('options.appearance.series', 'Use an ID declared in layout.levels.');
570
+ if (options.viewport?.initial && 'x' in options.viewport.initial && options.viewport.initial.x !== undefined && !Array.isArray(options.viewport.initial.x))
571
+ return invalid('options.viewport.initial.x', 'Contour requires numeric X bounds.');
572
+ }
573
+ const points = options.appearance?.points;
574
+ if (points !== undefined) {
575
+ if (family === 'pareto')
576
+ return invalid('options.appearance.points', 'Use series colours for the generated Pareto layers.');
577
+ if (!['waterfall', 'line', 'area', 'areaspline', 'spline', 'mixed', 'scatter', 'column', 'bubble'].includes(family))
578
+ return invalid('options.appearance.points', 'Point colors require a cartesian chart. Use appearance.series for slices or a gauge reading.');
579
+ const identities = dataIdentities(data);
580
+ for (let index = 0; index < points.length; index++) {
581
+ const point = points[index];
582
+ if (!identities?.series.get(point.seriesId)?.has(point.pointId))
583
+ return invalid('options.appearance.points.' + index, 'Unknown seriesId/pointId.');
584
+ }
585
+ }
586
+ if (['histogram', 'bellcurve', 'pareto', 'radar', 'polar', 'windrose'].includes(family) && (options.axes?.x?.referenceLines !== undefined || options.axes?.y?.referenceLines !== undefined))
587
+ return invalid('options.axes', 'Radial reference lines are not supported.');
588
+ for (const axis of ['x', 'y'])
589
+ if (options.axes?.[axis]?.referenceLines !== undefined && (!isChartFamily(family) || !supportsReferenceAxis(family, axis)))
590
+ return invalid('options.axes.' + axis + '.referenceLines', 'This chart does not support reference lines on this axis.');
591
+ const references = ['x', 'y'].flatMap(axis => (options.axes?.[axis]?.referenceLines ?? []).map((reference, index) => ({ axis, reference, index })));
592
+ if ((family === 'column' || family === 'waterfall') && options.axes?.x?.referenceLines !== undefined)
593
+ return invalid('options.axes.x.referenceLines', 'Column and bar references use the semantic Y value axis.');
594
+ if (references.length > 16 || new Set(references.map(item => item.reference.id)).size !== references.length)
595
+ return invalid('options.axes', 'Use at most 16 reference lines with unique IDs across both axes.');
596
+ for (const { axis, reference, index } of references) {
597
+ const path = 'options.axes.' + axis + '.referenceLines.' + index + '.value', identities = dataIdentities(data);
598
+ if ((family === 'column' || family === 'waterfall') && axis === 'x')
599
+ return invalid(path, 'Column and bar references use the semantic Y value axis.');
600
+ if (axis === 'x' && ['bullet', 'variwide', 'streamgraph', 'lollipop', 'dumbbell', 'columnpyramid', 'boxplot', 'errorbar', 'arearange', 'areasplinerange', 'columnrange', 'line', 'area', 'streamgraph', 'areaspline', 'spline', 'mixed'].includes(family) && identities?.xKind === 'category') {
601
+ if (typeof reference.value !== 'string' || !identities.categories.has(reference.value))
602
+ return invalid(path, 'Use an existing category ID.');
603
+ }
604
+ else if (typeof reference.value !== 'number' || !Number.isFinite(reference.value))
605
+ return invalid(path, 'This axis requires a finite numeric reference value.');
606
+ }
607
+ const minimum = options.appearance?.minPlotWidth;
608
+ if (minimum !== undefined && (!isChartFamily(family) || chartCapabilities[family].axes !== 'cartesian' && family !== 'arcdiagram' && family !== 'parallel' || minimum < 0 || minimum > 1600))
609
+ return invalid('options.appearance.minPlotWidth', 'Use 0–1600 logical pixels with a supported horizontally scrollable plot.');
610
+ return null;
611
+ }
612
+ //# sourceMappingURL=options-validation.js.map