cursedbelt 1.0.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (537) hide show
  1. package/dist/client/index.js +1 -1
  2. package/dist/core/category/index.d.ts.map +1 -1
  3. package/dist/core/category/index.js +2 -1
  4. package/dist/core/category/index.js.map +1 -1
  5. package/dist/core/category/types.js +1 -1
  6. package/dist/core/category/types.js.map +1 -1
  7. package/dist/core/file-tree/fileTreeModel.d.ts +49 -0
  8. package/dist/core/file-tree/fileTreeModel.d.ts.map +1 -1
  9. package/dist/core/file-tree/fileTreeModel.js +84 -0
  10. package/dist/core/file-tree/fileTreeModel.js.map +1 -1
  11. package/dist/core/layout/index.js +1 -1
  12. package/dist/core/layout/index.js.map +1 -1
  13. package/dist/core/media/index.js +1 -1
  14. package/dist/core/media/index.js.map +1 -1
  15. package/dist/core/media/types.js +1 -1
  16. package/dist/core/media/types.js.map +1 -1
  17. package/dist/core/media/uploadLimits.js +1 -1
  18. package/dist/core/media/uploadLimits.js.map +1 -1
  19. package/dist/core/sharing/model.d.ts +1 -1
  20. package/dist/ctgr/index.js +1 -1
  21. package/dist/index.js +1 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/react/activity-bar/ActivityBar.d.ts +17 -0
  24. package/dist/react/activity-bar/ActivityBar.d.ts.map +1 -1
  25. package/dist/react/activity-bar/ActivityBar.js.map +1 -1
  26. package/dist/react/analytics/index.d.ts +1 -1
  27. package/dist/react/analytics/index.js +1 -1
  28. package/dist/react/chat/MessageComposer.d.ts.map +1 -1
  29. package/dist/react/chat/MessageComposer.js +5 -4
  30. package/dist/react/chat/MessageComposer.js.map +1 -1
  31. package/dist/react/components/Button.d.ts.map +1 -1
  32. package/dist/react/components/Button.js +3 -2
  33. package/dist/react/components/Button.js.map +1 -1
  34. package/dist/react/components/Checkbox.d.ts +19 -3
  35. package/dist/react/components/Checkbox.d.ts.map +1 -1
  36. package/dist/react/components/Checkbox.js +29 -12
  37. package/dist/react/components/Checkbox.js.map +1 -1
  38. package/dist/react/components/CodeArea.d.ts.map +1 -1
  39. package/dist/react/components/CodeArea.js +2 -1
  40. package/dist/react/components/CodeArea.js.map +1 -1
  41. package/dist/react/components/Collapsible.d.ts.map +1 -1
  42. package/dist/react/components/Collapsible.js +2 -1
  43. package/dist/react/components/Collapsible.js.map +1 -1
  44. package/dist/react/components/ComboboxField.d.ts.map +1 -1
  45. package/dist/react/components/ComboboxField.js +3 -2
  46. package/dist/react/components/ComboboxField.js.map +1 -1
  47. package/dist/react/components/CopyButton.d.ts.map +1 -1
  48. package/dist/react/components/CopyButton.js +2 -1
  49. package/dist/react/components/CopyButton.js.map +1 -1
  50. package/dist/react/components/DataTable/ColumnChecklist.d.ts.map +1 -1
  51. package/dist/react/components/DataTable/ColumnChecklist.js +2 -1
  52. package/dist/react/components/DataTable/ColumnChecklist.js.map +1 -1
  53. package/dist/react/components/DataTable/Pagination.d.ts.map +1 -1
  54. package/dist/react/components/DataTable/Pagination.js +2 -1
  55. package/dist/react/components/DataTable/Pagination.js.map +1 -1
  56. package/dist/react/components/DataTable/SortHeader.d.ts.map +1 -1
  57. package/dist/react/components/DataTable/SortHeader.js +2 -1
  58. package/dist/react/components/DataTable/SortHeader.js.map +1 -1
  59. package/dist/react/components/DataTable/TableFilterBuilder.d.ts +61 -0
  60. package/dist/react/components/DataTable/TableFilterBuilder.d.ts.map +1 -0
  61. package/dist/react/components/DataTable/{FilterBuilder.js → TableFilterBuilder.js} +26 -3
  62. package/dist/react/components/DataTable/TableFilterBuilder.js.map +1 -0
  63. package/dist/react/components/DataTable/Toolbar.d.ts +1 -1
  64. package/dist/react/components/DataTable/Toolbar.js +3 -3
  65. package/dist/react/components/DataTable/Toolbar.js.map +1 -1
  66. package/dist/react/components/DataTable/cells/LinkCell.d.ts.map +1 -1
  67. package/dist/react/components/DataTable/cells/LinkCell.js +2 -1
  68. package/dist/react/components/DataTable/cells/LinkCell.js.map +1 -1
  69. package/dist/react/components/DataTable/index.d.ts +1 -1
  70. package/dist/react/components/DataTable/index.d.ts.map +1 -1
  71. package/dist/react/components/DataTable/index.js +4 -1
  72. package/dist/react/components/DataTable/index.js.map +1 -1
  73. package/dist/react/components/DragHandle.d.ts.map +1 -1
  74. package/dist/react/components/DragHandle.js +2 -1
  75. package/dist/react/components/DragHandle.js.map +1 -1
  76. package/dist/react/components/EmojiField.d.ts.map +1 -1
  77. package/dist/react/components/EmojiField.js +2 -1
  78. package/dist/react/components/EmojiField.js.map +1 -1
  79. package/dist/react/components/EventTimeline.d.ts +3 -2
  80. package/dist/react/components/EventTimeline.d.ts.map +1 -1
  81. package/dist/react/components/EventTimeline.js +3 -2
  82. package/dist/react/components/EventTimeline.js.map +1 -1
  83. package/dist/react/components/IconButton.d.ts +1 -1
  84. package/dist/react/components/IconButton.js +1 -1
  85. package/dist/react/components/InfoHint.d.ts.map +1 -1
  86. package/dist/react/components/InfoHint.js +5 -4
  87. package/dist/react/components/InfoHint.js.map +1 -1
  88. package/dist/react/components/InheritBadge.js +1 -1
  89. package/dist/react/components/InheritBadge.js.map +1 -1
  90. package/dist/react/components/InlineEditableText.d.ts.map +1 -1
  91. package/dist/react/components/InlineEditableText.js +2 -1
  92. package/dist/react/components/InlineEditableText.js.map +1 -1
  93. package/dist/react/components/MeterList.d.ts.map +1 -1
  94. package/dist/react/components/MeterList.js +2 -1
  95. package/dist/react/components/MeterList.js.map +1 -1
  96. package/dist/react/components/PathText.d.ts +2 -2
  97. package/dist/react/components/PathText.d.ts.map +1 -1
  98. package/dist/react/components/PathText.js +2 -1
  99. package/dist/react/components/PathText.js.map +1 -1
  100. package/dist/react/components/RatingField.d.ts.map +1 -1
  101. package/dist/react/components/RatingField.js +2 -1
  102. package/dist/react/components/RatingField.js.map +1 -1
  103. package/dist/react/components/SecretInput.js +3 -2
  104. package/dist/react/components/SecretInput.js.map +1 -1
  105. package/dist/react/components/SegmentedControl.d.ts.map +1 -1
  106. package/dist/react/components/SegmentedControl.js +2 -1
  107. package/dist/react/components/SegmentedControl.js.map +1 -1
  108. package/dist/react/components/StarRating.d.ts.map +1 -1
  109. package/dist/react/components/StarRating.js +9 -5
  110. package/dist/react/components/StarRating.js.map +1 -1
  111. package/dist/react/components/StatStrip.d.ts.map +1 -1
  112. package/dist/react/components/StatStrip.js +2 -1
  113. package/dist/react/components/StatStrip.js.map +1 -1
  114. package/dist/react/components/StatTile.d.ts.map +1 -1
  115. package/dist/react/components/StatTile.js +3 -2
  116. package/dist/react/components/StatTile.js.map +1 -1
  117. package/dist/react/components/Tabs.d.ts.map +1 -1
  118. package/dist/react/components/Tabs.js +2 -1
  119. package/dist/react/components/Tabs.js.map +1 -1
  120. package/dist/react/components/TruncatedText.d.ts +2 -1
  121. package/dist/react/components/TruncatedText.d.ts.map +1 -1
  122. package/dist/react/components/TruncatedText.js +2 -1
  123. package/dist/react/components/TruncatedText.js.map +1 -1
  124. package/dist/react/components/calendar/MonthGrid.d.ts.map +1 -1
  125. package/dist/react/components/calendar/MonthGrid.js +2 -1
  126. package/dist/react/components/calendar/MonthGrid.js.map +1 -1
  127. package/dist/react/components/calendar/WeekView.d.ts.map +1 -1
  128. package/dist/react/components/calendar/WeekView.js +2 -1
  129. package/dist/react/components/calendar/WeekView.js.map +1 -1
  130. package/dist/react/components/revealOnHover.d.ts.map +1 -1
  131. package/dist/react/components/revealOnHover.js +2 -1
  132. package/dist/react/components/revealOnHover.js.map +1 -1
  133. package/dist/react/file-tree/FileTree.d.ts +50 -1
  134. package/dist/react/file-tree/FileTree.d.ts.map +1 -1
  135. package/dist/react/file-tree/FileTree.js +234 -6
  136. package/dist/react/file-tree/FileTree.js.map +1 -1
  137. package/dist/react/file-tree/fileTree.css +52 -0
  138. package/dist/react/filter-rail/FilterRail.d.ts.map +1 -1
  139. package/dist/react/filter-rail/FilterRail.js +5 -4
  140. package/dist/react/filter-rail/FilterRail.js.map +1 -1
  141. package/dist/react/folder-tree/FolderTreeRail.d.ts.map +1 -1
  142. package/dist/react/folder-tree/FolderTreeRail.js +2 -1
  143. package/dist/react/folder-tree/FolderTreeRail.js.map +1 -1
  144. package/dist/react/index.d.ts +5 -1
  145. package/dist/react/index.d.ts.map +1 -1
  146. package/dist/react/index.js +5 -1
  147. package/dist/react/index.js.map +1 -1
  148. package/dist/react/layoutEngine/index.js +1 -1
  149. package/dist/react/layoutEngine/index.js.map +1 -1
  150. package/dist/react/lib/field.d.ts.map +1 -1
  151. package/dist/react/lib/field.js +3 -2
  152. package/dist/react/lib/field.js.map +1 -1
  153. package/dist/react/lib/floatingStyles.d.ts.map +1 -1
  154. package/dist/react/lib/floatingStyles.js +2 -1
  155. package/dist/react/lib/floatingStyles.js.map +1 -1
  156. package/dist/react/lib/tapTarget.d.ts +96 -0
  157. package/dist/react/lib/tapTarget.d.ts.map +1 -0
  158. package/dist/react/lib/tapTarget.js +96 -0
  159. package/dist/react/lib/tapTarget.js.map +1 -0
  160. package/dist/react/media/VideoTrimmer.d.ts +1 -1
  161. package/dist/react/media/VideoTrimmer.js +1 -1
  162. package/dist/react/media/denseGallery.css +3 -3
  163. package/dist/react/media/ffmpegWasm.js +2 -2
  164. package/dist/react/media/ffmpegWasm.js.map +1 -1
  165. package/dist/react/media/videoPlayer.css +42 -0
  166. package/dist/react/namespace/NamespaceTargetCapsule.d.ts +2 -2
  167. package/dist/react/namespace/NamespaceTargetCapsule.d.ts.map +1 -1
  168. package/dist/react/nav/BreadcrumbTrail.d.ts.map +1 -1
  169. package/dist/react/nav/BreadcrumbTrail.js +4 -3
  170. package/dist/react/nav/BreadcrumbTrail.js.map +1 -1
  171. package/dist/react/nav/HubTileGrid.d.ts.map +1 -1
  172. package/dist/react/nav/HubTileGrid.js +2 -1
  173. package/dist/react/nav/HubTileGrid.js.map +1 -1
  174. package/dist/react/nav/SideNav.d.ts.map +1 -1
  175. package/dist/react/nav/SideNav.js +4 -3
  176. package/dist/react/nav/SideNav.js.map +1 -1
  177. package/dist/react/nav/SideNavCustomize.d.ts.map +1 -1
  178. package/dist/react/nav/SideNavCustomize.js +2 -1
  179. package/dist/react/nav/SideNavCustomize.js.map +1 -1
  180. package/dist/react/palette/CommandPalette.d.ts.map +1 -1
  181. package/dist/react/palette/CommandPalette.js +3 -2
  182. package/dist/react/palette/CommandPalette.js.map +1 -1
  183. package/dist/server/drivers/pooledControlStores.pg.test.js +1 -0
  184. package/dist/server/drivers/pooledControlStores.pg.test.js.map +1 -1
  185. package/dist/server/drivers/pooledIdentityStore.pg.test.js +1 -0
  186. package/dist/server/drivers/pooledIdentityStore.pg.test.js.map +1 -1
  187. package/dist/server/drivers/retentionPolicy.pg.test.js +1 -0
  188. package/dist/server/drivers/retentionPolicy.pg.test.js.map +1 -1
  189. package/dist/server/guard/argon2Binding.d.ts +1 -1
  190. package/dist/server/guard/argon2Binding.js +1 -1
  191. package/dist/server/incidents/store.d.ts +3 -3
  192. package/dist/server/index.js +1 -1
  193. package/dist/server/index.js.map +1 -1
  194. package/dist/server/master-lock/masterLock.d.ts +1 -1
  195. package/dist/server/media-bun/index.js +1 -1
  196. package/dist/server/media-bun/index.js.map +1 -1
  197. package/dist/server/paths/appDataHome.d.ts +20 -0
  198. package/dist/server/paths/appDataHome.d.ts.map +1 -0
  199. package/dist/server/paths/appDataHome.js +69 -0
  200. package/dist/server/paths/appDataHome.js.map +1 -0
  201. package/dist/server/retention/archive.d.ts +3 -4
  202. package/dist/server/retention/archive.d.ts.map +1 -1
  203. package/dist/server/retention/archive.js +20 -15
  204. package/dist/server/retention/archive.js.map +1 -1
  205. package/dist/server/retention/index.d.ts +1 -1
  206. package/dist/server/retention/index.js +1 -1
  207. package/dist/server/retention/policy.d.ts +2 -2
  208. package/dist/server/retention/policy.d.ts.map +1 -1
  209. package/dist/server/retention/policy.js +1 -1
  210. package/dist/server/retention/store.d.ts.map +1 -1
  211. package/dist/server/retention/store.js +27 -20
  212. package/dist/server/retention/store.js.map +1 -1
  213. package/dist/server/runtime/localHost.d.ts +10 -5
  214. package/dist/server/runtime/localHost.d.ts.map +1 -1
  215. package/dist/server/runtime/localHost.js +12 -8
  216. package/dist/server/runtime/localHost.js.map +1 -1
  217. package/dist/server/runtime/meterRollup.pg.test.js +1 -0
  218. package/dist/server/runtime/meterRollup.pg.test.js.map +1 -1
  219. package/dist/server/runtime/recipe.d.ts +4 -4
  220. package/dist/server/runtime/retentionJob.pg.test.js +1 -0
  221. package/dist/server/runtime/retentionJob.pg.test.js.map +1 -1
  222. package/dist/server/search/pgSearchProvider.pg.test.js +1 -0
  223. package/dist/server/search/pgSearchProvider.pg.test.js.map +1 -1
  224. package/dist/shared/errors.d.ts +1 -1
  225. package/dist/shared/errors.js +1 -1
  226. package/dist/styles-static.css +413 -0
  227. package/dist/styles-utilities.css +5074 -0
  228. package/dist/styles.css +49 -0
  229. package/package.json +30 -168
  230. package/scripts/generateStaticStyles.ts +122 -0
  231. package/scripts/generateUtilityStyles.ts +215 -0
  232. package/scripts/publicSurface.ts +455 -0
  233. package/scripts/testTmpRoot.ts +34 -5
  234. package/src/client/index.ts +1 -1
  235. package/src/core/category/index.ts +2 -1
  236. package/src/core/category/types.ts +1 -1
  237. package/src/core/file-tree/fileTreeModel.spec.ts +134 -0
  238. package/src/core/file-tree/fileTreeModel.ts +104 -0
  239. package/src/core/layout/index.ts +1 -1
  240. package/src/core/media/index.ts +1 -1
  241. package/src/core/media/types.ts +1 -1
  242. package/src/core/media/uploadLimits.ts +1 -1
  243. package/src/core/sharing/model.ts +1 -1
  244. package/src/ctgr/index.ts +1 -1
  245. package/src/declaredDepsAreImported.spec.ts +87 -0
  246. package/src/demoFixture.spec.ts +133 -0
  247. package/src/index.ts +1 -1
  248. package/src/lockfileIsTracked.spec.ts +50 -0
  249. package/src/namedSubpathsResolve.spec.ts +119 -0
  250. package/src/publicSurface.spec.ts +72 -0
  251. package/src/react/activity-bar/ActivityBar.tsx +17 -0
  252. package/src/react/analytics/index.ts +1 -1
  253. package/src/react/chat/MessageComposer.tsx +5 -4
  254. package/src/react/components/Button.tsx +3 -2
  255. package/src/react/components/Checkbox.spec.tsx +51 -0
  256. package/src/react/components/Checkbox.tsx +68 -26
  257. package/src/react/components/CodeArea.tsx +2 -1
  258. package/src/react/components/CodeChip.spec.tsx +2 -2
  259. package/src/react/components/Collapsible.tsx +2 -1
  260. package/src/react/components/ComboboxField.tsx +3 -2
  261. package/src/react/components/CopyButton.tsx +2 -1
  262. package/src/react/components/CopyableText.spec.tsx +1 -1
  263. package/src/react/components/DataTable/ColumnChecklist.tsx +2 -1
  264. package/src/react/components/DataTable/Pagination.tsx +2 -1
  265. package/src/react/components/DataTable/SortHeader.tsx +2 -1
  266. package/src/react/components/DataTable/{FilterBuilder.tsx → TableFilterBuilder.tsx} +33 -5
  267. package/src/react/components/DataTable/Toolbar.tsx +3 -3
  268. package/src/react/components/DataTable/cells/LinkCell.tsx +2 -1
  269. package/src/react/components/DataTable/index.ts +8 -1
  270. package/src/react/components/DragHandle.tsx +2 -1
  271. package/src/react/components/EmojiField.tsx +2 -1
  272. package/src/react/components/EventTimeline.tsx +3 -2
  273. package/src/react/components/FileLocation.spec.tsx +1 -1
  274. package/src/react/components/IconButton.tsx +1 -1
  275. package/src/react/components/InfoHint.tsx +5 -4
  276. package/src/react/components/InheritBadge.tsx +1 -1
  277. package/src/react/components/InlineEditableText.tsx +2 -1
  278. package/src/react/components/MeterList.tsx +2 -1
  279. package/src/react/components/PathText.tsx +4 -3
  280. package/src/react/components/RatingField.tsx +2 -1
  281. package/src/react/components/SecretInput.tsx +3 -3
  282. package/src/react/components/SegmentedControl.tsx +2 -2
  283. package/src/react/components/StarRating.spec.tsx +2 -2
  284. package/src/react/components/StarRating.tsx +9 -5
  285. package/src/react/components/StatStrip.tsx +2 -1
  286. package/src/react/components/StatTile.tsx +3 -3
  287. package/src/react/components/Tabs.spec.tsx +3 -2
  288. package/src/react/components/Tabs.tsx +2 -1
  289. package/src/react/components/TruncatedText.tsx +2 -1
  290. package/src/react/components/calendar/MonthGrid.spec.tsx +2 -1
  291. package/src/react/components/calendar/MonthGrid.tsx +2 -1
  292. package/src/react/components/calendar/WeekView.tsx +2 -1
  293. package/src/react/components/revealOnHover.ts +3 -2
  294. package/src/react/file-tree/FileTree.spec.tsx +248 -0
  295. package/src/react/file-tree/FileTree.tsx +304 -4
  296. package/src/react/file-tree/fileTree.css +52 -0
  297. package/src/react/file-tree/fileTreeGeometry.fixture.json +151 -0
  298. package/src/react/file-tree/fileTreeGeometry.spec.ts +33 -52
  299. package/src/react/filter-rail/FilterRail.spec.tsx +2 -1
  300. package/src/react/filter-rail/FilterRail.tsx +5 -4
  301. package/src/react/folder-tree/FolderTreeRail.tsx +2 -1
  302. package/src/react/index.ts +13 -3
  303. package/src/react/layoutEngine/index.ts +1 -1
  304. package/src/react/layoutEngine/types.ts +1 -1
  305. package/src/react/lib/field.ts +4 -2
  306. package/src/react/lib/floatingStyles.spec.ts +2 -1
  307. package/src/react/lib/floatingStyles.ts +3 -1
  308. package/src/react/lib/tapTarget.ts +100 -0
  309. package/src/react/media/MaskPainter.tsx +2 -2
  310. package/src/react/media/VideoTrimmer.tsx +1 -1
  311. package/src/react/media/denseGallery.css +3 -3
  312. package/src/react/media/ffmpegWasm.ts +2 -2
  313. package/src/react/media/videoPlayer.css +42 -0
  314. package/src/react/namespace/NamespaceTargetCapsule.tsx +2 -2
  315. package/src/react/nav/BreadcrumbTrail.tsx +4 -3
  316. package/src/react/nav/HubTileGrid.tsx +2 -1
  317. package/src/react/nav/SideNav.tsx +4 -3
  318. package/src/react/nav/SideNavCustomize.tsx +2 -1
  319. package/src/react/palette/CommandPalette.tsx +3 -2
  320. package/src/server/ctgr.ts +1 -1
  321. package/src/server/drivers/pooledControlStores.pg.test.ts +1 -0
  322. package/src/server/drivers/pooledIdentityStore.pg.test.ts +1 -0
  323. package/src/server/drivers/retentionPolicy.pg.test.ts +1 -0
  324. package/src/server/guard/argon2Binding.ts +1 -1
  325. package/src/server/incidents/store.ts +3 -3
  326. package/src/server/index.ts +1 -1
  327. package/src/server/master-lock/masterLock.spec.ts +18 -2
  328. package/src/server/master-lock/masterLock.ts +1 -1
  329. package/src/server/media-bun/image.spec.ts +1 -0
  330. package/src/server/media-bun/index.ts +1 -1
  331. package/src/server/media-bun/video.spec.ts +1 -0
  332. package/src/server/paths/appDataHome.spec.ts +87 -0
  333. package/src/server/paths/appDataHome.ts +84 -0
  334. package/src/server/retention/archive.spec.ts +26 -4
  335. package/src/server/retention/archive.ts +20 -15
  336. package/src/server/retention/index.ts +1 -1
  337. package/src/server/retention/policy.ts +2 -2
  338. package/src/server/retention/store.spec.ts +38 -10
  339. package/src/server/retention/store.ts +26 -19
  340. package/src/server/runtime/localHost.spec.ts +22 -3
  341. package/src/server/runtime/localHost.ts +12 -9
  342. package/src/server/runtime/meterRollup.pg.test.ts +1 -0
  343. package/src/server/runtime/recipe.ts +4 -4
  344. package/src/server/runtime/retentionJob.pg.test.ts +1 -0
  345. package/src/server/search/pgSearchProvider.pg.test.ts +1 -0
  346. package/src/server/storage/binaryServerProcessing.integration.spec.ts +6 -2
  347. package/src/server/storage/chunked.integration.spec.ts +5 -2
  348. package/src/server/storage/fileUploadClient-chunked.integration.spec.ts +5 -2
  349. package/src/server/storage/files/adapter.photo.display.spec.ts +1 -0
  350. package/src/server/storage/imageThumbnail.spec.ts +1 -0
  351. package/src/server/storage/transcode.integration.spec.ts +5 -2
  352. package/src/server/storage/videoProcessor.posterOnly.spec.ts +1 -0
  353. package/src/shared/errors.ts +1 -1
  354. package/src/skippedTestsAreAnswered.spec.ts +215 -0
  355. package/src/styles-static.css +413 -0
  356. package/src/styles-utilities.css +5074 -0
  357. package/src/styles.css +49 -0
  358. package/src/stylesStaticMatches.spec.ts +134 -0
  359. package/src/stylesUtilitiesMatches.spec.ts +314 -0
  360. package/src/tapTargetStylesheet.spec.ts +150 -0
  361. package/src/testTmpRoot.spec.ts +102 -0
  362. package/dist/core/duplicates/index.d.ts +0 -116
  363. package/dist/core/duplicates/index.d.ts.map +0 -1
  364. package/dist/core/duplicates/index.js +0 -178
  365. package/dist/core/duplicates/index.js.map +0 -1
  366. package/dist/core/namespace/helpers.d.ts +0 -14
  367. package/dist/core/namespace/helpers.d.ts.map +0 -1
  368. package/dist/core/namespace/helpers.js +0 -29
  369. package/dist/core/namespace/helpers.js.map +0 -1
  370. package/dist/core/namespace/index.d.ts +0 -4
  371. package/dist/core/namespace/index.d.ts.map +0 -1
  372. package/dist/core/namespace/index.js +0 -6
  373. package/dist/core/namespace/index.js.map +0 -1
  374. package/dist/core/namespace/memoryStore.d.ts +0 -19
  375. package/dist/core/namespace/memoryStore.d.ts.map +0 -1
  376. package/dist/core/namespace/memoryStore.js +0 -70
  377. package/dist/core/namespace/memoryStore.js.map +0 -1
  378. package/dist/core/namespace/types.d.ts +0 -44
  379. package/dist/core/namespace/types.d.ts.map +0 -1
  380. package/dist/core/namespace/types.js +0 -8
  381. package/dist/core/namespace/types.js.map +0 -1
  382. package/dist/game/core/DisposeRegistry.d.ts +0 -42
  383. package/dist/game/core/DisposeRegistry.d.ts.map +0 -1
  384. package/dist/game/core/DisposeRegistry.js +0 -67
  385. package/dist/game/core/DisposeRegistry.js.map +0 -1
  386. package/dist/game/core/drawBudget.d.ts +0 -26
  387. package/dist/game/core/drawBudget.d.ts.map +0 -1
  388. package/dist/game/core/drawBudget.js +0 -55
  389. package/dist/game/core/drawBudget.js.map +0 -1
  390. package/dist/game/core/fixedTimestep.d.ts +0 -38
  391. package/dist/game/core/fixedTimestep.d.ts.map +0 -1
  392. package/dist/game/core/fixedTimestep.js +0 -47
  393. package/dist/game/core/fixedTimestep.js.map +0 -1
  394. package/dist/game/core/index.d.ts +0 -9
  395. package/dist/game/core/index.d.ts.map +0 -1
  396. package/dist/game/core/index.js +0 -8
  397. package/dist/game/core/index.js.map +0 -1
  398. package/dist/game/core/inputCollector.d.ts +0 -82
  399. package/dist/game/core/inputCollector.d.ts.map +0 -1
  400. package/dist/game/core/inputCollector.js +0 -176
  401. package/dist/game/core/inputCollector.js.map +0 -1
  402. package/dist/game/core/resizeCanvas.d.ts +0 -19
  403. package/dist/game/core/resizeCanvas.d.ts.map +0 -1
  404. package/dist/game/core/resizeCanvas.js +0 -29
  405. package/dist/game/core/resizeCanvas.js.map +0 -1
  406. package/dist/game/react/index.d.ts +0 -3
  407. package/dist/game/react/index.d.ts.map +0 -1
  408. package/dist/game/react/index.js +0 -5
  409. package/dist/game/react/index.js.map +0 -1
  410. package/dist/game/react/useGameEngine.d.ts +0 -64
  411. package/dist/game/react/useGameEngine.d.ts.map +0 -1
  412. package/dist/game/react/useGameEngine.js +0 -78
  413. package/dist/game/react/useGameEngine.js.map +0 -1
  414. package/dist/react/canvas/CanvasNavHUD.d.ts +0 -64
  415. package/dist/react/canvas/CanvasNavHUD.d.ts.map +0 -1
  416. package/dist/react/canvas/CanvasNavHUD.js +0 -58
  417. package/dist/react/canvas/CanvasNavHUD.js.map +0 -1
  418. package/dist/react/canvas/fitLabel.d.ts +0 -53
  419. package/dist/react/canvas/fitLabel.d.ts.map +0 -1
  420. package/dist/react/canvas/fitLabel.js +0 -104
  421. package/dist/react/canvas/fitLabel.js.map +0 -1
  422. package/dist/react/canvas/index.d.ts +0 -4
  423. package/dist/react/canvas/index.d.ts.map +0 -1
  424. package/dist/react/canvas/index.js +0 -4
  425. package/dist/react/canvas/index.js.map +0 -1
  426. package/dist/react/canvas/lod.d.ts +0 -40
  427. package/dist/react/canvas/lod.d.ts.map +0 -1
  428. package/dist/react/canvas/lod.js +0 -37
  429. package/dist/react/canvas/lod.js.map +0 -1
  430. package/dist/react/components/DataTable/FilterBuilder.d.ts +0 -38
  431. package/dist/react/components/DataTable/FilterBuilder.d.ts.map +0 -1
  432. package/dist/react/components/DataTable/FilterBuilder.js.map +0 -1
  433. package/dist/react/seo/HeadProvider.d.ts +0 -14
  434. package/dist/react/seo/HeadProvider.d.ts.map +0 -1
  435. package/dist/react/seo/HeadProvider.js +0 -44
  436. package/dist/react/seo/HeadProvider.js.map +0 -1
  437. package/dist/react/seo/applyHeadToDocument.d.ts +0 -3
  438. package/dist/react/seo/applyHeadToDocument.d.ts.map +0 -1
  439. package/dist/react/seo/applyHeadToDocument.js +0 -66
  440. package/dist/react/seo/applyHeadToDocument.js.map +0 -1
  441. package/dist/react/seo/index.d.ts +0 -3
  442. package/dist/react/seo/index.d.ts.map +0 -1
  443. package/dist/react/seo/index.js +0 -7
  444. package/dist/react/seo/index.js.map +0 -1
  445. package/dist/react/timeline/ClipView.d.ts +0 -29
  446. package/dist/react/timeline/ClipView.d.ts.map +0 -1
  447. package/dist/react/timeline/ClipView.js +0 -53
  448. package/dist/react/timeline/ClipView.js.map +0 -1
  449. package/dist/react/timeline/Playhead.d.ts +0 -16
  450. package/dist/react/timeline/Playhead.d.ts.map +0 -1
  451. package/dist/react/timeline/Playhead.js +0 -26
  452. package/dist/react/timeline/Playhead.js.map +0 -1
  453. package/dist/react/timeline/TimeRuler.d.ts +0 -21
  454. package/dist/react/timeline/TimeRuler.d.ts.map +0 -1
  455. package/dist/react/timeline/TimeRuler.js +0 -31
  456. package/dist/react/timeline/TimeRuler.js.map +0 -1
  457. package/dist/react/timeline/TimelineSurface.d.ts +0 -29
  458. package/dist/react/timeline/TimelineSurface.d.ts.map +0 -1
  459. package/dist/react/timeline/TimelineSurface.js +0 -56
  460. package/dist/react/timeline/TimelineSurface.js.map +0 -1
  461. package/dist/react/timeline/TrackLane.d.ts +0 -31
  462. package/dist/react/timeline/TrackLane.d.ts.map +0 -1
  463. package/dist/react/timeline/TrackLane.js +0 -32
  464. package/dist/react/timeline/TrackLane.js.map +0 -1
  465. package/dist/react/timeline/index.d.ts +0 -6
  466. package/dist/react/timeline/index.d.ts.map +0 -1
  467. package/dist/react/timeline/index.js +0 -12
  468. package/dist/react/timeline/index.js.map +0 -1
  469. package/dist/server/private-media/index.d.ts +0 -7
  470. package/dist/server/private-media/index.d.ts.map +0 -1
  471. package/dist/server/private-media/index.js +0 -13
  472. package/dist/server/private-media/index.js.map +0 -1
  473. package/dist/server/seo/index.d.ts +0 -3
  474. package/dist/server/seo/index.d.ts.map +0 -1
  475. package/dist/server/seo/index.js +0 -6
  476. package/dist/server/seo/index.js.map +0 -1
  477. package/dist/server/seo/mountSeoRoutes.d.ts +0 -9
  478. package/dist/server/seo/mountSeoRoutes.d.ts.map +0 -1
  479. package/dist/server/seo/mountSeoRoutes.js +0 -19
  480. package/dist/server/seo/mountSeoRoutes.js.map +0 -1
  481. package/dist/server/seo/serveHeadInjectedIndex.d.ts +0 -9
  482. package/dist/server/seo/serveHeadInjectedIndex.d.ts.map +0 -1
  483. package/dist/server/seo/serveHeadInjectedIndex.js +0 -20
  484. package/dist/server/seo/serveHeadInjectedIndex.js.map +0 -1
  485. package/dist/upload.d.ts +0 -148
  486. package/dist/upload.d.ts.map +0 -1
  487. package/dist/upload.js +0 -159
  488. package/dist/upload.js.map +0 -1
  489. package/dist/verify/runtime/index.d.ts +0 -16
  490. package/dist/verify/runtime/index.d.ts.map +0 -1
  491. package/dist/verify/runtime/index.js +0 -16
  492. package/dist/verify/runtime/index.js.map +0 -1
  493. package/scripts/demoCheck.ts +0 -42
  494. package/src/core/duplicates/index.spec.ts +0 -116
  495. package/src/core/duplicates/index.ts +0 -203
  496. package/src/core/namespace/helpers.ts +0 -31
  497. package/src/core/namespace/index.ts +0 -12
  498. package/src/core/namespace/memoryStore.ts +0 -77
  499. package/src/core/namespace/namespace.spec.ts +0 -117
  500. package/src/core/namespace/types.ts +0 -53
  501. package/src/game/core/DisposeRegistry.spec.ts +0 -53
  502. package/src/game/core/DisposeRegistry.ts +0 -70
  503. package/src/game/core/drawBudget.spec.ts +0 -51
  504. package/src/game/core/drawBudget.ts +0 -75
  505. package/src/game/core/fixedTimestep.spec.ts +0 -91
  506. package/src/game/core/fixedTimestep.ts +0 -79
  507. package/src/game/core/index.ts +0 -16
  508. package/src/game/core/inputCollector.spec.ts +0 -29
  509. package/src/game/core/inputCollector.ts +0 -245
  510. package/src/game/core/resizeCanvas.ts +0 -31
  511. package/src/game/react/index.ts +0 -10
  512. package/src/game/react/useGameEngine.ts +0 -125
  513. package/src/react/canvas/CanvasNavHUD.spec.tsx +0 -62
  514. package/src/react/canvas/CanvasNavHUD.tsx +0 -210
  515. package/src/react/canvas/fitLabel.spec.ts +0 -82
  516. package/src/react/canvas/fitLabel.ts +0 -150
  517. package/src/react/canvas/index.ts +0 -15
  518. package/src/react/canvas/lod.ts +0 -53
  519. package/src/react/seo/HeadProvider.tsx +0 -67
  520. package/src/react/seo/applyHeadToDocument.ts +0 -73
  521. package/src/react/seo/index.ts +0 -12
  522. package/src/react/seo/seo.spec.tsx +0 -101
  523. package/src/react/timeline/ClipView.tsx +0 -146
  524. package/src/react/timeline/Playhead.tsx +0 -63
  525. package/src/react/timeline/TimeRuler.tsx +0 -85
  526. package/src/react/timeline/TimelineSurface.tsx +0 -157
  527. package/src/react/timeline/TrackLane.tsx +0 -87
  528. package/src/react/timeline/index.ts +0 -12
  529. package/src/react/timeline/timeline.spec.tsx +0 -175
  530. package/src/server/private-media/index.ts +0 -45
  531. package/src/server/seo/index.ts +0 -8
  532. package/src/server/seo/mountSeoRoutes.ts +0 -37
  533. package/src/server/seo/seo.spec.ts +0 -128
  534. package/src/server/seo/serveHeadInjectedIndex.ts +0 -36
  535. package/src/upload.spec.ts +0 -300
  536. package/src/upload.ts +0 -288
  537. package/src/verify/runtime/index.ts +0 -64
