@bettercms-ai/kit 1.0.0 → 2.0.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 (587) hide show
  1. package/README.md +33 -0
  2. package/dist/adapters/dock-values.d.ts +28 -0
  3. package/dist/adapters/dock-values.js +41 -0
  4. package/dist/adapters/dock-values.js.map +1 -0
  5. package/{adapters → dist/adapters}/icons.js +2 -2
  6. package/dist/adapters/icons.js.map +1 -0
  7. package/{adapters → dist/adapters}/lossy.d.ts +90 -31
  8. package/dist/adapters/lossy.js +414 -0
  9. package/dist/adapters/lossy.js.map +1 -0
  10. package/{adapters → dist/adapters}/prod-types.d.ts +82 -4
  11. package/{adapters → dist/adapters}/prod-types.js +71 -3
  12. package/dist/adapters/prod-types.js.map +1 -0
  13. package/{adapters → dist/adapters}/schema.d.ts +40 -1
  14. package/{adapters → dist/adapters}/schema.js +996 -179
  15. package/dist/adapters/schema.js.map +1 -0
  16. package/{adapters → dist/adapters}/values.d.ts +26 -5
  17. package/{adapters → dist/adapters}/values.js +87 -17
  18. package/dist/adapters/values.js.map +1 -0
  19. package/dist/brand/logo.js +96 -0
  20. package/dist/brand/logo.js.map +1 -0
  21. package/{context.d.ts → dist/context.d.ts} +92 -2
  22. package/{context.js → dist/context.js} +5 -2
  23. package/dist/context.js.map +1 -0
  24. package/{controls → dist/controls}/button.d.ts +19 -5
  25. package/{controls → dist/controls}/button.js +125 -54
  26. package/dist/controls/button.js.map +1 -0
  27. package/{controls → dist/controls}/c1.js +1 -1
  28. package/dist/controls/c1.js.map +1 -0
  29. package/{controls → dist/controls}/c2.js +1 -1
  30. package/dist/controls/c2.js.map +1 -0
  31. package/{controls → dist/controls}/choice.d.ts +7 -2
  32. package/{controls → dist/controls}/choice.js +71 -18
  33. package/dist/controls/choice.js.map +1 -0
  34. package/{controls → dist/controls}/code-register.js +1 -1
  35. package/dist/controls/code-register.js.map +1 -0
  36. package/{controls → dist/controls}/code.js +10 -9
  37. package/dist/controls/code.js.map +1 -0
  38. package/{controls → dist/controls}/color.js +8 -8
  39. package/dist/controls/color.js.map +1 -0
  40. package/{controls → dist/controls}/component-services.d.ts +42 -0
  41. package/dist/controls/component-services.js +7 -0
  42. package/dist/controls/component-services.js.map +1 -0
  43. package/{controls → dist/controls}/date-register.js +1 -1
  44. package/dist/controls/date-register.js.map +1 -0
  45. package/{controls → dist/controls}/date-zone.js +8 -2
  46. package/dist/controls/date-zone.js.map +1 -0
  47. package/{controls → dist/controls}/date.js +32 -24
  48. package/dist/controls/date.js.map +1 -0
  49. package/{controls → dist/controls}/form-picker-register.js +1 -1
  50. package/dist/controls/form-picker-register.js.map +1 -0
  51. package/{controls → dist/controls}/form-picker.js +11 -9
  52. package/dist/controls/form-picker.js.map +1 -0
  53. package/{controls → dist/controls}/icon-register.js +1 -1
  54. package/dist/controls/icon-register.js.map +1 -0
  55. package/{controls → dist/controls}/icon.d.ts +4 -2
  56. package/{controls → dist/controls}/icon.js +32 -27
  57. package/dist/controls/icon.js.map +1 -0
  58. package/{controls → dist/controls}/index.d.ts +1 -1
  59. package/{controls → dist/controls}/index.js +4 -3
  60. package/dist/controls/index.js.map +1 -0
  61. package/{controls → dist/controls}/json-register.js +1 -1
  62. package/dist/controls/json-register.js.map +1 -0
  63. package/{controls → dist/controls}/json.js +13 -3
  64. package/dist/controls/json.js.map +1 -0
  65. package/{controls → dist/controls}/link.js +6 -6
  66. package/dist/controls/link.js.map +1 -0
  67. package/{controls → dist/controls}/location-register.js +1 -1
  68. package/dist/controls/location-register.js.map +1 -0
  69. package/{controls → dist/controls}/location.js +64 -40
  70. package/dist/controls/location.js.map +1 -0
  71. package/{controls → dist/controls}/media-register.js +1 -1
  72. package/dist/controls/media-register.js.map +1 -0
  73. package/{controls → dist/controls}/media-services.d.ts +6 -0
  74. package/dist/controls/media-services.js +0 -0
  75. package/{controls → dist/controls}/media.d.ts +35 -4
  76. package/{controls → dist/controls}/media.js +491 -171
  77. package/dist/controls/media.js.map +1 -0
  78. package/{controls → dist/controls}/number.js +10 -9
  79. package/dist/controls/number.js.map +1 -0
  80. package/{controls → dist/controls}/reference-register.js +1 -1
  81. package/dist/controls/reference-register.js.map +1 -0
  82. package/{controls → dist/controls}/reference-services.d.ts +4 -0
  83. package/dist/controls/reference-services.js +0 -0
  84. package/{controls → dist/controls}/reference.d.ts +1 -1
  85. package/{controls → dist/controls}/reference.js +93 -77
  86. package/dist/controls/reference.js.map +1 -0
  87. package/dist/controls/rich-text/blocks.d.ts +49 -0
  88. package/{controls → dist/controls}/rich-text/blocks.js +471 -144
  89. package/dist/controls/rich-text/blocks.js.map +1 -0
  90. package/{controls → dist/controls}/rich-text/catalog.d.ts +4 -1
  91. package/{controls → dist/controls}/rich-text/catalog.js +75 -65
  92. package/dist/controls/rich-text/catalog.js.map +1 -0
  93. package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
  94. package/{controls → dist/controls}/rich-text/codec.js +3 -1
  95. package/dist/controls/rich-text/codec.js.map +1 -0
  96. package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
  97. package/{controls → dist/controls}/rich-text/component-card.js +417 -99
  98. package/dist/controls/rich-text/component-card.js.map +1 -0
  99. package/dist/controls/rich-text/component-panel.d.ts +47 -0
  100. package/dist/controls/rich-text/component-panel.js +141 -0
  101. package/dist/controls/rich-text/component-panel.js.map +1 -0
  102. package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
  103. package/{controls → dist/controls}/rich-text/control.js +84 -42
  104. package/dist/controls/rich-text/control.js.map +1 -0
  105. package/{controls → dist/controls}/rich-text/dom.d.ts +52 -9
  106. package/{controls → dist/controls}/rich-text/dom.js +379 -50
  107. package/dist/controls/rich-text/dom.js.map +1 -0
  108. package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
  109. package/{controls → dist/controls}/rich-text/editor.js +148 -48
  110. package/dist/controls/rich-text/editor.js.map +1 -0
  111. package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
  112. package/{controls → dist/controls}/rich-text/floating.js +35 -18
  113. package/dist/controls/rich-text/floating.js.map +1 -0
  114. package/{controls → dist/controls}/rich-text/index.js +1 -1
  115. package/dist/controls/rich-text/index.js.map +1 -0
  116. package/dist/controls/rich-text/link-form.js +147 -0
  117. package/dist/controls/rich-text/link-form.js.map +1 -0
  118. package/{controls → dist/controls}/rich-text/markdown.js +4 -2
  119. package/dist/controls/rich-text/markdown.js.map +1 -0
  120. package/{controls → dist/controls}/rich-text/ops.js +17 -15
  121. package/dist/controls/rich-text/ops.js.map +1 -0
  122. package/dist/controls/rich-text/plain.d.ts +17 -0
  123. package/dist/controls/rich-text/plain.js +44 -0
  124. package/dist/controls/rich-text/plain.js.map +1 -0
  125. package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
  126. package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
  127. package/dist/controls/rich-text/toolbar.js.map +1 -0
  128. package/{controls → dist/controls}/scale.js +5 -5
  129. package/dist/controls/scale.js.map +1 -0
  130. package/{controls → dist/controls}/slot-register.js +1 -1
  131. package/dist/controls/slot-register.js.map +1 -0
  132. package/{controls → dist/controls}/slot-services.d.ts +25 -0
  133. package/dist/controls/slot-services.js +155 -0
  134. package/dist/controls/slot-services.js.map +1 -0
  135. package/{controls → dist/controls}/slot.js +42 -24
  136. package/dist/controls/slot.js.map +1 -0
  137. package/{controls → dist/controls}/table/index.js +1 -1
  138. package/dist/controls/table/index.js.map +1 -0
  139. package/{controls → dist/controls}/table/prod.js +3 -3
  140. package/dist/controls/table/prod.js.map +1 -0
  141. package/{controls → dist/controls}/table/refs.js +13 -2
  142. package/dist/controls/table/refs.js.map +1 -0
  143. package/{controls → dist/controls}/table/stored.js +1 -1
  144. package/dist/controls/table/stored.js.map +1 -0
  145. package/{controls → dist/controls}/table/table-editor.js +51 -48
  146. package/dist/controls/table/table-editor.js.map +1 -0
  147. package/{controls → dist/controls}/table/table-link.js +3 -3
  148. package/dist/controls/table/table-link.js.map +1 -0
  149. package/{controls → dist/controls}/table/table.js +3 -3
  150. package/dist/controls/table/table.js.map +1 -0
  151. package/{controls → dist/controls}/text.d.ts +2 -2
  152. package/{controls → dist/controls}/text.js +78 -43
  153. package/dist/controls/text.js.map +1 -0
  154. package/dist/controls/unknown-value.d.ts +17 -0
  155. package/dist/controls/unknown-value.js +66 -0
  156. package/dist/controls/unknown-value.js.map +1 -0
  157. package/dist/core/core.d.ts +63 -0
  158. package/dist/core/core.js +171 -0
  159. package/dist/core/core.js.map +1 -0
  160. package/dist/core/facets.d.ts +347 -0
  161. package/dist/core/facets.js +334 -0
  162. package/dist/core/facets.js.map +1 -0
  163. package/dist/core/index.d.ts +3 -0
  164. package/dist/core/index.js +3 -0
  165. package/{engine → dist/engine}/array.js +34 -21
  166. package/dist/engine/array.js.map +1 -0
  167. package/{engine → dist/engine}/bits.js +1 -1
  168. package/dist/engine/bits.js.map +1 -0
  169. package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
  170. package/{engine → dist/engine}/breadcrumb.js +12 -36
  171. package/dist/engine/breadcrumb.js.map +1 -0
  172. package/{engine → dist/engine}/expand.d.ts +2 -4
  173. package/{engine → dist/engine}/expand.js +5 -22
  174. package/dist/engine/expand.js.map +1 -0
  175. package/{engine → dist/engine}/field-list.js +1 -1
  176. package/dist/engine/field-list.js.map +1 -0
  177. package/{engine → dist/engine}/field-shell.js +249 -121
  178. package/dist/engine/field-shell.js.map +1 -0
  179. package/{engine → dist/engine}/frame.d.ts +3 -1
  180. package/{engine → dist/engine}/frame.js +16 -14
  181. package/dist/engine/frame.js.map +1 -0
  182. package/{engine → dist/engine}/group-summary.d.ts +2 -1
  183. package/{engine → dist/engine}/group-summary.js +7 -3
  184. package/dist/engine/group-summary.js.map +1 -0
  185. package/{engine → dist/engine}/grouping.d.ts +19 -5
  186. package/{engine → dist/engine}/grouping.js +193 -21
  187. package/dist/engine/grouping.js.map +1 -0
  188. package/{engine → dist/engine}/item-list.d.ts +11 -1
  189. package/{engine → dist/engine}/item-list.js +35 -13
  190. package/dist/engine/item-list.js.map +1 -0
  191. package/{engine → dist/engine}/kit-field.js +45 -10
  192. package/dist/engine/kit-field.js.map +1 -0
  193. package/{engine → dist/engine}/schema-form.d.ts +27 -2
  194. package/{engine → dist/engine}/schema-form.js +182 -40
  195. package/dist/engine/schema-form.js.map +1 -0
  196. package/{engine → dist/engine}/slot.js +5 -15
  197. package/dist/engine/slot.js.map +1 -0
  198. package/dist/index.js +47 -0
  199. package/dist/index.js.map +1 -0
  200. package/{kit.css → dist/kit.css} +19 -0
  201. package/{lib → dist/lib}/cn.js +7 -4
  202. package/dist/lib/cn.js.map +1 -0
  203. package/{lib → dist/lib}/columns.js +4 -1
  204. package/dist/lib/columns.js.map +1 -0
  205. package/{lib → dist/lib}/frames.js +2 -2
  206. package/dist/lib/frames.js.map +1 -0
  207. package/dist/lib/icon-image.d.ts +10 -0
  208. package/dist/lib/icon-image.js +8 -0
  209. package/dist/lib/icon-image.js.map +1 -0
  210. package/{lib → dist/lib}/icons.js +4 -3
  211. package/dist/lib/icons.js.map +1 -0
  212. package/dist/lib/input-modality.d.ts +11 -0
  213. package/dist/lib/input-modality.js +47 -0
  214. package/dist/lib/input-modality.js.map +1 -0
  215. package/dist/lib/key-event.d.ts +11 -0
  216. package/dist/lib/key-event.js +16 -0
  217. package/dist/lib/key-event.js.map +1 -0
  218. package/{lib → dist/lib}/path.js +4 -2
  219. package/dist/lib/path.js.map +1 -0
  220. package/{lib → dist/lib}/schema.d.ts +34 -3
  221. package/{lib → dist/lib}/schema.js +110 -13
  222. package/dist/lib/schema.js.map +1 -0
  223. package/{lib → dist/lib}/utils.js +1 -1
  224. package/dist/lib/utils.js.map +1 -0
  225. package/{lib → dist/lib}/validate.d.ts +11 -1
  226. package/{lib → dist/lib}/validate.js +85 -11
  227. package/dist/lib/validate.js.map +1 -0
  228. package/dist/library/analysis.d.ts +23 -0
  229. package/dist/library/analysis.js +160 -0
  230. package/dist/library/analysis.js.map +1 -0
  231. package/dist/library/catalog.d.ts +57 -0
  232. package/dist/library/catalog.js +307 -0
  233. package/dist/library/catalog.js.map +1 -0
  234. package/dist/library/coreNotes.d.ts +8 -0
  235. package/dist/library/coreNotes.js +111 -0
  236. package/dist/library/coreNotes.js.map +1 -0
  237. package/dist/library/coverage.d.ts +40 -0
  238. package/dist/library/coverage.js +59 -0
  239. package/dist/library/coverage.js.map +1 -0
  240. package/dist/library/entries/advanced.entries.d.ts +2 -0
  241. package/dist/library/entries/advanced.entries.js +6579 -0
  242. package/dist/library/entries/advanced.entries.js.map +1 -0
  243. package/dist/library/entries/commerce.entries.d.ts +2 -0
  244. package/dist/library/entries/commerce.entries.js +4140 -0
  245. package/dist/library/entries/commerce.entries.js.map +1 -0
  246. package/dist/library/entries/company.entries.d.ts +2 -0
  247. package/dist/library/entries/company.entries.js +2731 -0
  248. package/dist/library/entries/company.entries.js.map +1 -0
  249. package/dist/library/entries/conversion.entries.d.ts +2 -0
  250. package/dist/library/entries/conversion.entries.js +3707 -0
  251. package/dist/library/entries/conversion.entries.js.map +1 -0
  252. package/dist/library/entries/data.entries.d.ts +7 -0
  253. package/dist/library/entries/data.entries.js +4613 -0
  254. package/dist/library/entries/data.entries.js.map +1 -0
  255. package/dist/library/entries/events.entries.d.ts +2 -0
  256. package/dist/library/entries/events.entries.js +3428 -0
  257. package/dist/library/entries/events.entries.js.map +1 -0
  258. package/dist/library/entries/features.entries.d.ts +2 -0
  259. package/dist/library/entries/features.entries.js +3157 -0
  260. package/dist/library/entries/features.entries.js.map +1 -0
  261. package/dist/library/entries/heroes.entries.d.ts +2 -0
  262. package/dist/library/entries/heroes.entries.js +3401 -0
  263. package/dist/library/entries/heroes.entries.js.map +1 -0
  264. package/dist/library/entries/index.d.ts +3 -0
  265. package/dist/library/entries/index.js +35 -0
  266. package/dist/library/entries/index.js.map +1 -0
  267. package/dist/library/entries/listings.entries.d.ts +2 -0
  268. package/dist/library/entries/listings.entries.js +2976 -0
  269. package/dist/library/entries/listings.entries.js.map +1 -0
  270. package/dist/library/entries/longform.entries.d.ts +2 -0
  271. package/dist/library/entries/longform.entries.js +4227 -0
  272. package/dist/library/entries/longform.entries.js.map +1 -0
  273. package/dist/library/entries/media.entries.d.ts +2 -0
  274. package/dist/library/entries/media.entries.js +2781 -0
  275. package/dist/library/entries/media.entries.js.map +1 -0
  276. package/dist/library/entries/navigation.entries.d.ts +2 -0
  277. package/dist/library/entries/navigation.entries.js +4011 -0
  278. package/dist/library/entries/navigation.entries.js.map +1 -0
  279. package/dist/library/entries/pricing.entries.d.ts +2 -0
  280. package/dist/library/entries/pricing.entries.js +2383 -0
  281. package/dist/library/entries/pricing.entries.js.map +1 -0
  282. package/dist/library/entries/social-proof.entries.d.ts +2 -0
  283. package/dist/library/entries/social-proof.entries.js +2297 -0
  284. package/dist/library/entries/social-proof.entries.js.map +1 -0
  285. package/dist/library/examples/bento.d.ts +92 -0
  286. package/dist/library/examples/bento.js +201 -0
  287. package/dist/library/examples/bento.js.map +1 -0
  288. package/dist/library/examples/blocks.d.ts +14 -0
  289. package/dist/library/examples/blocks.js +313 -0
  290. package/dist/library/examples/blocks.js.map +1 -0
  291. package/dist/library/examples/faq.d.ts +28 -0
  292. package/dist/library/examples/faq.js +230 -0
  293. package/dist/library/examples/faq.js.map +1 -0
  294. package/dist/library/examples/hero.d.ts +43 -0
  295. package/dist/library/examples/hero.js +222 -0
  296. package/dist/library/examples/hero.js.map +1 -0
  297. package/dist/library/examples/index.d.ts +36 -0
  298. package/dist/library/examples/index.js +109 -0
  299. package/dist/library/examples/index.js.map +1 -0
  300. package/dist/library/examples/journalStory.d.ts +93 -0
  301. package/dist/library/examples/journalStory.js +338 -0
  302. package/dist/library/examples/journalStory.js.map +1 -0
  303. package/dist/library/examples/megaMenu.d.ts +134 -0
  304. package/dist/library/examples/megaMenu.js +442 -0
  305. package/dist/library/examples/megaMenu.js.map +1 -0
  306. package/dist/library/examples/pricing.d.ts +103 -0
  307. package/dist/library/examples/pricing.js +479 -0
  308. package/dist/library/examples/pricing.js.map +1 -0
  309. package/dist/library/examples/tabs.d.ts +87 -0
  310. package/dist/library/examples/tabs.js +180 -0
  311. package/dist/library/examples/tabs.js.map +1 -0
  312. package/dist/library/export.d.ts +42 -0
  313. package/dist/library/export.js +80 -0
  314. package/dist/library/export.js.map +1 -0
  315. package/dist/library/index.d.ts +13 -0
  316. package/dist/library/index.js +6 -0
  317. package/dist/library/kit-catalog.json +1510 -0
  318. package/dist/library/types.d.ts +42 -0
  319. package/dist/library/types.js +0 -0
  320. package/{schema → dist/schema}/adapters.js +1 -2
  321. package/dist/schema/adapters.js.map +1 -0
  322. package/{schema → dist/schema}/help.d.ts +2 -0
  323. package/{schema → dist/schema}/help.js +6 -4
  324. package/dist/schema/help.js.map +1 -0
  325. package/{schema → dist/schema}/scale.js +1 -1
  326. package/dist/schema/scale.js.map +1 -0
  327. package/{schema → dist/schema}/sources.js +1 -1
  328. package/dist/schema/sources.js.map +1 -0
  329. package/{schema → dist/schema}/table.js +11 -10
  330. package/dist/schema/table.js.map +1 -0
  331. package/{schema → dist/schema}/types.d.ts +29 -1
  332. package/{schema → dist/schema}/types.js +1 -1
  333. package/dist/schema/types.js.map +1 -0
  334. package/dist/styles.css +2 -0
  335. package/dist/table/table-view.d.ts +14 -0
  336. package/dist/table/table-view.js +140 -0
  337. package/dist/table/table-view.js.map +1 -0
  338. package/dist/table/table.css +73 -0
  339. package/dist/testing/corpus.d.ts +63 -0
  340. package/dist/testing/corpus.js +129 -0
  341. package/dist/testing/corpus.js.map +1 -0
  342. package/dist/testing/test-form.d.ts +11 -0
  343. package/dist/testing/test-form.js +38 -0
  344. package/dist/testing/test-form.js.map +1 -0
  345. package/dist/theme.css +345 -0
  346. package/dist/theme.d.ts +22 -0
  347. package/dist/theme.js +43 -0
  348. package/dist/theme.js.map +1 -0
  349. package/dist/tokens.css +542 -0
  350. package/dist/types.js +0 -0
  351. package/{ui → dist/ui}/action-tray.d.ts +1 -1
  352. package/{ui → dist/ui}/action-tray.js +20 -19
  353. package/dist/ui/action-tray.js.map +1 -0
  354. package/dist/ui/autocomplete.d.ts +30 -0
  355. package/dist/ui/autocomplete.js +139 -0
  356. package/dist/ui/autocomplete.js.map +1 -0
  357. package/{ui → dist/ui}/button.d.ts +3 -3
  358. package/{ui → dist/ui}/button.js +6 -7
  359. package/dist/ui/button.js.map +1 -0
  360. package/{ui → dist/ui}/choice-switch.js +1 -1
  361. package/dist/ui/choice-switch.js.map +1 -0
  362. package/{ui → dist/ui}/controls.js +51 -39
  363. package/dist/ui/controls.js.map +1 -0
  364. package/{ui → dist/ui}/display.d.ts +10 -3
  365. package/{ui → dist/ui}/display.js +57 -46
  366. package/dist/ui/display.js.map +1 -0
  367. package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
  368. package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
  369. package/dist/ui/expanded-editor-modal.js.map +1 -0
  370. package/{ui → dist/ui}/field-context.js +1 -1
  371. package/dist/ui/field-context.js.map +1 -0
  372. package/{ui → dist/ui}/floating-panel.d.ts +1 -1
  373. package/{ui → dist/ui}/floating-panel.js +28 -12
  374. package/dist/ui/floating-panel.js.map +1 -0
  375. package/{ui → dist/ui}/index.d.ts +4 -0
  376. package/dist/ui/index.js +18 -0
  377. package/{ui → dist/ui}/input.d.ts +1 -1
  378. package/{ui → dist/ui}/input.js +9 -9
  379. package/dist/ui/input.js.map +1 -0
  380. package/{ui → dist/ui}/mode-bar.js +3 -3
  381. package/dist/ui/mode-bar.js.map +1 -0
  382. package/{ui → dist/ui}/overlay.d.ts +77 -5
  383. package/dist/ui/overlay.js +697 -0
  384. package/dist/ui/overlay.js.map +1 -0
  385. package/{ui → dist/ui}/path-crumbs.js +37 -3
  386. package/dist/ui/path-crumbs.js.map +1 -0
  387. package/{ui → dist/ui}/presence.js +2 -2
  388. package/dist/ui/presence.js.map +1 -0
  389. package/{ui → dist/ui}/select.js +89 -87
  390. package/dist/ui/select.js.map +1 -0
  391. package/{ui → dist/ui}/shortcut-hint.js +1 -1
  392. package/dist/ui/shortcut-hint.js.map +1 -0
  393. package/dist/ui/spinner.d.ts +24 -0
  394. package/dist/ui/spinner.js +42 -0
  395. package/dist/ui/spinner.js.map +1 -0
  396. package/dist/ui/split-button.d.ts +32 -0
  397. package/dist/ui/split-button.js +60 -0
  398. package/dist/ui/split-button.js.map +1 -0
  399. package/{ui → dist/ui}/surfaces.js +1 -1
  400. package/dist/ui/surfaces.js.map +1 -0
  401. package/dist/ui/tab.d.ts +38 -0
  402. package/dist/ui/tab.js +87 -0
  403. package/dist/ui/tab.js.map +1 -0
  404. package/dist/ui/toast.d.ts +20 -0
  405. package/dist/ui/toast.js +115 -0
  406. package/dist/ui/toast.js.map +1 -0
  407. package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
  408. package/{ui → dist/ui}/tooltip-root.js +9 -8
  409. package/dist/ui/tooltip-root.js.map +1 -0
  410. package/{ui → dist/ui}/variants.js +1 -1
  411. package/dist/ui/variants.js.map +1 -0
  412. package/package.json +77 -23
  413. package/adapters/icons.js.map +0 -1
  414. package/adapters/lossy.js +0 -233
  415. package/adapters/lossy.js.map +0 -1
  416. package/adapters/prod-types.js.map +0 -1
  417. package/adapters/schema.js.map +0 -1
  418. package/adapters/values.js.map +0 -1
  419. package/brand/logo.js +0 -9
  420. package/brand/logo.js.map +0 -1
  421. package/context.js.map +0 -1
  422. package/controls/button.js.map +0 -1
  423. package/controls/c1.js.map +0 -1
  424. package/controls/c2.js.map +0 -1
  425. package/controls/choice.js.map +0 -1
  426. package/controls/code-register.js.map +0 -1
  427. package/controls/code.js.map +0 -1
  428. package/controls/color.js.map +0 -1
  429. package/controls/date-register.js.map +0 -1
  430. package/controls/date-zone.js.map +0 -1
  431. package/controls/date.js.map +0 -1
  432. package/controls/form-picker-register.js.map +0 -1
  433. package/controls/form-picker.js.map +0 -1
  434. package/controls/icon-register.js.map +0 -1
  435. package/controls/icon.js.map +0 -1
  436. package/controls/index.js.map +0 -1
  437. package/controls/json-register.js.map +0 -1
  438. package/controls/json.js.map +0 -1
  439. package/controls/link.js.map +0 -1
  440. package/controls/location-register.js.map +0 -1
  441. package/controls/location.js.map +0 -1
  442. package/controls/media-register.js.map +0 -1
  443. package/controls/media.js.map +0 -1
  444. package/controls/number.js.map +0 -1
  445. package/controls/reference-register.js.map +0 -1
  446. package/controls/reference.js.map +0 -1
  447. package/controls/rich-text/blocks.d.ts +0 -28
  448. package/controls/rich-text/blocks.js.map +0 -1
  449. package/controls/rich-text/catalog.js.map +0 -1
  450. package/controls/rich-text/codec.js.map +0 -1
  451. package/controls/rich-text/component-card.js.map +0 -1
  452. package/controls/rich-text/control.js.map +0 -1
  453. package/controls/rich-text/dom.js.map +0 -1
  454. package/controls/rich-text/editor.js.map +0 -1
  455. package/controls/rich-text/floating.js.map +0 -1
  456. package/controls/rich-text/index.js.map +0 -1
  457. package/controls/rich-text/link-form.js +0 -111
  458. package/controls/rich-text/link-form.js.map +0 -1
  459. package/controls/rich-text/markdown.js.map +0 -1
  460. package/controls/rich-text/ops.js.map +0 -1
  461. package/controls/rich-text/toolbar.js.map +0 -1
  462. package/controls/scale.js.map +0 -1
  463. package/controls/slot-register.js.map +0 -1
  464. package/controls/slot-services.js +0 -38
  465. package/controls/slot-services.js.map +0 -1
  466. package/controls/slot.js.map +0 -1
  467. package/controls/table/index.js.map +0 -1
  468. package/controls/table/prod.js.map +0 -1
  469. package/controls/table/refs.js.map +0 -1
  470. package/controls/table/stored.js.map +0 -1
  471. package/controls/table/table-editor.js.map +0 -1
  472. package/controls/table/table-link.js.map +0 -1
  473. package/controls/table/table.js.map +0 -1
  474. package/controls/text.js.map +0 -1
  475. package/engine/array.js.map +0 -1
  476. package/engine/bits.js.map +0 -1
  477. package/engine/breadcrumb.js.map +0 -1
  478. package/engine/expand.js.map +0 -1
  479. package/engine/field-list.js.map +0 -1
  480. package/engine/field-shell.js.map +0 -1
  481. package/engine/frame.js.map +0 -1
  482. package/engine/group-summary.js.map +0 -1
  483. package/engine/grouping.js.map +0 -1
  484. package/engine/item-list.js.map +0 -1
  485. package/engine/kit-field.js.map +0 -1
  486. package/engine/schema-form.js.map +0 -1
  487. package/engine/slot.js.map +0 -1
  488. package/index.js +0 -55
  489. package/index.js.map +0 -1
  490. package/lib/cn.js.map +0 -1
  491. package/lib/columns.js.map +0 -1
  492. package/lib/frames.js.map +0 -1
  493. package/lib/icons.js.map +0 -1
  494. package/lib/path.js.map +0 -1
  495. package/lib/schema.js.map +0 -1
  496. package/lib/utils.js.map +0 -1
  497. package/lib/validate.js.map +0 -1
  498. package/schema/adapters.js.map +0 -1
  499. package/schema/help.js.map +0 -1
  500. package/schema/scale.js.map +0 -1
  501. package/schema/sources.js.map +0 -1
  502. package/schema/table.js.map +0 -1
  503. package/schema/types.js.map +0 -1
  504. package/ui/action-tray.js.map +0 -1
  505. package/ui/button.js.map +0 -1
  506. package/ui/choice-switch.js.map +0 -1
  507. package/ui/controls.js.map +0 -1
  508. package/ui/display.js.map +0 -1
  509. package/ui/expanded-editor-modal.js.map +0 -1
  510. package/ui/field-context.js.map +0 -1
  511. package/ui/floating-panel.js.map +0 -1
  512. package/ui/index.js +0 -13
  513. package/ui/input.js.map +0 -1
  514. package/ui/mode-bar.js.map +0 -1
  515. package/ui/overlay.js +0 -378
  516. package/ui/overlay.js.map +0 -1
  517. package/ui/path-crumbs.js.map +0 -1
  518. package/ui/presence.js.map +0 -1
  519. package/ui/select.js.map +0 -1
  520. package/ui/shortcut-hint.js.map +0 -1
  521. package/ui/surfaces.js.map +0 -1
  522. package/ui/tooltip-root.js.map +0 -1
  523. package/ui/variants.js.map +0 -1
  524. /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
  525. /package/{adapters → dist/adapters}/icons.d.ts +0 -0
  526. /package/{brand → dist/brand}/logo.d.ts +0 -0
  527. /package/{controls → dist/controls}/c1.d.ts +0 -0
  528. /package/{controls → dist/controls}/c2.d.ts +0 -0
  529. /package/{controls → dist/controls}/code-register.d.ts +0 -0
  530. /package/{controls → dist/controls}/code.d.ts +0 -0
  531. /package/{controls → dist/controls}/color.d.ts +0 -0
  532. /package/{controls → dist/controls}/date-register.d.ts +0 -0
  533. /package/{controls → dist/controls}/date-zone.d.ts +0 -0
  534. /package/{controls → dist/controls}/date.d.ts +0 -0
  535. /package/{controls → dist/controls}/form-picker-register.d.ts +0 -0
  536. /package/{controls → dist/controls}/form-picker.d.ts +0 -0
  537. /package/{controls → dist/controls}/icon-register.d.ts +0 -0
  538. /package/{controls → dist/controls}/json-register.d.ts +0 -0
  539. /package/{controls → dist/controls}/json.d.ts +0 -0
  540. /package/{controls → dist/controls}/link.d.ts +0 -0
  541. /package/{controls → dist/controls}/location-register.d.ts +0 -0
  542. /package/{controls → dist/controls}/location.d.ts +0 -0
  543. /package/{controls → dist/controls}/media-register.d.ts +0 -0
  544. /package/{controls → dist/controls}/number.d.ts +0 -0
  545. /package/{controls → dist/controls}/reference-register.d.ts +0 -0
  546. /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
  547. /package/{controls → dist/controls}/rich-text/link-form.d.ts +0 -0
  548. /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
  549. /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
  550. /package/{controls → dist/controls}/scale.d.ts +0 -0
  551. /package/{controls → dist/controls}/slot-register.d.ts +0 -0
  552. /package/{controls → dist/controls}/slot.d.ts +0 -0
  553. /package/{controls → dist/controls}/table/index.d.ts +0 -0
  554. /package/{controls → dist/controls}/table/prod.d.ts +0 -0
  555. /package/{controls → dist/controls}/table/refs.d.ts +0 -0
  556. /package/{controls → dist/controls}/table/stored.d.ts +0 -0
  557. /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
  558. /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
  559. /package/{controls → dist/controls}/table/table.d.ts +0 -0
  560. /package/{engine → dist/engine}/array.d.ts +0 -0
  561. /package/{engine → dist/engine}/bits.d.ts +0 -0
  562. /package/{engine → dist/engine}/field-list.d.ts +0 -0
  563. /package/{engine → dist/engine}/field-shell.d.ts +0 -0
  564. /package/{engine → dist/engine}/kit-field.d.ts +0 -0
  565. /package/{engine → dist/engine}/slot.d.ts +0 -0
  566. /package/{index.d.ts → dist/index.d.ts} +0 -0
  567. /package/{lib → dist/lib}/cn.d.ts +0 -0
  568. /package/{lib → dist/lib}/columns.d.ts +0 -0
  569. /package/{lib → dist/lib}/frames.d.ts +0 -0
  570. /package/{lib → dist/lib}/icons.d.ts +0 -0
  571. /package/{lib → dist/lib}/path.d.ts +0 -0
  572. /package/{lib → dist/lib}/utils.d.ts +0 -0
  573. /package/{schema → dist/schema}/adapters.d.ts +0 -0
  574. /package/{schema → dist/schema}/scale.d.ts +0 -0
  575. /package/{schema → dist/schema}/sources.d.ts +0 -0
  576. /package/{schema → dist/schema}/table.d.ts +0 -0
  577. /package/{types.d.ts → dist/types.d.ts} +0 -0
  578. /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
  579. /package/{ui → dist/ui}/controls.d.ts +0 -0
  580. /package/{ui → dist/ui}/field-context.d.ts +0 -0
  581. /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
  582. /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
  583. /package/{ui → dist/ui}/presence.d.ts +0 -0
  584. /package/{ui → dist/ui}/select.d.ts +0 -0
  585. /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
  586. /package/{ui → dist/ui}/surfaces.d.ts +0 -0
  587. /package/{ui → dist/ui}/variants.d.ts +0 -0
