@sanity/ui 4.0.0-static.9 → 5.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (808) hide show
  1. package/README.md +201 -17
  2. package/bin/sanity-ui.js +14 -0
  3. package/dist/_chunks-es/LazyRefractor.js +20 -0
  4. package/dist/_chunks-es/LazyRefractor.js.map +1 -0
  5. package/dist/cli/checks.js +148 -0
  6. package/dist/cli/config.js +23 -0
  7. package/dist/cli/detect.js +181 -0
  8. package/dist/cli/doctor.js +49 -0
  9. package/dist/cli/index.js +69 -0
  10. package/dist/cli/init.js +189 -0
  11. package/dist/cli/install.js +78 -0
  12. package/dist/cli/log.js +66 -0
  13. package/dist/cli/selfPackage.js +11 -0
  14. package/dist/cli/styles.js +185 -0
  15. package/dist/cli/test-utils.js +8 -0
  16. package/dist/cli/tsconfig.js +236 -0
  17. package/dist/cli/types.js +1 -0
  18. package/dist/cli/versions.js +45 -0
  19. package/dist/index.d.ts +744 -2272
  20. package/dist/index.js +1743 -4395
  21. package/dist/index.js.map +1 -1
  22. package/dist/styles.css +1 -0
  23. package/package.json +66 -206
  24. package/src/cli/checks.test.ts +38 -0
  25. package/src/cli/checks.ts +200 -0
  26. package/src/cli/config.ts +44 -0
  27. package/src/cli/detect.test.ts +191 -0
  28. package/src/cli/detect.ts +205 -0
  29. package/src/cli/doctor.test.ts +52 -0
  30. package/src/cli/doctor.ts +65 -0
  31. package/src/cli/index.ts +77 -0
  32. package/src/cli/init.ts +225 -0
  33. package/src/cli/install.test.ts +52 -0
  34. package/src/cli/install.ts +107 -0
  35. package/src/cli/log.ts +79 -0
  36. package/src/cli/selfPackage.ts +14 -0
  37. package/src/cli/styles.test.ts +130 -0
  38. package/src/cli/styles.ts +205 -0
  39. package/src/cli/test-utils.ts +10 -0
  40. package/src/cli/tsconfig.test.ts +174 -0
  41. package/src/cli/tsconfig.ts +282 -0
  42. package/src/cli/types.ts +77 -0
  43. package/src/cli/versions.test.ts +35 -0
  44. package/src/cli/versions.ts +41 -0
  45. package/src/components/box/Box.tsx +25 -0
  46. package/src/components/box/box.css +4 -0
  47. package/src/components/box/box.props.ts +24 -0
  48. package/src/components/button/Button.tsx +78 -0
  49. package/src/components/button/button.css +72 -0
  50. package/src/components/button/button.props.ts +104 -0
  51. package/src/components/card/Card.tsx +31 -0
  52. package/src/components/card/card.css +4 -0
  53. package/src/components/card/card.props.ts +54 -0
  54. package/src/components/checkbox/Checkbox.tsx +63 -0
  55. package/src/components/checkbox/checkbox.css +100 -0
  56. package/src/components/checkbox/checkbox.props.ts +25 -0
  57. package/src/components/code/Code.tsx +38 -0
  58. package/src/components/code/LazyRefractor.tsx +9 -0
  59. package/src/components/code/code.css +40 -0
  60. package/src/components/code/code.props.ts +37 -0
  61. package/src/components/container/Container.tsx +30 -0
  62. package/src/components/container/container.css +4 -0
  63. package/src/components/container/container.props.ts +24 -0
  64. package/src/components/divider/Divider.tsx +23 -0
  65. package/src/components/divider/divider.props.ts +9 -0
  66. package/src/components/eyebrow/Eyebrow.tsx +54 -0
  67. package/src/components/eyebrow/eyebrow.css +11 -0
  68. package/src/components/eyebrow/eyebrow.props.ts +24 -0
  69. package/src/components/flex/Flex.tsx +25 -0
  70. package/src/components/flex/flex.css +4 -0
  71. package/src/components/flex/flex.props.ts +29 -0
  72. package/src/components/grid/Grid.tsx +25 -0
  73. package/src/components/grid/grid.css +4 -0
  74. package/src/components/grid/grid.props.ts +29 -0
  75. package/src/components/h-stack/HStack.tsx +34 -0
  76. package/src/components/h-stack/hStack.props.ts +15 -0
  77. package/src/components/heading/Heading.tsx +54 -0
  78. package/src/components/heading/heading.css +9 -0
  79. package/src/components/heading/heading.props.ts +25 -0
  80. package/src/components/icon/Icon.tsx +24 -0
  81. package/src/components/icon/icon.css +17 -0
  82. package/src/components/icon/icon.props.ts +31 -0
  83. package/src/components/icon-button/IconButton.tsx +32 -0
  84. package/src/components/icon-button/iconButton.props.ts +26 -0
  85. package/src/components/index.css +25 -0
  86. package/src/components/indicator/Indicator.tsx +42 -0
  87. package/src/components/indicator/indicator.css +4 -0
  88. package/src/components/indicator/indicator.props.ts +20 -0
  89. package/src/components/indicator-stack/IndicatorStack.tsx +31 -0
  90. package/src/components/indicator-stack/indicator-stack.css +7 -0
  91. package/src/components/indicator-stack/indicatorStack.props.ts +13 -0
  92. package/src/components/inline/Inline.tsx +38 -0
  93. package/src/components/inline/inline.css +4 -0
  94. package/src/components/inline/inline.props.ts +96 -0
  95. package/src/components/label/Label.tsx +34 -0
  96. package/src/components/label/label.css +3 -0
  97. package/src/components/label/label.props.ts +19 -0
  98. package/src/components/link/Link.tsx +29 -0
  99. package/src/components/link/link.css +12 -0
  100. package/src/components/link/link.props.ts +23 -0
  101. package/src/components/list/List.tsx +167 -0
  102. package/src/components/list/list.css +25 -0
  103. package/src/components/list/list.props.ts +112 -0
  104. package/src/components/press-area/PressArea.tsx +29 -0
  105. package/src/components/press-area/press-area.css +22 -0
  106. package/src/components/press-area/pressArea.props.ts +14 -0
  107. package/src/components/radio/Radio.tsx +48 -0
  108. package/src/components/radio/radio.css +97 -0
  109. package/src/components/radio/radio.props.ts +20 -0
  110. package/src/components/skip-to-content/SkipToContent.tsx +35 -0
  111. package/src/components/skip-to-content/skip-to-content.css +9 -0
  112. package/src/components/skip-to-content/skipToContent.props.ts +19 -0
  113. package/src/components/spinner/Spinner.tsx +28 -0
  114. package/src/components/spinner/spinner.css +10 -0
  115. package/src/components/spinner/spinner.props.ts +16 -0
  116. package/src/components/switch/Switch.tsx +48 -0
  117. package/src/components/switch/switch.css +119 -0
  118. package/src/components/switch/switch.props.ts +20 -0
  119. package/src/components/text/Text.tsx +53 -0
  120. package/src/components/text/text.css +9 -0
  121. package/src/components/text/text.props.ts +24 -0
  122. package/src/components/tooltip/Tooltip.tsx +93 -0
  123. package/src/components/tooltip/tooltip.css +52 -0
  124. package/src/components/tooltip/tooltip.props.ts +20 -0
  125. package/src/components/tooltip-group/TooltipGroup.tsx +67 -0
  126. package/src/components/tooltip-group/tooltipGroup.props.ts +13 -0
  127. package/src/components/v-stack/VStack.tsx +32 -0
  128. package/src/components/v-stack/vStack.props.ts +15 -0
  129. package/src/components/visually-hidden/VisuallyHidden.tsx +29 -0
  130. package/src/components/visually-hidden/visually-hidden.css +9 -0
  131. package/src/components/visually-hidden/visuallyHidden.props.ts +19 -0
  132. package/src/css/classes/dynamic/flex-child.css +5 -0
  133. package/src/css/classes/dynamic/grid-child.css +8 -0
  134. package/src/css/classes/dynamic/grid-parent.css +6 -0
  135. package/src/css/classes/dynamic/height.css +5 -0
  136. package/src/css/classes/dynamic/index.css +7 -0
  137. package/src/css/classes/dynamic/line-clamp.css +5 -0
  138. package/src/css/classes/dynamic/readme.md +3 -0
  139. package/src/css/classes/dynamic/width.css +7 -0
  140. package/src/css/classes/dynamic/z-index.css +3 -0
  141. package/src/css/classes/generic/display.css +10 -0
  142. package/src/css/classes/generic/flex.css +24 -0
  143. package/src/css/classes/generic/grid.css +7 -0
  144. package/src/css/classes/generic/index.css +7 -0
  145. package/src/css/classes/generic/overflow.css +19 -0
  146. package/src/css/classes/generic/placement.css +171 -0
  147. package/src/css/classes/generic/position.css +7 -0
  148. package/src/css/classes/generic/readme.md +3 -0
  149. package/src/css/classes/generic/text-align.css +5 -0
  150. package/src/css/classes/index.css +4 -0
  151. package/src/css/classes/local/border.css +20 -0
  152. package/src/css/classes/local/index.css +4 -0
  153. package/src/css/classes/local/readme.md +3 -0
  154. package/src/css/classes/local/text-overflow.css +5 -0
  155. package/src/css/classes/local/text-trim.css +45 -0
  156. package/src/css/classes/local/tone.css +75 -0
  157. package/src/css/classes/system/color.css +223 -0
  158. package/src/css/classes/system/container.css +8 -0
  159. package/src/css/classes/system/font-family.css +2 -0
  160. package/src/css/classes/system/font-weight.css +4 -0
  161. package/src/css/classes/system/gap.css +37 -0
  162. package/src/css/classes/system/index.css +10 -0
  163. package/src/css/classes/system/inset.css +56 -0
  164. package/src/css/classes/system/margin.css +148 -0
  165. package/src/css/classes/system/padding.css +78 -0
  166. package/src/css/classes/system/radius.css +10 -0
  167. package/src/css/classes/system/readme.md +3 -0
  168. package/src/css/classes/system/shadow.css +6 -0
  169. package/src/css/classes/system/typography.css +31 -0
  170. package/src/css/global/font-face.css +20 -0
  171. package/src/css/global/index.css +2 -0
  172. package/src/css/global/reset.css +74 -0
  173. package/src/css/tokens/index.css +3 -0
  174. package/src/css/tokens/opacity.css +6 -0
  175. package/src/css/tokens/semantic.css +21 -0
  176. package/src/css/tokens/surface.css +27 -0
  177. package/src/index.css +18 -0
  178. package/src/index.ts +60 -0
  179. package/src/props/border.ts +51 -0
  180. package/src/props/flexChild.ts +29 -0
  181. package/src/props/flexParent.ts +47 -0
  182. package/src/props/gap.ts +31 -0
  183. package/src/props/gridChild.ts +50 -0
  184. package/src/props/gridParent.ts +45 -0
  185. package/src/props/height.ts +29 -0
  186. package/src/props/layout.ts +44 -0
  187. package/src/props/margin.ts +59 -0
  188. package/src/props/overflow.ts +30 -0
  189. package/src/props/padding.ts +59 -0
  190. package/src/props/placement.ts +16 -0
  191. package/src/props/position.ts +52 -0
  192. package/src/props/shadow.ts +15 -0
  193. package/src/props/tone.ts +15 -0
  194. package/src/props/typography.ts +62 -0
  195. package/src/props/width.ts +29 -0
  196. package/src/props/zIndex.ts +15 -0
  197. package/src/styles.css.d.ts +1 -0
  198. package/src/styles.css.node.js +2 -0
  199. package/src/styles.css.test.ts +24 -0
  200. package/src/types/Button.ts +8 -0
  201. package/src/types/Code.ts +6 -0
  202. package/src/types/Container.ts +3 -0
  203. package/src/types/Density.ts +3 -0
  204. package/src/types/Display.ts +11 -0
  205. package/src/types/Eyebrow.ts +3 -0
  206. package/src/types/Flex.ts +22 -0
  207. package/src/types/FontWeight.ts +3 -0
  208. package/src/types/Grid.ts +3 -0
  209. package/src/types/Heading.ts +6 -0
  210. package/src/types/Icon.ts +3 -0
  211. package/src/types/Interactive.ts +8 -0
  212. package/src/types/List.ts +2 -0
  213. package/src/types/Overflow.ts +3 -0
  214. package/src/types/Placement.ts +16 -0
  215. package/src/types/Position.ts +3 -0
  216. package/src/types/PropDef.ts +73 -0
  217. package/src/types/Radius.ts +3 -0
  218. package/src/types/Responsive.ts +10 -0
  219. package/src/types/Shadow.ts +3 -0
  220. package/src/types/Space.ts +15 -0
  221. package/src/types/Text.ts +3 -0
  222. package/src/types/TextAlign.ts +3 -0
  223. package/src/types/Tone.ts +3 -0
  224. package/src/utils/getProps.test.ts +156 -0
  225. package/src/utils/getProps.ts +156 -0
  226. package/src/utils/suffixClassName.ts +5 -0
  227. package/src/version.ts +3 -0
  228. package/LICENSE +0 -21
  229. package/dist/_chunks-cjs/refractor.cjs +0 -22
  230. package/dist/_chunks-cjs/refractor.cjs.map +0 -1
  231. package/dist/_chunks-es/refractor.js +0 -25
  232. package/dist/_chunks-es/refractor.js.map +0 -1
  233. package/dist/css/index.cjs +0 -966
  234. package/dist/css/index.cjs.map +0 -1
  235. package/dist/css/index.css +0 -23387
  236. package/dist/css/index.css.map +0 -1
  237. package/dist/css/index.d.cts +0 -1394
  238. package/dist/css/index.d.ts +0 -1394
  239. package/dist/css/index.js +0 -967
  240. package/dist/css/index.js.map +0 -1
  241. package/dist/index.cjs +0 -4515
  242. package/dist/index.cjs.map +0 -1
  243. package/dist/index.d.cts +0 -2521
  244. package/dist/theme.cjs +0 -870
  245. package/dist/theme.cjs.map +0 -1
  246. package/dist/theme.d.cts +0 -499
  247. package/dist/theme.d.ts +0 -499
  248. package/dist/theme.js +0 -870
  249. package/dist/theme.js.map +0 -1
  250. package/exports/css.ts +0 -1
  251. package/exports/index.ts +0 -1
  252. package/exports/theme.ts +0 -1
  253. package/src/core/Root.tsx +0 -88
  254. package/src/core/RootProvider.tsx +0 -40
  255. package/src/core/__workshop__/boundary.tsx +0 -28
  256. package/src/core/__workshop__/index.ts +0 -16
  257. package/src/core/components/autocomplete/__workshop__/async.tsx +0 -156
  258. package/src/core/components/autocomplete/__workshop__/constrainedHeight.tsx +0 -131
  259. package/src/core/components/autocomplete/__workshop__/custom.tsx +0 -91
  260. package/src/core/components/autocomplete/__workshop__/example.tsx +0 -80
  261. package/src/core/components/autocomplete/__workshop__/focusAndBlur.tsx +0 -36
  262. package/src/core/components/autocomplete/__workshop__/fullscreen.tsx +0 -292
  263. package/src/core/components/autocomplete/__workshop__/index.ts +0 -41
  264. package/src/core/components/autocomplete/__workshop__/mock/apiStore.ts +0 -49
  265. package/src/core/components/autocomplete/__workshop__/mock/countries.ts +0 -245
  266. package/src/core/components/autocomplete/__workshop__/types.ts +0 -4
  267. package/src/core/components/autocomplete/autocomplete.tsx +0 -690
  268. package/src/core/components/autocomplete/autocompleteOption.tsx +0 -45
  269. package/src/core/components/autocomplete/autocompleteReducer.ts +0 -47
  270. package/src/core/components/autocomplete/constants.ts +0 -28
  271. package/src/core/components/autocomplete/types.ts +0 -103
  272. package/src/core/components/breadcrumbs/__workshop__/example.tsx +0 -61
  273. package/src/core/components/breadcrumbs/__workshop__/index.ts +0 -16
  274. package/src/core/components/breadcrumbs/breadcrumbs.tsx +0 -131
  275. package/src/core/components/dialog/__workshop__/activate.tsx +0 -141
  276. package/src/core/components/dialog/__workshop__/autoFocus.tsx +0 -29
  277. package/src/core/components/dialog/__workshop__/index.ts +0 -21
  278. package/src/core/components/dialog/__workshop__/layering.tsx +0 -41
  279. package/src/core/components/dialog/__workshop__/nested.tsx +0 -71
  280. package/src/core/components/dialog/__workshop__/onScroll.tsx +0 -51
  281. package/src/core/components/dialog/__workshop__/panes.tsx +0 -89
  282. package/src/core/components/dialog/__workshop__/position.tsx +0 -30
  283. package/src/core/components/dialog/__workshop__/props.tsx +0 -77
  284. package/src/core/components/dialog/__workshop__/provider.tsx +0 -11
  285. package/src/core/components/dialog/__workshop__/wrapped.tsx +0 -76
  286. package/src/core/components/dialog/dialog.tsx +0 -232
  287. package/src/core/components/dialog/dialogCard.tsx +0 -233
  288. package/src/core/components/dialog/dialogContext.ts +0 -21
  289. package/src/core/components/dialog/dialogProvider.tsx +0 -34
  290. package/src/core/components/dialog/isTargetWithinScope.ts +0 -14
  291. package/src/core/components/dialog/types.ts +0 -2
  292. package/src/core/components/dialog/useDialog.ts +0 -11
  293. package/src/core/components/hotkeys/__workshop__/index.ts +0 -16
  294. package/src/core/components/hotkeys/__workshop__/plain.tsx +0 -9
  295. package/src/core/components/hotkeys/hotkeys.tsx +0 -60
  296. package/src/core/components/menu/__workshop__/asComponent.tsx +0 -45
  297. package/src/core/components/menu/__workshop__/avatarMenu.tsx +0 -57
  298. package/src/core/components/menu/__workshop__/closableMenuButton.tsx +0 -47
  299. package/src/core/components/menu/__workshop__/constrainedInBoundary.tsx +0 -133
  300. package/src/core/components/menu/__workshop__/customMenuItem.tsx +0 -45
  301. package/src/core/components/menu/__workshop__/customSelectedState.tsx +0 -35
  302. package/src/core/components/menu/__workshop__/disableFocusOnClose.tsx +0 -40
  303. package/src/core/components/menu/__workshop__/groups.tsx +0 -156
  304. package/src/core/components/menu/__workshop__/index.ts +0 -91
  305. package/src/core/components/menu/__workshop__/menuButton.tsx +0 -80
  306. package/src/core/components/menu/__workshop__/menuGroupRight.tsx +0 -65
  307. package/src/core/components/menu/__workshop__/nestedMenu.tsx +0 -22
  308. package/src/core/components/menu/__workshop__/onCloseMenuButton.tsx +0 -50
  309. package/src/core/components/menu/__workshop__/selectedItem.tsx +0 -69
  310. package/src/core/components/menu/__workshop__/shouldFocus.tsx +0 -42
  311. package/src/core/components/menu/__workshop__/tones.tsx +0 -25
  312. package/src/core/components/menu/__workshop__/withoutArrow.tsx +0 -32
  313. package/src/core/components/menu/helpers.ts +0 -82
  314. package/src/core/components/menu/menu.test.tsx +0 -129
  315. package/src/core/components/menu/menu.tsx +0 -179
  316. package/src/core/components/menu/menuButton.tsx +0 -225
  317. package/src/core/components/menu/menuContext.ts +0 -19
  318. package/src/core/components/menu/menuDivider.tsx +0 -32
  319. package/src/core/components/menu/menuGroup.tsx +0 -233
  320. package/src/core/components/menu/menuItem.tsx +0 -184
  321. package/src/core/components/menu/useMenu.ts +0 -21
  322. package/src/core/components/menu/useMenuController.ts +0 -241
  323. package/src/core/components/tab/__workshop__/example.tsx +0 -79
  324. package/src/core/components/tab/__workshop__/index.ts +0 -16
  325. package/src/core/components/tab/tab.tsx +0 -109
  326. package/src/core/components/tab/tabList.tsx +0 -90
  327. package/src/core/components/tab/tabPanel.tsx +0 -47
  328. package/src/core/components/toast/__workshop__/hook.tsx +0 -71
  329. package/src/core/components/toast/__workshop__/index.ts +0 -21
  330. package/src/core/components/toast/__workshop__/toast.tsx +0 -26
  331. package/src/core/components/toast/toast.test.tsx +0 -103
  332. package/src/core/components/toast/toast.tsx +0 -191
  333. package/src/core/components/toast/toastContext.ts +0 -7
  334. package/src/core/components/toast/toastLayer.tsx +0 -54
  335. package/src/core/components/toast/toastProvider.tsx +0 -112
  336. package/src/core/components/toast/toastState.ts +0 -6
  337. package/src/core/components/toast/types.ts +0 -24
  338. package/src/core/components/toast/useToast.ts +0 -23
  339. package/src/core/components/tree/__workshop__/basic.perf.ts +0 -19
  340. package/src/core/components/tree/__workshop__/basic.tsx +0 -105
  341. package/src/core/components/tree/__workshop__/index.ts +0 -23
  342. package/src/core/components/tree/__workshop__/tabFromElement.tsx +0 -84
  343. package/src/core/components/tree/helpers.ts +0 -105
  344. package/src/core/components/tree/tree.tsx +0 -248
  345. package/src/core/components/tree/treeContext.ts +0 -10
  346. package/src/core/components/tree/treeGroup.tsx +0 -46
  347. package/src/core/components/tree/treeItem.tsx +0 -237
  348. package/src/core/components/tree/types.ts +0 -24
  349. package/src/core/components/tree/useTree.ts +0 -17
  350. package/src/core/components/virtualList/__workshop__/changingProps.tsx +0 -36
  351. package/src/core/components/virtualList/__workshop__/elementScroll.tsx +0 -24
  352. package/src/core/components/virtualList/__workshop__/index.ts +0 -31
  353. package/src/core/components/virtualList/__workshop__/infiniteList.tsx +0 -48
  354. package/src/core/components/virtualList/__workshop__/windowScrolll.tsx +0 -22
  355. package/src/core/components/virtualList/virtualList.tsx +0 -209
  356. package/src/core/constants.ts +0 -67
  357. package/src/core/helpers/animation.ts +0 -27
  358. package/src/core/helpers/element.ts +0 -55
  359. package/src/core/helpers/focus.ts +0 -92
  360. package/src/core/helpers/props.ts +0 -28
  361. package/src/core/helpers/scroll.ts +0 -15
  362. package/src/core/hooks/useClickOutsideEvent.test.tsx +0 -114
  363. package/src/core/hooks/useClickOutsideEvent.ts +0 -67
  364. package/src/core/hooks/useCustomValidity.ts +0 -13
  365. package/src/core/hooks/useDelayed.test.ts +0 -67
  366. package/src/core/hooks/useDelayedState.ts +0 -28
  367. package/src/core/hooks/useElementSize.ts +0 -19
  368. package/src/core/hooks/useGlobalKeyDown.ts +0 -17
  369. package/src/core/hooks/useMatchMedia.ts +0 -28
  370. package/src/core/hooks/useMediaIndex/__workshop__/index.ts +0 -16
  371. package/src/core/hooks/useMediaIndex/__workshop__/test.tsx +0 -14
  372. package/src/core/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -21
  373. package/src/core/hooks/useMediaIndex/useMediaIndex.ts +0 -107
  374. package/src/core/hooks/useMounted.ts +0 -15
  375. package/src/core/hooks/usePrefersDark.hydration.test.tsx +0 -56
  376. package/src/core/hooks/usePrefersDark.test.tsx +0 -20
  377. package/src/core/hooks/usePrefersDark.ts +0 -16
  378. package/src/core/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -56
  379. package/src/core/hooks/usePrefersReducedMotion.test.tsx +0 -20
  380. package/src/core/hooks/usePrefersReducedMotion.ts +0 -16
  381. package/src/core/hooks/useResponsiveProp.ts +0 -28
  382. package/src/core/index.ts +0 -115
  383. package/src/core/lib/createGlobalScopedContext.ts +0 -37
  384. package/src/core/lib/globalScope.ts +0 -19
  385. package/src/core/lib/isArray.ts +0 -3
  386. package/src/core/lib/isRecord.ts +0 -3
  387. package/src/core/middleware/origin.ts +0 -47
  388. package/src/core/observers/elementSize.ts +0 -116
  389. package/src/core/observers/resize.ts +0 -9
  390. package/src/core/primitives/arrow/arrow.tsx +0 -74
  391. package/src/core/primitives/arrow/cmds.ts +0 -91
  392. package/src/core/primitives/avatar/__workshop__/asButton.tsx +0 -14
  393. package/src/core/primitives/avatar/__workshop__/index.ts +0 -31
  394. package/src/core/primitives/avatar/__workshop__/stack.tsx +0 -25
  395. package/src/core/primitives/avatar/__workshop__/withinButton.tsx +0 -55
  396. package/src/core/primitives/avatar/__workshop__/withinMenuItem.tsx +0 -72
  397. package/src/core/primitives/avatar/avatar.tsx +0 -147
  398. package/src/core/primitives/avatar/avatarCounter.tsx +0 -69
  399. package/src/core/primitives/avatar/avatarStack.tsx +0 -79
  400. package/src/core/primitives/avatar/types.ts +0 -2
  401. package/src/core/primitives/badge/__workshop__/index.ts +0 -21
  402. package/src/core/primitives/badge/__workshop__/props.tsx +0 -19
  403. package/src/core/primitives/badge/__workshop__/tones.tsx +0 -16
  404. package/src/core/primitives/badge/badge.test.tsx +0 -16
  405. package/src/core/primitives/badge/badge.tsx +0 -61
  406. package/src/core/primitives/box/__workshop__/index.ts +0 -21
  407. package/src/core/primitives/box/__workshop__/props.tsx +0 -20
  408. package/src/core/primitives/box/__workshop__/responsive.tsx +0 -20
  409. package/src/core/primitives/box/box.tsx +0 -222
  410. package/src/core/primitives/button/__workshop__/custom.tsx +0 -27
  411. package/src/core/primitives/button/__workshop__/customIcons.tsx +0 -30
  412. package/src/core/primitives/button/__workshop__/disabled.tsx +0 -54
  413. package/src/core/primitives/button/__workshop__/index.ts +0 -66
  414. package/src/core/primitives/button/__workshop__/mixedChildren.tsx +0 -12
  415. package/src/core/primitives/button/__workshop__/props.tsx +0 -55
  416. package/src/core/primitives/button/__workshop__/sanityUploadButton.tsx +0 -36
  417. package/src/core/primitives/button/__workshop__/stacked.tsx +0 -58
  418. package/src/core/primitives/button/__workshop__/styled1.tsx +0 -17
  419. package/src/core/primitives/button/__workshop__/styled2.tsx +0 -19
  420. package/src/core/primitives/button/__workshop__/textOverflow.tsx +0 -13
  421. package/src/core/primitives/button/__workshop__/uploadButton.tsx +0 -29
  422. package/src/core/primitives/button/button.test.tsx +0 -30
  423. package/src/core/primitives/button/button.tsx +0 -193
  424. package/src/core/primitives/button/types.ts +0 -2
  425. package/src/core/primitives/card/__workshop__/asButton.tsx +0 -107
  426. package/src/core/primitives/card/__workshop__/asComponent.tsx +0 -27
  427. package/src/core/primitives/card/__workshop__/checkered.tsx +0 -26
  428. package/src/core/primitives/card/__workshop__/index.ts +0 -20
  429. package/src/core/primitives/card/__workshop__/interactive.tsx +0 -29
  430. package/src/core/primitives/card/__workshop__/listNavigation.tsx +0 -78
  431. package/src/core/primitives/card/__workshop__/props.tsx +0 -52
  432. package/src/core/primitives/card/__workshop__/selected.tsx +0 -62
  433. package/src/core/primitives/card/__workshop__/styled.tsx +0 -14
  434. package/src/core/primitives/card/__workshop__/tones.tsx +0 -27
  435. package/src/core/primitives/card/card.tsx +0 -109
  436. package/src/core/primitives/card/cardContext.ts +0 -10
  437. package/src/core/primitives/card/cardProvider.tsx +0 -27
  438. package/src/core/primitives/card/types.ts +0 -17
  439. package/src/core/primitives/card/useCard.ts +0 -15
  440. package/src/core/primitives/checkbox/__workshop__/example.tsx +0 -25
  441. package/src/core/primitives/checkbox/__workshop__/index.ts +0 -15
  442. package/src/core/primitives/checkbox/__workshop__/props.tsx +0 -35
  443. package/src/core/primitives/checkbox/__workshop__/readOnly.tsx +0 -16
  444. package/src/core/primitives/checkbox/__workshop__/tones.tsx +0 -27
  445. package/src/core/primitives/checkbox/checkbox.tsx +0 -80
  446. package/src/core/primitives/code/__workshop__/index.ts +0 -21
  447. package/src/core/primitives/code/__workshop__/opticalAlignment.tsx +0 -23
  448. package/src/core/primitives/code/__workshop__/props.tsx +0 -18
  449. package/src/core/primitives/code/code.tsx +0 -48
  450. package/src/core/primitives/code/refractor.tsx +0 -18
  451. package/src/core/primitives/container/__workshop__/example.tsx +0 -20
  452. package/src/core/primitives/container/__workshop__/index.ts +0 -10
  453. package/src/core/primitives/container/container.tsx +0 -37
  454. package/src/core/primitives/container/types.ts +0 -6
  455. package/src/core/primitives/flex/__workshop__/example.tsx +0 -34
  456. package/src/core/primitives/flex/__workshop__/gap.tsx +0 -25
  457. package/src/core/primitives/flex/__workshop__/index.ts +0 -13
  458. package/src/core/primitives/flex/flex.tsx +0 -58
  459. package/src/core/primitives/grid/__workshop__/index.ts +0 -12
  460. package/src/core/primitives/grid/__workshop__/responsive.tsx +0 -54
  461. package/src/core/primitives/grid/grid.tsx +0 -35
  462. package/src/core/primitives/heading/__workshop__/index.ts +0 -21
  463. package/src/core/primitives/heading/__workshop__/opticalAlignment.tsx +0 -54
  464. package/src/core/primitives/heading/__workshop__/plain.tsx +0 -29
  465. package/src/core/primitives/heading/heading.tsx +0 -78
  466. package/src/core/primitives/inline/__workshop__/index.ts +0 -10
  467. package/src/core/primitives/inline/__workshop__/plain.tsx +0 -24
  468. package/src/core/primitives/inline/inline.tsx +0 -62
  469. package/src/core/primitives/kbd/__workshop__/index.ts +0 -10
  470. package/src/core/primitives/kbd/__workshop__/plain.tsx +0 -9
  471. package/src/core/primitives/kbd/kbd.tsx +0 -57
  472. package/src/core/primitives/label/__workshop__/index.ts +0 -21
  473. package/src/core/primitives/label/__workshop__/opticalAlignment.tsx +0 -54
  474. package/src/core/primitives/label/__workshop__/plain.tsx +0 -28
  475. package/src/core/primitives/label/label.tsx +0 -75
  476. package/src/core/primitives/layer/__workshop__/_debug.tsx +0 -17
  477. package/src/core/primitives/layer/__workshop__/index.ts +0 -26
  478. package/src/core/primitives/layer/__workshop__/multipleRoots.tsx +0 -49
  479. package/src/core/primitives/layer/__workshop__/nested.tsx +0 -98
  480. package/src/core/primitives/layer/__workshop__/responsiveZOffset.tsx +0 -17
  481. package/src/core/primitives/layer/getLayerContext.test.ts +0 -32
  482. package/src/core/primitives/layer/getLayerContext.ts +0 -21
  483. package/src/core/primitives/layer/layer.test.tsx +0 -110
  484. package/src/core/primitives/layer/layer.tsx +0 -42
  485. package/src/core/primitives/layer/layerCard.tsx +0 -90
  486. package/src/core/primitives/layer/layerContext.ts +0 -7
  487. package/src/core/primitives/layer/layerProvider.tsx +0 -106
  488. package/src/core/primitives/layer/types.ts +0 -9
  489. package/src/core/primitives/layer/useLayer.ts +0 -24
  490. package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +0 -77
  491. package/src/core/primitives/popover/__workshop__/MarginsStory.tsx +0 -31
  492. package/src/core/primitives/popover/__workshop__/MatchReferenceWidthStory.tsx +0 -32
  493. package/src/core/primitives/popover/__workshop__/OpenOnMountStory.tsx +0 -11
  494. package/src/core/primitives/popover/__workshop__/PlainStory.tsx +0 -71
  495. package/src/core/primitives/popover/__workshop__/RecursiveStory.tsx +0 -69
  496. package/src/core/primitives/popover/__workshop__/SidePanelStory.tsx +0 -96
  497. package/src/core/primitives/popover/__workshop__/TestStory.tsx +0 -100
  498. package/src/core/primitives/popover/__workshop__/index.ts +0 -51
  499. package/src/core/primitives/popover/constants.ts +0 -22
  500. package/src/core/primitives/popover/floating-ui/size.ts +0 -83
  501. package/src/core/primitives/popover/helpers.ts +0 -32
  502. package/src/core/primitives/popover/popover.tsx +0 -443
  503. package/src/core/primitives/popover/popoverLayer.tsx +0 -149
  504. package/src/core/primitives/popover/types.ts +0 -12
  505. package/src/core/primitives/radio/__workshop__/example.tsx +0 -63
  506. package/src/core/primitives/radio/__workshop__/index.ts +0 -13
  507. package/src/core/primitives/radio/__workshop__/plain.tsx +0 -28
  508. package/src/core/primitives/radio/radio.tsx +0 -64
  509. package/src/core/primitives/select/__workshop__/index.ts +0 -13
  510. package/src/core/primitives/select/__workshop__/plain.tsx +0 -39
  511. package/src/core/primitives/select/__workshop__/readOnly.tsx +0 -23
  512. package/src/core/primitives/select/select.tsx +0 -75
  513. package/src/core/primitives/selectable/selectable.tsx +0 -50
  514. package/src/core/primitives/skeleton/__workshop__/delay.tsx +0 -70
  515. package/src/core/primitives/skeleton/__workshop__/index.ts +0 -13
  516. package/src/core/primitives/skeleton/__workshop__/skeleton.tsx +0 -64
  517. package/src/core/primitives/skeleton/codeSkeleton.tsx +0 -49
  518. package/src/core/primitives/skeleton/headingSkeleton.tsx +0 -48
  519. package/src/core/primitives/skeleton/labelSkeleton.tsx +0 -47
  520. package/src/core/primitives/skeleton/skeleton.tsx +0 -70
  521. package/src/core/primitives/skeleton/textSkeleton.tsx +0 -49
  522. package/src/core/primitives/spinner/__workshop__/Props.tsx +0 -15
  523. package/src/core/primitives/spinner/__workshop__/index.ts +0 -16
  524. package/src/core/primitives/spinner/animatedSpinnerIcon.tsx +0 -14
  525. package/src/core/primitives/spinner/spinner.tsx +0 -45
  526. package/src/core/primitives/srOnly/srOnly.tsx +0 -33
  527. package/src/core/primitives/stack/__workshop__/index.ts +0 -16
  528. package/src/core/primitives/stack/__workshop__/plain.tsx +0 -32
  529. package/src/core/primitives/stack/stack.tsx +0 -60
  530. package/src/core/primitives/switch/__workshop__/example.tsx +0 -23
  531. package/src/core/primitives/switch/__workshop__/index.ts +0 -13
  532. package/src/core/primitives/switch/__workshop__/props.tsx +0 -21
  533. package/src/core/primitives/switch/switch.tsx +0 -84
  534. package/src/core/primitives/text/__workshop__/colored.tsx +0 -23
  535. package/src/core/primitives/text/__workshop__/example.tsx +0 -28
  536. package/src/core/primitives/text/__workshop__/index.ts +0 -26
  537. package/src/core/primitives/text/__workshop__/opticalAlignment.tsx +0 -23
  538. package/src/core/primitives/text/text.tsx +0 -76
  539. package/src/core/primitives/textArea/__workshop__/index.ts +0 -16
  540. package/src/core/primitives/textArea/__workshop__/plain.tsx +0 -61
  541. package/src/core/primitives/textArea/textArea.tsx +0 -84
  542. package/src/core/primitives/textInput/__workshop__/clearButton.tsx +0 -30
  543. package/src/core/primitives/textInput/__workshop__/customValidity.tsx +0 -17
  544. package/src/core/primitives/textInput/__workshop__/index.ts +0 -46
  545. package/src/core/primitives/textInput/__workshop__/plain.tsx +0 -110
  546. package/src/core/primitives/textInput/__workshop__/readOnly.tsx +0 -9
  547. package/src/core/primitives/textInput/__workshop__/states.tsx +0 -53
  548. package/src/core/primitives/textInput/__workshop__/tones.tsx +0 -277
  549. package/src/core/primitives/textInput/__workshop__/typed.tsx +0 -23
  550. package/src/core/primitives/textInput/textInput.tsx +0 -258
  551. package/src/core/primitives/tooltip/__workshop__/customPortal.tsx +0 -102
  552. package/src/core/primitives/tooltip/__workshop__/index.ts +0 -31
  553. package/src/core/primitives/tooltip/__workshop__/overflowingBoundary.tsx +0 -74
  554. package/src/core/primitives/tooltip/__workshop__/props.tsx +0 -112
  555. package/src/core/primitives/tooltip/__workshop__/resizableBoundary.tsx +0 -86
  556. package/src/core/primitives/tooltip/constants.ts +0 -23
  557. package/src/core/primitives/tooltip/tooltip.test.tsx +0 -452
  558. package/src/core/primitives/tooltip/tooltip.tsx +0 -482
  559. package/src/core/primitives/tooltip/tooltipDelayGroup/index.ts +0 -4
  560. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupContext.tsx +0 -13
  561. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +0 -55
  562. package/src/core/primitives/tooltip/tooltipDelayGroup/types.ts +0 -10
  563. package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
  564. package/src/core/primitives/tooltip/tooltipLayer.tsx +0 -106
  565. package/src/core/types.ts +0 -56
  566. package/src/core/utils/boundaryElement/__workshop__/index.ts +0 -16
  567. package/src/core/utils/boundaryElement/__workshop__/plain.tsx +0 -19
  568. package/src/core/utils/boundaryElement/boundaryElement.test.tsx +0 -102
  569. package/src/core/utils/boundaryElement/boundaryElementContext.ts +0 -10
  570. package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +0 -18
  571. package/src/core/utils/boundaryElement/types.ts +0 -5
  572. package/src/core/utils/boundaryElement/useBoundaryElement.ts +0 -24
  573. package/src/core/utils/elementQuery/__workshop__/customMedia.tsx +0 -41
  574. package/src/core/utils/elementQuery/__workshop__/index.ts +0 -16
  575. package/src/core/utils/elementQuery/elementQuery.tsx +0 -75
  576. package/src/core/utils/elementQuery/helpers.ts +0 -27
  577. package/src/core/utils/errorBoundary.tsx +0 -50
  578. package/src/core/utils/getElementRef.ts +0 -29
  579. package/src/core/utils/portal/__workshop__/index.ts +0 -16
  580. package/src/core/utils/portal/__workshop__/named.tsx +0 -63
  581. package/src/core/utils/portal/portal.test.tsx +0 -105
  582. package/src/core/utils/portal/portal.tsx +0 -36
  583. package/src/core/utils/portal/portalContext.ts +0 -37
  584. package/src/core/utils/portal/portalProvider.tsx +0 -70
  585. package/src/core/utils/portal/types.ts +0 -7
  586. package/src/core/utils/portal/usePortal.ts +0 -23
  587. package/src/css/_assign.ts +0 -3
  588. package/src/css/_composeClassNames.ts +0 -12
  589. package/src/css/_fromEntries.ts +0 -3
  590. package/src/css/_getClassNames.ts +0 -9
  591. package/src/css/_responsiveClassName.ts +0 -45
  592. package/src/css/_responsiveStyle.css.ts +0 -34
  593. package/src/css/_style.css.ts +0 -9
  594. package/src/css/components/breadcrumbs/breadcrumbs.css.ts +0 -6
  595. package/src/css/components/breadcrumbs/breadcrumbs.ts +0 -7
  596. package/src/css/components/dialog/dialog.css.ts +0 -98
  597. package/src/css/components/dialog/dialog.ts +0 -58
  598. package/src/css/components/menu/menu.css.ts +0 -14
  599. package/src/css/components/menu/menu.ts +0 -12
  600. package/src/css/components/skeleton/skeleton.css.ts +0 -128
  601. package/src/css/components/skeleton/skeleton.ts +0 -38
  602. package/src/css/components/skeleton/types.ts +0 -36
  603. package/src/css/components/toast/toast.css.ts +0 -17
  604. package/src/css/components/toast/toast.ts +0 -11
  605. package/src/css/components/tree/tree.css.ts +0 -65
  606. package/src/css/components/tree/tree.ts +0 -7
  607. package/src/css/constants.ts +0 -10
  608. package/src/css/getVarName.ts +0 -27
  609. package/src/css/index.ts +0 -146
  610. package/src/css/layers.css.ts +0 -12
  611. package/src/css/primitives/_arrow/_arrow.css.ts +0 -68
  612. package/src/css/primitives/_arrow/_arrow.ts +0 -26
  613. package/src/css/primitives/_input/_input.css.ts +0 -261
  614. package/src/css/primitives/_input/input.ts +0 -29
  615. package/src/css/primitives/_input/types.ts +0 -13
  616. package/src/css/primitives/avatar/avatar.css.ts +0 -201
  617. package/src/css/primitives/avatar/avatar.ts +0 -68
  618. package/src/css/primitives/avatar/types.ts +0 -10
  619. package/src/css/primitives/badge/badge.css.ts +0 -27
  620. package/src/css/primitives/badge/badge.ts +0 -8
  621. package/src/css/primitives/badge/types.ts +0 -13
  622. package/src/css/primitives/box/box.css.ts +0 -19
  623. package/src/css/primitives/box/box.ts +0 -82
  624. package/src/css/primitives/box/types.ts +0 -75
  625. package/src/css/primitives/button/button.css.ts +0 -287
  626. package/src/css/primitives/button/button.ts +0 -26
  627. package/src/css/primitives/button/types.ts +0 -12
  628. package/src/css/primitives/card/__workshop__/color.tsx +0 -75
  629. package/src/css/primitives/card/__workshop__/index.ts +0 -16
  630. package/src/css/primitives/card/card.css.ts +0 -387
  631. package/src/css/primitives/card/card.ts +0 -13
  632. package/src/css/primitives/card/types.ts +0 -9
  633. package/src/css/primitives/checkbox/checkbox.css.ts +0 -193
  634. package/src/css/primitives/checkbox/checkbox.ts +0 -17
  635. package/src/css/primitives/code/code.css.ts +0 -272
  636. package/src/css/primitives/code/code.ts +0 -19
  637. package/src/css/primitives/code/types.ts +0 -11
  638. package/src/css/primitives/container/container.css.ts +0 -4
  639. package/src/css/primitives/container/container.ts +0 -17
  640. package/src/css/primitives/container/types.ts +0 -9
  641. package/src/css/primitives/heading/heading.css.ts +0 -86
  642. package/src/css/primitives/heading/heading.ts +0 -22
  643. package/src/css/primitives/heading/types.ts +0 -14
  644. package/src/css/primitives/kbd/kbd.css.ts +0 -16
  645. package/src/css/primitives/kbd/kbd.ts +0 -9
  646. package/src/css/primitives/kbd/types.ts +0 -6
  647. package/src/css/primitives/label/label.css.ts +0 -87
  648. package/src/css/primitives/label/label.ts +0 -22
  649. package/src/css/primitives/label/types.ts +0 -14
  650. package/src/css/primitives/popover/popover.css.ts +0 -6
  651. package/src/css/primitives/popover/popover.ts +0 -12
  652. package/src/css/primitives/radio/radio.css.ts +0 -78
  653. package/src/css/primitives/radio/radio.ts +0 -17
  654. package/src/css/primitives/root/root.css.ts +0 -19
  655. package/src/css/primitives/root/root.ts +0 -17
  656. package/src/css/primitives/root/types.ts +0 -10
  657. package/src/css/primitives/select/select.css.ts +0 -24
  658. package/src/css/primitives/select/select.ts +0 -14
  659. package/src/css/primitives/select/types.ts +0 -5
  660. package/src/css/primitives/selectable/selectable.css.ts +0 -131
  661. package/src/css/primitives/selectable/selectable.ts +0 -9
  662. package/src/css/primitives/selectable/types.ts +0 -9
  663. package/src/css/primitives/spinner/spinner.css.ts +0 -19
  664. package/src/css/primitives/spinner/spinner.ts +0 -13
  665. package/src/css/primitives/spinner/types.ts +0 -4
  666. package/src/css/primitives/srOnly/srOnly.css.ts +0 -10
  667. package/src/css/primitives/srOnly/srOnly.ts +0 -7
  668. package/src/css/primitives/stack/stack.css.ts +0 -6
  669. package/src/css/primitives/stack/stack.ts +0 -7
  670. package/src/css/primitives/switch/switch.css.ts +0 -98
  671. package/src/css/primitives/switch/switch.ts +0 -27
  672. package/src/css/primitives/text/text.css.ts +0 -86
  673. package/src/css/primitives/text/text.ts +0 -24
  674. package/src/css/primitives/text/types.ts +0 -18
  675. package/src/css/primitives/textArea/textArea.css.ts +0 -4
  676. package/src/css/primitives/textArea/textArea.ts +0 -9
  677. package/src/css/primitives/textArea/types.ts +0 -7
  678. package/src/css/primitives/textInput/textInput.css.ts +0 -43
  679. package/src/css/primitives/textInput/textInput.ts +0 -24
  680. package/src/css/primitives/textInput/types.ts +0 -7
  681. package/src/css/primitives/tooltip/tooltip.css.ts +0 -4
  682. package/src/css/primitives/tooltip/tooltip.ts +0 -8
  683. package/src/css/primitives/tooltip/types.ts +0 -4
  684. package/src/css/props/alignItems/alignItems.css.ts +0 -22
  685. package/src/css/props/alignItems/alignItems.ts +0 -8
  686. package/src/css/props/alignItems/types.ts +0 -9
  687. package/src/css/props/border/border.css.ts +0 -65
  688. package/src/css/props/border/border.ts +0 -21
  689. package/src/css/props/border/types.ts +0 -13
  690. package/src/css/props/boxSizing/boxSizing.css.ts +0 -12
  691. package/src/css/props/boxSizing/boxSizing.ts +0 -7
  692. package/src/css/props/boxSizing/types.ts +0 -7
  693. package/src/css/props/display/display.css.ts +0 -56
  694. package/src/css/props/display/display.ts +0 -8
  695. package/src/css/props/display/types.ts +0 -16
  696. package/src/css/props/flex/flex.css.ts +0 -52
  697. package/src/css/props/flex/flex.ts +0 -8
  698. package/src/css/props/flex/types.ts +0 -9
  699. package/src/css/props/flexDirection/flexDirection.css.ts +0 -19
  700. package/src/css/props/flexDirection/flexDirection.ts +0 -8
  701. package/src/css/props/flexDirection/types.ts +0 -9
  702. package/src/css/props/flexWrap/flexWrap.css.ts +0 -16
  703. package/src/css/props/flexWrap/flexWrap.ts +0 -8
  704. package/src/css/props/flexWrap/types.ts +0 -9
  705. package/src/css/props/font/font.css.ts +0 -94
  706. package/src/css/props/font/font.ts +0 -8
  707. package/src/css/props/font/types.ts +0 -6
  708. package/src/css/props/gap/gap.css.ts +0 -40
  709. package/src/css/props/gap/gap.ts +0 -13
  710. package/src/css/props/gap/types.ts +0 -10
  711. package/src/css/props/gridAutoColumns/gridAutoColumns.css.ts +0 -19
  712. package/src/css/props/gridAutoColumns/gridAutoColumns.ts +0 -8
  713. package/src/css/props/gridAutoColumns/types.ts +0 -9
  714. package/src/css/props/gridAutoFlow/gridAutoFlow.css.ts +0 -19
  715. package/src/css/props/gridAutoFlow/gridAutoFlow.ts +0 -8
  716. package/src/css/props/gridAutoFlow/types.ts +0 -9
  717. package/src/css/props/gridAutoRows/gridAutoRows.css.ts +0 -19
  718. package/src/css/props/gridAutoRows/gridAutoRows.ts +0 -8
  719. package/src/css/props/gridAutoRows/types.ts +0 -9
  720. package/src/css/props/gridColumn/gridColumn.css.ts +0 -49
  721. package/src/css/props/gridColumn/gridColumn.ts +0 -8
  722. package/src/css/props/gridColumn/types.ts +0 -9
  723. package/src/css/props/gridColumnEnd/gridColumnEnd.css.ts +0 -46
  724. package/src/css/props/gridColumnEnd/gridColumnEnd.ts +0 -8
  725. package/src/css/props/gridColumnEnd/types.ts +0 -9
  726. package/src/css/props/gridColumnStart/gridColumnStart.css.ts +0 -46
  727. package/src/css/props/gridColumnStart/gridColumnStart.ts +0 -8
  728. package/src/css/props/gridColumnStart/types.ts +0 -9
  729. package/src/css/props/gridRow/gridRow.css.ts +0 -49
  730. package/src/css/props/gridRow/gridRow.ts +0 -8
  731. package/src/css/props/gridRow/types.ts +0 -9
  732. package/src/css/props/gridRowEnd/gridRowEnd.css.ts +0 -46
  733. package/src/css/props/gridRowEnd/gridRowEnd.ts +0 -8
  734. package/src/css/props/gridRowEnd/types.ts +0 -9
  735. package/src/css/props/gridRowStart/gridRowStart.css.ts +0 -46
  736. package/src/css/props/gridRowStart/gridRowStart.ts +0 -8
  737. package/src/css/props/gridRowStart/types.ts +0 -9
  738. package/src/css/props/gridTemplateColumns/gridTemplateColumns.css.ts +0 -43
  739. package/src/css/props/gridTemplateColumns/gridTemplateColumns.ts +0 -8
  740. package/src/css/props/gridTemplateColumns/types.ts +0 -9
  741. package/src/css/props/gridTemplateRows/gridTemplateRows.css.ts +0 -43
  742. package/src/css/props/gridTemplateRows/gridTemplateRows.ts +0 -8
  743. package/src/css/props/gridTemplateRows/types.ts +0 -9
  744. package/src/css/props/height/height.css.ts +0 -25
  745. package/src/css/props/height/height.ts +0 -8
  746. package/src/css/props/height/types.ts +0 -9
  747. package/src/css/props/inset/inset.css.ts +0 -37
  748. package/src/css/props/inset/inset.ts +0 -21
  749. package/src/css/props/inset/types.ts +0 -13
  750. package/src/css/props/justifyContent/justifyContent.css.ts +0 -25
  751. package/src/css/props/justifyContent/justifyContent.ts +0 -8
  752. package/src/css/props/justifyContent/types.ts +0 -15
  753. package/src/css/props/margin/margin.css.ts +0 -117
  754. package/src/css/props/margin/margin.ts +0 -25
  755. package/src/css/props/margin/types.ts +0 -17
  756. package/src/css/props/maxWidth/maxWidth.css.ts +0 -32
  757. package/src/css/props/maxWidth/maxWidth.ts +0 -8
  758. package/src/css/props/maxWidth/types.ts +0 -11
  759. package/src/css/props/minHeight/minHeight.css.ts +0 -13
  760. package/src/css/props/minHeight/minHeight.ts +0 -8
  761. package/src/css/props/minHeight/types.ts +0 -9
  762. package/src/css/props/minWidth/minWidth.css.ts +0 -25
  763. package/src/css/props/minWidth/minWidth.ts +0 -8
  764. package/src/css/props/minWidth/types.ts +0 -9
  765. package/src/css/props/outline/outline.css.ts +0 -10
  766. package/src/css/props/outline/outline.ts +0 -8
  767. package/src/css/props/outline/types.ts +0 -7
  768. package/src/css/props/overflow/overflow.css.ts +0 -16
  769. package/src/css/props/overflow/overflow.ts +0 -8
  770. package/src/css/props/overflow/types.ts +0 -11
  771. package/src/css/props/padding/padding.css.ts +0 -87
  772. package/src/css/props/padding/padding.ts +0 -25
  773. package/src/css/props/padding/types.ts +0 -17
  774. package/src/css/props/pointerEvents/pointerEvents.css.ts +0 -13
  775. package/src/css/props/pointerEvents/pointerEvents.ts +0 -8
  776. package/src/css/props/pointerEvents/types.ts +0 -7
  777. package/src/css/props/position/position.css.ts +0 -22
  778. package/src/css/props/position/position.ts +0 -8
  779. package/src/css/props/position/types.ts +0 -9
  780. package/src/css/props/radius/radius.css.ts +0 -21
  781. package/src/css/props/radius/radius.ts +0 -8
  782. package/src/css/props/radius/types.ts +0 -8
  783. package/src/css/props/shadow/shadow.css.ts +0 -23
  784. package/src/css/props/shadow/shadow.ts +0 -8
  785. package/src/css/props/shadow/types.ts +0 -8
  786. package/src/css/props/textAlign/textAlign.css.ts +0 -22
  787. package/src/css/props/textAlign/textAlign.ts +0 -8
  788. package/src/css/props/textAlign/types.ts +0 -7
  789. package/src/css/props/textOverflow/textOverflow.css.ts +0 -19
  790. package/src/css/props/textOverflow/textOverflow.ts +0 -8
  791. package/src/css/props/textOverflow/types.ts +0 -12
  792. package/src/css/props/width/types.ts +0 -11
  793. package/src/css/props/width/width.css.ts +0 -31
  794. package/src/css/props/width/width.ts +0 -8
  795. package/src/css/theme/buildCSSTheme.ts +0 -488
  796. package/src/css/theme/defaultTheme.css.ts +0 -64
  797. package/src/css/types.ts +0 -427
  798. package/src/css/vars.css.ts +0 -676
  799. package/src/theme/_parseColorToken.ts +0 -180
  800. package/src/theme/buildTheme.ts +0 -32
  801. package/src/theme/constants.ts +0 -90
  802. package/src/theme/defaults/color.ts +0 -197
  803. package/src/theme/defaults/common.ts +0 -71
  804. package/src/theme/defaults/fonts.ts +0 -250
  805. package/src/theme/index.ts +0 -5
  806. package/src/theme/merge.ts +0 -24
  807. package/src/theme/resolveTokens.ts +0 -204
  808. package/src/theme/types.ts +0 -366