@@ -2,6 +2,7 @@ import type { Column } from '@tanstack/react-table';
2
2
  import { ArrowDown, ArrowUp, ArrowUpDown } from 'lucide-react';
3
3
  import type { ReactNode } from 'react';
4
4
  import { Tooltip } from '../Tooltip';
5
+ import { TAP_TARGET_HEIGHT } from '../../lib/tapTarget';
5
6
 
6
7
  /**
7
8
  * The full label, one hover away — and it is OURS, not the browser's.
@@ -84,7 +85,7 @@ export function SortHeader<TRow>({
84
85
  // computed styles on orch's Fleet tab, 2026-08-12: `th` uppercase,
85
86
  // `button` none. Letter-spacing does inherit (0.55px on both), so only
86
87
  // the case needs restating.
87
- className='-mx-1 -my-2.5 inline-flex max-w-full items-center gap-1 rounded px-1 py-2.5 uppercase transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11'
88
+ className={`-mx-1 -my-2.5 inline-flex max-w-full items-center gap-1 rounded px-1 py-2.5 uppercase transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ${TAP_TARGET_HEIGHT}`}
88
89
  >
89
90
  {/* min-w-0 so the label is what gives way in a narrow track — the sort
90
91
  arrow is the affordance and must survive at any width. */}