package/ui/overlay.js DELETED
@@ -1,378 +0,0 @@
1
- import { cn } from "../lib/cn.js";
2
- import { FLOATING_LINE, GLASS, INK_ACTIVE, KIT_SCOPE, SURFACE_RAISED, TRAY } from "./surfaces.js";
3
- import { MODAL_LAYER, TooltipLayer, TooltipRoot } from "./tooltip-root.js";
4
- import { IconButton, TooltipScope } from "./button.js";
5
- import { useShortcutHints } from "./shortcut-hint.js";
6
- import * as React from "react";
7
- import { IconCheck, IconChevronRight, IconX } from "@tabler/icons-react";
8
- import { jsx, jsxs } from "react/jsx-runtime";
9
- import { Tooltip } from "@base-ui/react/tooltip";
10
- import { Dialog } from "@base-ui/react/dialog";
11
- import { Menu } from "@base-ui/react/menu";
12
- import { Popover } from "@base-ui/react/popover";
13
- import { PreviewCard } from "@base-ui/react/preview-card";
14
- import { Separator } from "@base-ui/react/separator";
15
- import { useRender } from "@base-ui/react/use-render";
16
- //#region src/kit/ui/overlay.tsx
17
- var layer = { [MODAL_LAYER]: "" };
18
- var FLOATING_LAYER = "[data-floating-layer]";
19
- function keepOpen(details, anchor) {
20
- const target = details.event?.target;
21
- const keep = details.reason === "escape-key" && details.event.defaultPrevented || details.reason === "outside-press" && target instanceof Element && (!!target.closest("[data-floating-layer]") || !!anchor?.contains(target));
22
- if (keep) details.cancel();
23
- return keep;
24
- }
25
- function guard(onOpenChange, anchor) {
26
- return (open, details) => {
27
- if (!open && keepOpen(details, anchor?.())) return;
28
- onOpenChange?.(open, details);
29
- };
30
- }
31
- var TooltipProvider = Tooltip.Provider;
32
- function Tooltip$1({ content, children, side = "top", shortcut, delay = 350, disabled }) {
33
- const hints = useShortcutHints();
34
- if (disabled || !content) return /* @__PURE__ */ jsx(TooltipScope.Provider, {
35
- value: true,
36
- children
37
- });
38
- return /* @__PURE__ */ jsx(TooltipScope.Provider, {
39
- value: true,
40
- children: /* @__PURE__ */ jsxs(TooltipRoot, { children: [/* @__PURE__ */ jsx(Tooltip.Trigger, {
41
- delay,
42
- render: children
43
- }), /* @__PURE__ */ jsxs(TooltipLayer, {
44
- side,
45
- children: [/* @__PURE__ */ jsx("span", {
46
- className: "line-clamp-[8] min-w-0 whitespace-normal [overflow-wrap:anywhere]",
47
- children: content
48
- }), shortcut && hints ? /* @__PURE__ */ jsx("kbd", {
49
- "data-hint": "shortcuts",
50
- className: cn("mt-px shrink-0 rounded-kit-sm px-1 font-kit-sans text-kit-2xs", INK_ACTIVE),
51
- children: shortcut
52
- }) : null]
53
- })] })
54
- });
55
- }
56
- var AnchorContext = React.createContext(null);
57
- function Popover$1({ onOpenChange, ...props }) {
58
- const anchor = React.useRef(null);
59
- return /* @__PURE__ */ jsx(AnchorContext.Provider, {
60
- value: anchor,
61
- children: /* @__PURE__ */ jsx(Popover.Root, {
62
- ...props,
63
- onOpenChange: guard(onOpenChange, () => anchor.current)
64
- })
65
- });
66
- }
67
- var PopoverTrigger = Popover.Trigger;
68
- var PopoverClose = Popover.Close;
69
- /** Positions the popover against this element instead of the trigger; presses on it count as inside. */
70
- function PopoverAnchor({ render, ...props }) {
71
- const anchor = React.useContext(AnchorContext);
72
- return useRender({
73
- render: render ?? /* @__PURE__ */ jsx("div", {}),
74
- ref: anchor ?? void 0,
75
- props
76
- });
77
- }
78
- function PopoverContent({ className, align = "start", side, sideOffset = 6, keepFocus, onMouseDown, collisionBoundary, collisionPadding = 12, collisionAvoidance, ...props }) {
79
- const anchor = React.useContext(AnchorContext);
80
- return /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsx(Popover.Positioner, {
81
- align,
82
- side,
83
- sideOffset,
84
- collisionBoundary,
85
- collisionPadding,
86
- collisionAvoidance,
87
- anchor: anchor?.current ? anchor : void 0,
88
- className: "z-[80]",
89
- ...KIT_SCOPE,
90
- children: /* @__PURE__ */ jsx(Popover.Popup, {
91
- initialFocus: keepFocus ? false : void 0,
92
- finalFocus: keepFocus ? false : void 0,
93
- onMouseDown: (e) => {
94
- onMouseDown?.(e);
95
- if (keepFocus && !e.target.closest("input, textarea, select, [contenteditable=true]")) e.preventDefault();
96
- },
97
- className: cn(GLASS, "w-72 max-w-[calc(100vw-24px)] rounded-kit-xl border p-3 text-kit-fg outline-none data-[open]:animate-kit-pop-in", className),
98
- ...props
99
- })
100
- }) });
101
- }
102
- var HoverCard = PreviewCard.Root;
103
- var HoverCardTrigger = PreviewCard.Trigger;
104
- function HoverCardContent({ className, ...props }) {
105
- return /* @__PURE__ */ jsx(PreviewCard.Portal, { children: /* @__PURE__ */ jsx(PreviewCard.Positioner, {
106
- sideOffset: 8,
107
- collisionPadding: 12,
108
- className: "z-[80]",
109
- ...KIT_SCOPE,
110
- children: /* @__PURE__ */ jsx(PreviewCard.Popup, {
111
- className: cn(GLASS, "w-72 rounded-kit-xl border p-3 data-[open]:animate-kit-pop-in", className),
112
- ...props
113
- })
114
- }) });
115
- }
116
- /** Arrowing past the last item stays put (loopFocus false), like V2's Radix menus. */
117
- function Menu$1({ onOpenChange, loopFocus = false, ...props }) {
118
- return /* @__PURE__ */ jsx(Menu.Root, {
119
- loopFocus,
120
- ...props,
121
- onOpenChange: guard(onOpenChange)
122
- });
123
- }
124
- var MenuTrigger = Menu.Trigger;
125
- var MenuGroup = Menu.Group;
126
- var MenuSub = Menu.SubmenuRoot;
127
- var MenuRadioGroup = Menu.RadioGroup;
128
- function MenuContent({ className, align = "start", side, sideOffset = 6, ...props }) {
129
- return /* @__PURE__ */ jsx(Menu.Portal, { children: /* @__PURE__ */ jsx(Menu.Positioner, {
130
- align,
131
- side,
132
- sideOffset,
133
- collisionPadding: 12,
134
- className: "z-[80]",
135
- ...KIT_SCOPE,
136
- children: /* @__PURE__ */ jsx(Menu.Popup, {
137
- ...layer,
138
- className: cn(GLASS, "min-w-48 overflow-hidden rounded-kit-lg border p-1 text-kit-fg outline-none data-[open]:animate-kit-pop-in", className),
139
- ...props
140
- })
141
- }) });
142
- }
143
- var itemCls = "relative flex h-8 cursor-pointer select-none items-center gap-2 rounded-kit-md px-2 text-kit-sm text-kit-fg outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-40 data-[highlighted]:bg-kit-hover [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-kit-fg-2";
144
- function MenuItem({ className, icon, shortcut, danger, children, ...props }) {
145
- return /* @__PURE__ */ jsxs(Menu.Item, {
146
- className: cn(itemCls, danger && "text-kit-danger-fg data-[highlighted]:bg-kit-danger-soft [&>svg]:text-kit-danger-fg", className),
147
- ...props,
148
- children: [
149
- icon,
150
- /* @__PURE__ */ jsx("span", {
151
- className: "min-w-0 flex-1 truncate",
152
- children
153
- }),
154
- shortcut ? /* @__PURE__ */ jsx("span", {
155
- className: "text-kit-xs text-kit-fg-3",
156
- children: shortcut
157
- }) : null
158
- ]
159
- });
160
- }
161
- /** Checking an item closes the menu, like V2's Radix items (pass closeOnClick={false} to keep it open). */
162
- function MenuCheckItem({ className, children, closeOnClick = true, ...props }) {
163
- return /* @__PURE__ */ jsxs(Menu.CheckboxItem, {
164
- className: cn(itemCls, "pr-8", className),
165
- closeOnClick,
166
- ...props,
167
- children: [children, /* @__PURE__ */ jsx(Menu.CheckboxItemIndicator, {
168
- className: "absolute right-2",
169
- children: /* @__PURE__ */ jsx(IconCheck, { className: "size-4" })
170
- })]
171
- });
172
- }
173
- function MenuRadioItem({ className, children, closeOnClick = true, ...props }) {
174
- return /* @__PURE__ */ jsxs(Menu.RadioItem, {
175
- className: cn(itemCls, "pr-8", className),
176
- closeOnClick,
177
- ...props,
178
- children: [children, /* @__PURE__ */ jsx(Menu.RadioItemIndicator, {
179
- className: "absolute right-2",
180
- children: /* @__PURE__ */ jsx(IconCheck, { className: "size-4" })
181
- })]
182
- });
183
- }
184
- function MenuSubTrigger({ className, icon, children, ...props }) {
185
- return /* @__PURE__ */ jsxs(Menu.SubmenuTrigger, {
186
- className: cn(itemCls, "data-[popup-open]:bg-kit-hover", className),
187
- ...props,
188
- children: [
189
- icon,
190
- /* @__PURE__ */ jsx("span", {
191
- className: "flex-1",
192
- children
193
- }),
194
- /* @__PURE__ */ jsx(IconChevronRight, { className: "size-3.5 text-kit-fg-3" })
195
- ]
196
- });
197
- }
198
- function MenuSubContent({ className, ...props }) {
199
- return /* @__PURE__ */ jsx(Menu.Portal, { children: /* @__PURE__ */ jsx(Menu.Positioner, {
200
- sideOffset: 6,
201
- collisionPadding: 12,
202
- className: "z-[81]",
203
- ...KIT_SCOPE,
204
- children: /* @__PURE__ */ jsx(Menu.Popup, {
205
- className: cn(GLASS, "min-w-44 rounded-kit-lg border p-1 text-kit-fg outline-none data-[open]:animate-kit-pop-in", className),
206
- ...props
207
- })
208
- }) });
209
- }
210
- function MenuLabel({ className, ...props }) {
211
- return /* @__PURE__ */ jsx("div", {
212
- className: cn("px-2 pb-1 pt-1.5 text-kit-xs font-medium text-kit-fg-3", className),
213
- ...props
214
- });
215
- }
216
- function MenuSeparator({ className }) {
217
- return /* @__PURE__ */ jsx(Separator, { className: cn("-mx-1 my-1 h-px bg-kit-line", className) });
218
- }
219
- var recent = [];
220
- if (typeof document !== "undefined") document.addEventListener("focusin", (e) => {
221
- recent.unshift(e.target);
222
- recent.length = Math.min(recent.length, 4);
223
- }, true);
224
- function useFocusReturn(finalFocus) {
225
- const ret = React.useRef(null);
226
- const popup = React.useRef(null);
227
- return {
228
- ref: React.useCallback((el) => {
229
- if (el === popup.current) return;
230
- popup.current = el;
231
- if (!el) return;
232
- const active = document.activeElement;
233
- const outside = (n) => !!n && n !== document.body && !el.contains(n);
234
- ret.current = outside(active) ? active : recent.find(outside) ?? null;
235
- }, []),
236
- finalFocus: finalFocus ?? (() => {
237
- const t = ret.current;
238
- return t && t.isConnected ? t : true;
239
- })
240
- };
241
- }
242
- /** One stable callback ref for both refs, so React does not detach and re-attach them on every render. */
243
- function useMergedRef(a, b) {
244
- return React.useCallback((el) => {
245
- for (const r of [a, b]) if (typeof r === "function") r(el);
246
- else if (r) r.current = el;
247
- }, [a, b]);
248
- }
249
- function Modal({ onOpenChange, ...props }) {
250
- return /* @__PURE__ */ jsx(Dialog.Root, {
251
- ...props,
252
- onOpenChange: guard(onOpenChange)
253
- });
254
- }
255
- var ModalTrigger = Dialog.Trigger;
256
- var ModalClose = Dialog.Close;
257
- var sizes = {
258
- sm: "max-w-[400px]",
259
- md: "max-w-[480px]",
260
- lg: "max-w-[640px]",
261
- xl: "max-w-[800px]",
262
- full: "max-w-[min(1280px,calc(100vw-48px))] h-[min(860px,calc(100vh-48px))]"
263
- };
264
- function ModalContent({ className, size = "md", children, hideClose, finalFocus, ref, ...props }) {
265
- const focusReturn = useFocusReturn(finalFocus);
266
- const merged = useMergedRef(ref, focusReturn.ref);
267
- return /* @__PURE__ */ jsxs(Dialog.Portal, { children: [/* @__PURE__ */ jsx(Dialog.Backdrop, {
268
- ...KIT_SCOPE,
269
- className: "fixed inset-0 z-[60] bg-kit-overlay backdrop-blur-[2px] data-[open]:animate-kit-fade-in"
270
- }), /* @__PURE__ */ jsx("div", {
271
- ...KIT_SCOPE,
272
- className: "pointer-events-none fixed inset-0 z-[61] flex items-center justify-center p-4 sm:p-6",
273
- children: /* @__PURE__ */ jsxs(Dialog.Popup, {
274
- ...layer,
275
- className: cn("pointer-events-auto relative flex max-h-[calc(100vh-32px)] w-full flex-col overflow-hidden rounded-kit-xl border text-kit-fg shadow-kit-xl outline-none data-[open]:animate-kit-pop-in", FLOATING_LINE, SURFACE_RAISED, sizes[size], className),
276
- ...props,
277
- ref: merged,
278
- finalFocus: focusReturn.finalFocus,
279
- children: [children, hideClose ? null : /* @__PURE__ */ jsx(Dialog.Close, {
280
- render: /* @__PURE__ */ jsx(IconButton, {
281
- label: "Close",
282
- size: "sm",
283
- className: "absolute right-3 top-3 z-10"
284
- }),
285
- children: /* @__PURE__ */ jsx(IconX, {})
286
- })]
287
- })
288
- })] });
289
- }
290
- function ModalHeader({ title, description, className, children }) {
291
- return /* @__PURE__ */ jsx("div", {
292
- className: cn("flex shrink-0 items-start gap-2.5 px-5 pb-1 pt-5 pr-12", className),
293
- children: /* @__PURE__ */ jsxs("div", {
294
- className: "min-w-0 flex-1",
295
- children: [
296
- /* @__PURE__ */ jsx(Dialog.Title, {
297
- className: "text-kit-md font-semibold tracking-[-0.01em] text-kit-fg",
298
- children: title
299
- }),
300
- description ? /* @__PURE__ */ jsx(Dialog.Description, {
301
- className: "mt-1 text-kit-sm text-kit-fg-2",
302
- children: description
303
- }) : /* @__PURE__ */ jsx(Dialog.Description, {
304
- className: "sr-only",
305
- children: typeof title === "string" ? title : "Dialog"
306
- }),
307
- children
308
- ]
309
- })
310
- });
311
- }
312
- function ModalBody({ className, ...props }) {
313
- return /* @__PURE__ */ jsx("div", {
314
- className: cn("min-h-0 flex-1 overflow-y-auto px-5 pb-5 pt-4", className),
315
- ...props
316
- });
317
- }
318
- function ModalFooter({ className, ...props }) {
319
- return /* @__PURE__ */ jsx("div", {
320
- className: cn("flex shrink-0 items-center justify-end gap-2 border-t px-5 py-3", TRAY, className),
321
- ...props
322
- });
323
- }
324
- /** A sheet is a dialog that slides in from an edge: open it with Sheet (= Modal) and its trigger. */
325
- var Sheet = Modal;
326
- var SheetTrigger = Dialog.Trigger;
327
- var SheetClose = Dialog.Close;
328
- var sheetSides = {
329
- right: "inset-y-0 right-0 border-l data-[open]:animate-[kit-sheet-in-r_260ms_var(--kit-ease-out-soft)]",
330
- left: "inset-y-0 left-0 border-r data-[open]:animate-[kit-sheet-in-l_260ms_var(--kit-ease-out-soft)]",
331
- bottom: "inset-x-0 bottom-0 h-[52%] overflow-hidden rounded-t-kit-2xl border-t data-[open]:animate-[kit-sheet-in-b_300ms_cubic-bezier(0.32,0.72,0,1)]"
332
- };
333
- function SheetContent({ className, side = "right", children, width = 440, label = "Panel", noScrim = false, finalFocus, ref, style, backdropClassName, keepMounted = false, ...props }) {
334
- const focusReturn = useFocusReturn(finalFocus);
335
- const merged = useMergedRef(ref, focusReturn.ref);
336
- const bottom = side === "bottom";
337
- return /* @__PURE__ */ jsxs(Dialog.Portal, {
338
- keepMounted,
339
- children: [noScrim ? null : /* @__PURE__ */ jsx(Dialog.Backdrop, {
340
- ...KIT_SCOPE,
341
- className: cn("fixed inset-0 z-[55] bg-kit-overlay data-[open]:animate-kit-fade-in", backdropClassName)
342
- }), /* @__PURE__ */ jsxs(Dialog.Popup, {
343
- ...KIT_SCOPE,
344
- ...layer,
345
- style: bottom ? style : {
346
- width: `min(${width}px, 100vw)`,
347
- ...style
348
- },
349
- className: cn("fixed z-[56] flex flex-col text-kit-fg shadow-kit-xl outline-none transition-transform motion-reduce:animate-none", SURFACE_RAISED, "border-kit-line", sheetSides[side], className),
350
- ...props,
351
- ref: merged,
352
- finalFocus: focusReturn.finalFocus,
353
- children: [
354
- /* @__PURE__ */ jsx(Dialog.Title, {
355
- className: "sr-only",
356
- children: label
357
- }),
358
- /* @__PURE__ */ jsx(Dialog.Description, {
359
- className: "sr-only",
360
- children: bottom ? "Bottom panel" : "Side panel"
361
- }),
362
- bottom ? /* @__PURE__ */ jsx("div", {
363
- "aria-hidden": true,
364
- className: "flex shrink-0 justify-center pt-2",
365
- children: /* @__PURE__ */ jsx("span", {
366
- "data-sheet-grabber": true,
367
- className: "h-1 w-10 rounded-full bg-kit-line-strong"
368
- })
369
- }) : null,
370
- children
371
- ]
372
- })]
373
- });
374
- }
375
- //#endregion
376
- export { FLOATING_LAYER, HoverCard, HoverCardContent, HoverCardTrigger, Menu$1 as Menu, MenuCheckItem, MenuContent, MenuGroup, MenuItem, MenuLabel, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuTrigger, Modal, ModalBody, ModalClose, ModalContent, ModalFooter, ModalHeader, ModalTrigger, Popover$1 as Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger, Sheet, SheetClose, SheetContent, SheetTrigger, Tooltip$1 as Tooltip, TooltipProvider, useFocusReturn };
377
-
378
- //# sourceMappingURL=overlay.js.map
package/ui/overlay.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlay.js","names":[],"sources":["../../src/kit/ui/overlay.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\";\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\nimport { PreviewCard as PreviewCardPrimitive } from \"@base-ui/react/preview-card\";\nimport { Separator } from \"@base-ui/react/separator\";\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { IconCheck, IconChevronRight, IconX } from \"@tabler/icons-react\";\nimport { cn } from \"../lib/cn\";\nimport { IconButton, TooltipScope } from \"./button\";\nimport { useShortcutHints } from \"./shortcut-hint\";\nimport { FLOATING_LINE, GLASS, INK_ACTIVE, KIT_SCOPE, SURFACE_RAISED, TRAY } from \"./surfaces\";\nimport { MODAL_LAYER, TooltipLayer, TooltipRoot } from \"./tooltip-root\";\n\n/* Z-index scale: popover/menu 80 · modal overlay 60 / content 61 · sheet 55 · toast 100 · tooltip 90 */\n\n/** Base UI parts accept a className function; the kit takes plain strings so cn() can merge them. */\ntype Cls<P> = Omit<P, \"className\"> & { className?: string };\nconst layer = { [MODAL_LAYER]: \"\" };\n\n/* ── Dismiss guards (DESIGN.md §12) ──────────────────────────────────────────\n Every kit layer runs its close requests through keepOpen():\n - Escape owned by an inner list: an inner element that handles Escape calls event.preventDefault(); the layer\n keeps itself open. (Base UI's own nested layers already close innermost first.)\n - Floating layers portalled outside (an editor's selection toolbar, a slash menu) carry data-floating-layer:\n a press there counts as inside, so it never dismisses the layer underneath.\n - A press on a popover's anchor (the input a list hangs off) counts as inside. */\ntype CloseDetails = { reason: string; event: Event; cancel: () => void };\nexport const FLOATING_LAYER = \"[data-floating-layer]\";\nfunction keepOpen(details: CloseDetails, anchor?: Element | null) {\n const target = details.event?.target;\n const keep =\n (details.reason === \"escape-key\" && details.event.defaultPrevented) ||\n (details.reason === \"outside-press\" &&\n target instanceof Element &&\n (!!target.closest(FLOATING_LAYER) || !!anchor?.contains(target)));\n if (keep) details.cancel();\n return keep;\n}\nfunction guard<D extends CloseDetails>(onOpenChange: ((open: boolean, d: D) => void) | undefined, anchor?: () => Element | null) {\n return (open: boolean, details: D) => {\n if (!open && keepOpen(details, anchor?.())) return;\n onOpenChange?.(open, details);\n };\n}\n\n/* ── Tooltip ───────────────────────────────────────────────────────────── */\nexport const TooltipProvider = TooltipPrimitive.Provider;\nexport function Tooltip({\n content,\n children,\n side = \"top\",\n shortcut,\n delay = 350,\n disabled,\n}: {\n content: React.ReactNode;\n /** the trigger: one element that forwards its ref and spreads props */\n children: React.ReactElement;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** a key hint (D44): shown only while keyboard hints are on */\n shortcut?: string;\n delay?: number;\n disabled?: boolean;\n}) {\n const hints = useShortcutHints();\n if (disabled || !content) return <TooltipScope.Provider value>{children}</TooltipScope.Provider>;\n return (\n <TooltipScope.Provider value>\n <TooltipRoot>\n <TooltipPrimitive.Trigger delay={delay} render={children} />\n {/* Fixed max width: long text (truncated titles, help) wraps into a calm block instead of a viewport-wide strip. */}\n <TooltipLayer side={side}>\n <span className=\"line-clamp-[8] min-w-0 whitespace-normal [overflow-wrap:anywhere]\">{content}</span>\n {shortcut && hints ? (\n <kbd data-hint=\"shortcuts\" className={cn(\"mt-px shrink-0 rounded-kit-sm px-1 font-kit-sans text-kit-2xs\", INK_ACTIVE)}>\n {shortcut}\n </kbd>\n ) : null}\n </TooltipLayer>\n </TooltipRoot>\n </TooltipScope.Provider>\n );\n}\n\n/* ── Popover ───────────────────────────────────────────────────────────── */\nconst AnchorContext = React.createContext<React.RefObject<HTMLElement | null> | null>(null);\n\nexport function Popover({ onOpenChange, ...props }: PopoverPrimitive.Root.Props) {\n const anchor = React.useRef<HTMLElement | null>(null);\n return (\n <AnchorContext.Provider value={anchor}>\n <PopoverPrimitive.Root {...props} onOpenChange={guard(onOpenChange, () => anchor.current)} />\n </AnchorContext.Provider>\n );\n}\nexport const PopoverTrigger = PopoverPrimitive.Trigger;\nexport const PopoverClose = PopoverPrimitive.Close;\n\n/** Positions the popover against this element instead of the trigger; presses on it count as inside. */\nexport function PopoverAnchor({ render, ...props }: useRender.ComponentProps<\"div\">) {\n const anchor = React.useContext(AnchorContext);\n return useRender({ render: render ?? <div />, ref: anchor ?? undefined, props });\n}\n\nexport function PopoverContent({\n className,\n align = \"start\",\n side,\n sideOffset = 6,\n keepFocus,\n onMouseDown,\n collisionBoundary,\n collisionPadding = 12,\n collisionAvoidance,\n ...props\n}: Cls<PopoverPrimitive.Popup.Props> & {\n align?: \"start\" | \"center\" | \"end\";\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n sideOffset?: number;\n /** keep the popup inside this area (e.g. the scrolling panel under a sticky header) instead of the viewport */\n collisionBoundary?: PopoverPrimitive.Positioner.Props[\"collisionBoundary\"];\n collisionPadding?: PopoverPrimitive.Positioner.Props[\"collisionPadding\"];\n /** e.g. `{ align: \"shift\" }`: slide along the edge to fit instead of flipping start ↔ end (V2's Radix behaviour) */\n collisionAvoidance?: PopoverPrimitive.Positioner.Props[\"collisionAvoidance\"];\n /** §12 no-focus-steal: typing stays in the input the list hangs off. The popup takes no focus on open, gives none\n * back on close, and a mouse-down inside it never blurs the input (text fields inside the popup still focus). */\n keepFocus?: boolean;\n}) {\n const anchor = React.useContext(AnchorContext);\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align={align}\n side={side}\n sideOffset={sideOffset}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n anchor={anchor?.current ? anchor : undefined}\n className=\"z-[80]\"\n {...KIT_SCOPE}\n >\n <PopoverPrimitive.Popup\n initialFocus={keepFocus ? false : undefined}\n finalFocus={keepFocus ? false : undefined}\n onMouseDown={(e) => {\n onMouseDown?.(e);\n if (keepFocus && !(e.target as Element).closest(\"input, textarea, select, [contenteditable=true]\")) e.preventDefault();\n }}\n className={cn(GLASS, \"w-72 max-w-[calc(100vw-24px)] rounded-kit-xl border p-3 text-kit-fg outline-none data-[open]:animate-kit-pop-in\", className)}\n {...props}\n />\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n );\n}\n\n/* ── Hover card ────────────────────────────────────────────────────────── */\nexport const HoverCard = PreviewCardPrimitive.Root;\nexport const HoverCardTrigger = PreviewCardPrimitive.Trigger;\nexport function HoverCardContent({ className, ...props }: Cls<PreviewCardPrimitive.Popup.Props>) {\n return (\n <PreviewCardPrimitive.Portal>\n <PreviewCardPrimitive.Positioner sideOffset={8} collisionPadding={12} className=\"z-[80]\" {...KIT_SCOPE}>\n <PreviewCardPrimitive.Popup\n className={cn(GLASS, \"w-72 rounded-kit-xl border p-3 data-[open]:animate-kit-pop-in\", className)}\n {...props}\n />\n </PreviewCardPrimitive.Positioner>\n </PreviewCardPrimitive.Portal>\n );\n}\n\n/* ── Dropdown menu ─────────────────────────────────────────────────────── */\n/** Arrowing past the last item stays put (loopFocus false), like V2's Radix menus. */\nexport function Menu({ onOpenChange, loopFocus = false, ...props }: MenuPrimitive.Root.Props) {\n return <MenuPrimitive.Root loopFocus={loopFocus} {...props} onOpenChange={guard(onOpenChange)} />;\n}\nexport const MenuTrigger = MenuPrimitive.Trigger;\nexport const MenuGroup = MenuPrimitive.Group;\nexport const MenuSub = MenuPrimitive.SubmenuRoot;\nexport const MenuRadioGroup = MenuPrimitive.RadioGroup;\n\nexport function MenuContent({\n className,\n align = \"start\",\n side,\n sideOffset = 6,\n ...props\n}: Cls<MenuPrimitive.Popup.Props> & {\n align?: \"start\" | \"center\" | \"end\";\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n sideOffset?: number;\n}) {\n return (\n <MenuPrimitive.Portal>\n <MenuPrimitive.Positioner align={align} side={side} sideOffset={sideOffset} collisionPadding={12} className=\"z-[80]\" {...KIT_SCOPE}>\n <MenuPrimitive.Popup\n {...layer}\n className={cn(GLASS, \"min-w-48 overflow-hidden rounded-kit-lg border p-1 text-kit-fg outline-none data-[open]:animate-kit-pop-in\", className)}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\n\nconst itemCls =\n \"relative flex h-8 cursor-pointer select-none items-center gap-2 rounded-kit-md px-2 text-kit-sm text-kit-fg outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-40 data-[highlighted]:bg-kit-hover [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-kit-fg-2\";\n\nexport function MenuItem({\n className,\n icon,\n shortcut,\n danger,\n children,\n ...props\n}: Cls<MenuPrimitive.Item.Props> & { icon?: React.ReactNode; shortcut?: string; danger?: boolean }) {\n return (\n <MenuPrimitive.Item\n className={cn(itemCls, danger && \"text-kit-danger-fg data-[highlighted]:bg-kit-danger-soft [&>svg]:text-kit-danger-fg\", className)}\n {...props}\n >\n {icon}\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n {/* menu shortcut columns are not hints (D44): they always show */}\n {shortcut ? <span className=\"text-kit-xs text-kit-fg-3\">{shortcut}</span> : null}\n </MenuPrimitive.Item>\n );\n}\n\n/** Checking an item closes the menu, like V2's Radix items (pass closeOnClick={false} to keep it open). */\nexport function MenuCheckItem({ className, children, closeOnClick = true, ...props }: Cls<MenuPrimitive.CheckboxItem.Props>) {\n return (\n <MenuPrimitive.CheckboxItem className={cn(itemCls, \"pr-8\", className)} closeOnClick={closeOnClick} {...props}>\n {children}\n <MenuPrimitive.CheckboxItemIndicator className=\"absolute right-2\">\n <IconCheck className=\"size-4\" />\n </MenuPrimitive.CheckboxItemIndicator>\n </MenuPrimitive.CheckboxItem>\n );\n}\n\nexport function MenuRadioItem({ className, children, closeOnClick = true, ...props }: Cls<MenuPrimitive.RadioItem.Props>) {\n return (\n <MenuPrimitive.RadioItem className={cn(itemCls, \"pr-8\", className)} closeOnClick={closeOnClick} {...props}>\n {children}\n <MenuPrimitive.RadioItemIndicator className=\"absolute right-2\">\n <IconCheck className=\"size-4\" />\n </MenuPrimitive.RadioItemIndicator>\n </MenuPrimitive.RadioItem>\n );\n}\n\nexport function MenuSubTrigger({\n className,\n icon,\n children,\n ...props\n}: Cls<MenuPrimitive.SubmenuTrigger.Props> & { icon?: React.ReactNode }) {\n return (\n <MenuPrimitive.SubmenuTrigger className={cn(itemCls, \"data-[popup-open]:bg-kit-hover\", className)} {...props}>\n {icon}\n <span className=\"flex-1\">{children}</span>\n <IconChevronRight className=\"size-3.5 text-kit-fg-3\" />\n </MenuPrimitive.SubmenuTrigger>\n );\n}\nexport function MenuSubContent({ className, ...props }: Cls<MenuPrimitive.Popup.Props>) {\n return (\n <MenuPrimitive.Portal>\n <MenuPrimitive.Positioner sideOffset={6} collisionPadding={12} className=\"z-[81]\" {...KIT_SCOPE}>\n <MenuPrimitive.Popup\n className={cn(GLASS, \"min-w-44 rounded-kit-lg border p-1 text-kit-fg outline-none data-[open]:animate-kit-pop-in\", className)}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\nexport function MenuLabel({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"px-2 pb-1 pt-1.5 text-kit-xs font-medium text-kit-fg-3\", className)} {...props} />;\n}\nexport function MenuSeparator({ className }: { className?: string }) {\n return <Separator className={cn(\"-mx-1 my-1 h-px bg-kit-line\", className)} />;\n}\n\n/* ── Focus return (a11y) ───────────────────────────────────────────────────\n A dialog library remembers the focused element when the dialog opens and refocuses it on close. When a field\n inside autofocuses, that element is already the field, so focus fell to <body> on close. We keep the last few\n focused elements and hand focus back to the real trigger: the newest one that is outside the popup and still\n in the document. Without one, the library's default applies. */\nconst recent: HTMLElement[] = [];\nif (typeof document !== \"undefined\") {\n document.addEventListener(\n \"focusin\",\n (e) => {\n recent.unshift(e.target as HTMLElement);\n recent.length = Math.min(recent.length, 4);\n },\n true,\n );\n}\ntype FinalFocus = DialogPrimitive.Popup.Props[\"finalFocus\"];\nexport function useFocusReturn(finalFocus?: FinalFocus): {\n ref: (el: HTMLElement | null) => void;\n finalFocus: NonNullable<FinalFocus>;\n} {\n const ret = React.useRef<HTMLElement | null>(null);\n const popup = React.useRef<HTMLElement | null>(null);\n const ref = React.useCallback((el: HTMLElement | null) => {\n // Capture once per open (per popup element). A callback ref can be called again on a re-render while open, when\n // focus is already inside the popup and the trigger may have dropped out of `recent`.\n if (el === popup.current) return;\n popup.current = el;\n if (!el) return;\n const active = document.activeElement as HTMLElement | null;\n const outside = (n: HTMLElement | null): n is HTMLElement => !!n && n !== document.body && !el.contains(n);\n ret.current = outside(active) ? active : (recent.find(outside) ?? null);\n }, []);\n return {\n ref,\n finalFocus:\n finalFocus ??\n (() => {\n const t = ret.current;\n return t && t.isConnected ? t : true;\n }),\n };\n}\n\n/** One stable callback ref for both refs, so React does not detach and re-attach them on every render. */\nfunction useMergedRef<T>(a: React.Ref<T> | undefined, b: React.Ref<T> | undefined) {\n return React.useCallback(\n (el: T | null) => {\n for (const r of [a, b]) {\n if (typeof r === \"function\") r(el);\n else if (r) (r as React.RefObject<T | null>).current = el;\n }\n },\n [a, b],\n );\n}\n\n/* ── Modal (Dialog) ────────────────────────────────────────────────────── */\nexport function Modal({ onOpenChange, ...props }: DialogPrimitive.Root.Props) {\n return <DialogPrimitive.Root {...props} onOpenChange={guard(onOpenChange)} />;\n}\nexport const ModalTrigger = DialogPrimitive.Trigger;\nexport const ModalClose = DialogPrimitive.Close;\n\nconst sizes = {\n sm: \"max-w-[400px]\",\n md: \"max-w-[480px]\",\n lg: \"max-w-[640px]\",\n xl: \"max-w-[800px]\",\n full: \"max-w-[min(1280px,calc(100vw-48px))] h-[min(860px,calc(100vh-48px))]\",\n};\n\nexport function ModalContent({\n className,\n size = \"md\",\n children,\n hideClose,\n finalFocus,\n ref,\n ...props\n}: Cls<DialogPrimitive.Popup.Props> & { size?: keyof typeof sizes; hideClose?: boolean }) {\n const focusReturn = useFocusReturn(finalFocus);\n const merged = useMergedRef(ref, focusReturn.ref);\n return (\n <DialogPrimitive.Portal>\n <DialogPrimitive.Backdrop\n {...KIT_SCOPE}\n className=\"fixed inset-0 z-[60] bg-kit-overlay backdrop-blur-[2px] data-[open]:animate-kit-fade-in\"\n />\n <div {...KIT_SCOPE} className=\"pointer-events-none fixed inset-0 z-[61] flex items-center justify-center p-4 sm:p-6\">\n <DialogPrimitive.Popup\n {...layer}\n className={cn(\n \"pointer-events-auto relative flex max-h-[calc(100vh-32px)] w-full flex-col overflow-hidden rounded-kit-xl border text-kit-fg shadow-kit-xl outline-none data-[open]:animate-kit-pop-in\",\n FLOATING_LINE,\n SURFACE_RAISED,\n sizes[size],\n className,\n )}\n {...props}\n ref={merged}\n finalFocus={focusReturn.finalFocus}\n >\n {children}\n {hideClose ? null : (\n <DialogPrimitive.Close render={<IconButton label=\"Close\" size=\"sm\" className=\"absolute right-3 top-3 z-10\" />}>\n <IconX />\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Popup>\n </div>\n </DialogPrimitive.Portal>\n );\n}\n\nexport function ModalHeader({\n title,\n description,\n className,\n children,\n}: {\n title: React.ReactNode;\n description?: React.ReactNode;\n /** D15: no icon tiles in dialog headers (accepted for compatibility, intentionally not rendered) */\n icon?: React.ReactNode;\n className?: string;\n children?: React.ReactNode;\n}) {\n return (\n <div className={cn(\"flex shrink-0 items-start gap-2.5 px-5 pb-1 pt-5 pr-12\", className)}>\n <div className=\"min-w-0 flex-1\">\n <DialogPrimitive.Title className=\"text-kit-md font-semibold tracking-[-0.01em] text-kit-fg\">{title}</DialogPrimitive.Title>\n {description ? (\n <DialogPrimitive.Description className=\"mt-1 text-kit-sm text-kit-fg-2\">{description}</DialogPrimitive.Description>\n ) : (\n <DialogPrimitive.Description className=\"sr-only\">{typeof title === \"string\" ? title : \"Dialog\"}</DialogPrimitive.Description>\n )}\n {children}\n </div>\n </div>\n );\n}\nexport function ModalBody({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"min-h-0 flex-1 overflow-y-auto px-5 pb-5 pt-4\", className)} {...props} />;\n}\nexport function ModalFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"flex shrink-0 items-center justify-end gap-2 border-t px-5 py-3\", TRAY /* action tray (Figma 61014:66265) */, className)}\n {...props}\n />\n );\n}\n\n/* ── Sheet (side or bottom drawer) ─────────────────────────────────────── */\n/** A sheet is a dialog that slides in from an edge: open it with Sheet (= Modal) and its trigger. */\nexport const Sheet = Modal;\nexport const SheetTrigger = DialogPrimitive.Trigger;\nexport const SheetClose = DialogPrimitive.Close;\nconst sheetSides = {\n // V2: the sheet-in keyframe (24px slide + fade, 260ms ease-out-soft) on open; no exit motion\n right: \"inset-y-0 right-0 border-l data-[open]:animate-[kit-sheet-in-r_260ms_var(--kit-ease-out-soft)]\",\n left: \"inset-y-0 left-0 border-r data-[open]:animate-[kit-sheet-in-l_260ms_var(--kit-ease-out-soft)]\",\n // V2 TabletSheet / CommentsSheet / HistorySheet (editor.tsx:443-513): 52% tall, rounded-t-2xl, border-t, rises from\n // y 100% (V2's spring 420/42 settles in ~300ms with no overshoot; the drawer curve matches it without a motion import)\n bottom:\n \"inset-x-0 bottom-0 h-[52%] overflow-hidden rounded-t-kit-2xl border-t data-[open]:animate-[kit-sheet-in-b_300ms_cubic-bezier(0.32,0.72,0,1)]\",\n} as const;\nexport function SheetContent({\n className,\n side = \"right\",\n children,\n width = 440,\n label = \"Panel\",\n noScrim = false,\n finalFocus,\n ref,\n style,\n backdropClassName,\n keepMounted = false,\n ...props\n}: Cls<DialogPrimitive.Popup.Props> & {\n side?: keyof typeof sheetSides;\n /** side sheets only: the panel width in px (a bottom sheet spans the viewport) */\n width?: number;\n /** the dialog's accessible name (V2's tablet inspector sheet is \"Inspector\") */\n label?: string;\n /** no backdrop: the page behind stays visible and, with <Sheet modal={false}>, live (V2's Comments and History sheets) */\n noScrim?: boolean;\n style?: React.CSSProperties;\n /** extra classes for the backdrop, a sibling portal: a host that themes its own scope (light/dark) passes the same class here */\n backdropClassName?: string;\n /** keep the content mounted (hidden) while closed: a host whose content holds live state, like the editor's inspector */\n keepMounted?: boolean;\n}) {\n const focusReturn = useFocusReturn(finalFocus);\n const merged = useMergedRef(ref, focusReturn.ref);\n const bottom = side === \"bottom\";\n return (\n <DialogPrimitive.Portal keepMounted={keepMounted}>\n {noScrim ? null : (\n <DialogPrimitive.Backdrop {...KIT_SCOPE} className={cn(\"fixed inset-0 z-[55] bg-kit-overlay data-[open]:animate-kit-fade-in\", backdropClassName)} />\n )}\n <DialogPrimitive.Popup\n {...KIT_SCOPE}\n {...layer}\n style={bottom ? style : { width: `min(${width}px, 100vw)`, ...style }}\n className={cn(\n \"fixed z-[56] flex flex-col text-kit-fg shadow-kit-xl outline-none transition-transform motion-reduce:animate-none\",\n SURFACE_RAISED,\n // V2's cn() lets the later border-line win over border-floating-line: the sheet edge is --line in both themes\n \"border-kit-line\",\n sheetSides[side],\n className,\n )}\n {...props}\n ref={merged}\n finalFocus={focusReturn.finalFocus}\n >\n <DialogPrimitive.Title className=\"sr-only\">{label}</DialogPrimitive.Title>\n <DialogPrimitive.Description className=\"sr-only\">{bottom ? \"Bottom panel\" : \"Side panel\"}</DialogPrimitive.Description>\n {bottom ? (\n <div aria-hidden className=\"flex shrink-0 justify-center pt-2\">\n <span data-sheet-grabber className=\"h-1 w-10 rounded-full bg-kit-line-strong\" />\n </div>\n ) : null}\n {children}\n </DialogPrimitive.Popup>\n </DialogPrimitive.Portal>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,IAAM,QAAQ,GAAG,cAAc,IAAI;AAUnC,IAAa,iBAAiB;AAC9B,SAAS,SAAS,SAAuB,QAAyB;CAChE,MAAM,SAAS,QAAQ,OAAO;CAC9B,MAAM,OACH,QAAQ,WAAW,gBAAgB,QAAQ,MAAM,oBACjD,QAAQ,WAAW,mBAClB,kBAAkB,YACjB,CAAC,CAAC,OAAO,QAAA,wBAAuB,IAAI,CAAC,CAAC,QAAQ,SAAS,OAAO;AACnE,KAAI,KAAM,SAAQ,QAAQ;AAC1B,QAAO;;AAET,SAAS,MAA8B,cAA2D,QAA+B;AAC/H,SAAQ,MAAe,YAAe;AACpC,MAAI,CAAC,QAAQ,SAAS,SAAS,UAAU,CAAC,CAAE;AAC5C,iBAAe,MAAM,QAAQ;;;AAKjC,IAAa,kBAAkB,QAAiB;AAChD,SAAgB,UAAQ,EACtB,SACA,UACA,OAAO,OACP,UACA,QAAQ,KACR,YAUC;CACD,MAAM,QAAQ,kBAAkB;AAChC,KAAI,YAAY,CAAC,QAAS,QAAO,oBAAC,aAAa,UAAd;EAAuB,OAAA;EAAO;EAAiC,CAAA;AAChG,QACE,oBAAC,aAAa,UAAd;EAAuB,OAAA;YACrB,qBAAC,aAAD,EAAA,UAAA,CACE,oBAAC,QAAiB,SAAlB;GAAiC;GAAO,QAAQ;GAAY,CAAA,EAE5D,qBAAC,cAAD;GAAoB;aAApB,CACE,oBAAC,QAAD;IAAM,WAAU;cAAqE;IAAe,CAAA,EACnG,YAAY,QACX,oBAAC,OAAD;IAAK,aAAU;IAAY,WAAW,GAAG,iEAAiE,WAAW;cAClH;IACG,CAAA,GACJ,KACS;KACH,EAAA,CAAA;EACQ,CAAA;;AAK5B,IAAM,gBAAgB,MAAM,cAA0D,KAAK;AAE3F,SAAgB,UAAQ,EAAE,cAAc,GAAG,SAAsC;CAC/E,MAAM,SAAS,MAAM,OAA2B,KAAK;AACrD,QACE,oBAAC,cAAc,UAAf;EAAwB,OAAO;YAC7B,oBAAC,QAAiB,MAAlB;GAAuB,GAAI;GAAO,cAAc,MAAM,oBAAoB,OAAO,QAAQ;GAAI,CAAA;EACtE,CAAA;;AAG7B,IAAa,iBAAiB,QAAiB;AAC/C,IAAa,eAAe,QAAiB;;AAG7C,SAAgB,cAAc,EAAE,QAAQ,GAAG,SAA0C;CACnF,MAAM,SAAS,MAAM,WAAW,cAAc;AAC9C,QAAO,UAAU;EAAE,QAAQ,UAAU,oBAAC,OAAD,EAAO,CAAA;EAAE,KAAK,UAAU,KAAA;EAAW;EAAO,CAAC;;AAGlF,SAAgB,eAAe,EAC7B,WACA,QAAQ,SACR,MACA,aAAa,GACb,WACA,aACA,mBACA,mBAAmB,IACnB,oBACA,GAAG,SAaF;CACD,MAAM,SAAS,MAAM,WAAW,cAAc;AAC9C,QACE,oBAAC,QAAiB,QAAlB,EAAA,UACE,oBAAC,QAAiB,YAAlB;EACS;EACD;EACM;EACO;EACD;EACE;EACpB,QAAQ,QAAQ,UAAU,SAAS,KAAA;EACnC,WAAU;EACV,GAAI;YAEJ,oBAAC,QAAiB,OAAlB;GACE,cAAc,YAAY,QAAQ,KAAA;GAClC,YAAY,YAAY,QAAQ,KAAA;GAChC,cAAc,MAAM;AAClB,kBAAc,EAAE;AAChB,QAAI,aAAa,CAAE,EAAE,OAAmB,QAAQ,kDAAkD,CAAE,GAAE,gBAAgB;;GAExH,WAAW,GAAG,OAAO,mHAAmH,UAAU;GAClJ,GAAI;GACJ,CAAA;EAC0B,CAAA,EACN,CAAA;;AAK9B,IAAa,YAAY,YAAqB;AAC9C,IAAa,mBAAmB,YAAqB;AACrD,SAAgB,iBAAiB,EAAE,WAAW,GAAG,SAAgD;AAC/F,QACE,oBAAC,YAAqB,QAAtB,EAAA,UACE,oBAAC,YAAqB,YAAtB;EAAiC,YAAY;EAAG,kBAAkB;EAAI,WAAU;EAAS,GAAI;YAC3F,oBAAC,YAAqB,OAAtB;GACE,WAAW,GAAG,OAAO,iEAAiE,UAAU;GAChG,GAAI;GACJ,CAAA;EAC8B,CAAA,EACN,CAAA;;;AAMlC,SAAgB,OAAK,EAAE,cAAc,YAAY,OAAO,GAAG,SAAmC;AAC5F,QAAO,oBAAC,KAAc,MAAf;EAA+B;EAAW,GAAI;EAAO,cAAc,MAAM,aAAa;EAAI,CAAA;;AAEnG,IAAa,cAAc,KAAc;AACzC,IAAa,YAAY,KAAc;AACvC,IAAa,UAAU,KAAc;AACrC,IAAa,iBAAiB,KAAc;AAE5C,SAAgB,YAAY,EAC1B,WACA,QAAQ,SACR,MACA,aAAa,GACb,GAAG,SAKF;AACD,QACE,oBAAC,KAAc,QAAf,EAAA,UACE,oBAAC,KAAc,YAAf;EAAiC;EAAa;EAAkB;EAAY,kBAAkB;EAAI,WAAU;EAAS,GAAI;YACvH,oBAAC,KAAc,OAAf;GACE,GAAI;GACJ,WAAW,GAAG,OAAO,8GAA8G,UAAU;GAC7I,GAAI;GACJ,CAAA;EACuB,CAAA,EACN,CAAA;;AAI3B,IAAM,UACJ;AAEF,SAAgB,SAAS,EACvB,WACA,MACA,UACA,QACA,UACA,GAAG,SAC+F;AAClG,QACE,qBAAC,KAAc,MAAf;EACE,WAAW,GAAG,SAAS,UAAU,uFAAuF,UAAU;EAClI,GAAI;YAFN;GAIG;GACD,oBAAC,QAAD;IAAM,WAAU;IAA2B;IAAgB,CAAA;GAE1D,WAAW,oBAAC,QAAD;IAAM,WAAU;cAA6B;IAAgB,CAAA,GAAG;GACzD;;;;AAKzB,SAAgB,cAAc,EAAE,WAAW,UAAU,eAAe,MAAM,GAAG,SAAgD;AAC3H,QACE,qBAAC,KAAc,cAAf;EAA4B,WAAW,GAAG,SAAS,QAAQ,UAAU;EAAgB;EAAc,GAAI;YAAvG,CACG,UACD,oBAAC,KAAc,uBAAf;GAAqC,WAAU;aAC7C,oBAAC,WAAD,EAAW,WAAU,UAAW,CAAA;GACI,CAAA,CACX;;;AAIjC,SAAgB,cAAc,EAAE,WAAW,UAAU,eAAe,MAAM,GAAG,SAA6C;AACxH,QACE,qBAAC,KAAc,WAAf;EAAyB,WAAW,GAAG,SAAS,QAAQ,UAAU;EAAgB;EAAc,GAAI;YAApG,CACG,UACD,oBAAC,KAAc,oBAAf;GAAkC,WAAU;aAC1C,oBAAC,WAAD,EAAW,WAAU,UAAW,CAAA;GACC,CAAA,CACX;;;AAI9B,SAAgB,eAAe,EAC7B,WACA,MACA,UACA,GAAG,SACoE;AACvE,QACE,qBAAC,KAAc,gBAAf;EAA8B,WAAW,GAAG,SAAS,kCAAkC,UAAU;EAAE,GAAI;YAAvG;GACG;GACD,oBAAC,QAAD;IAAM,WAAU;IAAU;IAAgB,CAAA;GAC1C,oBAAC,kBAAD,EAAkB,WAAU,0BAA2B,CAAA;GAC1B;;;AAGnC,SAAgB,eAAe,EAAE,WAAW,GAAG,SAAyC;AACtF,QACE,oBAAC,KAAc,QAAf,EAAA,UACE,oBAAC,KAAc,YAAf;EAA0B,YAAY;EAAG,kBAAkB;EAAI,WAAU;EAAS,GAAI;YACpF,oBAAC,KAAc,OAAf;GACE,WAAW,GAAG,OAAO,8FAA8F,UAAU;GAC7H,GAAI;GACJ,CAAA;EACuB,CAAA,EACN,CAAA;;AAG3B,SAAgB,UAAU,EAAE,WAAW,GAAG,SAA+C;AACvF,QAAO,oBAAC,OAAD;EAAK,WAAW,GAAG,0DAA0D,UAAU;EAAE,GAAI;EAAS,CAAA;;AAE/G,SAAgB,cAAc,EAAE,aAAqC;AACnE,QAAO,oBAAC,WAAD,EAAW,WAAW,GAAG,+BAA+B,UAAU,EAAI,CAAA;;AAQ/E,IAAM,SAAwB,EAAE;AAChC,IAAI,OAAO,aAAa,YACtB,UAAS,iBACP,YACC,MAAM;AACL,QAAO,QAAQ,EAAE,OAAsB;AACvC,QAAO,SAAS,KAAK,IAAI,OAAO,QAAQ,EAAE;GAE5C,KACD;AAGH,SAAgB,eAAe,YAG7B;CACA,MAAM,MAAM,MAAM,OAA2B,KAAK;CAClD,MAAM,QAAQ,MAAM,OAA2B,KAAK;AAWpD,QAAO;EACL,KAXU,MAAM,aAAa,OAA2B;AAGxD,OAAI,OAAO,MAAM,QAAS;AAC1B,SAAM,UAAU;AAChB,OAAI,CAAC,GAAI;GACT,MAAM,SAAS,SAAS;GACxB,MAAM,WAAW,MAA4C,CAAC,CAAC,KAAK,MAAM,SAAS,QAAQ,CAAC,GAAG,SAAS,EAAE;AAC1G,OAAI,UAAU,QAAQ,OAAO,GAAG,SAAU,OAAO,KAAK,QAAQ,IAAI;KACjE,EAAE,CAAC;EAGJ,YACE,qBACO;GACL,MAAM,IAAI,IAAI;AACd,UAAO,KAAK,EAAE,cAAc,IAAI;;EAErC;;;AAIH,SAAS,aAAgB,GAA6B,GAA6B;AACjF,QAAO,MAAM,aACV,OAAiB;AAChB,OAAK,MAAM,KAAK,CAAC,GAAG,EAAE,CACpB,KAAI,OAAO,MAAM,WAAY,GAAE,GAAG;WACzB,EAAI,GAAgC,UAAU;IAG3D,CAAC,GAAG,EAAE,CACP;;AAIH,SAAgB,MAAM,EAAE,cAAc,GAAG,SAAqC;AAC5E,QAAO,oBAAC,OAAgB,MAAjB;EAAsB,GAAI;EAAO,cAAc,MAAM,aAAa;EAAI,CAAA;;AAE/E,IAAa,eAAe,OAAgB;AAC5C,IAAa,aAAa,OAAgB;AAE1C,IAAM,QAAQ;CACZ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM;CACP;AAED,SAAgB,aAAa,EAC3B,WACA,OAAO,MACP,UACA,WACA,YACA,KACA,GAAG,SACqF;CACxF,MAAM,cAAc,eAAe,WAAW;CAC9C,MAAM,SAAS,aAAa,KAAK,YAAY,IAAI;AACjD,QACE,qBAAC,OAAgB,QAAjB,EAAA,UAAA,CACE,oBAAC,OAAgB,UAAjB;EACE,GAAI;EACJ,WAAU;EACV,CAAA,EACF,oBAAC,OAAD;EAAK,GAAI;EAAW,WAAU;YAC5B,qBAAC,OAAgB,OAAjB;GACE,GAAI;GACJ,WAAW,GACT,0LACA,eACA,gBACA,MAAM,OACN,UACD;GACD,GAAI;GACJ,KAAK;GACL,YAAY,YAAY;aAX1B,CAaG,UACA,YAAY,OACX,oBAAC,OAAgB,OAAjB;IAAuB,QAAQ,oBAAC,YAAD;KAAY,OAAM;KAAQ,MAAK;KAAK,WAAU;KAAgC,CAAA;cAC3G,oBAAC,OAAD,EAAS,CAAA;IACa,CAAA,CAEJ;;EACpB,CAAA,CACiB,EAAA,CAAA;;AAI7B,SAAgB,YAAY,EAC1B,OACA,aACA,WACA,YAQC;AACD,QACE,oBAAC,OAAD;EAAK,WAAW,GAAG,0DAA0D,UAAU;YACrF,qBAAC,OAAD;GAAK,WAAU;aAAf;IACE,oBAAC,OAAgB,OAAjB;KAAuB,WAAU;eAA4D;KAA8B,CAAA;IAC1H,cACC,oBAAC,OAAgB,aAAjB;KAA6B,WAAU;eAAkC;KAA0C,CAAA,GAEnH,oBAAC,OAAgB,aAAjB;KAA6B,WAAU;eAAW,OAAO,UAAU,WAAW,QAAQ;KAAuC,CAAA;IAE9H;IACG;;EACF,CAAA;;AAGV,SAAgB,UAAU,EAAE,WAAW,GAAG,SAA+C;AACvF,QAAO,oBAAC,OAAD;EAAK,WAAW,GAAG,iDAAiD,UAAU;EAAE,GAAI;EAAS,CAAA;;AAEtG,SAAgB,YAAY,EAAE,WAAW,GAAG,SAA+C;AACzF,QACE,oBAAC,OAAD;EACE,WAAW,GAAG,mEAAmE,MAA4C,UAAU;EACvI,GAAI;EACJ,CAAA;;;AAMN,IAAa,QAAQ;AACrB,IAAa,eAAe,OAAgB;AAC5C,IAAa,aAAa,OAAgB;AAC1C,IAAM,aAAa;CAEjB,OAAO;CACP,MAAM;CAGN,QACE;CACH;AACD,SAAgB,aAAa,EAC3B,WACA,OAAO,SACP,UACA,QAAQ,KACR,QAAQ,SACR,UAAU,OACV,YACA,KACA,OACA,mBACA,cAAc,OACd,GAAG,SAcF;CACD,MAAM,cAAc,eAAe,WAAW;CAC9C,MAAM,SAAS,aAAa,KAAK,YAAY,IAAI;CACjD,MAAM,SAAS,SAAS;AACxB,QACE,qBAAC,OAAgB,QAAjB;EAAqC;YAArC,CACG,UAAU,OACT,oBAAC,OAAgB,UAAjB;GAA0B,GAAI;GAAW,WAAW,GAAG,uEAAuE,kBAAkB;GAAI,CAAA,EAEtJ,qBAAC,OAAgB,OAAjB;GACE,GAAI;GACJ,GAAI;GACJ,OAAO,SAAS,QAAQ;IAAE,OAAO,OAAO,MAAM;IAAa,GAAG;IAAO;GACrE,WAAW,GACT,qHACA,gBAEA,mBACA,WAAW,OACX,UACD;GACD,GAAI;GACJ,KAAK;GACL,YAAY,YAAY;aAd1B;IAgBE,oBAAC,OAAgB,OAAjB;KAAuB,WAAU;eAAW;KAA8B,CAAA;IAC1E,oBAAC,OAAgB,aAAjB;KAA6B,WAAU;eAAW,SAAS,iBAAiB;KAA2C,CAAA;IACtH,SACC,oBAAC,OAAD;KAAK,eAAA;KAAY,WAAU;eACzB,oBAAC,QAAD;MAAM,sBAAA;MAAmB,WAAU;MAA6C,CAAA;KAC5E,CAAA,GACJ;IACH;IACqB;KACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"path-crumbs.js","names":[],"sources":["../../src/kit/ui/path-crumbs.tsx"],"sourcesContent":["/**\n * PATH CRUMBS (CPO D38): the one breadcrumb for every drill-in path: Visuals inspector, Block Kit drill-in,\n * nested documents, media details, the workspace top bar.\n *\n * <PathCrumbs items={[{ id, label, icon, onSelect }, …, current]} />\n *\n * Look (D38 v3): ancestors fg-3 with an invisible 4px-radius pill that appears on hover (bg-hover) and darkens while\n * pressed (bg-selected); the current item is fg/semibold with its icon, NO box; thin fg-4 chevrons flush between pills (6px from text);\n * the fold chip is a ghost crumb (\"Columns… +2 ⌄\") whose open state is bg-selected; keyboard-only neutral focus ring.\n *\n * Back (←) and current never collapse, and every visible crumb keeps READABLE TEXT (no icon-only crumbs). The trail\n * adapts to the width it ACTUALLY has (ResizeObserver on the nav + document.fonts.ready, not viewport breakpoints),\n * using space greedily; the first plan that fits wins:\n *\n * stage 0 everything at full length\n * stage 1 long labels shorten to their first words (~16ch, word boundary: \"Seasoning & care…\", \"Columns…\"):\n * middle items root side first, then the parent, then the root\n * stage 2 the middle folds, root side first, into ONE readable chip \"[▦] Columns… +2\" (its first folded level +\n * the count) that opens the Pathway popover; the immediate parent stays out of the fold\n * stage 3 the root joins the fold, then (last) the parent\n * last the current item middle-truncates (\"Seasoning…ail kit\"), full name in a tooltip\n *\n * Every variant is measured once in a hidden mirror and the stage is picked in a layout effect, so the first paint\n * is already right (no flicker, no layout jump). The Pathway popover lists the whole path as an indented tree\n * (↑↓ · Enter · Esc, focus returns to the chip). Siblings menus on crumbs were considered and left out (D6 calm).\n *\n * Links: a crumb with `to` renders through `linkAs` (default: a plain <a href>), so a host can pass its router's Link.\n */\nimport * as React from \"react\";\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\nimport { IconArrowLeft, IconChevronDown, IconChevronRight } from \"@tabler/icons-react\";\nimport { cn } from \"../lib/cn\";\nimport { IconButton } from \"./button\";\nimport { Menu, MenuContent, MenuTrigger, Tooltip } from \"./overlay\";\n\n/* ── Metrics: one 2/4/6/8 scale, two densities ─────────────────────────────────────────────\n * row text pill (h · px) icon gap separator back\n * sm 28 13/20 24 · 6 14 6 12 chevron (6 to text) 28\n * md 32 14/20 28 · 8 16 6 14 chevron (8 to text) 32\n * The chevron sits flush between pills, so the text-to-chevron distance IS the pill padding (one number to tune).\n * The pill is invisible at rest; hover = bg-hover, pressed = bg-selected, radius 4. Hit areas ≥ 24px. */\nconst METRICS = {\n sm: { row: \"h-7\", text: \"text-[13px] leading-5\", pill: \"h-6 px-1.5\", cur: \"pr-0.5\", gap: \"gap-1.5\", icon: \"[&_svg]:size-3.5\", sep: \"size-3\", back: \"sm\" as const },\n md: { row: \"h-8\", text: \"text-[14px] leading-5\", pill: \"h-7 px-2\", cur: \"pr-0.5\", gap: \"gap-1.5\", icon: \"[&_svg]:size-4\", sep: \"size-3.5\", back: \"md\" as const },\n};\n/** Ancestor / group pill: fg-3 at rest, a quiet pill on hover, darker while pressed, fg-4 + inert when it can't navigate. */\nconst PILL =\n \"inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap rounded-kit-sm text-kit-fg-3 transition-colors duration-100 hover:bg-kit-hover hover:text-kit-fg active:bg-kit-selected disabled:pointer-events-none disabled:text-kit-fg-4\";\n\nexport interface PathCrumb {\n /** stable key */\n id: string;\n label: string;\n /** type icon (16px glyph; sized by the crumb) */\n icon?: React.ReactNode;\n /** navigate here (ignored on the current item) */\n onSelect?: () => void;\n /** …or a link (rendered through PathCrumbs `linkAs`) */\n to?: string;\n /** a meaningful container (a block, a folder): may name the collapsed group (\"Columns +2\") */\n container?: boolean;\n /** red dot: something under this level has errors */\n errors?: number;\n}\n\nexport type PathCrumbLinkProps = React.AnchorHTMLAttributes<HTMLAnchorElement> & { to: string; ref?: React.Ref<HTMLAnchorElement> };\n\nfunction DefaultLink({ to, ...props }: PathCrumbLinkProps) {\n return <a href={to} {...props} />;\n}\n\nexport interface PathCrumbsProps {\n /** root → current; the last item is the current one */\n items: PathCrumb[];\n /** ← goes up one level. Default: the parent's onSelect/to. `false` hides it (top-bar style). */\n onBack?: (() => void) | false;\n /** tooltip/aria for ←, default \"Back to {parent}\" */\n backLabel?: string;\n /** a key hint in the ← tooltip, shown only while keyboard hints are on (D44) */\n backShortcut?: string;\n /** @deprecated (D38 v3): the current item is always text: weight + colour, never a box. Kept for call-site compat. */\n current?: \"chip\" | \"text\";\n /** nav aria-label */\n label?: string;\n size?: \"sm\" | \"md\";\n /** renders crumbs that have `to` (a router Link); must forward its ref and spread props. Default: <a href> */\n linkAs?: React.ComponentType<PathCrumbLinkProps>;\n className?: string;\n}\n\n/** Word-boundary shortening: the first 2–3 words that fit ~16ch (\"Seasoning & care kit\" → \"Seasoning & care…\",\n * \"Columns / Bento\" → \"Columns…\"). Never mid-word unless a single word is itself too long. */\nconst isJoiner = (w: string) => /^[/&·\\-–—|:,+]+$/.test(w);\nexport function clipWords(s: string, max = 16): string {\n const words = s.trim().split(/\\s+/);\n if (s.length <= 12 && words.length <= 2) return s;\n const out: string[] = [];\n for (let i = 0; i < words.length - 1; i++) {\n const next = [...out, words[i]].join(\" \");\n if (next.length > max) break;\n out.push(words[i]);\n }\n while (out.length && isJoiner(out[out.length - 1])) out.pop();\n if (!out.length) return words[0].length > max ? `${words[0].slice(0, max - 2)}…` : `${words[0]}…`;\n return `${out.join(\" \")}…`;\n}\nconst long = (s: string) => clipWords(s) !== s;\nconst clip = (s: string) => clipWords(s);\n\ntype Form = \"full\" | \"trunc\";\ntype Group = { start: number; end: number };\ntype Plan = { forms: Form[]; group: Group | null };\n\n/** Degradation order: the first plan that fits wins. Every visible crumb keeps readable text (no icon-only crumbs). */\nexport function plansFor(items: PathCrumb[]): Plan[] {\n const n = items.length;\n const plans: Plan[] = [];\n const forms: Form[] = items.map(() => \"full\");\n const push = (group: Group | null = null) => plans.push({ forms: [...forms], group: group ? { ...group } : null });\n push();\n if (n < 2) return plans;\n const parent = n - 2;\n const middle = Array.from({ length: Math.max(0, n - 2) }, (_, k) => k + 1); // 1 … n-2, root side first\n // 1 · long labels shorten to their first words: middle items root side first, then the parent, then the root\n for (const i of middle) if (i !== parent && long(items[i].label)) { forms[i] = \"trunc\"; push(); }\n if (parent >= 1 && long(items[parent].label)) { forms[parent] = \"trunc\"; push(); }\n if (long(items[0].label)) { forms[0] = \"trunc\"; push(); }\n // 2 · the middle folds, root side first, into ONE readable chip (\"Columns… +2\"); the parent stays out of it\n for (let end = 1; end <= parent - 1; end++) push({ start: 1, end });\n // 3 · the root joins the fold, then (last) the parent\n if (parent >= 1) push({ start: 0, end: parent - 1 });\n push({ start: 0, end: parent });\n return plans;\n}\n\n/** Keep the head and the tail: \"Seasoning wax & chainmail kit\" → \"Seasoning…mail kit\". */\nexport function middleEllipsis(text: string, maxPx: number, measure: (s: string) => number) {\n if (measure(text) <= maxPx) return text;\n let lo = 2;\n let hi = text.length - 1;\n let best = \"\";\n while (lo <= hi) {\n const keep = (lo + hi) >> 1;\n const head = Math.ceil(keep * 0.6);\n const s = `${text.slice(0, head).trimEnd()}…${text.slice(text.length - (keep - head)).trimStart()}`;\n if (measure(s) <= maxPx) { best = s; lo = keep + 1; } else hi = keep - 1;\n }\n return best || null;\n}\n\nlet canvas: HTMLCanvasElement | null = null;\nfunction textMeasurer(el: Element | null) {\n if (!el) return null;\n canvas ??= document.createElement(\"canvas\");\n let ctx: CanvasRenderingContext2D | null = null;\n try {\n ctx = canvas.getContext(\"2d\");\n } catch {\n return null; // no canvas (test DOM): skip the last-resort truncation\n }\n if (!ctx) return null;\n const cs = getComputedStyle(el);\n ctx.font = `${cs.fontStyle} ${cs.fontWeight} ${cs.fontSize} ${cs.fontFamily}`;\n return (s: string) => ctx.measureText(s).width;\n}\n\nexport function PathCrumbs({ items, onBack, backLabel, backShortcut, label = \"Breadcrumb\", size = \"sm\", linkAs: Link = DefaultLink, className }: PathCrumbsProps) {\n const n = items.length;\n const parent = n > 1 ? items[n - 2] : undefined;\n const back = onBack === false ? undefined : onBack ?? (parent ? () => go(parent) : undefined);\n const sig = items.map((i) => `${i.id}\\u0001${i.label}\\u0001${i.icon ? 1 : 0}\\u0001${i.errors ? 1 : 0}\\u0001${i.container ? 1 : 0}`).join(\"\\u0002\");\n const plans = React.useMemo(() => plansFor(items), [sig]); // eslint-disable-line react-hooks/exhaustive-deps\n const navRef = React.useRef<HTMLElement>(null);\n const mirrorRef = React.useRef<HTMLDivElement>(null);\n const backRef = React.useRef<HTMLDivElement>(null);\n const [fit, setFit] = React.useState<{ plan: number; currentText: string | null }>({ plan: 0, currentText: null });\n\n const measure = React.useCallback(() => {\n const nav = navRef.current;\n const mirror = mirrorRef.current;\n if (!nav || !mirror) return;\n // layout widths, not painted ones: an ancestor mid-animation (scale / pop-in) must not skew the fit\n const rect = nav.getBoundingClientRect().width;\n const scale = nav.offsetWidth && rect ? rect / nav.offsetWidth : 1;\n const w = (key: string) => (mirror.querySelector<HTMLElement>(`[data-m=\"${key}\"]`)?.getBoundingClientRect().width ?? 0) / scale;\n const avail = nav.clientWidth - (backRef.current ? backRef.current.getBoundingClientRect().width / scale : 0) - 0.5;\n const sep = w(\"sep\");\n const cur = w(\"cur\");\n const widthOf = (p: Plan) => {\n const parts: number[] = [];\n if (n > 1) {\n const gk = (g: Group) => `g:${g.start}:${g.end}`;\n if (p.group?.start === 0) parts.push(w(gk(p.group)));\n else {\n parts.push(w(`0:${p.forms[0]}`));\n if (p.group) parts.push(w(gk(p.group)));\n }\n for (let i = 1; i < n - 1; i++) if (!p.group || i > p.group.end) parts.push(w(`${i}:${p.forms[i]}`));\n }\n parts.push(cur);\n return parts.reduce((a, b) => a + b, 0) + sep * (parts.length - 1);\n };\n let pick = plans.length - 1;\n let total = 0;\n for (let k = 0; k < plans.length; k++) {\n total = widthOf(plans[k]);\n if (total <= avail) { pick = k; break; }\n }\n let currentText: string | null = null;\n if (pick === plans.length - 1 && (total = widthOf(plans[pick])) > avail) {\n // last resort: middle-truncate the current item to the room that's left\n const textEl = mirror.querySelector('[data-m=\"curtext\"]');\n const textW = textEl?.getBoundingClientRect().width ?? 0;\n const room = cur - (total - avail) - (cur - textW);\n const m = textMeasurer(textEl);\n if (m && room > 24) currentText = middleEllipsis(items[n - 1].label, room, m);\n }\n setFit((f) => (f.plan === pick && f.currentText === currentText ? f : { plan: pick, currentText }));\n }, [plans, n]); // eslint-disable-line react-hooks/exhaustive-deps\n\n React.useLayoutEffect(() => {\n measure();\n }, [measure, sig]);\n React.useLayoutEffect(() => {\n const nav = navRef.current;\n if (!nav || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => measure());\n ro.observe(nav);\n let alive = true;\n document.fonts?.ready.then(() => alive && measure());\n return () => {\n alive = false;\n ro.disconnect();\n };\n }, [measure]);\n\n if (!n) return null;\n const plan = plans[Math.min(fit.plan, plans.length - 1)];\n const m = METRICS[size];\n const curItem = items[n - 1];\n\n /* ── pieces (shared by the mirror and the real trail so the widths match) ── */\n const icon = (c: PathCrumb) => (c.icon ? <span className={cn(\"flex shrink-0 items-center\", m.icon)} aria-hidden>{c.icon}</span> : null);\n /* V2: the dot itself carries the name (role=\"img\" so assistive tech reads it; no hidden text in the crumb) */\n const dot = (c: PathCrumb) => (c.errors ? <span role=\"img\" aria-label=\"Has errors\" className=\"size-1.5 shrink-0 rounded-full bg-kit-danger\" /> : null);\n const crumbCls = cn(PILL, m.pill);\n const body = (c: PathCrumb, form: Form) => (\n <>\n {icon(c)}\n <span>{form === \"trunc\" ? clip(c.label) : c.label}</span>\n {dot(c)}\n </>\n );\n /** The fold chip names its first folded level (the root only when nothing else is folded): \"[▦] Columns… +2\". */\n const groupBody = (g: Group) => {\n const count = g.end - g.start + 1;\n const lead = items[g.start === 0 && g.end > 0 ? 1 : g.start];\n return (\n <>\n {icon(lead)}\n <span>{clipWords(lead.label, 12)}</span>\n {count > 1 ? <span className=\"tabular-nums\">+{count - 1}</span> : null}\n <IconChevronDown className={cn(\"-mx-0.5 shrink-0 text-kit-fg-4\", m.sep)} stroke={1.75} aria-hidden />\n </>\n );\n };\n // current = emphasis by weight + colour, never a box (D38 v3); same box metrics as a crumb so nothing shifts\n // it has no pill, so no trailing padding: only the leading inset that lines it up with the chevron rhythm\n const currentCls = cn(\"inline-flex min-w-0 max-w-full items-center whitespace-nowrap rounded-kit-sm font-semibold text-kit-fg\", m.pill, m.cur, m.gap, \"[&_[data-crumb-icon]]:text-kit-fg-2\");\n const sepEl = <IconChevronRight className={cn(\"shrink-0 text-kit-fg-4\", m.sep)} stroke={1.75} aria-hidden />;\n\n function go(c: PathCrumb) {\n c.onSelect?.();\n }\n\n const crumb = (c: PathCrumb, i: number, form: Form) => {\n const tip = form !== \"full\" || undefined;\n const inner = body(c, form);\n const aria = form === \"trunc\" ? (c.errors ? `${c.label}, has errors` : c.label) : undefined;\n const el = c.to ? (\n <Link to={c.to} className={crumbCls} aria-label={aria} onClick={c.onSelect}>{inner}</Link>\n ) : (\n <button type=\"button\" className={crumbCls} aria-label={aria} onClick={() => go(c)} disabled={!c.onSelect}>{inner}</button>\n );\n return (\n <li key={c.id} className=\"flex shrink-0 items-center\">\n {i > 0 ? sepEl : null}\n {tip ? <Tooltip content={c.label} side=\"bottom\">{el}</Tooltip> : el}\n </li>\n );\n };\n\n const shown: React.ReactNode[] = [];\n if (n > 1) {\n const g = plan.group;\n const group = (first?: boolean) => (\n <GroupLi key=\"grp\" items={items} group={g!} first={first} trigger={groupBody(g!)} sep={sepEl} navRef={navRef} label={label} cls={crumbCls} link={Link} />\n );\n if (g?.start === 0) shown.push(group(true));\n else {\n shown.push(crumb(items[0], 0, plan.forms[0]));\n if (g) shown.push(group());\n }\n for (let i = 1; i < n - 1; i++) if (!g || i > g.end) shown.push(crumb(items[i], i, plan.forms[i]));\n }\n const curLabel = fit.currentText ?? curItem.label;\n const curNode = (\n <span aria-current=\"page\" className={currentCls}>\n {curItem.icon ? <span data-crumb-icon className={cn(\"flex shrink-0 items-center\", m.icon)} aria-hidden>{curItem.icon}</span> : null}\n <span className=\"min-w-0 truncate\" aria-label={curLabel !== curItem.label ? curItem.label : undefined}>{curLabel}</span>\n {dot(curItem)}\n </span>\n );\n const backText = backLabel ?? (parent ? `Back to ${parent.label}` : \"Back\");\n\n return (\n <nav ref={navRef} aria-label={label} data-size={size} className={cn(\"relative flex min-w-0 flex-1 items-center\", m.row, m.text, className)}>\n {back ? (\n <div ref={backRef} className=\"flex shrink-0 items-center\">\n <Tooltip content={backText} shortcut={backShortcut}>\n <IconButton label={backText} size={m.back} onClick={back} className=\"shrink-0 rounded-kit-sm\">\n <IconArrowLeft stroke={1.75} />\n </IconButton>\n </Tooltip>\n </div>\n ) : null}\n <ol className=\"flex min-w-0 flex-1 items-center overflow-hidden\">\n {shown}\n <li className=\"flex min-w-0 shrink items-center\">\n {n > 1 ? sepEl : null}\n {fit.currentText || (fit.plan === plans.length - 1 && long(curItem.label)) ? (\n <Tooltip content={curItem.label} side=\"bottom\">\n <span tabIndex={0} className=\"flex min-w-0 rounded-kit-sm\">{curNode}</span>\n </Tooltip>\n ) : (\n curNode\n )}\n </li>\n </ol>\n\n {/* hidden mirror: every variant measured once (never painted, never announced) */}\n <div ref={mirrorRef} aria-hidden className=\"pointer-events-none invisible absolute left-0 top-0 h-0 w-0 overflow-hidden\">\n <div className=\"flex w-max flex-col items-start\">\n <span data-m=\"sep\" className=\"flex\">{sepEl}</span>\n {items.slice(0, -1).map((c, i) => (\n <React.Fragment key={c.id}>\n <span data-m={`${i}:full`} className={crumbCls}>{body(c, \"full\")}</span>\n <span data-m={`${i}:trunc`} className={crumbCls}>{body(c, \"trunc\")}</span>\n </React.Fragment>\n ))}\n {[0, 1].flatMap((start) =>\n items.slice(0, -1).map((_, end) =>\n end < start ? null : <span key={`g${start}:${end}`} data-m={`g:${start}:${end}`} className={crumbCls}>{groupBody({ start, end })}</span>,\n ),\n )}\n <span data-m=\"cur\" className={currentCls}>\n {curItem.icon ? <span data-crumb-icon className={cn(\"flex shrink-0 items-center\", m.icon)}>{curItem.icon}</span> : null}\n <span data-m=\"curtext\">{curItem.label}</span>\n {dot(curItem)}\n </span>\n </div>\n </div>\n </nav>\n );\n}\n\n/* ── The folded middle + its Pathway popover ───────────────────────────────────── */\nfunction GroupLi({\n items,\n group,\n trigger,\n sep,\n first,\n navRef,\n label,\n cls,\n link: Link,\n}: {\n items: PathCrumb[];\n group: Group;\n trigger: React.ReactNode;\n sep: React.ReactNode;\n first?: boolean;\n navRef: React.RefObject<HTMLElement | null>;\n label: string;\n cls: string;\n link: React.ComponentType<PathCrumbLinkProps>;\n}) {\n const count = group.end - group.start + 1;\n const last = items.length - 1;\n return (\n <li className=\"flex shrink-0 items-center\">\n {first ? null : sep}\n <Menu>\n <Tooltip content=\"Show the full path\" side=\"bottom\">\n <MenuTrigger\n data-crumb-group=\"\"\n className={cn(cls, \"aria-expanded:bg-kit-selected aria-expanded:text-kit-fg\")} /* = crumbCls: the mirror measures it */\n aria-label={`Show ${count} more ${count === 1 ? \"level\" : \"levels\"}`}\n >\n {trigger}\n </MenuTrigger>\n </Tooltip>\n {/* the kit MenuContent: §12 dismiss guards and the modal-layer marker (an open tooltip closes) */}\n <MenuContent\n align=\"start\"\n finalFocus={() => {\n // a jump re-lays the trail (or remounts the host) and the chip may be gone: land on the trail's chip,\n // ← or current item instead of <body>\n requestAnimationFrame(() => {\n const nav = navRef.current?.isConnected ? navRef.current : document.querySelector<HTMLElement>(`nav[aria-label=\"${CSS.escape(label)}\"]`);\n if (!nav) return;\n const chip = nav.querySelector<HTMLElement>(\"[data-crumb-group]\");\n (chip ?? nav.querySelector<HTMLElement>(\"button, [aria-current], [tabindex='0']\"))?.focus({ preventScroll: true });\n });\n return false;\n }}\n className=\"w-64 max-w-[calc(100vw-24px)] text-[13px] leading-5\"\n >\n <div className=\"px-2 pb-1 pt-1 text-kit-xs font-medium text-kit-fg-3\">Pathway</div>\n {/* role=none: the menu owns its menuitems directly (no list or listitem in between) */}\n <ol role=\"none\" className=\"flex flex-col\">\n {items.map((c, i) => {\n const isCurrent = i === last;\n const hidden = i >= group.start && i <= group.end;\n const rowCls = cn(\n \"relative flex h-7 select-none items-center gap-1.5 rounded-kit-sm pr-2 outline-none transition-colors\",\n isCurrent\n ? \"cursor-default font-semibold text-kit-fg data-[highlighted]:bg-kit-hover\"\n : cn(\"cursor-pointer data-[highlighted]:bg-kit-hover data-[highlighted]:text-kit-fg active:bg-kit-selected\", hidden ? \"text-kit-fg\" : \"text-kit-fg-3\"),\n );\n const style = { paddingLeft: 8 + Math.min(i, 8) * 12 };\n return (\n <li key={c.id} role=\"none\">\n {c.to && !isCurrent ? (\n <MenuPrimitive.LinkItem\n closeOnClick\n render={<Link to={c.to} />}\n onClick={() => c.onSelect?.()}\n className={rowCls}\n style={style}\n >\n <PathRow c={c} depth={i} />\n </MenuPrimitive.LinkItem>\n ) : (\n <MenuPrimitive.Item\n onClick={() => (isCurrent ? undefined : c.onSelect?.())}\n aria-current={isCurrent ? \"page\" : undefined}\n className={rowCls}\n style={style}\n >\n <PathRow c={c} depth={i} current={isCurrent} />\n </MenuPrimitive.Item>\n )}\n </li>\n );\n })}\n </ol>\n </MenuContent>\n </Menu>\n </li>\n );\n}\n\nfunction PathRow({ c, depth, current }: { c: PathCrumb; depth: number; current?: boolean }) {\n return (\n <>\n {depth > 0 ? <span aria-hidden className=\"-mt-2 h-3 w-2 shrink-0 rounded-bl-[3px] border-b border-l border-kit-line-strong\" /> : null}\n {c.icon ? <span aria-hidden className=\"flex shrink-0 items-center text-kit-fg-3 [&_svg]:size-3.5\">{c.icon}</span> : null}\n {c.label.length > 28 ? (\n <Tooltip content={c.label} side=\"right\">\n <span className=\"min-w-0 flex-1 truncate\">{c.label}</span>\n </Tooltip>\n ) : (\n <span className=\"min-w-0 flex-1 truncate\">{c.label}</span>\n )}\n {c.errors ? <span role=\"img\" aria-label=\"Has errors\" className=\"size-1.5 shrink-0 rounded-full bg-kit-danger\" /> : null}\n {current ? <span aria-hidden className=\"size-1.5 shrink-0 rounded-full bg-kit-accent\" /> : null}\n </>\n );\n}\n\n/* ── Specimen (design system): one crumb frozen in a state, built from the SAME constants ─── */\nexport type PathCrumbState = \"rest\" | \"hover\" | \"pressed\" | \"focus\" | \"open\" | \"current\" | \"disabled\";\nexport function PathCrumbSpecimen({ state, label, icon, group, size = \"sm\" }: { state: PathCrumbState; label: string; icon?: React.ReactNode; group?: number; size?: \"sm\" | \"md\" }) {\n const m = METRICS[size];\n const forced: Record<PathCrumbState, string> = {\n rest: \"\",\n hover: \"bg-kit-hover text-kit-fg\",\n pressed: \"bg-kit-selected text-kit-fg\",\n focus: \"shadow-[0_0_0_2px_var(--kit-surface),0_0_0_4px_var(--kit-focus-ring)]\",\n open: \"bg-kit-selected text-kit-fg\",\n current: \"font-semibold text-kit-fg hover:bg-transparent [&_[data-crumb-icon]]:text-kit-fg-2\",\n disabled: \"text-kit-fg-4 hover:bg-transparent hover:text-kit-fg-4\",\n };\n return (\n <span className={cn(\"inline-flex items-center\", m.text)}>\n <span className={cn(PILL, m.pill, \"pointer-events-none\", forced[state])}>\n {icon ? <span data-crumb-icon className={cn(\"flex shrink-0 items-center\", m.icon)} aria-hidden>{icon}</span> : null}\n <span>{label}</span>\n {group ? (\n <>\n <span className=\"tabular-nums\">+{group}</span>\n <IconChevronDown className={cn(\"-mx-0.5 shrink-0 text-kit-fg-4\", m.sep)} stroke={1.75} aria-hidden />\n </>\n ) : null}\n </span>\n </span>\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"presence.js","names":[],"sources":["../../src/kit/ui/presence.ts"],"sourcesContent":["/**\n * Presence colour: ONE slot per person, the same everywhere they appear (field border, avatar ring, canvas pill, caret flag,\n * History change bars). Slots are the `--kit-presence-1…8` tokens (D56); text on a presence fill is `--kit-presence-on`.\n * Known people keep their earlier colours: priya → 1, daniel → 2, sujay → 3.\n *\n * D61: everyone else gets a slot at join, in join order, from the slots still free (all 8, not 5), so a real team rarely\n * shares a colour; once all 8 are taken the least recently assigned slot is reused. Register the workspace roster with\n * `registerPresenceRoster`. Someone not on the roster hashes stably into 4…8.\n * AI agents never take a person's slot: they use `--kit-presence-agent` (`AGENT_PRESENCE`).\n *\n * src/index.css declares the tokens app-wide (light and dark), so presenceColor() needs no fallback.\n */\nconst KNOWN: Record<string, number> = { priya: 1, daniel: 2, sujay: 3 };\nconst SLOTS = 8;\n\n/** D63: AI agents in History (change bars, outlines, tags): neutral violet-grey, never a person's slot. */\nexport const AGENT_PRESENCE = \"var(--kit-presence-agent)\";\n\nconst keyOf = (person: string) => person.trim().toLowerCase().replace(/^u_/, \"\").split(/[\\s@._-]+/)[0] ?? \"\";\n/** roster assignments: key (first name, id or email head) → slot */\nconst assigned = new Map<string, number>();\n\n/**\n * Assign slots to a workspace's members in join order (stable: the same roster always gives the same colours).\n * Each member is then found by id, full name or email.\n */\nexport function registerPresenceRoster(members: { id: string; name: string; email?: string; joinedAt?: string }[]) {\n assigned.clear();\n const order = [...members].sort((a, b) => (a.joinedAt && b.joinedAt ? a.joinedAt.localeCompare(b.joinedAt) : 0));\n const lastUse = new Map<number, number>(); // slot → assignment tick\n Object.values(KNOWN).forEach((s, i) => lastUse.set(s, i));\n let tick = 10;\n for (const m of order) {\n const keys = [m.id.toLowerCase(), keyOf(m.name), m.email ? keyOf(m.email) : \"\"].filter(Boolean);\n const known = keys.map((k) => KNOWN[k]).find(Boolean);\n let slot = known;\n if (!slot) {\n const free = Array.from({ length: SLOTS }, (_, i) => i + 1).filter((s) => !lastUse.has(s));\n // all 8 taken: reuse the least recently assigned slot\n slot = free[0] ?? [...lastUse.entries()].sort((a, b) => a[1] - b[1])[0][0];\n }\n lastUse.set(slot, tick++);\n for (const k of keys) assigned.set(k, slot);\n }\n}\n\n/** Accepts a person id (\"u_priya\", \"priya\"), a full name (\"Priya Nair\") or an email; returns the slot 1…8. */\nexport function presenceSlot(person: string): number {\n const whole = person.trim().toLowerCase();\n const key = keyOf(person);\n if (KNOWN[key]) return KNOWN[key];\n const hit = assigned.get(whole) ?? assigned.get(key);\n if (hit) return hit;\n let h = 0;\n for (let i = 0; i < key.length; i++) h = (h * 31 + key.charCodeAt(i)) >>> 0;\n return 4 + (h % (SLOTS - 3));\n}\n\n/** `var(--kit-presence-n)` for that person: use as a CSS colour (border, ring, background with presence-on text). */\nexport function presenceColor(person: string): string {\n const n = presenceSlot(person);\n return `var(--kit-presence-${n})`;\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,IAAM,QAAgC;CAAE,OAAO;CAAG,QAAQ;CAAG,OAAO;CAAG;AACvE,IAAM,QAAQ;;AAGd,IAAa,iBAAiB;AAE9B,IAAM,SAAS,WAAmB,OAAO,MAAM,CAAC,aAAa,CAAC,QAAQ,OAAO,GAAG,CAAC,MAAM,YAAY,CAAC,MAAM;;AAE1G,IAAM,2BAAW,IAAI,KAAqB;;;;;AAM1C,SAAgB,uBAAuB,SAA4E;AACjH,UAAS,OAAO;CAChB,MAAM,QAAQ,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,MAAO,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,cAAc,EAAE,SAAS,GAAG,EAAG;CAChH,MAAM,0BAAU,IAAI,KAAqB;AACzC,QAAO,OAAO,MAAM,CAAC,SAAS,GAAG,MAAM,QAAQ,IAAI,GAAG,EAAE,CAAC;CACzD,IAAI,OAAO;AACX,MAAK,MAAM,KAAK,OAAO;EACrB,MAAM,OAAO;GAAC,EAAE,GAAG,aAAa;GAAE,MAAM,EAAE,KAAK;GAAE,EAAE,QAAQ,MAAM,EAAE,MAAM,GAAG;GAAG,CAAC,OAAO,QAAQ;EAE/F,IAAI,OADU,KAAK,KAAK,MAAM,MAAM,GAAG,CAAC,KAAK,QAAQ;AAErD,MAAI,CAAC,KAGH,QAFa,MAAM,KAAK,EAAE,QAAQ,OAAO,GAAG,GAAG,MAAM,IAAI,EAAE,CAAC,QAAQ,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAE9E,MAAM,CAAC,GAAG,QAAQ,SAAS,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG;AAE1E,UAAQ,IAAI,MAAM,OAAO;AACzB,OAAK,MAAM,KAAK,KAAM,UAAS,IAAI,GAAG,KAAK;;;;AAK/C,SAAgB,aAAa,QAAwB;CACnD,MAAM,QAAQ,OAAO,MAAM,CAAC,aAAa;CACzC,MAAM,MAAM,MAAM,OAAO;AACzB,KAAI,MAAM,KAAM,QAAO,MAAM;CAC7B,MAAM,MAAM,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,IAAI;AACpD,KAAI,IAAK,QAAO;CAChB,IAAI,IAAI;AACR,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAK,KAAK,IAAI,KAAK,IAAI,WAAW,EAAE,KAAM;AAC1E,QAAO,IAAK,KAAK,QAAQ;;;AAI3B,SAAgB,cAAc,QAAwB;AAEpD,QAAO,sBADG,aAAa,OAAO,CACC"}
package/ui/select.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"select.js","names":[],"sources":["../../src/kit/ui/select.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Select as SelectPrimitive } from \"@base-ui/react/select\";\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react/combobox\";\nimport type { BaseUIEvent } from \"@base-ui/react/types\";\nimport { IconCheck, IconChevronDown, IconSearch } from \"@tabler/icons-react\";\nimport { cn } from \"../lib/cn\";\nimport { useFieldId, useFieldLabelledBy, useLabelFor } from \"./field-context\";\nimport { Avatar } from \"./display\";\nimport { GLASS, KIT_SCOPE } from \"./surfaces\";\n\n/* ── Select ─────────────────────────────────────────────────────────────────\n D34 — one Select for every dropdown. Up to SEARCH_THRESHOLD options it is a plain Base UI Select; past that (or\n with `searchable`) the same trigger opens a Base UI Combobox: sticky search at the top, type-to-filter with\n fuzzy-ish matching and highlighted matches, ↑↓ / Enter / Esc, typing on the closed trigger starts a search,\n groups, avatars / icons, secondary text, \"No matches\". Call sites don't change — long lists just get search. */\n\nexport const SEARCH_THRESHOLD = 7;\n\nexport type SelectOption = {\n value: string;\n label: React.ReactNode;\n /** leading visual (16px icon); ignored when `avatar` is set */\n icon?: React.ReactNode;\n /** a person: renders a 20px avatar before the label */\n avatar?: { name: string; src?: string };\n /** secondary line under the label (e.g. an email) — searchable */\n description?: string;\n /** muted right-aligned text (e.g. \"UTC+1\", a count) — searchable */\n meta?: string;\n /** extra words that should match (aliases, ids) */\n keywords?: string[];\n /** group heading; options with the same group render together, in first-seen order */\n group?: string;\n disabled?: boolean;\n};\n\n/* ── Matching (exported so custom pickers can share it) ─────────────────── */\n\n/** Plain text of a React node — lets `label` stay a ReactNode while still being searchable. */\nexport function nodeText(node: React.ReactNode): string {\n if (node == null || typeof node === \"boolean\") return \"\";\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(nodeText).join(\"\");\n if (React.isValidElement<{ children?: React.ReactNode }>(node)) return nodeText(node.props.children);\n return \"\";\n}\n\nconst SEP = /[\\s\\-_/.(@+]/;\nconst norm = (s: string) => s.normalize(\"NFD\").replace(/[̀-ͯ]/g, \"\").toLowerCase();\n\n/**\n * Score how well `query` matches `text` (0 = no match). Every whitespace-separated term must match.\n * Prefix > word start > substring > in-order characters (\"nyk\" → \"New York\").\n */\nexport function matchScore(text: string, query: string, { fuzzy = true }: { fuzzy?: boolean } = {}): number {\n const t = norm(text);\n const terms = norm(query).trim().split(/\\s+/).filter(Boolean);\n if (!terms.length) return 1;\n let score = 0;\n for (const term of terms) {\n const at = t.indexOf(term);\n if (at === 0) score += 4;\n else if (at > 0) score += SEP.test(t[at - 1]) ? 3 : 2;\n else if (fuzzy && fuzzyPositions(t, term)) score += 1;\n else return 0;\n }\n return score;\n}\n\n/** In-order characters of `term` in `t`, tight enough to be intended (\"nyk\" → New York, not across a paragraph). */\nfunction fuzzyPositions(t: string, term: string): number[] | null {\n if (term.length < 2) return null;\n // start at a word boundary (\"nyk\" → New York, not \"krasnoyarsk\"); try each so a tighter run wins\n for (let start = t.indexOf(term[0]); start >= 0; start = t.indexOf(term[0], start + 1)) {\n if (start > 0 && !SEP.test(t[start - 1])) continue;\n const out = [start];\n let i = start + 1;\n for (const ch of term.slice(1)) {\n i = t.indexOf(ch, i);\n if (i < 0) break;\n out.push(i++);\n }\n if (out.length === term.length && out[out.length - 1] - start + 1 <= term.length * 3) return out;\n }\n return null;\n}\n\n/** Character indexes of `text` to emphasise for `query` (substring per term, else in-order characters). */\nexport function matchPositions(text: string, query: string): Set<number> {\n const t = norm(text);\n const hits = new Set<number>();\n for (const term of norm(query).trim().split(/\\s+/).filter(Boolean)) {\n const at = t.indexOf(term);\n if (at >= 0) for (let k = 0; k < term.length; k++) hits.add(at + k);\n else fuzzyPositions(t, term)?.forEach((k) => hits.add(k));\n }\n return hits;\n}\n\n/** Renders `text` with the characters that match `query` emphasised. */\nexport function Highlight({ text, query }: { text: string; query: string }) {\n if (!query.trim()) return <>{text}</>;\n // NFD normalisation can change length for accented text; only highlight when indexes line up.\n if (norm(text).length !== text.length) return <>{text}</>;\n const hits = matchPositions(text, query);\n if (!hits.size) return <>{text}</>;\n const parts: React.ReactNode[] = [];\n let run = \"\";\n let on = false;\n const flush = (k: number) => {\n if (!run) return;\n parts.push(on ? <mark key={k} className=\"rounded-[2px] bg-transparent font-semibold text-kit-fg\">{run}</mark> : run);\n run = \"\";\n };\n for (let k = 0; k < text.length; k++) {\n const h = hits.has(k);\n if (h !== on) {\n flush(k);\n on = h;\n }\n run += text[k];\n }\n flush(text.length);\n return <>{parts}</>;\n}\n\n/** Filter + rank options for `query` (stable within equal scores). */\nexport function filterOptions<T extends SelectOption>(options: T[], query: string): T[] {\n if (!query.trim()) return options;\n return options\n .map((o, i) => {\n const label = nodeText(o.label);\n const main = matchScore(label, query);\n // secondary text (email, region, aliases) matches on whole substrings only — fuzzy there is noise\n const rest = matchScore([label, o.description, o.meta, ...(o.keywords ?? [])].filter(Boolean).join(\" \"), query, { fuzzy: false });\n // a hit in the label outranks a hit only in secondary text\n // an alias typed exactly (\"IST\", \"PT\", a tag) is as good as a label prefix\n const exact = o.keywords?.some((k) => norm(k) === norm(query.trim())) ? 9 : 0;\n return { o, i, s: Math.max(main ? main * 2 + 1 : rest, exact), len: label.length };\n })\n .filter((x) => x.s > 0)\n .sort((a, b) => b.s - a.s || a.len - b.len || a.i - b.i)\n .map((x) => x.o);\n}\n\nfunction grouped<T extends SelectOption>(options: T[]): { group?: string; items: T[] }[] {\n if (!options.some((o) => o.group)) return [{ items: options }];\n const out: { group?: string; items: T[] }[] = [];\n for (const o of options) {\n const g = out.find((x) => x.group === o.group);\n if (g) g.items.push(o);\n else out.push({ group: o.group, items: [o] });\n }\n return out;\n}\n\n/* ── Shared look ────────────────────────────────────────────────────────── */\n\nfunction triggerClass(variant: \"filled\" | \"outline\" | \"ghost\", size: \"sm\" | \"md\" | \"lg\") {\n const h = size === \"sm\" ? \"h-7 text-kit-sm\" : size === \"lg\" ? \"h-9 text-kit-base\" : \"h-8 text-kit-sm\";\n return cn(\n \"group inline-flex w-full min-w-0 items-center justify-between gap-2 rounded-kit-md border px-2.5 text-left text-kit-fg transition-colors data-[placeholder]:text-kit-fg-3 disabled:cursor-not-allowed disabled:opacity-60 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-60\",\n variant === \"filled\" && \"border-kit-field-border bg-kit-field-bg shadow-kit-field hover:border-kit-field-border-hover\",\n variant === \"outline\" && \"border-kit-line bg-kit-field-bg shadow-kit-xs hover:border-kit-line-strong\",\n variant === \"ghost\" && \"w-auto border-transparent bg-transparent px-2 text-kit-fg-2 hover:bg-kit-hover hover:text-kit-fg\",\n h,\n );\n}\n\n/** The Select trigger look, for controls that open their own picker but must read as a Select (D57: one look per job). */\nexport const selectTriggerClass = triggerClass;\n\n/* V2's .glass floating surface; the portalled positioner carries its own kit scope so the --kit-* values resolve. */\nconst floatingClass = cn(\"rounded-kit-lg border text-kit-fg outline-none data-[open]:animate-kit-pop-in\", GLASS);\n\nconst itemClass =\n \"relative flex cursor-pointer select-none items-center gap-2 rounded-kit-md py-1.5 pl-2 pr-8 text-kit-sm text-kit-fg outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-40 data-[highlighted]:bg-kit-hover [&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:text-kit-fg-2\";\n\nconst groupHeading = \"px-2 pb-1 pt-2 text-kit-xs font-medium text-kit-fg-3\";\n\nfunction Lead({ o }: { o: SelectOption }) {\n if (o.avatar) return <Avatar name={o.avatar.name} src={o.avatar.src} size={20} decorative />;\n return o.icon ? <>{o.icon}</> : null;\n}\n\n/* ── Select ─────────────────────────────────────────────────────────────── */\n\nexport interface SelectProps {\n id?: string;\n \"aria-label\"?: string;\n value?: string;\n /** uncontrolled starting value (leave `value` undefined) */\n defaultValue?: string;\n onValueChange?: (v: string) => void;\n options: SelectOption[];\n placeholder?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n triggerClassName?: string;\n variant?: \"filled\" | \"outline\" | \"ghost\";\n align?: \"start\" | \"center\" | \"end\";\n disabled?: boolean;\n /** \"auto\" (default): search appears when there are more than 7 options. */\n searchable?: boolean | \"auto\";\n searchPlaceholder?: string;\n /** popover width for the searchable menu (defaults to the trigger, at least 240px) */\n menuClassName?: string;\n}\n\nexport function Select(props: SelectProps) {\n const { searchable = \"auto\", options } = props;\n const search = searchable === true || (searchable === \"auto\" && options.length > SEARCH_THRESHOLD);\n return search ? <SearchSelect {...props} /> : <PlainSelect {...props} />;\n}\n\nfunction useTriggerA11y(id: string | undefined, ariaLabel: string | undefined, placeholder: React.ReactNode) {\n const fieldId = useFieldId();\n const labelledBy = useFieldLabelledBy();\n const labelFor = useLabelFor(id ?? fieldId);\n return {\n id: id ?? fieldId,\n \"aria-label\": ariaLabel ?? (fieldId || labelledBy || labelFor ? undefined : typeof placeholder === \"string\" && placeholder !== \"Select…\" ? placeholder : undefined),\n \"aria-labelledby\": ariaLabel ? undefined : (labelFor ?? (id || fieldId ? undefined : labelledBy)),\n };\n}\n\n/** Value that is controlled when `value` is passed and internal otherwise. */\nfunction useSelectValue(value: string | undefined, defaultValue: string | undefined, onValueChange?: (v: string) => void) {\n const [inner, setInner] = React.useState(defaultValue);\n const controlled = value !== undefined;\n const current = controlled ? value : inner;\n const set = (v: string) => {\n if (!controlled) setInner(v);\n onValueChange?.(v);\n };\n return [current, set] as const;\n}\n\nfunction PlainSelect({\n value,\n defaultValue,\n onValueChange,\n options,\n placeholder = \"Select…\",\n size = \"md\",\n className,\n triggerClassName,\n variant = \"filled\",\n align = \"start\",\n disabled,\n id,\n \"aria-label\": ariaLabel,\n}: SelectProps) {\n const a11y = useTriggerA11y(id, ariaLabel, placeholder);\n const [current, setCurrent] = useSelectValue(value, defaultValue, onValueChange);\n const [open, setOpen] = React.useState(false);\n const items = React.useMemo(() => options.map((o) => ({ value: o.value, label: o.label })), [options]);\n const renderItem = (o: SelectOption) => (\n <SelectPrimitive.Item key={o.value} value={o.value} disabled={o.disabled} className={itemClass}>\n <Lead o={o} />\n <div className=\"min-w-0 flex-1\">\n <SelectPrimitive.ItemText>{o.label}</SelectPrimitive.ItemText>\n {o.description ? <div className=\"text-kit-xs text-kit-fg-3\">{o.description}</div> : null}\n </div>\n {o.meta ? <span className=\"shrink-0 text-kit-xs tabular-nums text-kit-fg-3\">{o.meta}</span> : null}\n <SelectPrimitive.ItemIndicator className=\"absolute right-2\">\n <IconCheck className=\"size-4 !text-kit-fg\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n );\n return (\n <SelectPrimitive.Root<string>\n items={items}\n value={current ?? null}\n onValueChange={(v) => v != null && setCurrent(v)}\n onOpenChange={setOpen}\n disabled={disabled}\n >\n <SelectPrimitive.Trigger\n {...a11y}\n data-state={open ? \"open\" : \"closed\"}\n className={cn(triggerClass(variant, size), triggerClassName, className)}\n >\n <span className=\"flex min-w-0 items-center gap-2 truncate [&_svg]:size-4 [&_svg]:text-kit-fg-3\">\n <SelectPrimitive.Value placeholder={placeholder} />\n </span>\n <SelectPrimitive.Icon>\n <IconChevronDown className=\"size-3.5 text-kit-fg-3 transition-transform group-data-[popup-open]:rotate-180\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n <SelectPrimitive.Portal>\n <SelectPrimitive.Positioner align={align} sideOffset={6} alignItemWithTrigger={false} className=\"z-[80]\" data-floating-layer=\"\" {...KIT_SCOPE}>\n <SelectPrimitive.Popup\n className={cn(floatingClass, \"max-h-[min(360px,var(--available-height))] min-w-[var(--anchor-width)] overflow-y-auto p-1\")}\n >\n <SelectPrimitive.List>\n {grouped(options).map((g, gi) =>\n g.group ? (\n <SelectPrimitive.Group key={g.group + gi}>\n <SelectPrimitive.GroupLabel className={groupHeading}>{g.group}</SelectPrimitive.GroupLabel>\n {g.items.map(renderItem)}\n </SelectPrimitive.Group>\n ) : (\n g.items.map(renderItem)\n ),\n )}\n </SelectPrimitive.List>\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n </SelectPrimitive.Root>\n );\n}\n\n/** V2 scrollIntoContainer (block \"nearest\", 4px margin): scroll `el` into view inside `list` ONLY, never the shell behind it.\n * Rects are transformed while the menu pops in (scaled), so measure in layout pixels. */\nfunction revealInList(list: HTMLElement, el: HTMLElement | null, margin = 4) {\n if (!el) return;\n const br = list.getBoundingClientRect();\n const er = el.getBoundingClientRect();\n const k = list.offsetHeight ? br.height / list.offsetHeight || 1 : 1;\n const top = (er.top - br.top) / k + list.scrollTop;\n const h = er.height / k;\n let next = list.scrollTop;\n if (top < list.scrollTop) next = top - margin;\n else if (top + h > list.scrollTop + list.clientHeight) next = top + h - list.clientHeight + margin;\n next = Math.max(0, Math.min(next, list.scrollHeight - list.clientHeight));\n if (Math.abs(next - list.scrollTop) > 0.5) list.scrollTop = next;\n}\n\nfunction SearchSelect({\n value,\n defaultValue,\n onValueChange,\n options,\n placeholder = \"Select…\",\n size = \"md\",\n className,\n triggerClassName,\n variant = \"filled\",\n align = \"start\",\n disabled,\n id,\n \"aria-label\": ariaLabel,\n searchPlaceholder = \"Search…\",\n menuClassName,\n}: SelectProps) {\n const a11y = useTriggerA11y(id, ariaLabel, placeholder);\n const [current, setCurrent] = useSelectValue(value, defaultValue, onValueChange);\n const [open, setOpen] = React.useState(false);\n const [query, setQuery] = React.useState(\"\");\n const selected = options.find((o) => o.value === current);\n const shown = React.useMemo(() => filterOptions(options, query), [options, query]);\n const shownValues = React.useMemo(() => shown.map((o) => o.value), [shown]);\n const listRef = React.useRef<HTMLDivElement>(null);\n\n /* Reveal the current option on open, inside the list only: scrollIntoView would also scroll the app shell behind the\n menu (V2 S1). The popup sizes itself a frame or two after it opens, so wait until the list is constrained (it\n scrolls) before revealing (the list portals in, so it may not exist on the first frame either). */\n React.useEffect(() => {\n if (!open) return;\n let raf = 0;\n const reveal = (tries: number) => {\n const list = listRef.current;\n const settled = list && list.scrollHeight > list.clientHeight;\n if (!settled && tries > 0) return void (raf = requestAnimationFrame(() => reveal(tries - 1)));\n if (list) revealInList(list, list.querySelector<HTMLElement>('[data-checked=\"true\"]'));\n };\n reveal(6);\n return () => cancelAnimationFrame(raf);\n }, [open]);\n\n const openWith = (q: string) => {\n setQuery(q);\n setOpen(true);\n };\n\n return (\n <ComboboxPrimitive.Root<string>\n value={current ?? null}\n onValueChange={(v) => {\n if (v == null) return;\n setCurrent(v);\n setOpen(false);\n }}\n open={open}\n onOpenChange={(o) => (o ? openWith(\"\") : setOpen(false))}\n inputValue={query}\n onInputValueChange={(q, details) => {\n // only typing filters; Base UI also writes the picked option's value into the input on selection\n if (details.reason === \"input-change\" || details.reason === \"input-clear\") setQuery(q);\n }}\n items={shownValues}\n filter={null}\n autoHighlight\n loopFocus\n disabled={disabled}\n >\n <ComboboxPrimitive.Trigger\n {...a11y}\n data-state={open ? \"open\" : \"closed\"}\n data-placeholder={selected ? undefined : \"\"}\n className={cn(triggerClass(variant, size), triggerClassName, className)}\n onKeyDown={(e: BaseUIEvent<React.KeyboardEvent<HTMLButtonElement>>) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (e.key.length === 1 && e.key !== \" \") {\n e.preventDefault();\n e.preventBaseUIHandler();\n openWith(e.key); // typing on the closed trigger starts a search\n } else if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n e.preventBaseUIHandler();\n openWith(\"\");\n }\n }}\n >\n <span className=\"flex min-w-0 items-center gap-2 truncate [&_svg]:size-4 [&_svg]:text-kit-fg-3\">\n {selected ? (\n <>\n {selected.avatar ? <Avatar name={selected.avatar.name} src={selected.avatar.src} size={16} decorative /> : null}\n <span className=\"truncate\">{selected.label}</span>\n </>\n ) : (\n <span className=\"truncate\">{placeholder}</span>\n )}\n </span>\n <IconChevronDown aria-hidden className=\"size-3.5 shrink-0 text-kit-fg-3 transition-transform group-data-[popup-open]:rotate-180\" />\n </ComboboxPrimitive.Trigger>\n <ComboboxPrimitive.Portal>\n <ComboboxPrimitive.Positioner align={align} sideOffset={6} collisionPadding={12} className=\"z-[80]\" data-floating-layer=\"\" {...KIT_SCOPE}>\n <ComboboxPrimitive.Popup\n className={cn(\n floatingClass,\n \"flex max-h-[min(400px,var(--available-height))] w-[max(var(--anchor-width),240px)] max-w-[min(400px,calc(100vw-24px))] flex-col overflow-hidden\",\n menuClassName,\n )}\n >\n <div className=\"flex h-9 shrink-0 items-center gap-2 border-b border-kit-line-subtle px-2.5 text-kit-fg-3\">\n <IconSearch aria-hidden className=\"size-4 shrink-0\" />\n <ComboboxPrimitive.Input\n aria-label={typeof a11y[\"aria-label\"] === \"string\" ? a11y[\"aria-label\"] : \"Options\"}\n placeholder={searchPlaceholder}\n className=\"h-full min-w-0 flex-1 bg-transparent text-kit-sm text-kit-fg outline-none placeholder:text-kit-fg-4\"\n />\n </div>\n {shown.length === 0 ? <div className=\"px-2 py-6 text-center text-kit-sm text-kit-fg-3\">No matches</div> : null}\n <ComboboxPrimitive.List ref={listRef} className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-1 empty:hidden\">\n {grouped(shown).map((g, gi) => {\n const items = g.items.map((o) => {\n const text = nodeText(o.label);\n const checked = o.value === current;\n return (\n <ComboboxPrimitive.Item key={o.value} value={o.value} disabled={o.disabled} data-checked={checked} className={itemClass}>\n <Lead o={o} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate\">{typeof o.label === \"string\" ? <Highlight text={text} query={query} /> : o.label}</div>\n {o.description ? (\n <div className=\"truncate text-kit-xs text-kit-fg-3\">\n <Highlight text={o.description} query={query} />\n </div>\n ) : null}\n </div>\n {o.meta ? <span className=\"shrink-0 text-kit-xs tabular-nums text-kit-fg-3\">{o.meta}</span> : null}\n {checked ? <IconCheck aria-hidden className=\"absolute right-2 size-4 !text-kit-fg\" /> : null}\n </ComboboxPrimitive.Item>\n );\n });\n return g.group ? (\n <ComboboxPrimitive.Group key={g.group + gi}>\n <ComboboxPrimitive.GroupLabel className={groupHeading}>{g.group}</ComboboxPrimitive.GroupLabel>\n {items}\n </ComboboxPrimitive.Group>\n ) : (\n <React.Fragment key={\"g\" + gi}>{items}</React.Fragment>\n );\n })}\n </ComboboxPrimitive.List>\n </ComboboxPrimitive.Popup>\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n </ComboboxPrimitive.Root>\n );\n}\n"],"mappings":"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"}