@@ -0,0 +1,205 @@
1
+ import {existsSync, readdirSync, readFileSync, statSync, writeFileSync} from 'node:fs'
2
+ import {dirname, join, relative} from 'node:path'
3
+
4
+ export const STYLES_SPECIFIER = '@sanity/ui/styles.css'
5
+ const IMPORT_LINE = `import '${STYLES_SPECIFIER}'`
6
+ // Match a real import/require of the stylesheet, not a bare mention. A
7
+ // commented-out or string occurrence of the path must not count as "wired",
8
+ // or doctor/init would report success when the import isn't active.
9
+ const SPEC = String.raw`@sanity/ui/styles\.css`
10
+ const PRESENT = new RegExp(
11
+ String.raw`(?:^|\n)\s*import\s+(?:[^\n'"]*\bfrom\s+)?['"]${SPEC}['"]` +
12
+ String.raw`|\brequire\(\s*['"]${SPEC}['"]\s*\)`,
13
+ )
14
+ const SOURCE_EXT = /\.[jt]sx?$|\.astro$/
15
+ const SKIP_DIRS = new Set([
16
+ 'node_modules',
17
+ 'dist',
18
+ 'build',
19
+ '.next',
20
+ '.react-router',
21
+ '.git',
22
+ 'out',
23
+ ])
24
+ const SOURCE_ROOTS = ['src', 'app', 'pages', 'components']
25
+ const MAX_FILES = 800
26
+
27
+ export interface StylesheetInfo {
28
+ entry: string
29
+ file: string
30
+ exists: boolean
31
+ imported: boolean
32
+ importedIn?: string
33
+ }
34
+
35
+ export interface WireResult {
36
+ entry: string
37
+ file: string
38
+ imported: boolean
39
+ wrote: boolean
40
+ missing?: boolean
41
+ already?: boolean
42
+ }
43
+
44
+ export function hasStylesImport(content: string): boolean {
45
+ return PRESENT.test(content)
46
+ }
47
+
48
+ function fileImports(file: string): boolean {
49
+ try {
50
+ return hasStylesImport(readFileSync(file, 'utf8'))
51
+ } catch {
52
+ return false
53
+ }
54
+ }
55
+
56
+ /** Bounded recursive walk that returns the first source file importing the stylesheet. */
57
+ function findImportInDir(root: string, budget: {count: number}): string | null {
58
+ const stack = [root]
59
+ while (stack.length > 0 && budget.count < MAX_FILES) {
60
+ const dir = stack.pop()
61
+ if (dir === undefined) break
62
+ let entries
63
+ try {
64
+ entries = readdirSync(dir, {withFileTypes: true})
65
+ } catch {
66
+ continue
67
+ }
68
+ for (const entry of entries) {
69
+ const full = join(dir, entry.name)
70
+ if (entry.isDirectory()) {
71
+ if (!SKIP_DIRS.has(entry.name)) stack.push(full)
72
+ } else if (SOURCE_EXT.test(entry.name)) {
73
+ budget.count++
74
+ if (budget.count > MAX_FILES) break
75
+ if (fileImports(full)) return full
76
+ }
77
+ }
78
+ }
79
+ return null
80
+ }
81
+
82
+ /**
83
+ * Reports whether the stylesheet is imported. The import only needs to exist
84
+ * once in the module graph, so beyond the prescribed entry we scan the project
85
+ * source roots (bounded) before reporting it missing. That catches imports
86
+ * placed in App.tsx, a route file, or a layout component.
87
+ */
88
+ export function inspectStylesheet(cwd: string, entry: string): StylesheetInfo {
89
+ const file = join(cwd, entry)
90
+ const exists = existsSync(file)
91
+ if (exists && fileImports(file)) return {entry, file, exists, imported: true}
92
+
93
+ const budget = {count: 0}
94
+ const roots = new Set([dirname(entry), ...SOURCE_ROOTS].map((r) => join(cwd, r)))
95
+ for (const root of Array.from(roots)) {
96
+ if (!existsSync(root)) continue
97
+ try {
98
+ if (!statSync(root).isDirectory()) continue
99
+ } catch {
100
+ continue
101
+ }
102
+ const found = findImportInDir(root, budget)
103
+ if (found)
104
+ return {
105
+ entry,
106
+ file,
107
+ exists,
108
+ imported: true,
109
+ importedIn: relative(cwd, found),
110
+ }
111
+ }
112
+
113
+ return {entry, file, exists, imported: false}
114
+ }
115
+
116
+ function isDirective(line: string): boolean {
117
+ const trimmed = line.trim()
118
+ return /^['"]use (client|server|strict)['"];?$/.test(trimmed)
119
+ }
120
+
121
+ function isImportLine(line: string): boolean {
122
+ return /^\s*import\b/.test(line)
123
+ }
124
+
125
+ /**
126
+ * True when an import statement finishes on this line: either it ends with a
127
+ * `from '...'` clause or it is a bare side-effect `import '...'`. Used to find
128
+ * the real end of an import block so we never split a multiline import.
129
+ */
130
+ function importStatementEnds(line: string): boolean {
131
+ const t = line.trim()
132
+ return /\bfrom\s*['"][^'"]+['"];?\s*$/.test(t) || /^import\s+['"][^'"]+['"];?\s*$/.test(t)
133
+ }
134
+
135
+ /** Inserts the import into a JS/TS module after any leading directive + import block. */
136
+ function injectIntoModule(content: string): string {
137
+ const lines = content.split('\n')
138
+ let insertAt = 0
139
+
140
+ while (insertAt < lines.length) {
141
+ const line = lines[insertAt] ?? ''
142
+ if (isDirective(line) || line.trim() === '') insertAt++
143
+ else break
144
+ }
145
+
146
+ // Track the last line that closes an import statement so a multiline import
147
+ // (`import {\n a,\n} from 'x'`) is treated as a single unit and we insert
148
+ // after its closing line, never between its lines.
149
+ let lastImport = -1
150
+ let inMultilineImport = false
151
+ for (let i = insertAt; i < lines.length; i++) {
152
+ const line = lines[i] ?? ''
153
+ if (inMultilineImport) {
154
+ if (importStatementEnds(line)) {
155
+ inMultilineImport = false
156
+ lastImport = i
157
+ }
158
+ continue
159
+ }
160
+ if (isImportLine(line)) {
161
+ lastImport = i
162
+ if (!importStatementEnds(line)) inMultilineImport = true
163
+ } else if (line.trim() !== '' && lastImport !== -1) {
164
+ break
165
+ }
166
+ }
167
+
168
+ const at = lastImport === -1 ? insertAt : lastImport + 1
169
+ lines.splice(at, 0, IMPORT_LINE)
170
+ return lines.join('\n')
171
+ }
172
+
173
+ /** Inserts the import inside an Astro frontmatter fence, creating one if absent. */
174
+ function injectIntoAstro(content: string): string {
175
+ if (content.startsWith('---')) {
176
+ const end = content.indexOf('\n---', 3)
177
+ if (end !== -1) {
178
+ const head = content.slice(0, end)
179
+ const tail = content.slice(end)
180
+ return `${head}\n${IMPORT_LINE}${tail}`
181
+ }
182
+ }
183
+ return `---\n${IMPORT_LINE}\n---\n${content}`
184
+ }
185
+
186
+ export function wireStylesheet(cwd: string, entry: string, {dryRun = false} = {}): WireResult {
187
+ const file = join(cwd, entry)
188
+ if (!existsSync(file)) return {entry, file, missing: true, imported: false, wrote: false}
189
+
190
+ const content = readFileSync(file, 'utf8')
191
+ if (hasStylesImport(content)) {
192
+ return {
193
+ entry,
194
+ file,
195
+ missing: false,
196
+ imported: true,
197
+ wrote: false,
198
+ already: true,
199
+ }
200
+ }
201
+
202
+ const next = entry.endsWith('.astro') ? injectIntoAstro(content) : injectIntoModule(content)
203
+ if (!dryRun) writeFileSync(file, next)
204
+ return {entry, file, missing: false, imported: true, wrote: !dryRun}
205
+ }
@@ -0,0 +1,10 @@
1
+ import {mkdirSync, writeFileSync} from 'node:fs'
2
+ import {join} from 'node:path'
3
+
4
+ import {PACKAGE_NAME} from './detect.js'
5
+
6
+ export function writeInstalledUiVersion(dir: string, version: string): void {
7
+ const root = join(dir, 'node_modules', PACKAGE_NAME)
8
+ mkdirSync(root, {recursive: true})
9
+ writeFileSync(join(root, 'package.json'), JSON.stringify({name: PACKAGE_NAME, version}))
10
+ }
@@ -0,0 +1,174 @@
1
+ import {mkdtempSync, readFileSync, rmSync, writeFileSync} from 'node:fs'
2
+ import {tmpdir} from 'node:os'
3
+ import {join} from 'node:path'
4
+
5
+ import {parse} from 'comment-json'
6
+ import {afterEach, beforeEach, describe, expect, it} from 'vitest'
7
+
8
+ import {planTsconfigChanges, reconcileTsconfig, resolveTargetTsconfig} from './tsconfig.js'
9
+ import type {TsconfigChange} from './types.js'
10
+
11
+ function keysChanged(changes: TsconfigChange[]): string[] {
12
+ return changes.map((c) => c.key).sort()
13
+ }
14
+
15
+ interface ParsedTsconfig {
16
+ compilerOptions?: Record<string, unknown>
17
+ }
18
+
19
+ function parseConfig(raw: string): ParsedTsconfig {
20
+ return parse(raw) as unknown as ParsedTsconfig
21
+ }
22
+
23
+ describe('planTsconfigChanges', () => {
24
+ it('reports nothing for an already-good config', () => {
25
+ const changes = planTsconfigChanges({
26
+ jsx: 'react-jsx',
27
+ module: 'esnext',
28
+ moduleResolution: 'bundler',
29
+ lib: ['DOM', 'DOM.Iterable', 'ES2022'],
30
+ skipLibCheck: true,
31
+ })
32
+ expect(changes).toEqual([])
33
+ })
34
+
35
+ it('fixes a classic moduleResolution and incompatible module together', () => {
36
+ const changes = planTsconfigChanges({
37
+ jsx: 'react-jsx',
38
+ module: 'commonjs',
39
+ moduleResolution: 'node',
40
+ lib: ['DOM', 'DOM.Iterable', 'ES2022'],
41
+ skipLibCheck: true,
42
+ })
43
+ expect(keysChanged(changes)).toEqual(['module', 'moduleResolution'])
44
+ expect(changes.find((c) => c.key === 'moduleResolution')?.to).toBe('bundler')
45
+ expect(changes.find((c) => c.key === 'module')?.to).toBe('esnext')
46
+ })
47
+
48
+ it('leaves a compatible module alone when resolution is already modern', () => {
49
+ const changes = planTsconfigChanges({
50
+ jsx: 'react-jsx',
51
+ module: 'commonjs',
52
+ moduleResolution: 'nodenext',
53
+ lib: ['DOM', 'DOM.Iterable', 'ES2022'],
54
+ skipLibCheck: true,
55
+ })
56
+ // nodenext is modern, but commonjs is not bundler-compatible; nodenext does
57
+ // not force the change, so module stays untouched.
58
+ expect(keysChanged(changes)).toEqual([])
59
+ })
60
+
61
+ it('does not force module when resolution is nodenext and module is missing', () => {
62
+ const changes = planTsconfigChanges({
63
+ jsx: 'react-jsx',
64
+ moduleResolution: 'nodenext',
65
+ lib: ['DOM', 'DOM.Iterable', 'ES2022'],
66
+ skipLibCheck: true,
67
+ })
68
+ expect(changes.find((c) => c.key === 'module')).toBeUndefined()
69
+ })
70
+
71
+ it('adds only missing DOM libs and keeps the existing ES baseline', () => {
72
+ const changes = planTsconfigChanges({
73
+ jsx: 'react-jsx',
74
+ module: 'esnext',
75
+ moduleResolution: 'bundler',
76
+ lib: ['ES2023', 'DOM'],
77
+ skipLibCheck: true,
78
+ })
79
+ expect(keysChanged(changes)).toEqual(['lib'])
80
+ const lib = changes.find((c) => c.key === 'lib')
81
+ expect(lib?.merge).toBe(true)
82
+ expect(lib?.to).toEqual(['DOM.Iterable'])
83
+ })
84
+
85
+ it('treats jsx and moduleResolution as load-bearing', () => {
86
+ const changes = planTsconfigChanges({})
87
+ const load = changes.filter((c) => c.load).map((c) => c.key)
88
+ expect(load).toContain('jsx')
89
+ expect(load).toContain('moduleResolution')
90
+ })
91
+ })
92
+
93
+ describe('reconcileTsconfig', () => {
94
+ let dir: string
95
+ beforeEach(() => {
96
+ dir = mkdtempSync(join(tmpdir(), 'sui-tsconfig-'))
97
+ })
98
+ afterEach(() => {
99
+ rmSync(dir, {recursive: true, force: true})
100
+ })
101
+
102
+ it('creates a tsconfig when none exists', () => {
103
+ const result = reconcileTsconfig(dir)
104
+ expect(result.created).toBe(true)
105
+ const written = parseConfig(readFileSync(join(dir, 'tsconfig.json'), 'utf8'))
106
+ expect(written.compilerOptions?.['jsx']).toBe('react-jsx')
107
+ expect(written.compilerOptions?.['moduleResolution']).toBe('bundler')
108
+ })
109
+
110
+ it('merges required options while preserving comments and unrelated settings', () => {
111
+ writeFileSync(
112
+ join(dir, 'tsconfig.json'),
113
+ `{
114
+ // keep me
115
+ "compilerOptions": {
116
+ "moduleResolution": "node",
117
+ "module": "commonjs",
118
+ "baseUrl": "."
119
+ }
120
+ }
121
+ `,
122
+ )
123
+ const result = reconcileTsconfig(dir)
124
+ expect(result.created).toBe(false)
125
+ const raw = readFileSync(join(dir, 'tsconfig.json'), 'utf8')
126
+ expect(raw).toContain('// keep me')
127
+ const written = parseConfig(raw)
128
+ expect(written.compilerOptions?.['baseUrl']).toBe('.')
129
+ expect(written.compilerOptions?.['moduleResolution']).toBe('bundler')
130
+ expect(written.compilerOptions?.['module']).toBe('esnext')
131
+ expect(written.compilerOptions?.['jsx']).toBe('react-jsx')
132
+ })
133
+
134
+ it('is idempotent: a second run makes no changes', () => {
135
+ reconcileTsconfig(dir)
136
+ const second = reconcileTsconfig(dir)
137
+ expect(second.changes).toEqual([])
138
+ })
139
+
140
+ it('targets the referenced config in a solution-style setup', () => {
141
+ writeFileSync(
142
+ join(dir, 'tsconfig.json'),
143
+ `{"files": [], "references": [{"path": "./tsconfig.app.json"}]}\n`,
144
+ )
145
+ writeFileSync(
146
+ join(dir, 'tsconfig.app.json'),
147
+ `{"compilerOptions": {"moduleResolution": "bundler", "module": "esnext", "jsx": "react-jsx", "lib": ["ES2023", "DOM"], "skipLibCheck": true}}\n`,
148
+ )
149
+ const result = reconcileTsconfig(dir)
150
+ expect(result.file.endsWith('tsconfig.app.json')).toBe(true)
151
+ expect(keysChanged(result.changes)).toEqual(['lib'])
152
+ })
153
+
154
+ it('skips a referenced config without compilerOptions and picks one that has them', () => {
155
+ writeFileSync(
156
+ join(dir, 'tsconfig.json'),
157
+ `{"files": [], "references": [{"path": "./tsconfig.app.json"}, {"path": "./tsconfig.node.json"}]}\n`,
158
+ )
159
+ // The "app" config is preferred by name but carries no options, so it must be skipped.
160
+ writeFileSync(join(dir, 'tsconfig.app.json'), `{"extends": "./base.json"}\n`)
161
+ writeFileSync(
162
+ join(dir, 'tsconfig.node.json'),
163
+ `{"compilerOptions": {"moduleResolution": "bundler"}}\n`,
164
+ )
165
+ const target = resolveTargetTsconfig(dir)
166
+ expect(target.file.endsWith('tsconfig.node.json')).toBe(true)
167
+ })
168
+
169
+ it('treats a non-object tsconfig.json as unreadable instead of crashing', () => {
170
+ writeFileSync(join(dir, 'tsconfig.json'), `null\n`)
171
+ expect(resolveTargetTsconfig(dir).unreadable).toBe(true)
172
+ expect(reconcileTsconfig(dir).unreadable).toBe(true)
173
+ })
174
+ })
@@ -0,0 +1,282 @@
1
+ import {existsSync, readFileSync, writeFileSync} from 'node:fs'
2
+ import {dirname, isAbsolute, join, resolve} from 'node:path'
3
+
4
+ import {parse, stringify} from 'comment-json'
5
+
6
+ import type {TsconfigChange} from './types.js'
7
+
8
+ interface TsconfigDoc {
9
+ extends?: string | string[]
10
+ compilerOptions?: Record<string, unknown>
11
+ references?: Array<{path?: string}>
12
+ }
13
+
14
+ /** moduleResolution values that read a package `exports` map and its types. */
15
+ const MODERN_RESOLUTIONS = new Set(['bundler', 'node16', 'nodenext'])
16
+ /** module values compatible with moduleResolution: bundler. */
17
+ const BUNDLER_MODULES = new Set(['esnext', 'preserve', 'es2015', 'es2020', 'es2022'])
18
+ const VALID_JSX = new Set(['react-jsx', 'react-jsxdev', 'preserve', 'react', 'react-native'])
19
+
20
+ /** DOM globals the component types reference, plus a modern JS baseline. */
21
+ const DOM_LIBS = ['DOM', 'DOM.Iterable']
22
+ const ES_BASELINE = 'ES2022'
23
+
24
+ /**
25
+ * The full known-good config written when no tsconfig.json exists. Mirrors the
26
+ * repo's own framework apps so a fresh project type-checks predictably.
27
+ */
28
+ const DEFAULT_TSCONFIG = {
29
+ compilerOptions: {
30
+ target: ES_BASELINE,
31
+ lib: [...DOM_LIBS, ES_BASELINE],
32
+ module: 'esnext',
33
+ moduleResolution: 'bundler',
34
+ jsx: 'react-jsx',
35
+ strict: true,
36
+ esModuleInterop: true,
37
+ skipLibCheck: true,
38
+ resolveJsonModule: true,
39
+ isolatedModules: true,
40
+ moduleDetection: 'force',
41
+ },
42
+ include: ['src', 'app'],
43
+ }
44
+
45
+ export interface TsconfigInspection {
46
+ file: string
47
+ exists: boolean
48
+ unreadable?: boolean
49
+ effective?: Record<string, unknown>
50
+ changes: TsconfigChange[]
51
+ }
52
+
53
+ export interface TsconfigResult {
54
+ file: string
55
+ created: boolean
56
+ changes: TsconfigChange[]
57
+ wrote: boolean
58
+ unreadable?: boolean
59
+ }
60
+
61
+ function readJsonc(file: string): TsconfigDoc {
62
+ const data = parse(readFileSync(file, 'utf8'))
63
+ // comment-json happily parses valid-but-non-object JSON (null, true, []). Treat
64
+ // those as unreadable so callers don't crash on later property reads.
65
+ if (typeof data !== 'object' || data === null || Array.isArray(data)) {
66
+ throw new Error('tsconfig.json is not an object')
67
+ }
68
+ return data as unknown as TsconfigDoc
69
+ }
70
+
71
+ /**
72
+ * Picks the tsconfig file to edit. Solution-style configs (Vite) keep their
73
+ * real options in a referenced file, so we follow the first reference that
74
+ * actually carries compilerOptions.
75
+ */
76
+ export function resolveTargetTsconfig(cwd: string): {
77
+ file: string
78
+ exists: boolean
79
+ unreadable?: boolean
80
+ } {
81
+ const root = join(cwd, 'tsconfig.json')
82
+ if (!existsSync(root)) return {file: root, exists: false}
83
+
84
+ let data: TsconfigDoc
85
+ try {
86
+ data = readJsonc(root)
87
+ } catch {
88
+ return {file: root, exists: true, unreadable: true}
89
+ }
90
+
91
+ const hasOwnOptions = data.compilerOptions && Object.keys(data.compilerOptions).length > 0
92
+ if (hasOwnOptions || !Array.isArray(data.references)) {
93
+ return {file: root, exists: true}
94
+ }
95
+
96
+ const referenced = data.references
97
+ .map((ref) => ref.path)
98
+ .filter((p): p is string => typeof p === 'string')
99
+ .map((p) => join(cwd, p.endsWith('.json') ? p : join(p, 'tsconfig.json')))
100
+ .filter((p) => existsSync(p))
101
+
102
+ // Keep only references we can parse and that actually carry compilerOptions, so
103
+ // we never write into a reference that has none or crash on an unreadable one.
104
+ // Prefer an "app" config, the common Vite solution-style layout.
105
+ const withOptions = referenced.filter((p) => {
106
+ try {
107
+ const doc = readJsonc(p)
108
+ return Boolean(doc.compilerOptions && Object.keys(doc.compilerOptions).length > 0)
109
+ } catch {
110
+ return false
111
+ }
112
+ })
113
+
114
+ const appConfig = withOptions.find((p) => p.includes('app')) ?? withOptions[0]
115
+ return {file: appConfig ?? root, exists: true}
116
+ }
117
+
118
+ /** Merges compilerOptions across the resolvable `extends` chain (relative paths only). */
119
+ function effectiveCompilerOptions(file: string, seen = new Set<string>()): Record<string, unknown> {
120
+ if (!existsSync(file) || seen.has(file)) return {}
121
+ seen.add(file)
122
+
123
+ let data: TsconfigDoc
124
+ try {
125
+ data = readJsonc(file)
126
+ } catch {
127
+ return {}
128
+ }
129
+
130
+ const base: Record<string, unknown> = {}
131
+ const extendsField = data.extends
132
+ const extendsList = Array.isArray(extendsField)
133
+ ? extendsField
134
+ : extendsField
135
+ ? [extendsField]
136
+ : []
137
+ for (const ext of extendsList) {
138
+ if (typeof ext !== 'string') continue
139
+ if (ext.startsWith('.') || isAbsolute(ext)) {
140
+ const resolved = isAbsolute(ext) ? ext : resolve(dirname(file), ext)
141
+ const withExt = resolved.endsWith('.json') ? resolved : `${resolved}.json`
142
+ Object.assign(base, effectiveCompilerOptions(withExt, seen))
143
+ }
144
+ }
145
+
146
+ return {...base, ...data.compilerOptions}
147
+ }
148
+
149
+ function libIncludes(libs: unknown, name: string): boolean {
150
+ if (!Array.isArray(libs)) return false
151
+ return libs.some((entry) => String(entry).toLowerCase() === name.toLowerCase())
152
+ }
153
+
154
+ function hasEsBaseline(libs: unknown): boolean {
155
+ if (!Array.isArray(libs)) return false
156
+ return libs.some((entry) => /^es(\d{4}|next)$/i.test(String(entry)))
157
+ }
158
+
159
+ /**
160
+ * Compares effective options against the minimum a project needs to consume
161
+ * this package and returns the changes to make. Pure: callers decide whether to
162
+ * apply them.
163
+ *
164
+ * Only options that actually break consumption are touched, so merging into an
165
+ * existing project never introduces type errors in the user's own code:
166
+ * - jsx: required to compile .tsx
167
+ * - moduleResolution: required to read the package exports map + its types
168
+ * - module: must stay compatible with a bundler resolution
169
+ * - lib: DOM/DOM.Iterable back the component element types
170
+ * - skipLibCheck: only ever removes errors, safe to add
171
+ *
172
+ * `load: true` marks the load-bearing changes that doctor reports as failures.
173
+ */
174
+ export function planTsconfigChanges(effective: Record<string, unknown>): TsconfigChange[] {
175
+ const changes: TsconfigChange[] = []
176
+ const opts = effective
177
+
178
+ const jsx = opts['jsx']
179
+ if (!jsx) changes.push({key: 'jsx', from: undefined, to: 'react-jsx', load: true})
180
+ else if (typeof jsx !== 'string' || !VALID_JSX.has(jsx)) {
181
+ changes.push({key: 'jsx', from: jsx, to: 'react-jsx', load: true})
182
+ }
183
+
184
+ const resolution = opts['moduleResolution']
185
+ const resolutionLower = typeof resolution === 'string' ? resolution.toLowerCase() : null
186
+ const resolutionIsModern = Boolean(resolutionLower && MODERN_RESOLUTIONS.has(resolutionLower))
187
+ let willSetBundler = false
188
+ if (!resolution) {
189
+ changes.push({key: 'moduleResolution', from: undefined, to: 'bundler', load: true})
190
+ willSetBundler = true
191
+ } else if (!resolutionIsModern) {
192
+ changes.push({key: 'moduleResolution', from: resolution, to: 'bundler', load: true})
193
+ willSetBundler = true
194
+ }
195
+
196
+ // module only matters when resolution is (or becomes) bundler, which requires
197
+ // esnext/preserve/es2015+. node16/nodenext pair with their own module values,
198
+ // so we leave those alone.
199
+ const resolutionWillBeBundler = willSetBundler || resolutionLower === 'bundler'
200
+ const module = opts['module']
201
+ const moduleLower = typeof module === 'string' ? module.toLowerCase() : null
202
+ const moduleCompatible = Boolean(moduleLower && BUNDLER_MODULES.has(moduleLower))
203
+ // Only enforce module when resolution is (or becomes) bundler. node16/nodenext
204
+ // pair with their own module values, so a missing or non-bundler module under
205
+ // those resolutions is left alone rather than forced to esnext (which would be
206
+ // an invalid combination and could change a NodeNext project's semantics).
207
+ if (resolutionWillBeBundler && !moduleCompatible) {
208
+ changes.push({key: 'module', from: module, to: 'esnext', load: true})
209
+ }
210
+
211
+ const lib = opts['lib']
212
+ if (lib === undefined) {
213
+ changes.push({key: 'lib', from: undefined, to: [...DOM_LIBS, ES_BASELINE], load: true})
214
+ } else {
215
+ const missing = DOM_LIBS.filter((entry) => !libIncludes(lib, entry))
216
+ if (!hasEsBaseline(lib)) missing.push(ES_BASELINE)
217
+ if (missing.length > 0) {
218
+ changes.push({key: 'lib', from: lib, to: missing, merge: true, load: true})
219
+ }
220
+ }
221
+
222
+ if (opts['skipLibCheck'] === undefined) {
223
+ changes.push({key: 'skipLibCheck', from: undefined, to: true})
224
+ }
225
+
226
+ return changes
227
+ }
228
+
229
+ /** Read-only: what would `init` change about tsconfig? Used by `doctor` too. */
230
+ export function inspectTsconfig(cwd: string): TsconfigInspection {
231
+ const target = resolveTargetTsconfig(cwd)
232
+ if (!target.exists) {
233
+ return {file: target.file, exists: false, changes: planTsconfigChanges({})}
234
+ }
235
+ if (target.unreadable) {
236
+ return {file: target.file, exists: true, unreadable: true, changes: []}
237
+ }
238
+ const effective = effectiveCompilerOptions(target.file)
239
+ return {file: target.file, exists: true, effective, changes: planTsconfigChanges(effective)}
240
+ }
241
+
242
+ /**
243
+ * Applies the required options. Existing comments and unrelated settings are
244
+ * preserved (comment-json round-trips them). Returns what happened.
245
+ */
246
+ export function reconcileTsconfig(cwd: string, {dryRun = false} = {}): TsconfigResult {
247
+ const target = resolveTargetTsconfig(cwd)
248
+
249
+ if (!target.exists) {
250
+ if (!dryRun) {
251
+ writeFileSync(target.file, `${JSON.stringify(DEFAULT_TSCONFIG, null, 2)}\n`)
252
+ }
253
+ return {file: target.file, created: true, changes: [], wrote: !dryRun}
254
+ }
255
+
256
+ if (target.unreadable) {
257
+ return {file: target.file, created: false, changes: [], wrote: false, unreadable: true}
258
+ }
259
+
260
+ const effective = effectiveCompilerOptions(target.file)
261
+ const changes = planTsconfigChanges(effective)
262
+ if (changes.length === 0) {
263
+ return {file: target.file, created: false, changes, wrote: false}
264
+ }
265
+
266
+ if (!dryRun) {
267
+ const doc = readJsonc(target.file)
268
+ const options: Record<string, unknown> = doc.compilerOptions ?? {}
269
+ doc.compilerOptions = options
270
+ for (const change of changes) {
271
+ if (change.merge && change.key === 'lib') {
272
+ const current = Array.isArray(options['lib']) ? (options['lib'] as unknown[]) : []
273
+ options['lib'] = [...current, ...(change.to as unknown[])]
274
+ } else {
275
+ options[change.key] = change.to
276
+ }
277
+ }
278
+ writeFileSync(target.file, `${stringify(doc, null, 2)}\n`)
279
+ }
280
+
281
+ return {file: target.file, created: false, changes, wrote: !dryRun}
282
+ }