@tai42/studio-sdk 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +15 -0
  3. package/README.md +318 -0
  4. package/SECURITY.md +51 -0
  5. package/dist/components/badge.d.ts +13 -0
  6. package/dist/components/badge.d.ts.map +1 -0
  7. package/dist/components/badge.js +14 -0
  8. package/dist/components/badge.js.map +1 -0
  9. package/dist/components/checkbox.d.ts +24 -0
  10. package/dist/components/checkbox.d.ts.map +1 -0
  11. package/dist/components/checkbox.js +31 -0
  12. package/dist/components/checkbox.js.map +1 -0
  13. package/dist/components/code-block.d.ts +7 -0
  14. package/dist/components/code-block.d.ts.map +1 -0
  15. package/dist/components/code-block.js +23 -0
  16. package/dist/components/code-block.js.map +1 -0
  17. package/dist/components/completion-input.d.ts +31 -0
  18. package/dist/components/completion-input.d.ts.map +1 -0
  19. package/dist/components/completion-input.js +61 -0
  20. package/dist/components/completion-input.js.map +1 -0
  21. package/dist/components/components.css +2212 -0
  22. package/dist/components/confirm-dialog.d.ts +40 -0
  23. package/dist/components/confirm-dialog.d.ts.map +1 -0
  24. package/dist/components/confirm-dialog.js +11 -0
  25. package/dist/components/confirm-dialog.js.map +1 -0
  26. package/dist/components/control-styles.d.ts +12 -0
  27. package/dist/components/control-styles.d.ts.map +1 -0
  28. package/dist/components/control-styles.js +14 -0
  29. package/dist/components/control-styles.js.map +1 -0
  30. package/dist/components/copy-field.d.ts +8 -0
  31. package/dist/components/copy-field.d.ts.map +1 -0
  32. package/dist/components/copy-field.js +106 -0
  33. package/dist/components/copy-field.js.map +1 -0
  34. package/dist/components/dialog.d.ts +21 -0
  35. package/dist/components/dialog.d.ts.map +1 -0
  36. package/dist/components/dialog.js +25 -0
  37. package/dist/components/dialog.js.map +1 -0
  38. package/dist/components/drawer.d.ts +22 -0
  39. package/dist/components/drawer.d.ts.map +1 -0
  40. package/dist/components/drawer.js +32 -0
  41. package/dist/components/drawer.js.map +1 -0
  42. package/dist/components/error-boundary.d.ts +33 -0
  43. package/dist/components/error-boundary.d.ts.map +1 -0
  44. package/dist/components/error-boundary.js +36 -0
  45. package/dist/components/error-boundary.js.map +1 -0
  46. package/dist/components/extension-combo-builder.d.ts +70 -0
  47. package/dist/components/extension-combo-builder.d.ts.map +1 -0
  48. package/dist/components/extension-combo-builder.js +154 -0
  49. package/dist/components/extension-combo-builder.js.map +1 -0
  50. package/dist/components/extension-grouping.d.ts +65 -0
  51. package/dist/components/extension-grouping.d.ts.map +1 -0
  52. package/dist/components/extension-grouping.js +78 -0
  53. package/dist/components/extension-grouping.js.map +1 -0
  54. package/dist/components/extension-picker.d.ts +35 -0
  55. package/dist/components/extension-picker.d.ts.map +1 -0
  56. package/dist/components/extension-picker.js +31 -0
  57. package/dist/components/extension-picker.js.map +1 -0
  58. package/dist/components/external-link.d.ts +19 -0
  59. package/dist/components/external-link.d.ts.map +1 -0
  60. package/dist/components/external-link.js +12 -0
  61. package/dist/components/external-link.js.map +1 -0
  62. package/dist/components/field.d.ts +64 -0
  63. package/dist/components/field.d.ts.map +1 -0
  64. package/dist/components/field.js +56 -0
  65. package/dist/components/field.js.map +1 -0
  66. package/dist/components/fleet-report.d.ts +39 -0
  67. package/dist/components/fleet-report.d.ts.map +1 -0
  68. package/dist/components/fleet-report.js +50 -0
  69. package/dist/components/fleet-report.js.map +1 -0
  70. package/dist/components/fonts.css +22 -0
  71. package/dist/components/icons.d.ts +142 -0
  72. package/dist/components/icons.d.ts.map +1 -0
  73. package/dist/components/icons.js +139 -0
  74. package/dist/components/icons.js.map +1 -0
  75. package/dist/components/inputs.d.ts +52 -0
  76. package/dist/components/inputs.d.ts.map +1 -0
  77. package/dist/components/inputs.js +35 -0
  78. package/dist/components/inputs.js.map +1 -0
  79. package/dist/components/json-diff.d.ts +40 -0
  80. package/dist/components/json-diff.d.ts.map +1 -0
  81. package/dist/components/json-diff.js +119 -0
  82. package/dist/components/json-diff.js.map +1 -0
  83. package/dist/components/json-tree.d.ts +8 -0
  84. package/dist/components/json-tree.d.ts.map +1 -0
  85. package/dist/components/json-tree.js +70 -0
  86. package/dist/components/json-tree.js.map +1 -0
  87. package/dist/components/modal-focus.d.ts +15 -0
  88. package/dist/components/modal-focus.d.ts.map +1 -0
  89. package/dist/components/modal-focus.js +136 -0
  90. package/dist/components/modal-focus.js.map +1 -0
  91. package/dist/components/page-header.d.ts +56 -0
  92. package/dist/components/page-header.d.ts.map +1 -0
  93. package/dist/components/page-header.js +24 -0
  94. package/dist/components/page-header.js.map +1 -0
  95. package/dist/components/primitives.d.ts +186 -0
  96. package/dist/components/primitives.d.ts.map +1 -0
  97. package/dist/components/primitives.js +204 -0
  98. package/dist/components/primitives.js.map +1 -0
  99. package/dist/components/progress-bar.d.ts +29 -0
  100. package/dist/components/progress-bar.d.ts.map +1 -0
  101. package/dist/components/progress-bar.js +48 -0
  102. package/dist/components/progress-bar.js.map +1 -0
  103. package/dist/components/radio-group.d.ts +37 -0
  104. package/dist/components/radio-group.d.ts.map +1 -0
  105. package/dist/components/radio-group.js +56 -0
  106. package/dist/components/radio-group.js.map +1 -0
  107. package/dist/components/reveal-input.d.ts +13 -0
  108. package/dist/components/reveal-input.d.ts.map +1 -0
  109. package/dist/components/reveal-input.js +31 -0
  110. package/dist/components/reveal-input.js.map +1 -0
  111. package/dist/components/scroll-region.d.ts +85 -0
  112. package/dist/components/scroll-region.d.ts.map +1 -0
  113. package/dist/components/scroll-region.js +574 -0
  114. package/dist/components/scroll-region.js.map +1 -0
  115. package/dist/components/select.d.ts +53 -0
  116. package/dist/components/select.d.ts.map +1 -0
  117. package/dist/components/select.js +33 -0
  118. package/dist/components/select.js.map +1 -0
  119. package/dist/components/table.d.ts +59 -0
  120. package/dist/components/table.d.ts.map +1 -0
  121. package/dist/components/table.js +20 -0
  122. package/dist/components/table.js.map +1 -0
  123. package/dist/components/tabs.d.ts +15 -0
  124. package/dist/components/tabs.d.ts.map +1 -0
  125. package/dist/components/tabs.js +13 -0
  126. package/dist/components/tabs.js.map +1 -0
  127. package/dist/components/tags.d.ts +46 -0
  128. package/dist/components/tags.d.ts.map +1 -0
  129. package/dist/components/tags.js +68 -0
  130. package/dist/components/tags.js.map +1 -0
  131. package/dist/components/tokens.css +392 -0
  132. package/dist/components/tokens.d.ts +15 -0
  133. package/dist/components/tokens.d.ts.map +1 -0
  134. package/dist/components/tokens.js +101 -0
  135. package/dist/components/tokens.js.map +1 -0
  136. package/dist/components/tool-picker.d.ts +24 -0
  137. package/dist/components/tool-picker.d.ts.map +1 -0
  138. package/dist/components/tool-picker.js +97 -0
  139. package/dist/components/tool-picker.js.map +1 -0
  140. package/dist/components/tooltip.d.ts +17 -0
  141. package/dist/components/tooltip.d.ts.map +1 -0
  142. package/dist/components/tooltip.js +18 -0
  143. package/dist/components/tooltip.js.map +1 -0
  144. package/dist/components/version-history-panel.d.ts +71 -0
  145. package/dist/components/version-history-panel.d.ts.map +1 -0
  146. package/dist/components/version-history-panel.js +148 -0
  147. package/dist/components/version-history-panel.js.map +1 -0
  148. package/dist/download.d.ts +7 -0
  149. package/dist/download.d.ts.map +1 -0
  150. package/dist/download.js +18 -0
  151. package/dist/download.js.map +1 -0
  152. package/dist/element-slot.d.ts +4 -0
  153. package/dist/element-slot.d.ts.map +1 -0
  154. package/dist/element-slot.js +20 -0
  155. package/dist/element-slot.js.map +1 -0
  156. package/dist/elicitation/ElicitationForm.d.ts +34 -0
  157. package/dist/elicitation/ElicitationForm.d.ts.map +1 -0
  158. package/dist/elicitation/ElicitationForm.js +24 -0
  159. package/dist/elicitation/ElicitationForm.js.map +1 -0
  160. package/dist/errors.d.ts +9 -0
  161. package/dist/errors.d.ts.map +1 -0
  162. package/dist/errors.js +15 -0
  163. package/dist/errors.js.map +1 -0
  164. package/dist/extension-combos.d.ts +13 -0
  165. package/dist/extension-combos.d.ts.map +1 -0
  166. package/dist/extension-combos.js +9 -0
  167. package/dist/extension-combos.js.map +1 -0
  168. package/dist/hooks/useApi.d.ts +1222 -0
  169. package/dist/hooks/useApi.d.ts.map +1 -0
  170. package/dist/hooks/useApi.js +22 -0
  171. package/dist/hooks/useApi.js.map +1 -0
  172. package/dist/hooks/useAuth.d.ts +13 -0
  173. package/dist/hooks/useAuth.d.ts.map +1 -0
  174. package/dist/hooks/useAuth.js +53 -0
  175. package/dist/hooks/useAuth.js.map +1 -0
  176. package/dist/hooks/useBreakpoint.d.ts +10 -0
  177. package/dist/hooks/useBreakpoint.d.ts.map +1 -0
  178. package/dist/hooks/useBreakpoint.js +66 -0
  179. package/dist/hooks/useBreakpoint.js.map +1 -0
  180. package/dist/hooks/useCapabilities.d.ts +88 -0
  181. package/dist/hooks/useCapabilities.d.ts.map +1 -0
  182. package/dist/hooks/useCapabilities.js +203 -0
  183. package/dist/hooks/useCapabilities.js.map +1 -0
  184. package/dist/hooks/useSse.d.ts +13 -0
  185. package/dist/hooks/useSse.d.ts.map +1 -0
  186. package/dist/hooks/useSse.js +298 -0
  187. package/dist/hooks/useSse.js.map +1 -0
  188. package/dist/hooks/useTheme.d.ts +20 -0
  189. package/dist/hooks/useTheme.d.ts.map +1 -0
  190. package/dist/hooks/useTheme.js +97 -0
  191. package/dist/hooks/useTheme.js.map +1 -0
  192. package/dist/hooks/useUnauthorized.d.ts +3 -0
  193. package/dist/hooks/useUnauthorized.d.ts.map +1 -0
  194. package/dist/hooks/useUnauthorized.js +18 -0
  195. package/dist/hooks/useUnauthorized.js.map +1 -0
  196. package/dist/host.d.ts +11 -0
  197. package/dist/host.d.ts.map +1 -0
  198. package/dist/host.js +10 -0
  199. package/dist/host.js.map +1 -0
  200. package/dist/index.d.ts +118 -0
  201. package/dist/index.d.ts.map +1 -0
  202. package/dist/index.js +91 -0
  203. package/dist/index.js.map +1 -0
  204. package/dist/navigation/context.d.ts +25 -0
  205. package/dist/navigation/context.d.ts.map +1 -0
  206. package/dist/navigation/context.js +45 -0
  207. package/dist/navigation/context.js.map +1 -0
  208. package/dist/navigation/index.d.ts +4 -0
  209. package/dist/navigation/index.d.ts.map +1 -0
  210. package/dist/navigation/index.js +2 -0
  211. package/dist/navigation/index.js.map +1 -0
  212. package/dist/navigation/types.d.ts +97 -0
  213. package/dist/navigation/types.d.ts.map +1 -0
  214. package/dist/navigation/types.js +16 -0
  215. package/dist/navigation/types.js.map +1 -0
  216. package/dist/plugin/host-state.d.ts +45 -0
  217. package/dist/plugin/host-state.d.ts.map +1 -0
  218. package/dist/plugin/host-state.js +62 -0
  219. package/dist/plugin/host-state.js.map +1 -0
  220. package/dist/plugin/registry.d.ts +35 -0
  221. package/dist/plugin/registry.d.ts.map +1 -0
  222. package/dist/plugin/registry.js +129 -0
  223. package/dist/plugin/registry.js.map +1 -0
  224. package/dist/plugin/types.d.ts +165 -0
  225. package/dist/plugin/types.d.ts.map +1 -0
  226. package/dist/plugin/types.js +2 -0
  227. package/dist/plugin/types.js.map +1 -0
  228. package/dist/plugin/version.d.ts +34 -0
  229. package/dist/plugin/version.d.ts.map +1 -0
  230. package/dist/plugin/version.js +37 -0
  231. package/dist/plugin/version.js.map +1 -0
  232. package/dist/query-keys.d.ts +31 -0
  233. package/dist/query-keys.d.ts.map +1 -0
  234. package/dist/query-keys.js +31 -0
  235. package/dist/query-keys.js.map +1 -0
  236. package/dist/schema-editor/SchemaEditor.d.ts +43 -0
  237. package/dist/schema-editor/SchemaEditor.d.ts.map +1 -0
  238. package/dist/schema-editor/SchemaEditor.js +106 -0
  239. package/dist/schema-editor/SchemaEditor.js.map +1 -0
  240. package/dist/schema-editor/index.d.ts +10 -0
  241. package/dist/schema-editor/index.d.ts.map +1 -0
  242. package/dist/schema-editor/index.js +8 -0
  243. package/dist/schema-editor/index.js.map +1 -0
  244. package/dist/schema-editor/lint.d.ts +37 -0
  245. package/dist/schema-editor/lint.d.ts.map +1 -0
  246. package/dist/schema-editor/lint.js +49 -0
  247. package/dist/schema-editor/lint.js.map +1 -0
  248. package/dist/schema-form/SchemaForm.d.ts +70 -0
  249. package/dist/schema-form/SchemaForm.d.ts.map +1 -0
  250. package/dist/schema-form/SchemaForm.js +13 -0
  251. package/dist/schema-form/SchemaForm.js.map +1 -0
  252. package/dist/schema-form/array-field.d.ts +20 -0
  253. package/dist/schema-form/array-field.d.ts.map +1 -0
  254. package/dist/schema-form/array-field.js +39 -0
  255. package/dist/schema-form/array-field.js.map +1 -0
  256. package/dist/schema-form/classify.d.ts +87 -0
  257. package/dist/schema-form/classify.d.ts.map +1 -0
  258. package/dist/schema-form/classify.js +199 -0
  259. package/dist/schema-form/classify.js.map +1 -0
  260. package/dist/schema-form/context.d.ts +4 -0
  261. package/dist/schema-form/context.d.ts.map +1 -0
  262. package/dist/schema-form/context.js +14 -0
  263. package/dist/schema-form/context.js.map +1 -0
  264. package/dist/schema-form/default-value.d.ts +8 -0
  265. package/dist/schema-form/default-value.d.ts.map +1 -0
  266. package/dist/schema-form/default-value.js +64 -0
  267. package/dist/schema-form/default-value.js.map +1 -0
  268. package/dist/schema-form/enum-field.d.ts +19 -0
  269. package/dist/schema-form/enum-field.d.ts.map +1 -0
  270. package/dist/schema-form/enum-field.js +26 -0
  271. package/dist/schema-form/enum-field.js.map +1 -0
  272. package/dist/schema-form/field-group.d.ts +9 -0
  273. package/dist/schema-form/field-group.d.ts.map +1 -0
  274. package/dist/schema-form/field-group.js +32 -0
  275. package/dist/schema-form/field-group.js.map +1 -0
  276. package/dist/schema-form/field-node.d.ts +24 -0
  277. package/dist/schema-form/field-node.d.ts.map +1 -0
  278. package/dist/schema-form/field-node.js +51 -0
  279. package/dist/schema-form/field-node.js.map +1 -0
  280. package/dist/schema-form/index.d.ts +13 -0
  281. package/dist/schema-form/index.d.ts.map +1 -0
  282. package/dist/schema-form/index.js +11 -0
  283. package/dist/schema-form/index.js.map +1 -0
  284. package/dist/schema-form/media-field.d.ts +24 -0
  285. package/dist/schema-form/media-field.d.ts.map +1 -0
  286. package/dist/schema-form/media-field.js +169 -0
  287. package/dist/schema-form/media-field.js.map +1 -0
  288. package/dist/schema-form/media.d.ts +40 -0
  289. package/dist/schema-form/media.d.ts.map +1 -0
  290. package/dist/schema-form/media.js +65 -0
  291. package/dist/schema-form/media.js.map +1 -0
  292. package/dist/schema-form/object-fields.d.ts +20 -0
  293. package/dist/schema-form/object-fields.d.ts.map +1 -0
  294. package/dist/schema-form/object-fields.js +24 -0
  295. package/dist/schema-form/object-fields.js.map +1 -0
  296. package/dist/schema-form/resolve.d.ts +41 -0
  297. package/dist/schema-form/resolve.d.ts.map +1 -0
  298. package/dist/schema-form/resolve.js +102 -0
  299. package/dist/schema-form/resolve.js.map +1 -0
  300. package/dist/schema-form/string-field.d.ts +20 -0
  301. package/dist/schema-form/string-field.d.ts.map +1 -0
  302. package/dist/schema-form/string-field.js +68 -0
  303. package/dist/schema-form/string-field.js.map +1 -0
  304. package/dist/schema-form/styles.d.ts +18 -0
  305. package/dist/schema-form/styles.d.ts.map +1 -0
  306. package/dist/schema-form/styles.js +18 -0
  307. package/dist/schema-form/styles.js.map +1 -0
  308. package/dist/schema-form/types.d.ts +67 -0
  309. package/dist/schema-form/types.d.ts.map +1 -0
  310. package/dist/schema-form/types.js +10 -0
  311. package/dist/schema-form/types.js.map +1 -0
  312. package/dist/schema-form/union-field.d.ts +24 -0
  313. package/dist/schema-form/union-field.d.ts.map +1 -0
  314. package/dist/schema-form/union-field.js +55 -0
  315. package/dist/schema-form/union-field.js.map +1 -0
  316. package/dist/schema-form/union.d.ts +4 -0
  317. package/dist/schema-form/union.d.ts.map +1 -0
  318. package/dist/schema-form/union.js +68 -0
  319. package/dist/schema-form/union.js.map +1 -0
  320. package/dist/schema-form/unsupported-notice.d.ts +18 -0
  321. package/dist/schema-form/unsupported-notice.d.ts.map +1 -0
  322. package/dist/schema-form/unsupported-notice.js +8 -0
  323. package/dist/schema-form/unsupported-notice.js.map +1 -0
  324. package/dist/schema-form/validate.d.ts +18 -0
  325. package/dist/schema-form/validate.d.ts.map +1 -0
  326. package/dist/schema-form/validate.js +162 -0
  327. package/dist/schema-form/validate.js.map +1 -0
  328. package/dist/structured-output/StructuredOutput.d.ts +27 -0
  329. package/dist/structured-output/StructuredOutput.d.ts.map +1 -0
  330. package/dist/structured-output/StructuredOutput.js +41 -0
  331. package/dist/structured-output/StructuredOutput.js.map +1 -0
  332. package/dist/testing.d.ts +80 -0
  333. package/dist/testing.d.ts.map +1 -0
  334. package/dist/testing.js +207 -0
  335. package/dist/testing.js.map +1 -0
  336. package/package.json +101 -0
  337. package/src/components/badge.tsx +31 -0
  338. package/src/components/checkbox.tsx +93 -0
  339. package/src/components/code-block.tsx +37 -0
  340. package/src/components/completion-input.tsx +137 -0
  341. package/src/components/components.css +2212 -0
  342. package/src/components/confirm-dialog.tsx +77 -0
  343. package/src/components/control-styles.ts +14 -0
  344. package/src/components/copy-field.tsx +178 -0
  345. package/src/components/dialog.tsx +76 -0
  346. package/src/components/drawer.tsx +83 -0
  347. package/src/components/error-boundary.tsx +56 -0
  348. package/src/components/extension-combo-builder.tsx +305 -0
  349. package/src/components/extension-grouping.ts +116 -0
  350. package/src/components/extension-picker.tsx +97 -0
  351. package/src/components/external-link.tsx +40 -0
  352. package/src/components/field.tsx +169 -0
  353. package/src/components/fleet-report.tsx +136 -0
  354. package/src/components/fonts.css +22 -0
  355. package/src/components/icons.tsx +504 -0
  356. package/src/components/inputs.tsx +125 -0
  357. package/src/components/json-diff.tsx +192 -0
  358. package/src/components/json-tree.tsx +129 -0
  359. package/src/components/modal-focus.ts +150 -0
  360. package/src/components/page-header.tsx +107 -0
  361. package/src/components/primitives.tsx +489 -0
  362. package/src/components/progress-bar.tsx +100 -0
  363. package/src/components/radio-group.tsx +160 -0
  364. package/src/components/reveal-input.tsx +87 -0
  365. package/src/components/scroll-region.tsx +703 -0
  366. package/src/components/select.tsx +149 -0
  367. package/src/components/table.tsx +94 -0
  368. package/src/components/tabs.tsx +51 -0
  369. package/src/components/tags.tsx +137 -0
  370. package/src/components/tokens.css +392 -0
  371. package/src/components/tokens.ts +102 -0
  372. package/src/components/tool-picker.tsx +175 -0
  373. package/src/components/tooltip.tsx +46 -0
  374. package/src/components/version-history-panel.tsx +407 -0
  375. package/src/css.d.ts +2 -0
  376. package/src/download.ts +17 -0
  377. package/src/element-slot.ts +22 -0
  378. package/src/elicitation/ElicitationForm.tsx +87 -0
  379. package/src/errors.ts +12 -0
  380. package/src/extension-combos.ts +18 -0
  381. package/src/hooks/useApi.ts +27 -0
  382. package/src/hooks/useAuth.ts +67 -0
  383. package/src/hooks/useBreakpoint.ts +78 -0
  384. package/src/hooks/useCapabilities.ts +242 -0
  385. package/src/hooks/useSse.ts +314 -0
  386. package/src/hooks/useTheme.ts +133 -0
  387. package/src/hooks/useUnauthorized.ts +20 -0
  388. package/src/host.ts +15 -0
  389. package/src/index.ts +267 -0
  390. package/src/navigation/context.tsx +90 -0
  391. package/src/navigation/index.ts +9 -0
  392. package/src/navigation/types.ts +90 -0
  393. package/src/plugin/host-state.ts +93 -0
  394. package/src/plugin/registry.ts +174 -0
  395. package/src/plugin/types.ts +178 -0
  396. package/src/plugin/version.ts +44 -0
  397. package/src/query-keys.ts +34 -0
  398. package/src/schema-editor/SchemaEditor.tsx +186 -0
  399. package/src/schema-editor/index.ts +9 -0
  400. package/src/schema-editor/lint.ts +70 -0
  401. package/src/schema-form/SchemaForm.tsx +107 -0
  402. package/src/schema-form/array-field.tsx +110 -0
  403. package/src/schema-form/classify.ts +302 -0
  404. package/src/schema-form/context.ts +17 -0
  405. package/src/schema-form/default-value.ts +65 -0
  406. package/src/schema-form/enum-field.tsx +65 -0
  407. package/src/schema-form/field-group.tsx +71 -0
  408. package/src/schema-form/field-node.tsx +161 -0
  409. package/src/schema-form/index.ts +12 -0
  410. package/src/schema-form/media-field.tsx +281 -0
  411. package/src/schema-form/media.ts +69 -0
  412. package/src/schema-form/object-fields.tsx +74 -0
  413. package/src/schema-form/resolve.ts +114 -0
  414. package/src/schema-form/string-field.tsx +161 -0
  415. package/src/schema-form/styles.ts +20 -0
  416. package/src/schema-form/types.ts +71 -0
  417. package/src/schema-form/union-field.tsx +122 -0
  418. package/src/schema-form/union.ts +78 -0
  419. package/src/schema-form/unsupported-notice.tsx +39 -0
  420. package/src/schema-form/validate.ts +183 -0
  421. package/src/structured-output/StructuredOutput.tsx +81 -0
  422. package/src/testing.ts +235 -0
