@sanity/ui 4.0.0-v4.1 → 5.0.0-alpha.2

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 (796) 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 +1744 -4394
  21. package/dist/index.js.map +1 -1
  22. package/dist/styles.css +1 -0
  23. package/package.json +65 -194
  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 +76 -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-es/Refractor.js +0 -25
  230. package/dist/_chunks-es/Refractor.js.map +0 -1
  231. package/dist/css/index.css +0 -2
  232. package/dist/css/index.css.map +0 -1
  233. package/dist/css/index.d.ts +0 -1398
  234. package/dist/css/index.js +0 -18882
  235. package/dist/css/index.js.map +0 -1
  236. package/dist/theme.d.ts +0 -499
  237. package/dist/theme.js +0 -870
  238. package/dist/theme.js.map +0 -1
  239. package/exports/css.ts +0 -1
  240. package/exports/index.ts +0 -1
  241. package/exports/theme.ts +0 -1
  242. package/src/core/Root.tsx +0 -88
  243. package/src/core/RootProvider.tsx +0 -40
  244. package/src/core/__workshop__/Boundary.tsx +0 -28
  245. package/src/core/__workshop__/index.ts +0 -16
  246. package/src/core/components/autocomplete/Autocomplete.tsx +0 -690
  247. package/src/core/components/autocomplete/AutocompleteOption.tsx +0 -45
  248. package/src/core/components/autocomplete/__workshop__/Async.tsx +0 -156
  249. package/src/core/components/autocomplete/__workshop__/ConstrainedHeight.tsx +0 -131
  250. package/src/core/components/autocomplete/__workshop__/Custom.tsx +0 -104
  251. package/src/core/components/autocomplete/__workshop__/Example.tsx +0 -91
  252. package/src/core/components/autocomplete/__workshop__/FocusAndBlur.tsx +0 -36
  253. package/src/core/components/autocomplete/__workshop__/Fullscreen.tsx +0 -292
  254. package/src/core/components/autocomplete/__workshop__/index.ts +0 -41
  255. package/src/core/components/autocomplete/__workshop__/mock/apiStore.ts +0 -49
  256. package/src/core/components/autocomplete/__workshop__/mock/countries.ts +0 -245
  257. package/src/core/components/autocomplete/__workshop__/types.ts +0 -4
  258. package/src/core/components/autocomplete/autocompleteReducer.ts +0 -47
  259. package/src/core/components/autocomplete/constants.ts +0 -28
  260. package/src/core/components/autocomplete/types.ts +0 -103
  261. package/src/core/components/breadcrumbs/Breadcrumbs.tsx +0 -131
  262. package/src/core/components/breadcrumbs/__workshop__/Example.tsx +0 -61
  263. package/src/core/components/breadcrumbs/__workshop__/index.ts +0 -16
  264. package/src/core/components/dialog/Dialog.tsx +0 -232
  265. package/src/core/components/dialog/DialogCard.tsx +0 -233
  266. package/src/core/components/dialog/DialogContext.ts +0 -21
  267. package/src/core/components/dialog/DialogProvider.tsx +0 -34
  268. package/src/core/components/dialog/__workshop__/Activate.tsx +0 -141
  269. package/src/core/components/dialog/__workshop__/AutoFocus.tsx +0 -29
  270. package/src/core/components/dialog/__workshop__/Layering.tsx +0 -41
  271. package/src/core/components/dialog/__workshop__/Nested.tsx +0 -71
  272. package/src/core/components/dialog/__workshop__/OnScroll.tsx +0 -51
  273. package/src/core/components/dialog/__workshop__/Panes.tsx +0 -89
  274. package/src/core/components/dialog/__workshop__/Position.tsx +0 -38
  275. package/src/core/components/dialog/__workshop__/Props.tsx +0 -79
  276. package/src/core/components/dialog/__workshop__/Provider.tsx +0 -11
  277. package/src/core/components/dialog/__workshop__/Wrapped.tsx +0 -76
  278. package/src/core/components/dialog/__workshop__/index.ts +0 -21
  279. package/src/core/components/dialog/isTargetWithinScope.ts +0 -14
  280. package/src/core/components/dialog/types.ts +0 -2
  281. package/src/core/components/dialog/useDialog.ts +0 -11
  282. package/src/core/components/hotkeys/Hotkeys.tsx +0 -60
  283. package/src/core/components/hotkeys/__workshop__/Plain.tsx +0 -9
  284. package/src/core/components/hotkeys/__workshop__/index.ts +0 -16
  285. package/src/core/components/menu/Menu.test.tsx +0 -129
  286. package/src/core/components/menu/Menu.tsx +0 -179
  287. package/src/core/components/menu/MenuButton.tsx +0 -230
  288. package/src/core/components/menu/MenuContext.ts +0 -19
  289. package/src/core/components/menu/MenuDivider.tsx +0 -32
  290. package/src/core/components/menu/MenuGroup.tsx +0 -236
  291. package/src/core/components/menu/MenuItem.tsx +0 -184
  292. package/src/core/components/menu/__workshop__/AsComponent.tsx +0 -45
  293. package/src/core/components/menu/__workshop__/AvatarMenu.tsx +0 -57
  294. package/src/core/components/menu/__workshop__/ClosableMenuButton.tsx +0 -47
  295. package/src/core/components/menu/__workshop__/ConstrainedInBoundary.tsx +0 -133
  296. package/src/core/components/menu/__workshop__/CustomMenuItem.tsx +0 -45
  297. package/src/core/components/menu/__workshop__/CustomSelectedState.tsx +0 -35
  298. package/src/core/components/menu/__workshop__/DisableFocusOnClose.tsx +0 -40
  299. package/src/core/components/menu/__workshop__/Groups.tsx +0 -156
  300. package/src/core/components/menu/__workshop__/MenuButton.tsx +0 -85
  301. package/src/core/components/menu/__workshop__/MenuGroupRight.tsx +0 -65
  302. package/src/core/components/menu/__workshop__/NestedMenu.tsx +0 -22
  303. package/src/core/components/menu/__workshop__/OnCloseMenuButton.tsx +0 -50
  304. package/src/core/components/menu/__workshop__/SelectedItem.tsx +0 -69
  305. package/src/core/components/menu/__workshop__/ShouldFocus.tsx +0 -42
  306. package/src/core/components/menu/__workshop__/Tones.tsx +0 -31
  307. package/src/core/components/menu/__workshop__/WithoutArrow.tsx +0 -32
  308. package/src/core/components/menu/__workshop__/index.ts +0 -91
  309. package/src/core/components/menu/helpers.ts +0 -82
  310. package/src/core/components/menu/useMenu.ts +0 -21
  311. package/src/core/components/menu/useMenuController.ts +0 -241
  312. package/src/core/components/tab/Tab.tsx +0 -109
  313. package/src/core/components/tab/TabList.tsx +0 -90
  314. package/src/core/components/tab/TabPanel.tsx +0 -47
  315. package/src/core/components/tab/__workshop__/Example.tsx +0 -79
  316. package/src/core/components/tab/__workshop__/index.ts +0 -16
  317. package/src/core/components/toast/Toast.test.tsx +0 -103
  318. package/src/core/components/toast/Toast.tsx +0 -191
  319. package/src/core/components/toast/ToastContext.ts +0 -7
  320. package/src/core/components/toast/ToastLayer.tsx +0 -54
  321. package/src/core/components/toast/ToastProvider.tsx +0 -112
  322. package/src/core/components/toast/__workshop__/Hook.tsx +0 -71
  323. package/src/core/components/toast/__workshop__/Toast.tsx +0 -28
  324. package/src/core/components/toast/__workshop__/index.ts +0 -21
  325. package/src/core/components/toast/toastState.ts +0 -6
  326. package/src/core/components/toast/types.ts +0 -24
  327. package/src/core/components/toast/useToast.ts +0 -23
  328. package/src/core/components/tree/Tree.tsx +0 -248
  329. package/src/core/components/tree/TreeContext.ts +0 -10
  330. package/src/core/components/tree/TreeGroup.tsx +0 -46
  331. package/src/core/components/tree/TreeItem.tsx +0 -237
  332. package/src/core/components/tree/__workshop__/Basic.tsx +0 -105
  333. package/src/core/components/tree/__workshop__/TabFromElement.tsx +0 -84
  334. package/src/core/components/tree/__workshop__/basic.perf.ts +0 -19
  335. package/src/core/components/tree/__workshop__/index.ts +0 -23
  336. package/src/core/components/tree/helpers.ts +0 -105
  337. package/src/core/components/tree/types.ts +0 -24
  338. package/src/core/components/tree/useTree.ts +0 -17
  339. package/src/core/components/virtualList/VirtualList.tsx +0 -209
  340. package/src/core/components/virtualList/__workshop__/ChangingProps.tsx +0 -36
  341. package/src/core/components/virtualList/__workshop__/ElementScroll.tsx +0 -24
  342. package/src/core/components/virtualList/__workshop__/InfiniteList.tsx +0 -48
  343. package/src/core/components/virtualList/__workshop__/WindowScrolll.tsx +0 -22
  344. package/src/core/components/virtualList/__workshop__/index.ts +0 -31
  345. package/src/core/constants.ts +0 -67
  346. package/src/core/helpers/animation.ts +0 -27
  347. package/src/core/helpers/element.ts +0 -55
  348. package/src/core/helpers/focus.ts +0 -92
  349. package/src/core/helpers/props.ts +0 -28
  350. package/src/core/helpers/scroll.ts +0 -15
  351. package/src/core/hooks/useClickOutsideEvent.test.tsx +0 -114
  352. package/src/core/hooks/useClickOutsideEvent.ts +0 -67
  353. package/src/core/hooks/useCustomValidity.ts +0 -13
  354. package/src/core/hooks/useDelayed.test.ts +0 -67
  355. package/src/core/hooks/useDelayedState.ts +0 -28
  356. package/src/core/hooks/useElementSize.ts +0 -19
  357. package/src/core/hooks/useGlobalKeyDown.ts +0 -17
  358. package/src/core/hooks/useMatchMedia.ts +0 -28
  359. package/src/core/hooks/useMediaIndex/__workshop__/Test.tsx +0 -14
  360. package/src/core/hooks/useMediaIndex/__workshop__/index.ts +0 -16
  361. package/src/core/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -21
  362. package/src/core/hooks/useMediaIndex/useMediaIndex.ts +0 -107
  363. package/src/core/hooks/useMounted.ts +0 -15
  364. package/src/core/hooks/usePrefersDark.hydration.test.tsx +0 -56
  365. package/src/core/hooks/usePrefersDark.test.tsx +0 -20
  366. package/src/core/hooks/usePrefersDark.ts +0 -16
  367. package/src/core/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -56
  368. package/src/core/hooks/usePrefersReducedMotion.test.tsx +0 -20
  369. package/src/core/hooks/usePrefersReducedMotion.ts +0 -16
  370. package/src/core/hooks/useResponsiveProp.ts +0 -28
  371. package/src/core/index.ts +0 -118
  372. package/src/core/lib/createGlobalScopedContext.ts +0 -37
  373. package/src/core/lib/globalScope.ts +0 -19
  374. package/src/core/lib/isArray.ts +0 -3
  375. package/src/core/lib/isRecord.ts +0 -3
  376. package/src/core/middleware/origin.ts +0 -47
  377. package/src/core/observers/elementSize.ts +0 -116
  378. package/src/core/observers/resize.ts +0 -9
  379. package/src/core/primitives/arrow/Arrow.tsx +0 -74
  380. package/src/core/primitives/arrow/cmds.ts +0 -91
  381. package/src/core/primitives/avatar/Avatar.tsx +0 -147
  382. package/src/core/primitives/avatar/AvatarCounter.tsx +0 -69
  383. package/src/core/primitives/avatar/AvatarStack.tsx +0 -79
  384. package/src/core/primitives/avatar/__workshop__/AsButton.tsx +0 -21
  385. package/src/core/primitives/avatar/__workshop__/Stack.tsx +0 -29
  386. package/src/core/primitives/avatar/__workshop__/WithinButton.tsx +0 -55
  387. package/src/core/primitives/avatar/__workshop__/WithinMenuItem.tsx +0 -72
  388. package/src/core/primitives/avatar/__workshop__/index.ts +0 -31
  389. package/src/core/primitives/avatar/types.ts +0 -2
  390. package/src/core/primitives/badge/Badge.test.tsx +0 -16
  391. package/src/core/primitives/badge/Badge.tsx +0 -61
  392. package/src/core/primitives/badge/__workshop__/Props.tsx +0 -30
  393. package/src/core/primitives/badge/__workshop__/Tones.tsx +0 -16
  394. package/src/core/primitives/badge/__workshop__/index.ts +0 -21
  395. package/src/core/primitives/box/Box.tsx +0 -222
  396. package/src/core/primitives/box/__workshop__/Props.tsx +0 -25
  397. package/src/core/primitives/box/__workshop__/Responsive.tsx +0 -20
  398. package/src/core/primitives/box/__workshop__/index.ts +0 -21
  399. package/src/core/primitives/button/Button.test.tsx +0 -30
  400. package/src/core/primitives/button/Button.tsx +0 -193
  401. package/src/core/primitives/button/__workshop__/Custom.tsx +0 -27
  402. package/src/core/primitives/button/__workshop__/CustomIcons.tsx +0 -30
  403. package/src/core/primitives/button/__workshop__/Disabled.tsx +0 -54
  404. package/src/core/primitives/button/__workshop__/MixedChildren.tsx +0 -12
  405. package/src/core/primitives/button/__workshop__/Props.tsx +0 -77
  406. package/src/core/primitives/button/__workshop__/SanityUploadButton.tsx +0 -36
  407. package/src/core/primitives/button/__workshop__/Stacked.tsx +0 -74
  408. package/src/core/primitives/button/__workshop__/Styled1.tsx +0 -17
  409. package/src/core/primitives/button/__workshop__/Styled2.tsx +0 -19
  410. package/src/core/primitives/button/__workshop__/TextOverflow.tsx +0 -13
  411. package/src/core/primitives/button/__workshop__/UploadButton.tsx +0 -29
  412. package/src/core/primitives/button/__workshop__/index.ts +0 -66
  413. package/src/core/primitives/button/types.ts +0 -2
  414. package/src/core/primitives/card/Card.tsx +0 -109
  415. package/src/core/primitives/card/CardContext.ts +0 -10
  416. package/src/core/primitives/card/CardProvider.tsx +0 -27
  417. package/src/core/primitives/card/__workshop__/AsButton.tsx +0 -107
  418. package/src/core/primitives/card/__workshop__/AsComponent.tsx +0 -27
  419. package/src/core/primitives/card/__workshop__/Checkered.tsx +0 -26
  420. package/src/core/primitives/card/__workshop__/Interactive.tsx +0 -29
  421. package/src/core/primitives/card/__workshop__/ListNavigation.tsx +0 -78
  422. package/src/core/primitives/card/__workshop__/Props.tsx +0 -62
  423. package/src/core/primitives/card/__workshop__/Selected.tsx +0 -62
  424. package/src/core/primitives/card/__workshop__/Styled.tsx +0 -14
  425. package/src/core/primitives/card/__workshop__/Tones.tsx +0 -27
  426. package/src/core/primitives/card/__workshop__/index.ts +0 -20
  427. package/src/core/primitives/card/types.ts +0 -17
  428. package/src/core/primitives/card/useCard.ts +0 -15
  429. package/src/core/primitives/checkbox/Checkbox.tsx +0 -80
  430. package/src/core/primitives/checkbox/__workshop__/Example.tsx +0 -25
  431. package/src/core/primitives/checkbox/__workshop__/Props.tsx +0 -35
  432. package/src/core/primitives/checkbox/__workshop__/ReadOnly.tsx +0 -16
  433. package/src/core/primitives/checkbox/__workshop__/Tones.tsx +0 -27
  434. package/src/core/primitives/checkbox/__workshop__/index.ts +0 -15
  435. package/src/core/primitives/code/Code.tsx +0 -48
  436. package/src/core/primitives/code/Refractor.tsx +0 -18
  437. package/src/core/primitives/code/__workshop__/OpticalAlignment.tsx +0 -23
  438. package/src/core/primitives/code/__workshop__/Props.tsx +0 -23
  439. package/src/core/primitives/code/__workshop__/index.ts +0 -21
  440. package/src/core/primitives/container/Container.tsx +0 -37
  441. package/src/core/primitives/container/__workshop__/Example.tsx +0 -25
  442. package/src/core/primitives/container/__workshop__/index.ts +0 -10
  443. package/src/core/primitives/container/types.ts +0 -6
  444. package/src/core/primitives/flex/Flex.tsx +0 -58
  445. package/src/core/primitives/flex/__workshop__/Example.tsx +0 -40
  446. package/src/core/primitives/flex/__workshop__/Gap.tsx +0 -25
  447. package/src/core/primitives/flex/__workshop__/index.ts +0 -13
  448. package/src/core/primitives/grid/Grid.tsx +0 -35
  449. package/src/core/primitives/grid/__workshop__/Responsive.tsx +0 -54
  450. package/src/core/primitives/grid/__workshop__/index.ts +0 -12
  451. package/src/core/primitives/heading/Heading.tsx +0 -78
  452. package/src/core/primitives/heading/__workshop__/OpticalAlignment.tsx +0 -54
  453. package/src/core/primitives/heading/__workshop__/Plain.tsx +0 -40
  454. package/src/core/primitives/heading/__workshop__/index.ts +0 -21
  455. package/src/core/primitives/inline/Inline.tsx +0 -62
  456. package/src/core/primitives/inline/__workshop__/Plain.tsx +0 -28
  457. package/src/core/primitives/inline/__workshop__/index.ts +0 -10
  458. package/src/core/primitives/kbd/Kbd.tsx +0 -57
  459. package/src/core/primitives/kbd/__workshop__/Plain.tsx +0 -9
  460. package/src/core/primitives/kbd/__workshop__/index.ts +0 -10
  461. package/src/core/primitives/label/Label.tsx +0 -75
  462. package/src/core/primitives/label/__workshop__/OpticalAlignment.tsx +0 -54
  463. package/src/core/primitives/label/__workshop__/Plain.tsx +0 -42
  464. package/src/core/primitives/label/__workshop__/index.ts +0 -21
  465. package/src/core/primitives/layer/Layer.test.tsx +0 -110
  466. package/src/core/primitives/layer/Layer.tsx +0 -42
  467. package/src/core/primitives/layer/LayerCard.tsx +0 -90
  468. package/src/core/primitives/layer/LayerContext.ts +0 -7
  469. package/src/core/primitives/layer/LayerProvider.tsx +0 -106
  470. package/src/core/primitives/layer/__workshop__/MultipleRoots.tsx +0 -49
  471. package/src/core/primitives/layer/__workshop__/Nested.tsx +0 -98
  472. package/src/core/primitives/layer/__workshop__/ResponsiveZOffset.tsx +0 -17
  473. package/src/core/primitives/layer/__workshop__/_debug.tsx +0 -17
  474. package/src/core/primitives/layer/__workshop__/index.ts +0 -26
  475. package/src/core/primitives/layer/getLayerContext.test.ts +0 -32
  476. package/src/core/primitives/layer/getLayerContext.ts +0 -21
  477. package/src/core/primitives/layer/types.ts +0 -9
  478. package/src/core/primitives/layer/useLayer.ts +0 -24
  479. package/src/core/primitives/popover/Popover.tsx +0 -442
  480. package/src/core/primitives/popover/PopoverLayer.tsx +0 -149
  481. package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +0 -89
  482. package/src/core/primitives/popover/__workshop__/MarginsStory.tsx +0 -31
  483. package/src/core/primitives/popover/__workshop__/MatchReferenceWidthStory.tsx +0 -34
  484. package/src/core/primitives/popover/__workshop__/OpenOnMountStory.tsx +0 -11
  485. package/src/core/primitives/popover/__workshop__/PlainStory.tsx +0 -79
  486. package/src/core/primitives/popover/__workshop__/RecursiveStory.tsx +0 -69
  487. package/src/core/primitives/popover/__workshop__/SidePanelStory.tsx +0 -102
  488. package/src/core/primitives/popover/__workshop__/TestStory.tsx +0 -106
  489. package/src/core/primitives/popover/__workshop__/index.ts +0 -51
  490. package/src/core/primitives/popover/constants.ts +0 -22
  491. package/src/core/primitives/popover/floating-ui/size.ts +0 -83
  492. package/src/core/primitives/popover/helpers.ts +0 -32
  493. package/src/core/primitives/popover/types.ts +0 -12
  494. package/src/core/primitives/radio/Radio.tsx +0 -64
  495. package/src/core/primitives/radio/__workshop__/Example.tsx +0 -63
  496. package/src/core/primitives/radio/__workshop__/Plain.tsx +0 -28
  497. package/src/core/primitives/radio/__workshop__/index.ts +0 -13
  498. package/src/core/primitives/select/Select.tsx +0 -75
  499. package/src/core/primitives/select/__workshop__/Plain.tsx +0 -43
  500. package/src/core/primitives/select/__workshop__/ReadOnly.tsx +0 -23
  501. package/src/core/primitives/select/__workshop__/index.ts +0 -13
  502. package/src/core/primitives/selectable/Selectable.tsx +0 -50
  503. package/src/core/primitives/skeleton/CodeSkeleton.tsx +0 -49
  504. package/src/core/primitives/skeleton/HeadingSkeleton.tsx +0 -48
  505. package/src/core/primitives/skeleton/LabelSkeleton.tsx +0 -47
  506. package/src/core/primitives/skeleton/Skeleton.tsx +0 -70
  507. package/src/core/primitives/skeleton/TextSkeleton.tsx +0 -49
  508. package/src/core/primitives/skeleton/__workshop__/Delay.tsx +0 -78
  509. package/src/core/primitives/skeleton/__workshop__/Skeleton.tsx +0 -72
  510. package/src/core/primitives/skeleton/__workshop__/index.ts +0 -13
  511. package/src/core/primitives/spinner/AnimatedSpinnerIcon.tsx +0 -14
  512. package/src/core/primitives/spinner/Spinner.tsx +0 -45
  513. package/src/core/primitives/spinner/__workshop__/Props.tsx +0 -20
  514. package/src/core/primitives/spinner/__workshop__/index.ts +0 -16
  515. package/src/core/primitives/srOnly/SrOnly.tsx +0 -33
  516. package/src/core/primitives/stack/Stack.tsx +0 -60
  517. package/src/core/primitives/stack/__workshop__/Plain.tsx +0 -35
  518. package/src/core/primitives/stack/__workshop__/index.ts +0 -16
  519. package/src/core/primitives/switch/Switch.tsx +0 -84
  520. package/src/core/primitives/switch/__workshop__/Example.tsx +0 -23
  521. package/src/core/primitives/switch/__workshop__/Props.tsx +0 -21
  522. package/src/core/primitives/switch/__workshop__/index.ts +0 -13
  523. package/src/core/primitives/text/Text.tsx +0 -76
  524. package/src/core/primitives/text/__workshop__/Colored.tsx +0 -30
  525. package/src/core/primitives/text/__workshop__/Example.tsx +0 -42
  526. package/src/core/primitives/text/__workshop__/OpticalAlignment.tsx +0 -23
  527. package/src/core/primitives/text/__workshop__/index.ts +0 -26
  528. package/src/core/primitives/textArea/TextArea.tsx +0 -84
  529. package/src/core/primitives/textArea/__workshop__/Plain.tsx +0 -69
  530. package/src/core/primitives/textArea/__workshop__/index.ts +0 -16
  531. package/src/core/primitives/textInput/TextInput.tsx +0 -258
  532. package/src/core/primitives/textInput/__workshop__/ClearButton.tsx +0 -30
  533. package/src/core/primitives/textInput/__workshop__/CustomValidity.tsx +0 -17
  534. package/src/core/primitives/textInput/__workshop__/Plain.tsx +0 -140
  535. package/src/core/primitives/textInput/__workshop__/ReadOnly.tsx +0 -9
  536. package/src/core/primitives/textInput/__workshop__/States.tsx +0 -53
  537. package/src/core/primitives/textInput/__workshop__/Tones.tsx +0 -277
  538. package/src/core/primitives/textInput/__workshop__/Typed.tsx +0 -29
  539. package/src/core/primitives/textInput/__workshop__/index.ts +0 -46
  540. package/src/core/primitives/tooltip/Tooltip.test.tsx +0 -452
  541. package/src/core/primitives/tooltip/Tooltip.tsx +0 -483
  542. package/src/core/primitives/tooltip/TooltipLayer.tsx +0 -106
  543. package/src/core/primitives/tooltip/__workshop__/CustomPortal.tsx +0 -104
  544. package/src/core/primitives/tooltip/__workshop__/OverflowingBoundary.tsx +0 -76
  545. package/src/core/primitives/tooltip/__workshop__/Props.tsx +0 -124
  546. package/src/core/primitives/tooltip/__workshop__/ResizableBoundary.tsx +0 -91
  547. package/src/core/primitives/tooltip/__workshop__/index.ts +0 -31
  548. package/src/core/primitives/tooltip/constants.ts +0 -23
  549. package/src/core/primitives/tooltip/tooltipDelayGroup/TooltipDelayGroupContext.tsx +0 -13
  550. package/src/core/primitives/tooltip/tooltipDelayGroup/TooltipDelayGroupProvider.tsx +0 -55
  551. package/src/core/primitives/tooltip/tooltipDelayGroup/types.ts +0 -10
  552. package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
  553. package/src/core/types.ts +0 -56
  554. package/src/core/utils/ErrorBoundary.tsx +0 -50
  555. package/src/core/utils/boundaryElement/BoundaryElement.test.tsx +0 -102
  556. package/src/core/utils/boundaryElement/BoundaryElementContext.ts +0 -10
  557. package/src/core/utils/boundaryElement/BoundaryElementProvider.tsx +0 -18
  558. package/src/core/utils/boundaryElement/__workshop__/Plain.tsx +0 -19
  559. package/src/core/utils/boundaryElement/__workshop__/index.ts +0 -16
  560. package/src/core/utils/boundaryElement/types.ts +0 -5
  561. package/src/core/utils/boundaryElement/useBoundaryElement.ts +0 -24
  562. package/src/core/utils/elementQuery/ElementQuery.tsx +0 -75
  563. package/src/core/utils/elementQuery/__workshop__/CustomMedia.tsx +0 -41
  564. package/src/core/utils/elementQuery/__workshop__/index.ts +0 -16
  565. package/src/core/utils/elementQuery/helpers.ts +0 -27
  566. package/src/core/utils/getElementRef.ts +0 -29
  567. package/src/core/utils/portal/Portal.test.tsx +0 -105
  568. package/src/core/utils/portal/Portal.tsx +0 -36
  569. package/src/core/utils/portal/PortalContext.ts +0 -37
  570. package/src/core/utils/portal/PortalProvider.tsx +0 -70
  571. package/src/core/utils/portal/__workshop__/Named.tsx +0 -63
  572. package/src/core/utils/portal/__workshop__/index.ts +0 -16
  573. package/src/core/utils/portal/types.ts +0 -7
  574. package/src/core/utils/portal/usePortal.ts +0 -23
  575. package/src/css/_assign.ts +0 -3
  576. package/src/css/_composeClassNames.ts +0 -12
  577. package/src/css/_fromEntries.ts +0 -3
  578. package/src/css/_getClassNames.ts +0 -9
  579. package/src/css/_responsiveClassName.ts +0 -45
  580. package/src/css/_responsiveStyle.css.ts +0 -34
  581. package/src/css/_style.css.ts +0 -9
  582. package/src/css/components/breadcrumbs/breadcrumbs.css.ts +0 -6
  583. package/src/css/components/breadcrumbs/breadcrumbs.ts +0 -7
  584. package/src/css/components/dialog/dialog.css.ts +0 -98
  585. package/src/css/components/dialog/dialog.ts +0 -58
  586. package/src/css/components/menu/menu.css.ts +0 -14
  587. package/src/css/components/menu/menu.ts +0 -12
  588. package/src/css/components/skeleton/skeleton.css.ts +0 -128
  589. package/src/css/components/skeleton/skeleton.ts +0 -38
  590. package/src/css/components/skeleton/types.ts +0 -36
  591. package/src/css/components/toast/toast.css.ts +0 -17
  592. package/src/css/components/toast/toast.ts +0 -11
  593. package/src/css/components/tree/tree.css.ts +0 -65
  594. package/src/css/components/tree/tree.ts +0 -7
  595. package/src/css/constants.ts +0 -10
  596. package/src/css/getVarName.ts +0 -27
  597. package/src/css/index.ts +0 -146
  598. package/src/css/layers.css.ts +0 -12
  599. package/src/css/primitives/_arrow/_arrow.css.ts +0 -68
  600. package/src/css/primitives/_arrow/_arrow.ts +0 -26
  601. package/src/css/primitives/_input/_input.css.ts +0 -261
  602. package/src/css/primitives/_input/input.ts +0 -29
  603. package/src/css/primitives/_input/types.ts +0 -13
  604. package/src/css/primitives/avatar/avatar.css.ts +0 -201
  605. package/src/css/primitives/avatar/avatar.ts +0 -68
  606. package/src/css/primitives/avatar/types.ts +0 -10
  607. package/src/css/primitives/badge/badge.css.ts +0 -27
  608. package/src/css/primitives/badge/badge.ts +0 -8
  609. package/src/css/primitives/badge/types.ts +0 -13
  610. package/src/css/primitives/box/box.css.ts +0 -19
  611. package/src/css/primitives/box/box.ts +0 -82
  612. package/src/css/primitives/box/types.ts +0 -75
  613. package/src/css/primitives/button/button.css.ts +0 -287
  614. package/src/css/primitives/button/button.ts +0 -26
  615. package/src/css/primitives/button/types.ts +0 -12
  616. package/src/css/primitives/card/__workshop__/Color.tsx +0 -83
  617. package/src/css/primitives/card/__workshop__/index.ts +0 -16
  618. package/src/css/primitives/card/card.css.ts +0 -397
  619. package/src/css/primitives/card/card.ts +0 -13
  620. package/src/css/primitives/card/types.ts +0 -9
  621. package/src/css/primitives/checkbox/checkbox.css.ts +0 -193
  622. package/src/css/primitives/checkbox/checkbox.ts +0 -17
  623. package/src/css/primitives/code/code.css.ts +0 -272
  624. package/src/css/primitives/code/code.ts +0 -19
  625. package/src/css/primitives/code/types.ts +0 -11
  626. package/src/css/primitives/container/container.css.ts +0 -4
  627. package/src/css/primitives/container/container.ts +0 -17
  628. package/src/css/primitives/container/types.ts +0 -9
  629. package/src/css/primitives/heading/heading.css.ts +0 -86
  630. package/src/css/primitives/heading/heading.ts +0 -22
  631. package/src/css/primitives/heading/types.ts +0 -14
  632. package/src/css/primitives/kbd/kbd.css.ts +0 -16
  633. package/src/css/primitives/kbd/kbd.ts +0 -9
  634. package/src/css/primitives/kbd/types.ts +0 -6
  635. package/src/css/primitives/label/label.css.ts +0 -87
  636. package/src/css/primitives/label/label.ts +0 -22
  637. package/src/css/primitives/label/types.ts +0 -14
  638. package/src/css/primitives/popover/popover.css.ts +0 -6
  639. package/src/css/primitives/popover/popover.ts +0 -12
  640. package/src/css/primitives/radio/radio.css.ts +0 -78
  641. package/src/css/primitives/radio/radio.ts +0 -17
  642. package/src/css/primitives/root/root.css.ts +0 -20
  643. package/src/css/primitives/root/root.ts +0 -17
  644. package/src/css/primitives/root/types.ts +0 -10
  645. package/src/css/primitives/select/select.css.ts +0 -24
  646. package/src/css/primitives/select/select.ts +0 -14
  647. package/src/css/primitives/select/types.ts +0 -5
  648. package/src/css/primitives/selectable/selectable.css.ts +0 -131
  649. package/src/css/primitives/selectable/selectable.ts +0 -9
  650. package/src/css/primitives/selectable/types.ts +0 -9
  651. package/src/css/primitives/spinner/spinner.css.ts +0 -19
  652. package/src/css/primitives/spinner/spinner.ts +0 -13
  653. package/src/css/primitives/spinner/types.ts +0 -4
  654. package/src/css/primitives/srOnly/srOnly.css.ts +0 -10
  655. package/src/css/primitives/srOnly/srOnly.ts +0 -7
  656. package/src/css/primitives/stack/stack.css.ts +0 -6
  657. package/src/css/primitives/stack/stack.ts +0 -7
  658. package/src/css/primitives/switch/switch.css.ts +0 -98
  659. package/src/css/primitives/switch/switch.ts +0 -27
  660. package/src/css/primitives/text/text.css.ts +0 -86
  661. package/src/css/primitives/text/text.ts +0 -24
  662. package/src/css/primitives/text/types.ts +0 -18
  663. package/src/css/primitives/textArea/textArea.css.ts +0 -4
  664. package/src/css/primitives/textArea/textArea.ts +0 -9
  665. package/src/css/primitives/textArea/types.ts +0 -7
  666. package/src/css/primitives/textInput/textInput.css.ts +0 -43
  667. package/src/css/primitives/textInput/textInput.ts +0 -24
  668. package/src/css/primitives/textInput/types.ts +0 -7
  669. package/src/css/primitives/tooltip/tooltip.css.ts +0 -4
  670. package/src/css/primitives/tooltip/tooltip.ts +0 -8
  671. package/src/css/primitives/tooltip/types.ts +0 -4
  672. package/src/css/props/alignItems/alignItems.css.ts +0 -22
  673. package/src/css/props/alignItems/alignItems.ts +0 -8
  674. package/src/css/props/alignItems/types.ts +0 -9
  675. package/src/css/props/border/border.css.ts +0 -65
  676. package/src/css/props/border/border.ts +0 -21
  677. package/src/css/props/border/types.ts +0 -13
  678. package/src/css/props/boxSizing/boxSizing.css.ts +0 -12
  679. package/src/css/props/boxSizing/boxSizing.ts +0 -7
  680. package/src/css/props/boxSizing/types.ts +0 -7
  681. package/src/css/props/display/display.css.ts +0 -56
  682. package/src/css/props/display/display.ts +0 -8
  683. package/src/css/props/display/types.ts +0 -16
  684. package/src/css/props/flex/flex.css.ts +0 -52
  685. package/src/css/props/flex/flex.ts +0 -8
  686. package/src/css/props/flex/types.ts +0 -9
  687. package/src/css/props/flexDirection/flexDirection.css.ts +0 -19
  688. package/src/css/props/flexDirection/flexDirection.ts +0 -8
  689. package/src/css/props/flexDirection/types.ts +0 -9
  690. package/src/css/props/flexWrap/flexWrap.css.ts +0 -16
  691. package/src/css/props/flexWrap/flexWrap.ts +0 -8
  692. package/src/css/props/flexWrap/types.ts +0 -9
  693. package/src/css/props/font/font.css.ts +0 -94
  694. package/src/css/props/font/font.ts +0 -8
  695. package/src/css/props/font/types.ts +0 -6
  696. package/src/css/props/gap/gap.css.ts +0 -40
  697. package/src/css/props/gap/gap.ts +0 -13
  698. package/src/css/props/gap/types.ts +0 -10
  699. package/src/css/props/gridAutoColumns/gridAutoColumns.css.ts +0 -19
  700. package/src/css/props/gridAutoColumns/gridAutoColumns.ts +0 -8
  701. package/src/css/props/gridAutoColumns/types.ts +0 -9
  702. package/src/css/props/gridAutoFlow/gridAutoFlow.css.ts +0 -19
  703. package/src/css/props/gridAutoFlow/gridAutoFlow.ts +0 -8
  704. package/src/css/props/gridAutoFlow/types.ts +0 -9
  705. package/src/css/props/gridAutoRows/gridAutoRows.css.ts +0 -19
  706. package/src/css/props/gridAutoRows/gridAutoRows.ts +0 -8
  707. package/src/css/props/gridAutoRows/types.ts +0 -9
  708. package/src/css/props/gridColumn/gridColumn.css.ts +0 -49
  709. package/src/css/props/gridColumn/gridColumn.ts +0 -8
  710. package/src/css/props/gridColumn/types.ts +0 -9
  711. package/src/css/props/gridColumnEnd/gridColumnEnd.css.ts +0 -46
  712. package/src/css/props/gridColumnEnd/gridColumnEnd.ts +0 -8
  713. package/src/css/props/gridColumnEnd/types.ts +0 -9
  714. package/src/css/props/gridColumnStart/gridColumnStart.css.ts +0 -46
  715. package/src/css/props/gridColumnStart/gridColumnStart.ts +0 -8
  716. package/src/css/props/gridColumnStart/types.ts +0 -9
  717. package/src/css/props/gridRow/gridRow.css.ts +0 -49
  718. package/src/css/props/gridRow/gridRow.ts +0 -8
  719. package/src/css/props/gridRow/types.ts +0 -9
  720. package/src/css/props/gridRowEnd/gridRowEnd.css.ts +0 -46
  721. package/src/css/props/gridRowEnd/gridRowEnd.ts +0 -8
  722. package/src/css/props/gridRowEnd/types.ts +0 -9
  723. package/src/css/props/gridRowStart/gridRowStart.css.ts +0 -46
  724. package/src/css/props/gridRowStart/gridRowStart.ts +0 -8
  725. package/src/css/props/gridRowStart/types.ts +0 -9
  726. package/src/css/props/gridTemplateColumns/gridTemplateColumns.css.ts +0 -43
  727. package/src/css/props/gridTemplateColumns/gridTemplateColumns.ts +0 -8
  728. package/src/css/props/gridTemplateColumns/types.ts +0 -9
  729. package/src/css/props/gridTemplateRows/gridTemplateRows.css.ts +0 -43
  730. package/src/css/props/gridTemplateRows/gridTemplateRows.ts +0 -8
  731. package/src/css/props/gridTemplateRows/types.ts +0 -9
  732. package/src/css/props/height/height.css.ts +0 -25
  733. package/src/css/props/height/height.ts +0 -8
  734. package/src/css/props/height/types.ts +0 -9
  735. package/src/css/props/inset/inset.css.ts +0 -37
  736. package/src/css/props/inset/inset.ts +0 -21
  737. package/src/css/props/inset/types.ts +0 -13
  738. package/src/css/props/justifyContent/justifyContent.css.ts +0 -25
  739. package/src/css/props/justifyContent/justifyContent.ts +0 -8
  740. package/src/css/props/justifyContent/types.ts +0 -15
  741. package/src/css/props/margin/margin.css.ts +0 -117
  742. package/src/css/props/margin/margin.ts +0 -25
  743. package/src/css/props/margin/types.ts +0 -17
  744. package/src/css/props/maxWidth/maxWidth.css.ts +0 -32
  745. package/src/css/props/maxWidth/maxWidth.ts +0 -8
  746. package/src/css/props/maxWidth/types.ts +0 -11
  747. package/src/css/props/minHeight/minHeight.css.ts +0 -13
  748. package/src/css/props/minHeight/minHeight.ts +0 -8
  749. package/src/css/props/minHeight/types.ts +0 -9
  750. package/src/css/props/minWidth/minWidth.css.ts +0 -25
  751. package/src/css/props/minWidth/minWidth.ts +0 -8
  752. package/src/css/props/minWidth/types.ts +0 -9
  753. package/src/css/props/outline/outline.css.ts +0 -10
  754. package/src/css/props/outline/outline.ts +0 -8
  755. package/src/css/props/outline/types.ts +0 -7
  756. package/src/css/props/overflow/overflow.css.ts +0 -16
  757. package/src/css/props/overflow/overflow.ts +0 -8
  758. package/src/css/props/overflow/types.ts +0 -11
  759. package/src/css/props/padding/padding.css.ts +0 -87
  760. package/src/css/props/padding/padding.ts +0 -25
  761. package/src/css/props/padding/types.ts +0 -17
  762. package/src/css/props/pointerEvents/pointerEvents.css.ts +0 -13
  763. package/src/css/props/pointerEvents/pointerEvents.ts +0 -8
  764. package/src/css/props/pointerEvents/types.ts +0 -7
  765. package/src/css/props/position/position.css.ts +0 -22
  766. package/src/css/props/position/position.ts +0 -8
  767. package/src/css/props/position/types.ts +0 -9
  768. package/src/css/props/radius/radius.css.ts +0 -21
  769. package/src/css/props/radius/radius.ts +0 -8
  770. package/src/css/props/radius/types.ts +0 -8
  771. package/src/css/props/shadow/shadow.css.ts +0 -23
  772. package/src/css/props/shadow/shadow.ts +0 -8
  773. package/src/css/props/shadow/types.ts +0 -8
  774. package/src/css/props/textAlign/textAlign.css.ts +0 -22
  775. package/src/css/props/textAlign/textAlign.ts +0 -8
  776. package/src/css/props/textAlign/types.ts +0 -7
  777. package/src/css/props/textOverflow/textOverflow.css.ts +0 -19
  778. package/src/css/props/textOverflow/textOverflow.ts +0 -8
  779. package/src/css/props/textOverflow/types.ts +0 -12
  780. package/src/css/props/width/types.ts +0 -11
  781. package/src/css/props/width/width.css.ts +0 -31
  782. package/src/css/props/width/width.ts +0 -8
  783. package/src/css/theme/buildCSSTheme.ts +0 -492
  784. package/src/css/theme/defaultTheme.css.ts +0 -64
  785. package/src/css/types.ts +0 -431
  786. package/src/css/vars.css.ts +0 -680
  787. package/src/theme/_parseColorToken.ts +0 -180
  788. package/src/theme/buildTheme.ts +0 -32
  789. package/src/theme/constants.ts +0 -90
  790. package/src/theme/defaults/color.ts +0 -197
  791. package/src/theme/defaults/common.ts +0 -71
  792. package/src/theme/defaults/fonts.ts +0 -250
  793. package/src/theme/index.ts +0 -5
  794. package/src/theme/merge.ts +0 -24
  795. package/src/theme/resolveTokens.ts +0 -204
  796. 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
+ }