@ahoo-wang/wow-view-engine 9.2.0-rc.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 (1421) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +1182 -0
  3. package/README.zh-CN.md +1171 -0
  4. package/THIRD_PARTY_NOTICES.md +196 -0
  5. package/dist/actions-DK1yfiI8.js +9986 -0
  6. package/dist/actions-DK1yfiI8.js.map +1 -0
  7. package/dist/analysis/boxplot.d.ts +80 -0
  8. package/dist/analysis/boxplot.d.ts.map +1 -0
  9. package/dist/analysis/bucketChange.d.ts +25 -0
  10. package/dist/analysis/bucketChange.d.ts.map +1 -0
  11. package/dist/analysis/budget.d.ts +37 -0
  12. package/dist/analysis/budget.d.ts.map +1 -0
  13. package/dist/analysis/candidates.d.ts +96 -0
  14. package/dist/analysis/candidates.d.ts.map +1 -0
  15. package/dist/analysis/candlestick.d.ts +73 -0
  16. package/dist/analysis/candlestick.d.ts.map +1 -0
  17. package/dist/analysis/capability.d.ts +129 -0
  18. package/dist/analysis/capability.d.ts.map +1 -0
  19. package/dist/analysis/cartesian.d.ts +102 -0
  20. package/dist/analysis/cartesian.d.ts.map +1 -0
  21. package/dist/analysis/chart.d.ts +108 -0
  22. package/dist/analysis/chart.d.ts.map +1 -0
  23. package/dist/analysis/chartFamilies.d.ts +175 -0
  24. package/dist/analysis/chartFamilies.d.ts.map +1 -0
  25. package/dist/analysis/chartOptions.d.ts +113 -0
  26. package/dist/analysis/chartOptions.d.ts.map +1 -0
  27. package/dist/analysis/chartRefs.d.ts +31 -0
  28. package/dist/analysis/chartRefs.d.ts.map +1 -0
  29. package/dist/analysis/chartRows.d.ts +39 -0
  30. package/dist/analysis/chartRows.d.ts.map +1 -0
  31. package/dist/analysis/chartSlots.d.ts +73 -0
  32. package/dist/analysis/chartSlots.d.ts.map +1 -0
  33. package/dist/analysis/chartSwitch.d.ts +34 -0
  34. package/dist/analysis/chartSwitch.d.ts.map +1 -0
  35. package/dist/analysis/compile.d.ts +55 -0
  36. package/dist/analysis/compile.d.ts.map +1 -0
  37. package/dist/analysis/currency.d.ts +68 -0
  38. package/dist/analysis/currency.d.ts.map +1 -0
  39. package/dist/analysis/dangling.d.ts +52 -0
  40. package/dist/analysis/dangling.d.ts.map +1 -0
  41. package/dist/analysis/defaults.d.ts +168 -0
  42. package/dist/analysis/defaults.d.ts.map +1 -0
  43. package/dist/analysis/derived.d.ts +81 -0
  44. package/dist/analysis/derived.d.ts.map +1 -0
  45. package/dist/analysis/drill.d.ts +142 -0
  46. package/dist/analysis/drill.d.ts.map +1 -0
  47. package/dist/analysis/drillFilter.d.ts +34 -0
  48. package/dist/analysis/drillFilter.d.ts.map +1 -0
  49. package/dist/analysis/expand.d.ts +51 -0
  50. package/dist/analysis/expand.d.ts.map +1 -0
  51. package/dist/analysis/expressions.d.ts +12 -0
  52. package/dist/analysis/expressions.d.ts.map +1 -0
  53. package/dist/analysis/fitCharts.d.ts +93 -0
  54. package/dist/analysis/fitCharts.d.ts.map +1 -0
  55. package/dist/analysis/formula.d.ts +65 -0
  56. package/dist/analysis/formula.d.ts.map +1 -0
  57. package/dist/analysis/funnel.d.ts +48 -0
  58. package/dist/analysis/funnel.d.ts.map +1 -0
  59. package/dist/analysis/gauge.d.ts +34 -0
  60. package/dist/analysis/gauge.d.ts.map +1 -0
  61. package/dist/analysis/granularity.d.ts +22 -0
  62. package/dist/analysis/granularity.d.ts.map +1 -0
  63. package/dist/analysis/having.d.ts +38 -0
  64. package/dist/analysis/having.d.ts.map +1 -0
  65. package/dist/analysis/hierarchy.d.ts +73 -0
  66. package/dist/analysis/hierarchy.d.ts.map +1 -0
  67. package/dist/analysis/index.d.ts +29 -0
  68. package/dist/analysis/index.d.ts.map +1 -0
  69. package/dist/analysis/logScale.d.ts +20 -0
  70. package/dist/analysis/logScale.d.ts.map +1 -0
  71. package/dist/analysis/map.d.ts +28 -0
  72. package/dist/analysis/map.d.ts.map +1 -0
  73. package/dist/analysis/metricCard.d.ts +155 -0
  74. package/dist/analysis/metricCard.d.ts.map +1 -0
  75. package/dist/analysis/metricCondition.d.ts +41 -0
  76. package/dist/analysis/metricCondition.d.ts.map +1 -0
  77. package/dist/analysis/metricFormat.d.ts +136 -0
  78. package/dist/analysis/metricFormat.d.ts.map +1 -0
  79. package/dist/analysis/metricOrder.d.ts +47 -0
  80. package/dist/analysis/metricOrder.d.ts.map +1 -0
  81. package/dist/analysis/metricWindow.d.ts +28 -0
  82. package/dist/analysis/metricWindow.d.ts.map +1 -0
  83. package/dist/analysis/profiles.d.ts +53 -0
  84. package/dist/analysis/profiles.d.ts.map +1 -0
  85. package/dist/analysis/project.d.ts +242 -0
  86. package/dist/analysis/project.d.ts.map +1 -0
  87. package/dist/analysis/queryFilter.d.ts +32 -0
  88. package/dist/analysis/queryFilter.d.ts.map +1 -0
  89. package/dist/analysis/references.d.ts +41 -0
  90. package/dist/analysis/references.d.ts.map +1 -0
  91. package/dist/analysis/splitOther.d.ts +80 -0
  92. package/dist/analysis/splitOther.d.ts.map +1 -0
  93. package/dist/analysis/timeAxis.d.ts +173 -0
  94. package/dist/analysis/timeAxis.d.ts.map +1 -0
  95. package/dist/analysis/timeCharts.d.ts +76 -0
  96. package/dist/analysis/timeCharts.d.ts.map +1 -0
  97. package/dist/analysis/treemap.d.ts +36 -0
  98. package/dist/analysis/treemap.d.ts.map +1 -0
  99. package/dist/analysis/validate.d.ts +19 -0
  100. package/dist/analysis/validate.d.ts.map +1 -0
  101. package/dist/analysis/validateAliases.d.ts +16 -0
  102. package/dist/analysis/validateAliases.d.ts.map +1 -0
  103. package/dist/analysis/validateChart.d.ts +60 -0
  104. package/dist/analysis/validateChart.d.ts.map +1 -0
  105. package/dist/analysis/validateElements.d.ts +20 -0
  106. package/dist/analysis/validateElements.d.ts.map +1 -0
  107. package/dist/analysis/validateGroups.d.ts +5 -0
  108. package/dist/analysis/validateGroups.d.ts.map +1 -0
  109. package/dist/analysis/validateHaving.d.ts +9 -0
  110. package/dist/analysis/validateHaving.d.ts.map +1 -0
  111. package/dist/analysis/validateLevels.d.ts +33 -0
  112. package/dist/analysis/validateLevels.d.ts.map +1 -0
  113. package/dist/analysis/validateLimits.d.ts +3 -0
  114. package/dist/analysis/validateLimits.d.ts.map +1 -0
  115. package/dist/analysis/validateMetrics.d.ts +5 -0
  116. package/dist/analysis/validateMetrics.d.ts.map +1 -0
  117. package/dist/analysis/validateOffers.d.ts +12 -0
  118. package/dist/analysis/validateOffers.d.ts.map +1 -0
  119. package/dist/analysis/validateReferences.d.ts +16 -0
  120. package/dist/analysis/validateReferences.d.ts.map +1 -0
  121. package/dist/analysis/validateShape.d.ts +14 -0
  122. package/dist/analysis/validateShape.d.ts.map +1 -0
  123. package/dist/analysis/validateSort.d.ts +3 -0
  124. package/dist/analysis/validateSort.d.ts.map +1 -0
  125. package/dist/analysis/waterfall.d.ts +33 -0
  126. package/dist/analysis/waterfall.d.ts.map +1 -0
  127. package/dist/capabilities/aliases.d.ts +36 -0
  128. package/dist/capabilities/aliases.d.ts.map +1 -0
  129. package/dist/capabilities/analysis.d.ts +19 -0
  130. package/dist/capabilities/analysis.d.ts.map +1 -0
  131. package/dist/capabilities/cache.d.ts +69 -0
  132. package/dist/capabilities/cache.d.ts.map +1 -0
  133. package/dist/capabilities/fields.d.ts +50 -0
  134. package/dist/capabilities/fields.d.ts.map +1 -0
  135. package/dist/capabilities/index.d.ts +13 -0
  136. package/dist/capabilities/index.d.ts.map +1 -0
  137. package/dist/capabilities/limits.d.ts +24 -0
  138. package/dist/capabilities/limits.d.ts.map +1 -0
  139. package/dist/capabilities/match.d.ts +52 -0
  140. package/dist/capabilities/match.d.ts.map +1 -0
  141. package/dist/capabilities/narrow.d.ts +27 -0
  142. package/dist/capabilities/narrow.d.ts.map +1 -0
  143. package/dist/capabilities/open.d.ts +25 -0
  144. package/dist/capabilities/open.d.ts.map +1 -0
  145. package/dist/capabilities/record.d.ts +13 -0
  146. package/dist/capabilities/record.d.ts.map +1 -0
  147. package/dist/capabilities/violations.d.ts +19 -0
  148. package/dist/capabilities/violations.d.ts.map +1 -0
  149. package/dist/cartesianBrush-HLU12ig5.js +122 -0
  150. package/dist/cartesianBrush-HLU12ig5.js.map +1 -0
  151. package/dist/clickDraft-DQDQn4x-.js +184 -0
  152. package/dist/clickDraft-DQDQn4x-.js.map +1 -0
  153. package/dist/dashboard/boardFields.d.ts +11 -0
  154. package/dist/dashboard/boardFields.d.ts.map +1 -0
  155. package/dist/dashboard/click.d.ts +105 -0
  156. package/dist/dashboard/click.d.ts.map +1 -0
  157. package/dist/dashboard/clickDraft.d.ts +84 -0
  158. package/dist/dashboard/clickDraft.d.ts.map +1 -0
  159. package/dist/dashboard/declared.d.ts +29 -0
  160. package/dist/dashboard/declared.d.ts.map +1 -0
  161. package/dist/dashboard/defaults.d.ts +14 -0
  162. package/dist/dashboard/defaults.d.ts.map +1 -0
  163. package/dist/dashboard/edit.d.ts +118 -0
  164. package/dist/dashboard/edit.d.ts.map +1 -0
  165. package/dist/dashboard/filterEdit.d.ts +60 -0
  166. package/dist/dashboard/filterEdit.d.ts.map +1 -0
  167. package/dist/dashboard/filters.d.ts +104 -0
  168. package/dist/dashboard/filters.d.ts.map +1 -0
  169. package/dist/dashboard/index.d.ts +26 -0
  170. package/dist/dashboard/index.d.ts.map +1 -0
  171. package/dist/dashboard/layout.d.ts +184 -0
  172. package/dist/dashboard/layout.d.ts.map +1 -0
  173. package/dist/dashboard/merge.d.ts +32 -0
  174. package/dist/dashboard/merge.d.ts.map +1 -0
  175. package/dist/dashboard/migrate.d.ts +33 -0
  176. package/dist/dashboard/migrate.d.ts.map +1 -0
  177. package/dist/dashboard/panelFieldNames.d.ts +20 -0
  178. package/dist/dashboard/panelFieldNames.d.ts.map +1 -0
  179. package/dist/dashboard/panelLook.d.ts +18 -0
  180. package/dist/dashboard/panelLook.d.ts.map +1 -0
  181. package/dist/dashboard/panels.d.ts +78 -0
  182. package/dist/dashboard/panels.d.ts.map +1 -0
  183. package/dist/dashboard/placeholders.d.ts +3 -0
  184. package/dist/dashboard/placeholders.d.ts.map +1 -0
  185. package/dist/dashboard/tabs.d.ts +28 -0
  186. package/dist/dashboard/tabs.d.ts.map +1 -0
  187. package/dist/dashboard/timeBindings.d.ts +42 -0
  188. package/dist/dashboard/timeBindings.d.ts.map +1 -0
  189. package/dist/dashboard/validate.d.ts +80 -0
  190. package/dist/dashboard/validate.d.ts.map +1 -0
  191. package/dist/dashboard/validateFilters.d.ts +15 -0
  192. package/dist/dashboard/validateFilters.d.ts.map +1 -0
  193. package/dist/dashboard/wiring.d.ts +103 -0
  194. package/dist/dashboard/wiring.d.ts.map +1 -0
  195. package/dist/echarts-HUGzxow7.js +35 -0
  196. package/dist/echarts-HUGzxow7.js.map +1 -0
  197. package/dist/echartsGeo-BWbXo9ef.js +14 -0
  198. package/dist/echartsGeo-BWbXo9ef.js.map +1 -0
  199. package/dist/echartsHierarchy-Cm-9-LN9.js +14 -0
  200. package/dist/echartsHierarchy-Cm-9-LN9.js.map +1 -0
  201. package/dist/echartsStatistics-Lq-BjHez.js +20 -0
  202. package/dist/echartsStatistics-Lq-BjHez.js.map +1 -0
  203. package/dist/echartsTime-gMH0oF0x.js +15 -0
  204. package/dist/echartsTime-gMH0oF0x.js.map +1 -0
  205. package/dist/filter/compile.d.ts +23 -0
  206. package/dist/filter/compile.d.ts.map +1 -0
  207. package/dist/filter/configBase.d.ts +23 -0
  208. package/dist/filter/configBase.d.ts.map +1 -0
  209. package/dist/filter/describe.d.ts +234 -0
  210. package/dist/filter/describe.d.ts.map +1 -0
  211. package/dist/filter/fieldGroups.d.ts +17 -0
  212. package/dist/filter/fieldGroups.d.ts.map +1 -0
  213. package/dist/filter/fieldKind.d.ts +244 -0
  214. package/dist/filter/fieldKind.d.ts.map +1 -0
  215. package/dist/filter/index.d.ts +21 -0
  216. package/dist/filter/index.d.ts.map +1 -0
  217. package/dist/filter/issuePath.d.ts +21 -0
  218. package/dist/filter/issuePath.d.ts.map +1 -0
  219. package/dist/filter/kinds/array.d.ts +18 -0
  220. package/dist/filter/kinds/array.d.ts.map +1 -0
  221. package/dist/filter/kinds/boolean.d.ts +3 -0
  222. package/dist/filter/kinds/boolean.d.ts.map +1 -0
  223. package/dist/filter/kinds/dateTime.d.ts +39 -0
  224. package/dist/filter/kinds/dateTime.d.ts.map +1 -0
  225. package/dist/filter/kinds/deletion.d.ts +42 -0
  226. package/dist/filter/kinds/deletion.d.ts.map +1 -0
  227. package/dist/filter/kinds/duration.d.ts +27 -0
  228. package/dist/filter/kinds/duration.d.ts.map +1 -0
  229. package/dist/filter/kinds/elementMatch.d.ts +34 -0
  230. package/dist/filter/kinds/elementMatch.d.ts.map +1 -0
  231. package/dist/filter/kinds/entries.d.ts +20 -0
  232. package/dist/filter/kinds/entries.d.ts.map +1 -0
  233. package/dist/filter/kinds/enum.d.ts +7 -0
  234. package/dist/filter/kinds/enum.d.ts.map +1 -0
  235. package/dist/filter/kinds/index.d.ts +18 -0
  236. package/dist/filter/kinds/index.d.ts.map +1 -0
  237. package/dist/filter/kinds/metadata.d.ts +3 -0
  238. package/dist/filter/kinds/metadata.d.ts.map +1 -0
  239. package/dist/filter/kinds/number.d.ts +3 -0
  240. package/dist/filter/kinds/number.d.ts.map +1 -0
  241. package/dist/filter/kinds/options.d.ts +44 -0
  242. package/dist/filter/kinds/options.d.ts.map +1 -0
  243. package/dist/filter/kinds/presence.d.ts +18 -0
  244. package/dist/filter/kinds/presence.d.ts.map +1 -0
  245. package/dist/filter/kinds/reference.d.ts +8 -0
  246. package/dist/filter/kinds/reference.d.ts.map +1 -0
  247. package/dist/filter/kinds/search.d.ts +15 -0
  248. package/dist/filter/kinds/search.d.ts.map +1 -0
  249. package/dist/filter/kinds/string.d.ts +3 -0
  250. package/dist/filter/kinds/string.d.ts.map +1 -0
  251. package/dist/filter/marks.d.ts +28 -0
  252. package/dist/filter/marks.d.ts.map +1 -0
  253. package/dist/filter/search.d.ts +28 -0
  254. package/dist/filter/search.d.ts.map +1 -0
  255. package/dist/filter/time.d.ts +57 -0
  256. package/dist/filter/time.d.ts.map +1 -0
  257. package/dist/filter/tree.d.ts +186 -0
  258. package/dist/filter/tree.d.ts.map +1 -0
  259. package/dist/filter/validate.d.ts +42 -0
  260. package/dist/filter/validate.d.ts.map +1 -0
  261. package/dist/filter/values.d.ts +111 -0
  262. package/dist/filter/values.d.ts.map +1 -0
  263. package/dist/index.d.ts +138 -0
  264. package/dist/index.d.ts.map +1 -0
  265. package/dist/index.js +478 -0
  266. package/dist/index.js.map +1 -0
  267. package/dist/model/analysis.d.ts +327 -0
  268. package/dist/model/analysis.d.ts.map +1 -0
  269. package/dist/model/chart.d.ts +503 -0
  270. package/dist/model/chart.d.ts.map +1 -0
  271. package/dist/model/config.d.ts +68 -0
  272. package/dist/model/config.d.ts.map +1 -0
  273. package/dist/model/currency.d.ts +55 -0
  274. package/dist/model/currency.d.ts.map +1 -0
  275. package/dist/model/dashboard.d.ts +454 -0
  276. package/dist/model/dashboard.d.ts.map +1 -0
  277. package/dist/model/definition.d.ts +373 -0
  278. package/dist/model/definition.d.ts.map +1 -0
  279. package/dist/model/field.d.ts +432 -0
  280. package/dist/model/field.d.ts.map +1 -0
  281. package/dist/model/filter.d.ts +54 -0
  282. package/dist/model/filter.d.ts.map +1 -0
  283. package/dist/model/index.d.ts +21 -0
  284. package/dist/model/index.d.ts.map +1 -0
  285. package/dist/model/instance.d.ts +118 -0
  286. package/dist/model/instance.d.ts.map +1 -0
  287. package/dist/model/issue.d.ts +33 -0
  288. package/dist/model/issue.d.ts.map +1 -0
  289. package/dist/model/json.d.ts +34 -0
  290. package/dist/model/json.d.ts.map +1 -0
  291. package/dist/model/limits.d.ts +133 -0
  292. package/dist/model/limits.d.ts.map +1 -0
  293. package/dist/model/record.d.ts +114 -0
  294. package/dist/model/record.d.ts.map +1 -0
  295. package/dist/model/storeError.d.ts +105 -0
  296. package/dist/model/storeError.d.ts.map +1 -0
  297. package/dist/model/text.d.ts +58 -0
  298. package/dist/model/text.d.ts.map +1 -0
  299. package/dist/react/actionRunner.d.ts +161 -0
  300. package/dist/react/actionRunner.d.ts.map +1 -0
  301. package/dist/react/actions.d.ts +112 -0
  302. package/dist/react/actions.d.ts.map +1 -0
  303. package/dist/react/analysisEditing.d.ts +122 -0
  304. package/dist/react/analysisEditing.d.ts.map +1 -0
  305. package/dist/react/analysisFields.d.ts +38 -0
  306. package/dist/react/analysisFields.d.ts.map +1 -0
  307. package/dist/react/environment.d.ts +10 -0
  308. package/dist/react/environment.d.ts.map +1 -0
  309. package/dist/react/index.d.ts +41 -0
  310. package/dist/react/index.d.ts.map +1 -0
  311. package/dist/react/issues.d.ts +14 -0
  312. package/dist/react/issues.d.ts.map +1 -0
  313. package/dist/react/manager/abilities.d.ts +38 -0
  314. package/dist/react/manager/abilities.d.ts.map +1 -0
  315. package/dist/react/manager/order.d.ts +60 -0
  316. package/dist/react/manager/order.d.ts.map +1 -0
  317. package/dist/react/manager/outcomes.d.ts +55 -0
  318. package/dist/react/manager/outcomes.d.ts.map +1 -0
  319. package/dist/react/manager/queue.d.ts +56 -0
  320. package/dist/react/manager/queue.d.ts.map +1 -0
  321. package/dist/react/manager/useCommandRunner.d.ts +74 -0
  322. package/dist/react/manager/useCommandRunner.d.ts.map +1 -0
  323. package/dist/react/recordColumns.d.ts +68 -0
  324. package/dist/react/recordColumns.d.ts.map +1 -0
  325. package/dist/react/recordDraft.d.ts +31 -0
  326. package/dist/react/recordDraft.d.ts.map +1 -0
  327. package/dist/react/recordEdits.d.ts +58 -0
  328. package/dist/react/recordEdits.d.ts.map +1 -0
  329. package/dist/react/recordSelection.d.ts +46 -0
  330. package/dist/react/recordSelection.d.ts.map +1 -0
  331. package/dist/react/useAnalysisEditor.d.ts +183 -0
  332. package/dist/react/useAnalysisEditor.d.ts.map +1 -0
  333. package/dist/react/useAnalysisResult.d.ts +168 -0
  334. package/dist/react/useAnalysisResult.d.ts.map +1 -0
  335. package/dist/react/useAutoRefresh.d.ts +115 -0
  336. package/dist/react/useAutoRefresh.d.ts.map +1 -0
  337. package/dist/react/useDashboard.d.ts +204 -0
  338. package/dist/react/useDashboard.d.ts.map +1 -0
  339. package/dist/react/useFilterEditor.d.ts +255 -0
  340. package/dist/react/useFilterEditor.d.ts.map +1 -0
  341. package/dist/react/usePanelFollowUps.d.ts +31 -0
  342. package/dist/react/usePanelFollowUps.d.ts.map +1 -0
  343. package/dist/react/useRecordActions.d.ts +126 -0
  344. package/dist/react/useRecordActions.d.ts.map +1 -0
  345. package/dist/react/useRecordDetail.d.ts +76 -0
  346. package/dist/react/useRecordDetail.d.ts.map +1 -0
  347. package/dist/react/useRecordExport.d.ts +104 -0
  348. package/dist/react/useRecordExport.d.ts.map +1 -0
  349. package/dist/react/useRecordTable.d.ts +309 -0
  350. package/dist/react/useRecordTable.d.ts.map +1 -0
  351. package/dist/react/useReshape.d.ts +54 -0
  352. package/dist/react/useReshape.d.ts.map +1 -0
  353. package/dist/react/useSaveCommands.d.ts +119 -0
  354. package/dist/react/useSaveCommands.d.ts.map +1 -0
  355. package/dist/react/useSearchBox.d.ts +34 -0
  356. package/dist/react/useSearchBox.d.ts.map +1 -0
  357. package/dist/react/useUnavailable.d.ts +19 -0
  358. package/dist/react/useUnavailable.d.ts.map +1 -0
  359. package/dist/react/useValueCandidates.d.ts +41 -0
  360. package/dist/react/useValueCandidates.d.ts.map +1 -0
  361. package/dist/react/useViewEngine.d.ts +93 -0
  362. package/dist/react/useViewEngine.d.ts.map +1 -0
  363. package/dist/react/useViewList.d.ts +75 -0
  364. package/dist/react/useViewList.d.ts.map +1 -0
  365. package/dist/react/useViewManager.d.ts +92 -0
  366. package/dist/react/useViewManager.d.ts.map +1 -0
  367. package/dist/react/useWorkbench.d.ts +334 -0
  368. package/dist/react/useWorkbench.d.ts.map +1 -0
  369. package/dist/react/workbench/handOver.d.ts +73 -0
  370. package/dist/react/workbench/handOver.d.ts.map +1 -0
  371. package/dist/react/workbench/instanceSync.d.ts +55 -0
  372. package/dist/react/workbench/instanceSync.d.ts.map +1 -0
  373. package/dist/react/workbench/leaveGuard.d.ts +65 -0
  374. package/dist/react/workbench/leaveGuard.d.ts.map +1 -0
  375. package/dist/react/workbench/newView.d.ts +35 -0
  376. package/dist/react/workbench/newView.d.ts.map +1 -0
  377. package/dist/react/workbench/releaseDeleted.d.ts +19 -0
  378. package/dist/react/workbench/releaseDeleted.d.ts.map +1 -0
  379. package/dist/react/writes.d.ts +134 -0
  380. package/dist/react/writes.d.ts.map +1 -0
  381. package/dist/react-DzstAsWB.js +3648 -0
  382. package/dist/react-DzstAsWB.js.map +1 -0
  383. package/dist/react-router/index.d.ts +12 -0
  384. package/dist/react-router/index.d.ts.map +1 -0
  385. package/dist/react-router.js +27 -0
  386. package/dist/react-router.js.map +1 -0
  387. package/dist/react.js +3 -0
  388. package/dist/record/compile.d.ts +56 -0
  389. package/dist/record/compile.d.ts.map +1 -0
  390. package/dist/record/defaults.d.ts +9 -0
  391. package/dist/record/defaults.d.ts.map +1 -0
  392. package/dist/record/detail.d.ts +27 -0
  393. package/dist/record/detail.d.ts.map +1 -0
  394. package/dist/record/export.d.ts +78 -0
  395. package/dist/record/export.d.ts.map +1 -0
  396. package/dist/record/index.d.ts +12 -0
  397. package/dist/record/index.d.ts.map +1 -0
  398. package/dist/record/paging.d.ts +89 -0
  399. package/dist/record/paging.d.ts.map +1 -0
  400. package/dist/record/path.d.ts +13 -0
  401. package/dist/record/path.d.ts.map +1 -0
  402. package/dist/record/project.d.ts +245 -0
  403. package/dist/record/project.d.ts.map +1 -0
  404. package/dist/record/summaryCurrency.d.ts +18 -0
  405. package/dist/record/summaryCurrency.d.ts.map +1 -0
  406. package/dist/record/validate.d.ts +30 -0
  407. package/dist/record/validate.d.ts.map +1 -0
  408. package/dist/routes-DvPNPlQP.js +23 -0
  409. package/dist/routes-DvPNPlQP.js.map +1 -0
  410. package/dist/runtime/abort.d.ts +3 -0
  411. package/dist/runtime/abort.d.ts.map +1 -0
  412. package/dist/runtime/actions.d.ts +241 -0
  413. package/dist/runtime/actions.d.ts.map +1 -0
  414. package/dist/runtime/admission.d.ts +35 -0
  415. package/dist/runtime/admission.d.ts.map +1 -0
  416. package/dist/runtime/autoApply.d.ts +51 -0
  417. package/dist/runtime/autoApply.d.ts.map +1 -0
  418. package/dist/runtime/capabilities.d.ts +98 -0
  419. package/dist/runtime/capabilities.d.ts.map +1 -0
  420. package/dist/runtime/commandChecks.d.ts +22 -0
  421. package/dist/runtime/commandChecks.d.ts.map +1 -0
  422. package/dist/runtime/dashboard/anchor.d.ts +46 -0
  423. package/dist/runtime/dashboard/anchor.d.ts.map +1 -0
  424. package/dist/runtime/dashboard/canonical.d.ts +31 -0
  425. package/dist/runtime/dashboard/canonical.d.ts.map +1 -0
  426. package/dist/runtime/dashboard/children.d.ts +127 -0
  427. package/dist/runtime/dashboard/children.d.ts.map +1 -0
  428. package/dist/runtime/dashboard/commands.d.ts +172 -0
  429. package/dist/runtime/dashboard/commands.d.ts.map +1 -0
  430. package/dist/runtime/dashboard/contract.d.ts +250 -0
  431. package/dist/runtime/dashboard/contract.d.ts.map +1 -0
  432. package/dist/runtime/dashboard/editing.d.ts +197 -0
  433. package/dist/runtime/dashboard/editing.d.ts.map +1 -0
  434. package/dist/runtime/dashboard/filterCandidates.d.ts +38 -0
  435. package/dist/runtime/dashboard/filterCandidates.d.ts.map +1 -0
  436. package/dist/runtime/dashboard/filterValues.d.ts +117 -0
  437. package/dist/runtime/dashboard/filterValues.d.ts.map +1 -0
  438. package/dist/runtime/dashboard/grouping.d.ts +26 -0
  439. package/dist/runtime/dashboard/grouping.d.ts.map +1 -0
  440. package/dist/runtime/dashboard/history.d.ts +78 -0
  441. package/dist/runtime/dashboard/history.d.ts.map +1 -0
  442. package/dist/runtime/dashboard/opening.d.ts +17 -0
  443. package/dist/runtime/dashboard/opening.d.ts.map +1 -0
  444. package/dist/runtime/dashboard/owned.d.ts +38 -0
  445. package/dist/runtime/dashboard/owned.d.ts.map +1 -0
  446. package/dist/runtime/dashboard/panelRun.d.ts +101 -0
  447. package/dist/runtime/dashboard/panelRun.d.ts.map +1 -0
  448. package/dist/runtime/dashboard/panels.d.ts +155 -0
  449. package/dist/runtime/dashboard/panels.d.ts.map +1 -0
  450. package/dist/runtime/dashboard/presentation.d.ts +25 -0
  451. package/dist/runtime/dashboard/presentation.d.ts.map +1 -0
  452. package/dist/runtime/dashboard/press.d.ts +150 -0
  453. package/dist/runtime/dashboard/press.d.ts.map +1 -0
  454. package/dist/runtime/dashboard/references.d.ts +97 -0
  455. package/dist/runtime/dashboard/references.d.ts.map +1 -0
  456. package/dist/runtime/dashboardRuntime.d.ts +235 -0
  457. package/dist/runtime/dashboardRuntime.d.ts.map +1 -0
  458. package/dist/runtime/define/analysis.d.ts +8 -0
  459. package/dist/runtime/define/analysis.d.ts.map +1 -0
  460. package/dist/runtime/define/defineView.d.ts +42 -0
  461. package/dist/runtime/define/defineView.d.ts.map +1 -0
  462. package/dist/runtime/define/fields.d.ts +23 -0
  463. package/dist/runtime/define/fields.d.ts.map +1 -0
  464. package/dist/runtime/define/spec.d.ts +88 -0
  465. package/dist/runtime/define/spec.d.ts.map +1 -0
  466. package/dist/runtime/definitions.d.ts +35 -0
  467. package/dist/runtime/definitions.d.ts.map +1 -0
  468. package/dist/runtime/deprecated.d.ts +3 -0
  469. package/dist/runtime/deprecated.d.ts.map +1 -0
  470. package/dist/runtime/environment.d.ts +95 -0
  471. package/dist/runtime/environment.d.ts.map +1 -0
  472. package/dist/runtime/execute.d.ts +70 -0
  473. package/dist/runtime/execute.d.ts.map +1 -0
  474. package/dist/runtime/exportRows.d.ts +67 -0
  475. package/dist/runtime/exportRows.d.ts.map +1 -0
  476. package/dist/runtime/failures.d.ts +57 -0
  477. package/dist/runtime/failures.d.ts.map +1 -0
  478. package/dist/runtime/fetchRecord.d.ts +20 -0
  479. package/dist/runtime/fetchRecord.d.ts.map +1 -0
  480. package/dist/runtime/index.d.ts +35 -0
  481. package/dist/runtime/index.d.ts.map +1 -0
  482. package/dist/runtime/issueReport.d.ts +25 -0
  483. package/dist/runtime/issueReport.d.ts.map +1 -0
  484. package/dist/runtime/issues.d.ts +35 -0
  485. package/dist/runtime/issues.d.ts.map +1 -0
  486. package/dist/runtime/listeners.d.ts +36 -0
  487. package/dist/runtime/listeners.d.ts.map +1 -0
  488. package/dist/runtime/navigation.d.ts +139 -0
  489. package/dist/runtime/navigation.d.ts.map +1 -0
  490. package/dist/runtime/openRuntimes.d.ts +34 -0
  491. package/dist/runtime/openRuntimes.d.ts.map +1 -0
  492. package/dist/runtime/panelViews.d.ts +42 -0
  493. package/dist/runtime/panelViews.d.ts.map +1 -0
  494. package/dist/runtime/pending.d.ts +75 -0
  495. package/dist/runtime/pending.d.ts.map +1 -0
  496. package/dist/runtime/permissions.d.ts +80 -0
  497. package/dist/runtime/permissions.d.ts.map +1 -0
  498. package/dist/runtime/preferences.d.ts +37 -0
  499. package/dist/runtime/preferences.d.ts.map +1 -0
  500. package/dist/runtime/publish.d.ts +38 -0
  501. package/dist/runtime/publish.d.ts.map +1 -0
  502. package/dist/runtime/queryFailure.d.ts +59 -0
  503. package/dist/runtime/queryFailure.d.ts.map +1 -0
  504. package/dist/runtime/queryWeight.d.ts +29 -0
  505. package/dist/runtime/queryWeight.d.ts.map +1 -0
  506. package/dist/runtime/recordRuntime.d.ts +88 -0
  507. package/dist/runtime/recordRuntime.d.ts.map +1 -0
  508. package/dist/runtime/refreshTimer.d.ts +72 -0
  509. package/dist/runtime/refreshTimer.d.ts.map +1 -0
  510. package/dist/runtime/requestId.d.ts +11 -0
  511. package/dist/runtime/requestId.d.ts.map +1 -0
  512. package/dist/runtime/requestRunner.d.ts +58 -0
  513. package/dist/runtime/requestRunner.d.ts.map +1 -0
  514. package/dist/runtime/resources.d.ts +73 -0
  515. package/dist/runtime/resources.d.ts.map +1 -0
  516. package/dist/runtime/restyle.d.ts +21 -0
  517. package/dist/runtime/restyle.d.ts.map +1 -0
  518. package/dist/runtime/routes.d.ts +99 -0
  519. package/dist/runtime/routes.d.ts.map +1 -0
  520. package/dist/runtime/runtimeFactory.d.ts +80 -0
  521. package/dist/runtime/runtimeFactory.d.ts.map +1 -0
  522. package/dist/runtime/runtimeStore.d.ts +187 -0
  523. package/dist/runtime/runtimeStore.d.ts.map +1 -0
  524. package/dist/runtime/savedConditions.d.ts +11 -0
  525. package/dist/runtime/savedConditions.d.ts.map +1 -0
  526. package/dist/runtime/scope.d.ts +50 -0
  527. package/dist/runtime/scope.d.ts.map +1 -0
  528. package/dist/runtime/source.d.ts +108 -0
  529. package/dist/runtime/source.d.ts.map +1 -0
  530. package/dist/runtime/sourceReason.d.ts +65 -0
  531. package/dist/runtime/sourceReason.d.ts.map +1 -0
  532. package/dist/runtime/storedViews.d.ts +17 -0
  533. package/dist/runtime/storedViews.d.ts.map +1 -0
  534. package/dist/runtime/summaries.d.ts +25 -0
  535. package/dist/runtime/summaries.d.ts.map +1 -0
  536. package/dist/runtime/tabMemory.d.ts +39 -0
  537. package/dist/runtime/tabMemory.d.ts.map +1 -0
  538. package/dist/runtime/text.d.ts +20 -0
  539. package/dist/runtime/text.d.ts.map +1 -0
  540. package/dist/runtime/unavailable.d.ts +13 -0
  541. package/dist/runtime/unavailable.d.ts.map +1 -0
  542. package/dist/runtime/validateDefinition.d.ts +43 -0
  543. package/dist/runtime/validateDefinition.d.ts.map +1 -0
  544. package/dist/runtime/validateFields.d.ts +9 -0
  545. package/dist/runtime/validateFields.d.ts.map +1 -0
  546. package/dist/runtime/valueCandidates.d.ts +58 -0
  547. package/dist/runtime/valueCandidates.d.ts.map +1 -0
  548. package/dist/runtime/viewChanges.d.ts +39 -0
  549. package/dist/runtime/viewChanges.d.ts.map +1 -0
  550. package/dist/runtime/viewEngine.d.ts +292 -0
  551. package/dist/runtime/viewEngine.d.ts.map +1 -0
  552. package/dist/runtime/viewRuntime.d.ts +199 -0
  553. package/dist/runtime/viewRuntime.d.ts.map +1 -0
  554. package/dist/runtime/viewRuntimeTypes.d.ts +445 -0
  555. package/dist/runtime/viewRuntimeTypes.d.ts.map +1 -0
  556. package/dist/runtime/write.d.ts +96 -0
  557. package/dist/runtime/write.d.ts.map +1 -0
  558. package/dist/runtime/writeLedger.d.ts +134 -0
  559. package/dist/runtime/writeLedger.d.ts.map +1 -0
  560. package/dist/shadcn-bridge.css +107 -0
  561. package/dist/store/MemoryViewStore.d.ts +134 -0
  562. package/dist/store/MemoryViewStore.d.ts.map +1 -0
  563. package/dist/store/ViewStore.d.ts +116 -0
  564. package/dist/store/ViewStore.d.ts.map +1 -0
  565. package/dist/store/index.d.ts +10 -0
  566. package/dist/store/index.d.ts.map +1 -0
  567. package/dist/store/localStorageSnapshot.d.ts +65 -0
  568. package/dist/store/localStorageSnapshot.d.ts.map +1 -0
  569. package/dist/styles.css +3 -0
  570. package/dist/styles.d.ts +1 -0
  571. package/dist/styles.d.ts.map +1 -0
  572. package/dist/styles.js +0 -0
  573. package/dist/testing/actions.d.ts +78 -0
  574. package/dist/testing/actions.d.ts.map +1 -0
  575. package/dist/testing/aggregate.d.ts +24 -0
  576. package/dist/testing/aggregate.d.ts.map +1 -0
  577. package/dist/testing/calendar.d.ts +41 -0
  578. package/dist/testing/calendar.d.ts.map +1 -0
  579. package/dist/testing/expression.d.ts +17 -0
  580. package/dist/testing/expression.d.ts.map +1 -0
  581. package/dist/testing/filter.d.ts +48 -0
  582. package/dist/testing/filter.d.ts.map +1 -0
  583. package/dist/testing/index.d.ts +13 -0
  584. package/dist/testing/index.d.ts.map +1 -0
  585. package/dist/testing/source.d.ts +52 -0
  586. package/dist/testing/source.d.ts.map +1 -0
  587. package/dist/testing/values.d.ts +14 -0
  588. package/dist/testing/values.d.ts.map +1 -0
  589. package/dist/testing.js +725 -0
  590. package/dist/testing.js.map +1 -0
  591. package/dist/theme-check.mjs +6972 -0
  592. package/dist/theme-source.css +1393 -0
  593. package/dist/theme-tokens.json +5335 -0
  594. package/dist/themes/azure.css +126 -0
  595. package/dist/themes/contrast.css +122 -0
  596. package/dist/themes/neutral.css +2 -0
  597. package/dist/themes/porcelain.css +136 -0
  598. package/dist/themes.css +389 -0
  599. package/dist/ui/DashboardWorkbench.d.ts +133 -0
  600. package/dist/ui/DashboardWorkbench.d.ts.map +1 -0
  601. package/dist/ui/DataWorkbench.d.ts +155 -0
  602. package/dist/ui/DataWorkbench.d.ts.map +1 -0
  603. package/dist/ui/EmbeddedDashboard.d.ts +103 -0
  604. package/dist/ui/EmbeddedDashboard.d.ts.map +1 -0
  605. package/dist/ui/EmbeddedView.d.ts +76 -0
  606. package/dist/ui/EmbeddedView.d.ts.map +1 -0
  607. package/dist/ui/ViewHost.d.ts +94 -0
  608. package/dist/ui/ViewHost.d.ts.map +1 -0
  609. package/dist/ui/actions/ActionButtons.d.ts +49 -0
  610. package/dist/ui/actions/ActionButtons.d.ts.map +1 -0
  611. package/dist/ui/actions/ActionDialog.d.ts +35 -0
  612. package/dist/ui/actions/ActionDialog.d.ts.map +1 -0
  613. package/dist/ui/actions/ActionSurface.d.ts +60 -0
  614. package/dist/ui/actions/ActionSurface.d.ts.map +1 -0
  615. package/dist/ui/actions/BulkStatus.d.ts +41 -0
  616. package/dist/ui/actions/BulkStatus.d.ts.map +1 -0
  617. package/dist/ui/analysis/AnalysisChart.d.ts +71 -0
  618. package/dist/ui/analysis/AnalysisChart.d.ts.map +1 -0
  619. package/dist/ui/analysis/AnalysisTable.d.ts +54 -0
  620. package/dist/ui/analysis/AnalysisTable.d.ts.map +1 -0
  621. package/dist/ui/analysis/AnalysisToolbar.d.ts +68 -0
  622. package/dist/ui/analysis/AnalysisToolbar.d.ts.map +1 -0
  623. package/dist/ui/analysis/AxesTab.d.ts +11 -0
  624. package/dist/ui/analysis/AxesTab.d.ts.map +1 -0
  625. package/dist/ui/analysis/CardMenu.d.ts +41 -0
  626. package/dist/ui/analysis/CardMenu.d.ts.map +1 -0
  627. package/dist/ui/analysis/ChartOptions.d.ts +38 -0
  628. package/dist/ui/analysis/ChartOptions.d.ts.map +1 -0
  629. package/dist/ui/analysis/ChartPicker.d.ts +86 -0
  630. package/dist/ui/analysis/ChartPicker.d.ts.map +1 -0
  631. package/dist/ui/analysis/CompactSelect.d.ts +28 -0
  632. package/dist/ui/analysis/CompactSelect.d.ts.map +1 -0
  633. package/dist/ui/analysis/CompositionOptions.d.ts +18 -0
  634. package/dist/ui/analysis/CompositionOptions.d.ts.map +1 -0
  635. package/dist/ui/analysis/CurrencyStrip.d.ts +19 -0
  636. package/dist/ui/analysis/CurrencyStrip.d.ts.map +1 -0
  637. package/dist/ui/analysis/DataTab.d.ts +10 -0
  638. package/dist/ui/analysis/DataTab.d.ts.map +1 -0
  639. package/dist/ui/analysis/DimensionCard.d.ts +13 -0
  640. package/dist/ui/analysis/DimensionCard.d.ts.map +1 -0
  641. package/dist/ui/analysis/DisplayTab.d.ts +26 -0
  642. package/dist/ui/analysis/DisplayTab.d.ts.map +1 -0
  643. package/dist/ui/analysis/DrillMenu.d.ts +73 -0
  644. package/dist/ui/analysis/DrillMenu.d.ts.map +1 -0
  645. package/dist/ui/analysis/DroppedNotice.d.ts +28 -0
  646. package/dist/ui/analysis/DroppedNotice.d.ts.map +1 -0
  647. package/dist/ui/analysis/ElementsSlot.d.ts +22 -0
  648. package/dist/ui/analysis/ElementsSlot.d.ts.map +1 -0
  649. package/dist/ui/analysis/EmptyResult.d.ts +50 -0
  650. package/dist/ui/analysis/EmptyResult.d.ts.map +1 -0
  651. package/dist/ui/analysis/ExportMenu.d.ts +35 -0
  652. package/dist/ui/analysis/ExportMenu.d.ts.map +1 -0
  653. package/dist/ui/analysis/FormulaCard.d.ts +46 -0
  654. package/dist/ui/analysis/FormulaCard.d.ts.map +1 -0
  655. package/dist/ui/analysis/HavingRows.d.ts +50 -0
  656. package/dist/ui/analysis/HavingRows.d.ts.map +1 -0
  657. package/dist/ui/analysis/LevelOptions.d.ts +21 -0
  658. package/dist/ui/analysis/LevelOptions.d.ts.map +1 -0
  659. package/dist/ui/analysis/MapOptions.d.ts +8 -0
  660. package/dist/ui/analysis/MapOptions.d.ts.map +1 -0
  661. package/dist/ui/analysis/MetricCard.d.ts +29 -0
  662. package/dist/ui/analysis/MetricCard.d.ts.map +1 -0
  663. package/dist/ui/analysis/MetricCondition.d.ts +73 -0
  664. package/dist/ui/analysis/MetricCondition.d.ts.map +1 -0
  665. package/dist/ui/analysis/MetricSlot.d.ts +35 -0
  666. package/dist/ui/analysis/MetricSlot.d.ts.map +1 -0
  667. package/dist/ui/analysis/OrderedCards.d.ts +39 -0
  668. package/dist/ui/analysis/OrderedCards.d.ts.map +1 -0
  669. package/dist/ui/analysis/RangeSlot.d.ts +26 -0
  670. package/dist/ui/analysis/RangeSlot.d.ts.map +1 -0
  671. package/dist/ui/analysis/ReferenceOptions.d.ts +12 -0
  672. package/dist/ui/analysis/ReferenceOptions.d.ts.map +1 -0
  673. package/dist/ui/analysis/ResultSlot.d.ts +31 -0
  674. package/dist/ui/analysis/ResultSlot.d.ts.map +1 -0
  675. package/dist/ui/analysis/SeriesList.d.ts +35 -0
  676. package/dist/ui/analysis/SeriesList.d.ts.map +1 -0
  677. package/dist/ui/analysis/SkeletonResult.d.ts +36 -0
  678. package/dist/ui/analysis/SkeletonResult.d.ts.map +1 -0
  679. package/dist/ui/analysis/StatisticalOptions.d.ts +31 -0
  680. package/dist/ui/analysis/StatisticalOptions.d.ts.map +1 -0
  681. package/dist/ui/analysis/TermTip.d.ts +32 -0
  682. package/dist/ui/analysis/TermTip.d.ts.map +1 -0
  683. package/dist/ui/analysis/Tray.d.ts +45 -0
  684. package/dist/ui/analysis/Tray.d.ts.map +1 -0
  685. package/dist/ui/analysis/VisualizationPanel.d.ts +68 -0
  686. package/dist/ui/analysis/VisualizationPanel.d.ts.map +1 -0
  687. package/dist/ui/analysis/chartIcons.d.ts +19 -0
  688. package/dist/ui/analysis/chartIcons.d.ts.map +1 -0
  689. package/dist/ui/analysis/drag.d.ts +39 -0
  690. package/dist/ui/analysis/drag.d.ts.map +1 -0
  691. package/dist/ui/analysis/editing.d.ts +69 -0
  692. package/dist/ui/analysis/editing.d.ts.map +1 -0
  693. package/dist/ui/analysis/exportOffer.d.ts +60 -0
  694. package/dist/ui/analysis/exportOffer.d.ts.map +1 -0
  695. package/dist/ui/analysis/headerSort.d.ts +66 -0
  696. package/dist/ui/analysis/headerSort.d.ts.map +1 -0
  697. package/dist/ui/analysis/imageExport.d.ts +40 -0
  698. package/dist/ui/analysis/imageExport.d.ts.map +1 -0
  699. package/dist/ui/analysis/issueNames.d.ts +39 -0
  700. package/dist/ui/analysis/issueNames.d.ts.map +1 -0
  701. package/dist/ui/analysis/listFocus.d.ts +42 -0
  702. package/dist/ui/analysis/listFocus.d.ts.map +1 -0
  703. package/dist/ui/analysis/optionControls.d.ts +200 -0
  704. package/dist/ui/analysis/optionControls.d.ts.map +1 -0
  705. package/dist/ui/analysis/tableColumns.d.ts +79 -0
  706. package/dist/ui/analysis/tableColumns.d.ts.map +1 -0
  707. package/dist/ui/analysis/virtualRows.d.ts +66 -0
  708. package/dist/ui/analysis/virtualRows.d.ts.map +1 -0
  709. package/dist/ui/charts/Boxplot.d.ts +10 -0
  710. package/dist/ui/charts/Boxplot.d.ts.map +1 -0
  711. package/dist/ui/charts/Candlestick.d.ts +9 -0
  712. package/dist/ui/charts/Candlestick.d.ts.map +1 -0
  713. package/dist/ui/charts/Cartesian.d.ts +9 -0
  714. package/dist/ui/charts/Cartesian.d.ts.map +1 -0
  715. package/dist/ui/charts/ChartLegend.d.ts +47 -0
  716. package/dist/ui/charts/ChartLegend.d.ts.map +1 -0
  717. package/dist/ui/charts/ChartNotes.d.ts +14 -0
  718. package/dist/ui/charts/ChartNotes.d.ts.map +1 -0
  719. package/dist/ui/charts/ChartReading.d.ts +15 -0
  720. package/dist/ui/charts/ChartReading.d.ts.map +1 -0
  721. package/dist/ui/charts/EChart.d.ts +177 -0
  722. package/dist/ui/charts/EChart.d.ts.map +1 -0
  723. package/dist/ui/charts/Funnel.d.ts +27 -0
  724. package/dist/ui/charts/Funnel.d.ts.map +1 -0
  725. package/dist/ui/charts/Gauge.d.ts +9 -0
  726. package/dist/ui/charts/Gauge.d.ts.map +1 -0
  727. package/dist/ui/charts/GeoMap.d.ts +11 -0
  728. package/dist/ui/charts/GeoMap.d.ts.map +1 -0
  729. package/dist/ui/charts/Heatmap.d.ts +9 -0
  730. package/dist/ui/charts/Heatmap.d.ts.map +1 -0
  731. package/dist/ui/charts/Hierarchy.d.ts +12 -0
  732. package/dist/ui/charts/Hierarchy.d.ts.map +1 -0
  733. package/dist/ui/charts/MetricCard.d.ts +4 -0
  734. package/dist/ui/charts/MetricCard.d.ts.map +1 -0
  735. package/dist/ui/charts/PieSlices.d.ts +26 -0
  736. package/dist/ui/charts/PieSlices.d.ts.map +1 -0
  737. package/dist/ui/charts/Profiles.d.ts +11 -0
  738. package/dist/ui/charts/Profiles.d.ts.map +1 -0
  739. package/dist/ui/charts/ScatterPoints.d.ts +5 -0
  740. package/dist/ui/charts/ScatterPoints.d.ts.map +1 -0
  741. package/dist/ui/charts/TimeCharts.d.ts +10 -0
  742. package/dist/ui/charts/TimeCharts.d.ts.map +1 -0
  743. package/dist/ui/charts/Treemap.d.ts +12 -0
  744. package/dist/ui/charts/Treemap.d.ts.map +1 -0
  745. package/dist/ui/charts/Waterfall.d.ts +11 -0
  746. package/dist/ui/charts/Waterfall.d.ts.map +1 -0
  747. package/dist/ui/charts/axis.d.ts +101 -0
  748. package/dist/ui/charts/axis.d.ts.map +1 -0
  749. package/dist/ui/charts/boxplotOption.d.ts +33 -0
  750. package/dist/ui/charts/boxplotOption.d.ts.map +1 -0
  751. package/dist/ui/charts/candlestickOption.d.ts +42 -0
  752. package/dist/ui/charts/candlestickOption.d.ts.map +1 -0
  753. package/dist/ui/charts/cartesianBrush.d.ts +84 -0
  754. package/dist/ui/charts/cartesianBrush.d.ts.map +1 -0
  755. package/dist/ui/charts/cartesianFit.d.ts +72 -0
  756. package/dist/ui/charts/cartesianFit.d.ts.map +1 -0
  757. package/dist/ui/charts/cartesianMarks.d.ts +116 -0
  758. package/dist/ui/charts/cartesianMarks.d.ts.map +1 -0
  759. package/dist/ui/charts/cartesianOption.d.ts +32 -0
  760. package/dist/ui/charts/cartesianOption.d.ts.map +1 -0
  761. package/dist/ui/charts/cartesianPlan.d.ts +263 -0
  762. package/dist/ui/charts/cartesianPlan.d.ts.map +1 -0
  763. package/dist/ui/charts/cartesianSeries.d.ts +41 -0
  764. package/dist/ui/charts/cartesianSeries.d.ts.map +1 -0
  765. package/dist/ui/charts/cartesianTooltip.d.ts +14 -0
  766. package/dist/ui/charts/cartesianTooltip.d.ts.map +1 -0
  767. package/dist/ui/charts/cartesianZoom.d.ts +60 -0
  768. package/dist/ui/charts/cartesianZoom.d.ts.map +1 -0
  769. package/dist/ui/charts/categoryFrame.d.ts +106 -0
  770. package/dist/ui/charts/categoryFrame.d.ts.map +1 -0
  771. package/dist/ui/charts/dateTicks.d.ts +36 -0
  772. package/dist/ui/charts/dateTicks.d.ts.map +1 -0
  773. package/dist/ui/charts/echarts.d.ts +16 -0
  774. package/dist/ui/charts/echarts.d.ts.map +1 -0
  775. package/dist/ui/charts/echartsGeo.d.ts +5 -0
  776. package/dist/ui/charts/echartsGeo.d.ts.map +1 -0
  777. package/dist/ui/charts/echartsHierarchy.d.ts +2 -0
  778. package/dist/ui/charts/echartsHierarchy.d.ts.map +1 -0
  779. package/dist/ui/charts/echartsStatistics.d.ts +2 -0
  780. package/dist/ui/charts/echartsStatistics.d.ts.map +1 -0
  781. package/dist/ui/charts/echartsTime.d.ts +2 -0
  782. package/dist/ui/charts/echartsTime.d.ts.map +1 -0
  783. package/dist/ui/charts/family.d.ts +176 -0
  784. package/dist/ui/charts/family.d.ts.map +1 -0
  785. package/dist/ui/charts/frameClass.d.ts +18 -0
  786. package/dist/ui/charts/frameClass.d.ts.map +1 -0
  787. package/dist/ui/charts/funnelFit.d.ts +67 -0
  788. package/dist/ui/charts/funnelFit.d.ts.map +1 -0
  789. package/dist/ui/charts/funnelOption.d.ts +94 -0
  790. package/dist/ui/charts/funnelOption.d.ts.map +1 -0
  791. package/dist/ui/charts/gaugeOption.d.ts +32 -0
  792. package/dist/ui/charts/gaugeOption.d.ts.map +1 -0
  793. package/dist/ui/charts/heatmapOption.d.ts +38 -0
  794. package/dist/ui/charts/heatmapOption.d.ts.map +1 -0
  795. package/dist/ui/charts/hierarchyOption.d.ts +85 -0
  796. package/dist/ui/charts/hierarchyOption.d.ts.map +1 -0
  797. package/dist/ui/charts/highlight.d.ts +26 -0
  798. package/dist/ui/charts/highlight.d.ts.map +1 -0
  799. package/dist/ui/charts/image.d.ts +96 -0
  800. package/dist/ui/charts/image.d.ts.map +1 -0
  801. package/dist/ui/charts/legend.d.ts +11 -0
  802. package/dist/ui/charts/legend.d.ts.map +1 -0
  803. package/dist/ui/charts/load.d.ts +29 -0
  804. package/dist/ui/charts/load.d.ts.map +1 -0
  805. package/dist/ui/charts/mapOption.d.ts +39 -0
  806. package/dist/ui/charts/mapOption.d.ts.map +1 -0
  807. package/dist/ui/charts/maps.d.ts +53 -0
  808. package/dist/ui/charts/maps.d.ts.map +1 -0
  809. package/dist/ui/charts/markWords.d.ts +38 -0
  810. package/dist/ui/charts/markWords.d.ts.map +1 -0
  811. package/dist/ui/charts/measure.d.ts +2 -0
  812. package/dist/ui/charts/measure.d.ts.map +1 -0
  813. package/dist/ui/charts/motion.d.ts +15 -0
  814. package/dist/ui/charts/motion.d.ts.map +1 -0
  815. package/dist/ui/charts/optionMerge.d.ts +10 -0
  816. package/dist/ui/charts/optionMerge.d.ts.map +1 -0
  817. package/dist/ui/charts/palette.d.ts +43 -0
  818. package/dist/ui/charts/palette.d.ts.map +1 -0
  819. package/dist/ui/charts/patterns.d.ts +29 -0
  820. package/dist/ui/charts/patterns.d.ts.map +1 -0
  821. package/dist/ui/charts/periodSpan.d.ts +11 -0
  822. package/dist/ui/charts/periodSpan.d.ts.map +1 -0
  823. package/dist/ui/charts/pieOption.d.ts +107 -0
  824. package/dist/ui/charts/pieOption.d.ts.map +1 -0
  825. package/dist/ui/charts/print.d.ts +16 -0
  826. package/dist/ui/charts/print.d.ts.map +1 -0
  827. package/dist/ui/charts/profileOption.d.ts +47 -0
  828. package/dist/ui/charts/profileOption.d.ts.map +1 -0
  829. package/dist/ui/charts/reading.d.ts +66 -0
  830. package/dist/ui/charts/reading.d.ts.map +1 -0
  831. package/dist/ui/charts/readingStatistics.d.ts +58 -0
  832. package/dist/ui/charts/readingStatistics.d.ts.map +1 -0
  833. package/dist/ui/charts/scale.d.ts +42 -0
  834. package/dist/ui/charts/scale.d.ts.map +1 -0
  835. package/dist/ui/charts/scatterOption.d.ts +44 -0
  836. package/dist/ui/charts/scatterOption.d.ts.map +1 -0
  837. package/dist/ui/charts/sentence.d.ts +19 -0
  838. package/dist/ui/charts/sentence.d.ts.map +1 -0
  839. package/dist/ui/charts/sentenceParts.d.ts +36 -0
  840. package/dist/ui/charts/sentenceParts.d.ts.map +1 -0
  841. package/dist/ui/charts/sizes.d.ts +25 -0
  842. package/dist/ui/charts/sizes.d.ts.map +1 -0
  843. package/dist/ui/charts/sparklineOption.d.ts +19 -0
  844. package/dist/ui/charts/sparklineOption.d.ts.map +1 -0
  845. package/dist/ui/charts/theme.d.ts +179 -0
  846. package/dist/ui/charts/theme.d.ts.map +1 -0
  847. package/dist/ui/charts/timeOption.d.ts +54 -0
  848. package/dist/ui/charts/timeOption.d.ts.map +1 -0
  849. package/dist/ui/charts/tooltip.d.ts +51 -0
  850. package/dist/ui/charts/tooltip.d.ts.map +1 -0
  851. package/dist/ui/charts/treemapOption.d.ts +56 -0
  852. package/dist/ui/charts/treemapOption.d.ts.map +1 -0
  853. package/dist/ui/charts/waterfallOption.d.ts +58 -0
  854. package/dist/ui/charts/waterfallOption.d.ts.map +1 -0
  855. package/dist/ui/colorMode.d.ts +39 -0
  856. package/dist/ui/colorMode.d.ts.map +1 -0
  857. package/dist/ui/columns/ColumnRow.d.ts +79 -0
  858. package/dist/ui/columns/ColumnRow.d.ts.map +1 -0
  859. package/dist/ui/columns/ColumnSettings.d.ts +51 -0
  860. package/dist/ui/columns/ColumnSettings.d.ts.map +1 -0
  861. package/dist/ui/columns/WidthInput.d.ts +39 -0
  862. package/dist/ui/columns/WidthInput.d.ts.map +1 -0
  863. package/dist/ui/columns/drag.d.ts +34 -0
  864. package/dist/ui/columns/drag.d.ts.map +1 -0
  865. package/dist/ui/columns/rows.d.ts +155 -0
  866. package/dist/ui/columns/rows.d.ts.map +1 -0
  867. package/dist/ui/columns/sections.d.ts +55 -0
  868. package/dist/ui/columns/sections.d.ts.map +1 -0
  869. package/dist/ui/components/alert-dialog.d.ts +19 -0
  870. package/dist/ui/components/alert-dialog.d.ts.map +1 -0
  871. package/dist/ui/components/alert.d.ts +11 -0
  872. package/dist/ui/components/alert.d.ts.map +1 -0
  873. package/dist/ui/components/badge.d.ts +8 -0
  874. package/dist/ui/components/badge.d.ts.map +1 -0
  875. package/dist/ui/components/button-group.d.ts +11 -0
  876. package/dist/ui/components/button-group.d.ts.map +1 -0
  877. package/dist/ui/components/button.d.ts +9 -0
  878. package/dist/ui/components/button.d.ts.map +1 -0
  879. package/dist/ui/components/calendar.d.ts +11 -0
  880. package/dist/ui/components/calendar.d.ts.map +1 -0
  881. package/dist/ui/components/card.d.ts +12 -0
  882. package/dist/ui/components/card.d.ts.map +1 -0
  883. package/dist/ui/components/checkbox.d.ts +4 -0
  884. package/dist/ui/components/checkbox.d.ts.map +1 -0
  885. package/dist/ui/components/collapsible.d.ts +6 -0
  886. package/dist/ui/components/collapsible.d.ts.map +1 -0
  887. package/dist/ui/components/combobox.d.ts +25 -0
  888. package/dist/ui/components/combobox.d.ts.map +1 -0
  889. package/dist/ui/components/dialog.d.ts +18 -0
  890. package/dist/ui/components/dialog.d.ts.map +1 -0
  891. package/dist/ui/components/dropdown-menu.d.ts +30 -0
  892. package/dist/ui/components/dropdown-menu.d.ts.map +1 -0
  893. package/dist/ui/components/empty.d.ts +12 -0
  894. package/dist/ui/components/empty.d.ts.map +1 -0
  895. package/dist/ui/components/field.d.ts +25 -0
  896. package/dist/ui/components/field.d.ts.map +1 -0
  897. package/dist/ui/components/input-group.d.ts +19 -0
  898. package/dist/ui/components/input-group.d.ts.map +1 -0
  899. package/dist/ui/components/input.d.ts +4 -0
  900. package/dist/ui/components/input.d.ts.map +1 -0
  901. package/dist/ui/components/item.d.ts +23 -0
  902. package/dist/ui/components/item.d.ts.map +1 -0
  903. package/dist/ui/components/label.d.ts +4 -0
  904. package/dist/ui/components/label.d.ts.map +1 -0
  905. package/dist/ui/components/pagination.d.ts +18 -0
  906. package/dist/ui/components/pagination.d.ts.map +1 -0
  907. package/dist/ui/components/popover.d.ts +10 -0
  908. package/dist/ui/components/popover.d.ts.map +1 -0
  909. package/dist/ui/components/progress.d.ts +8 -0
  910. package/dist/ui/components/progress.d.ts.map +1 -0
  911. package/dist/ui/components/radio-group.d.ts +6 -0
  912. package/dist/ui/components/radio-group.d.ts.map +1 -0
  913. package/dist/ui/components/select.d.ts +16 -0
  914. package/dist/ui/components/select.d.ts.map +1 -0
  915. package/dist/ui/components/separator.d.ts +4 -0
  916. package/dist/ui/components/separator.d.ts.map +1 -0
  917. package/dist/ui/components/sheet.d.ts +15 -0
  918. package/dist/ui/components/sheet.d.ts.map +1 -0
  919. package/dist/ui/components/skeleton.d.ts +3 -0
  920. package/dist/ui/components/skeleton.d.ts.map +1 -0
  921. package/dist/ui/components/spinner.d.ts +3 -0
  922. package/dist/ui/components/spinner.d.ts.map +1 -0
  923. package/dist/ui/components/table.d.ts +11 -0
  924. package/dist/ui/components/table.d.ts.map +1 -0
  925. package/dist/ui/components/tabs.d.ts +11 -0
  926. package/dist/ui/components/tabs.d.ts.map +1 -0
  927. package/dist/ui/components/textarea.d.ts +4 -0
  928. package/dist/ui/components/textarea.d.ts.map +1 -0
  929. package/dist/ui/components/toast.d.ts +17 -0
  930. package/dist/ui/components/toast.d.ts.map +1 -0
  931. package/dist/ui/components/toggle-group.d.ts +12 -0
  932. package/dist/ui/components/toggle-group.d.ts.map +1 -0
  933. package/dist/ui/components/toggle.d.ts +9 -0
  934. package/dist/ui/components/toggle.d.ts.map +1 -0
  935. package/dist/ui/components/tooltip.d.ts +7 -0
  936. package/dist/ui/components/tooltip.d.ts.map +1 -0
  937. package/dist/ui/dashboard/AddMenu.d.ts +28 -0
  938. package/dist/ui/dashboard/AddMenu.d.ts.map +1 -0
  939. package/dist/ui/dashboard/Board.d.ts +49 -0
  940. package/dist/ui/dashboard/Board.d.ts.map +1 -0
  941. package/dist/ui/dashboard/BoardDestination.d.ts +48 -0
  942. package/dist/ui/dashboard/BoardDestination.d.ts.map +1 -0
  943. package/dist/ui/dashboard/BoardFilters.d.ts +58 -0
  944. package/dist/ui/dashboard/BoardFilters.d.ts.map +1 -0
  945. package/dist/ui/dashboard/BoardWidth.d.ts +15 -0
  946. package/dist/ui/dashboard/BoardWidth.d.ts.map +1 -0
  947. package/dist/ui/dashboard/ClickSettings.d.ts +30 -0
  948. package/dist/ui/dashboard/ClickSettings.d.ts.map +1 -0
  949. package/dist/ui/dashboard/ContentEditor.d.ts +40 -0
  950. package/dist/ui/dashboard/ContentEditor.d.ts.map +1 -0
  951. package/dist/ui/dashboard/DashboardArrange.d.ts +101 -0
  952. package/dist/ui/dashboard/DashboardArrange.d.ts.map +1 -0
  953. package/dist/ui/dashboard/DashboardGrid.d.ts +96 -0
  954. package/dist/ui/dashboard/DashboardGrid.d.ts.map +1 -0
  955. package/dist/ui/dashboard/DashboardPanel.d.ts +143 -0
  956. package/dist/ui/dashboard/DashboardPanel.d.ts.map +1 -0
  957. package/dist/ui/dashboard/DashboardPanels.d.ts +93 -0
  958. package/dist/ui/dashboard/DashboardPanels.d.ts.map +1 -0
  959. package/dist/ui/dashboard/DashboardTabs.d.ts +43 -0
  960. package/dist/ui/dashboard/DashboardTabs.d.ts.map +1 -0
  961. package/dist/ui/dashboard/EditBar.d.ts +55 -0
  962. package/dist/ui/dashboard/EditBar.d.ts.map +1 -0
  963. package/dist/ui/dashboard/EditableTabs.d.ts +32 -0
  964. package/dist/ui/dashboard/EditableTabs.d.ts.map +1 -0
  965. package/dist/ui/dashboard/FilterBar.d.ts +82 -0
  966. package/dist/ui/dashboard/FilterBar.d.ts.map +1 -0
  967. package/dist/ui/dashboard/FilterOrder.d.ts +40 -0
  968. package/dist/ui/dashboard/FilterOrder.d.ts.map +1 -0
  969. package/dist/ui/dashboard/FilterReadings.d.ts +41 -0
  970. package/dist/ui/dashboard/FilterReadings.d.ts.map +1 -0
  971. package/dist/ui/dashboard/FilterSettings.d.ts +32 -0
  972. package/dist/ui/dashboard/FilterSettings.d.ts.map +1 -0
  973. package/dist/ui/dashboard/FilterSheet.d.ts +24 -0
  974. package/dist/ui/dashboard/FilterSheet.d.ts.map +1 -0
  975. package/dist/ui/dashboard/FilterWiring.d.ts +47 -0
  976. package/dist/ui/dashboard/FilterWiring.d.ts.map +1 -0
  977. package/dist/ui/dashboard/GridBlocksLayer.d.ts +17 -0
  978. package/dist/ui/dashboard/GridBlocksLayer.d.ts.map +1 -0
  979. package/dist/ui/dashboard/GroupingControl.d.ts +10 -0
  980. package/dist/ui/dashboard/GroupingControl.d.ts.map +1 -0
  981. package/dist/ui/dashboard/NewAnalysisDialog.d.ts +41 -0
  982. package/dist/ui/dashboard/NewAnalysisDialog.d.ts.map +1 -0
  983. package/dist/ui/dashboard/PanelBodies.d.ts +101 -0
  984. package/dist/ui/dashboard/PanelBodies.d.ts.map +1 -0
  985. package/dist/ui/dashboard/PanelExport.d.ts +35 -0
  986. package/dist/ui/dashboard/PanelExport.d.ts.map +1 -0
  987. package/dist/ui/dashboard/PanelMarks.d.ts +43 -0
  988. package/dist/ui/dashboard/PanelMarks.d.ts.map +1 -0
  989. package/dist/ui/dashboard/PanelMenu.d.ts +56 -0
  990. package/dist/ui/dashboard/PanelMenu.d.ts.map +1 -0
  991. package/dist/ui/dashboard/PanelUnavailable.d.ts +45 -0
  992. package/dist/ui/dashboard/PanelUnavailable.d.ts.map +1 -0
  993. package/dist/ui/dashboard/PresentationDialog.d.ts +36 -0
  994. package/dist/ui/dashboard/PresentationDialog.d.ts.map +1 -0
  995. package/dist/ui/dashboard/ScrollCue.d.ts +21 -0
  996. package/dist/ui/dashboard/ScrollCue.d.ts.map +1 -0
  997. package/dist/ui/dashboard/ViewPicker.d.ts +59 -0
  998. package/dist/ui/dashboard/ViewPicker.d.ts.map +1 -0
  999. package/dist/ui/dashboard/buildShell.d.ts +44 -0
  1000. package/dist/ui/dashboard/buildShell.d.ts.map +1 -0
  1001. package/dist/ui/dashboard/building.d.ts +44 -0
  1002. package/dist/ui/dashboard/building.d.ts.map +1 -0
  1003. package/dist/ui/dashboard/commands.d.ts +131 -0
  1004. package/dist/ui/dashboard/commands.d.ts.map +1 -0
  1005. package/dist/ui/dashboard/extensions.d.ts +66 -0
  1006. package/dist/ui/dashboard/extensions.d.ts.map +1 -0
  1007. package/dist/ui/dashboard/filterModes.d.ts +60 -0
  1008. package/dist/ui/dashboard/filterModes.d.ts.map +1 -0
  1009. package/dist/ui/dashboard/filterOutcome.d.ts +24 -0
  1010. package/dist/ui/dashboard/filterOutcome.d.ts.map +1 -0
  1011. package/dist/ui/dashboard/findings.d.ts +24 -0
  1012. package/dist/ui/dashboard/findings.d.ts.map +1 -0
  1013. package/dist/ui/dashboard/gridBlocks.d.ts +55 -0
  1014. package/dist/ui/dashboard/gridBlocks.d.ts.map +1 -0
  1015. package/dist/ui/dashboard/gridPlacement.d.ts +38 -0
  1016. package/dist/ui/dashboard/gridPlacement.d.ts.map +1 -0
  1017. package/dist/ui/dashboard/gridWidth.d.ts +33 -0
  1018. package/dist/ui/dashboard/gridWidth.d.ts.map +1 -0
  1019. package/dist/ui/dashboard/history.d.ts +56 -0
  1020. package/dist/ui/dashboard/history.d.ts.map +1 -0
  1021. package/dist/ui/dashboard/landing.d.ts +13 -0
  1022. package/dist/ui/dashboard/landing.d.ts.map +1 -0
  1023. package/dist/ui/dashboard/panelFit.d.ts +43 -0
  1024. package/dist/ui/dashboard/panelFit.d.ts.map +1 -0
  1025. package/dist/ui/dashboard/press.d.ts +50 -0
  1026. package/dist/ui/dashboard/press.d.ts.map +1 -0
  1027. package/dist/ui/dashboard/reveal.d.ts +21 -0
  1028. package/dist/ui/dashboard/reveal.d.ts.map +1 -0
  1029. package/dist/ui/dashboard/scrollMore.d.ts +92 -0
  1030. package/dist/ui/dashboard/scrollMore.d.ts.map +1 -0
  1031. package/dist/ui/dashboard/touchGate.d.ts +30 -0
  1032. package/dist/ui/dashboard/touchGate.d.ts.map +1 -0
  1033. package/dist/ui/embed/EmbedFrame.d.ts +29 -0
  1034. package/dist/ui/embed/EmbedFrame.d.ts.map +1 -0
  1035. package/dist/ui/embed/EmbedHead.d.ts +81 -0
  1036. package/dist/ui/embed/EmbedHead.d.ts.map +1 -0
  1037. package/dist/ui/embed/EmbeddedAnalysis.d.ts +20 -0
  1038. package/dist/ui/embed/EmbeddedAnalysis.d.ts.map +1 -0
  1039. package/dist/ui/embed/EmbeddedRecord.d.ts +33 -0
  1040. package/dist/ui/embed/EmbeddedRecord.d.ts.map +1 -0
  1041. package/dist/ui/embed/options.d.ts +118 -0
  1042. package/dist/ui/embed/options.d.ts.map +1 -0
  1043. package/dist/ui/filter/AddEntry.d.ts +25 -0
  1044. package/dist/ui/filter/AddEntry.d.ts.map +1 -0
  1045. package/dist/ui/filter/AppliedBar.d.ts +39 -0
  1046. package/dist/ui/filter/AppliedBar.d.ts.map +1 -0
  1047. package/dist/ui/filter/ConditionPill.d.ts +38 -0
  1048. package/dist/ui/filter/ConditionPill.d.ts.map +1 -0
  1049. package/dist/ui/filter/FieldChecklist.d.ts +56 -0
  1050. package/dist/ui/filter/FieldChecklist.d.ts.map +1 -0
  1051. package/dist/ui/filter/FilterActions.d.ts +49 -0
  1052. package/dist/ui/filter/FilterActions.d.ts.map +1 -0
  1053. package/dist/ui/filter/FilterModes.d.ts +39 -0
  1054. package/dist/ui/filter/FilterModes.d.ts.map +1 -0
  1055. package/dist/ui/filter/FilterPanel.d.ts +76 -0
  1056. package/dist/ui/filter/FilterPanel.d.ts.map +1 -0
  1057. package/dist/ui/filter/FilterValueEditor.d.ts +103 -0
  1058. package/dist/ui/filter/FilterValueEditor.d.ts.map +1 -0
  1059. package/dist/ui/filter/GroupBlock.d.ts +49 -0
  1060. package/dist/ui/filter/GroupBlock.d.ts.map +1 -0
  1061. package/dist/ui/filter/conditionFocus.d.ts +39 -0
  1062. package/dist/ui/filter/conditionFocus.d.ts.map +1 -0
  1063. package/dist/ui/filter/enter.d.ts +20 -0
  1064. package/dist/ui/filter/enter.d.ts.map +1 -0
  1065. package/dist/ui/filter/groupOperators.d.ts +12 -0
  1066. package/dist/ui/filter/groupOperators.d.ts.map +1 -0
  1067. package/dist/ui/filter/inputs/calendar.d.ts +26 -0
  1068. package/dist/ui/filter/inputs/calendar.d.ts.map +1 -0
  1069. package/dist/ui/filter/inputs/candidates.d.ts +27 -0
  1070. package/dist/ui/filter/inputs/candidates.d.ts.map +1 -0
  1071. package/dist/ui/filter/inputs/chips.d.ts +56 -0
  1072. package/dist/ui/filter/inputs/chips.d.ts.map +1 -0
  1073. package/dist/ui/filter/inputs/date.d.ts +35 -0
  1074. package/dist/ui/filter/inputs/date.d.ts.map +1 -0
  1075. package/dist/ui/filter/inputs/daterange.d.ts +28 -0
  1076. package/dist/ui/filter/inputs/daterange.d.ts.map +1 -0
  1077. package/dist/ui/filter/inputs/duration.d.ts +16 -0
  1078. package/dist/ui/filter/inputs/duration.d.ts.map +1 -0
  1079. package/dist/ui/filter/inputs/number.d.ts +47 -0
  1080. package/dist/ui/filter/inputs/number.d.ts.map +1 -0
  1081. package/dist/ui/filter/inputs/relative.d.ts +23 -0
  1082. package/dist/ui/filter/inputs/relative.d.ts.map +1 -0
  1083. package/dist/ui/filter/inputs/remote.d.ts +20 -0
  1084. package/dist/ui/filter/inputs/remote.d.ts.map +1 -0
  1085. package/dist/ui/filter/inputs/select.d.ts +26 -0
  1086. package/dist/ui/filter/inputs/select.d.ts.map +1 -0
  1087. package/dist/ui/filter/inputs/shared.d.ts +79 -0
  1088. package/dist/ui/filter/inputs/shared.d.ts.map +1 -0
  1089. package/dist/ui/filter/inputs/suggested.d.ts +29 -0
  1090. package/dist/ui/filter/inputs/suggested.d.ts.map +1 -0
  1091. package/dist/ui/filter/inputs/text.d.ts +8 -0
  1092. package/dist/ui/filter/inputs/text.d.ts.map +1 -0
  1093. package/dist/ui/filter/inputs/time.d.ts +29 -0
  1094. package/dist/ui/filter/inputs/time.d.ts.map +1 -0
  1095. package/dist/ui/filter/inputs/timeOfDay.d.ts +38 -0
  1096. package/dist/ui/filter/inputs/timeOfDay.d.ts.map +1 -0
  1097. package/dist/ui/filter/inputs/unsupported.d.ts +33 -0
  1098. package/dist/ui/filter/inputs/unsupported.d.ts.map +1 -0
  1099. package/dist/ui/index.d.ts +123 -0
  1100. package/dist/ui/index.d.ts.map +1 -0
  1101. package/dist/ui/kit/Announcer.d.ts +75 -0
  1102. package/dist/ui/kit/Announcer.d.ts.map +1 -0
  1103. package/dist/ui/kit/CopyButton.d.ts +31 -0
  1104. package/dist/ui/kit/CopyButton.d.ts.map +1 -0
  1105. package/dist/ui/kit/DragHandle.d.ts +84 -0
  1106. package/dist/ui/kit/DragHandle.d.ts.map +1 -0
  1107. package/dist/ui/kit/ExportDialog.d.ts +111 -0
  1108. package/dist/ui/kit/ExportDialog.d.ts.map +1 -0
  1109. package/dist/ui/kit/ExportSteps.d.ts +38 -0
  1110. package/dist/ui/kit/ExportSteps.d.ts.map +1 -0
  1111. package/dist/ui/kit/FieldMenu.d.ts +22 -0
  1112. package/dist/ui/kit/FieldMenu.d.ts.map +1 -0
  1113. package/dist/ui/kit/HandOffMenu.d.ts +29 -0
  1114. package/dist/ui/kit/HandOffMenu.d.ts.map +1 -0
  1115. package/dist/ui/kit/IconButton.d.ts +74 -0
  1116. package/dist/ui/kit/IconButton.d.ts.map +1 -0
  1117. package/dist/ui/kit/MessagesProvider.d.ts +135 -0
  1118. package/dist/ui/kit/MessagesProvider.d.ts.map +1 -0
  1119. package/dist/ui/kit/MixedCheckbox.d.ts +16 -0
  1120. package/dist/ui/kit/MixedCheckbox.d.ts.map +1 -0
  1121. package/dist/ui/kit/OutcomeActions.d.ts +78 -0
  1122. package/dist/ui/kit/OutcomeActions.d.ts.map +1 -0
  1123. package/dist/ui/kit/PendingDot.d.ts +39 -0
  1124. package/dist/ui/kit/PendingDot.d.ts.map +1 -0
  1125. package/dist/ui/kit/RenameInput.d.ts +63 -0
  1126. package/dist/ui/kit/RenameInput.d.ts.map +1 -0
  1127. package/dist/ui/kit/RenderBoundary.d.ts +68 -0
  1128. package/dist/ui/kit/RenderBoundary.d.ts.map +1 -0
  1129. package/dist/ui/kit/RowItem.d.ts +31 -0
  1130. package/dist/ui/kit/RowItem.d.ts.map +1 -0
  1131. package/dist/ui/kit/StatusStrip.d.ts +114 -0
  1132. package/dist/ui/kit/StatusStrip.d.ts.map +1 -0
  1133. package/dist/ui/kit/SystemMark.d.ts +32 -0
  1134. package/dist/ui/kit/SystemMark.d.ts.map +1 -0
  1135. package/dist/ui/kit/Truncated.d.ts +25 -0
  1136. package/dist/ui/kit/Truncated.d.ts.map +1 -0
  1137. package/dist/ui/kit/ViewExpansion.d.ts +89 -0
  1138. package/dist/ui/kit/ViewExpansion.d.ts.map +1 -0
  1139. package/dist/ui/kit/ViewSurface.d.ts +100 -0
  1140. package/dist/ui/kit/ViewSurface.d.ts.map +1 -0
  1141. package/dist/ui/kit/alerts.d.ts +60 -0
  1142. package/dist/ui/kit/alerts.d.ts.map +1 -0
  1143. package/dist/ui/kit/anchor.d.ts +16 -0
  1144. package/dist/ui/kit/anchor.d.ts.map +1 -0
  1145. package/dist/ui/kit/badges.d.ts +34 -0
  1146. package/dist/ui/kit/badges.d.ts.map +1 -0
  1147. package/dist/ui/kit/band.d.ts +49 -0
  1148. package/dist/ui/kit/band.d.ts.map +1 -0
  1149. package/dist/ui/kit/chartFailure.d.ts +19 -0
  1150. package/dist/ui/kit/chartFailure.d.ts.map +1 -0
  1151. package/dist/ui/kit/copyText.d.ts +13 -0
  1152. package/dist/ui/kit/copyText.d.ts.map +1 -0
  1153. package/dist/ui/kit/cspNonce.d.ts +19 -0
  1154. package/dist/ui/kit/cspNonce.d.ts.map +1 -0
  1155. package/dist/ui/kit/currency.d.ts +26 -0
  1156. package/dist/ui/kit/currency.d.ts.map +1 -0
  1157. package/dist/ui/kit/datePart.d.ts +11 -0
  1158. package/dist/ui/kit/datePart.d.ts.map +1 -0
  1159. package/dist/ui/kit/display.d.ts +293 -0
  1160. package/dist/ui/kit/display.d.ts.map +1 -0
  1161. package/dist/ui/kit/download.d.ts +29 -0
  1162. package/dist/ui/kit/download.d.ts.map +1 -0
  1163. package/dist/ui/kit/dragAnnounce.d.ts +51 -0
  1164. package/dist/ui/kit/dragAnnounce.d.ts.map +1 -0
  1165. package/dist/ui/kit/dragDrop.d.ts +36 -0
  1166. package/dist/ui/kit/dragDrop.d.ts.map +1 -0
  1167. package/dist/ui/kit/dragPlugins.d.ts +35 -0
  1168. package/dist/ui/kit/dragPlugins.d.ts.map +1 -0
  1169. package/dist/ui/kit/dragWording.d.ts +15 -0
  1170. package/dist/ui/kit/dragWording.d.ts.map +1 -0
  1171. package/dist/ui/kit/failureSink.d.ts +19 -0
  1172. package/dist/ui/kit/failureSink.d.ts.map +1 -0
  1173. package/dist/ui/kit/features.d.ts +38 -0
  1174. package/dist/ui/kit/features.d.ts.map +1 -0
  1175. package/dist/ui/kit/focus.d.ts +54 -0
  1176. package/dist/ui/kit/focus.d.ts.map +1 -0
  1177. package/dist/ui/kit/kinds.d.ts +54 -0
  1178. package/dist/ui/kit/kinds.d.ts.map +1 -0
  1179. package/dist/ui/kit/layout.d.ts +77 -0
  1180. package/dist/ui/kit/layout.d.ts.map +1 -0
  1181. package/dist/ui/kit/messages.d.ts +56 -0
  1182. package/dist/ui/kit/messages.d.ts.map +1 -0
  1183. package/dist/ui/kit/numbers.d.ts +53 -0
  1184. package/dist/ui/kit/numbers.d.ts.map +1 -0
  1185. package/dist/ui/kit/popups.d.ts +83 -0
  1186. package/dist/ui/kit/popups.d.ts.map +1 -0
  1187. package/dist/ui/kit/presets.d.ts +42 -0
  1188. package/dist/ui/kit/presets.d.ts.map +1 -0
  1189. package/dist/ui/kit/roving.d.ts +32 -0
  1190. package/dist/ui/kit/roving.d.ts.map +1 -0
  1191. package/dist/ui/kit/summary.d.ts +45 -0
  1192. package/dist/ui/kit/summary.d.ts.map +1 -0
  1193. package/dist/ui/kit/toolbar.d.ts +92 -0
  1194. package/dist/ui/kit/toolbar.d.ts.map +1 -0
  1195. package/dist/ui/kit/variants.d.ts +464 -0
  1196. package/dist/ui/kit/variants.d.ts.map +1 -0
  1197. package/dist/ui/lib/utils.d.ts +2 -0
  1198. package/dist/ui/lib/utils.d.ts.map +1 -0
  1199. package/dist/ui/manage/DeleteDialog.d.ts +32 -0
  1200. package/dist/ui/manage/DeleteDialog.d.ts.map +1 -0
  1201. package/dist/ui/manage/ViewManager.d.ts +24 -0
  1202. package/dist/ui/manage/ViewManager.d.ts.map +1 -0
  1203. package/dist/ui/manage/ViewManagerRow.d.ts +96 -0
  1204. package/dist/ui/manage/ViewManagerRow.d.ts.map +1 -0
  1205. package/dist/ui/manage/drag.d.ts +33 -0
  1206. package/dist/ui/manage/drag.d.ts.map +1 -0
  1207. package/dist/ui/messages/actions.d.ts +32 -0
  1208. package/dist/ui/messages/actions.d.ts.map +1 -0
  1209. package/dist/ui/messages/analysis.d.ts +684 -0
  1210. package/dist/ui/messages/analysis.d.ts.map +1 -0
  1211. package/dist/ui/messages/building.d.ts +62 -0
  1212. package/dist/ui/messages/building.d.ts.map +1 -0
  1213. package/dist/ui/messages/bulk.d.ts +27 -0
  1214. package/dist/ui/messages/bulk.d.ts.map +1 -0
  1215. package/dist/ui/messages/capabilities.d.ts +38 -0
  1216. package/dist/ui/messages/capabilities.d.ts.map +1 -0
  1217. package/dist/ui/messages/clicks.d.ts +84 -0
  1218. package/dist/ui/messages/clicks.d.ts.map +1 -0
  1219. package/dist/ui/messages/config.d.ts +12 -0
  1220. package/dist/ui/messages/config.d.ts.map +1 -0
  1221. package/dist/ui/messages/dashboard.d.ts +310 -0
  1222. package/dist/ui/messages/dashboard.d.ts.map +1 -0
  1223. package/dist/ui/messages/definition.d.ts +71 -0
  1224. package/dist/ui/messages/definition.d.ts.map +1 -0
  1225. package/dist/ui/messages/embed.d.ts +11 -0
  1226. package/dist/ui/messages/embed.d.ts.map +1 -0
  1227. package/dist/ui/messages/en.d.ts +2098 -0
  1228. package/dist/ui/messages/en.d.ts.map +1 -0
  1229. package/dist/ui/messages/export.d.ts +50 -0
  1230. package/dist/ui/messages/export.d.ts.map +1 -0
  1231. package/dist/ui/messages/filter.d.ts +263 -0
  1232. package/dist/ui/messages/filter.d.ts.map +1 -0
  1233. package/dist/ui/messages/filters.d.ts +78 -0
  1234. package/dist/ui/messages/filters.d.ts.map +1 -0
  1235. package/dist/ui/messages/header.d.ts +14 -0
  1236. package/dist/ui/messages/header.d.ts.map +1 -0
  1237. package/dist/ui/messages/manage.d.ts +35 -0
  1238. package/dist/ui/messages/manage.d.ts.map +1 -0
  1239. package/dist/ui/messages/record.d.ts +172 -0
  1240. package/dist/ui/messages/record.d.ts.map +1 -0
  1241. package/dist/ui/messages/refresh.d.ts +19 -0
  1242. package/dist/ui/messages/refresh.d.ts.map +1 -0
  1243. package/dist/ui/messages/render.d.ts +11 -0
  1244. package/dist/ui/messages/render.d.ts.map +1 -0
  1245. package/dist/ui/messages/reorder.d.ts +19 -0
  1246. package/dist/ui/messages/reorder.d.ts.map +1 -0
  1247. package/dist/ui/messages/save.d.ts +59 -0
  1248. package/dist/ui/messages/save.d.ts.map +1 -0
  1249. package/dist/ui/messages/scope.d.ts +28 -0
  1250. package/dist/ui/messages/scope.d.ts.map +1 -0
  1251. package/dist/ui/messages/status.d.ts +28 -0
  1252. package/dist/ui/messages/status.d.ts.map +1 -0
  1253. package/dist/ui/messages/view.d.ts +160 -0
  1254. package/dist/ui/messages/view.d.ts.map +1 -0
  1255. package/dist/ui/messages/workbench.d.ts +21 -0
  1256. package/dist/ui/messages/workbench.d.ts.map +1 -0
  1257. package/dist/ui/messages/zh-CN.d.ts +12 -0
  1258. package/dist/ui/messages/zh-CN.d.ts.map +1 -0
  1259. package/dist/ui/record/CardSettings.d.ts +34 -0
  1260. package/dist/ui/record/CardSettings.d.ts.map +1 -0
  1261. package/dist/ui/record/CardSummaries.d.ts +15 -0
  1262. package/dist/ui/record/CardSummaries.d.ts.map +1 -0
  1263. package/dist/ui/record/ColumnResizer.d.ts +67 -0
  1264. package/dist/ui/record/ColumnResizer.d.ts.map +1 -0
  1265. package/dist/ui/record/DetailStructure.d.ts +51 -0
  1266. package/dist/ui/record/DetailStructure.d.ts.map +1 -0
  1267. package/dist/ui/record/EmptyResult.d.ts +41 -0
  1268. package/dist/ui/record/EmptyResult.d.ts.map +1 -0
  1269. package/dist/ui/record/Filler.d.ts +47 -0
  1270. package/dist/ui/record/Filler.d.ts.map +1 -0
  1271. package/dist/ui/record/OffscreenSummary.d.ts +46 -0
  1272. package/dist/ui/record/OffscreenSummary.d.ts.map +1 -0
  1273. package/dist/ui/record/RecordCards.d.ts +53 -0
  1274. package/dist/ui/record/RecordCards.d.ts.map +1 -0
  1275. package/dist/ui/record/RecordDetail.d.ts +45 -0
  1276. package/dist/ui/record/RecordDetail.d.ts.map +1 -0
  1277. package/dist/ui/record/RecordPagination.d.ts +32 -0
  1278. package/dist/ui/record/RecordPagination.d.ts.map +1 -0
  1279. package/dist/ui/record/RecordTable.d.ts +118 -0
  1280. package/dist/ui/record/RecordTable.d.ts.map +1 -0
  1281. package/dist/ui/record/RowActions.d.ts +14 -0
  1282. package/dist/ui/record/RowActions.d.ts.map +1 -0
  1283. package/dist/ui/record/RowCheckbox.d.ts +30 -0
  1284. package/dist/ui/record/RowCheckbox.d.ts.map +1 -0
  1285. package/dist/ui/record/SelectionBar.d.ts +26 -0
  1286. package/dist/ui/record/SelectionBar.d.ts.map +1 -0
  1287. package/dist/ui/record/SkeletonCards.d.ts +11 -0
  1288. package/dist/ui/record/SkeletonCards.d.ts.map +1 -0
  1289. package/dist/ui/record/SkeletonRows.d.ts +33 -0
  1290. package/dist/ui/record/SkeletonRows.d.ts.map +1 -0
  1291. package/dist/ui/record/SortableHeader.d.ts +75 -0
  1292. package/dist/ui/record/SortableHeader.d.ts.map +1 -0
  1293. package/dist/ui/record/SummaryRows.d.ts +43 -0
  1294. package/dist/ui/record/SummaryRows.d.ts.map +1 -0
  1295. package/dist/ui/record/cells.d.ts +41 -0
  1296. package/dist/ui/record/cells.d.ts.map +1 -0
  1297. package/dist/ui/record/columns.d.ts +190 -0
  1298. package/dist/ui/record/columns.d.ts.map +1 -0
  1299. package/dist/ui/record/detailPlacement.d.ts +24 -0
  1300. package/dist/ui/record/detailPlacement.d.ts.map +1 -0
  1301. package/dist/ui/record/emptyWayOut.d.ts +59 -0
  1302. package/dist/ui/record/emptyWayOut.d.ts.map +1 -0
  1303. package/dist/ui/record/exportOffer.d.ts +47 -0
  1304. package/dist/ui/record/exportOffer.d.ts.map +1 -0
  1305. package/dist/ui/record/headerRoving.d.ts +57 -0
  1306. package/dist/ui/record/headerRoving.d.ts.map +1 -0
  1307. package/dist/ui/record/issueNames.d.ts +25 -0
  1308. package/dist/ui/record/issueNames.d.ts.map +1 -0
  1309. package/dist/ui/record/offscreenSummaries.d.ts +81 -0
  1310. package/dist/ui/record/offscreenSummaries.d.ts.map +1 -0
  1311. package/dist/ui/record/openRows.d.ts +43 -0
  1312. package/dist/ui/record/openRows.d.ts.map +1 -0
  1313. package/dist/ui/record/overflow.d.ts +39 -0
  1314. package/dist/ui/record/overflow.d.ts.map +1 -0
  1315. package/dist/ui/record/pinCap.d.ts +68 -0
  1316. package/dist/ui/record/pinCap.d.ts.map +1 -0
  1317. package/dist/ui/record/queryAnnouncement.d.ts +47 -0
  1318. package/dist/ui/record/queryAnnouncement.d.ts.map +1 -0
  1319. package/dist/ui/record/roomBelowRows.d.ts +24 -0
  1320. package/dist/ui/record/roomBelowRows.d.ts.map +1 -0
  1321. package/dist/ui/record/sticky.d.ts +227 -0
  1322. package/dist/ui/record/sticky.d.ts.map +1 -0
  1323. package/dist/ui/record/summaryText.d.ts +10 -0
  1324. package/dist/ui/record/summaryText.d.ts.map +1 -0
  1325. package/dist/ui/record/useOffscreenColumns.d.ts +36 -0
  1326. package/dist/ui/record/useOffscreenColumns.d.ts.map +1 -0
  1327. package/dist/ui/record/useSummaries.d.ts +31 -0
  1328. package/dist/ui/record/useSummaries.d.ts.map +1 -0
  1329. package/dist/ui/sort/SortSettings.d.ts +47 -0
  1330. package/dist/ui/sort/SortSettings.d.ts.map +1 -0
  1331. package/dist/ui/sort/drag.d.ts +53 -0
  1332. package/dist/ui/sort/drag.d.ts.map +1 -0
  1333. package/dist/ui/theme/brandDocs.d.ts +15 -0
  1334. package/dist/ui/theme/brandDocs.d.ts.map +1 -0
  1335. package/dist/ui/theme/densityDocs.d.ts +9 -0
  1336. package/dist/ui/theme/densityDocs.d.ts.map +1 -0
  1337. package/dist/ui/theme/pairs.d.ts +138 -0
  1338. package/dist/ui/theme/pairs.d.ts.map +1 -0
  1339. package/dist/ui/theme/stateDocs.d.ts +149 -0
  1340. package/dist/ui/theme/stateDocs.d.ts.map +1 -0
  1341. package/dist/ui/theme/tokenDocs.d.ts +25 -0
  1342. package/dist/ui/theme/tokenDocs.d.ts.map +1 -0
  1343. package/dist/ui/theme/tokens.d.ts +1526 -0
  1344. package/dist/ui/theme/tokens.d.ts.map +1 -0
  1345. package/dist/ui/viewNavigation.d.ts +39 -0
  1346. package/dist/ui/viewNavigation.d.ts.map +1 -0
  1347. package/dist/ui/workbench/AnalysisParts.d.ts +57 -0
  1348. package/dist/ui/workbench/AnalysisParts.d.ts.map +1 -0
  1349. package/dist/ui/workbench/ConditionBlock.d.ts +20 -0
  1350. package/dist/ui/workbench/ConditionBlock.d.ts.map +1 -0
  1351. package/dist/ui/workbench/ConflictConfirm.d.ts +21 -0
  1352. package/dist/ui/workbench/ConflictConfirm.d.ts.map +1 -0
  1353. package/dist/ui/workbench/EditorBand.d.ts +73 -0
  1354. package/dist/ui/workbench/EditorBand.d.ts.map +1 -0
  1355. package/dist/ui/workbench/LeaveGuard.d.ts +27 -0
  1356. package/dist/ui/workbench/LeaveGuard.d.ts.map +1 -0
  1357. package/dist/ui/workbench/NewView.d.ts +40 -0
  1358. package/dist/ui/workbench/NewView.d.ts.map +1 -0
  1359. package/dist/ui/workbench/NoViews.d.ts +22 -0
  1360. package/dist/ui/workbench/NoViews.d.ts.map +1 -0
  1361. package/dist/ui/workbench/OpeningSkeleton.d.ts +35 -0
  1362. package/dist/ui/workbench/OpeningSkeleton.d.ts.map +1 -0
  1363. package/dist/ui/workbench/OriginBar.d.ts +20 -0
  1364. package/dist/ui/workbench/OriginBar.d.ts.map +1 -0
  1365. package/dist/ui/workbench/RecordParts.d.ts +135 -0
  1366. package/dist/ui/workbench/RecordParts.d.ts.map +1 -0
  1367. package/dist/ui/workbench/RefreshControl.d.ts +70 -0
  1368. package/dist/ui/workbench/RefreshControl.d.ts.map +1 -0
  1369. package/dist/ui/workbench/ResultBlock.d.ts +88 -0
  1370. package/dist/ui/workbench/ResultBlock.d.ts.map +1 -0
  1371. package/dist/ui/workbench/ResultToolbar.d.ts +109 -0
  1372. package/dist/ui/workbench/ResultToolbar.d.ts.map +1 -0
  1373. package/dist/ui/workbench/SaveActions.d.ts +76 -0
  1374. package/dist/ui/workbench/SaveActions.d.ts.map +1 -0
  1375. package/dist/ui/workbench/SaveAsDialog.d.ts +66 -0
  1376. package/dist/ui/workbench/SaveAsDialog.d.ts.map +1 -0
  1377. package/dist/ui/workbench/SearchBox.d.ts +18 -0
  1378. package/dist/ui/workbench/SearchBox.d.ts.map +1 -0
  1379. package/dist/ui/workbench/Sidebar.d.ts +50 -0
  1380. package/dist/ui/workbench/Sidebar.d.ts.map +1 -0
  1381. package/dist/ui/workbench/StatusLine.d.ts +31 -0
  1382. package/dist/ui/workbench/StatusLine.d.ts.map +1 -0
  1383. package/dist/ui/workbench/TitleBar.d.ts +39 -0
  1384. package/dist/ui/workbench/TitleBar.d.ts.map +1 -0
  1385. package/dist/ui/workbench/Unopenable.d.ts +19 -0
  1386. package/dist/ui/workbench/Unopenable.d.ts.map +1 -0
  1387. package/dist/ui/workbench/ViewEngineProvider.d.ts +93 -0
  1388. package/dist/ui/workbench/ViewEngineProvider.d.ts.map +1 -0
  1389. package/dist/ui/workbench/ViewHeader.d.ts +123 -0
  1390. package/dist/ui/workbench/ViewHeader.d.ts.map +1 -0
  1391. package/dist/ui/workbench/ViewList.d.ts +71 -0
  1392. package/dist/ui/workbench/ViewList.d.ts.map +1 -0
  1393. package/dist/ui/workbench/ViewSwitcher.d.ts +49 -0
  1394. package/dist/ui/workbench/ViewSwitcher.d.ts.map +1 -0
  1395. package/dist/ui/workbench/WorkbenchShell.d.ts +291 -0
  1396. package/dist/ui/workbench/WorkbenchShell.d.ts.map +1 -0
  1397. package/dist/ui/workbench/WriteOutcome.d.ts +51 -0
  1398. package/dist/ui/workbench/WriteOutcome.d.ts.map +1 -0
  1399. package/dist/ui/workbench/address.d.ts +84 -0
  1400. package/dist/ui/workbench/address.d.ts.map +1 -0
  1401. package/dist/ui/workbench/bindings.d.ts +45 -0
  1402. package/dist/ui/workbench/bindings.d.ts.map +1 -0
  1403. package/dist/ui/workbench/configRemedy.d.ts +28 -0
  1404. package/dist/ui/workbench/configRemedy.d.ts.map +1 -0
  1405. package/dist/ui/workbench/describeConfig.d.ts +23 -0
  1406. package/dist/ui/workbench/describeConfig.d.ts.map +1 -0
  1407. package/dist/ui/workbench/panelsToFix.d.ts +43 -0
  1408. package/dist/ui/workbench/panelsToFix.d.ts.map +1 -0
  1409. package/dist/ui/workbench/parts.d.ts +33 -0
  1410. package/dist/ui/workbench/parts.d.ts.map +1 -0
  1411. package/dist/ui/workbench/useEditorFold.d.ts +26 -0
  1412. package/dist/ui/workbench/useEditorFold.d.ts.map +1 -0
  1413. package/dist/ui/workbench/useSidebarFold.d.ts +57 -0
  1414. package/dist/ui/workbench/useSidebarFold.d.ts.map +1 -0
  1415. package/dist/ui/workbench/useWorkbenchFolds.d.ts +44 -0
  1416. package/dist/ui/workbench/useWorkbenchFolds.d.ts.map +1 -0
  1417. package/dist/ui.js +43488 -0
  1418. package/dist/ui.js.map +1 -0
  1419. package/dist/viewRuntimeTypes-yK2rlUjK.js +5482 -0
  1420. package/dist/viewRuntimeTypes-yK2rlUjK.js.map +1 -0
  1421. package/package.json +168 -0