@@ -0,0 +1,119 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * `JsonDiff` — a GENERIC, kind-agnostic structural diff of two JSON values,
4
+ * hand-rolled (no diff library). It recursively walks OBJECT keys and emits one row
5
+ * per leaf difference: a key present only on one side is `added`/`removed`, a key
6
+ * whose value differs is `changed`.
7
+ *
8
+ * ARRAYS ARE LEAVES: an unequal array (by deep compare) emits exactly ONE `changed`
9
+ * row at the array's path carrying both whole array values — there are no per-index
10
+ * rows and no LCS alignment. A container object whose descendants differ emits rows
11
+ * only for the differing leaves, never for the container itself.
12
+ *
13
+ * Rendered as a table: the dotted `path` (e.g. `fixed_kwargs.city`) as code, the
14
+ * kind as a Badge (removed → danger, added → success, changed → neutral), and the
15
+ * before/after values as a `JsonTree` for objects/arrays or escaped text for
16
+ * scalars. Every value renders as React TEXT, so payload markup is escaped and this
17
+ * is never an HTML sink.
18
+ *
19
+ * Each row also carries its `tai-diff-*` tint, but the tint only REINFORCES the
20
+ * kind — the Badge spells the kind out in words, so a row is never identified by
21
+ * color alone.
22
+ */
23
+ import {} from 'react';
24
+ import { Badge } from './badge';
25
+ import { JsonTree } from './json-tree';
26
+ import { Table, TBody, TD, TH, THead, TR } from './table';
27
+ function isRecord(value) {
28
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
29
+ }
30
+ /** Structural deep-equality over JSON values (arrays compared position-wise). */
31
+ function deepEqual(a, b) {
32
+ if (a === b)
33
+ return true;
34
+ if (Array.isArray(a) && Array.isArray(b)) {
35
+ return a.length === b.length && a.every((item, index) => deepEqual(item, b[index]));
36
+ }
37
+ if (isRecord(a) && isRecord(b)) {
38
+ const keys = new Set([...Object.keys(a), ...Object.keys(b)]);
39
+ for (const key of keys) {
40
+ if (!deepEqual(a[key], b[key]))
41
+ return false;
42
+ }
43
+ return true;
44
+ }
45
+ return false;
46
+ }
47
+ function childPath(path, key) {
48
+ return path === '' ? key : `${path}.${key}`;
49
+ }
50
+ /**
51
+ * Recursively collect the leaf differences. Only when BOTH sides are plain objects
52
+ * does the walk descend by key; anything else (arrays, scalars, a type mismatch) is
53
+ * compared as a single leaf.
54
+ */
55
+ function collect(path, before, after, rows) {
56
+ if (isRecord(before) && isRecord(after)) {
57
+ const keys = [...new Set([...Object.keys(before), ...Object.keys(after)])].sort((a, b) => a.localeCompare(b));
58
+ for (const key of keys) {
59
+ const next = childPath(path, key);
60
+ const inBefore = key in before;
61
+ const inAfter = key in after;
62
+ if (inBefore && !inAfter) {
63
+ rows.push({ path: next, kind: 'removed', before: before[key] });
64
+ }
65
+ else if (!inBefore && inAfter) {
66
+ rows.push({ path: next, kind: 'added', after: after[key] });
67
+ }
68
+ else {
69
+ collect(next, before[key], after[key], rows);
70
+ }
71
+ }
72
+ return;
73
+ }
74
+ if (!deepEqual(before, after)) {
75
+ rows.push({ path, kind: 'changed', before, after });
76
+ }
77
+ }
78
+ /** The pure structural diff — every leaf difference between `before` and `after`. */
79
+ export function diffJson(before, after) {
80
+ const rows = [];
81
+ collect('', before, after, rows);
82
+ return rows;
83
+ }
84
+ const KIND_VARIANT = {
85
+ added: 'success',
86
+ removed: 'danger',
87
+ changed: 'neutral',
88
+ };
89
+ /** The row tint for each kind — a reinforcement of the Badge, never the sole cue. */
90
+ const KIND_ROW_CLASS = {
91
+ added: 'tai-diff-added',
92
+ removed: 'tai-diff-removed',
93
+ changed: 'tai-diff-changed',
94
+ };
95
+ /**
96
+ * Render one side's value: a `JsonTree` for objects/arrays, escaped text for
97
+ * scalars. The tree is a scroll region once it overflows, so it is named from
98
+ * the row's path and its side — a table of rows all announcing "JSON" tells a
99
+ * reader which pane they are in for none of them.
100
+ */
101
+ function DiffValue({ value, label, }) {
102
+ if (Array.isArray(value) || isRecord(value)) {
103
+ return _jsx(JsonTree, { data: value, defaultExpanded: false, label: label });
104
+ }
105
+ return _jsx("code", { className: "tai-code", children: JSON.stringify(value) });
106
+ }
107
+ /** The row's path as it reads on screen; the root diff has no path of its own. */
108
+ function pathLabel(path) {
109
+ return path === '' ? '(root)' : path;
110
+ }
111
+ const emptyCell = _jsx("span", { className: "tai-muted", children: "\u2014" });
112
+ export function JsonDiff({ before, after }) {
113
+ const rows = diffJson(before, after);
114
+ if (rows.length === 0) {
115
+ return _jsx("p", { className: "tai-muted", children: "No differences between the two values." });
116
+ }
117
+ return (_jsxs(Table, { children: [_jsx(THead, { children: _jsxs(TR, { children: [_jsx(TH, { children: "Path" }), _jsx(TH, { children: "Change" }), _jsx(TH, { children: "Before" }), _jsx(TH, { children: "After" })] }) }), _jsx(TBody, { children: rows.map((row, index) => (_jsxs(TR, { className: KIND_ROW_CLASS[row.kind], "data-testid": `diff-row-${row.path}`, children: [_jsx(TD, { className: "tai-table-id", style: { wordBreak: 'break-all' }, children: pathLabel(row.path) }), _jsx(TD, { children: _jsx(Badge, { variant: KIND_VARIANT[row.kind], children: row.kind }) }), _jsx(TD, { children: row.kind === 'added' ? (emptyCell) : (_jsx(DiffValue, { value: row.before, label: `${pathLabel(row.path)} before` })) }), _jsx(TD, { children: row.kind === 'removed' ? (emptyCell) : (_jsx(DiffValue, { value: row.after, label: `${pathLabel(row.path)} after` })) })] }, `${row.kind}-${row.path}-${String(index)}`))) })] }));
118
+ }
119
+ //# sourceMappingURL=json-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-diff.js","sourceRoot":"","sources":["../../src/components/json-diff.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAa1D,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,iFAAiF;AACjF,SAAS,SAAS,CAAC,CAAU,EAAE,CAAU;IACvC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,GAAW;IAC1C,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,IAAY,EAAE,MAAe,EAAE,KAAc,EAAE,IAAmB;IACjF,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACvF,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CACnB,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAG,GAAG,IAAI,MAAM,CAAC;YAC/B,MAAM,OAAO,GAAG,GAAG,IAAI,KAAK,CAAC;YAC7B,IAAI,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClE,CAAC;iBAAM,IAAI,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC;gBAChC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,QAAQ,CAAC,MAAe,EAAE,KAAc;IACtD,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,YAAY,GAAG;IACnB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,SAAS;CACV,CAAC;AAEX,qFAAqF;AACrF,MAAM,cAAc,GAAG;IACrB,KAAK,EAAE,gBAAgB;IACvB,OAAO,EAAE,kBAAkB;IAC3B,OAAO,EAAE,kBAAkB;CACnB,CAAC;AAEX;;;;;GAKG;AACH,SAAS,SAAS,CAAC,EACjB,KAAK,EACL,KAAK,GAIN;IACC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAC,QAAQ,IAAC,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC;IACzE,CAAC;IACD,OAAO,eAAM,SAAS,EAAC,UAAU,YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAQ,CAAC;AACnE,CAAC;AAED,kFAAkF;AAClF,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AACvC,CAAC;AAED,MAAM,SAAS,GAAG,eAAM,SAAS,EAAC,WAAW,uBAAS,CAAC;AAOvD,MAAM,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,EAAiB;IACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAErC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,YAAG,SAAS,EAAC,WAAW,uDAA2C,CAAC;IAC7E,CAAC;IAED,OAAO,CACL,MAAC,KAAK,eACJ,KAAC,KAAK,cACJ,MAAC,EAAE,eACD,KAAC,EAAE,uBAAU,EACb,KAAC,EAAE,yBAAY,EACf,KAAC,EAAE,yBAAY,EACf,KAAC,EAAE,wBAAW,IACX,GACC,EACR,KAAC,KAAK,cACH,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CACxB,MAAC,EAAE,IAED,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,iBACtB,YAAY,GAAG,CAAC,IAAI,EAAE,aAEnC,KAAC,EAAE,IAAC,SAAS,EAAC,cAAc,EAAC,KAAK,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,YAC3D,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GACjB,EACL,KAAC,EAAE,cACD,KAAC,KAAK,IAAC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAG,GAAG,CAAC,IAAI,GAAS,GACvD,EACL,KAAC,EAAE,cACA,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CACtB,SAAS,CACV,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAI,CACzE,GACE,EACL,KAAC,EAAE,cACA,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CACxB,SAAS,CACV,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IAAC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAI,CACvE,GACE,KAvBA,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAwB5C,CACN,CAAC,GACI,IACF,CACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface JsonTreeProps {
2
+ readonly data: unknown;
3
+ readonly defaultExpanded?: boolean;
4
+ /** The region's accessible name, applied only while the pane actually scrolls. */
5
+ readonly label?: string;
6
+ }
7
+ export declare function JsonTree({ data, defaultExpanded, label }: JsonTreeProps): import("react").JSX.Element;
8
+ //# sourceMappingURL=json-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-tree.d.ts","sourceRoot":"","sources":["../../src/components/json-tree.tsx"],"names":[],"mappings":"AAmBA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,kFAAkF;IAClF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AA8FD,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAsB,EAAE,KAAK,EAAE,EAAE,aAAa,+BAU9E"}
@@ -0,0 +1,70 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useOverflowRegion } from './scroll-region';
3
+ /** The region's name when the caller supplies none. */
4
+ const DEFAULT_LABEL = 'JSON';
5
+ function isRecord(value) {
6
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
7
+ }
8
+ function primitiveText(value) {
9
+ if (value === null)
10
+ return 'null';
11
+ switch (typeof value) {
12
+ case 'undefined':
13
+ return 'undefined';
14
+ case 'string':
15
+ return `"${value}"`;
16
+ case 'number':
17
+ case 'bigint':
18
+ case 'boolean':
19
+ return String(value);
20
+ case 'symbol':
21
+ return value.toString();
22
+ case 'function':
23
+ return '[Function]';
24
+ default:
25
+ return '[object]';
26
+ }
27
+ }
28
+ /**
29
+ * One nesting level's indent: the child block insets and draws its own guide
30
+ * rail. The depth is expressed by the DOM nesting, so each level repeats this
31
+ * single step rather than computing an absolute offset.
32
+ */
33
+ const childrenStyle = {
34
+ paddingLeft: 'var(--tai-space-4)',
35
+ marginLeft: 'var(--tai-space-1)',
36
+ borderLeft: '1px solid var(--tai-color-decor)',
37
+ };
38
+ /** A `<summary>` is a click target; browsers do not style it as one by default. */
39
+ const summaryStyle = { cursor: 'pointer' };
40
+ /** The syntax class for a primitive's type; anything outside JSON reads as muted. */
41
+ function primitiveClass(value) {
42
+ if (typeof value === 'string')
43
+ return 'tai-syntax-string';
44
+ if (typeof value === 'number' || typeof value === 'bigint')
45
+ return 'tai-syntax-number';
46
+ if (typeof value === 'boolean')
47
+ return 'tai-syntax-bool';
48
+ if (value === null || value === undefined)
49
+ return 'tai-syntax-null';
50
+ return 'tai-muted';
51
+ }
52
+ function JsonNode({ name, value, defaultExpanded }) {
53
+ if (Array.isArray(value) || isRecord(value)) {
54
+ const entries = Array.isArray(value)
55
+ ? value.map((item, index) => [String(index), item])
56
+ : Object.entries(value);
57
+ const summary = Array.isArray(value)
58
+ ? `Array(${String(value.length)})`
59
+ : `Object(${String(entries.length)})`;
60
+ return (_jsxs("details", { open: defaultExpanded, children: [_jsxs("summary", { style: summaryStyle, children: [name !== undefined ? _jsxs("span", { className: "tai-syntax-key", children: [name, ": "] }) : null, _jsx("span", { className: "tai-muted", children: summary })] }), _jsx("div", { style: childrenStyle, children: entries.map(([childName, childValue]) => (_jsx(JsonNode, { name: childName, value: childValue, defaultExpanded: defaultExpanded }, childName))) })] }));
61
+ }
62
+ return (_jsxs("div", { children: [name !== undefined ? _jsxs("span", { className: "tai-syntax-key", children: [name, ": "] }) : null, _jsx("span", { className: primitiveClass(value), children: primitiveText(value) })] }));
63
+ }
64
+ export function JsonTree({ data, defaultExpanded = true, label }) {
65
+ // No consumer ref: the measurement's own callback ref is the only thing that
66
+ // needs the pane, and this component publishes no `ref` prop.
67
+ const region = useOverflowRegion(undefined, label ?? DEFAULT_LABEL);
68
+ return (_jsx("div", { className: "tai-code-block", ...region, children: _jsx(JsonNode, { value: data, defaultExpanded: defaultExpanded }) }));
69
+ }
70
+ //# sourceMappingURL=json-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-tree.js","sourceRoot":"","sources":["../../src/components/json-tree.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface ModalFocusReturnHandlers {
2
+ /** Runs before Radix moves focus into the panel, while the opener still holds it. */
3
+ readonly onOpenAutoFocus: (event: Event) => void;
4
+ /** Runs as the panel unmounts, before the focus scope would restore. */
5
+ readonly onCloseAutoFocus: (event: Event) => void;
6
+ }
7
+ /**
8
+ * The `onOpenAutoFocus` / `onCloseAutoFocus` pair to spread onto a Radix
9
+ * `Dialog.Content`.
10
+ *
11
+ * @param hasTrigger - whether a Radix `Trigger` is rendered. When it is, both
12
+ * handlers stand down and Radix's own focus return applies.
13
+ */
14
+ export declare function useModalFocusReturn(hasTrigger: boolean): ModalFocusReturnHandlers;
15
+ //# sourceMappingURL=modal-focus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal-focus.d.ts","sourceRoot":"","sources":["../../src/components/modal-focus.ts"],"names":[],"mappings":"AA6CA,MAAM,WAAW,wBAAwB;IACvC,qFAAqF;IACrF,QAAQ,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjD,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACnD;AA8CD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,OAAO,GAAG,wBAAwB,CA8CjF"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Focus return for a modal that renders no Radix `Trigger`.
3
+ *
4
+ * Radix composes its own close handler AFTER the consumer's — `composeEventHandlers`
5
+ * runs the consumer's `onCloseAutoFocus` first and skips Radix's only when that
6
+ * handler called `preventDefault`. Radix's handler is
7
+ * `event.preventDefault(); triggerRef.current?.focus()`: it returns focus to the
8
+ * Trigger and cancels the focus scope's restore in the same breath. A modal
9
+ * driven purely by `open`/`onOpenChange` — every confirm mounted for the
10
+ * duration of one action — has no Trigger for that ref to point at, so if that
11
+ * handler is allowed to run the cancel lands, the focus does not, and the reader
12
+ * is left on `<body>` with their place in the page gone (WCAG 2.4.3).
13
+ *
14
+ * So with no Trigger this stands in for one and never yields the decision back:
15
+ * it prevents default unconditionally — Radix's restore is a guaranteed no-op
16
+ * here, and a `<body>` if allowed to run — and then lands the focus itself, on
17
+ * the first of these that will take it:
18
+ *
19
+ * 1. the element focus left on the way in, when it can still hold focus;
20
+ * 2. the nearest of that element's ancestors still in the document, borrowing
21
+ * it a `tabindex="-1"` if it has none.
22
+ *
23
+ * The second case is the common one, not the exotic one: the action a confirm
24
+ * confirms is usually what removes, disables or hides the control that opened
25
+ * it. The list or table the vanished row sat in is still on screen and is where
26
+ * the reader was, so that is where they are put back.
27
+ *
28
+ * Those ancestors are recorded on the way IN because they cannot be recovered on
29
+ * the way out: detaching a node clears its own `parentElement`, so walking up
30
+ * from a removed row's button dead-ends inside the removed subtree instead of
31
+ * reaching the list that is still there. While the opener is still attached its
32
+ * live chain is used instead, so an opener that moved is followed rather than
33
+ * remembered wrongly.
34
+ *
35
+ * A borrowed `tabindex` is handed back on the element's `blur`, so the DOM keeps
36
+ * the attribute only while that element actually holds focus — and an element
37
+ * that is itself removed first takes the listener with it. Removing it any
38
+ * earlier would strip the attribute out from under the focus it exists to hold.
39
+ *
40
+ * When a Trigger IS rendered both handlers stand down and prevent nothing, so
41
+ * Radix's own restore runs untouched — there is never a second mechanism
42
+ * competing with the primitive.
43
+ */
44
+ import { useRef } from 'react';
45
+ /**
46
+ * `element`'s ancestors, nearest first, stopping short of `<body>` — landing on
47
+ * `<body>` is the failure this module exists to prevent, and it is already where
48
+ * focus falls when nothing else will take it.
49
+ */
50
+ function ancestorChain(element) {
51
+ const chain = [];
52
+ const { body } = element.ownerDocument;
53
+ for (let node = element.parentElement; node !== null && node !== body; node = node.parentElement) {
54
+ chain.push(node);
55
+ }
56
+ return chain;
57
+ }
58
+ /**
59
+ * Focuses a container that was never meant to be focusable, lending it a
60
+ * `tabindex="-1"` if it has none and taking that back when it loses focus.
61
+ *
62
+ * @returns whether the focus actually landed.
63
+ */
64
+ function focusAsFallback(element) {
65
+ const borrowed = !element.hasAttribute('tabindex');
66
+ if (borrowed)
67
+ element.setAttribute('tabindex', '-1');
68
+ element.focus();
69
+ if (element.ownerDocument.activeElement !== element) {
70
+ if (borrowed)
71
+ element.removeAttribute('tabindex');
72
+ return false;
73
+ }
74
+ if (borrowed) {
75
+ element.addEventListener('blur', () => {
76
+ element.removeAttribute('tabindex');
77
+ }, { once: true });
78
+ }
79
+ return true;
80
+ }
81
+ /**
82
+ * The `onOpenAutoFocus` / `onCloseAutoFocus` pair to spread onto a Radix
83
+ * `Dialog.Content`.
84
+ *
85
+ * @param hasTrigger - whether a Radix `Trigger` is rendered. When it is, both
86
+ * handlers stand down and Radix's own focus return applies.
87
+ */
88
+ export function useModalFocusReturn(hasTrigger) {
89
+ const openerRef = useRef(null);
90
+ const openedUnderRef = useRef([]);
91
+ return {
92
+ onOpenAutoFocus: () => {
93
+ // Recording is only ever read by the close handler, which stands down with
94
+ // a Trigger present. Standing down here too keeps the pair symmetric and
95
+ // stops the hook holding the opener and its whole ancestor chain alive for
96
+ // a modal that will never consult them.
97
+ if (hasTrigger)
98
+ return;
99
+ // The focus scope dispatches this BEFORE it focuses the panel, so the
100
+ // active element is still whatever the reader activated to open the modal,
101
+ // and its ancestors are still attached to record.
102
+ const active = document.activeElement;
103
+ const opener = active instanceof HTMLElement ? active : null;
104
+ openerRef.current = opener;
105
+ openedUnderRef.current = opener === null ? [] : ancestorChain(opener);
106
+ },
107
+ onCloseAutoFocus: (event) => {
108
+ if (hasTrigger)
109
+ return;
110
+ const opener = openerRef.current;
111
+ const openedUnder = openedUnderRef.current;
112
+ openerRef.current = null;
113
+ openedUnderRef.current = [];
114
+ // Radix's handler runs next unless this one prevents default. Its
115
+ // `triggerRef` is null by definition here, and it cancels the scope's
116
+ // restore before finding that out, so letting it run is a guaranteed
117
+ // `<body>`. Take the decision away from it in every case, including the
118
+ // one where there is nothing to return focus to.
119
+ event.preventDefault();
120
+ if (opener === null)
121
+ return;
122
+ opener.focus();
123
+ if (opener.ownerDocument.activeElement === opener)
124
+ return;
125
+ // The opener would not take focus — it was removed, disabled or hidden by
126
+ // the action this modal confirmed. Fall back to the nearest ancestor that
127
+ // is still in the document, so the reader keeps their place in the page.
128
+ const chain = opener.isConnected ? ancestorChain(opener) : openedUnder;
129
+ for (const ancestor of chain) {
130
+ if (ancestor.isConnected && focusAsFallback(ancestor))
131
+ return;
132
+ }
133
+ },
134
+ };
135
+ }
136
+ //# sourceMappingURL=modal-focus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal-focus.js","sourceRoot":"","sources":["../../src/components/modal-focus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAS/B;;;;GAIG;AACH,SAAS,aAAa,CAAC,OAAoB;IACzC,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IACvC,KACE,IAAI,IAAI,GAAG,OAAO,CAAC,aAAa,EAChC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAC9B,IAAI,GAAG,IAAI,CAAC,aAAa,EACzB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,OAAoB;IAC3C,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IACnD,IAAI,QAAQ;QAAE,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACrD,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,IAAI,OAAO,CAAC,aAAa,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;QACpD,IAAI,QAAQ;YAAE,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,gBAAgB,CACtB,MAAM,EACN,GAAG,EAAE;YACH,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QACtC,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAmB;IACrD,MAAM,SAAS,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,MAAM,CAAgB,EAAE,CAAC,CAAC;IAEjD,OAAO;QACL,eAAe,EAAE,GAAS,EAAE;YAC1B,2EAA2E;YAC3E,yEAAyE;YACzE,2EAA2E;YAC3E,wCAAwC;YACxC,IAAI,UAAU;gBAAE,OAAO;YACvB,sEAAsE;YACtE,2EAA2E;YAC3E,kDAAkD;YAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,YAAY,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7D,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;YAC3B,cAAc,CAAC,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACxE,CAAC;QACD,gBAAgB,EAAE,CAAC,KAAY,EAAQ,EAAE;YACvC,IAAI,UAAU;gBAAE,OAAO;YACvB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;YACjC,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC;YAC3C,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;YACzB,cAAc,CAAC,OAAO,GAAG,EAAE,CAAC;YAE5B,kEAAkE;YAClE,sEAAsE;YACtE,qEAAqE;YACrE,wEAAwE;YACxE,iDAAiD;YACjD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO;YAE5B,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,CAAC,aAAa,CAAC,aAAa,KAAK,MAAM;gBAAE,OAAO;YAE1D,0EAA0E;YAC1E,0EAA0E;YAC1E,yEAAyE;YACzE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;YACvE,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;gBAC7B,IAAI,QAAQ,CAAC,WAAW,IAAI,eAAe,CAAC,QAAQ,CAAC;oBAAE,OAAO;YAChE,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * `PageHeader`, `Page`, `Stack` — the screen scaffolding every feature was
3
+ * hand-rolling as a flex column plus an ad-hoc heading block.
4
+ *
5
+ * `PageHeader` owns a DOM contract `page-header.test.tsx` asserts: exactly one
6
+ * `<h1>` whose accessible name is the title VERBATIM. The nav-section eyebrow a
7
+ * screen shows above its title is therefore a SIBLING of the `<h1>`, never a
8
+ * child — nesting it would fold it into the computed name and break every
9
+ * heading assertion. The `<h1>` is also permanently focusable
10
+ * (`tabIndex={-1}`), which is what makes it addressable as a focus target
11
+ * through {@link PageHeaderProps.titleRef} or `id`.
12
+ */
13
+ import type { CSSProperties, ReactElement, ReactNode, Ref } from 'react';
14
+ /** The wrapper props both layout primitives share, ref included. */
15
+ interface LayoutElementProps {
16
+ readonly className?: string;
17
+ readonly style?: CSSProperties;
18
+ /** A consumer ref for the wrapper element itself. */
19
+ readonly ref?: Ref<HTMLDivElement>;
20
+ }
21
+ export interface PageHeaderProps {
22
+ /** The screen's title. It is the `<h1>`'s accessible name, VERBATIM. */
23
+ readonly title: string;
24
+ /** The screen's existing nav-section label, rendered ABOVE the h1 — never inside it. */
25
+ readonly eyebrow?: string;
26
+ readonly description?: string;
27
+ readonly actions?: ReactNode;
28
+ /**
29
+ * A consumer ref for the `<h1>`. Published so a caller that wants to move
30
+ * focus to the new screen's title — after a route change, say — has the
31
+ * element without querying for it; the heading is focusable for that reason.
32
+ */
33
+ readonly titleRef?: Ref<HTMLHeadingElement>;
34
+ /**
35
+ * An id for the `<h1>`, not for the `<header>` root. The heading is the element
36
+ * a caller has a reason to address — an `aria-labelledby` pointing at it names
37
+ * the region from the screen's own title — and it is the other way to reach it
38
+ * as a focus target.
39
+ */
40
+ readonly id?: string;
41
+ }
42
+ export declare function PageHeader({ title, eyebrow, description, actions, titleRef, id, }: PageHeaderProps): ReactElement;
43
+ export interface PageLayoutProps extends LayoutElementProps {
44
+ readonly children: ReactNode;
45
+ }
46
+ /** The screen wrapper: the max-width, the gutters, and the vertical rhythm. */
47
+ export declare function Page({ children, className, style, ref }: PageLayoutProps): ReactElement;
48
+ export interface StackProps extends LayoutElementProps {
49
+ readonly children: ReactNode;
50
+ /** The gap step; 4 is the default and needs no modifier class. */
51
+ readonly gap?: 2 | 3 | 4 | 6;
52
+ }
53
+ /** A vertical flex column on the spacing scale. */
54
+ export declare function Stack({ children, gap, className, style, ref }: StackProps): ReactElement;
55
+ export {};
56
+ //# sourceMappingURL=page-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-header.d.ts","sourceRoot":"","sources":["../../src/components/page-header.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEzE,oEAAoE;AACpE,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,qDAAqD;IACrD,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC5C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,OAAO,EACP,WAAW,EACX,OAAO,EACP,QAAQ,EACR,EAAE,GACH,EAAE,eAAe,GAAG,YAAY,CAahC;AAED,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;IACzD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAED,+EAA+E;AAC/E,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,eAAe,GAAG,YAAY,CAUvF;AAED,MAAM,WAAW,UAAW,SAAQ,kBAAkB;IACpD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC9B;AASD,mDAAmD;AACnD,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,UAAU,GAAG,YAAY,CAS5F"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function PageHeader({ title, eyebrow, description, actions, titleRef, id, }) {
3
+ return (_jsxs("header", { className: "tai-page-header", children: [_jsxs("div", { children: [eyebrow === undefined ? null : _jsx("div", { className: "tai-label", children: eyebrow }), _jsx("h1", { className: "tai-page-title", tabIndex: -1, ref: titleRef, id: id, children: title }), description === undefined ? null : _jsx("p", { className: "tai-page-description", children: description })] }), actions === undefined ? null : _jsx("div", { className: "tai-page-actions", children: actions })] }));
4
+ }
5
+ /** The screen wrapper: the max-width, the gutters, and the vertical rhythm. */
6
+ export function Page({ children, className, style, ref }) {
7
+ return (_jsx("div", { className: className === undefined ? 'tai-page' : `tai-page ${className}`, style: style, ref: ref, children: children }));
8
+ }
9
+ /** The modifier class per non-default gap step; gap 4 is `.tai-stack`'s own gap. */
10
+ const STACK_GAP_CLASS = {
11
+ 2: 'tai-stack-2',
12
+ 3: 'tai-stack-3',
13
+ 6: 'tai-stack-6',
14
+ };
15
+ /** A vertical flex column on the spacing scale. */
16
+ export function Stack({ children, gap = 4, className, style, ref }) {
17
+ const classes = ['tai-stack'];
18
+ if (gap !== 4)
19
+ classes.push(STACK_GAP_CLASS[gap]);
20
+ if (className !== undefined)
21
+ classes.push(className);
22
+ return (_jsx("div", { className: classes.join(' '), style: style, ref: ref, children: children }));
23
+ }
24
+ //# sourceMappingURL=page-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-header.js","sourceRoot":"","sources":["../../src/components/page-header.tsx"],"names":[],"mappings":";AA4CA,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,OAAO,EACP,WAAW,EACX,OAAO,EACP,QAAQ,EACR,EAAE,GACc;IAChB,OAAO,CACL,kBAAQ,SAAS,EAAC,iBAAiB,aACjC,0BACG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,WAAW,YAAE,OAAO,GAAO,EAC1E,aAAI,SAAS,EAAC,gBAAgB,EAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,YAC/D,KAAK,GACH,EACJ,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,sBAAsB,YAAE,WAAW,GAAK,IACrF,EACL,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,kBAAkB,YAAE,OAAO,GAAO,IAC1E,CACV,CAAC;AACJ,CAAC;AAMD,+EAA+E;AAC/E,MAAM,UAAU,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAmB;IACvE,OAAO,CACL,cACE,SAAS,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,SAAS,EAAE,EACzE,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,GAAG,YAEP,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAQD,oFAAoF;AACpF,MAAM,eAAe,GAA8B;IACjD,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;CACjB,CAAC;AAEF,mDAAmD;AACnD,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAc;IAC5E,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrD,OAAO,CACL,cAAK,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,YACtD,QAAQ,GACL,CACP,CAAC;AACJ,CAAC"}