@@ -18,13 +18,13 @@ import {
18
18
  VALUELESS_OPS,
19
19
  } from './filterQuery';
20
20
 
21
- export interface FilterBuilderColumn {
21
+ export interface TableFilterBuilderColumn {
22
22
  key: string;
23
23
  label: string;
24
24
  }
25
25
 
26
- export interface FilterBuilderProps {
27
- columns: FilterBuilderColumn[];
26
+ export interface TableFilterBuilderProps {
27
+ columns: TableFilterBuilderColumn[];
28
28
  value: FilterQuery;
29
29
  onChange: (next: FilterQuery) => void;
30
30
  className?: string;
@@ -36,7 +36,30 @@ const OP_OPTIONS = (Object.keys(FILTER_OP_LABELS) as FilterOp[]).map((op) => ({
36
36
  }));
37
37
 
38
38
  /**
39
- * The filter builder — `(A and B) or (C and D)`, and the UX is the hard half.
39
+ * The TABLE's filter builder — `(A and B) or (C and D)`, and the UX is the hard half.
40
+ *
41
+ * ── 🔴 Why the name carries `Table`, 2026-09-13 ─────────────────────────────
42
+ * It was `FilterBuilder`, and `cursedesk` has a `FilterBuilder` of its own. The
43
+ * graduation pass that looked at the pair to decide which one should live here
44
+ * found they are not two copies of one component — they are two different
45
+ * components wearing one basename, which is the trap that makes the next person
46
+ * merge them wrongly:
47
+ *
48
+ * - **This one is a VIEW filter.** Two levels by construction (groups OR'd,
49
+ * conditions AND'd inside one), values are strings, columns are `{key,label}`
50
+ * with no type, and it narrows rows already on screen behind a popover on the
51
+ * `DataTable` toolbar. Nothing it builds crosses a wire.
52
+ * - **`cursedesk`'s is a QUERY builder** — an arbitrarily-nested AND/OR/NOT
53
+ * tree with per-type operator sets (`between`, `matches`, `in`, `isEmpty`),
54
+ * range and set editors, `caseSensitive` per rule and a validator, editing
55
+ * the exact `FilterNode` its API consumes so what is built is what the server
56
+ * filters and exports by.
57
+ *
58
+ * Neither is the other generalised. Collapsing them would mean either giving a
59
+ * table toolbar a regex field and a three-deep nesting rule, or taking typed
60
+ * operators away from a filter the server evaluates — so they stay two, and
61
+ * this one says which it is. See {@link FilterQuery} for the shape it edits;
62
+ * the name of the thing it is NOT is `cursedesk`'s `ui/workbench/FilterBuilder`.
40
63
  *
41
64
  * The owner's closing clause is the acceptance test, not a nicety: *"easy enough
42
65
  * that I don't give up on trying it."* So every decision here is made against
@@ -60,7 +83,12 @@ const OP_OPTIONS = (Object.keys(FILTER_OP_LABELS) as FilterOp[]).map((op) => ({
60
83
  * The trigger carries the live count so the toolbar says how many constraints
61
84
  * are on without opening anything (DESIGN.md §2 — one line, state legible on it).
62
85
  */
63
- export function FilterBuilder({ columns, value, onChange, className }: FilterBuilderProps) {
86
+ export function TableFilterBuilder({
87
+ columns,
88
+ value,
89
+ onChange,
90
+ className,
91
+ }: TableFilterBuilderProps) {
64
92
  const [open, setOpen] = useState(false);
65
93
  const activeCount = countActiveConditions(value);
66
94
  const firstColumn = columns[0]?.key ?? '';
@@ -3,9 +3,9 @@ import { Download, Plus, Upload } from 'lucide-react';
3
3
  import type { ReactNode } from 'react';
4
4
  import { Button } from '../Button';
5
5
  import { Cluster, Split } from '../layout';
6
- import { FilterBuilder } from './FilterBuilder';
7
6
  import { SearchBox } from './SearchBox';
8
7
  import { SortStack } from './SortStack';
8
+ import { TableFilterBuilder } from './TableFilterBuilder';
9
9
  import { TableViewToggle } from './TableViewToggle';
10
10
  import { ViewOptionsMenu } from './ViewOptionsMenu';
11
11
 
@@ -34,7 +34,7 @@ export interface TableToolbarProps<TRow> {
34
34
  * left/centre, actions far right, never a second row.
35
35
  *
36
36
  * What sits on it, left to right: the search box with its use-time scope control
37
- * ({@link SearchBox}), the filter builder ({@link FilterBuilder}), the sort stack
37
+ * ({@link SearchBox}), the filter builder ({@link TableFilterBuilder}), the sort stack
38
38
  * ({@link SortStack}), anything the caller adds, then — right-aligned — the
39
39
  * rows ⇄ cards toggle, the column menu, and import/export/add.
40
40
  *
@@ -88,7 +88,7 @@ export function TableToolbar<TRow>({
88
88
  />
89
89
  ) : null}
90
90
  {enableFilterBuilder && controls ? (
91
- <FilterBuilder
91
+ <TableFilterBuilder
92
92
  columns={controls.filterColumns}
93
93
  value={controls.filterQuery}
94
94
  onChange={controls.setFilterQuery}
@@ -1,5 +1,6 @@
1
1
  import type { JSX } from 'react';
2
2
  import { ExternalLink } from '../../ExternalLink';
3
+ import { TAP_TARGET_HEIGHT } from '../../../lib/tapTarget';
3
4
 
4
5
  export interface LinkCellProps {
5
6
  href: string;
@@ -24,7 +25,7 @@ export function LinkCell({ href, label }: LinkCellProps): JSX.Element | null {
24
25
  url={href}
25
26
  {...(label === undefined ? {} : { display: label })}
26
27
  stopPropagation
27
- className='max-w-[180px] truncate font-sans not-italic pointer-coarse:min-h-11'
28
+ className={`max-w-[180px] truncate font-sans not-italic ${TAP_TARGET_HEIGHT}`}
28
29
  />
29
30
  );
30
31
  }
@@ -18,7 +18,14 @@ export {
18
18
  type DataTableProps,
19
19
  nextSortStack,
20
20
  } from './DataTable';
21
- export { FilterBuilder, type FilterBuilderColumn, type FilterBuilderProps } from './FilterBuilder';
21
+ // 🔴 `TableFilterBuilder`, not `FilterBuilder` — see its header. The bare name belonged to
22
+ // two different components in two repos, and a shared basename that is not a shared
23
+ // component is how the next person merges them wrongly.
24
+ export {
25
+ TableFilterBuilder,
26
+ type TableFilterBuilderColumn,
27
+ type TableFilterBuilderProps,
28
+ } from './TableFilterBuilder';
22
29
  export {
23
30
  activeGroups,
24
31
  compareValues,
@@ -3,6 +3,7 @@ import { DragHandleIcon } from '../hooks/DragHandleIcon';
3
3
  import { cn } from '../lib/cn';
4
4
  import { REVEAL_ON_HOVER } from './revealOnHover';
5
5
  import { Tooltip } from './Tooltip';
6
+ import { TAP_TARGET } from '../lib/tapTarget';
6
7
 
7
8
  export interface DragHandleProps {
8
9
  /** Spread from a drag hook's `handleProps` — the pointer/keyboard drag wiring. */
@@ -35,7 +36,7 @@ export function DragHandle({
35
36
  {...handleProps}
36
37
  aria-label={label}
37
38
  className={cn(
38
- 'flex w-6 shrink-0 items-center justify-center self-stretch text-muted-foreground/60 pointer-coarse:min-h-11 pointer-coarse:min-w-11',
39
+ `flex w-6 shrink-0 items-center justify-center self-stretch text-muted-foreground/60 ${TAP_TARGET}`,
39
40
  alwaysVisible ? 'transition' : REVEAL_ON_HOVER,
40
41
  className,
41
42
  )}
@@ -1,6 +1,7 @@
1
1
  import { useState } from 'react';
2
2
  import { EmojiPicker } from '../emoji/EmojiPicker';
3
3
  import { cn } from '../lib/cn';
4
+ import { TAP_TARGET } from '../lib/tapTarget';
4
5
 
5
6
  export interface EmojiFieldProps {
6
7
  /** The current emoji (a single grapheme), or '' for none. */
@@ -46,7 +47,7 @@ export function EmojiField({
46
47
  aria-describedby={ariaDescribedBy}
47
48
  aria-label={value ? `Emoji: ${value}` : 'Pick an emoji'}
48
49
  className={cn(
49
- 'inline-flex size-10 items-center justify-center rounded-field border border-field-border bg-field-bg text-xl transition hover:border-field-ring focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-field-ring/30 disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:min-h-11 pointer-coarse:min-w-11',
50
+ `inline-flex size-10 items-center justify-center rounded-field border border-field-border bg-field-bg text-xl transition hover:border-field-ring focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-field-ring/30 disabled:cursor-not-allowed disabled:opacity-50 ${TAP_TARGET}`,
50
51
  className,
51
52
  )}
52
53
  >
@@ -43,8 +43,9 @@ const TONE_MARKER: Record<EventTimelineTone, { icon: ReactNode; className: strin
43
43
  * consistently indented body. Subtle dividers separate events; the axis line
44
44
  * connects markers so the sequence reads as one story.
45
45
  *
46
- * Not the media `timeline/` surface (`TimelineSurface` — a time-scaled editing
47
- * canvas); this is the presentational history list.
46
+ * This is the presentational history list. (It used to need distinguishing from a
47
+ * time-scaled editing canvas in `react/timeline`; that went with the unreferenced
48
+ * subpaths on 2026-09-13, so `EventTimeline` is now the only timeline here.)
48
49
  */
49
50
  export function EventTimeline({ items, className }: EventTimelineProps) {
50
51
  return (
@@ -4,7 +4,7 @@ import { FileLocation } from './FileLocation';
4
4
 
5
5
  afterEach(cleanup);
6
6
 
7
- const PATH = '/Users/me/.aliasManager/aliases.sh';
7
+ const PATH = '/srv/demo-app/.aliasManager/aliases.sh';
8
8
 
9
9
  describe('FileLocation', () => {
10
10
  test('shows the path and the default "Saved in" label', () => {
@@ -30,7 +30,7 @@ export interface IconButtonProps extends Omit<ButtonProps, 'size' | 'leftIcon' |
30
30
 
31
31
  /**
32
32
  * Icon-only button: a {@link Button} locked to a square `icon*` size (≥44px touch
33
- * target on coarse pointers via Button's `pointer-coarse:min-h-11` baseline,
33
+ * target on coarse pointers via Button's `TAP_TARGET_HEIGHT` baseline,
34
34
  * regardless of `size`) with a mandatory `aria-label`. Defaults to the `ghost`
35
35
  * variant — the right weight for toolbars/row actions. Slightly larger glyphs
36
36
  * (`size-5`) than a text button's, since the icon carries the whole meaning.
@@ -17,6 +17,7 @@ import { type ReactNode, useState } from 'react';
17
17
  import { useHasHover } from '../hooks/useHasHover';
18
18
  import { cn } from '../lib/cn';
19
19
  import { HOVER_HINT_DELAY_MS } from '../lib/hoverIntent';
20
+ import { TAP_TARGET } from '../lib/tapTarget';
20
21
 
21
22
  export interface InfoHintProps {
22
23
  /** The help body. */
@@ -90,10 +91,10 @@ export function InfoHint({
90
91
  ref={refs.setReference}
91
92
  aria-label={label}
92
93
  className={cn(
93
- // ≥44px touch target on coarse pointers (same floor as Button/IconButton's
94
- // `pointer-coarse:min-h-11`/`min-w-11` — a bare `size-4` icon glyph with no
95
- // padding measured 16×16px on mobile, cc/197).
96
- 'inline-flex items-center justify-center text-muted-foreground hover:text-accent pointer-coarse:min-h-11 pointer-coarse:min-w-11',
94
+ // ≥44px touch target on coarse pointers (the same `TAP_TARGET` floor
95
+ // Button/IconButton carry — a bare `size-4` icon glyph with no padding
96
+ // measured 16×16px on mobile, cc/197).
97
+ `inline-flex items-center justify-center text-muted-foreground hover:text-accent ${TAP_TARGET}`,
97
98
  className,
98
99
  )}
99
100
  {...getReferenceProps()}
@@ -135,7 +135,7 @@ export function InheritBadge({
135
135
  label={resetLabel}
136
136
  disabled={disabled}
137
137
  onClick={onReset}
138
- // Glyph only is shrunk, never the BOX: Button's `pointer-coarse:min-h-11`
138
+ // Glyph only is shrunk, never the BOX: Button's `TAP_TARGET_HEIGHT`
139
139
  // is what keeps this a real touch target, and forcing a size-5 square
140
140
  // would quietly delete that on every phone.
141
141
  className={cn('[&_svg]:size-3.5', REVEAL_ON_HOVER)}
@@ -5,6 +5,7 @@ import { AutoGrowTextarea } from './AutoGrowTextarea';
5
5
  import { IconButton } from './IconButton';
6
6
  import { Input } from './Input';
7
7
  import { Tooltip } from './Tooltip';
8
+ import { TAP_TARGET_HEIGHT } from '../lib/tapTarget';
8
9
 
9
10
  export interface InlineEditableTextProps {
10
11
  value: string;
@@ -184,7 +185,7 @@ export function InlineEditableText({
184
185
  // measuring gate (and any tool that reasons about layout) still sees 24px.
185
186
  // `DESIGN.md` §5's footprint is the floor and UX_STANDARDS §0 records that it
186
187
  // wins over the band — so the box grows too, and the band stays as the extra.
187
- 'pointer-coarse:min-h-11',
188
+ TAP_TARGET_HEIGHT,
188
189
  'pointer-coarse:before:absolute pointer-coarse:before:top-[-10px] pointer-coarse:before:bottom-[-10px] pointer-coarse:before:left-[-4px] pointer-coarse:before:right-[-4px] pointer-coarse:before:content-[""]',
189
190
  wrap ? 'whitespace-pre-wrap break-words' : 'block w-full truncate',
190
191
  !value && 'italic text-muted-foreground',
@@ -2,6 +2,7 @@ import type { KeyboardEvent, ReactNode } from 'react';
2
2
  import { cn } from '../lib/cn';
3
3
  import { Surface } from './Surface';
4
4
  import type { StatTileTone } from './StatTile';
5
+ import { TAP_TARGET_ALWAYS } from '../lib/tapTarget';
5
6
 
6
7
  const TONE_DOT: Record<StatTileTone, string> = {
7
8
  success: 'bg-success',
@@ -111,7 +112,7 @@ export function MeterList({ items, flat = false, labelWidth = 'default', classNa
111
112
  ) : null}
112
113
  <span className='truncate'>{item.label}</span>
113
114
  {item.actionHint ? (
114
- <span className='text-caption font-medium text-muted-foreground opacity-0 transition-opacity group-hover/meter:opacity-100 group-focus-visible/meter:opacity-100 pointer-coarse:opacity-100'>
115
+ <span className={`text-caption font-medium text-muted-foreground opacity-0 transition-opacity group-hover/meter:opacity-100 group-focus-visible/meter:opacity-100 ${TAP_TARGET_ALWAYS}`}>
115
116
  {item.actionHint}
116
117
  </span>
117
118
  ) : null}
@@ -6,6 +6,7 @@ import { CopyButton } from './CopyButton';
6
6
  import { type FileManagerKind, REVEAL_LABEL } from './FileLocation';
7
7
  import { IconButton } from './IconButton';
8
8
  import { Tooltip } from './Tooltip';
9
+ import { TAP_TARGET_ALWAYS } from '../lib/tapTarget';
9
10
 
10
11
  export interface PathTextProps {
11
12
  /** The full path (file path, module id, URL path). Never pre-truncate it. */
@@ -32,8 +33,8 @@ export interface PathTextProps {
32
33
  * lives". `PathText` is the INLINE form — a chip inside a fact row, a table cell, a
33
34
  * sentence — and it is where most paths in a control plane actually appear. The
34
35
  * owner reported the gap from the inline side (station, 2026-08-15): *"I see Repo
35
- * /Users/curt/… but I want icons to open finder there and open vscode there because
36
- * it is a path"*. That app answered it by hand-rolling a second component; the
36
+ * ~/… but I want icons to open finder there and open vscode there because it is a
37
+ * path"*. That app answered it by hand-rolling a second component; the
37
38
  * answer belongs on the primitive, so every app's inline paths get the same doors.
38
39
  */
39
40
  onReveal?: (path: string) => void;
@@ -135,7 +136,7 @@ export function PathText({
135
136
  confirmToast={false}
136
137
  stopPropagation
137
138
  iconSize={12}
138
- className='opacity-0 transition-opacity focus-visible:opacity-100 group-hover/path:opacity-100 pointer-coarse:opacity-100'
139
+ className={`opacity-0 transition-opacity focus-visible:opacity-100 group-hover/path:opacity-100 ${TAP_TARGET_ALWAYS}`}
139
140
  />
140
141
  )}
141
142
  </span>
@@ -1,6 +1,7 @@
1
1
  import { Star } from 'lucide-react';
2
2
  import type { KeyboardEvent } from 'react';
3
3
  import { cn } from '../lib/cn';
4
+ import { TAP_TARGET } from '../lib/tapTarget';
4
5
 
5
6
  export interface RatingFieldProps {
6
7
  /** The current rating (0 = unrated). */
@@ -72,7 +73,7 @@ export function RatingField({
72
73
  'inline-flex items-center justify-center rounded p-1 transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-field-ring/40 disabled:cursor-not-allowed',
73
74
  // DESIGN.md §5: a 28px star is a miss on a phone, and the neighbouring
74
75
  // star is a different rating.
75
- 'pointer-coarse:min-h-11 pointer-coarse:min-w-11',
76
+ TAP_TARGET,
76
77
  filled ? 'text-warning' : 'text-muted-foreground hover:text-warning',
77
78
  )}
78
79
  >
@@ -3,6 +3,7 @@ import { useCopyToClipboard } from '../hooks/useCopyToClipboard';
3
3
  import { CONTROL_HEIGHT_CLASS, type ControlSize } from '../lib/field';
4
4
  import { resolveClass, resolveStyle, type StyleableProps } from '../styling';
5
5
  import { IconButton } from './IconButton';
6
+ import { TAP_TARGET, TAP_TARGET_HEIGHT } from '../lib/tapTarget';
6
7
 
7
8
  // Tiny self-contained icons so the component carries no icon dependency.
8
9
  const Eye = () => (
@@ -63,8 +64,7 @@ const Check = () => (
63
64
 
64
65
  // Token-driven (unit 11) — --muted-foreground/--foreground/--muted already carry
65
66
  // light and dark, so the five palette classes and their dark: twins are one set now.
66
- const BTN_CLASS =
67
- 'h-auto min-h-0 w-auto inline-flex shrink-0 items-center justify-center rounded p-1 text-muted-foreground transition hover:text-foreground hover:bg-muted pointer-coarse:min-h-11 pointer-coarse:min-w-11';
67
+ const BTN_CLASS = `h-auto min-h-0 w-auto inline-flex shrink-0 items-center justify-center rounded p-1 text-muted-foreground transition hover:text-foreground hover:bg-muted ${TAP_TARGET}`;
68
68
 
69
69
  export type SecretInputSlot = 'root' | 'input' | 'button';
70
70
 
@@ -184,7 +184,7 @@ export const SecretInput = ({
184
184
  return (
185
185
  <div
186
186
  className={resolveClass(
187
- `flex items-center gap-0.5 ${CONTROL_HEIGHT_CLASS[size]} pointer-coarse:min-h-11 rounded-field border border-field-border bg-field-bg px-1 transition focus-within:border-field-ring focus-within:ring-2 focus-within:ring-field-ring/30 has-[[aria-invalid=true]]:border-field-error`,
187
+ `flex items-center gap-0.5 ${CONTROL_HEIGHT_CLASS[size]} ${TAP_TARGET_HEIGHT} rounded-field border border-field-border bg-field-bg px-1 transition focus-within:border-field-ring focus-within:ring-2 focus-within:ring-field-ring/30 has-[[aria-invalid=true]]:border-field-error`,
188
188
  classNames?.root ?? className,
189
189
  unstyled,
190
190
  )}
@@ -3,6 +3,7 @@ import type { ReactNode } from 'react';
3
3
  import { cn } from '../lib/cn';
4
4
  import { CONTROL_HEIGHT_CLASS, type ControlSize } from '../lib/field';
5
5
  import { Tooltip } from './Tooltip';
6
+ import { TAP_TARGET } from '../lib/tapTarget';
6
7
 
7
8
  export interface SegmentOption<T extends string> {
8
9
  value: T;
@@ -75,13 +76,12 @@ export function SegmentedControl<T extends string>({
75
76
  data-testid={opt['data-testid']}
76
77
  className={cn(
77
78
  'inline-flex shrink-0 items-center justify-center whitespace-nowrap rounded-[calc(var(--radius-md)-0.25rem)] px-3 text-sm font-medium transition-colors',
78
- 'pointer-coarse:min-h-11',
79
79
  CONTROL_HEIGHT_CLASS[size],
80
80
  'text-muted-foreground hover:text-foreground',
81
81
  'data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-raised',
82
82
  'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
83
83
  'disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:text-muted-foreground',
84
- 'pointer-coarse:min-h-11 pointer-coarse:min-w-11',
84
+ TAP_TARGET,
85
85
  capitalize && 'capitalize',
86
86
  )}
87
87
  >
@@ -1,6 +1,7 @@
1
1
  import { afterEach, describe, expect, mock, test } from 'bun:test';
2
2
  import { cleanup, fireEvent, render } from '@testing-library/react';
3
3
  import { StarRating } from './StarRating';
4
+ import { TAP_TARGET } from '../lib/tapTarget';
4
5
 
5
6
  afterEach(cleanup);
6
7
 
@@ -80,8 +81,7 @@ describe('StarRating — whole steps render real buttons', () => {
80
81
  const { getAllByRole } = render(<StarRating value={0} onChange={() => {}} size='sm' />);
81
82
  for (const button of getAllByRole('button')) {
82
83
  const cls = button.getAttribute('class') ?? '';
83
- expect(cls).toContain('pointer-coarse:min-h-11');
84
- expect(cls).toContain('pointer-coarse:min-w-11');
84
+ for (const utility of TAP_TARGET.split(' ')) expect(cls).toContain(utility);
85
85
  }
86
86
  });
87
87
 
@@ -1,6 +1,7 @@
1
1
  import { useId, useRef, useState } from 'react';
2
2
  import { cn } from '../lib/cn';
3
3
  import { Tooltip } from './Tooltip';
4
+ import { TAP_TARGET, TAP_TARGET_HEIGHT } from '../lib/tapTarget';
4
5
 
5
6
  /**
6
7
  * The fleet's one star rating.
@@ -161,12 +162,15 @@ export function StarRating({
161
162
  key={i}
162
163
  // guardrails-ignore no-raw-action-button: a star is a GLYPH, not a chrome control — Button/IconButton bring a border, a background, a hover fill and a locked `icon*` size, and five of those in a table cell is a toolbar where a rating should be. This IS the rating primitive; what the rule protects (the ≥44px coarse-pointer target, the visible focus ring, `type='button'`) is carried here explicitly and pinned by StarRating.spec.tsx.
163
164
  type='button'
164
- // ≥44px on a coarse pointer without growing the PAINTED star — the
165
- // same trick Checkbox uses. A 20px star with a 44px target is the
166
- // whole reason music could stop hiding its rating on a phone.
165
+ // ≥44px on a coarse pointer without growing the PAINTED star: this
166
+ // button has no background of its own, so the floor can sit on it
167
+ // directly. (Checkbox cannot do that — its control IS the painted
168
+ // box, so its floor lives on the `<label>` around it instead.) A
169
+ // 20px star with a 44px target is the whole reason music could stop
170
+ // hiding its rating on a phone.
167
171
  className={cn(
168
172
  'inline-flex cursor-pointer items-center justify-center rounded-sm bg-transparent p-0',
169
- 'pointer-coarse:min-h-11 pointer-coarse:min-w-11',
173
+ TAP_TARGET,
170
174
  'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
171
175
  height,
172
176
  )}
@@ -228,7 +232,7 @@ export function StarRating({
228
232
  tabIndex={0}
229
233
  className={cn(
230
234
  'inline-flex w-fit cursor-pointer gap-0.5 outline-none',
231
- 'pointer-coarse:min-h-11 pointer-coarse:items-center',
235
+ `${TAP_TARGET_HEIGHT} pointer-coarse:items-center`,
232
236
  'focus-visible:ring-2 focus-visible:ring-ring',
233
237
  height,
234
238
  className,
@@ -5,6 +5,7 @@ import { ScrollArea } from './ScrollArea';
5
5
  import { Surface } from './Surface';
6
6
  import { Sparkline } from './Sparkline';
7
7
  import type { StatTileTone } from './StatTile';
8
+ import { TAP_TARGET_ALWAYS } from '../lib/tapTarget';
8
9
 
9
10
  const TONE_DOT: Record<StatTileTone, string> = {
10
11
  success: 'bg-success',
@@ -59,7 +60,7 @@ function ItemBody({ item, orientation }: { item: StatStripItem; orientation: 'ho
59
60
  <span
60
61
  className={cn(
61
62
  'ml-auto text-caption font-medium normal-case tracking-normal text-muted-foreground',
62
- 'opacity-0 transition-opacity group-hover/stat:opacity-100 group-focus-visible/stat:opacity-100 pointer-coarse:opacity-100',
63
+ `opacity-0 transition-opacity group-hover/stat:opacity-100 group-focus-visible/stat:opacity-100 ${TAP_TARGET_ALWAYS}`,
63
64
  )}
64
65
  >
65
66
  {item.actionHint}
@@ -5,6 +5,7 @@ import { CopyButton } from './CopyButton';
5
5
  import { Sparkline } from './Sparkline';
6
6
  import { TruncatedText } from './TruncatedText';
7
7
  import { Tooltip } from './Tooltip';
8
+ import { TAP_TARGET_ALWAYS } from '../lib/tapTarget';
8
9
 
9
10
  interface Progress {
10
11
  value: number;
@@ -117,8 +118,7 @@ const VALUE_SIZE = { sm: 'text-base', md: 'text-2xl', lg: 'text-3xl' } as const;
117
118
  * an unnamed group-hover would make all eight copy buttons appear at once the
118
119
  * moment the pointer entered the panel.
119
120
  */
120
- const REVEAL_ON_TILE_HOVER =
121
- 'opacity-0 transition-opacity group-hover/tile:opacity-100 focus-visible:opacity-100 pointer-coarse:opacity-100';
121
+ const REVEAL_ON_TILE_HOVER = `opacity-0 transition-opacity group-hover/tile:opacity-100 focus-visible:opacity-100 ${TAP_TARGET_ALWAYS}`;
122
122
 
123
123
  /** Color by SEMANTIC direction, never by the sign of the number. */
124
124
  const DELTA_CLASS = {
@@ -215,7 +215,7 @@ export function StatTile({
215
215
  {onPress && actionHint ? (
216
216
  <span
217
217
  aria-hidden
218
- className='text-caption font-medium text-muted-foreground opacity-0 transition-opacity group-hover/tile:opacity-100 group-focus-visible/tile:opacity-100 pointer-coarse:opacity-100'
218
+ className={`text-caption font-medium text-muted-foreground opacity-0 transition-opacity group-hover/tile:opacity-100 group-focus-visible/tile:opacity-100 ${TAP_TARGET_ALWAYS}`}
219
219
  >
220
220
  {actionHint}
221
221
  </span>
@@ -80,8 +80,9 @@ describe('Tabs', () => {
80
80
  // The pointer is removed rather than repaired because there is nothing to point AT.
81
81
  // What these class assertions can prove, they prove; that the rendered list actually
82
82
  // scrolls at a real viewport is UNPROVEN. Do not read the three tests below as more
83
- // than they are. Writing that browser proof is tracked in
84
- // /Users/curt/.app-managed/repos/fleet/owner/backlog/2026-09-10-csat-branch-drain.md.
83
+ // than they are. The backlog file that used to be named here as the place the browser
84
+ // proof was tracked belonged to a previous generation and no longer exists, so this
85
+ // says where the gap is rather than pretending somebody else is holding it.
85
86
  describe('fill', () => {
86
87
  test('default is a plain auto-height block — no layout opinions', () => {
87
88
  const { getByRole } = render(<Tabs items={ITEMS} />);
@@ -2,6 +2,7 @@ import * as RadixTabs from '@radix-ui/react-tabs';
2
2
  import type { JSX, ReactNode } from 'react';
3
3
  import { useCallback, useEffect, useRef, useState } from 'react';
4
4
  import { cn } from '../lib/cn';
5
+ import { TAP_TARGET } from '../lib/tapTarget';
5
6
 
6
7
  export interface TabItem<T extends string = string> {
7
8
  value: T;
@@ -156,7 +157,7 @@ export function Tabs<T extends string = string>({
156
157
  // an automated touch-target probe flags even though `min-h-11` already
157
158
  // satisfies the height floor (orch-host task-sources mobile scan measured
158
159
  // a "db" tab at 17×44px).
159
- 'pointer-coarse:min-h-11 pointer-coarse:min-w-11',
160
+ TAP_TARGET,
160
161
  // Active underline tab: accent underline + accent text + semibold — the
161
162
  // same accent-marks-the-active-view treatment as the sidebar nav, so the
162
163
  // selected tab is unmistakable at a glance (not just a hairline shift).
@@ -49,7 +49,8 @@ export interface TruncatedTextProps {
49
49
  *
50
50
  * It also answers `DESIGN.md` §5's "node labels must never truncate with harsh,
51
51
  * broken text string cuts" for the DOM case: the cut is still there, but the whole
52
- * string is one hover away instead of lost. {@link fitLabel} is the canvas/SVG half.
52
+ * string is one hover away instead of lost. (The canvas/SVG half of that answer lived
53
+ * in `react/canvas`, removed with the unreferenced subpaths on 2026-09-13.)
53
54
  *
54
55
  * ── The hint is conditional, and measured at MOUNT ───────────────────────────
55
56
  * A hover bubble that repeats a label you can already read in full is noise, so
@@ -1,6 +1,7 @@
1
1
  import { afterEach, describe, expect, test } from 'bun:test';
2
2
  import { cleanup, render, screen } from '@testing-library/react';
3
3
  import { MonthGrid } from './MonthGrid';
4
+ import { TAP_TARGET_ALWAYS } from '../../lib/tapTarget';
4
5
 
5
6
  afterEach(cleanup);
6
7
 
@@ -100,7 +101,7 @@ describe('MonthGrid', () => {
100
101
  // The keyboard path the component documents must survive the reveal.
101
102
  expect(wrapper?.className).toContain('group-focus-within:opacity-100');
102
103
  // A finger cannot hover.
103
- expect(wrapper?.className).toContain('pointer-coarse:opacity-100');
104
+ expect(wrapper?.className).toContain(TAP_TARGET_ALWAYS);
104
105
  });
105
106
 
106
107
  test("dayActionReveal='always' opts a grid out of the reveal", () => {
@@ -2,6 +2,7 @@ import type { WeekStart } from 'cwip/calendar';
2
2
  import { dayStartMs, monthMatrix, todayKey, WEEKDAY_LABELS } from 'cwip/calendar';
3
3
  import type { ReactNode } from 'react';
4
4
  import { cn } from '../../lib/cn';
5
+ import { TAP_TARGET_ALWAYS } from '../../lib/tapTarget';
5
6
 
6
7
  export interface MonthGridDay {
7
8
  /** Local day key ("YYYY-MM-DD") this cell represents. */
@@ -148,7 +149,7 @@ export function MonthGrid({
148
149
  // the keyboard path this grid documents keeps working. `pointer-
149
150
  // coarse` is a question about the input DEVICE — a finger cannot
150
151
  // hover, so on a touch screen the action is simply visible.
151
- 'opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 pointer-coarse:opacity-100',
152
+ `opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 ${TAP_TARGET_ALWAYS}`,
152
153
  )}
153
154
  >
154
155
  {action}
@@ -15,6 +15,7 @@ import { IconButton } from '../IconButton';
15
15
  import { EventChip } from './EventChip';
16
16
  import { filterOccurrences } from './occurrences';
17
17
  import type { CalendarEventBase, OccurrenceFilters } from './types';
18
+ import { TAP_TARGET_ALWAYS } from '../../lib/tapTarget';
18
19
 
19
20
  export interface WeekViewProps {
20
21
  /** Any date within the week to render. */
@@ -111,7 +112,7 @@ export function WeekView({
111
112
  'h-auto min-h-[44px] w-auto min-w-[44px] rounded p-1.5 text-muted-foreground',
112
113
  'opacity-0 transition-opacity hover:bg-muted hover:text-foreground',
113
114
  'focus:opacity-100 group-hover:opacity-100',
114
- 'pointer-coarse:opacity-100',
115
+ TAP_TARGET_ALWAYS,
115
116
  )}
116
117
  >
117
118
  <Plus className='h-3.5 w-3.5' />
@@ -1,3 +1,4 @@
1
+ import { TAP_TARGET_ALWAYS } from '../lib/tapTarget';
2
+
1
3
  /** Hide until the parent `.group` is hovered/focused; always shown on touch. */
2
- export const REVEAL_ON_HOVER =
3
- 'opacity-0 transition group-hover:opacity-100 focus-visible:opacity-100 pointer-coarse:opacity-100';
4
+ export const REVEAL_ON_HOVER = `opacity-0 transition group-hover:opacity-100 focus-visible:opacity-100 ${TAP_TARGET_ALWAYS}`;