package/README.md ADDED
@@ -0,0 +1,1182 @@
1
+ # Wow View Engine
2
+
3
+ Released with Wow 9.2.0, from the same tag and with the same version.
4
+
5
+ > **Compatibility.** From 9.2.0 on, a patch release (`9.2.x`) never breaks the public surface: the exports of every entry, including the `ViewStore` port a backend implements; the CSS contract ([what is public](https://wow.ahoo.me/guide/typescript/view-engine-theming#what-is-public)); the message keys and issue codes; and the `wow-view-engine` command. A minor release may break it, and its release notes list every break with the steps to follow; keep the Wow packages on one minor, as [version ranges](https://wow.ahoo.me/guide/typescript/compatibility#version-ranges) explains. A break is a clean change, never a compatibility layer. Views users saved in an older form keep opening: the engine migrates stored configs on read. [docs/design/](https://github.com/Ahoo-Wang/Wow/tree/main/typescript/wow-view-engine/docs/design/) is the source of truth for the model, and this page describes the API as it is now.
6
+
7
+ **Wow View Engine is a data view engine for Wow-based business applications.** The application declares in code _how a dataset can be observed_: fields, kinds, operators, available dimensions and metrics. Users decide in the UI _how to observe it this time_: filters, columns, sorting, dimensions and metrics, charts, panel composition. The engine compiles that way of observing into Wow queries, runs them, renders the result, and saves the ways worth keeping so they can be reopened with one click.
8
+
9
+ It is the presentation layer on top of `@ahoo-wang/wow-client` and the successor of `@ahoo-wang/fetcher-viewer`.
10
+
11
+ ## The problem
12
+
13
+ Most pages in a business system are the same page: a list with filters, sorting and paging, sometimes with a chart. Every business object (orders, inventory, customers, tickets) gets its own copy. Every request from operations, "add one more filter", "break this down by warehouse", "put these tables on one overview page", means a code change, a sprint slot and a release.
14
+
15
+ The data did not change; only the way of observing it did. The problem is that the way of observing is hard-coded in page code: users cannot adjust it themselves, developers are consumed by repetition, and product treats every presentation tweak as a feature request.
16
+
17
+ ## Goals
18
+
19
+ - **For users.** Adjust scope, organization and presentation within declared capabilities, save the ways of observing that matter, and reopen them with one click.
20
+ - **For developers.** Integrate a business object once, one definition plus one query client, and stop writing pages for its list, analysis and overview views; filter editing, query coordination, result rendering, save and restore and conflict handling are provided once by the engine.
21
+ - **For evolution.** Adding a business object adds a definition, never a business branch inside the engine; custom layouts reuse the same behavior through headless hooks instead of copying logic.
22
+
23
+ ## Value
24
+
25
+ | For | What they get |
26
+ | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
27
+ | Business users | The view they need without waiting for a sprint; saved views open instantly; the same data as records, as metrics by dimension, or as an overview |
28
+ | Developers | List pages go from "one per object" to "one definition per object"; filtering, paging, sorting, saving and conflicts are implemented once; definitions can be generated from Wow metadata |
29
+ | Product | Presentation changes within the supported range become configuration, not requirements; "save and share views" ships as a product capability |
30
+
31
+ ## Scenarios
32
+
33
+ | Scenario | View | What the user does |
34
+ | ---------------------------------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
35
+ | Warehouse staff find today's pending orders | Record | Filter status = pending, sort by creation time, keep only the needed columns, save as "Pending today" |
36
+ | A manager compares backlog across warehouses | Analysis | Group by warehouse, count and sum amounts, switch to a bar chart |
37
+ | Operations review the week | Dashboard | Place both views on one panel page and constrain them with a global time range |
38
+ | A slice of data inside a business page | EmbeddedView, EmbeddedDashboard | A developer embeds a saved view into the order detail page, or a board into the customer page locked to that customer, without the workbench |
39
+ | Operators seed baseline views for a new object | System views | Declare "All", "Pending" and "New this week" in the definition; users open a usable view at once and save variants as needed |
40
+ | Customers build their own reports | All | Customers save and share views within their tenant; the vendor ships no release for it |
41
+
42
+ ## What it is not
43
+
44
+ Not a database or compute backend, not a permission system, not a general low-code page builder, not a BI modeling tool. Data, aggregation capabilities and authorization come from the business services; the engine only makes ways of observing run reliably.
45
+
46
+ ## Install
47
+
48
+ ```bash
49
+ pnpm add @ahoo-wang/fetcher @ahoo-wang/fetcher-decorator \
50
+ @ahoo-wang/fetcher-eventstream @ahoo-wang/wow-client @ahoo-wang/wow-view-engine
51
+ # the /react and /ui entries
52
+ pnpm add react react-dom
53
+ ```
54
+
55
+ The version follows Wow, so a minor release may contain breaking changes: keep the Wow packages on one minor with `save-prefix=~` or `--save-exact`, as [version ranges](https://wow.ahoo.me/guide/typescript/compatibility#version-ranges) explains.
56
+
57
+ Peer dependencies: `@ahoo-wang/wow-client` (and the fetcher packages it needs); `react` and `react-dom` only for the `/react` and `/ui` entries, `react-router` only for `/react-router`, and `mingo` only for `/testing`. The root entry runs in Node. To keep saved views on a Wow server, add [`@ahoo-wang/wow-view-store`](../wow-view-store/README.md). ES modules only; Node `>=22.12.0` or a current browser; TypeScript 6 or later.
58
+
59
+ ## Design principles
60
+
61
+ | Fact | Consequence |
62
+ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
63
+ | **Definitions are code.** | No definition service or definition versions. A definition change is a deploy; saved views are validated on open. |
64
+ | **Configs are data.** | The only persisted objects are `ViewInstance` and personal preferences. Consistency is optimistic revision + idempotent `requestId`. |
65
+ | **Runtime state is transient.** | Drafts, results, paging and selection live in one open `ViewRuntime` and are never persisted. |
66
+
67
+ ## Quick start
68
+
69
+ ### 1. Declare a definition
70
+
71
+ <!-- typecheck: file=orders.ts -->
72
+
73
+ ```ts
74
+ import type { ViewDefinition } from '@ahoo-wang/wow-view-engine';
75
+
76
+ export const orders: ViewDefinition = {
77
+ id: 'orders',
78
+ title: 'Orders',
79
+ kind: 'data',
80
+ source: 'orders',
81
+ fields: [
82
+ { name: 'id', label: 'Order', kind: 'string', sortable: true },
83
+ {
84
+ name: 'status',
85
+ label: 'Status',
86
+ kind: 'enum',
87
+ options: [
88
+ { value: 'PENDING', label: 'Pending' },
89
+ { value: 'SHIPPED', label: 'Shipped' },
90
+ ],
91
+ },
92
+ { name: 'warehouse', label: 'Warehouse', kind: 'string' },
93
+ {
94
+ name: 'amount',
95
+ label: 'Amount',
96
+ kind: 'number',
97
+ summary: ['SUM', 'AVG'],
98
+ },
99
+ { name: 'createdAt', label: 'Created', kind: 'datetime', sortable: true },
100
+ ],
101
+ // The row key must be sortable: every record query ends its sort on it,
102
+ // so rows that tie on the chosen sort never repeat or go missing across pages.
103
+ record: { rowKey: 'id', paging: 'paged', layouts: ['table', 'card'] },
104
+ // System views: baseline views configured by developers or operators.
105
+ // Deployed with the definition, visible to everyone, read-only, can be saved as.
106
+ views: [
107
+ {
108
+ id: 'pending',
109
+ title: 'Pending',
110
+ config: {
111
+ kind: 'record',
112
+ filter: {
113
+ op: 'and',
114
+ // `enum` is a closed set, so it offers IN and NOT_IN rather than EQ:
115
+ // one condition covers "any of these", and switching between the two
116
+ // keeps the selection.
117
+ children: [{ field: 'status', operator: 'IN', value: ['PENDING'] }],
118
+ },
119
+ filterMode: 'simple',
120
+ refresh: { interval: null },
121
+ sort: [{ field: 'createdAt', direction: 'DESC' }],
122
+ pageSize: 20,
123
+ summaries: [{ field: 'amount', fn: 'SUM' }],
124
+ layout: 'table',
125
+ table: {
126
+ columns: [
127
+ { field: 'id' },
128
+ { field: 'warehouse' },
129
+ { field: 'amount' },
130
+ ],
131
+ },
132
+ card: { title: 'id', fields: ['status', 'warehouse', 'amount'] },
133
+ },
134
+ },
135
+ ],
136
+ };
137
+ ```
138
+
139
+ ### Defining a view from the descriptor
140
+
141
+ A definition written by hand repeats what the service's query descriptor already says: which paths there are, what each holds, what it sorts, filters and aggregates by. `defineView(descriptor, spec)` takes those facts from a descriptor snapshot you commit beside the definition, and leaves `spec` only the choices: which fields a reader sees, in what order and under what words, the categories' wording and tone, the cells, and whatever you narrow. Its result is an ordinary `DataViewDefinition`, so nothing else in the engine knows how it was written.
142
+
143
+ <!-- typecheck-context
144
+ import type { QueryModelDescriptor } from '@ahoo-wang/wow-client';
145
+ declare const ordersDescriptor: QueryModelDescriptor;
146
+ -->
147
+
148
+ ```ts
149
+ import { defineView, text } from '@ahoo-wang/wow-view-engine';
150
+
151
+ export const orders = defineView(ordersDescriptor, {
152
+ id: 'orders',
153
+ source: 'orders',
154
+ title: text('orders.title'),
155
+ // What a board's time filter reaches its panels through.
156
+ timeField: 'createdAt',
157
+ fields: {
158
+ id: { label: text('orders.id'), cell: 'copyable', analysis: false },
159
+ status: {
160
+ label: text('orders.status'),
161
+ cell: 'status',
162
+ options: {
163
+ PENDING: { label: text('orders.pending'), tone: 'warning' },
164
+ SHIPPED: { label: text('orders.shipped'), tone: 'success' },
165
+ },
166
+ },
167
+ amount: { label: text('orders.amount'), summary: ['SUM'] },
168
+ createdAt: text('orders.createdAt'),
169
+ },
170
+ record: { layouts: ['table', 'card'] },
171
+ });
172
+ ```
173
+
174
+ - **Facts from the snapshot, capabilities from the source.** A field you do not list does not appear. Its kind, its values, its sensitivity and an array's entries are the model's facts, read from the snapshot; a path or a value it lacks is an admission error (`validateDefinition`, `onIssue`) — the definition still loads, and says where. What a path sorts, filters and aggregates by is the store's: where you narrow nothing the definition takes whatever the source it runs on grants (a search inside an array's entries on Elasticsearch, none on MongoDB), and where you narrow — `operators`, `sortable: false`, `summary`, `analysis` or `analysis: false` — your subset of that. A narrowing beyond the snapshot is a warning, since another store may grant it. A deprecated path warns until you give its reason; a sensitive one is kept out of analyses, a confidential one out of every comparison; a moment groups by the calendar and has an earliest and a latest.
175
+ - **The snapshot is committed.** The definition is built when the module loads, the same in a test. A source that answers a descriptor at run time fills what you left open from it and narrows the rest, as every definition is narrowed; one that answers none runs on the snapshot's capabilities.
176
+ - **Words are keys.** `text(key)` stands where a label goes, so one definition serves every language. The keys stay everywhere the engine keeps or hands anything: the definition, every view's state and snapshot, `list()`, what an editor is given and gives back, and the store — a view saved from a system view is saved with its keys, so it stays clean, and reverts, in whatever language comes next. They are said only where text is shown or leaves the engine — a cell, a header, a chart's option, an export, an accessible name, a title — in the words of the nearest `ViewHost`'s `messages`, else the ones `ViewEngineOptions.text` gives; so switching the language redraws what is open and reopens, re-queries and dirties nothing. A component of your own says them with `useSay()` from `/ui`, and code outside React with `say(label, words)`; `cellText` and `displayValue` say an option's label through their context's `say`, and a `renderCell` is handed raw values, keys included. An editor of your own shows a label in words and gives the key back where the words were left as shown: `keptKey(typed, original, say, shown)` when it commits a draft (`shown` is the words it opened on, so a language switch while it is open does not turn an untouched label into words), `useSaidText(value)` for a box that writes on every keystroke. The starting words reach what a `ViewHost`, a workbench or an embed draws; a `ViewSurface` of your own around parts, with no host above it, takes `engine={engine}` for them. Names the UI makes up — 「Copy of …」, a new tab's, a new analysis's — are words in the language in force when they are made, and stay so. A key the words lack reads as itself; the outermost `ViewHost` that names the engine reports it once per language (`definition.text.unknown`, or `definition.text.fallback` where the starting words filled it). A literal string is still a label.
177
+ - **Time.** `timeField` — or a system view's own, `null` for one read whole — is what a board's one date filter reaches a panel through when the panel has no wire to it; a wire written by hand wins, and `ignoresTime: true` on a panel keeps the range off it.
178
+ - `admit` from `/testing` checks all of it in a host's test ([Testing a host](#testing-a-host-an-in-memory-source)).
179
+
180
+ ### 2. Create an engine
181
+
182
+ <!-- typecheck-context
183
+ import { orders } from './orders';
184
+ import type { QueryApi } from '@ahoo-wang/wow-client';
185
+ declare const queryClients: Record<string, Pick<QueryApi<any>, 'paged' | 'cursor' | 'aggregate'>>;
186
+ -->
187
+
188
+ ```ts
189
+ import { MemoryViewStore, ViewEngine } from '@ahoo-wang/wow-view-engine';
190
+
191
+ const engine = new ViewEngine({
192
+ store: new MemoryViewStore(),
193
+ // Pick<QueryApi, 'paged' | 'cursor' | 'aggregate'> from @ahoo-wang/wow-client
194
+ resources: [{ definition: orders, source: queryClients.orders }],
195
+ });
196
+ ```
197
+
198
+ Each **resource** pairs a definition with where its rows come from. A board's definition has no source — it queries nothing of its own. Sources are found by the key a data definition names (`definition.source`), so two definitions over one query model share it; a data definition registered with no source anywhere is refused at registration (`definition.source.unregistered`), so its workbench says so and only the board panels over it are put out. Register every resource once, at the application's start: **one engine for the application**, whose pages share its queries, preferences and descriptors. The query queue makes room for a board by itself — an open board holds room for its panels on top of `maxQueuedQueries` — so a large board opens whole without raising the limit.
199
+
200
+ Findings with nothing thrown behind them — a definition's admission, what a descriptor took away — go to `onIssue`. Left out, a development build (`NODE_ENV` of `development`) prints them to the console, one collapsed group per resource, each with how to fix it; production and test runs stay silent.
201
+
202
+ **What the server admits: `describe`.** A definition is code and cannot know which store it is deployed on: a phrase search that works on Elasticsearch is refused by MongoDB without a text index, and a server whose query guard was raised admits more than the engine's defaults. Give the source a `describe` — wow-client's `describeSnapshot` (or `describeEventStream`) fits as it is — and the engine reads the server's capability descriptor before the first view over that source runs, narrows every definition to what the descriptor admits (an operator, a sort, a search, a group or a metric it does not list is not offered: hidden, not greyed out) and takes the source budgets (`maxPageSize`, `maxPageWindow`, `maxAnalysisRows`, `maxQueryFilterNodes`, `maxFilterValues`) from it; a query over the last two, counted on the compiled query as the server's guard counts it, is refused before it is sent. It checks the descriptor again, with the version it holds, on a refresh and when the page comes back, at most every five minutes. What narrowing took away is told to `onIssue`, once per descriptor version; where the descriptor contradicts the definition — a paging mode the source lacks, a row key it cannot sort, a time kept in another unit — the definition is refused as one failing admission is. Without `describe`, a view runs on the definition and the default limits as before.
203
+
204
+ <!-- typecheck-context
205
+ import { orders } from './orders';
206
+ import type { QueryApi, QueryDescriptorApi } from '@ahoo-wang/wow-client';
207
+ declare const snapshots: Pick<QueryApi<any>, 'paged' | 'cursor' | 'aggregate'>;
208
+ declare const descriptors: QueryDescriptorApi;
209
+ -->
210
+
211
+ ```ts
212
+ import { MemoryViewStore, ViewEngine } from '@ahoo-wang/wow-view-engine';
213
+
214
+ // factory.createSnapshotQueryClient() and factory.createQueryDescriptorClient():
215
+ // the schema route has no tenant or owner segment, so they are two clients.
216
+ const engine = new ViewEngine({
217
+ store: new MemoryViewStore(),
218
+ resources: [
219
+ {
220
+ definition: orders,
221
+ source: {
222
+ paged: snapshots.paged,
223
+ cursor: snapshots.cursor,
224
+ aggregate: snapshots.aggregate,
225
+ describe: descriptors.describeSnapshot,
226
+ },
227
+ },
228
+ ],
229
+ });
230
+ ```
231
+
232
+ `limits` lays your budgets over `DEFAULT_RUNTIME_LIMITS`: pass only what you change. A source budget you pass only lowers the descriptor's; spreading `DEFAULT_RUNTIME_LIMITS` into it would pin them at the defaults again.
233
+
234
+ **Give your fetcher a timeout.** `@ahoo-wang/fetcher` sets none by default, and the engine does not time a query out either: a server that takes the connection and never answers leaves a view opening for ever, and a few such queries hold every slot of the engine's queue (`maxConcurrentQueries`), so the other panels of a board never ask. Set one on the fetcher your sources and store use — `fetcher.timeout = 60_000`, or `new Fetcher({ timeout })` — and a query past it fails as any other does, with its retry. The only wait the engine bounds itself is the first read of a source's descriptor: past ten seconds the view opens on the definition as declared, as it does when the read fails, and the descriptor narrows it when it lands.
235
+
236
+ **Exported files neutralize formulas.** A CSV leaves the page and is opened in a spreadsheet, often by someone other than whoever exported it, so every export — a record view's rows and an analysis's **Export data…** — writes a cell whose text starts with `=`, `+`, `-`, `@`, a tab or a carriage return with a leading `'` (OWASP, CSV Injection), header labels included. A cell whose value is a number, and one whose text is a plain number such as `-12.5`, is left as it is: a spreadsheet reads it as a number, never as a formula. Where the file never reaches a spreadsheet, turn it off with `limits: { exportNeutralizeFormulas: false }`, or with `{ neutralizeFormulas: false }` when you call `serializeCsv` yourself.
237
+
238
+ **Hearing about failures.** A query, a store call, an export, a render, a chart or a declared action's command that fails is said on screen where it happens; for your logs or monitoring, give the environment an `onError`. It is told once per failure, with what was thrown as it was and where it happened; whatever it throws is dropped, and without it nothing is logged anywhere.
239
+
240
+ <!-- typecheck-context
241
+ import { orders } from './orders';
242
+ import type { QueryApi } from '@ahoo-wang/wow-client';
243
+ declare const queryClients: Record<string, Pick<QueryApi<any>, 'paged' | 'cursor' | 'aggregate'>>;
244
+ declare function sendToMonitoring(record: Record<string, unknown>): void;
245
+ -->
246
+
247
+ ```ts
248
+ import { MemoryViewStore, ViewEngine } from '@ahoo-wang/wow-view-engine';
249
+ import { browserRuntimeEnvironment } from '@ahoo-wang/wow-view-engine/react';
250
+
251
+ const engine = new ViewEngine({
252
+ store: new MemoryViewStore(),
253
+ resources: [{ definition: orders, source: queryClients.orders }],
254
+ // `defaultRuntimeEnvironment({ onError })` without React.
255
+ environment: browserRuntimeEnvironment({
256
+ onError: ({ kind, error, context }) =>
257
+ sendToMonitoring({ kind, error, ...context }),
258
+ }),
259
+ });
260
+ ```
261
+
262
+ | `kind` | Told when | `context.operation` |
263
+ | -------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
264
+ | `query` | A view's query failed, or one beside it: its summary row, an analysis's total, a condition's values | `query`, `summaries`, `totals`, `split`, `record`, `candidates` |
265
+ | `store` | A `ViewStore` call rejected: a list, an open, a write (each retry again, under one `requestId`) | the port's method: `list`, `get`, `create`, `save`, … |
266
+ | `export` | An export's rows could not be fetched, or its file could not be made or handed over | `fetch`, `deliver`, `image` |
267
+ | `render` | A part of a workbench or an embed threw while drawing — often your action slot | `render` |
268
+ | `chart` | The chart library did not load, or threw drawing | `load`, `draw` |
269
+ | `action` | A declared action's `run` (or a slot's command) threw on a record, or timed out — not a refusal | the action's `id`; `context.recordKey` is the record |
270
+
271
+ `context` also names the view where it is known — `definitionId`, `instanceId`, `runtimeId` — and, for `render` and `chart`, the `boundary`, the `panelId` and React's `componentStack`. A request called off (superseded by the next one, or cancelled) is not a failure and is not told. `onRenderFailure` on a workbench, a grid or an embed stays: it is that surface's own callback and receives the same `error`; `onError` is the whole engine's. `onIssue` on the engine is for findings with nothing thrown behind them, such as a definition's admission.
272
+
273
+ ### 3. Put the engine above your pages: `ViewHost`
274
+
275
+ `ViewHost` is the one thing a host writes around its pages. It is made of ports, each a bridge to something the host already has — the **data** (the engine, with its `resources` and `store`), the **router**, the **language**, the **theme**, and the **commands** on each resource (`bind`) — and your router, your i18n and your theme stay yours:
276
+
277
+ <!-- typecheck-context
278
+ import { ViewEngine } from '@ahoo-wang/wow-view-engine';
279
+ import type { ReactNode } from 'react';
280
+ declare const engine: ViewEngine;
281
+ declare const locale: string;
282
+ declare const ordersWords: Record<string, string>;
283
+ declare const orderActions: import('@ahoo-wang/wow-view-engine').RecordActions;
284
+ -->
285
+
286
+ ```tsx
287
+ import '@ahoo-wang/wow-view-engine/styles.css';
288
+ import '@ahoo-wang/wow-view-engine/themes/porcelain.css';
289
+ import { useReactRouter } from '@ahoo-wang/wow-view-engine/react-router';
290
+ import { bind, ViewHost } from '@ahoo-wang/wow-view-engine/ui';
291
+
292
+ const bindings = [
293
+ bind('orders', {
294
+ route: view => (view ? `/orders?view=${view}` : '/orders'),
295
+ reading: { title: row => `Order ${String(row.key)}` },
296
+ actions: orderActions,
297
+ }),
298
+ bind('overview', {
299
+ route: board => (board ? `/boards?view=${board}` : '/boards'),
300
+ }),
301
+ ];
302
+
303
+ export function Host({ children }: { children: ReactNode }) {
304
+ return (
305
+ <ViewHost
306
+ engine={engine}
307
+ router={useReactRouter()}
308
+ locale={locale}
309
+ messages={ordersWords}
310
+ bindings={bindings}
311
+ preset="porcelain"
312
+ rememberColorMode="my-app.color-mode"
313
+ >
314
+ {children}
315
+ </ViewHost>
316
+ );
317
+ }
318
+ ```
319
+
320
+ | Prop | Port | What it does |
321
+ | -------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
322
+ | `engine` | data | The application's engine, built once. The host that names it says its definitions' keys in its `messages` |
323
+ | `router` | router | Your router: `useReactRouter()` from `/react-router` (React Router is an optional peer only that entry loads), or the two members of `ViewRouter` over another |
324
+ | `locale`, `messages` | language | The language values show in, and wording merged over what is in force — the engine's own (`zhCN`, your rewording) and your definitions' keys alike; a change redraws every open view in place, the same runtimes, no query run again |
325
+ | `bindings` | commands | `bind(definitionId, { route, reading, actions, slots })`: `route(instanceId, target?)` is the path of the page that opens it (`instanceId` is `null` for a view nobody saved; there is no `target` where the engine asks for a link, as `useViewNavigation` does); `reading` is the record detail's options (`render`, `title`, `sections`); `actions` are your commands on its records, declared ([Integrating a host](#integrating-a-host-declared-actions)), and `slots` your own markup beside them — on its workbench, in its record detail and on every board's record panel over it |
326
+ | `theme`, `preset`, `brand` | theme | One of the [two paths](#theme-pick-one-of-two-paths) |
327
+ | `colorMode`, `rememberColorMode` | theme | Light or dark on `<html>`: `system` by default, followed live; `light` or `dark` to start pinned; `host` where you paint it yourself. `useColorMode()` gives your switch `{ mode, setMode }`, kept under the `localStorage` key you name |
328
+ | `navigate` | router | Every way off in your own hands rather than the router's: handed resolved through the target's `route` — `{ kind: 'route', path, state }` — or, for a URL and a resource with no route, as it came |
329
+
330
+ **With a router, the engine keeps the address.** Every way off a board or a view — **Open in the workbench**, a follow-up on a group, a panel's destination, the way back to a board — goes to the route of the resource it leads to, with what the page opens with as the history entry's state (`ViewRouteState`: the view handed over, a board's `filters` and `tab`); a path of yours goes through the router too, and another site opens apart. A `DataWorkbench` or `DashboardWorkbench` given no `instanceId` opens the address's `?view=` — a view of its own definition, so two on one page leave each other's alone — and writes the reader's pick back, a new entry per view; one given no `handOver` opens the view the entry holds; a board — a workbench's or an `EmbeddedDashboard` — given neither half of its filters' pair (`initialFilters`, `onFiltersChange`) or of its tab's reads them from the entry and keeps them there as the reader changes them, each board under its own, so several on one page each find theirs again. A bound resource's record detail follows `?id=`, unless its `reading` holds `open` itself. Your own props still win, each pair on its own. Another router is two members:
331
+
332
+ <!-- typecheck-context
333
+ type ViewRouter = import('@ahoo-wang/wow-view-engine/ui').ViewRouter;
334
+ declare const pathname: string;
335
+ declare const search: string;
336
+ declare const state: unknown;
337
+ declare function push(path: string, state: unknown, replace: boolean): void;
338
+ -->
339
+
340
+ ```ts
341
+ const router: ViewRouter = {
342
+ location: { pathname, search, state },
343
+ go: (path, options) => push(path, options?.state, options?.replace ?? false),
344
+ };
345
+ ```
346
+
347
+ Make it a new object whenever the location moves, and the same one while it does not — `useMemo` over the location's parts, as `useReactRouter` does: everything that reads the address reads it again when, and only when, the router object is new.
348
+
349
+ **Your navigation is data.** The engine draws views and leaves the page to you, so there is no page shell; `useViewNavigation()` gives your shell its places instead — each resource you bound a `route` to, in the order you registered them: `{ id, kind, title, path, current, views }`, `views` being its system views (a dashboard definition's system boards), each `{ id, title, path, current }`. The titles are said in the words in force, and `current` reads the router's address. Draw it with your own components — a shadcn `Sidebar`, a top bar — under whatever names you give your places:
350
+
351
+ <!-- typecheck: skip — Sidebar, SidebarMenu and Link are the host's own components -->
352
+
353
+ ```tsx
354
+ function AppSidebar() {
355
+ const places = useViewNavigation();
356
+ return (
357
+ <Sidebar>
358
+ <SidebarMenu>
359
+ {places.map(place => (
360
+ <SidebarMenuItem key={place.id}>
361
+ <SidebarMenuButton
362
+ isActive={place.current}
363
+ render={<Link to={place.path} />}
364
+ >
365
+ {place.title}
366
+ </SidebarMenuButton>
367
+ </SidebarMenuItem>
368
+ ))}
369
+ </SidebarMenu>
370
+ </Sidebar>
371
+ );
372
+ }
373
+ ```
374
+
375
+ A surface under it takes only what differs where it stands — `<DataWorkbench definitionId="orders" />`, `<EmbeddedDashboard instanceId="…" />`. Its own `engine`, `messages`, `locale`, `onNavigate` or `record` still win, and hosts nest, the inner one's bindings winning by id: a page with two engines is written as before. An engine's definitions speak the `messages` of the outermost host that names it — one engine speaks one language at a time — so an inner host in another language — naming the engine again at any depth, or naming none — rewords the engine's own messages under it, not the definitions' keys; two sibling hosts naming one engine must give it the same words. `EmbeddedView`'s `detail` reads records the bound way (`render`, `title`, `sections`) but holds its own open record: two embeds of one definition never open the same one, and never write the binding's `open`.
376
+
377
+ #### Integrating a host: declared actions
378
+
379
+ A command on a record is declared, not drawn. You say **what** — which commands a record takes, when, what a refusal says, whether to ask first and what to ask for; the engine does **where and how**:
380
+
381
+ | You declare | The engine does |
382
+ | -------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
383
+ | The commands, each `run` over your generated command client | Where they go: the primary one as a button in the row (and on the card), the rest behind the record's 「⋯」 menu, all of them over a selection and in the detail |
384
+ | When one is available (`available` returns `true` or the reason), and when that flips on its own (`changesAt`) | Disabled with the reason (a tooltip, the button's description, atop the menu); asked again when the rule said, with no timer of yours |
385
+ | Its words, its `tone`, whether to ask first (`confirm`), what it needs (`form`) | The question and the form (the condition editor's value controls), focus held inside, keyboard, and the start and end said aloud |
386
+ | When it is done: `run` resolves once the read model shows it | Over a selection: 「3 of 5 can take it」 with the refused and why, one press to pick only those; a few at a time, progress, stop, the outcome, a refresh after |
387
+
388
+ <!-- typecheck-context
389
+ declare const commands: {
390
+ ship(id: string): Promise<void>;
391
+ cancel(id: string): Promise<void>;
392
+ prioritize(id: string, priority: string): Promise<void>;
393
+ };
394
+ declare function holdOf(row: import('@ahoo-wang/wow-view-engine').RecordRow): number;
395
+ -->
396
+
397
+ ```ts
398
+ import { actions, text } from '@ahoo-wang/wow-view-engine';
399
+
400
+ export const orderActions = actions([
401
+ {
402
+ id: 'ship',
403
+ label: text('orders.ship'),
404
+ primary: true,
405
+ // `true`, or why not — a key, said in the reader's language.
406
+ available: (row, { now }) =>
407
+ holdOf(row) > now ? text('orders.onHold') : true,
408
+ // When that flips by itself; the engine asks again then.
409
+ changesAt: (row, { now }) => (holdOf(row) > now ? holdOf(row) + 1 : null),
410
+ // One order ships at a press; a selection is counted first.
411
+ confirm: { title: text('orders.shipTitle'), ask: 'bulk' },
412
+ run: row => commands.ship(String(row.key)),
413
+ },
414
+ {
415
+ id: 'cancel',
416
+ label: text('orders.cancel'),
417
+ tone: 'danger',
418
+ // `{count}` is how many it is for, with a `-one` key where a language says one apart.
419
+ confirm: {
420
+ title: text('orders.cancelTitle'),
421
+ body: text('orders.cancelBody'),
422
+ },
423
+ run: row => commands.cancel(String(row.key)),
424
+ },
425
+ {
426
+ id: 'priority',
427
+ label: text('orders.priority'),
428
+ // One field of options is a choice: its options are the menu's items.
429
+ form: {
430
+ priority: {
431
+ label: text('orders.priorityField'),
432
+ options: [
433
+ { value: 'HIGH', label: text('orders.high') },
434
+ { value: 'NORMAL', label: text('orders.normal') },
435
+ ],
436
+ },
437
+ },
438
+ // Asked with the option in hand: the one the order has is not offered.
439
+ available: (row, { input }) =>
440
+ input?.priority === row.data.priority
441
+ ? text('orders.samePriority')
442
+ : true,
443
+ run: (row, { priority }) =>
444
+ commands.prioritize(String(row.key), String(priority)),
445
+ },
446
+ ]);
447
+ ```
448
+
449
+ - **`run` resolves after the read model reflects the command.** The engine reads the view again right after, and a refresh that ran ahead of the command shows the old state. A Wow command waits for `CommandStage.SNAPSHOT` (`waitStrategy({ stage: CommandStage.SNAPSHOT })` as the request's headers), or the stage your projection needs. What it throws is read for the service's own reason.
450
+ - `run` takes one record; a selection is run a few at a time and stopped between records. There is no **runMany** until a command has a batch form.
451
+ - **Make each command idempotent** — send the aggregate version the row showed (`commandHeaders({ aggregateVersion })`, so a second send after the first took is refused as a conflict) and a request id the service deduplicates a retry by (`requestId`). A `run` that times out, is aborted or loses the network after sending has an outcome nobody knows: the engine reports it as 「outcome unknown, refresh to check first」 and lets go of those rows rather than leaving them selected for a blind rerun, but a reader who checks and presses again must not refund twice. `timeout: ms` on an action gives each record a deadline (past it the outcome is unknown); without one, Stop pressed a second time stops waiting. A record the action refused when its turn came is reported as not run, not as failed, and stays selected.
452
+ - `on: ['row', 'bulk', 'detail']` narrows where one is offered (every place by default); `hidden: row => …` leaves it off a record the reader may not act on, where `available` shows it disabled with why.
453
+ - A `form` of more than one field (or one without options) opens a form in the question: text, a number or yes/no, each field `required` unless it says `required: false`, `initial` for what it opens with; `run` gets the values by name.
454
+ - Every word is a key or plain words, said where it is shown (`text(key)`, [Wording and language](#wording-and-language)).
455
+ - **Slots are the escape hatch**, drawn after the declared actions: `slots: { row, bulk, global }` render your own markup — a link out, a control a declaration cannot say. A slot that sends a command anyway calls `run` on its context, so it reports on the surface's line: `row: ({ row, run, busy }) => …`, `run({ title, each: key => … })`.
456
+
457
+ Your tests read the declarations the way the engine does, without a screen — `actionHarness` from `/testing` ([Testing a host](#testing-a-host-an-in-memory-source)).
458
+
459
+ ### 3a. Render the default workbench
460
+
461
+ <!-- typecheck-context
462
+ import { ViewEngine } from '@ahoo-wang/wow-view-engine';
463
+ declare const engine: ViewEngine;
464
+ -->
465
+
466
+ ```tsx
467
+ import '@ahoo-wang/wow-view-engine/styles.css';
468
+ import { DataWorkbench } from '@ahoo-wang/wow-view-engine/ui';
469
+
470
+ export function OrdersPage() {
471
+ return <DataWorkbench engine={engine} definitionId="orders" />;
472
+ }
473
+ ```
474
+
475
+ The theme follows the host through a `.dark` class on any ancestor; pass `theme="light"` or `theme="dark"` to `ViewSurface` (or to a workbench or an embed) to pin one view, or `theme="system"` to follow the reader's `prefers-color-scheme`, live, on a page with no switch of its own. Popups portalled to `<body>` carry the mode the surface resolved, so the class does not have to sit on `<html>`. A preset is chosen the same way — see [Presets](https://wow.ahoo.me/guide/typescript/view-engine-theming#presets).
476
+
477
+ **Import order does not matter, and your classes work inside a surface.** `styles.css` may come before or after your own Tailwind stylesheet. Its utilities carry the prefix `fve:` (`fve:flex`, `fve:md:w-64`), so they never share a name with yours: our `fve:md:w-64` and your global `.w-full` are different rules in either order, and a breakpoint class of yours on your own markup inside a surface (`sm:grid-cols-3`) is weighed only against your own. The rest of the stylesheet — preflight, the base and the tokens — stays inside the two boundaries, at no extra weight (`scripts/verify-package.mjs` checks that every class it styles is prefixed and every other rule is scoped). The `fve:` utilities are the engine's own, not for your markup: the stylesheet holds one only while a component of the engine writes it. What is public is the tokens — see [What is public](https://wow.ahoo.me/guide/typescript/view-engine-theming#what-is-public).
478
+
479
+ #### A page that has its own `main`
480
+
481
+ A workbench's column is the page's `main` landmark, named after the open view: a workbench is usually what the page is for. If your page already has a `<main>` and the workbench sits inside it, two `main`s is one too many (axe `landmark-no-duplicate-main`, `landmark-main-is-top-level`), so say `landmark="region"` on `DataWorkbench` or `DashboardWorkbench`:
482
+
483
+ | Prop | Default | Renders |
484
+ | ---------- | -------- | --------------------------------------------------------------------------------------------------------------------------------- |
485
+ | `landmark` | `'main'` | `'main'`: `<main>` named after the open view. `'region'`: `<section>` with the same name — the definition's while no view is open |
486
+
487
+ The layout is the same either way: the stylesheet reads the column by an attribute of its own, never by its tag. That attribute, like every `data-slot`, is the engine's, not a selector for your stylesheet. Embeds draw no `main` at all and take no such prop.
488
+
489
+ <!-- typecheck-context
490
+ import { ViewEngine } from '@ahoo-wang/wow-view-engine';
491
+ declare const engine: ViewEngine;
492
+ import { DataWorkbench } from '@ahoo-wang/wow-view-engine/ui';
493
+ -->
494
+
495
+ ```tsx
496
+ export function OrdersPage() {
497
+ return (
498
+ <main>
499
+ <h1>Orders</h1>
500
+ <DataWorkbench engine={engine} definitionId="orders" landmark="region" />
501
+ </main>
502
+ );
503
+ }
504
+ ```
505
+
506
+ #### Which view is open, and your route
507
+
508
+ One data definition holds its record views and its analysis views, and `DataWorkbench` lists them together: the user switches between a table of orders and a chart of them as between any two views, and the "new view" button asks which kind to make. A host that wants a page of one kind narrows it — `viewKinds={['record']}` — and the other kind is neither listed nor openable there.
509
+
510
+ A view somebody opened is a link they can send, so both workbenches take `instanceId` and `onInstanceChange` — the two directions in and out of your router. `DataWorkbench` and `DashboardWorkbench` share the contract exactly. Under a `ViewHost` with a `router` you write neither: the workbench keeps the open view in the address's `?view=` itself. The props are for a host that keeps it elsewhere, or a page that decides more than the view (the console's failed executions narrow a view by a link's `?cluster=`).
511
+
512
+ <!-- typecheck-context
513
+ import { ViewEngine } from '@ahoo-wang/wow-view-engine';
514
+ declare const engine: ViewEngine;
515
+ import { DataWorkbench } from '@ahoo-wang/wow-view-engine/ui';
516
+ declare function useSearchParam(key: string): [string | null, (value: string | null) => void];
517
+ -->
518
+
519
+ ```tsx
520
+ export function OrdersPage() {
521
+ // Whatever your router gives you: a param, a search key, a hash.
522
+ const [view, setView] = useSearchParam('view');
523
+ return (
524
+ <DataWorkbench
525
+ engine={engine}
526
+ definitionId="orders"
527
+ instanceId={view}
528
+ onInstanceChange={setView}
529
+ />
530
+ );
531
+ }
532
+ ```
533
+
534
+ `instanceId` is controlled in the sense `value` is on an input:
535
+
536
+ - **left out** — the uncontrolled form: the workbench owns which view is open, starting from the user's effective default;
537
+ - **passed** — a view id, or `null` for that effective default: you say which view is open, and every later change of it opens what it names. `null` is a value, not the absence of one;
538
+ - `onInstanceChange(id)` reports what is open now, in the same vocabulary — `null` means the effective default there too — so what comes out goes straight back in.
539
+
540
+ It converges rather than renders. A view holds an unsaved draft, so a pushed value goes through the same leave guard a click on the sidebar goes through: whichever side moved last is the one that speaks, and the other follows. If the guard asks and the user stays, the workbench reports the view that stayed, so your route is never left naming a view that is not on screen. `examples/PlainRecordWorkbench.tsx` has the whole of it against `window.location.hash`, back button included.
541
+
542
+ #### Building a dashboard, and opening a panel's view
543
+
544
+ A dashboard is read until someone who may save it presses **Edit**: nothing on a board being read moves. Editing brings up a bar with **Undo** and **Redo**, **Add** (data: a saved view, or a new analysis the board owns; content: a heading, text, an image, links), **Add filter** (a board filter, then wired to the panels), **Cancel** and **Save**, and the tab bar under it adds, renames, reorders and deletes tabs — panels re-run as the board changes, and only **Save** saves it, through the same save the title bar has. A system dashboard is read-only and offers **Save as**.
545
+
546
+ Every way off the board goes through one route of yours, `onNavigate(to)` — the package never touches the address. Without it none of them exist:
547
+
548
+ - **Open in the workbench** in a panel's **⋯**: `{ kind: 'view', definitionId, instanceId, scopeFilter, filter, from }`, the saved view the panel shows, in that view's own field names. What is not the reader's — the board's fixed scope and what the page holds, a locked or hidden filter — is `scopeFilter`: the view runs under it as its scope, and nobody takes it off in the workbench. What the reader set on the board is `filter`: it becomes the view's own conditions, so the view opens **Edited**, each condition removable — taking them all off leaves the saved view, no longer **Edited** — and **Revert** taking them all off at once. A board's own analysis goes as `{ kind: 'unsaved', … }`, the reader's values among its conditions and the page's hold as its `scopeFilter`.
549
+ - **Pressing a group** — a bar, a slice, a row — opens the analysis view's follow-up menu (see these records, split the group, only this group). Each item is a view nobody saved: `{ kind: 'unsaved', definitionId, title, config, scopeFilter, named, from }`, the reader's values and the group already among its conditions, the page's hold its scope; `named` is what the title says of the group, so the workbench drops the group from the name once the reader takes it off.
550
+ - Every way off hands over the same way, and `from` is the way back: pass the target to `DataWorkbench`'s `handOver` prop (each new object opens once) along with the same `onNavigate`, and the workbench draws **Back to 〈board〉** under its title bar, which routes `{ kind: 'dashboard', definitionId, instanceId, filters, tab }` — the board as it was left. It asks first only if the reader changed the view beyond what the board handed over. Your host draws no back button of its own.
551
+ - **When clicked…** (while building): a panel can instead set a board filter from the group pressed (cross-filtering — no route needed; the other wired panels follow, the panel pressed marks the group, a second press clears it), or go to another saved view (`{ kind: 'view' }`, handed over as above, the group among its own conditions), another dashboard, or a page of yours (`{ kind: 'url', url }`, `{{field}}` filled with the group, encoded).
552
+ - **Another dashboard**: the author lists the target board's filters and maps each one to a dimension of the panel, to one of this board's filters of the same type, or leaves it out — nothing is matched by name. A press hands you `{ kind: 'dashboard', definitionId, instanceId, filters }`: `filters` is that board's `DashboardFilters`, each mapped filter holding the group's value or what this board's filter holds at the press, and every other one its default. Pass it to `DashboardWorkbench`'s `initialFilters` (or `ViewEngine.open`'s `filters`) — it is the reader's, never written into either board. A mapping gone stale (a filter or a dimension removed, the board deleted) warns on the panel, and a press opens the follow-up menu instead.
553
+
554
+ <!-- typecheck: skip — two JSX elements side by side, each an example on its own -->
555
+
556
+ ```tsx
557
+ <DashboardWorkbench
558
+ engine={engine}
559
+ definitionId="overview"
560
+ onNavigate={to => router.push(routeFor(to))}
561
+ />
562
+
563
+ <DataWorkbench
564
+ engine={engine}
565
+ definitionId={fromRoute.definitionId}
566
+ handOver={fromRoute}
567
+ onNavigate={to => router.push(routeFor(to))}
568
+ />
569
+ ```
570
+
571
+ `DashboardWorkbench`, `EmbeddedDashboard` and `EmbeddedView` take the same prop.
572
+
573
+ #### Embedding a view or a dashboard
574
+
575
+ A business page that shows what somebody already decided embeds it: the result and nothing else, no view list, no condition editor, no save. **An embed never writes**: not a view, not a board, not a preference — what a reader does on it lasts for that viewing. Defining views, building boards and saving them happen in the workbenches; a page whose readers should build boards embeds `DashboardWorkbench` instead. There are two entries, split by resource as the workbenches are — `EmbeddedView` for a record or analysis view, `EmbeddedDashboard` for a board. Each draws only its own kind, and says so if handed the other.
576
+
577
+ <!-- typecheck: skip — two JSX elements side by side, each an example on its own -->
578
+
579
+ ```tsx
580
+ import {
581
+ EmbeddedDashboard,
582
+ EmbeddedView,
583
+ } from '@ahoo-wang/wow-view-engine/ui';
584
+
585
+ // An order page: this customer's recent shipments, read as saved.
586
+ <EmbeddedView
587
+ engine={engine}
588
+ instanceId="orders-pending"
589
+ scopeFilter={{
590
+ op: 'and',
591
+ children: [{ field: 'customer', operator: 'IN', value: [customerId] }],
592
+ }}
593
+ />
594
+
595
+ // A customer page: the customer's board, locked to them; the time is the reader's.
596
+ <EmbeddedDashboard
597
+ engine={engine}
598
+ instanceId="customer-board"
599
+ interaction="interactive"
600
+ filterModes={{ customer: 'locked' }}
601
+ pageValues={{
602
+ values: { customer: { items: [{ id: customerId, label: customerName }] } },
603
+ }}
604
+ initialFilters={readFromAddress()}
605
+ onFiltersChange={writeToAddress}
606
+ onNavigate={to => router.push(routeFor(to))}
607
+ />
608
+ ```
609
+
610
+ **How far a reader may go is one explicit tier**, `interaction`, `static` by default. Neither tier saves anything:
611
+
612
+ | Tier | `EmbeddedView` (record, analysis) | `EmbeddedDashboard` |
613
+ | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
614
+ | `static` | The result and what it was fetched under. Headers do not sort or resize, there are no pages, nothing leads anywhere | The panels, answering nothing: no follow-up menu, no cross-filtering, no **⋯**; every filter reads as what it holds, with no control |
615
+ | `interactive` | Header sort, column widths and pages; an analysis's table|chart switch and the follow-up menu on a group; **Open in the workbench**; **Fill the screen** where `expandable` is on | Filters (a search filter too), the follow-up menu, cross-filtering, destinations, **Open in the workbench**; **Fill the screen** where `expandable` is on |
616
+
617
+ Every way off the embed goes through your one route, `onNavigate(to)` — the same `ViewNavigation` the dashboard workbench hands over; without it, none of those ways exist.
618
+
619
+ **The switches** — each absent, not greyed, when off. The tier is the ceiling and a switch opts in within it: search, export, a record's detail and fill-the-screen are reader controls, so they have no effect in the static tier:
620
+
621
+ | Prop | Default | What it does |
622
+ | ----------------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
623
+ | `withTitle` | off | Draws the view's or board's title |
624
+ | `headingLevel` | `2` | The heading level the embed titles at: its own title, and a board's panels one level under it (or at it, with no title). Your page owns its `h1` |
625
+ | `withPanelTitles` (dashboard) | on | Off, each panel's title is kept for screen readers only |
626
+ | `withSearch` (record) | off | The view's search box, where its definition declares a search field; interactive tier only |
627
+ | `withExport` (record) | off | The export button and window, rows picked with it; interactive tier only |
628
+ | `detail` (record) | off | A row opens the record's detail, read whole and read-only — no row commands, nothing written; `true` (read as the definition's binding's `reading` says, where there is one), or the workbench's `record.detail` options (`open`/`onOpenChange`, your `sections`). Inside a drawer it opens as a nested sheet: Escape closes it alone, focus goes back to the row. Interactive tier only |
629
+ | `withExport` (dashboard) | off | **Export data…** in a panel's "⋯" menu, the same export window; interactive tier only |
630
+ | `autoRefresh` | on | Refreshes on the interval its author saved; off, never on its own |
631
+ | `withRefresh` (dashboard) | off | **Updated 10:32** in the first row — when the panels on screen were read, the earliest of them — and, in the interactive tier, the refresh button beside it (no interval menu); refreshing writes nothing |
632
+ | `caption` (dashboard) | none | What the board's numbers are read as (a `ReactNode`, e.g. "cards read Sep 21 (yesterday), vs the day before"): never drawn on the page, where the host draws it by its own title; drawn under the board's title while it fills the screen, when the board also titles itself even with `withTitle` off (D70) |
633
+ | `openInWorkbench` | on | Whether **Open in the workbench** is offered in the interactive tier |
634
+ | `expandable` | off | **Fill the screen** at the end of the embed's first row, in the interactive tier: the surface fills the screen in place, as a workbench's does; Escape puts it back |
635
+ | `size` | `content` | `content` sizes to what it shows, with a cap (a record or analysis table scrolls inside `--fve-record-table-max-h`); `fill` fills its container — a whole-page embed, a wall screen |
636
+
637
+ **A board's filters, each in one of three modes** (`filterModes`, by filter name; `groupingMode` for the time grouping): `adjustable` — on the bar, the reader's to adjust for this viewing, as in the workbench, and the default; `locked` — on the bar as what it holds, with a lock and no control; `hidden` — not on the bar, still narrowing the panels wired to it. Locked and hidden filters are held by the runtime, so nothing the reader does — a value, **Clear**, a press that cross-filters — changes them. Their values are the page's own, `pageValues` (their default where it names none): in force from the first query, and followed as the prop changes — a customer page moving to the next customer takes the board with it. The reader's filters are your address's, `initialFilters` and `onFiltersChange`, read and reported exactly as `DashboardWorkbench` does. **A locked or hidden value never travels through the address**: an entry for one in `initialFilters` is ignored, and `onFiltersChange` reports only the filters the reader can set — otherwise a reader who edits the address changes the customer, the opposite of locking it. A board takes no condition tree (`EmbeddedDashboard` has no `scopeFilter`): to narrow it, declare the filter on the board and lock or hide it.
638
+
639
+ **Your commands on a board's record panels** come from what you bound to the definition the panel's view is over (`bind(definitionId, { actions, slots })` on the `ViewHost`), on `EmbeddedDashboard` and `DashboardWorkbench` alike: the same declared `actions` a record workbench takes — a record's, drawn in both tiers, and a selection's, drawn only where rows can be picked (the interactive tier) — with the run's progress and outcome above the panel's rows; after a command the whole board is read again. They are your commands against your service: the embed still writes nothing. A record panel also says how many rows its query matched, with the pages in the interactive tier.
640
+
641
+ **Locking is not a security boundary.** The condition a page locks is put together in the browser and sent with the query; it only keeps the reader from changing it on screen, or seeing anything else there. Anyone who edits the page's script or calls the API directly can ask for another customer. Tenancy, ownership and permission must be enforced by the Wow backend — above all on a page outside your organisation. This package is a library in your host's process: it does not do what Metabase does with iframes, signed tokens or SSO, because identity and permission belong to your host and your backend.
642
+
643
+ Filling the screen: with `expandable` on, an interactive embed draws the control itself. To put it in your own chrome instead — or to fill the screen with a static wall screen — pass a `ref` and point `useViewExpansion` at it.
644
+
645
+ #### Theme: pick one of two paths
646
+
647
+ > **Already switching light and dark yourself** (next-themes, a `.dark` toggle of your own)? Write **`colorMode="host"`** on `ViewHost`. Left at its default, the engine paints `<html>`'s `.dark` too, and the two fight over it.
648
+
649
+ Import `styles.css`, then make one choice on `ViewHost`:
650
+
651
+ | Path | For | Write | The engine |
652
+ | ---------------------- | --------------------------------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
653
+ | The engine follows you | A host with a shadcn theme (Tailwind v4) | `theme="host"`, and import `shadcn-bridge.css` | Reads your shadcn tokens into its own; keeps its own `input`, `ring`, status and chart colours, for their contrast |
654
+ | You follow the engine | A host with no theme, or happy to wear the engine's | `preset="porcelain"` (import `themes/porcelain.css`), optionally `brand="#1d4ed8"` | Names the preset and your brand on `<html>`, and lends your own chrome the same shadcn names through `fve-tokens` |
655
+
656
+ ```ts
657
+ import '@ahoo-wang/wow-view-engine/styles.css';
658
+ // The engine follows you:
659
+ import '@ahoo-wang/wow-view-engine/shadcn-bridge.css';
660
+ // …or you follow the engine:
661
+ // import '@ahoo-wang/wow-view-engine/themes/porcelain.css';
662
+ ```
663
+
664
+ **Light and dark are `ViewHost`'s.** `colorMode="system"`, the default, paints `<html>`'s `.dark` and `color-scheme` before the first paint and follows the system; `light` or `dark` start pinned; `rememberColorMode` keeps the reader's pick, made through `useColorMode()`; `host`, as above, follows yours. `theme="light"`, `"dark"` or `"system"` on a surface still pins that one view. Dark values of your own are `--fve-dark-*`, not `--fve-*` under `.dark`: a view pinned light on a dark page would inherit those.
665
+
666
+ **Your own chrome** wears the theme with `className="fve-tokens"` on the shell that uses it — not on `<body>`: the boundary brings a preflight — and on the portal of each popup of your own, which leaves the shell for `<body>` (`<Menu.Portal className="fve-tokens">`). Inside it, your own classes read the theme's tokens under their shadcn names (`bg-card` mapped to `var(--card)`); the engine's `fve:` utilities are not public ([What is public](https://wow.ahoo.me/guide/typescript/view-engine-theming#what-is-public)).
667
+
668
+ Everything else — one `--fve-*` override and the full token table, `tokens` on one surface, the presets one by one, a brand's bounds, roles and links, density, the rise and fall colours, the bridge's fine print, what an override owes, and `theme-check` for your CI — is in the guide, [Theming the view engine](https://wow.ahoo.me/guide/typescript/view-engine-theming).
669
+
670
+ #### What a workbench does hand over: the reading of a value
671
+
672
+ `/ui` exports no components of its own to build chrome from, but it does export what it reads a value _with_, so customising one cell never costs the whole workbench. `renderCell` overrides the column you care about and `cellValue` draws the rest exactly as the default does — enum labels from the definition's options, times on the surface's clock, numbers in the field's `numberFormat`:
673
+
674
+ <!-- typecheck-context
675
+ import { ViewEngine } from '@ahoo-wang/wow-view-engine';
676
+ declare const engine: ViewEngine;
677
+ declare function OrderStatusLamp(props: { status: string }): React.ReactNode;
678
+ -->
679
+
680
+ ```tsx
681
+ import {
682
+ DataWorkbench,
683
+ cellValue,
684
+ useSurfaceDisplay,
685
+ useViewMessages,
686
+ } from '@ahoo-wang/wow-view-engine/ui';
687
+ import type { RecordCell } from '@ahoo-wang/wow-view-engine/ui';
688
+
689
+ function OrderCell({ cell }: { cell: RecordCell }) {
690
+ // Read off the surface the cell is inside: the wording in force, and the
691
+ // language and time zone its values show in.
692
+ const messages = useViewMessages();
693
+ const display = useSurfaceDisplay();
694
+ if (cell.column.field !== 'status') {
695
+ return cellValue(cell.value, cell.column, messages, display, 'table');
696
+ }
697
+ return <OrderStatusLamp status={String(cell.value)} />;
698
+ }
699
+
700
+ <DataWorkbench
701
+ engine={engine}
702
+ definitionId="orders"
703
+ // What you say about the record views — how a cell reads, whether rows
704
+ // can be picked, what an empty result says — is one object, because none
705
+ // of it means anything to an analysis view.
706
+ record={{
707
+ renderCell: cell => <OrderCell cell={cell} />,
708
+ selectable: false,
709
+ emptyTitle: 'Nothing is waiting to ship',
710
+ }}
711
+ // Every control is there by default; one turned off is absent, not
712
+ // disabled. What a user may do is the store's permissions, separately.
713
+ features={{ export: false }}
714
+ />;
715
+ ```
716
+
717
+ `cellText` is the same reading as one line of text — for a CSV, a copied selection, a `title` — and `displayValue` is the field kind's reading alone, `undefined` where the kind has nothing to add and your own rendering stands.
718
+
719
+ #### The record detail: your sections, and the record in your address
720
+
721
+ A press on a row (or Enter on it) opens the record whole in a side panel, laid out by the definition's field groups. `record.detail` lets you add to it and hold it:
722
+
723
+ - **`sections(context)`** returns your own sections for the record open — each an `id`, a `title` and a `render()` — beside the engine's. `placement` puts one at the `'start'`, at the `'end'` (the default) or `{ after: '<field group id>' }`. `render` is called only while the record is on screen, so an `EmbeddedView` in a section reads its data when the reader opens the record; each section is its own labelled region, drawn inside a render boundary of its own (`'detail'`). The context carries the `row` (the page's row until the whole record has come, `complete` from then on), the `runtime` and `refresh`, as a row action's does. A section that shows a definition field its own way names it in `fields` (`fields: ['state.error.stackTrace']`): the engine's groups leave that field out, so the record does not read it twice, and a group left empty is not drawn.
724
+ - **`render(context)`** reads the record your way instead: whatever it returns is the whole body, in place of the definition's groups and your `sections` — for a record that answers one question (why did this fail, and will trying again help) better told in a layout of its own than as fields. The panel stays the engine's: it opens at once from the row, reads the record whole, says when it is gone, refused or unreadable, carries the row's commands, focus and the way back. Same context, same render boundary. **`title(row)`** names the record in the header in place of its key, which then stands above the name.
725
+ - **`open` / `onOpenChange`** hold which record is open, the way `instanceId` / `onInstanceChange` hold the open view — under a `ViewHost` with a `router`, a bound resource's detail holds it in the address's `?id=` already, and this is for a host that keeps it elsewhere: leave `open` out and the workbench owns it; pass a key (or `null`) and every value opens what it names — a record on another page too, which is read on its own (`runtime.fetchRecord`, within the injected scope only) with its own reading, not-there, not-permitted (HTTP 401/403) and failed-with-retry states. A press and a close only ask, through `onOpenChange`, which is told in either mode.
726
+
727
+ <!-- typecheck-context
728
+ import { ViewEngine } from '@ahoo-wang/wow-view-engine';
729
+ import { DataWorkbench, EmbeddedView } from '@ahoo-wang/wow-view-engine/ui';
730
+ declare const engine: ViewEngine;
731
+ declare const params: URLSearchParams;
732
+ declare function setId(id: string | null): void;
733
+ declare function RetryForm(props: { id: string }): React.ReactNode;
734
+ -->
735
+
736
+ ```tsx
737
+ <DataWorkbench
738
+ engine={engine}
739
+ definitionId="failures"
740
+ record={{
741
+ detail: {
742
+ // `?id=` opens that record, and opening or closing one writes it back.
743
+ open: params.get('id'),
744
+ onOpenChange: key => setId(key === null ? null : String(key)),
745
+ sections: ({ row }) => [
746
+ {
747
+ id: 'retry',
748
+ title: 'Execution context',
749
+ placement: 'start',
750
+ render: () => <RetryForm id={String(row.key)} />,
751
+ },
752
+ {
753
+ id: 'history',
754
+ title: 'Execution history',
755
+ render: () => (
756
+ <EmbeddedView
757
+ engine={engine}
758
+ instanceId="execution-history"
759
+ interaction="interactive"
760
+ scopeFilter={{
761
+ op: 'and',
762
+ children: [
763
+ { field: 'aggregateId', operator: 'EQ', value: row.key },
764
+ ],
765
+ }}
766
+ />
767
+ ),
768
+ },
769
+ ],
770
+ },
771
+ }}
772
+ />
773
+ ```
774
+
775
+ **Surfaces do not nest.** A root inside a root is unsupported: CSS has no nearest-ancestor selector, so an inner surface pinned to the opposite mode redeclares its own tokens but still takes the outer root's `dark:` utilities — light tokens under dark utilities, which nothing can render. Reach for `fve-tokens` instead of a second surface.
776
+
777
+ ### 3b. Or compose your own UI
778
+
779
+ <!-- typecheck-context
780
+ import { ViewEngine } from '@ahoo-wang/wow-view-engine';
781
+ declare const engine: ViewEngine;
782
+ declare function Spinner(): React.ReactNode;
783
+ declare function NotFound(): React.ReactNode;
784
+ declare function OrdersLayout(props: Record<string, unknown>): React.ReactNode;
785
+ -->
786
+
787
+ ```tsx
788
+ import { isRecordRuntime } from '@ahoo-wang/wow-view-engine';
789
+ import type { RecordViewRuntime } from '@ahoo-wang/wow-view-engine';
790
+ import {
791
+ useOpenView,
792
+ useViewRuntime,
793
+ useFilterEditor,
794
+ useRecordTable,
795
+ } from '@ahoo-wang/wow-view-engine/react';
796
+
797
+ export function OrdersPage({ instanceId }: { instanceId: string }) {
798
+ const { runtime, loading } = useOpenView(engine, instanceId);
799
+ if (!runtime) return loading ? <Spinner /> : <NotFound />;
800
+ // The id may name an analysis view or a dashboard; this page draws records.
801
+ if (runtime.kind !== 'record' || !isRecordRuntime(runtime))
802
+ return <NotFound />;
803
+ return <OrdersView runtime={runtime} />;
804
+ }
805
+
806
+ function OrdersView({ runtime }: { runtime: RecordViewRuntime }) {
807
+ const state = useViewRuntime(runtime); // draft, applied, result, issues, dirty
808
+ const filter = useFilterEditor(runtime); // nodes, add/remove/edit, apply
809
+ const table = useRecordTable(runtime); // columns, sort, selection, paging
810
+ // Render any layout from these controllers. No engine internals required.
811
+ return <OrdersLayout state={state} filter={filter} table={table} />;
812
+ }
813
+ ```
814
+
815
+ ### Core only, no React
816
+
817
+ <!-- typecheck-context
818
+ import { orders } from './orders';
819
+ import type { QueryApi } from '@ahoo-wang/wow-client';
820
+ import type { RecordViewConfig } from '@ahoo-wang/wow-view-engine';
821
+ declare const config: RecordViewConfig;
822
+ declare const source: QueryApi<any>;
823
+ -->
824
+
825
+ ```ts
826
+ import {
827
+ builtinFieldKinds,
828
+ compileRecord,
829
+ projectRecord,
830
+ validateRecord,
831
+ } from '@ahoo-wang/wow-view-engine';
832
+
833
+ // The kernels take a data definition; `orders` is one.
834
+ if (orders.kind !== 'data') throw new Error('orders is a data definition');
835
+ const issues = validateRecord(orders, config, builtinFieldKinds);
836
+ if (issues.some(i => i.severity === 'error')) throw new Error('invalid config');
837
+
838
+ const query = compileRecord(
839
+ orders,
840
+ config,
841
+ builtinFieldKinds,
842
+ { now: new Date(), timeZone: 'Asia/Shanghai' },
843
+ { index: 1 }, // Wow pages start at 1
844
+ );
845
+ const page = await source.paged(query);
846
+ const view = projectRecord(orders, config, page);
847
+ ```
848
+
849
+ ## Testing a host: an in-memory source
850
+
851
+ A host's own tests — a page that opens a view, a board, a demo without a backend — need a source that answers the queries the engine really sends. `@ahoo-wang/wow-view-engine/testing` has one: `memorySource(documents, options?)` is a `ViewSource` over JSON documents held in memory that filters, sorts, pages, projects and aggregates the way a Wow service over MongoDB does. Its answers are held to the server's own semantics — the `FilterSemantics` matrix in `wow-tck` and the aggregation cases of the query TCK — by this package's suites, so a test sees the engine's query answered as production answers it, not a canned result that shows rows the filter excludes.
852
+
853
+ <!-- typecheck-context
854
+ import { orders } from './orders';
855
+ -->
856
+
857
+ ```ts
858
+ import { FilterOperator } from '@ahoo-wang/wow-client';
859
+ import { MemoryViewStore, ViewEngine } from '@ahoo-wang/wow-view-engine';
860
+ import { matches, memorySource } from '@ahoo-wang/wow-view-engine/testing';
861
+
862
+ // Snapshots as the service returns them: the envelope, `state`, epoch-ms times.
863
+ const documents = [
864
+ {
865
+ aggregateId: 'O-1',
866
+ eventTime: 1_790_000_000_000,
867
+ state: { status: 'PAID', total: 120 },
868
+ },
869
+ {
870
+ aggregateId: 'O-2',
871
+ eventTime: 1_790_000_060_000,
872
+ state: { status: 'CANCELLED', total: 80 },
873
+ },
874
+ ];
875
+ const source = memorySource(documents, {
876
+ // The clock BEFORE_NOW / AFTER_NOW compare against: pin it with the page's.
877
+ now: () => Date.parse('2026-09-27T00:00:00Z'),
878
+ });
879
+ const engine = new ViewEngine({
880
+ resources: [{ definition: orders, source }],
881
+ store: new MemoryViewStore(),
882
+ });
883
+
884
+ // A test's own condition, asked of one document the same way.
885
+ const paid = matches(documents[0], {
886
+ op: FilterOperator.EQ,
887
+ field: 'state.status',
888
+ value: 'PAID',
889
+ });
890
+ ```
891
+
892
+ What it promises: every filter operator the engine compiles, with MongoDB's treatment of a missing field, an explicit `null`, an empty string or array, array elements and case; `DELETION` over a `deleted` flag (a document with `deleted: true` is left out unless the filter asks); paging, cursor (an offset) and sort; projection; and aggregation — `elements` (paths and gate filters relative to the element), `TERMS`, `HISTOGRAM`, `DATE_HISTOGRAM` and `DATE_PART` in a zone (UTC by default), `dense`, every metric with its own filter, `DERIVED`, `having`, the order Wow gives groups (the sort, then each group alias ascending) and its default `limit` of 100. `PERCENTILE` is exact, where a server's is an estimate between the same two ranks. What it has no reading of — `ID`, `TENANT_ID`, `SPACE_ID`, the calendar filters the engine never sends — is refused with an error, so a query a test starts to send fails instead of getting a plausible wrong answer. `timeField` keeps a large set in the order of one epoch-ms column and cuts a range on it by binary search; `remember` answers a repeated aggregation from memory, for documents that never change. The entry is headless — no React, no DOM, no stylesheet. It evaluates filters with `mingo`, MongoDB's query language in JavaScript, which is an optional peer dependency: the package does not install it for you, so a host that imports `/testing` adds it to its own dev dependencies — `pnpm add -D mingo` (or `npm install -D mingo`). No other entry loads it.
893
+
894
+ `admit(definitions, descriptors, { text })` admits everything a host declares as the engine would — each definition's keys said, its own rules, its boards against every other definition, and each data definition narrowed to its committed descriptor (by `source`) — and returns every finding with the definition it is about, `[]` when all of it holds. It takes definitions, or resources holding one (`{ definition }`), as they are registered:
895
+
896
+ <!-- typecheck-context
897
+ import type { QueryModelDescriptor } from '@ahoo-wang/wow-client';
898
+ import type { DataViewDefinition, DashboardDefinition, TextResolver } from '@ahoo-wang/wow-view-engine';
899
+ declare const orders: DataViewDefinition;
900
+ declare const overview: DashboardDefinition;
901
+ declare const ordersDescriptor: QueryModelDescriptor;
902
+ declare const english: TextResolver;
903
+ declare function expect(value: unknown): { toEqual(expected: unknown): void };
904
+ -->
905
+
906
+ ```ts
907
+ import { admit } from '@ahoo-wang/wow-view-engine/testing';
908
+
909
+ expect(
910
+ admit([orders, overview], { orders: ordersDescriptor }, { text: english }),
911
+ ).toEqual([]);
912
+ ```
913
+
914
+ `actionHarness(actions, rows, { now })` reads a host's declared actions by the engine's own rules, without rendering: where each is offered (`at`), whether a record takes one and why not (`state`), how a selection splits (`bulk`), what pressing it asks (`asks`), its form or choice (`form`, `choice`, `missing`), when a record flips on its own (`changesAt`), and `run` as the engine sends it — refused with the reason (`ActionRefusedError`) where the record does not take it:
915
+
916
+ <!-- typecheck-context
917
+ import { text } from '@ahoo-wang/wow-view-engine';
918
+ import type { RecordActions, RecordRow } from '@ahoo-wang/wow-view-engine';
919
+ declare const orderActions: RecordActions;
920
+ declare const rows: RecordRow[];
921
+ declare function expect(value: unknown): { toEqual(expected: unknown): void; toBe(expected: unknown): void };
922
+ -->
923
+
924
+ ```ts
925
+ import { actionHarness } from '@ahoo-wang/wow-view-engine/testing';
926
+
927
+ const orders = actionHarness(orderActions, rows, {
928
+ now: Date.parse('2026-09-28'),
929
+ });
930
+ expect(orders.state('ship', 'O-2').reason).toBe(text('orders.onHold'));
931
+ expect(orders.bulk('ship').able).toEqual(['O-1']);
932
+ expect(orders.asks('cancel', 'row').asks).toBe(true);
933
+ ```
934
+
935
+ ## Concepts
936
+
937
+ | Type | Role | Lives in |
938
+ | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
939
+ | `ViewDefinition` | Fields, kinds, operators, record and analysis capabilities. Declared or generated, never edited at runtime. | code |
940
+ | `ViewConfig` | `RecordViewConfig` / `AnalysisViewConfig` / `DashboardViewConfig` discriminated union. A shared `FilterTree` describes scope. It is an intent model: it stores semantics such as "last 7 days" rather than compiled values, and never a UI component name. Analysis covers the whole Wow aggregation protocol; a dashboard panel shows data — a saved view, or an analysis the board owns — or content: a heading, Markdown text, an image, links. | data |
941
+ | `ViewInstance` | A saved `ViewConfig` plus id, title, scope and an opaque `revision`. Scope is system, shared or personal. | store |
942
+ | `ViewRuntime` | One open view: draft, applied config, result, status, selection. `subscribe` / `getSnapshot`. | memory |
943
+ | `ViewEngine` | Registry of definitions, the store and open runtimes; entry point for open, save, list commands. | memory |
944
+ | `ViewStore` | Eight-method persistence port, plus an optional `changeAudience`. On a Wow server, `WowViewStore` from `@ahoo-wang/wow-view-store`; for any other backend, your own. | app |
945
+ | `FieldKind` | Operators, validation, compilation and editor descriptor for one field type. | registry |
946
+
947
+ Three names read two ways, so here is which is which:
948
+
949
+ - **`*Spec`** is either what a host offers or what a view stores. `DefineViewSpec`, `FieldSpec`, `FieldAnalysisSpec` and `AnalysisSpec` are a host's input to `defineView` — the fields, operators and analyses it offers. `ChartSpec`, `RecordTableSpec`, `AnalysisTableSpec` and every chart family's `*Spec` are parts of a stored `ViewConfig`.
950
+ - **`RecordProjection` / `AnalysisProjection`** are what `projectRecord` / `projectAnalysis` make of a result: the columns, rows and series a surface draws. A _view_ is a saved `ViewInstance`; `/ui`'s `RecordViewProps` are the workbench's `record` prop, not a projection's.
951
+ - **`kinds`** on `ViewEngineOptions` and `ViewEngine` is the field-kind registry; `DataWorkbench`'s `viewKinds` is which kinds of view (`'record'`, `'analysis'`) it lists.
952
+
953
+ ## View management
954
+
955
+ - **Lifecycle.** Create, save, save as, rename and delete are all `ViewEngine` commands; the default UI and custom compositions share one path. Only the config is saved, never selection, page or results.
956
+ - **Three scopes.** `system` views are configured by developers or operators as the baseline and common views of a definition: visible to everyone, read-only, can be saved as; declare them in code under `definition.views` or return them from the server. `shared` views are created by users with permission and visible to everyone on the definition. `personal` views are visible to their owner only.
957
+ - **Two questions, one value.** The three scopes are the legal combinations of who a view is for and whether a user configured it: a system view is always a shared view, and a personal system view cannot be written down. `audienceOf(scope)` answers the first, `isSystemScope(scope)` the second, and everything from the dashboard reference rule to the sidebar's grouping asks through them. What a user creates is a `ViewAudience`, never a scope.
958
+ - **The sidebar.** Views are grouped by audience — personal first, then shared, with system views among the shared ones under a `system` tag — and each row is prefixed by its kind, because one data definition holds record and analysis views together. The heading is the definition's own title. `ViewInstanceSummary` carries `kind` for this: it is the config's tag, projected, so a store answers `list` from the configs it holds.
959
+ - **Permissions.** `store.permissions()` supplies permissions synchronously and only drives button availability. The server is the authority. Shared views you cannot edit and system views can still be saved as personal ones.
960
+ - **List and preferences.** List, preferences and permissions load independently and never block each other; personal ordering and the default view live in `ViewPreferences`, and deleting an instance never rewrites them.
961
+ - **Conflicts and unknown outcomes.** On a revision conflict choose reload or overwrite, or save as; when a request was sent but its outcome is unknown, retry with the same `requestId`. The draft is always kept.
962
+ - **Leave protection.** Closing a view with an unsaved draft or an unknown write asks for confirmation; navigation never cancels an in-flight write.
963
+
964
+ Details in [docs/design/management.md](https://github.com/Ahoo-Wang/Wow/blob/main/typescript/wow-view-engine/docs/design/management.md).
965
+
966
+ ## Entries
967
+
968
+ | Entry | Exports |
969
+ | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
970
+ | `@ahoo-wang/wow-view-engine` | Model types and constants; the four pure kernels (`validate*` / `compile*` / `project*` and the readings beside them); from the runtime, what a host holds and nothing it is built from — `ViewEngine`, `validateDefinition`, the runtime contracts `ViewRuntime`, `RecordViewRuntime`, `DashboardRuntime` and `AnyViewRuntime` with every type their signatures name, `hasResult`, `hasAsked`, `isRecordRuntime`, `actions` with the declared actions' types, the write errors `ViewWriteError` and `ViewCommandError`, `ExportCancelledError`, `RuntimeEnvironment`, `defaultRuntimeEnvironment`, `ViewSource`, `OptionSource`; the `ViewStore` port, `MemoryViewStore` and `localStorageSnapshot` |
971
+ | `/react` | Hooks and headless controllers with the types they return: `useViewEngine`, `useOpenView`, `useViewRuntime`, `useViewList`, `useViewManager`, `useWorkbench`, `useLeaveGuard`, `useFilterEditor`, `useRecordTable`, `useAnalysisEditor`, `useAnalysisResult`, `useDashboard`, `useSaveCommands`, `useRecordActions` (the declared actions of one record surface: what each record and the selection are offered, the question or form waiting, the one runner), `RecordActionSlots`, and the two write-outcome types the save commands report (`SettledWrite`, `RecoveredWrite`) |
972
+ | `/ui` | Default components, views and workbenches with their props: `DataWorkbench`, `DashboardWorkbench`, `DashboardEditExtensions`, `useDashboardExtensions`, `EmbeddedView`, `EmbeddedDashboard`, `ViewHost`, `bind`, `useEngine`, `useViewNavigation`, `useColorMode`, `ViewHeader`, `SaveActions`, `ViewManager`, `LeaveDialog`, `EditorBand`, `FilterPanel`, `StatusStrip`, `AppliedBar`, `ResultToolbar`, `RowActions`, `RecordTable`, `RecordCards`, `RecordPagination`, `AnalysisTable`, `AnalysisChart`, `DashboardGrid`, `HeadingPanel`, `MarkdownPanel`, `ImagePanel`, `LinksPanel`, `MessagesProvider`; the catalogues `en` and `zhCN`; the reading of a value, `cellValue`, `cellText` and `displayValue` |
973
+ | `/testing` | `memorySource` and `matches`: an in-memory `ViewSource` with Wow's query semantics; `resolveNavigation`: the engine's own routing of a way off through your bindings, for your routing tests; `admit`: a host's declarations admitted over its committed descriptors; `actionHarness`: a host's declared actions read by the engine's rules, without a screen — for a host's tests ([Testing a host](#testing-a-host-an-in-memory-source)) |
974
+ | `/react-router` | `useReactRouter`: React Router as the router port a host hands its view host. React Router is an optional peer, and this is the one entry that loads it |
975
+ | `/styles.css` | The theme. Import it explicitly; no JavaScript entry imports CSS, and nothing in it paints outside the two style boundaries `.fve-root` and `.fve-tokens` (preflight and the base are scoped at build time at no extra weight, and every utility is `fve:`-prefixed, so it never shares a name with yours and your import order does not matter) — bar the preset reset, which only empties the `--fvp-*` layer where a preset is named — all checked by `scripts/verify-package.mjs` on every build. |
976
+ | `/themes.css` | The presets, optional: only `--fvp-*` assignments keyed by `data-fve-preset` ([Presets](https://wow.ahoo.me/guide/typescript/view-engine-theming#presets)), checked by the same script. |
977
+ | `/themes/<name>.css` | One preset alone, for a host that wears one: the same block `themes.css` holds for it ([Presets](https://wow.ahoo.me/guide/typescript/view-engine-theming#presets)). |
978
+ | `/shadcn-bridge.css` | Optional: a host's shadcn tokens read into the `--fvp-*` variables, bar `input`, `ring`, the status and the chart colours and the shadows, and only while no preset is named ([the bridge](https://wow.ahoo.me/guide/typescript/view-engine-theming#the-shadcn-bridge)), checked by the same script. |
979
+
980
+ That is the public surface, and it is kept name by name. Each entry writes every name it exports, grouped by the file that declares it; none re-exports a whole module (`test/architecture.test.ts`), so an `export` a file writes for its neighbours never becomes public by accident. Each code entry's complete list — every name, and whether it is a type or a value — is in `test/surface/` (`root.txt`, `react.txt`, `ui.txt`, `testing.txt`, `react-router.txt`): `test/publicSurface.test.ts` fails when an entry exports a name its list does not hold or stops exporting one it does, and `scripts/verify-package.mjs` holds each built JavaScript entry to the same list. A name added to a list or taken off one is a change to the public surface and is reviewed as one. The command is surface too: `test/surface/bin.txt` lists the `bin` (`wow-view-engine`) and each subcommand it answers ([`theme-check`](https://wow.ahoo.me/guide/typescript/view-engine-theming#checking-a-theme)).
981
+
982
+ The runtime's own parts are not exported: the request scheduler, the store both runtimes are built on, the refresh timers, the listener sets, the runtime classes and their constructors. A runtime is opened or created through `ViewEngine` and held by its contract, never built by hand; `/react` and `/ui` reach those parts from inside the package, not through an entry.
983
+
984
+ ## Persistence
985
+
986
+ `ViewStore` is the only port a backend must satisfy:
987
+
988
+ ```ts
989
+ interface ViewStore {
990
+ list(
991
+ definitionId: string,
992
+ signal?: AbortSignal,
993
+ ): Promise<ViewInstanceSummary[]>;
994
+ get(id: string, signal?: AbortSignal): Promise<ViewInstance>;
995
+ create(
996
+ input: Omit<ViewInstance, 'id' | 'revision'>,
997
+ ctx: WriteContext,
998
+ ): Promise<ViewInstance>;
999
+ save(
1000
+ id: string,
1001
+ config: ViewConfig,
1002
+ revision: string,
1003
+ ctx: WriteContext,
1004
+ ): Promise<ViewInstance>;
1005
+ rename(
1006
+ id: string,
1007
+ title: string,
1008
+ revision: string,
1009
+ ctx: WriteContext,
1010
+ ): Promise<ViewInstance>;
1011
+ delete(id: string, revision: string, ctx: WriteContext): Promise<void>;
1012
+ // Optional: without it the manager offers no “Make shared” / “Make personal”.
1013
+ changeAudience?(
1014
+ id: string,
1015
+ audience: ViewAudience,
1016
+ revision: string,
1017
+ ctx: WriteContext,
1018
+ ): Promise<ViewInstance>;
1019
+ getPreferences(
1020
+ definitionId: string,
1021
+ signal?: AbortSignal,
1022
+ ): Promise<ViewPreferences>;
1023
+ setPreferences(
1024
+ definitionId: string,
1025
+ prefs: ViewPreferences,
1026
+ ctx: WriteContext,
1027
+ ): Promise<ViewPreferences>;
1028
+ permissions?(definitionId: string): ViewPermissions;
1029
+ }
1030
+ ```
1031
+
1032
+ Two rules make it consistent:
1033
+
1034
+ 1. **Optimistic revision.** Writes carry the expected `revision`; a mismatch throws `ViewStoreError` with code `CONFLICT`, and the UI offers reload-and-overwrite or save-as.
1035
+ 2. **Idempotent `requestId`.** Each logical write gets one `requestId` in `WriteContext`. Retries after a timeout reuse it; the server deduplicates.
1036
+
1037
+ `changeAudience` moves a saved view between personal and shared in place — the id stays, so a dashboard that shows it keeps showing it. It keeps the same two rules, answers a request for the audience the view already has with the view unchanged (no new revision), and refuses to make a view personal while a shared dashboard shows it (`INVALID`, with the dashboards' titles in `boards`, which the engine says in its own words). A store without it simply has no such button in the view manager; one with it gets “Make shared” or “Make personal” on each row the store's `permissions` allow — `instance(id).changeAudience` (absent reads as allowed) and the create permission of the audience the view goes to.
1038
+
1039
+ A store implementation can run the port's conformance suite, `test/conformance/viewStoreConformance.ts` in this package's repository (not published): `describeViewStoreConformance({ name, capabilities, connect })` registers the cases every store must pass — lists, visibility, the writes, stale revisions, system views, replays, preferences — and skips those a declared capability rules out.
1040
+
1041
+ The package ships `MemoryViewStore` for tests, examples and query-only use. A Wow application keeps its views on the Wow view store server with [`WowViewStore`](../wow-view-store/README.md) from `@ahoo-wang/wow-view-store`; do not write a store of your own for a Wow backend. Any other backend implements `ViewStore` against its own API with its own fetcher, and mapping its HTTP status codes to `ViewStoreError.code` belongs there. Authorization, visibility filtering and deduplication are server responsibilities; `permissions` only drives button availability.
1042
+
1043
+ ### Local storage, until a backend holds the views
1044
+
1045
+ For development and single-user hosts, `localStorageSnapshot(key)` keeps a `MemoryViewStore` in the browser's `localStorage`, as one JSON document under `key`. It is one browser's views, not shared ones; views people share live on a server, behind `ViewStore` — on a Wow server, `WowViewStore`.
1046
+
1047
+ ```ts
1048
+ import {
1049
+ localStorageSnapshot,
1050
+ MemoryViewStore,
1051
+ } from '@ahoo-wang/wow-view-engine';
1052
+
1053
+ const store = new MemoryViewStore({
1054
+ snapshot: localStorageSnapshot('my-app:views'),
1055
+ });
1056
+ ```
1057
+
1058
+ - **A write storage refuses fails.** A full quota or blocked storage undoes the write and rejects it with `ViewStoreError` code `UNAVAILABLE`: the environment's `onError` hears it as a `store` failure, and the screen shows a save that did not land, with a retry.
1059
+ - **Tabs do not overwrite each other.** The store re-reads the document before every write and checks the write's `revision` against it, instance by instance and per definition's preferences. A write merges into what another tab stored — a board saved in one tab survives a reorder in another — and a write another tab has moved past is a `CONFLICT`, as a stale write always is. Another tab's change also reloads the store through the `storage` event.
1060
+ - A missing or unreadable document starts empty rather than breaking the page, and the next write replaces it.
1061
+
1062
+ ### Wording and language
1063
+
1064
+ The model carries `code` and `params` and no copy, so `/ui` owns the words. `en` gives every issue an English sentence, and `messages` — on `ViewSurface` and on every workbench — is merged over the wording already in force, the same seam for rewording and translation. A `ViewHost` (or a bare `MessagesProvider`) around the application sets it once for every view inside, with the language values show in (`locale`). `zhCN` is a second catalogue, key for key: hand it over whole, or spread it and change what you like (`{ ...zhCN, 'label.filter.apply': '确定' }`).
1065
+
1066
+ Values show as their fields say: an enum by its option's label, a `datetime` or a `date` through `Intl.DateTimeFormat`, a date-histogram key as the year, quarter, month or day it starts. A table cell writes a `datetime` short — to the minute, the year only outside the current one (`Sep 17, 9:19 PM`, Chinese `09-17 21:19`) — with the whole time in its `title` and in the record's detail; a field whose seconds matter, an event stream's time, declares `timePrecision: 'second'`. `locale` is the language they show in, the runtime's when left out; it is the same choice as `messages`, made for values rather than words:
1067
+
1068
+ <!-- typecheck-context
1069
+ import { ViewEngine } from '@ahoo-wang/wow-view-engine';
1070
+ declare const engine: ViewEngine;
1071
+ -->
1072
+
1073
+ ```tsx
1074
+ import { DataWorkbench, zhCN } from '@ahoo-wang/wow-view-engine/ui';
1075
+
1076
+ <DataWorkbench
1077
+ engine={engine}
1078
+ definitionId="orders"
1079
+ messages={{ ...zhCN, 'label.filter.apply': '确定' }}
1080
+ locale="zh-CN"
1081
+ />;
1082
+ ```
1083
+
1084
+ Times read on the engine's clock, `environment.timeZone`: the zone "today" is resolved in, and the one a date histogram that names no `timeZone` is bucketed in, so a row shows the time it was filtered and grouped by.
1085
+
1086
+ An unknown key falls back along the dots and then to the key itself, so a gap shows up rather than rendering blank. A test fails when a new issue code has no entry. What a component may ask for is the `MessageKey` union, so a key the catalogue dropped is a compile error; a host's own `messages` stays an open string map.
1087
+
1088
+ The message keys and the issue codes are public surface, listed in `test/surface/messages.txt` and `test/surface/issues.txt`: renaming or removing one is a breaking change, like removing an export. Write a rewording of the engine's own keys with `satisfies MessageOverrides`, so a key the engine renames fails your build instead of quietly falling back to the engine's sentence; keys of your own (a definition's `text(key)`) go beside it in a plain `ViewMessages`:
1089
+
1090
+ ```ts
1091
+ import type { MessageOverrides } from '@ahoo-wang/wow-view-engine/ui';
1092
+
1093
+ const wording = {
1094
+ 'label.filter.apply': 'Apply filters',
1095
+ } satisfies MessageOverrides;
1096
+ ```
1097
+
1098
+ ## Extension points
1099
+
1100
+ | Axis | Mechanism |
1101
+ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1102
+ | Field type | Register a `FieldKind` (operators, validation, `compile` to `FilterExpression`, editor descriptor). Its editor is one of the value controls `/ui` already has (`EDITOR_INPUTS`): there is no renderer registry, and a kind asking for another input is refused rather than guessed at |
1103
+ | Data source | Each entry of `resources` pairs a definition with its source, a Wow query client |
1104
+ | Persistence | `WowViewStore` (`@ahoo-wang/wow-view-store`) on a Wow server; implement `ViewStore` for any other backend |
1105
+ | Actions | Declare them (`actions()`) and bind them (`bind(id, { actions })`), or pass `record.actions` to a workbench; `slots` — `global`, `bulk` and `row` render functions — are the escape hatch beside them. They are code, so they are handed over rather than named in a config, and nothing about them is saved. A page fetches only the fields its view shows, so a field an action reads beyond those is declared in the definition's `record.rowFields` |
1106
+ | Appearance | CSS variables and theme files; replace components by composing `/react` hooks |
1107
+ | Maps | `registerChartMap` from `/ui` offers the map chart a geography — see [Maps](#maps) |
1108
+
1109
+ Built-in kinds: `string`, `number`, `boolean`, `date`, `datetime`, `enum`, `reference`, `array`, `elementMatch`, `search`, and the ones backed by Wow's metadata filters — `documentId`, `aggregateId`, `tenantId`, `ownerId`, `spaceId`, `deletion`.
1110
+
1111
+ ## Maps
1112
+
1113
+ The map chart draws a map the host registers. **This package ships no map data**: which borders a map shows, and whether it may be published at all, is the law of the place it is shown. A map of China, for one, is published in China only with an approval number (审图号) from the standard map service. The geography is the host's to choose and to answer for.
1114
+
1115
+ ```ts
1116
+ import { registerChartMap } from '@ahoo-wang/wow-view-engine/ui';
1117
+
1118
+ // Once, at start-up. `load` runs the first time a map chart draws this map,
1119
+ // and its answer is kept; a failed load is asked for again next time.
1120
+ const unregister = registerChartMap({
1121
+ name: 'world',
1122
+ label: 'World',
1123
+ load: () => fetch('/maps/world.geo.json').then(response => response.json()),
1124
+ });
1125
+ ```
1126
+
1127
+ - `load` answers a GeoJSON `FeatureCollection`. Each feature's `properties.name` is a region's name.
1128
+ - A region dimension's values are matched against those names **as their column shows them**. For an `enum` field, that is its label. A region the map has no area for is counted and said over the chart, never guessed at.
1129
+ - With several maps registered, the chart's data page offers a choice. A chart that names none draws the first map registered. With none registered, the picker greys the map tile.
1130
+ - Registering a second map under the same name replaces the first. The returned function takes the map back.
1131
+
1132
+ ## Layering
1133
+
1134
+ ```text
1135
+ model → filter → record | analysis | dashboard → runtime → react → ui
1136
+ store → model
1137
+ ```
1138
+
1139
+ `validateDefinition` admits a definition once, where the engine registers it: field names against Wow's query syntax, unique ids free of `:`, capabilities that `default*Config` can actually build from, and every system view through its own kernel. A definition with an error stays in the registry but is refused at the point of use, so a mistake in code surfaces as a reported issue rather than as a `TypeError` when a user opens a view.
1140
+
1141
+ Six dependency rules are enforced by architecture tests: `model` imports nothing; `filter` imports only `model`; `record`, `analysis` and `dashboard` import only `model` and `filter`; `runtime` never imports `react` or `ui`; `store` imports only `model`; `react` never imports `ui`. Everything up to `store` is free of React and DOM. Only the non-deprecated `FilterExpression` based Wow APIs are used.
1142
+
1143
+ ## Out of scope
1144
+
1145
+ View-kind plugins, a definition CRUD backend, write-receipt reconciliation or read fences, resource budgets beyond concurrency and page size, SSR preloading, generic region or event buses, cross-page select-all, cell editing and nested dashboards.
1146
+
1147
+ ## Content Security Policy
1148
+
1149
+ The package runs under a strict policy — `script-src 'self'` and `style-src 'self'` with no `'unsafe-inline'` and no `'unsafe-eval'` — with three things to allow:
1150
+
1151
+ - **The stylesheet** is a file (`styles.css`, and `themes.css` where used): serve it from an allowed origin rather than inlining it. Nothing the components draw carries a `style` attribute in markup: inline styles go through the DOM's style object, which no policy blocks, and a chart tooltip's colour swatch is an SVG `fill` (a test holds the tooltip's HTML to having no `style=`). Nothing loads a `data:` image either: the cells a board shows while it is built are drawn in the page.
1152
+ - **The styles the bundled libraries add** while they work, each a `<style>` in `<head>`: the drag-and-drop library while a list is dragged (the column settings, the sort, the view list, a board's filters and tabs — a grabbing cursor, no text selection), the grid's drag library while a board's panel is moved or resized (no text selection), and Base UI while a select's list is open (its scrollbar hidden behind the scroll arrows). Under `style-src 'self'` alone they are blocked, so publish the response's nonce the way Vite does — `<meta property="csp-nonce" nonce="…">` (what Vite's `html.cspNonce` writes; a `content` attribute is read too) — and allow `'nonce-…'` in the policy. The engine hands it to all three. Without the meta everything still works; those few rules are refused, and each reports a violation.
1153
+ - **Exporting a chart as a PNG** draws the chart's SVG onto a canvas by loading it as an image from a `blob:` URL, so `img-src` must include `blob:`. Without it the PNG is not made and the toolbar says so; the SVG export needs nothing. Neither export evaluates code or writes an inline script.
1154
+
1155
+ ```
1156
+ Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'nonce-<new every response>'; img-src 'self' blob:
1157
+ ```
1158
+
1159
+ ```html
1160
+ <meta property="csp-nonce" nonce="<the same nonce>" />
1161
+ ```
1162
+
1163
+ Two runs hold the package to this policy, and neither allows one violation. Storybook walks the engine itself under it (`typescript/storybook/stories/view-engine/StrictCsp.test.stories.tsx`, in CI): the record workbench with a column dragged, a summary picked from a select, a column widened and a record's detail opened; every chart type with its tooltip; the SVG, PNG and CSV exports; and a board read, filtered from a chart, then built — a panel moved and resized, a tab dragged, an analysis added — and saved. The compensation console runs its end-to-end tests under it (`compensation/dashboard/e2e/csp.spec.ts`): every place walked and a drag made.
1164
+
1165
+ ## Development
1166
+
1167
+ ```bash
1168
+ pnpm --filter @ahoo-wang/wow-view-engine test # unit tests, coverage and three tsc projects
1169
+ pnpm --filter @ahoo-wang/wow-view-engine build # build, then verify the published entries
1170
+ pnpm --filter @ahoo-wang/wow-view-engine test:package # entries, DOM-free types, no CSS from JS
1171
+ pnpm storybook # every state of every surface, under "View Engine"
1172
+ ```
1173
+
1174
+ `examples/` in this repository (not in the npm package) holds three consumers
1175
+ written against the public contracts rather than against the internals:
1176
+ `quickstart.ts` is the quick start's definition as code, admitted by a test,
1177
+ `PlainRecordWorkbench.tsx` drives the whole loop with unstyled HTML, and
1178
+ `FetcherViewStore.ts` implements the `ViewStore` port with
1179
+ `@ahoo-wang/fetcher` for a backend that is not Wow (a REST API with `If-Match`
1180
+ revisions) — a Wow server's store is `WowViewStore`.
1181
+
1182
+ `@ahoo-wang/fetcher-viewer` is deprecated in favor of this package. The two use different models and APIs.