@7pmlabs/design-system 2.0.8 → 2.1.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 (377) hide show
  1. package/README.md +4 -4
  2. package/dist/design-system.css +1 -1
  3. package/dist/design-system.js +65 -59
  4. package/dist/design-system100.js +1 -1
  5. package/dist/design-system100.js.map +1 -1
  6. package/dist/design-system101.js +87 -53
  7. package/dist/design-system101.js.map +1 -1
  8. package/dist/design-system103.js +5 -13
  9. package/dist/design-system103.js.map +1 -1
  10. package/dist/design-system104.js +53 -108
  11. package/dist/design-system104.js.map +1 -1
  12. package/dist/{design-system102.js → design-system105.js} +1 -1
  13. package/dist/{design-system102.js.map → design-system105.js.map} +1 -1
  14. package/dist/design-system106.js +13 -6
  15. package/dist/design-system106.js.map +1 -1
  16. package/dist/design-system107.js +93 -190
  17. package/dist/design-system107.js.map +1 -1
  18. package/dist/design-system109.js +2 -2
  19. package/dist/design-system109.js.map +1 -1
  20. package/dist/design-system110.js +183 -484
  21. package/dist/design-system110.js.map +1 -1
  22. package/dist/design-system112.js +5 -4
  23. package/dist/design-system112.js.map +1 -1
  24. package/dist/design-system113.js +507 -7
  25. package/dist/design-system113.js.map +1 -1
  26. package/dist/design-system115.js +8 -0
  27. package/dist/design-system115.js.map +1 -0
  28. package/dist/design-system116.js +7 -6
  29. package/dist/design-system116.js.map +1 -1
  30. package/dist/design-system117.js +154 -169
  31. package/dist/design-system117.js.map +1 -1
  32. package/dist/design-system119.js +2 -2
  33. package/dist/design-system119.js.map +1 -1
  34. package/dist/design-system120.js +210 -149
  35. package/dist/design-system120.js.map +1 -1
  36. package/dist/design-system122.js +5 -4
  37. package/dist/design-system122.js.map +1 -1
  38. package/dist/design-system123.js +160 -9
  39. package/dist/design-system123.js.map +1 -1
  40. package/dist/design-system125.js +8 -0
  41. package/dist/design-system125.js.map +1 -0
  42. package/dist/design-system126.js +176 -6
  43. package/dist/design-system126.js.map +1 -1
  44. package/dist/design-system128.js +8 -0
  45. package/dist/design-system128.js.map +1 -0
  46. package/dist/design-system129.js +213 -5
  47. package/dist/design-system129.js.map +1 -1
  48. package/dist/design-system131.js +5 -90
  49. package/dist/design-system131.js.map +1 -1
  50. package/dist/design-system132.js +166 -0
  51. package/dist/design-system132.js.map +1 -0
  52. package/dist/design-system134.js +5 -42
  53. package/dist/design-system134.js.map +1 -1
  54. package/dist/design-system135.js +12 -0
  55. package/dist/design-system135.js.map +1 -0
  56. package/dist/design-system136.js +274 -5
  57. package/dist/design-system136.js.map +1 -1
  58. package/dist/design-system138.js +9 -0
  59. package/dist/{design-system124.js.map → design-system138.js.map} +1 -1
  60. package/dist/design-system139.js +16 -5
  61. package/dist/design-system139.js.map +1 -1
  62. package/dist/design-system141.js +8 -0
  63. package/dist/{design-system127.js.map → design-system141.js.map} +1 -1
  64. package/dist/design-system142.js +12 -5
  65. package/dist/design-system142.js.map +1 -1
  66. package/dist/design-system143.js +78 -83
  67. package/dist/design-system143.js.map +1 -1
  68. package/dist/design-system145.js +1 -1
  69. package/dist/design-system145.js.map +1 -1
  70. package/dist/design-system146.js +42 -9
  71. package/dist/design-system146.js.map +1 -1
  72. package/dist/design-system148.js +3 -2
  73. package/dist/design-system148.js.map +1 -1
  74. package/dist/design-system149.js +230 -18
  75. package/dist/design-system149.js.map +1 -1
  76. package/dist/design-system151.js +5 -158
  77. package/dist/design-system151.js.map +1 -1
  78. package/dist/{design-system140.js → design-system152.js} +6 -6
  79. package/dist/{design-system140.js.map → design-system152.js.map} +1 -1
  80. package/dist/design-system154.js +5 -307
  81. package/dist/design-system154.js.map +1 -1
  82. package/dist/design-system155.js +98 -0
  83. package/dist/design-system155.js.map +1 -0
  84. package/dist/design-system157.js +5 -240
  85. package/dist/design-system157.js.map +1 -1
  86. package/dist/design-system158.js +12 -0
  87. package/dist/design-system158.js.map +1 -0
  88. package/dist/design-system159.js +37 -5
  89. package/dist/design-system159.js.map +1 -1
  90. package/dist/design-system160.js +4 -189
  91. package/dist/design-system160.js.map +1 -1
  92. package/dist/design-system161.js +24 -0
  93. package/dist/{design-system150.js.map → design-system161.js.map} +1 -1
  94. package/dist/design-system162.js +2 -3
  95. package/dist/design-system162.js.map +1 -1
  96. package/dist/design-system163.js +158 -3
  97. package/dist/design-system163.js.map +1 -1
  98. package/dist/{design-system153.js → design-system165.js} +2 -2
  99. package/dist/{design-system153.js.map → design-system165.js.map} +1 -1
  100. package/dist/design-system166.js +307 -6
  101. package/dist/design-system166.js.map +1 -1
  102. package/dist/{design-system156.js → design-system168.js} +2 -2
  103. package/dist/{design-system156.js.map → design-system168.js.map} +1 -1
  104. package/dist/design-system169.js +167 -6
  105. package/dist/design-system169.js.map +1 -1
  106. package/dist/design-system171.js +8 -0
  107. package/dist/design-system171.js.map +1 -0
  108. package/dist/design-system172.js +240 -6
  109. package/dist/design-system172.js.map +1 -1
  110. package/dist/design-system174.js +8 -0
  111. package/dist/design-system174.js.map +1 -0
  112. package/dist/design-system175.js +189 -6
  113. package/dist/design-system175.js.map +1 -1
  114. package/dist/design-system177.js +8 -0
  115. package/dist/design-system177.js.map +1 -0
  116. package/dist/design-system178.js +3 -5
  117. package/dist/design-system178.js.map +1 -1
  118. package/dist/design-system179.js +58 -11
  119. package/dist/design-system179.js.map +1 -1
  120. package/dist/design-system181.js +9 -0
  121. package/dist/design-system181.js.map +1 -0
  122. package/dist/design-system182.js +56 -6
  123. package/dist/design-system182.js.map +1 -1
  124. package/dist/design-system184.js +9 -0
  125. package/dist/{design-system167.js.map → design-system184.js.map} +1 -1
  126. package/dist/design-system185.js +69 -5
  127. package/dist/design-system185.js.map +1 -1
  128. package/dist/design-system187.js +9 -0
  129. package/dist/{design-system170.js.map → design-system187.js.map} +1 -1
  130. package/dist/design-system188.js +182 -5
  131. package/dist/design-system188.js.map +1 -1
  132. package/dist/design-system190.js +9 -0
  133. package/dist/design-system190.js.map +1 -0
  134. package/dist/design-system191.js +115 -5
  135. package/dist/design-system191.js.map +1 -1
  136. package/dist/design-system193.js +8 -0
  137. package/dist/{design-system176.js.map → design-system193.js.map} +1 -1
  138. package/dist/design-system194.js +11 -5
  139. package/dist/design-system194.js.map +1 -1
  140. package/dist/design-system195.js +453 -24
  141. package/dist/design-system195.js.map +1 -1
  142. package/dist/design-system197.js +5 -4
  143. package/dist/design-system197.js.map +1 -1
  144. package/dist/design-system198.js +20 -16
  145. package/dist/design-system198.js.map +1 -1
  146. package/dist/design-system200.js +1 -1
  147. package/dist/design-system200.js.map +1 -1
  148. package/dist/design-system201.js +70 -314
  149. package/dist/design-system201.js.map +1 -1
  150. package/dist/design-system203.js +1 -1
  151. package/dist/design-system203.js.map +1 -1
  152. package/dist/design-system204.js +24 -89
  153. package/dist/design-system204.js.map +1 -1
  154. package/dist/design-system206.js +1 -1
  155. package/dist/design-system206.js.map +1 -1
  156. package/dist/design-system207.js +26 -17
  157. package/dist/design-system207.js.map +1 -1
  158. package/dist/design-system209.js +5 -3
  159. package/dist/design-system209.js.map +1 -1
  160. package/dist/design-system210.js +22 -408
  161. package/dist/design-system210.js.map +1 -1
  162. package/dist/design-system212.js +1 -1
  163. package/dist/design-system212.js.map +1 -1
  164. package/dist/design-system213.js +24 -52
  165. package/dist/design-system213.js.map +1 -1
  166. package/dist/design-system215.js +1 -1
  167. package/dist/design-system215.js.map +1 -1
  168. package/dist/design-system216.js +329 -85
  169. package/dist/design-system216.js.map +1 -1
  170. package/dist/design-system218.js +5 -108
  171. package/dist/design-system218.js.map +1 -1
  172. package/dist/design-system219.js +103 -0
  173. package/dist/design-system219.js.map +1 -0
  174. package/dist/design-system221.js +5 -106
  175. package/dist/design-system221.js.map +1 -1
  176. package/dist/design-system222.js +22 -0
  177. package/dist/{design-system208.js.map → design-system222.js.map} +1 -1
  178. package/dist/design-system223.js +4 -6
  179. package/dist/design-system223.js.map +1 -1
  180. package/dist/design-system224.js +3 -737
  181. package/dist/design-system224.js.map +1 -1
  182. package/dist/design-system225.js +422 -0
  183. package/dist/design-system225.js.map +1 -0
  184. package/dist/design-system227.js +5 -11
  185. package/dist/design-system227.js.map +1 -1
  186. package/dist/design-system228.js +51 -517
  187. package/dist/design-system228.js.map +1 -1
  188. package/dist/design-system230.js +1 -1
  189. package/dist/design-system230.js.map +1 -1
  190. package/dist/design-system231.js +88 -3
  191. package/dist/design-system231.js.map +1 -1
  192. package/dist/design-system232.js +4 -46
  193. package/dist/design-system232.js.map +1 -1
  194. package/dist/design-system233.js +108 -4
  195. package/dist/design-system233.js.map +1 -1
  196. package/dist/{design-system220.js → design-system235.js} +2 -2
  197. package/dist/{design-system220.js.map → design-system235.js.map} +1 -1
  198. package/dist/design-system236.js +106 -5
  199. package/dist/design-system236.js.map +1 -1
  200. package/dist/design-system238.js +9 -0
  201. package/dist/design-system238.js.map +1 -0
  202. package/dist/design-system239.js +737 -5
  203. package/dist/design-system239.js.map +1 -1
  204. package/dist/{design-system226.js → design-system241.js} +2 -2
  205. package/dist/{design-system226.js.map → design-system241.js.map} +1 -1
  206. package/dist/design-system242.js +3 -5
  207. package/dist/design-system242.js.map +1 -1
  208. package/dist/design-system243.js +42 -50
  209. package/dist/design-system243.js.map +1 -1
  210. package/dist/design-system244.js +1 -1
  211. package/dist/design-system244.js.map +1 -1
  212. package/dist/design-system245.js +254 -141
  213. package/dist/design-system245.js.map +1 -1
  214. package/dist/design-system247.js +1 -1
  215. package/dist/design-system247.js.map +1 -1
  216. package/dist/design-system248.js +119 -7
  217. package/dist/design-system248.js.map +1 -1
  218. package/dist/design-system250.js +8 -0
  219. package/dist/design-system250.js.map +1 -0
  220. package/dist/design-system251.js +172 -5
  221. package/dist/design-system251.js.map +1 -1
  222. package/dist/design-system253.js +8 -0
  223. package/dist/design-system253.js.map +1 -0
  224. package/dist/design-system254.js +11 -6
  225. package/dist/design-system254.js.map +1 -1
  226. package/dist/design-system255.js +525 -9
  227. package/dist/design-system255.js.map +1 -1
  228. package/dist/design-system257.js +8 -0
  229. package/dist/design-system257.js.map +1 -0
  230. package/dist/design-system258.js +112 -6
  231. package/dist/design-system258.js.map +1 -1
  232. package/dist/design-system260.js +5 -374
  233. package/dist/design-system260.js.map +1 -1
  234. package/dist/design-system261.js +57 -0
  235. package/dist/design-system261.js.map +1 -0
  236. package/dist/design-system262.js +4 -6
  237. package/dist/design-system262.js.map +1 -1
  238. package/dist/design-system263.js +173 -0
  239. package/dist/design-system263.js.map +1 -0
  240. package/dist/design-system265.js +8 -0
  241. package/dist/design-system265.js.map +1 -0
  242. package/dist/design-system266.js +10 -0
  243. package/dist/design-system266.js.map +1 -0
  244. package/dist/{design-system249.js → design-system267.js} +2 -2
  245. package/dist/{design-system249.js.map → design-system267.js.map} +1 -1
  246. package/dist/design-system269.js +8 -0
  247. package/dist/design-system269.js.map +1 -0
  248. package/dist/{design-system252.js → design-system270.js} +1 -1
  249. package/dist/{design-system252.js.map → design-system270.js.map} +1 -1
  250. package/dist/design-system272.js +9 -0
  251. package/dist/design-system272.js.map +1 -0
  252. package/dist/design-system273.js +12 -0
  253. package/dist/design-system273.js.map +1 -0
  254. package/dist/{design-system256.js → design-system274.js} +2 -2
  255. package/dist/{design-system256.js.map → design-system274.js.map} +1 -1
  256. package/dist/design-system276.js +9 -0
  257. package/dist/design-system276.js.map +1 -0
  258. package/dist/{design-system259.js → design-system277.js} +1 -1
  259. package/dist/{design-system259.js.map → design-system277.js.map} +1 -1
  260. package/dist/design-system278.js +377 -0
  261. package/dist/design-system278.js.map +1 -0
  262. package/dist/design-system280.js +9 -0
  263. package/dist/design-system280.js.map +1 -0
  264. package/dist/design-system69.js +182 -13
  265. package/dist/design-system69.js.map +1 -1
  266. package/dist/design-system71.js +8 -0
  267. package/dist/design-system71.js.map +1 -0
  268. package/dist/design-system72.js +13 -5
  269. package/dist/design-system72.js.map +1 -1
  270. package/dist/design-system73.js +677 -139
  271. package/dist/design-system73.js.map +1 -1
  272. package/dist/design-system75.js +1 -1
  273. package/dist/design-system75.js.map +1 -1
  274. package/dist/design-system76.js +152 -23
  275. package/dist/design-system76.js.map +1 -1
  276. package/dist/design-system78.js +5 -49
  277. package/dist/design-system78.js.map +1 -1
  278. package/dist/design-system79.js +32 -0
  279. package/dist/design-system79.js.map +1 -0
  280. package/dist/design-system80.js +2 -3
  281. package/dist/design-system80.js.map +1 -1
  282. package/dist/design-system81.js +38 -188
  283. package/dist/design-system81.js.map +1 -1
  284. package/dist/design-system83.js +1 -1
  285. package/dist/design-system83.js.map +1 -1
  286. package/dist/design-system84.js +199 -7
  287. package/dist/design-system84.js.map +1 -1
  288. package/dist/design-system86.js +8 -0
  289. package/dist/design-system86.js.map +1 -0
  290. package/dist/design-system87.js +7 -5
  291. package/dist/design-system87.js.map +1 -1
  292. package/dist/design-system88.js +264 -48
  293. package/dist/design-system88.js.map +1 -1
  294. package/dist/design-system90.js +1 -1
  295. package/dist/design-system90.js.map +1 -1
  296. package/dist/design-system91.js +57 -11
  297. package/dist/design-system91.js.map +1 -1
  298. package/dist/design-system93.js +8 -0
  299. package/dist/design-system93.js.map +1 -0
  300. package/dist/design-system94.js +11 -5
  301. package/dist/design-system94.js.map +1 -1
  302. package/dist/design-system95.js +92 -59
  303. package/dist/design-system95.js.map +1 -1
  304. package/dist/design-system97.js +1 -1
  305. package/dist/design-system97.js.map +1 -1
  306. package/dist/design-system98.js +56 -78
  307. package/dist/design-system98.js.map +1 -1
  308. package/dist/types/components/BContextMenu/BContextMenu.spec.d.ts +1 -0
  309. package/dist/types/components/BContextMenu/BContextMenu.vue.d.ts +42 -0
  310. package/dist/types/components/BContextMenu/index.d.ts +2 -0
  311. package/dist/types/components/BContextMenu/types.d.ts +23 -0
  312. package/dist/types/components/BInputTags/BInputTags.spec.d.ts +1 -0
  313. package/dist/types/components/BInputTags/BInputTags.vue.d.ts +54 -0
  314. package/dist/types/components/BInputTags/index.d.ts +1 -0
  315. package/dist/types/components/BLink/BLink.spec.d.ts +1 -0
  316. package/dist/types/components/BLink/BLink.vue.d.ts +100 -0
  317. package/dist/types/components/BLink/index.d.ts +1 -0
  318. package/dist/types/components/BListbox/BListbox.spec.d.ts +1 -0
  319. package/dist/types/components/BListbox/BListbox.vue.d.ts +52 -0
  320. package/dist/types/components/BListbox/index.d.ts +1 -0
  321. package/dist/types/components/BModal/BModal.spec.d.ts +1 -0
  322. package/dist/types/components/BPinInput/BPinInput.spec.d.ts +1 -0
  323. package/dist/types/components/BPinInput/BPinInput.vue.d.ts +43 -0
  324. package/dist/types/components/BPinInput/index.d.ts +1 -0
  325. package/dist/types/components/BProgress/BProgress.vue.d.ts +47 -2
  326. package/dist/types/components/BTextarea/BTextarea.spec.d.ts +1 -0
  327. package/dist/types/components/BTextarea/BTextarea.vue.d.ts +77 -0
  328. package/dist/types/components/BTextarea/index.d.ts +1 -0
  329. package/dist/types/components/index.d.ts +7 -1
  330. package/package.json +1 -1
  331. package/dist/design-system114.js +0 -212
  332. package/dist/design-system114.js.map +0 -1
  333. package/dist/design-system124.js +0 -277
  334. package/dist/design-system127.js +0 -19
  335. package/dist/design-system130.js +0 -15
  336. package/dist/design-system130.js.map +0 -1
  337. package/dist/design-system133.js +0 -8
  338. package/dist/design-system133.js.map +0 -1
  339. package/dist/design-system137.js +0 -236
  340. package/dist/design-system137.js.map +0 -1
  341. package/dist/design-system147.js +0 -40
  342. package/dist/design-system147.js.map +0 -1
  343. package/dist/design-system150.js +0 -7
  344. package/dist/design-system164.js +0 -61
  345. package/dist/design-system164.js.map +0 -1
  346. package/dist/design-system167.js +0 -59
  347. package/dist/design-system170.js +0 -72
  348. package/dist/design-system173.js +0 -185
  349. package/dist/design-system173.js.map +0 -1
  350. package/dist/design-system176.js +0 -118
  351. package/dist/design-system180.js +0 -465
  352. package/dist/design-system180.js.map +0 -1
  353. package/dist/design-system183.js +0 -38
  354. package/dist/design-system183.js.map +0 -1
  355. package/dist/design-system186.js +0 -91
  356. package/dist/design-system186.js.map +0 -1
  357. package/dist/design-system189.js +0 -38
  358. package/dist/design-system189.js.map +0 -1
  359. package/dist/design-system192.js +0 -31
  360. package/dist/design-system192.js.map +0 -1
  361. package/dist/design-system208.js +0 -7
  362. package/dist/design-system217.js +0 -7
  363. package/dist/design-system217.js.map +0 -1
  364. package/dist/design-system234.js +0 -286
  365. package/dist/design-system234.js.map +0 -1
  366. package/dist/design-system237.js +0 -122
  367. package/dist/design-system237.js.map +0 -1
  368. package/dist/design-system240.js +0 -115
  369. package/dist/design-system240.js.map +0 -1
  370. package/dist/design-system70.js +0 -699
  371. package/dist/design-system70.js.map +0 -1
  372. package/dist/design-system77.js +0 -7
  373. package/dist/design-system77.js.map +0 -1
  374. package/dist/design-system85.js +0 -276
  375. package/dist/design-system85.js.map +0 -1
  376. package/dist/design-system92.js +0 -102
  377. package/dist/design-system92.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"design-system256.js","names":["$slots"],"sources":["../src/components/BTreeSelect/BTreeSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useComponentId } from '@/composables/useComponentId.ts';\nimport { BCommonSize } from '@/types.ts';\nimport { computed, nextTick, ref, useAttrs, watch } from 'vue';\nimport {\n BTreeSelectPlacement,\n BTreeSelectStatus,\n BTreeSelectVariant,\n type BTreeSelectChangeExtra,\n type BTreeSelectExpandAction,\n type BTreeSelectFieldNames,\n type BTreeSelectFlatNode,\n type BTreeSelectLabeledValue,\n type BTreeSelectModelValue,\n type BTreeSelectNode,\n type BTreeSelectShowSearchConfig,\n type BTreeSelectValue,\n} from './types.ts';\n\ndefineOptions({ inheritAttrs: false });\n\nconst attrs = useAttrs();\n\nconst {\n treeData = [],\n fieldNames,\n multiple = false,\n treeCheckable = false,\n treeCheckStrictly = false,\n labelInValue = false,\n size = BCommonSize.Medium,\n variant = BTreeSelectVariant.Outlined,\n placeholder,\n disabled = false,\n status,\n defaultOpen = false,\n showSearch = false,\n treeDefaultExpandAll = false,\n treeDefaultExpandedKeys = [],\n treeExpandedKeys: treeExpandedKeysProp,\n treeExpandAction = false,\n treeIcon = false,\n treeLine = false,\n loadData,\n placement: _placement = BTreeSelectPlacement.BottomLeft,\n popupMatchSelectWidth = true,\n listHeight = 256,\n maxTagCount,\n maxTagPlaceholder,\n maxCount,\n allowClear = false,\n notFoundContent = 'Not Found',\n filterTreeNode = true,\n treeNodeFilterProp = 'title',\n treeNodeLabelProp,\n} = defineProps<{\n /** Hierarchical data of the tree. */\n treeData?: BTreeSelectNode[];\n /** Replace default field names. */\n fieldNames?: BTreeSelectFieldNames;\n /** Allow multiple selection (without checkboxes). */\n multiple?: boolean;\n /** Show checkboxes — implies multiple. */\n treeCheckable?: boolean;\n /** Whether checkable parent/child are independent. */\n treeCheckStrictly?: boolean;\n /** Embed label in value (returns `{ value, label }`). */\n labelInValue?: boolean;\n /** Selector size. */\n size?: `${BCommonSize}`;\n /** Visual variant. */\n variant?: `${BTreeSelectVariant}`;\n /** Placeholder text when nothing selected. */\n placeholder?: string;\n /** Disable the component. */\n disabled?: boolean;\n /** Validation status. */\n status?: `${BTreeSelectStatus}`;\n /** Default open state (uncontrolled). */\n defaultOpen?: boolean;\n /** Show search input — `true` or a config object. */\n showSearch?: boolean | BTreeSelectShowSearchConfig;\n /** Expand all nodes on mount. */\n treeDefaultExpandAll?: boolean;\n /** Default expanded keys (uncontrolled). */\n treeDefaultExpandedKeys?: BTreeSelectValue[];\n /** Controlled expanded keys. */\n treeExpandedKeys?: BTreeSelectValue[];\n /** When to expand on click — `click | doubleClick | false`. */\n treeExpandAction?: BTreeSelectExpandAction;\n /** Show node icons. */\n treeIcon?: boolean;\n /** Show connector lines between nodes. */\n treeLine?: boolean;\n /** Async-load child nodes. */\n loadData?: (node: BTreeSelectNode) => Promise<void>;\n /** Dropdown placement. */\n placement?: `${BTreeSelectPlacement}`;\n /** Match popup width to selector. */\n popupMatchSelectWidth?: boolean | number;\n /** Max popup list height in px. */\n listHeight?: number;\n /** Max tags to show before collapsing into +N. */\n maxTagCount?: number | 'responsive';\n /** Custom +N tag content (function or string). */\n maxTagPlaceholder?: string | ((omitted: BTreeSelectLabeledValue[]) => string);\n /** Maximum selectable nodes. */\n maxCount?: number;\n /** Show a clear button when there is a value. */\n allowClear?: boolean;\n /** Content when search yields no results. */\n notFoundContent?: string;\n /** Filter behavior — `true` uses default, `false` disables, function for custom. */\n filterTreeNode?: boolean | ((input: string, node: BTreeSelectNode) => boolean);\n /** Property of the node used for default filtering. */\n treeNodeFilterProp?: string;\n /** Property used as the displayed label (defaults to fieldNames.label). */\n treeNodeLabelProp?: string;\n}>();\n\nconst emit = defineEmits<{\n /** Fires when selection value changes. */\n change: [\n value: BTreeSelectValue | BTreeSelectValue[] | BTreeSelectLabeledValue | BTreeSelectLabeledValue[] | undefined,\n label: string | string[],\n extra: BTreeSelectChangeExtra,\n ];\n /** Fires when a node is selected (single/multiple modes). */\n select: [value: BTreeSelectValue, node: BTreeSelectNode];\n /** Fires when a node is deselected (multiple/treeCheckable modes). */\n deselect: [value: BTreeSelectValue, node: BTreeSelectNode];\n /** Fires when a node is checked/unchecked (treeCheckable mode). */\n treeCheck: [keys: BTreeSelectValue[], info: { checked: boolean; node: BTreeSelectNode }];\n /** Fires when popup visibility changes. */\n openChange: [open: boolean];\n /** Fires when the popup scrolls. */\n popupScroll: [event: Event];\n /** Fires when expanded keys change. */\n treeExpand: [expandedKeys: BTreeSelectValue[]];\n /** Fires when search input changes. */\n search: [value: string];\n /** Fires when clear is pressed. */\n clear: [];\n /** Fires on selector focus. */\n focus: [event: FocusEvent];\n /** Fires on selector blur. */\n blur: [event: FocusEvent];\n}>();\n\nconst model = defineModel<BTreeSelectModelValue>();\nconst openModel = defineModel<boolean>('open', { default: false });\nif (defaultOpen && !openModel.value) openModel.value = defaultOpen;\n\ndefineSlots<{\n /** Suffix icon (replaces default arrow). */\n suffixIcon?(): unknown;\n /** Custom switcher icon. */\n switcherIcon?(props: { node: BTreeSelectNode; expanded: boolean }): unknown;\n /** Custom node title renderer. */\n title?(props: { node: BTreeSelectNode }): unknown;\n /** Custom tag renderer (multiple/treeCheckable). */\n tagRender?(props: { value: BTreeSelectValue; label: string; closable: boolean; onClose: () => void }): unknown;\n /** Custom not-found content. */\n notFoundContent?(): unknown;\n /** Custom node icon. */\n treeIcon?(props: { node: BTreeSelectNode }): unknown;\n}>();\n\n// ─── Field name resolution ────────────────────────────────────────────────────\nconst labelField = computed(() => fieldNames?.label ?? 'title');\nconst valueField = computed(() => fieldNames?.value ?? 'value');\nconst childrenField = computed(() => fieldNames?.children ?? 'children');\nconst displayLabelField = computed(() => treeNodeLabelProp ?? labelField.value);\n\nfunction getLabel(n: BTreeSelectNode): string {\n return String((n as Record<string, unknown>)[labelField.value] ?? '');\n}\nfunction getDisplayLabel(n: BTreeSelectNode): string {\n const v = (n as Record<string, unknown>)[displayLabelField.value];\n return v == null ? getLabel(n) : String(v);\n}\nfunction getValue(n: BTreeSelectNode): BTreeSelectValue {\n return (n as Record<string, unknown>)[valueField.value] as BTreeSelectValue;\n}\nfunction getKey(n: BTreeSelectNode): BTreeSelectValue {\n return (n.key as BTreeSelectValue) ?? getValue(n);\n}\nfunction getChildren(n: BTreeSelectNode): BTreeSelectNode[] | undefined {\n return (n as Record<string, unknown>)[childrenField.value] as BTreeSelectNode[] | undefined;\n}\n\n// ─── Identity / IDs ───────────────────────────────────────────────────────────\nconst { componentUID } = useComponentId();\nconst anchorName = computed(() => `--b-tree-select-anchor-${componentUID.value}`);\nconst treeId = computed(() => `b-tree-select-tree-${componentUID.value}`);\n\n// ─── Refs ─────────────────────────────────────────────────────────────────────\nconst selectorRef = ref<HTMLElement | null>(null);\nconst searchInputRef = ref<HTMLInputElement | null>(null);\nconst popoverRef = ref<HTMLElement | null>(null);\nconst treeRef = ref<HTMLElement | null>(null);\n\n// ─── State ────────────────────────────────────────────────────────────────────\nconst isOpen = computed(() => !!openModel.value);\n\nconst searchValue = ref('');\n\nconst internalExpanded = ref<Set<BTreeSelectValue>>(new Set());\nconst isControlledExpanded = computed(() => treeExpandedKeysProp !== undefined);\nconst activeExpanded = computed<Set<BTreeSelectValue>>(() => {\n if (isControlledExpanded.value) return new Set(treeExpandedKeysProp);\n return internalExpanded.value;\n});\n\nconst focusedKey = ref<BTreeSelectValue | null>(null);\nconst loadingKeys = ref<Set<BTreeSelectValue>>(new Set());\nconst loadedKeys = ref<Set<BTreeSelectValue>>(new Set());\n\n// ─── Mode helpers ────────────────────────────────────────────────────────────\nconst isMultiple = computed(() => multiple || treeCheckable);\n\n// ─── Tree traversal ───────────────────────────────────────────────────────────\nfunction flatten(\n nodes: BTreeSelectNode[],\n depth = 0,\n parents: BTreeSelectValue[] = [],\n parentVisible = true,\n): BTreeSelectFlatNode[] {\n const out: BTreeSelectFlatNode[] = [];\n for (const node of nodes) {\n const value = getValue(node);\n const key = getKey(node);\n const expanded = activeExpanded.value.has(key);\n out.push({ key, value, data: node, depth, visible: parentVisible, parents });\n const children = getChildren(node);\n if (children?.length) {\n out.push(...flatten(children, depth + 1, [...parents, value], parentVisible && expanded));\n }\n }\n return out;\n}\n\nconst flatNodes = computed(() => flatten(treeData));\nconst nodeByValue = computed(() => {\n const map = new Map<BTreeSelectValue, BTreeSelectNode>();\n for (const f of flatNodes.value) map.set(f.value, f.data);\n return map;\n});\n\n// ─── Search filtering ─────────────────────────────────────────────────────────\nconst searchEnabled = computed(() => !!showSearch);\n\nfunction nodeMatches(node: BTreeSelectNode, query: string): boolean {\n if (!query) return true;\n if (typeof filterTreeNode === 'function') return filterTreeNode(query, node);\n if (filterTreeNode === false) return true;\n const cfg = typeof showSearch === 'object' && showSearch !== null ? showSearch : null;\n if (cfg?.filter) return cfg.filter(query, node);\n const prop = treeNodeFilterProp ?? 'title';\n const value = (node as Record<string, unknown>)[prop];\n return String(value ?? '')\n .toLowerCase()\n .includes(query.toLowerCase());\n}\n\nconst visibleFlatNodes = computed(() => {\n const q = searchValue.value.trim();\n if (!q) return flatNodes.value.filter((n) => n.visible);\n\n // Show ancestors of any matching node\n const keepValues = new Set<BTreeSelectValue>();\n for (const f of flatNodes.value) {\n if (nodeMatches(f.data, q)) {\n keepValues.add(f.value);\n f.parents.forEach((p) => keepValues.add(p));\n }\n }\n return flatNodes.value\n .filter((f) => keepValues.has(f.value))\n .map((f) => ({ ...f, visible: true }));\n});\n\n// ─── Value / model helpers ────────────────────────────────────────────────────\nfunction toRawValue(v: BTreeSelectValue | BTreeSelectLabeledValue): BTreeSelectValue {\n if (typeof v === 'object' && v !== null) return v.value;\n return v as BTreeSelectValue;\n}\n\nconst selectedValues = computed<BTreeSelectValue[]>(() => {\n const m = model.value;\n if (m == null) return [];\n if (Array.isArray(m)) return m.map(toRawValue);\n return [toRawValue(m as BTreeSelectValue | BTreeSelectLabeledValue)];\n});\n\nconst selectedSet = computed(() => new Set(selectedValues.value));\n\n// In treeCheckable mode w/o strict, derive half-checked state from selectedValues\nconst halfCheckedSet = computed<Set<BTreeSelectValue>>(() => {\n if (!treeCheckable || treeCheckStrictly) return new Set();\n const half = new Set<BTreeSelectValue>();\n function walk(nodes: BTreeSelectNode[]): { all: boolean; some: boolean } {\n let all = true;\n let some = false;\n for (const n of nodes) {\n const v = getValue(n);\n const children = getChildren(n);\n if (children?.length) {\n const sub = walk(children);\n if (sub.all) {\n some = true;\n } else if (sub.some) {\n half.add(v);\n all = false;\n some = true;\n } else {\n if (!selectedSet.value.has(v)) all = false;\n else some = true;\n }\n } else {\n if (!selectedSet.value.has(v)) all = false;\n else some = true;\n }\n }\n return { all, some };\n }\n walk(treeData);\n return half;\n});\n\n// ─── Display tags / single label ──────────────────────────────────────────────\nconst displayTags = computed<BTreeSelectLabeledValue[]>(() => {\n return selectedValues.value.map((v) => {\n const node = nodeByValue.value.get(v);\n const fromModel = Array.isArray(model.value)\n ? (model.value.find(\n (m) => typeof m === 'object' && m !== null && 'value' in m && (m as BTreeSelectLabeledValue).value === v,\n ) as BTreeSelectLabeledValue | undefined)\n : typeof model.value === 'object' && model.value !== null && 'value' in (model.value as object) &&\n (model.value as BTreeSelectLabeledValue).value === v\n ? (model.value as BTreeSelectLabeledValue)\n : undefined;\n const label = node ? getDisplayLabel(node) : (fromModel?.label ?? String(v));\n return { value: v, label };\n });\n});\n\nconst singleLabel = computed(() => displayTags.value[0]?.label ?? '');\n\nconst visibleTags = computed(() => {\n if (maxTagCount == null || maxTagCount === 'responsive') return displayTags.value;\n return displayTags.value.slice(0, maxTagCount as number);\n});\n\nconst omittedTags = computed(() => {\n if (maxTagCount == null || maxTagCount === 'responsive') return [] as BTreeSelectLabeledValue[];\n return displayTags.value.slice(maxTagCount as number);\n});\n\nconst omittedPlaceholder = computed(() => {\n const omitted = omittedTags.value;\n if (omitted.length === 0) return '';\n if (typeof maxTagPlaceholder === 'function') return maxTagPlaceholder(omitted);\n if (typeof maxTagPlaceholder === 'string') return maxTagPlaceholder;\n return `+ ${omitted.length} ...`;\n});\n\n// ─── Initialise expanded ──────────────────────────────────────────────────────\nfunction collectAllExpandableKeys(nodes: BTreeSelectNode[]): BTreeSelectValue[] {\n const out: BTreeSelectValue[] = [];\n for (const n of nodes) {\n const ch = getChildren(n);\n if (ch?.length) {\n out.push(getKey(n));\n out.push(...collectAllExpandableKeys(ch));\n }\n }\n return out;\n}\n\nif (!isControlledExpanded.value) {\n if (treeDefaultExpandAll) {\n internalExpanded.value = new Set(collectAllExpandableKeys(treeData));\n } else if (treeDefaultExpandedKeys.length) {\n internalExpanded.value = new Set(treeDefaultExpandedKeys);\n }\n}\n\n// ─── Open/close ───────────────────────────────────────────────────────────────\nlet previouslyFocusedElement: HTMLElement | null = null;\n\nfunction setOpen(val: boolean) {\n if (openModel.value !== val) openModel.value = val;\n emit('openChange', val);\n}\n\nfunction openMenu() {\n if (disabled || isOpen.value) return;\n previouslyFocusedElement = document.activeElement as HTMLElement | null;\n setOpen(true);\n}\n\nfunction closeMenu() {\n if (!isOpen.value) return;\n setOpen(false);\n searchValue.value = '';\n // Return focus to selector\n nextTick(() => {\n if (previouslyFocusedElement?.isConnected) {\n previouslyFocusedElement.focus();\n } else {\n selectorRef.value?.focus();\n }\n });\n}\n\nwatch(isOpen, (val) => {\n if (val) {\n nextTick(() => {\n popoverRef.value?.showPopover?.();\n if (searchEnabled.value) searchInputRef.value?.focus();\n // Initial focused node\n if (!focusedKey.value && visibleFlatNodes.value[0]) {\n focusedKey.value = visibleFlatNodes.value[0].key;\n }\n });\n } else {\n popoverRef.value?.hidePopover?.();\n }\n});\n\n// ─── Toggle expand ────────────────────────────────────────────────────────────\nasync function toggleExpand(node: BTreeSelectNode) {\n const k = getKey(node);\n if (node.disabled) return;\n\n const expanding = !activeExpanded.value.has(k);\n\n // Async load\n if (expanding && loadData && !loadedKeys.value.has(k) && !loadingKeys.value.has(k)) {\n loadingKeys.value.add(k);\n try {\n await loadData(node);\n loadedKeys.value.add(k);\n } finally {\n loadingKeys.value.delete(k);\n }\n }\n\n let next: Set<BTreeSelectValue>;\n if (isControlledExpanded.value) {\n next = new Set(treeExpandedKeysProp);\n } else {\n next = new Set(internalExpanded.value);\n }\n if (expanding) next.add(k);\n else next.delete(k);\n\n if (!isControlledExpanded.value) internalExpanded.value = next;\n emit('treeExpand', [...next]);\n}\n\n// ─── Selection / check ────────────────────────────────────────────────────────\nfunction emitChange(\n values: BTreeSelectValue[],\n triggerNode: BTreeSelectNode,\n extra: Partial<BTreeSelectChangeExtra> = {},\n) {\n const labels = values.map((v) => {\n const n = nodeByValue.value.get(v);\n return n ? getDisplayLabel(n) : String(v);\n });\n\n // Build emit value\n let emitValue: BTreeSelectValue | BTreeSelectValue[] | BTreeSelectLabeledValue | BTreeSelectLabeledValue[] | undefined;\n if (isMultiple.value) {\n emitValue = labelInValue\n ? values.map((v, i) => ({ value: v, label: labels[i] }))\n : [...values];\n } else {\n if (values.length === 0) {\n emitValue = labelInValue ? undefined : undefined;\n } else {\n emitValue = labelInValue ? { value: values[0], label: labels[0] } : values[0];\n }\n }\n\n model.value = emitValue;\n emit('change', emitValue, isMultiple.value ? labels : (labels[0] ?? ''), {\n triggerValue: getValue(triggerNode),\n triggerNode,\n ...extra,\n });\n}\n\nfunction selectNode(node: BTreeSelectNode) {\n if (node.disabled || node.selectable === false) return;\n const v = getValue(node);\n\n if (treeCheckable) {\n handleCheck(node);\n return;\n }\n\n if (isMultiple.value) {\n const cur = selectedValues.value.slice();\n const idx = cur.indexOf(v);\n if (idx >= 0) {\n cur.splice(idx, 1);\n emit('deselect', v, node);\n emitChange(cur, node, { selected: false });\n } else {\n if (maxCount != null && cur.length >= maxCount) return;\n cur.push(v);\n emit('select', v, node);\n emitChange(cur, node, { selected: true });\n }\n } else {\n if (selectedValues.value[0] === v) {\n // Already selected: just close\n closeMenu();\n return;\n }\n emit('select', v, node);\n emitChange([v], node, { selected: true });\n closeMenu();\n }\n}\n\nfunction handleCheck(node: BTreeSelectNode) {\n if (node.disabled || node.disableCheckbox) return;\n const v = getValue(node);\n const cur = new Set(selectedValues.value);\n const isCurrentlyChecked = cur.has(v);\n\n if (treeCheckStrictly) {\n if (isCurrentlyChecked) {\n cur.delete(v);\n emit('deselect', v, node);\n } else {\n if (maxCount != null && cur.size >= maxCount) return;\n cur.add(v);\n emit('select', v, node);\n }\n } else {\n // cascade\n if (isCurrentlyChecked) {\n cur.delete(v);\n function uncheck(nodes: BTreeSelectNode[]) {\n for (const n of nodes) {\n cur.delete(getValue(n));\n const ch = getChildren(n);\n if (ch?.length) uncheck(ch);\n }\n }\n const ch = getChildren(node);\n if (ch?.length) uncheck(ch);\n emit('deselect', v, node);\n } else {\n if (maxCount != null && cur.size >= maxCount) return;\n cur.add(v);\n function check(nodes: BTreeSelectNode[]) {\n for (const n of nodes) {\n if (!n.disabled && !n.disableCheckbox) cur.add(getValue(n));\n const ch = getChildren(n);\n if (ch?.length) check(ch);\n }\n }\n const ch = getChildren(node);\n if (ch?.length) check(ch);\n emit('select', v, node);\n }\n // Recompute parent state by removing parents that aren't fully selected\n function syncParents(nodes: BTreeSelectNode[]): { all: boolean; some: boolean } {\n let all = true;\n let some = false;\n for (const n of nodes) {\n const value = getValue(n);\n const children = getChildren(n);\n if (children?.length) {\n const sub = syncParents(children);\n if (sub.all) {\n cur.add(value);\n some = true;\n } else if (sub.some) {\n cur.delete(value);\n all = false;\n some = true;\n } else {\n cur.delete(value);\n if (!cur.has(value)) all = false;\n }\n } else {\n if (!cur.has(value)) all = false;\n else some = true;\n }\n }\n return { all, some };\n }\n syncParents(treeData);\n }\n\n emit('treeCheck', [...cur], { checked: !isCurrentlyChecked, node });\n emitChange([...cur], node, { checked: !isCurrentlyChecked });\n}\n\nfunction removeTag(value: BTreeSelectValue, e?: Event) {\n e?.stopPropagation();\n const node = nodeByValue.value.get(value);\n if (treeCheckable && node) {\n handleCheck(node);\n return;\n }\n const next = selectedValues.value.filter((v) => v !== value);\n if (node) emit('deselect', value, node);\n emitChange(next, node ?? ({ [valueField.value]: value } as BTreeSelectNode), { selected: false });\n}\n\nfunction handleClear(e: Event) {\n e.stopPropagation();\n const dummy = { [valueField.value]: '' } as BTreeSelectNode;\n if (isMultiple.value) {\n model.value = [];\n } else {\n model.value = undefined;\n }\n searchValue.value = '';\n emit('clear');\n emit('change', model.value, isMultiple.value ? [] : '', {\n triggerNode: dummy,\n triggerValue: undefined,\n });\n}\n\n// ─── Click outside ────────────────────────────────────────────────────────────\nfunction onSelectorClick() {\n if (disabled) return;\n if (isOpen.value) closeMenu();\n else openMenu();\n}\n\nfunction onSelectorBlur(e: FocusEvent) {\n const related = e.relatedTarget as HTMLElement | null;\n if (popoverRef.value?.contains(related)) return;\n if (selectorRef.value?.contains(related)) return;\n emit('blur', e);\n}\n\nfunction onSelectorFocus(e: FocusEvent) {\n emit('focus', e);\n}\n\nfunction onSearchInput(e: Event) {\n const t = e.target as HTMLInputElement;\n searchValue.value = t.value;\n emit('search', t.value);\n if (!isOpen.value) openMenu();\n // Focus first visible node when searching\n nextTick(() => {\n focusedKey.value = visibleFlatNodes.value[0]?.key ?? null;\n });\n}\n\nfunction onPopupScroll(e: Event) {\n emit('popupScroll', e);\n}\n\n// ─── Keyboard handling ────────────────────────────────────────────────────────\nfunction focusVisibleNode(key: BTreeSelectValue) {\n focusedKey.value = key;\n nextTick(() => {\n const safe = String(key).replace(/[\"\\\\]/g, '\\\\$&');\n const el = treeRef.value?.querySelector<HTMLElement>(\n `[data-node-key=\"${safe}\"]`,\n );\n el?.focus();\n el?.scrollIntoView?.({ block: 'nearest' });\n });\n}\n\nfunction onSelectorKeyDown(e: KeyboardEvent) {\n if (disabled) return;\n switch (e.key) {\n case 'Enter':\n case ' ':\n if (!searchEnabled.value || !isOpen.value) {\n e.preventDefault();\n if (isOpen.value) closeMenu();\n else openMenu();\n }\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen.value) openMenu();\n nextTick(() => {\n const first = visibleFlatNodes.value[0];\n if (first) focusVisibleNode(first.key);\n });\n break;\n case 'Escape':\n if (isOpen.value) {\n e.preventDefault();\n closeMenu();\n }\n break;\n case 'Backspace':\n if (isMultiple.value && !searchValue.value && selectedValues.value.length > 0) {\n const last = selectedValues.value[selectedValues.value.length - 1];\n removeTag(last);\n }\n break;\n case 'Tab':\n if (isOpen.value) closeMenu();\n break;\n }\n}\n\nfunction onTreeKeyDown(e: KeyboardEvent) {\n const visible = visibleFlatNodes.value;\n if (!visible.length) return;\n const idx = visible.findIndex((n) => n.key === focusedKey.value);\n const cur = visible[idx];\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n const next = visible[idx + 1] ?? visible[0];\n focusVisibleNode(next.key);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const prev = visible[idx - 1] ?? visible[visible.length - 1];\n focusVisibleNode(prev.key);\n break;\n }\n case 'ArrowRight': {\n e.preventDefault();\n if (!cur) break;\n if (hasChildren(cur.data) && !activeExpanded.value.has(cur.key)) toggleExpand(cur.data);\n break;\n }\n case 'ArrowLeft': {\n e.preventDefault();\n if (!cur) break;\n if (activeExpanded.value.has(cur.key)) toggleExpand(cur.data);\n break;\n }\n case 'Enter':\n case ' ': {\n e.preventDefault();\n if (cur) selectNode(cur.data);\n break;\n }\n case 'Escape':\n e.preventDefault();\n closeMenu();\n break;\n case 'Home': {\n e.preventDefault();\n if (visible[0]) focusVisibleNode(visible[0].key);\n break;\n }\n case 'End': {\n e.preventDefault();\n const last = visible[visible.length - 1];\n if (last) focusVisibleNode(last.key);\n break;\n }\n case 'Tab': {\n closeMenu();\n break;\n }\n }\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\nfunction hasChildren(node: BTreeSelectNode): boolean {\n const ch = getChildren(node);\n return !!ch?.length || (!!loadData && !node.isLeaf);\n}\n\nfunction isExpanded(key: BTreeSelectValue) {\n return activeExpanded.value.has(key);\n}\n\nfunction isLoading(key: BTreeSelectValue) {\n return loadingKeys.value.has(key);\n}\n\nfunction nodeIsSelectable(node: BTreeSelectNode) {\n if (treeCheckable) return node.checkable !== false && !node.disabled && !node.disableCheckbox;\n return node.selectable !== false && !node.disabled;\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\ndefineExpose({\n focus: () => selectorRef.value?.focus(),\n blur: () => selectorRef.value?.blur(),\n});\n\n// ─── Computed UI helpers ──────────────────────────────────────────────────────\nconst showClear = computed(() => {\n if (!allowClear || disabled) return false;\n return selectedValues.value.length > 0;\n});\n\nconst sizeClass = computed(() => `b-tree-select--${size}`);\nconst variantClass = computed(() => `b-tree-select--${variant}`);\nconst statusClass = computed(() => (status ? `b-tree-select--${status}` : ''));\n\nconst expandTrigger = computed(() => treeExpandAction);\n\nfunction onNodeRowClick(node: BTreeSelectNode, event: MouseEvent) {\n if (expandTrigger.value === 'click' && hasChildren(node) && nodeIsSelectable(node)) {\n toggleExpand(node);\n }\n selectNode(node);\n void event;\n}\n\nfunction onNodeRowDblClick(node: BTreeSelectNode) {\n if (expandTrigger.value === 'doubleClick' && hasChildren(node)) {\n toggleExpand(node);\n }\n}\n</script>\n\n<template>\n <div\n class=\"b-tree-select b:relative b:inline-flex b:w-full\"\n :class=\"[sizeClass, variantClass, statusClass, { 'b-tree-select--disabled': disabled, 'b-tree-select--multiple': isMultiple, 'b-tree-select--open': isOpen }]\"\n >\n <!-- ─── Selector trigger ───────────────────────────────────────── -->\n <div\n ref=\"selectorRef\"\n v-bind=\"attrs\"\n class=\"b-tree-select__selector b:box-border b:flex b:w-full b:cursor-pointer b:items-center b:gap-1 b:transition-all b:outline-none\"\n :class=\"[\n {\n 'b:min-h-6 b:px-2 b:text-sm': size === BCommonSize.Small,\n 'b:min-h-8 b:px-3 b:text-sm': size === BCommonSize.Medium,\n 'b:min-h-10 b:px-3 b:text-base': size === BCommonSize.Large,\n },\n {\n 'b:rounded-lg b:border-1 b:border-[var(--b-tree-select-border-color)] b:bg-[var(--b-tree-select-bg)] b:hover:not-disabled:border-[var(--b-tree-select-hover-border-color)] b:focus:not-disabled:border-[var(--b-tree-select-active-border-color)] b:focus:not-disabled:shadow-[0_0_0_2px_var(--b-tree-select-active-outline-color)]':\n variant === BTreeSelectVariant.Outlined,\n 'b:rounded-lg b:border-1 b:border-transparent b:bg-[var(--b-tree-select-filled-bg)] b:focus:not-disabled:border-[var(--b-tree-select-active-border-color)] b:focus:not-disabled:bg-[var(--b-tree-select-bg)] b:focus:not-disabled:shadow-[0_0_0_2px_var(--b-tree-select-active-outline-color)]':\n variant === BTreeSelectVariant.Filled,\n 'b:rounded-lg b:border-1 b:border-transparent b:bg-transparent':\n variant === BTreeSelectVariant.Borderless,\n 'b:rounded-none b:border-0 b:border-b-1 b:border-[var(--b-tree-select-border-color)] b:bg-transparent':\n variant === BTreeSelectVariant.Underlined,\n },\n {\n 'b:border-red-500! b:hover:not-disabled:border-red-400! b:focus:not-disabled:border-red-500! b:focus:not-disabled:shadow-[0_0_0_2px_rgba(255,38,5,0.06)]!':\n status === BTreeSelectStatus.Error,\n 'b:border-yellow-500! b:hover:not-disabled:border-yellow-400! b:focus:not-disabled:border-yellow-500! b:focus:not-disabled:shadow-[0_0_0_2px_rgba(255,215,5,0.1)]!':\n status === BTreeSelectStatus.Warning,\n },\n {\n 'b:cursor-not-allowed b:opacity-40': disabled,\n },\n ]\"\n :tabindex=\"disabled ? -1 : 0\"\n role=\"combobox\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"isOpen ? treeId : undefined\"\n aria-haspopup=\"tree\"\n :aria-label=\"placeholder ?? 'Tree select'\"\n :aria-disabled=\"disabled || undefined\"\n @click=\"onSelectorClick\"\n @keydown=\"onSelectorKeyDown\"\n @focus=\"onSelectorFocus\"\n @blur=\"onSelectorBlur\"\n >\n <!-- ─── Multiple/checkable mode: tags ─── -->\n <template v-if=\"isMultiple\">\n <span\n v-for=\"tag in visibleTags\"\n :key=\"String(tag.value)\"\n class=\"b-tree-select__tag b:inline-flex b:max-w-full b:items-center b:gap-0.5 b:rounded b:border-1 b:border-[var(--b-tree-select-tag-border-color)] b:bg-[var(--b-tree-select-tag-bg)] b:leading-none\"\n :class=\"[\n {\n 'b:h-4 b:px-1 b:text-xs': size === BCommonSize.Small,\n 'b:h-6 b:px-1.5 b:text-xs': size === BCommonSize.Medium,\n 'b:h-8 b:px-2 b:text-sm': size === BCommonSize.Large,\n },\n ]\"\n >\n <slot\n name=\"tagRender\"\n :value=\"tag.value\"\n :label=\"tag.label\"\n :closable=\"!disabled\"\n :on-close=\"() => removeTag(tag.value)\"\n >\n <span class=\"b:truncate\">{{ tag.label }}</span>\n <button\n v-if=\"!disabled\"\n type=\"button\"\n class=\"b-tree-select__tag-close b:ml-0.5 b:flex b:h-3.5 b:w-3.5 b:cursor-pointer b:items-center b:justify-center b:rounded-full b:border-none b:bg-transparent b:text-[10px] b:text-zinc-400 b:hover:bg-zinc-200 b:hover:text-zinc-600\"\n :aria-label=\"`Remove ${tag.label}`\"\n tabindex=\"-1\"\n @click.stop=\"removeTag(tag.value)\"\n @mousedown.prevent\n >\n <svg aria-hidden=\"true\" width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\n <path d=\"M1 1l6 6M7 1L1 7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n </slot>\n </span>\n <span\n v-if=\"omittedTags.length > 0\"\n class=\"b-tree-select__tag b-tree-select__tag--count b:relative b:z-1 b:inline-flex b:shrink-0 b:items-center b:rounded b:bg-[var(--b-tree-select-multiple-count-bg)] b:px-1.5 b:text-xs b:leading-none b:text-[var(--b-tree-select-multiple-count-color)]\"\n :class=\"[\n {\n 'b:h-4': size === BCommonSize.Small,\n 'b:h-6': size === BCommonSize.Medium,\n 'b:h-8': size === BCommonSize.Large,\n },\n ]\"\n >\n {{ omittedPlaceholder }}\n </span>\n <input\n v-if=\"searchEnabled\"\n ref=\"searchInputRef\"\n class=\"b-tree-select__search b:min-w-4 b:flex-1 b:border-none b:bg-transparent b:text-sm b:outline-none b:placeholder:text-[var(--b-tree-select-placeholder-color)]\"\n :value=\"searchValue\"\n :placeholder=\"selectedValues.length === 0 ? placeholder : undefined\"\n :disabled=\"disabled\"\n aria-autocomplete=\"list\"\n :aria-label=\"placeholder ?? 'Search'\"\n autocomplete=\"off\"\n @input=\"onSearchInput\"\n />\n <span\n v-else-if=\"selectedValues.length === 0\"\n class=\"b-tree-select__placeholder b:flex-1 b:truncate b:text-[var(--b-tree-select-placeholder-color)]\"\n >\n {{ placeholder }}\n </span>\n </template>\n\n <!-- ─── Single mode ─── -->\n <template v-else>\n <span\n v-if=\"singleLabel && !searchValue\"\n class=\"b-tree-select__value b:flex-1 b:truncate b:text-[color:var(--b-tree-select-color)]\"\n >\n {{ singleLabel }}\n </span>\n <span\n v-else-if=\"!singleLabel && !searchValue\"\n class=\"b-tree-select__placeholder b:flex-1 b:truncate b:text-[var(--b-tree-select-placeholder-color)]\"\n >\n {{ placeholder }}\n </span>\n <input\n v-if=\"searchEnabled\"\n ref=\"searchInputRef\"\n class=\"b-tree-select__search b:absolute b:inset-0 b:w-full b:border-none b:bg-transparent b:px-3 b:text-sm b:outline-none b:placeholder:text-[var(--b-tree-select-placeholder-color)]\"\n :class=\"{ 'b:opacity-0': !isOpen }\"\n :value=\"searchValue\"\n :disabled=\"disabled\"\n autocomplete=\"off\"\n tabindex=\"-1\"\n aria-autocomplete=\"list\"\n :aria-label=\"placeholder ?? 'Search'\"\n @input=\"onSearchInput\"\n />\n </template>\n\n <!-- Clear button -->\n <button\n v-if=\"showClear\"\n type=\"button\"\n class=\"b-tree-select__clear b:z-1 b:flex b:h-4 b:w-4 b:shrink-0 b:cursor-pointer b:items-center b:justify-center b:rounded-full b:border-none b:bg-[var(--b-tree-select-bg)] b:text-xs b:text-zinc-400 b:hover:text-zinc-600\"\n aria-label=\"Clear selection\"\n tabindex=\"-1\"\n @click=\"handleClear\"\n @mousedown.prevent\n >\n <svg aria-hidden=\"true\" width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\n <path d=\"M1 1l6 6M7 1L1 7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n\n <!-- Suffix arrow -->\n <span\n class=\"b-tree-select__arrow b:ml-auto b:flex b:shrink-0 b:items-center b:text-zinc-400 b:transition-transform b:duration-200\"\n :class=\"{ 'b:rotate-180': isOpen }\"\n aria-hidden=\"true\"\n >\n <slot name=\"suffixIcon\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M2.5 4.5L6 8L9.5 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </slot>\n </span>\n </div>\n\n <!-- ─── Popup ─── -->\n <div\n :id=\"treeId\"\n ref=\"popoverRef\"\n class=\"b-tree-select__dropdown\"\n :class=\"{ 'b-tree-select__dropdown--match-width': popupMatchSelectWidth === true }\"\n :style=\"[\n typeof popupMatchSelectWidth === 'number'\n ? { width: `${popupMatchSelectWidth}px` }\n : undefined,\n { maxHeight: `${listHeight}px` },\n ]\"\n popover\n role=\"dialog\"\n aria-modal=\"false\"\n :aria-label=\"placeholder ?? 'Tree options'\"\n @scroll=\"onPopupScroll\"\n @keydown=\"onTreeKeyDown\"\n >\n <div\n ref=\"treeRef\"\n class=\"b-tree-select__tree\"\n :class=\"{ 'b-tree-select__tree--show-line': treeLine }\"\n role=\"tree\"\n :aria-multiselectable=\"isMultiple || undefined\"\n >\n <template v-if=\"visibleFlatNodes.length > 0\">\n <div\n v-for=\"flat in visibleFlatNodes\"\n :key=\"String(flat.key)\"\n :data-node-key=\"String(flat.key)\"\n class=\"b-tree-select__node\"\n :class=\"{\n 'b-tree-select__node--selected': !treeCheckable && selectedSet.has(flat.value),\n 'b-tree-select__node--disabled': flat.data.disabled,\n 'b-tree-select__node--focused': focusedKey === flat.key,\n 'b-tree-select__node--expanded': isExpanded(flat.key),\n }\"\n role=\"treeitem\"\n :aria-expanded=\"hasChildren(flat.data) ? isExpanded(flat.key) : undefined\"\n :aria-selected=\"!treeCheckable && selectedSet.has(flat.value)\"\n :aria-checked=\"treeCheckable\n ? halfCheckedSet.has(flat.value)\n ? 'mixed'\n : selectedSet.has(flat.value)\n : undefined\"\n :aria-disabled=\"flat.data.disabled || undefined\"\n :aria-level=\"flat.depth + 1\"\n :tabindex=\"focusedKey === flat.key ? 0 : -1\"\n :style=\"{ '--b-tree-select-node-indent': `${flat.depth * 24}px` }\"\n @click.stop=\"onNodeRowClick(flat.data, $event)\"\n @dblclick.stop=\"onNodeRowDblClick(flat.data)\"\n >\n <!-- Indent -->\n <span class=\"b-tree-select__indent\" aria-hidden=\"true\" />\n\n <!-- Switcher -->\n <span\n v-if=\"hasChildren(flat.data)\"\n class=\"b-tree-select__switcher\"\n :class=\"{\n 'b-tree-select__switcher--expanded': isExpanded(flat.key),\n 'b-tree-select__switcher--loading': isLoading(flat.key),\n }\"\n aria-hidden=\"true\"\n @click.stop=\"toggleExpand(flat.data)\"\n >\n <slot\n v-if=\"!isLoading(flat.key)\"\n name=\"switcherIcon\"\n :node=\"flat.data\"\n :expanded=\"isExpanded(flat.key)\"\n >\n <svg\n class=\"b-tree-select__switcher-icon\"\n viewBox=\"0 0 8 8\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M2 1.5L6 4L2 6.5z\" />\n </svg>\n </slot>\n <svg\n v-if=\"isLoading(flat.key)\"\n class=\"b-tree-select__switcher-icon b-tree-select__switcher-icon--spin\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-dasharray=\"42\"\n stroke-dashoffset=\"14\"\n stroke-linecap=\"round\"\n />\n </svg>\n </span>\n <span v-else class=\"b-tree-select__switcher b-tree-select__switcher--leaf\" aria-hidden=\"true\" />\n\n <!-- Checkbox (treeCheckable mode) -->\n <span\n v-if=\"treeCheckable && flat.data.checkable !== false\"\n class=\"b-tree-select__checkbox\"\n :class=\"{\n 'b-tree-select__checkbox--checked': selectedSet.has(flat.value),\n 'b-tree-select__checkbox--indeterminate': halfCheckedSet.has(flat.value),\n 'b-tree-select__checkbox--disabled': flat.data.disabled || flat.data.disableCheckbox,\n }\"\n role=\"checkbox\"\n :aria-checked=\"halfCheckedSet.has(flat.value) ? 'mixed' : selectedSet.has(flat.value)\"\n :aria-disabled=\"flat.data.disabled || flat.data.disableCheckbox || undefined\"\n tabindex=\"-1\"\n @click.stop=\"handleCheck(flat.data)\"\n >\n <span class=\"b-tree-select__checkbox-inner\" aria-hidden=\"true\" />\n </span>\n\n <!-- Icon -->\n <span v-if=\"treeIcon || $slots.treeIcon\" class=\"b-tree-select__icon\" aria-hidden=\"true\">\n <slot name=\"treeIcon\" :node=\"flat.data\" />\n </span>\n\n <!-- Title -->\n <span class=\"b-tree-select__title\">\n <slot name=\"title\" :node=\"flat.data\">\n {{ getDisplayLabel(flat.data) }}\n </slot>\n </span>\n </div>\n </template>\n\n <!-- Empty -->\n <div v-else class=\"b-tree-select__empty\">\n <slot name=\"notFoundContent\">{{ notFoundContent }}</slot>\n </div>\n </div>\n </div>\n\n <!-- a11y live region: announces selection count -->\n <span class=\"b-tree-select__sr-only\" role=\"status\" aria-live=\"polite\">\n <template v-if=\"isMultiple\">{{ selectedValues.length }} selected</template>\n <template v-else-if=\"singleLabel\">{{ singleLabel }} selected</template>\n </span>\n </div>\n</template>\n\n<style scoped>\n/* ─── Design tokens ─────────────────────────────────────────────────────────── */\n.b-tree-select {\n /* AntD: indentSize */\n --b-tree-select-indent-size: 24px;\n /* AntD: nodeHoverBg */\n --b-tree-select-node-hover-bg: rgba(0, 0, 0, 0.04);\n /* AntD: nodeHoverColor */\n --b-tree-select-node-hover-color: rgba(0, 0, 0, 0.88);\n /* AntD: nodeSelectedBg */\n --b-tree-select-node-selected-bg: #e6f4ff;\n /* AntD: nodeSelectedColor */\n --b-tree-select-node-selected-color: rgba(0, 0, 0, 0.88);\n /* AntD: switcherSize */\n --b-tree-select-switcher-size: 16px;\n /* AntD: titleHeight */\n --b-tree-select-title-height: 24px;\n\n /* Selector tokens */\n --b-tree-select-bg: #ffffff;\n --b-tree-select-color: rgba(0, 0, 0, 0.88);\n --b-tree-select-placeholder-color: #606870;\n --b-tree-select-border-color: #d9d9d9;\n --b-tree-select-hover-border-color: #4096ff;\n --b-tree-select-active-border-color: #1677ff;\n --b-tree-select-active-outline-color: rgba(5, 145, 255, 0.1);\n --b-tree-select-filled-bg: rgba(0, 0, 0, 0.04);\n\n /* Tag tokens */\n --b-tree-select-tag-bg: rgba(0, 0, 0, 0.06);\n --b-tree-select-tag-border-color: transparent;\n --b-tree-select-multiple-count-bg: #f0f0f0;\n --b-tree-select-multiple-count-color: #1f1f1f;\n\n /* Checkbox tokens */\n --b-tree-select-checkbox-size: 16px;\n --b-tree-select-checkbox-border: #d9d9d9;\n --b-tree-select-checkbox-bg: #ffffff;\n --b-tree-select-checkbox-checked-bg: #1677ff;\n\n /* Popup tokens */\n --b-tree-select-popup-bg: #ffffff;\n --b-tree-select-popup-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n --b-tree-select-popup-border-radius: 8px;\n --b-tree-select-z-index-popup: 1050;\n --b-tree-select-line-color: #d9d9d9;\n\n /* Motion */\n --b-tree-select-transition-duration: 200ms;\n}\n\n/* ─── Dark mode ─────────────────────────────────────────────────────────────── */\n[data-prefers-color='dark'] .b-tree-select {\n --b-tree-select-node-hover-bg: rgba(255, 255, 255, 0.08);\n --b-tree-select-node-hover-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-node-selected-bg: #111a2c;\n --b-tree-select-node-selected-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-bg: #1f1f1f;\n --b-tree-select-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-placeholder-color: #9ca3af;\n --b-tree-select-border-color: #424242;\n --b-tree-select-hover-border-color: #4096ff;\n --b-tree-select-active-border-color: #1668dc;\n --b-tree-select-active-outline-color: rgba(22, 104, 220, 0.15);\n --b-tree-select-filled-bg: rgba(255, 255, 255, 0.08);\n --b-tree-select-tag-bg: rgba(255, 255, 255, 0.1);\n --b-tree-select-multiple-count-bg: #353535;\n --b-tree-select-multiple-count-color: #e0e0e0;\n --b-tree-select-checkbox-border: #424242;\n --b-tree-select-checkbox-bg: #1f1f1f;\n --b-tree-select-popup-bg: #1f1f1f;\n --b-tree-select-popup-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.24),\n 0 3px 6px -4px rgba(0, 0, 0, 0.36),\n 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n --b-tree-select-line-color: #424242;\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-tree-select {\n --b-tree-select-node-hover-bg: rgba(255, 255, 255, 0.08);\n --b-tree-select-node-hover-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-node-selected-bg: #111a2c;\n --b-tree-select-node-selected-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-bg: #1f1f1f;\n --b-tree-select-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-placeholder-color: #9ca3af;\n --b-tree-select-border-color: #424242;\n --b-tree-select-active-border-color: #1668dc;\n --b-tree-select-active-outline-color: rgba(22, 104, 220, 0.15);\n --b-tree-select-filled-bg: rgba(255, 255, 255, 0.08);\n --b-tree-select-tag-bg: rgba(255, 255, 255, 0.1);\n --b-tree-select-multiple-count-bg: #353535;\n --b-tree-select-multiple-count-color: #e0e0e0;\n --b-tree-select-checkbox-border: #424242;\n --b-tree-select-checkbox-bg: #1f1f1f;\n --b-tree-select-popup-bg: #1f1f1f;\n --b-tree-select-line-color: #424242;\n }\n}\n\n/* ─── Selector anchor ───────────────────────────────────────────────────────── */\n.b-tree-select__selector {\n anchor-name: v-bind('anchorName');\n}\n\n/* ─── Dropdown ──────────────────────────────────────────────────────────────── */\n.b-tree-select__dropdown {\n position: absolute;\n margin: 0;\n padding: 4px;\n border: none;\n background: var(--b-tree-select-popup-bg);\n border-radius: var(--b-tree-select-popup-border-radius);\n box-shadow: var(--b-tree-select-popup-shadow);\n overflow: auto;\n z-index: var(--b-tree-select-z-index-popup);\n\n position-anchor: v-bind('anchorName');\n position-try-fallbacks: --b-tree-select-top;\n inset: auto;\n top: anchor(bottom);\n left: anchor(left);\n margin-top: 4px;\n\n transition:\n display 0.2s,\n opacity 0.2s;\n transition-behavior: allow-discrete;\n opacity: 0;\n\n &:popover-open {\n opacity: 1;\n\n @starting-style {\n opacity: 0;\n }\n }\n}\n\n.b-tree-select__tree {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n outline: none;\n}\n\n.b-tree-select__dropdown--match-width {\n width: anchor-size(width);\n}\n\n@position-try --b-tree-select-top {\n inset: auto;\n bottom: anchor(top);\n left: anchor(left);\n margin-top: 0;\n margin-bottom: 4px;\n}\n\n.b-tree-select__node {\n position: relative;\n display: flex;\n align-items: center;\n gap: 4px;\n height: var(--b-tree-select-title-height);\n padding-inline-start: calc(8px + var(--b-tree-select-node-indent, 0px));\n padding-inline-end: 12px;\n border-radius: 6px;\n cursor: pointer;\n user-select: none;\n outline: none;\n color: inherit;\n transition:\n background-color var(--b-tree-select-transition-duration) ease,\n color var(--b-tree-select-transition-duration) ease;\n}\n\n.b-tree-select__node:hover {\n background-color: var(--b-tree-select-node-hover-bg);\n color: var(--b-tree-select-node-hover-color);\n}\n\n.b-tree-select__node--selected {\n background-color: var(--b-tree-select-node-selected-bg);\n color: var(--b-tree-select-node-selected-color);\n font-weight: 600;\n}\n\n.b-tree-select__node--selected:hover {\n background-color: var(--b-tree-select-node-selected-bg);\n}\n\n.b-tree-select__node--focused,\n.b-tree-select__node:focus-visible {\n background-color: var(--b-tree-select-node-hover-bg);\n outline: none;\n}\n\n.b-tree-select__node--disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.b-tree-select__node--disabled:hover {\n background-color: transparent;\n}\n\n/* Indent placeholder */\n.b-tree-select__indent {\n display: inline-block;\n flex-shrink: 0;\n}\n\n/* Switcher */\n.b-tree-select__switcher {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--b-tree-select-switcher-size);\n height: var(--b-tree-select-switcher-size);\n color: rgba(0, 0, 0, 0.45);\n}\n\n.b-tree-select__switcher--leaf {\n pointer-events: none;\n visibility: hidden;\n}\n\n.b-tree-select__switcher-icon {\n width: 10px;\n height: 10px;\n transition: transform var(--b-tree-select-transition-duration) ease;\n}\n\n.b-tree-select__switcher--expanded .b-tree-select__switcher-icon:not(.b-tree-select__switcher-icon--spin) {\n transform: rotate(90deg);\n}\n\n@keyframes b-tree-select-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.b-tree-select__switcher-icon--spin {\n animation: b-tree-select-spin 700ms linear infinite;\n}\n\n/* Checkbox */\n.b-tree-select__checkbox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n cursor: pointer;\n line-height: 1;\n}\n\n.b-tree-select__checkbox-inner {\n display: inline-block;\n width: var(--b-tree-select-checkbox-size);\n height: var(--b-tree-select-checkbox-size);\n border: 1.5px solid var(--b-tree-select-checkbox-border);\n border-radius: 3px;\n background-color: var(--b-tree-select-checkbox-bg);\n position: relative;\n transition:\n border-color var(--b-tree-select-transition-duration) ease,\n background-color var(--b-tree-select-transition-duration) ease;\n}\n\n.b-tree-select__checkbox--checked .b-tree-select__checkbox-inner {\n border-color: var(--b-tree-select-checkbox-checked-bg);\n background-color: var(--b-tree-select-checkbox-checked-bg);\n}\n\n.b-tree-select__checkbox--checked .b-tree-select__checkbox-inner::after {\n content: '';\n position: absolute;\n inset-inline-start: 4px;\n top: 1px;\n width: 5px;\n height: 8px;\n border: 2px solid #fff;\n border-top: none;\n border-inline-start: none;\n transform: rotate(45deg);\n}\n\n.b-tree-select__checkbox--indeterminate .b-tree-select__checkbox-inner {\n border-color: var(--b-tree-select-checkbox-checked-bg);\n background-color: var(--b-tree-select-checkbox-checked-bg);\n}\n\n.b-tree-select__checkbox--indeterminate .b-tree-select__checkbox-inner::after {\n content: '';\n position: absolute;\n inset-inline-start: 2px;\n top: 50%;\n width: calc(100% - 4px);\n height: 2px;\n background-color: #fff;\n transform: translateY(-50%);\n}\n\n.b-tree-select__checkbox--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Icon */\n.b-tree-select__icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n/* Title */\n.b-tree-select__title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Show line */\n.b-tree-select__tree--show-line .b-tree-select__node:not(:last-child)::before {\n content: '';\n position: absolute;\n inset-inline-start: calc(var(--b-tree-select-node-indent, 0px) + var(--b-tree-select-switcher-size) / 2);\n top: var(--b-tree-select-title-height);\n width: 1px;\n height: var(--b-tree-select-title-height);\n background-color: var(--b-tree-select-line-color);\n pointer-events: none;\n}\n\n/* Empty content */\n.b-tree-select__empty {\n padding: 16px;\n text-align: center;\n color: var(--b-tree-select-placeholder-color);\n font-size: 14px;\n}\n\n/* SR only */\n.b-tree-select__sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* Reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .b-tree-select,\n .b-tree-select__dropdown,\n .b-tree-select__node,\n .b-tree-select__switcher-icon,\n .b-tree-select__arrow {\n transition-duration: 0ms;\n }\n\n .b-tree-select__switcher-icon--spin {\n animation: none;\n }\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"design-system274.js","names":["$slots"],"sources":["../src/components/BTreeSelect/BTreeSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useComponentId } from '@/composables/useComponentId.ts';\nimport { BCommonSize } from '@/types.ts';\nimport { computed, nextTick, ref, useAttrs, watch } from 'vue';\nimport {\n BTreeSelectPlacement,\n BTreeSelectStatus,\n BTreeSelectVariant,\n type BTreeSelectChangeExtra,\n type BTreeSelectExpandAction,\n type BTreeSelectFieldNames,\n type BTreeSelectFlatNode,\n type BTreeSelectLabeledValue,\n type BTreeSelectModelValue,\n type BTreeSelectNode,\n type BTreeSelectShowSearchConfig,\n type BTreeSelectValue,\n} from './types.ts';\n\ndefineOptions({ inheritAttrs: false });\n\nconst attrs = useAttrs();\n\nconst {\n treeData = [],\n fieldNames,\n multiple = false,\n treeCheckable = false,\n treeCheckStrictly = false,\n labelInValue = false,\n size = BCommonSize.Medium,\n variant = BTreeSelectVariant.Outlined,\n placeholder,\n disabled = false,\n status,\n defaultOpen = false,\n showSearch = false,\n treeDefaultExpandAll = false,\n treeDefaultExpandedKeys = [],\n treeExpandedKeys: treeExpandedKeysProp,\n treeExpandAction = false,\n treeIcon = false,\n treeLine = false,\n loadData,\n placement: _placement = BTreeSelectPlacement.BottomLeft,\n popupMatchSelectWidth = true,\n listHeight = 256,\n maxTagCount,\n maxTagPlaceholder,\n maxCount,\n allowClear = false,\n notFoundContent = 'Not Found',\n filterTreeNode = true,\n treeNodeFilterProp = 'title',\n treeNodeLabelProp,\n} = defineProps<{\n /** Hierarchical data of the tree. */\n treeData?: BTreeSelectNode[];\n /** Replace default field names. */\n fieldNames?: BTreeSelectFieldNames;\n /** Allow multiple selection (without checkboxes). */\n multiple?: boolean;\n /** Show checkboxes — implies multiple. */\n treeCheckable?: boolean;\n /** Whether checkable parent/child are independent. */\n treeCheckStrictly?: boolean;\n /** Embed label in value (returns `{ value, label }`). */\n labelInValue?: boolean;\n /** Selector size. */\n size?: `${BCommonSize}`;\n /** Visual variant. */\n variant?: `${BTreeSelectVariant}`;\n /** Placeholder text when nothing selected. */\n placeholder?: string;\n /** Disable the component. */\n disabled?: boolean;\n /** Validation status. */\n status?: `${BTreeSelectStatus}`;\n /** Default open state (uncontrolled). */\n defaultOpen?: boolean;\n /** Show search input — `true` or a config object. */\n showSearch?: boolean | BTreeSelectShowSearchConfig;\n /** Expand all nodes on mount. */\n treeDefaultExpandAll?: boolean;\n /** Default expanded keys (uncontrolled). */\n treeDefaultExpandedKeys?: BTreeSelectValue[];\n /** Controlled expanded keys. */\n treeExpandedKeys?: BTreeSelectValue[];\n /** When to expand on click — `click | doubleClick | false`. */\n treeExpandAction?: BTreeSelectExpandAction;\n /** Show node icons. */\n treeIcon?: boolean;\n /** Show connector lines between nodes. */\n treeLine?: boolean;\n /** Async-load child nodes. */\n loadData?: (node: BTreeSelectNode) => Promise<void>;\n /** Dropdown placement. */\n placement?: `${BTreeSelectPlacement}`;\n /** Match popup width to selector. */\n popupMatchSelectWidth?: boolean | number;\n /** Max popup list height in px. */\n listHeight?: number;\n /** Max tags to show before collapsing into +N. */\n maxTagCount?: number | 'responsive';\n /** Custom +N tag content (function or string). */\n maxTagPlaceholder?: string | ((omitted: BTreeSelectLabeledValue[]) => string);\n /** Maximum selectable nodes. */\n maxCount?: number;\n /** Show a clear button when there is a value. */\n allowClear?: boolean;\n /** Content when search yields no results. */\n notFoundContent?: string;\n /** Filter behavior — `true` uses default, `false` disables, function for custom. */\n filterTreeNode?: boolean | ((input: string, node: BTreeSelectNode) => boolean);\n /** Property of the node used for default filtering. */\n treeNodeFilterProp?: string;\n /** Property used as the displayed label (defaults to fieldNames.label). */\n treeNodeLabelProp?: string;\n}>();\n\nconst emit = defineEmits<{\n /** Fires when selection value changes. */\n change: [\n value: BTreeSelectValue | BTreeSelectValue[] | BTreeSelectLabeledValue | BTreeSelectLabeledValue[] | undefined,\n label: string | string[],\n extra: BTreeSelectChangeExtra,\n ];\n /** Fires when a node is selected (single/multiple modes). */\n select: [value: BTreeSelectValue, node: BTreeSelectNode];\n /** Fires when a node is deselected (multiple/treeCheckable modes). */\n deselect: [value: BTreeSelectValue, node: BTreeSelectNode];\n /** Fires when a node is checked/unchecked (treeCheckable mode). */\n treeCheck: [keys: BTreeSelectValue[], info: { checked: boolean; node: BTreeSelectNode }];\n /** Fires when popup visibility changes. */\n openChange: [open: boolean];\n /** Fires when the popup scrolls. */\n popupScroll: [event: Event];\n /** Fires when expanded keys change. */\n treeExpand: [expandedKeys: BTreeSelectValue[]];\n /** Fires when search input changes. */\n search: [value: string];\n /** Fires when clear is pressed. */\n clear: [];\n /** Fires on selector focus. */\n focus: [event: FocusEvent];\n /** Fires on selector blur. */\n blur: [event: FocusEvent];\n}>();\n\nconst model = defineModel<BTreeSelectModelValue>();\nconst openModel = defineModel<boolean>('open', { default: false });\nif (defaultOpen && !openModel.value) openModel.value = defaultOpen;\n\ndefineSlots<{\n /** Suffix icon (replaces default arrow). */\n suffixIcon?(): unknown;\n /** Custom switcher icon. */\n switcherIcon?(props: { node: BTreeSelectNode; expanded: boolean }): unknown;\n /** Custom node title renderer. */\n title?(props: { node: BTreeSelectNode }): unknown;\n /** Custom tag renderer (multiple/treeCheckable). */\n tagRender?(props: { value: BTreeSelectValue; label: string; closable: boolean; onClose: () => void }): unknown;\n /** Custom not-found content. */\n notFoundContent?(): unknown;\n /** Custom node icon. */\n treeIcon?(props: { node: BTreeSelectNode }): unknown;\n}>();\n\n// ─── Field name resolution ────────────────────────────────────────────────────\nconst labelField = computed(() => fieldNames?.label ?? 'title');\nconst valueField = computed(() => fieldNames?.value ?? 'value');\nconst childrenField = computed(() => fieldNames?.children ?? 'children');\nconst displayLabelField = computed(() => treeNodeLabelProp ?? labelField.value);\n\nfunction getLabel(n: BTreeSelectNode): string {\n return String((n as Record<string, unknown>)[labelField.value] ?? '');\n}\nfunction getDisplayLabel(n: BTreeSelectNode): string {\n const v = (n as Record<string, unknown>)[displayLabelField.value];\n return v == null ? getLabel(n) : String(v);\n}\nfunction getValue(n: BTreeSelectNode): BTreeSelectValue {\n return (n as Record<string, unknown>)[valueField.value] as BTreeSelectValue;\n}\nfunction getKey(n: BTreeSelectNode): BTreeSelectValue {\n return (n.key as BTreeSelectValue) ?? getValue(n);\n}\nfunction getChildren(n: BTreeSelectNode): BTreeSelectNode[] | undefined {\n return (n as Record<string, unknown>)[childrenField.value] as BTreeSelectNode[] | undefined;\n}\n\n// ─── Identity / IDs ───────────────────────────────────────────────────────────\nconst { componentUID } = useComponentId();\nconst anchorName = computed(() => `--b-tree-select-anchor-${componentUID.value}`);\nconst treeId = computed(() => `b-tree-select-tree-${componentUID.value}`);\n\n// ─── Refs ─────────────────────────────────────────────────────────────────────\nconst selectorRef = ref<HTMLElement | null>(null);\nconst searchInputRef = ref<HTMLInputElement | null>(null);\nconst popoverRef = ref<HTMLElement | null>(null);\nconst treeRef = ref<HTMLElement | null>(null);\n\n// ─── State ────────────────────────────────────────────────────────────────────\nconst isOpen = computed(() => !!openModel.value);\n\nconst searchValue = ref('');\n\nconst internalExpanded = ref<Set<BTreeSelectValue>>(new Set());\nconst isControlledExpanded = computed(() => treeExpandedKeysProp !== undefined);\nconst activeExpanded = computed<Set<BTreeSelectValue>>(() => {\n if (isControlledExpanded.value) return new Set(treeExpandedKeysProp);\n return internalExpanded.value;\n});\n\nconst focusedKey = ref<BTreeSelectValue | null>(null);\nconst loadingKeys = ref<Set<BTreeSelectValue>>(new Set());\nconst loadedKeys = ref<Set<BTreeSelectValue>>(new Set());\n\n// ─── Mode helpers ────────────────────────────────────────────────────────────\nconst isMultiple = computed(() => multiple || treeCheckable);\n\n// ─── Tree traversal ───────────────────────────────────────────────────────────\nfunction flatten(\n nodes: BTreeSelectNode[],\n depth = 0,\n parents: BTreeSelectValue[] = [],\n parentVisible = true,\n): BTreeSelectFlatNode[] {\n const out: BTreeSelectFlatNode[] = [];\n for (const node of nodes) {\n const value = getValue(node);\n const key = getKey(node);\n const expanded = activeExpanded.value.has(key);\n out.push({ key, value, data: node, depth, visible: parentVisible, parents });\n const children = getChildren(node);\n if (children?.length) {\n out.push(...flatten(children, depth + 1, [...parents, value], parentVisible && expanded));\n }\n }\n return out;\n}\n\nconst flatNodes = computed(() => flatten(treeData));\nconst nodeByValue = computed(() => {\n const map = new Map<BTreeSelectValue, BTreeSelectNode>();\n for (const f of flatNodes.value) map.set(f.value, f.data);\n return map;\n});\n\n// ─── Search filtering ─────────────────────────────────────────────────────────\nconst searchEnabled = computed(() => !!showSearch);\n\nfunction nodeMatches(node: BTreeSelectNode, query: string): boolean {\n if (!query) return true;\n if (typeof filterTreeNode === 'function') return filterTreeNode(query, node);\n if (filterTreeNode === false) return true;\n const cfg = typeof showSearch === 'object' && showSearch !== null ? showSearch : null;\n if (cfg?.filter) return cfg.filter(query, node);\n const prop = treeNodeFilterProp ?? 'title';\n const value = (node as Record<string, unknown>)[prop];\n return String(value ?? '')\n .toLowerCase()\n .includes(query.toLowerCase());\n}\n\nconst visibleFlatNodes = computed(() => {\n const q = searchValue.value.trim();\n if (!q) return flatNodes.value.filter((n) => n.visible);\n\n // Show ancestors of any matching node\n const keepValues = new Set<BTreeSelectValue>();\n for (const f of flatNodes.value) {\n if (nodeMatches(f.data, q)) {\n keepValues.add(f.value);\n f.parents.forEach((p) => keepValues.add(p));\n }\n }\n return flatNodes.value\n .filter((f) => keepValues.has(f.value))\n .map((f) => ({ ...f, visible: true }));\n});\n\n// ─── Value / model helpers ────────────────────────────────────────────────────\nfunction toRawValue(v: BTreeSelectValue | BTreeSelectLabeledValue): BTreeSelectValue {\n if (typeof v === 'object' && v !== null) return v.value;\n return v as BTreeSelectValue;\n}\n\nconst selectedValues = computed<BTreeSelectValue[]>(() => {\n const m = model.value;\n if (m == null) return [];\n if (Array.isArray(m)) return m.map(toRawValue);\n return [toRawValue(m as BTreeSelectValue | BTreeSelectLabeledValue)];\n});\n\nconst selectedSet = computed(() => new Set(selectedValues.value));\n\n// In treeCheckable mode w/o strict, derive half-checked state from selectedValues\nconst halfCheckedSet = computed<Set<BTreeSelectValue>>(() => {\n if (!treeCheckable || treeCheckStrictly) return new Set();\n const half = new Set<BTreeSelectValue>();\n function walk(nodes: BTreeSelectNode[]): { all: boolean; some: boolean } {\n let all = true;\n let some = false;\n for (const n of nodes) {\n const v = getValue(n);\n const children = getChildren(n);\n if (children?.length) {\n const sub = walk(children);\n if (sub.all) {\n some = true;\n } else if (sub.some) {\n half.add(v);\n all = false;\n some = true;\n } else {\n if (!selectedSet.value.has(v)) all = false;\n else some = true;\n }\n } else {\n if (!selectedSet.value.has(v)) all = false;\n else some = true;\n }\n }\n return { all, some };\n }\n walk(treeData);\n return half;\n});\n\n// ─── Display tags / single label ──────────────────────────────────────────────\nconst displayTags = computed<BTreeSelectLabeledValue[]>(() => {\n return selectedValues.value.map((v) => {\n const node = nodeByValue.value.get(v);\n const fromModel = Array.isArray(model.value)\n ? (model.value.find(\n (m) => typeof m === 'object' && m !== null && 'value' in m && (m as BTreeSelectLabeledValue).value === v,\n ) as BTreeSelectLabeledValue | undefined)\n : typeof model.value === 'object' && model.value !== null && 'value' in (model.value as object) &&\n (model.value as BTreeSelectLabeledValue).value === v\n ? (model.value as BTreeSelectLabeledValue)\n : undefined;\n const label = node ? getDisplayLabel(node) : (fromModel?.label ?? String(v));\n return { value: v, label };\n });\n});\n\nconst singleLabel = computed(() => displayTags.value[0]?.label ?? '');\n\nconst visibleTags = computed(() => {\n if (maxTagCount == null || maxTagCount === 'responsive') return displayTags.value;\n return displayTags.value.slice(0, maxTagCount as number);\n});\n\nconst omittedTags = computed(() => {\n if (maxTagCount == null || maxTagCount === 'responsive') return [] as BTreeSelectLabeledValue[];\n return displayTags.value.slice(maxTagCount as number);\n});\n\nconst omittedPlaceholder = computed(() => {\n const omitted = omittedTags.value;\n if (omitted.length === 0) return '';\n if (typeof maxTagPlaceholder === 'function') return maxTagPlaceholder(omitted);\n if (typeof maxTagPlaceholder === 'string') return maxTagPlaceholder;\n return `+ ${omitted.length} ...`;\n});\n\n// ─── Initialise expanded ──────────────────────────────────────────────────────\nfunction collectAllExpandableKeys(nodes: BTreeSelectNode[]): BTreeSelectValue[] {\n const out: BTreeSelectValue[] = [];\n for (const n of nodes) {\n const ch = getChildren(n);\n if (ch?.length) {\n out.push(getKey(n));\n out.push(...collectAllExpandableKeys(ch));\n }\n }\n return out;\n}\n\nif (!isControlledExpanded.value) {\n if (treeDefaultExpandAll) {\n internalExpanded.value = new Set(collectAllExpandableKeys(treeData));\n } else if (treeDefaultExpandedKeys.length) {\n internalExpanded.value = new Set(treeDefaultExpandedKeys);\n }\n}\n\n// ─── Open/close ───────────────────────────────────────────────────────────────\nlet previouslyFocusedElement: HTMLElement | null = null;\n\nfunction setOpen(val: boolean) {\n if (openModel.value !== val) openModel.value = val;\n emit('openChange', val);\n}\n\nfunction openMenu() {\n if (disabled || isOpen.value) return;\n previouslyFocusedElement = document.activeElement as HTMLElement | null;\n setOpen(true);\n}\n\nfunction closeMenu() {\n if (!isOpen.value) return;\n setOpen(false);\n searchValue.value = '';\n // Return focus to selector\n nextTick(() => {\n if (previouslyFocusedElement?.isConnected) {\n previouslyFocusedElement.focus();\n } else {\n selectorRef.value?.focus();\n }\n });\n}\n\nwatch(isOpen, (val) => {\n if (val) {\n nextTick(() => {\n popoverRef.value?.showPopover?.();\n if (searchEnabled.value) searchInputRef.value?.focus();\n // Initial focused node\n if (!focusedKey.value && visibleFlatNodes.value[0]) {\n focusedKey.value = visibleFlatNodes.value[0].key;\n }\n });\n } else {\n popoverRef.value?.hidePopover?.();\n }\n});\n\n// ─── Toggle expand ────────────────────────────────────────────────────────────\nasync function toggleExpand(node: BTreeSelectNode) {\n const k = getKey(node);\n if (node.disabled) return;\n\n const expanding = !activeExpanded.value.has(k);\n\n // Async load\n if (expanding && loadData && !loadedKeys.value.has(k) && !loadingKeys.value.has(k)) {\n loadingKeys.value.add(k);\n try {\n await loadData(node);\n loadedKeys.value.add(k);\n } finally {\n loadingKeys.value.delete(k);\n }\n }\n\n let next: Set<BTreeSelectValue>;\n if (isControlledExpanded.value) {\n next = new Set(treeExpandedKeysProp);\n } else {\n next = new Set(internalExpanded.value);\n }\n if (expanding) next.add(k);\n else next.delete(k);\n\n if (!isControlledExpanded.value) internalExpanded.value = next;\n emit('treeExpand', [...next]);\n}\n\n// ─── Selection / check ────────────────────────────────────────────────────────\nfunction emitChange(\n values: BTreeSelectValue[],\n triggerNode: BTreeSelectNode,\n extra: Partial<BTreeSelectChangeExtra> = {},\n) {\n const labels = values.map((v) => {\n const n = nodeByValue.value.get(v);\n return n ? getDisplayLabel(n) : String(v);\n });\n\n // Build emit value\n let emitValue: BTreeSelectValue | BTreeSelectValue[] | BTreeSelectLabeledValue | BTreeSelectLabeledValue[] | undefined;\n if (isMultiple.value) {\n emitValue = labelInValue\n ? values.map((v, i) => ({ value: v, label: labels[i] }))\n : [...values];\n } else {\n if (values.length === 0) {\n emitValue = labelInValue ? undefined : undefined;\n } else {\n emitValue = labelInValue ? { value: values[0], label: labels[0] } : values[0];\n }\n }\n\n model.value = emitValue;\n emit('change', emitValue, isMultiple.value ? labels : (labels[0] ?? ''), {\n triggerValue: getValue(triggerNode),\n triggerNode,\n ...extra,\n });\n}\n\nfunction selectNode(node: BTreeSelectNode) {\n if (node.disabled || node.selectable === false) return;\n const v = getValue(node);\n\n if (treeCheckable) {\n handleCheck(node);\n return;\n }\n\n if (isMultiple.value) {\n const cur = selectedValues.value.slice();\n const idx = cur.indexOf(v);\n if (idx >= 0) {\n cur.splice(idx, 1);\n emit('deselect', v, node);\n emitChange(cur, node, { selected: false });\n } else {\n if (maxCount != null && cur.length >= maxCount) return;\n cur.push(v);\n emit('select', v, node);\n emitChange(cur, node, { selected: true });\n }\n } else {\n if (selectedValues.value[0] === v) {\n // Already selected: just close\n closeMenu();\n return;\n }\n emit('select', v, node);\n emitChange([v], node, { selected: true });\n closeMenu();\n }\n}\n\nfunction handleCheck(node: BTreeSelectNode) {\n if (node.disabled || node.disableCheckbox) return;\n const v = getValue(node);\n const cur = new Set(selectedValues.value);\n const isCurrentlyChecked = cur.has(v);\n\n if (treeCheckStrictly) {\n if (isCurrentlyChecked) {\n cur.delete(v);\n emit('deselect', v, node);\n } else {\n if (maxCount != null && cur.size >= maxCount) return;\n cur.add(v);\n emit('select', v, node);\n }\n } else {\n // cascade\n if (isCurrentlyChecked) {\n cur.delete(v);\n function uncheck(nodes: BTreeSelectNode[]) {\n for (const n of nodes) {\n cur.delete(getValue(n));\n const ch = getChildren(n);\n if (ch?.length) uncheck(ch);\n }\n }\n const ch = getChildren(node);\n if (ch?.length) uncheck(ch);\n emit('deselect', v, node);\n } else {\n if (maxCount != null && cur.size >= maxCount) return;\n cur.add(v);\n function check(nodes: BTreeSelectNode[]) {\n for (const n of nodes) {\n if (!n.disabled && !n.disableCheckbox) cur.add(getValue(n));\n const ch = getChildren(n);\n if (ch?.length) check(ch);\n }\n }\n const ch = getChildren(node);\n if (ch?.length) check(ch);\n emit('select', v, node);\n }\n // Recompute parent state by removing parents that aren't fully selected\n function syncParents(nodes: BTreeSelectNode[]): { all: boolean; some: boolean } {\n let all = true;\n let some = false;\n for (const n of nodes) {\n const value = getValue(n);\n const children = getChildren(n);\n if (children?.length) {\n const sub = syncParents(children);\n if (sub.all) {\n cur.add(value);\n some = true;\n } else if (sub.some) {\n cur.delete(value);\n all = false;\n some = true;\n } else {\n cur.delete(value);\n if (!cur.has(value)) all = false;\n }\n } else {\n if (!cur.has(value)) all = false;\n else some = true;\n }\n }\n return { all, some };\n }\n syncParents(treeData);\n }\n\n emit('treeCheck', [...cur], { checked: !isCurrentlyChecked, node });\n emitChange([...cur], node, { checked: !isCurrentlyChecked });\n}\n\nfunction removeTag(value: BTreeSelectValue, e?: Event) {\n e?.stopPropagation();\n const node = nodeByValue.value.get(value);\n if (treeCheckable && node) {\n handleCheck(node);\n return;\n }\n const next = selectedValues.value.filter((v) => v !== value);\n if (node) emit('deselect', value, node);\n emitChange(next, node ?? ({ [valueField.value]: value } as BTreeSelectNode), { selected: false });\n}\n\nfunction handleClear(e: Event) {\n e.stopPropagation();\n const dummy = { [valueField.value]: '' } as BTreeSelectNode;\n if (isMultiple.value) {\n model.value = [];\n } else {\n model.value = undefined;\n }\n searchValue.value = '';\n emit('clear');\n emit('change', model.value, isMultiple.value ? [] : '', {\n triggerNode: dummy,\n triggerValue: undefined,\n });\n}\n\n// ─── Click outside ────────────────────────────────────────────────────────────\nfunction onSelectorClick() {\n if (disabled) return;\n if (isOpen.value) closeMenu();\n else openMenu();\n}\n\nfunction onSelectorBlur(e: FocusEvent) {\n const related = e.relatedTarget as HTMLElement | null;\n if (popoverRef.value?.contains(related)) return;\n if (selectorRef.value?.contains(related)) return;\n emit('blur', e);\n}\n\nfunction onSelectorFocus(e: FocusEvent) {\n emit('focus', e);\n}\n\nfunction onSearchInput(e: Event) {\n const t = e.target as HTMLInputElement;\n searchValue.value = t.value;\n emit('search', t.value);\n if (!isOpen.value) openMenu();\n // Focus first visible node when searching\n nextTick(() => {\n focusedKey.value = visibleFlatNodes.value[0]?.key ?? null;\n });\n}\n\nfunction onPopupScroll(e: Event) {\n emit('popupScroll', e);\n}\n\n// ─── Keyboard handling ────────────────────────────────────────────────────────\nfunction focusVisibleNode(key: BTreeSelectValue) {\n focusedKey.value = key;\n nextTick(() => {\n const safe = String(key).replace(/[\"\\\\]/g, '\\\\$&');\n const el = treeRef.value?.querySelector<HTMLElement>(\n `[data-node-key=\"${safe}\"]`,\n );\n el?.focus();\n el?.scrollIntoView?.({ block: 'nearest' });\n });\n}\n\nfunction onSelectorKeyDown(e: KeyboardEvent) {\n if (disabled) return;\n switch (e.key) {\n case 'Enter':\n case ' ':\n if (!searchEnabled.value || !isOpen.value) {\n e.preventDefault();\n if (isOpen.value) closeMenu();\n else openMenu();\n }\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen.value) openMenu();\n nextTick(() => {\n const first = visibleFlatNodes.value[0];\n if (first) focusVisibleNode(first.key);\n });\n break;\n case 'Escape':\n if (isOpen.value) {\n e.preventDefault();\n closeMenu();\n }\n break;\n case 'Backspace':\n if (isMultiple.value && !searchValue.value && selectedValues.value.length > 0) {\n const last = selectedValues.value[selectedValues.value.length - 1];\n removeTag(last);\n }\n break;\n case 'Tab':\n if (isOpen.value) closeMenu();\n break;\n }\n}\n\nfunction onTreeKeyDown(e: KeyboardEvent) {\n const visible = visibleFlatNodes.value;\n if (!visible.length) return;\n const idx = visible.findIndex((n) => n.key === focusedKey.value);\n const cur = visible[idx];\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n const next = visible[idx + 1] ?? visible[0];\n focusVisibleNode(next.key);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const prev = visible[idx - 1] ?? visible[visible.length - 1];\n focusVisibleNode(prev.key);\n break;\n }\n case 'ArrowRight': {\n e.preventDefault();\n if (!cur) break;\n if (hasChildren(cur.data) && !activeExpanded.value.has(cur.key)) toggleExpand(cur.data);\n break;\n }\n case 'ArrowLeft': {\n e.preventDefault();\n if (!cur) break;\n if (activeExpanded.value.has(cur.key)) toggleExpand(cur.data);\n break;\n }\n case 'Enter':\n case ' ': {\n e.preventDefault();\n if (cur) selectNode(cur.data);\n break;\n }\n case 'Escape':\n e.preventDefault();\n closeMenu();\n break;\n case 'Home': {\n e.preventDefault();\n if (visible[0]) focusVisibleNode(visible[0].key);\n break;\n }\n case 'End': {\n e.preventDefault();\n const last = visible[visible.length - 1];\n if (last) focusVisibleNode(last.key);\n break;\n }\n case 'Tab': {\n closeMenu();\n break;\n }\n }\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\nfunction hasChildren(node: BTreeSelectNode): boolean {\n const ch = getChildren(node);\n return !!ch?.length || (!!loadData && !node.isLeaf);\n}\n\nfunction isExpanded(key: BTreeSelectValue) {\n return activeExpanded.value.has(key);\n}\n\nfunction isLoading(key: BTreeSelectValue) {\n return loadingKeys.value.has(key);\n}\n\nfunction nodeIsSelectable(node: BTreeSelectNode) {\n if (treeCheckable) return node.checkable !== false && !node.disabled && !node.disableCheckbox;\n return node.selectable !== false && !node.disabled;\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\ndefineExpose({\n focus: () => selectorRef.value?.focus(),\n blur: () => selectorRef.value?.blur(),\n});\n\n// ─── Computed UI helpers ──────────────────────────────────────────────────────\nconst showClear = computed(() => {\n if (!allowClear || disabled) return false;\n return selectedValues.value.length > 0;\n});\n\nconst sizeClass = computed(() => `b-tree-select--${size}`);\nconst variantClass = computed(() => `b-tree-select--${variant}`);\nconst statusClass = computed(() => (status ? `b-tree-select--${status}` : ''));\n\nconst expandTrigger = computed(() => treeExpandAction);\n\nfunction onNodeRowClick(node: BTreeSelectNode, event: MouseEvent) {\n if (expandTrigger.value === 'click' && hasChildren(node) && nodeIsSelectable(node)) {\n toggleExpand(node);\n }\n selectNode(node);\n void event;\n}\n\nfunction onNodeRowDblClick(node: BTreeSelectNode) {\n if (expandTrigger.value === 'doubleClick' && hasChildren(node)) {\n toggleExpand(node);\n }\n}\n</script>\n\n<template>\n <div\n class=\"b-tree-select b:relative b:inline-flex b:w-full\"\n :class=\"[sizeClass, variantClass, statusClass, { 'b-tree-select--disabled': disabled, 'b-tree-select--multiple': isMultiple, 'b-tree-select--open': isOpen }]\"\n >\n <!-- ─── Selector trigger ───────────────────────────────────────── -->\n <div\n ref=\"selectorRef\"\n v-bind=\"attrs\"\n class=\"b-tree-select__selector b:box-border b:flex b:w-full b:cursor-pointer b:items-center b:gap-1 b:transition-all b:outline-none\"\n :class=\"[\n {\n 'b:min-h-6 b:px-2 b:text-sm': size === BCommonSize.Small,\n 'b:min-h-8 b:px-3 b:text-sm': size === BCommonSize.Medium,\n 'b:min-h-10 b:px-3 b:text-base': size === BCommonSize.Large,\n },\n {\n 'b:rounded-lg b:border-1 b:border-[var(--b-tree-select-border-color)] b:bg-[var(--b-tree-select-bg)] b:hover:not-disabled:border-[var(--b-tree-select-hover-border-color)] b:focus:not-disabled:border-[var(--b-tree-select-active-border-color)] b:focus:not-disabled:shadow-[0_0_0_2px_var(--b-tree-select-active-outline-color)]':\n variant === BTreeSelectVariant.Outlined,\n 'b:rounded-lg b:border-1 b:border-transparent b:bg-[var(--b-tree-select-filled-bg)] b:focus:not-disabled:border-[var(--b-tree-select-active-border-color)] b:focus:not-disabled:bg-[var(--b-tree-select-bg)] b:focus:not-disabled:shadow-[0_0_0_2px_var(--b-tree-select-active-outline-color)]':\n variant === BTreeSelectVariant.Filled,\n 'b:rounded-lg b:border-1 b:border-transparent b:bg-transparent':\n variant === BTreeSelectVariant.Borderless,\n 'b:rounded-none b:border-0 b:border-b-1 b:border-[var(--b-tree-select-border-color)] b:bg-transparent':\n variant === BTreeSelectVariant.Underlined,\n },\n {\n 'b:border-red-500! b:hover:not-disabled:border-red-400! b:focus:not-disabled:border-red-500! b:focus:not-disabled:shadow-[0_0_0_2px_rgba(255,38,5,0.06)]!':\n status === BTreeSelectStatus.Error,\n 'b:border-yellow-500! b:hover:not-disabled:border-yellow-400! b:focus:not-disabled:border-yellow-500! b:focus:not-disabled:shadow-[0_0_0_2px_rgba(255,215,5,0.1)]!':\n status === BTreeSelectStatus.Warning,\n },\n {\n 'b:cursor-not-allowed b:opacity-40': disabled,\n },\n ]\"\n :tabindex=\"disabled ? -1 : 0\"\n role=\"combobox\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"isOpen ? treeId : undefined\"\n aria-haspopup=\"tree\"\n :aria-label=\"placeholder ?? 'Tree select'\"\n :aria-disabled=\"disabled || undefined\"\n @click=\"onSelectorClick\"\n @keydown=\"onSelectorKeyDown\"\n @focus=\"onSelectorFocus\"\n @blur=\"onSelectorBlur\"\n >\n <!-- ─── Multiple/checkable mode: tags ─── -->\n <template v-if=\"isMultiple\">\n <span\n v-for=\"tag in visibleTags\"\n :key=\"String(tag.value)\"\n class=\"b-tree-select__tag b:inline-flex b:max-w-full b:items-center b:gap-0.5 b:rounded b:border-1 b:border-[var(--b-tree-select-tag-border-color)] b:bg-[var(--b-tree-select-tag-bg)] b:leading-none\"\n :class=\"[\n {\n 'b:h-4 b:px-1 b:text-xs': size === BCommonSize.Small,\n 'b:h-6 b:px-1.5 b:text-xs': size === BCommonSize.Medium,\n 'b:h-8 b:px-2 b:text-sm': size === BCommonSize.Large,\n },\n ]\"\n >\n <slot\n name=\"tagRender\"\n :value=\"tag.value\"\n :label=\"tag.label\"\n :closable=\"!disabled\"\n :on-close=\"() => removeTag(tag.value)\"\n >\n <span class=\"b:truncate\">{{ tag.label }}</span>\n <button\n v-if=\"!disabled\"\n type=\"button\"\n class=\"b-tree-select__tag-close b:ml-0.5 b:flex b:h-3.5 b:w-3.5 b:cursor-pointer b:items-center b:justify-center b:rounded-full b:border-none b:bg-transparent b:text-[10px] b:text-zinc-400 b:hover:bg-zinc-200 b:hover:text-zinc-600\"\n :aria-label=\"`Remove ${tag.label}`\"\n tabindex=\"-1\"\n @click.stop=\"removeTag(tag.value)\"\n @mousedown.prevent\n >\n <svg aria-hidden=\"true\" width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\n <path d=\"M1 1l6 6M7 1L1 7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n </slot>\n </span>\n <span\n v-if=\"omittedTags.length > 0\"\n class=\"b-tree-select__tag b-tree-select__tag--count b:relative b:z-1 b:inline-flex b:shrink-0 b:items-center b:rounded b:bg-[var(--b-tree-select-multiple-count-bg)] b:px-1.5 b:text-xs b:leading-none b:text-[var(--b-tree-select-multiple-count-color)]\"\n :class=\"[\n {\n 'b:h-4': size === BCommonSize.Small,\n 'b:h-6': size === BCommonSize.Medium,\n 'b:h-8': size === BCommonSize.Large,\n },\n ]\"\n >\n {{ omittedPlaceholder }}\n </span>\n <input\n v-if=\"searchEnabled\"\n ref=\"searchInputRef\"\n class=\"b-tree-select__search b:min-w-4 b:flex-1 b:border-none b:bg-transparent b:text-sm b:outline-none b:placeholder:text-[var(--b-tree-select-placeholder-color)]\"\n :value=\"searchValue\"\n :placeholder=\"selectedValues.length === 0 ? placeholder : undefined\"\n :disabled=\"disabled\"\n aria-autocomplete=\"list\"\n :aria-label=\"placeholder ?? 'Search'\"\n autocomplete=\"off\"\n @input=\"onSearchInput\"\n />\n <span\n v-else-if=\"selectedValues.length === 0\"\n class=\"b-tree-select__placeholder b:flex-1 b:truncate b:text-[var(--b-tree-select-placeholder-color)]\"\n >\n {{ placeholder }}\n </span>\n </template>\n\n <!-- ─── Single mode ─── -->\n <template v-else>\n <span\n v-if=\"singleLabel && !searchValue\"\n class=\"b-tree-select__value b:flex-1 b:truncate b:text-[color:var(--b-tree-select-color)]\"\n >\n {{ singleLabel }}\n </span>\n <span\n v-else-if=\"!singleLabel && !searchValue\"\n class=\"b-tree-select__placeholder b:flex-1 b:truncate b:text-[var(--b-tree-select-placeholder-color)]\"\n >\n {{ placeholder }}\n </span>\n <input\n v-if=\"searchEnabled\"\n ref=\"searchInputRef\"\n class=\"b-tree-select__search b:absolute b:inset-0 b:w-full b:border-none b:bg-transparent b:px-3 b:text-sm b:outline-none b:placeholder:text-[var(--b-tree-select-placeholder-color)]\"\n :class=\"{ 'b:opacity-0': !isOpen }\"\n :value=\"searchValue\"\n :disabled=\"disabled\"\n autocomplete=\"off\"\n tabindex=\"-1\"\n aria-autocomplete=\"list\"\n :aria-label=\"placeholder ?? 'Search'\"\n @input=\"onSearchInput\"\n />\n </template>\n\n <!-- Clear button -->\n <button\n v-if=\"showClear\"\n type=\"button\"\n class=\"b-tree-select__clear b:z-1 b:flex b:h-4 b:w-4 b:shrink-0 b:cursor-pointer b:items-center b:justify-center b:rounded-full b:border-none b:bg-[var(--b-tree-select-bg)] b:text-xs b:text-zinc-400 b:hover:text-zinc-600\"\n aria-label=\"Clear selection\"\n tabindex=\"-1\"\n @click=\"handleClear\"\n @mousedown.prevent\n >\n <svg aria-hidden=\"true\" width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\n <path d=\"M1 1l6 6M7 1L1 7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n\n <!-- Suffix arrow -->\n <span\n class=\"b-tree-select__arrow b:ml-auto b:flex b:shrink-0 b:items-center b:text-zinc-400 b:transition-transform b:duration-200\"\n :class=\"{ 'b:rotate-180': isOpen }\"\n aria-hidden=\"true\"\n >\n <slot name=\"suffixIcon\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M2.5 4.5L6 8L9.5 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </slot>\n </span>\n </div>\n\n <!-- ─── Popup ─── -->\n <div\n :id=\"treeId\"\n ref=\"popoverRef\"\n class=\"b-tree-select__dropdown\"\n :class=\"{ 'b-tree-select__dropdown--match-width': popupMatchSelectWidth === true }\"\n :style=\"[\n typeof popupMatchSelectWidth === 'number'\n ? { width: `${popupMatchSelectWidth}px` }\n : undefined,\n { maxHeight: `${listHeight}px` },\n ]\"\n popover\n role=\"dialog\"\n aria-modal=\"false\"\n :aria-label=\"placeholder ?? 'Tree options'\"\n @scroll=\"onPopupScroll\"\n @keydown=\"onTreeKeyDown\"\n >\n <div\n ref=\"treeRef\"\n class=\"b-tree-select__tree\"\n :class=\"{ 'b-tree-select__tree--show-line': treeLine }\"\n role=\"tree\"\n :aria-multiselectable=\"isMultiple || undefined\"\n >\n <template v-if=\"visibleFlatNodes.length > 0\">\n <div\n v-for=\"flat in visibleFlatNodes\"\n :key=\"String(flat.key)\"\n :data-node-key=\"String(flat.key)\"\n class=\"b-tree-select__node\"\n :class=\"{\n 'b-tree-select__node--selected': !treeCheckable && selectedSet.has(flat.value),\n 'b-tree-select__node--disabled': flat.data.disabled,\n 'b-tree-select__node--focused': focusedKey === flat.key,\n 'b-tree-select__node--expanded': isExpanded(flat.key),\n }\"\n role=\"treeitem\"\n :aria-expanded=\"hasChildren(flat.data) ? isExpanded(flat.key) : undefined\"\n :aria-selected=\"!treeCheckable && selectedSet.has(flat.value)\"\n :aria-checked=\"treeCheckable\n ? halfCheckedSet.has(flat.value)\n ? 'mixed'\n : selectedSet.has(flat.value)\n : undefined\"\n :aria-disabled=\"flat.data.disabled || undefined\"\n :aria-level=\"flat.depth + 1\"\n :tabindex=\"focusedKey === flat.key ? 0 : -1\"\n :style=\"{ '--b-tree-select-node-indent': `${flat.depth * 24}px` }\"\n @click.stop=\"onNodeRowClick(flat.data, $event)\"\n @dblclick.stop=\"onNodeRowDblClick(flat.data)\"\n >\n <!-- Indent -->\n <span class=\"b-tree-select__indent\" aria-hidden=\"true\" />\n\n <!-- Switcher -->\n <span\n v-if=\"hasChildren(flat.data)\"\n class=\"b-tree-select__switcher\"\n :class=\"{\n 'b-tree-select__switcher--expanded': isExpanded(flat.key),\n 'b-tree-select__switcher--loading': isLoading(flat.key),\n }\"\n aria-hidden=\"true\"\n @click.stop=\"toggleExpand(flat.data)\"\n >\n <slot\n v-if=\"!isLoading(flat.key)\"\n name=\"switcherIcon\"\n :node=\"flat.data\"\n :expanded=\"isExpanded(flat.key)\"\n >\n <svg\n class=\"b-tree-select__switcher-icon\"\n viewBox=\"0 0 8 8\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M2 1.5L6 4L2 6.5z\" />\n </svg>\n </slot>\n <svg\n v-if=\"isLoading(flat.key)\"\n class=\"b-tree-select__switcher-icon b-tree-select__switcher-icon--spin\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-dasharray=\"42\"\n stroke-dashoffset=\"14\"\n stroke-linecap=\"round\"\n />\n </svg>\n </span>\n <span v-else class=\"b-tree-select__switcher b-tree-select__switcher--leaf\" aria-hidden=\"true\" />\n\n <!-- Checkbox (treeCheckable mode) -->\n <span\n v-if=\"treeCheckable && flat.data.checkable !== false\"\n class=\"b-tree-select__checkbox\"\n :class=\"{\n 'b-tree-select__checkbox--checked': selectedSet.has(flat.value),\n 'b-tree-select__checkbox--indeterminate': halfCheckedSet.has(flat.value),\n 'b-tree-select__checkbox--disabled': flat.data.disabled || flat.data.disableCheckbox,\n }\"\n role=\"checkbox\"\n :aria-checked=\"halfCheckedSet.has(flat.value) ? 'mixed' : selectedSet.has(flat.value)\"\n :aria-disabled=\"flat.data.disabled || flat.data.disableCheckbox || undefined\"\n tabindex=\"-1\"\n @click.stop=\"handleCheck(flat.data)\"\n >\n <span class=\"b-tree-select__checkbox-inner\" aria-hidden=\"true\" />\n </span>\n\n <!-- Icon -->\n <span v-if=\"treeIcon || $slots.treeIcon\" class=\"b-tree-select__icon\" aria-hidden=\"true\">\n <slot name=\"treeIcon\" :node=\"flat.data\" />\n </span>\n\n <!-- Title -->\n <span class=\"b-tree-select__title\">\n <slot name=\"title\" :node=\"flat.data\">\n {{ getDisplayLabel(flat.data) }}\n </slot>\n </span>\n </div>\n </template>\n\n <!-- Empty -->\n <div v-else class=\"b-tree-select__empty\">\n <slot name=\"notFoundContent\">{{ notFoundContent }}</slot>\n </div>\n </div>\n </div>\n\n <!-- a11y live region: announces selection count -->\n <span class=\"b-tree-select__sr-only\" role=\"status\" aria-live=\"polite\">\n <template v-if=\"isMultiple\">{{ selectedValues.length }} selected</template>\n <template v-else-if=\"singleLabel\">{{ singleLabel }} selected</template>\n </span>\n </div>\n</template>\n\n<style scoped>\n/* ─── Design tokens ─────────────────────────────────────────────────────────── */\n.b-tree-select {\n /* AntD: indentSize */\n --b-tree-select-indent-size: 24px;\n /* AntD: nodeHoverBg */\n --b-tree-select-node-hover-bg: rgba(0, 0, 0, 0.04);\n /* AntD: nodeHoverColor */\n --b-tree-select-node-hover-color: rgba(0, 0, 0, 0.88);\n /* AntD: nodeSelectedBg */\n --b-tree-select-node-selected-bg: #e6f4ff;\n /* AntD: nodeSelectedColor */\n --b-tree-select-node-selected-color: rgba(0, 0, 0, 0.88);\n /* AntD: switcherSize */\n --b-tree-select-switcher-size: 16px;\n /* AntD: titleHeight */\n --b-tree-select-title-height: 24px;\n\n /* Selector tokens */\n --b-tree-select-bg: #ffffff;\n --b-tree-select-color: rgba(0, 0, 0, 0.88);\n --b-tree-select-placeholder-color: #606870;\n --b-tree-select-border-color: #d9d9d9;\n --b-tree-select-hover-border-color: #4096ff;\n --b-tree-select-active-border-color: #1677ff;\n --b-tree-select-active-outline-color: rgba(5, 145, 255, 0.1);\n --b-tree-select-filled-bg: rgba(0, 0, 0, 0.04);\n\n /* Tag tokens */\n --b-tree-select-tag-bg: rgba(0, 0, 0, 0.06);\n --b-tree-select-tag-border-color: transparent;\n --b-tree-select-multiple-count-bg: #f0f0f0;\n --b-tree-select-multiple-count-color: #1f1f1f;\n\n /* Checkbox tokens */\n --b-tree-select-checkbox-size: 16px;\n --b-tree-select-checkbox-border: #d9d9d9;\n --b-tree-select-checkbox-bg: #ffffff;\n --b-tree-select-checkbox-checked-bg: #1677ff;\n\n /* Popup tokens */\n --b-tree-select-popup-bg: #ffffff;\n --b-tree-select-popup-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n --b-tree-select-popup-border-radius: 8px;\n --b-tree-select-z-index-popup: 1050;\n --b-tree-select-line-color: #d9d9d9;\n\n /* Motion */\n --b-tree-select-transition-duration: 200ms;\n}\n\n/* ─── Dark mode ─────────────────────────────────────────────────────────────── */\n[data-prefers-color='dark'] .b-tree-select {\n --b-tree-select-node-hover-bg: rgba(255, 255, 255, 0.08);\n --b-tree-select-node-hover-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-node-selected-bg: #111a2c;\n --b-tree-select-node-selected-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-bg: #1f1f1f;\n --b-tree-select-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-placeholder-color: #9ca3af;\n --b-tree-select-border-color: #424242;\n --b-tree-select-hover-border-color: #4096ff;\n --b-tree-select-active-border-color: #1668dc;\n --b-tree-select-active-outline-color: rgba(22, 104, 220, 0.15);\n --b-tree-select-filled-bg: rgba(255, 255, 255, 0.08);\n --b-tree-select-tag-bg: rgba(255, 255, 255, 0.1);\n --b-tree-select-multiple-count-bg: #353535;\n --b-tree-select-multiple-count-color: #e0e0e0;\n --b-tree-select-checkbox-border: #424242;\n --b-tree-select-checkbox-bg: #1f1f1f;\n --b-tree-select-popup-bg: #1f1f1f;\n --b-tree-select-popup-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.24),\n 0 3px 6px -4px rgba(0, 0, 0, 0.36),\n 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n --b-tree-select-line-color: #424242;\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-tree-select {\n --b-tree-select-node-hover-bg: rgba(255, 255, 255, 0.08);\n --b-tree-select-node-hover-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-node-selected-bg: #111a2c;\n --b-tree-select-node-selected-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-bg: #1f1f1f;\n --b-tree-select-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-placeholder-color: #9ca3af;\n --b-tree-select-border-color: #424242;\n --b-tree-select-active-border-color: #1668dc;\n --b-tree-select-active-outline-color: rgba(22, 104, 220, 0.15);\n --b-tree-select-filled-bg: rgba(255, 255, 255, 0.08);\n --b-tree-select-tag-bg: rgba(255, 255, 255, 0.1);\n --b-tree-select-multiple-count-bg: #353535;\n --b-tree-select-multiple-count-color: #e0e0e0;\n --b-tree-select-checkbox-border: #424242;\n --b-tree-select-checkbox-bg: #1f1f1f;\n --b-tree-select-popup-bg: #1f1f1f;\n --b-tree-select-line-color: #424242;\n }\n}\n\n/* ─── Selector anchor ───────────────────────────────────────────────────────── */\n.b-tree-select__selector {\n anchor-name: v-bind('anchorName');\n}\n\n/* ─── Dropdown ──────────────────────────────────────────────────────────────── */\n.b-tree-select__dropdown {\n position: absolute;\n margin: 0;\n padding: 4px;\n border: none;\n background: var(--b-tree-select-popup-bg);\n border-radius: var(--b-tree-select-popup-border-radius);\n box-shadow: var(--b-tree-select-popup-shadow);\n overflow: auto;\n z-index: var(--b-tree-select-z-index-popup);\n\n position-anchor: v-bind('anchorName');\n position-try-fallbacks: --b-tree-select-top;\n inset: auto;\n top: anchor(bottom);\n left: anchor(left);\n margin-top: 4px;\n\n transition:\n display 0.2s,\n opacity 0.2s;\n transition-behavior: allow-discrete;\n opacity: 0;\n\n &:popover-open {\n opacity: 1;\n\n @starting-style {\n opacity: 0;\n }\n }\n}\n\n.b-tree-select__tree {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n outline: none;\n}\n\n.b-tree-select__dropdown--match-width {\n width: anchor-size(width);\n}\n\n@position-try --b-tree-select-top {\n inset: auto;\n bottom: anchor(top);\n left: anchor(left);\n margin-top: 0;\n margin-bottom: 4px;\n}\n\n.b-tree-select__node {\n position: relative;\n display: flex;\n align-items: center;\n gap: 4px;\n height: var(--b-tree-select-title-height);\n padding-inline-start: calc(8px + var(--b-tree-select-node-indent, 0px));\n padding-inline-end: 12px;\n border-radius: 6px;\n cursor: pointer;\n user-select: none;\n outline: none;\n color: inherit;\n transition:\n background-color var(--b-tree-select-transition-duration) ease,\n color var(--b-tree-select-transition-duration) ease;\n}\n\n.b-tree-select__node:hover {\n background-color: var(--b-tree-select-node-hover-bg);\n color: var(--b-tree-select-node-hover-color);\n}\n\n.b-tree-select__node--selected {\n background-color: var(--b-tree-select-node-selected-bg);\n color: var(--b-tree-select-node-selected-color);\n font-weight: 600;\n}\n\n.b-tree-select__node--selected:hover {\n background-color: var(--b-tree-select-node-selected-bg);\n}\n\n.b-tree-select__node--focused,\n.b-tree-select__node:focus-visible {\n background-color: var(--b-tree-select-node-hover-bg);\n outline: none;\n}\n\n.b-tree-select__node--disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.b-tree-select__node--disabled:hover {\n background-color: transparent;\n}\n\n/* Indent placeholder */\n.b-tree-select__indent {\n display: inline-block;\n flex-shrink: 0;\n}\n\n/* Switcher */\n.b-tree-select__switcher {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--b-tree-select-switcher-size);\n height: var(--b-tree-select-switcher-size);\n color: rgba(0, 0, 0, 0.45);\n}\n\n.b-tree-select__switcher--leaf {\n pointer-events: none;\n visibility: hidden;\n}\n\n.b-tree-select__switcher-icon {\n width: 10px;\n height: 10px;\n transition: transform var(--b-tree-select-transition-duration) ease;\n}\n\n.b-tree-select__switcher--expanded .b-tree-select__switcher-icon:not(.b-tree-select__switcher-icon--spin) {\n transform: rotate(90deg);\n}\n\n@keyframes b-tree-select-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.b-tree-select__switcher-icon--spin {\n animation: b-tree-select-spin 700ms linear infinite;\n}\n\n/* Checkbox */\n.b-tree-select__checkbox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n cursor: pointer;\n line-height: 1;\n}\n\n.b-tree-select__checkbox-inner {\n display: inline-block;\n width: var(--b-tree-select-checkbox-size);\n height: var(--b-tree-select-checkbox-size);\n border: 1.5px solid var(--b-tree-select-checkbox-border);\n border-radius: 3px;\n background-color: var(--b-tree-select-checkbox-bg);\n position: relative;\n transition:\n border-color var(--b-tree-select-transition-duration) ease,\n background-color var(--b-tree-select-transition-duration) ease;\n}\n\n.b-tree-select__checkbox--checked .b-tree-select__checkbox-inner {\n border-color: var(--b-tree-select-checkbox-checked-bg);\n background-color: var(--b-tree-select-checkbox-checked-bg);\n}\n\n.b-tree-select__checkbox--checked .b-tree-select__checkbox-inner::after {\n content: '';\n position: absolute;\n inset-inline-start: 4px;\n top: 1px;\n width: 5px;\n height: 8px;\n border: 2px solid #fff;\n border-top: none;\n border-inline-start: none;\n transform: rotate(45deg);\n}\n\n.b-tree-select__checkbox--indeterminate .b-tree-select__checkbox-inner {\n border-color: var(--b-tree-select-checkbox-checked-bg);\n background-color: var(--b-tree-select-checkbox-checked-bg);\n}\n\n.b-tree-select__checkbox--indeterminate .b-tree-select__checkbox-inner::after {\n content: '';\n position: absolute;\n inset-inline-start: 2px;\n top: 50%;\n width: calc(100% - 4px);\n height: 2px;\n background-color: #fff;\n transform: translateY(-50%);\n}\n\n.b-tree-select__checkbox--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Icon */\n.b-tree-select__icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n/* Title */\n.b-tree-select__title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Show line */\n.b-tree-select__tree--show-line .b-tree-select__node:not(:last-child)::before {\n content: '';\n position: absolute;\n inset-inline-start: calc(var(--b-tree-select-node-indent, 0px) + var(--b-tree-select-switcher-size) / 2);\n top: var(--b-tree-select-title-height);\n width: 1px;\n height: var(--b-tree-select-title-height);\n background-color: var(--b-tree-select-line-color);\n pointer-events: none;\n}\n\n/* Empty content */\n.b-tree-select__empty {\n padding: 16px;\n text-align: center;\n color: var(--b-tree-select-placeholder-color);\n font-size: 14px;\n}\n\n/* SR only */\n.b-tree-select__sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* Reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .b-tree-select,\n .b-tree-select__dropdown,\n .b-tree-select__node,\n .b-tree-select__switcher-icon,\n .b-tree-select__arrow {\n transition-duration: 0ms;\n }\n\n .b-tree-select__switcher-icon--spin {\n animation: none;\n }\n}\n</style>\n"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import e from "./design-system14.js";
2
+ import t from "./design-system274.js";
3
+ /* empty css */
4
+ //#region src/components/BTreeSelect/BTreeSelect.vue
5
+ var n = /* @__PURE__ */ e(t, [["__scopeId", "data-v-79b7111a"]]);
6
+ //#endregion
7
+ export { n as default };
8
+
9
+ //# sourceMappingURL=design-system276.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-system276.js","names":[],"sources":["../src/components/BTreeSelect/BTreeSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useComponentId } from '@/composables/useComponentId.ts';\nimport { BCommonSize } from '@/types.ts';\nimport { computed, nextTick, ref, useAttrs, watch } from 'vue';\nimport {\n BTreeSelectPlacement,\n BTreeSelectStatus,\n BTreeSelectVariant,\n type BTreeSelectChangeExtra,\n type BTreeSelectExpandAction,\n type BTreeSelectFieldNames,\n type BTreeSelectFlatNode,\n type BTreeSelectLabeledValue,\n type BTreeSelectModelValue,\n type BTreeSelectNode,\n type BTreeSelectShowSearchConfig,\n type BTreeSelectValue,\n} from './types.ts';\n\ndefineOptions({ inheritAttrs: false });\n\nconst attrs = useAttrs();\n\nconst {\n treeData = [],\n fieldNames,\n multiple = false,\n treeCheckable = false,\n treeCheckStrictly = false,\n labelInValue = false,\n size = BCommonSize.Medium,\n variant = BTreeSelectVariant.Outlined,\n placeholder,\n disabled = false,\n status,\n defaultOpen = false,\n showSearch = false,\n treeDefaultExpandAll = false,\n treeDefaultExpandedKeys = [],\n treeExpandedKeys: treeExpandedKeysProp,\n treeExpandAction = false,\n treeIcon = false,\n treeLine = false,\n loadData,\n placement: _placement = BTreeSelectPlacement.BottomLeft,\n popupMatchSelectWidth = true,\n listHeight = 256,\n maxTagCount,\n maxTagPlaceholder,\n maxCount,\n allowClear = false,\n notFoundContent = 'Not Found',\n filterTreeNode = true,\n treeNodeFilterProp = 'title',\n treeNodeLabelProp,\n} = defineProps<{\n /** Hierarchical data of the tree. */\n treeData?: BTreeSelectNode[];\n /** Replace default field names. */\n fieldNames?: BTreeSelectFieldNames;\n /** Allow multiple selection (without checkboxes). */\n multiple?: boolean;\n /** Show checkboxes — implies multiple. */\n treeCheckable?: boolean;\n /** Whether checkable parent/child are independent. */\n treeCheckStrictly?: boolean;\n /** Embed label in value (returns `{ value, label }`). */\n labelInValue?: boolean;\n /** Selector size. */\n size?: `${BCommonSize}`;\n /** Visual variant. */\n variant?: `${BTreeSelectVariant}`;\n /** Placeholder text when nothing selected. */\n placeholder?: string;\n /** Disable the component. */\n disabled?: boolean;\n /** Validation status. */\n status?: `${BTreeSelectStatus}`;\n /** Default open state (uncontrolled). */\n defaultOpen?: boolean;\n /** Show search input — `true` or a config object. */\n showSearch?: boolean | BTreeSelectShowSearchConfig;\n /** Expand all nodes on mount. */\n treeDefaultExpandAll?: boolean;\n /** Default expanded keys (uncontrolled). */\n treeDefaultExpandedKeys?: BTreeSelectValue[];\n /** Controlled expanded keys. */\n treeExpandedKeys?: BTreeSelectValue[];\n /** When to expand on click — `click | doubleClick | false`. */\n treeExpandAction?: BTreeSelectExpandAction;\n /** Show node icons. */\n treeIcon?: boolean;\n /** Show connector lines between nodes. */\n treeLine?: boolean;\n /** Async-load child nodes. */\n loadData?: (node: BTreeSelectNode) => Promise<void>;\n /** Dropdown placement. */\n placement?: `${BTreeSelectPlacement}`;\n /** Match popup width to selector. */\n popupMatchSelectWidth?: boolean | number;\n /** Max popup list height in px. */\n listHeight?: number;\n /** Max tags to show before collapsing into +N. */\n maxTagCount?: number | 'responsive';\n /** Custom +N tag content (function or string). */\n maxTagPlaceholder?: string | ((omitted: BTreeSelectLabeledValue[]) => string);\n /** Maximum selectable nodes. */\n maxCount?: number;\n /** Show a clear button when there is a value. */\n allowClear?: boolean;\n /** Content when search yields no results. */\n notFoundContent?: string;\n /** Filter behavior — `true` uses default, `false` disables, function for custom. */\n filterTreeNode?: boolean | ((input: string, node: BTreeSelectNode) => boolean);\n /** Property of the node used for default filtering. */\n treeNodeFilterProp?: string;\n /** Property used as the displayed label (defaults to fieldNames.label). */\n treeNodeLabelProp?: string;\n}>();\n\nconst emit = defineEmits<{\n /** Fires when selection value changes. */\n change: [\n value: BTreeSelectValue | BTreeSelectValue[] | BTreeSelectLabeledValue | BTreeSelectLabeledValue[] | undefined,\n label: string | string[],\n extra: BTreeSelectChangeExtra,\n ];\n /** Fires when a node is selected (single/multiple modes). */\n select: [value: BTreeSelectValue, node: BTreeSelectNode];\n /** Fires when a node is deselected (multiple/treeCheckable modes). */\n deselect: [value: BTreeSelectValue, node: BTreeSelectNode];\n /** Fires when a node is checked/unchecked (treeCheckable mode). */\n treeCheck: [keys: BTreeSelectValue[], info: { checked: boolean; node: BTreeSelectNode }];\n /** Fires when popup visibility changes. */\n openChange: [open: boolean];\n /** Fires when the popup scrolls. */\n popupScroll: [event: Event];\n /** Fires when expanded keys change. */\n treeExpand: [expandedKeys: BTreeSelectValue[]];\n /** Fires when search input changes. */\n search: [value: string];\n /** Fires when clear is pressed. */\n clear: [];\n /** Fires on selector focus. */\n focus: [event: FocusEvent];\n /** Fires on selector blur. */\n blur: [event: FocusEvent];\n}>();\n\nconst model = defineModel<BTreeSelectModelValue>();\nconst openModel = defineModel<boolean>('open', { default: false });\nif (defaultOpen && !openModel.value) openModel.value = defaultOpen;\n\ndefineSlots<{\n /** Suffix icon (replaces default arrow). */\n suffixIcon?(): unknown;\n /** Custom switcher icon. */\n switcherIcon?(props: { node: BTreeSelectNode; expanded: boolean }): unknown;\n /** Custom node title renderer. */\n title?(props: { node: BTreeSelectNode }): unknown;\n /** Custom tag renderer (multiple/treeCheckable). */\n tagRender?(props: { value: BTreeSelectValue; label: string; closable: boolean; onClose: () => void }): unknown;\n /** Custom not-found content. */\n notFoundContent?(): unknown;\n /** Custom node icon. */\n treeIcon?(props: { node: BTreeSelectNode }): unknown;\n}>();\n\n// ─── Field name resolution ────────────────────────────────────────────────────\nconst labelField = computed(() => fieldNames?.label ?? 'title');\nconst valueField = computed(() => fieldNames?.value ?? 'value');\nconst childrenField = computed(() => fieldNames?.children ?? 'children');\nconst displayLabelField = computed(() => treeNodeLabelProp ?? labelField.value);\n\nfunction getLabel(n: BTreeSelectNode): string {\n return String((n as Record<string, unknown>)[labelField.value] ?? '');\n}\nfunction getDisplayLabel(n: BTreeSelectNode): string {\n const v = (n as Record<string, unknown>)[displayLabelField.value];\n return v == null ? getLabel(n) : String(v);\n}\nfunction getValue(n: BTreeSelectNode): BTreeSelectValue {\n return (n as Record<string, unknown>)[valueField.value] as BTreeSelectValue;\n}\nfunction getKey(n: BTreeSelectNode): BTreeSelectValue {\n return (n.key as BTreeSelectValue) ?? getValue(n);\n}\nfunction getChildren(n: BTreeSelectNode): BTreeSelectNode[] | undefined {\n return (n as Record<string, unknown>)[childrenField.value] as BTreeSelectNode[] | undefined;\n}\n\n// ─── Identity / IDs ───────────────────────────────────────────────────────────\nconst { componentUID } = useComponentId();\nconst anchorName = computed(() => `--b-tree-select-anchor-${componentUID.value}`);\nconst treeId = computed(() => `b-tree-select-tree-${componentUID.value}`);\n\n// ─── Refs ─────────────────────────────────────────────────────────────────────\nconst selectorRef = ref<HTMLElement | null>(null);\nconst searchInputRef = ref<HTMLInputElement | null>(null);\nconst popoverRef = ref<HTMLElement | null>(null);\nconst treeRef = ref<HTMLElement | null>(null);\n\n// ─── State ────────────────────────────────────────────────────────────────────\nconst isOpen = computed(() => !!openModel.value);\n\nconst searchValue = ref('');\n\nconst internalExpanded = ref<Set<BTreeSelectValue>>(new Set());\nconst isControlledExpanded = computed(() => treeExpandedKeysProp !== undefined);\nconst activeExpanded = computed<Set<BTreeSelectValue>>(() => {\n if (isControlledExpanded.value) return new Set(treeExpandedKeysProp);\n return internalExpanded.value;\n});\n\nconst focusedKey = ref<BTreeSelectValue | null>(null);\nconst loadingKeys = ref<Set<BTreeSelectValue>>(new Set());\nconst loadedKeys = ref<Set<BTreeSelectValue>>(new Set());\n\n// ─── Mode helpers ────────────────────────────────────────────────────────────\nconst isMultiple = computed(() => multiple || treeCheckable);\n\n// ─── Tree traversal ───────────────────────────────────────────────────────────\nfunction flatten(\n nodes: BTreeSelectNode[],\n depth = 0,\n parents: BTreeSelectValue[] = [],\n parentVisible = true,\n): BTreeSelectFlatNode[] {\n const out: BTreeSelectFlatNode[] = [];\n for (const node of nodes) {\n const value = getValue(node);\n const key = getKey(node);\n const expanded = activeExpanded.value.has(key);\n out.push({ key, value, data: node, depth, visible: parentVisible, parents });\n const children = getChildren(node);\n if (children?.length) {\n out.push(...flatten(children, depth + 1, [...parents, value], parentVisible && expanded));\n }\n }\n return out;\n}\n\nconst flatNodes = computed(() => flatten(treeData));\nconst nodeByValue = computed(() => {\n const map = new Map<BTreeSelectValue, BTreeSelectNode>();\n for (const f of flatNodes.value) map.set(f.value, f.data);\n return map;\n});\n\n// ─── Search filtering ─────────────────────────────────────────────────────────\nconst searchEnabled = computed(() => !!showSearch);\n\nfunction nodeMatches(node: BTreeSelectNode, query: string): boolean {\n if (!query) return true;\n if (typeof filterTreeNode === 'function') return filterTreeNode(query, node);\n if (filterTreeNode === false) return true;\n const cfg = typeof showSearch === 'object' && showSearch !== null ? showSearch : null;\n if (cfg?.filter) return cfg.filter(query, node);\n const prop = treeNodeFilterProp ?? 'title';\n const value = (node as Record<string, unknown>)[prop];\n return String(value ?? '')\n .toLowerCase()\n .includes(query.toLowerCase());\n}\n\nconst visibleFlatNodes = computed(() => {\n const q = searchValue.value.trim();\n if (!q) return flatNodes.value.filter((n) => n.visible);\n\n // Show ancestors of any matching node\n const keepValues = new Set<BTreeSelectValue>();\n for (const f of flatNodes.value) {\n if (nodeMatches(f.data, q)) {\n keepValues.add(f.value);\n f.parents.forEach((p) => keepValues.add(p));\n }\n }\n return flatNodes.value\n .filter((f) => keepValues.has(f.value))\n .map((f) => ({ ...f, visible: true }));\n});\n\n// ─── Value / model helpers ────────────────────────────────────────────────────\nfunction toRawValue(v: BTreeSelectValue | BTreeSelectLabeledValue): BTreeSelectValue {\n if (typeof v === 'object' && v !== null) return v.value;\n return v as BTreeSelectValue;\n}\n\nconst selectedValues = computed<BTreeSelectValue[]>(() => {\n const m = model.value;\n if (m == null) return [];\n if (Array.isArray(m)) return m.map(toRawValue);\n return [toRawValue(m as BTreeSelectValue | BTreeSelectLabeledValue)];\n});\n\nconst selectedSet = computed(() => new Set(selectedValues.value));\n\n// In treeCheckable mode w/o strict, derive half-checked state from selectedValues\nconst halfCheckedSet = computed<Set<BTreeSelectValue>>(() => {\n if (!treeCheckable || treeCheckStrictly) return new Set();\n const half = new Set<BTreeSelectValue>();\n function walk(nodes: BTreeSelectNode[]): { all: boolean; some: boolean } {\n let all = true;\n let some = false;\n for (const n of nodes) {\n const v = getValue(n);\n const children = getChildren(n);\n if (children?.length) {\n const sub = walk(children);\n if (sub.all) {\n some = true;\n } else if (sub.some) {\n half.add(v);\n all = false;\n some = true;\n } else {\n if (!selectedSet.value.has(v)) all = false;\n else some = true;\n }\n } else {\n if (!selectedSet.value.has(v)) all = false;\n else some = true;\n }\n }\n return { all, some };\n }\n walk(treeData);\n return half;\n});\n\n// ─── Display tags / single label ──────────────────────────────────────────────\nconst displayTags = computed<BTreeSelectLabeledValue[]>(() => {\n return selectedValues.value.map((v) => {\n const node = nodeByValue.value.get(v);\n const fromModel = Array.isArray(model.value)\n ? (model.value.find(\n (m) => typeof m === 'object' && m !== null && 'value' in m && (m as BTreeSelectLabeledValue).value === v,\n ) as BTreeSelectLabeledValue | undefined)\n : typeof model.value === 'object' && model.value !== null && 'value' in (model.value as object) &&\n (model.value as BTreeSelectLabeledValue).value === v\n ? (model.value as BTreeSelectLabeledValue)\n : undefined;\n const label = node ? getDisplayLabel(node) : (fromModel?.label ?? String(v));\n return { value: v, label };\n });\n});\n\nconst singleLabel = computed(() => displayTags.value[0]?.label ?? '');\n\nconst visibleTags = computed(() => {\n if (maxTagCount == null || maxTagCount === 'responsive') return displayTags.value;\n return displayTags.value.slice(0, maxTagCount as number);\n});\n\nconst omittedTags = computed(() => {\n if (maxTagCount == null || maxTagCount === 'responsive') return [] as BTreeSelectLabeledValue[];\n return displayTags.value.slice(maxTagCount as number);\n});\n\nconst omittedPlaceholder = computed(() => {\n const omitted = omittedTags.value;\n if (omitted.length === 0) return '';\n if (typeof maxTagPlaceholder === 'function') return maxTagPlaceholder(omitted);\n if (typeof maxTagPlaceholder === 'string') return maxTagPlaceholder;\n return `+ ${omitted.length} ...`;\n});\n\n// ─── Initialise expanded ──────────────────────────────────────────────────────\nfunction collectAllExpandableKeys(nodes: BTreeSelectNode[]): BTreeSelectValue[] {\n const out: BTreeSelectValue[] = [];\n for (const n of nodes) {\n const ch = getChildren(n);\n if (ch?.length) {\n out.push(getKey(n));\n out.push(...collectAllExpandableKeys(ch));\n }\n }\n return out;\n}\n\nif (!isControlledExpanded.value) {\n if (treeDefaultExpandAll) {\n internalExpanded.value = new Set(collectAllExpandableKeys(treeData));\n } else if (treeDefaultExpandedKeys.length) {\n internalExpanded.value = new Set(treeDefaultExpandedKeys);\n }\n}\n\n// ─── Open/close ───────────────────────────────────────────────────────────────\nlet previouslyFocusedElement: HTMLElement | null = null;\n\nfunction setOpen(val: boolean) {\n if (openModel.value !== val) openModel.value = val;\n emit('openChange', val);\n}\n\nfunction openMenu() {\n if (disabled || isOpen.value) return;\n previouslyFocusedElement = document.activeElement as HTMLElement | null;\n setOpen(true);\n}\n\nfunction closeMenu() {\n if (!isOpen.value) return;\n setOpen(false);\n searchValue.value = '';\n // Return focus to selector\n nextTick(() => {\n if (previouslyFocusedElement?.isConnected) {\n previouslyFocusedElement.focus();\n } else {\n selectorRef.value?.focus();\n }\n });\n}\n\nwatch(isOpen, (val) => {\n if (val) {\n nextTick(() => {\n popoverRef.value?.showPopover?.();\n if (searchEnabled.value) searchInputRef.value?.focus();\n // Initial focused node\n if (!focusedKey.value && visibleFlatNodes.value[0]) {\n focusedKey.value = visibleFlatNodes.value[0].key;\n }\n });\n } else {\n popoverRef.value?.hidePopover?.();\n }\n});\n\n// ─── Toggle expand ────────────────────────────────────────────────────────────\nasync function toggleExpand(node: BTreeSelectNode) {\n const k = getKey(node);\n if (node.disabled) return;\n\n const expanding = !activeExpanded.value.has(k);\n\n // Async load\n if (expanding && loadData && !loadedKeys.value.has(k) && !loadingKeys.value.has(k)) {\n loadingKeys.value.add(k);\n try {\n await loadData(node);\n loadedKeys.value.add(k);\n } finally {\n loadingKeys.value.delete(k);\n }\n }\n\n let next: Set<BTreeSelectValue>;\n if (isControlledExpanded.value) {\n next = new Set(treeExpandedKeysProp);\n } else {\n next = new Set(internalExpanded.value);\n }\n if (expanding) next.add(k);\n else next.delete(k);\n\n if (!isControlledExpanded.value) internalExpanded.value = next;\n emit('treeExpand', [...next]);\n}\n\n// ─── Selection / check ────────────────────────────────────────────────────────\nfunction emitChange(\n values: BTreeSelectValue[],\n triggerNode: BTreeSelectNode,\n extra: Partial<BTreeSelectChangeExtra> = {},\n) {\n const labels = values.map((v) => {\n const n = nodeByValue.value.get(v);\n return n ? getDisplayLabel(n) : String(v);\n });\n\n // Build emit value\n let emitValue: BTreeSelectValue | BTreeSelectValue[] | BTreeSelectLabeledValue | BTreeSelectLabeledValue[] | undefined;\n if (isMultiple.value) {\n emitValue = labelInValue\n ? values.map((v, i) => ({ value: v, label: labels[i] }))\n : [...values];\n } else {\n if (values.length === 0) {\n emitValue = labelInValue ? undefined : undefined;\n } else {\n emitValue = labelInValue ? { value: values[0], label: labels[0] } : values[0];\n }\n }\n\n model.value = emitValue;\n emit('change', emitValue, isMultiple.value ? labels : (labels[0] ?? ''), {\n triggerValue: getValue(triggerNode),\n triggerNode,\n ...extra,\n });\n}\n\nfunction selectNode(node: BTreeSelectNode) {\n if (node.disabled || node.selectable === false) return;\n const v = getValue(node);\n\n if (treeCheckable) {\n handleCheck(node);\n return;\n }\n\n if (isMultiple.value) {\n const cur = selectedValues.value.slice();\n const idx = cur.indexOf(v);\n if (idx >= 0) {\n cur.splice(idx, 1);\n emit('deselect', v, node);\n emitChange(cur, node, { selected: false });\n } else {\n if (maxCount != null && cur.length >= maxCount) return;\n cur.push(v);\n emit('select', v, node);\n emitChange(cur, node, { selected: true });\n }\n } else {\n if (selectedValues.value[0] === v) {\n // Already selected: just close\n closeMenu();\n return;\n }\n emit('select', v, node);\n emitChange([v], node, { selected: true });\n closeMenu();\n }\n}\n\nfunction handleCheck(node: BTreeSelectNode) {\n if (node.disabled || node.disableCheckbox) return;\n const v = getValue(node);\n const cur = new Set(selectedValues.value);\n const isCurrentlyChecked = cur.has(v);\n\n if (treeCheckStrictly) {\n if (isCurrentlyChecked) {\n cur.delete(v);\n emit('deselect', v, node);\n } else {\n if (maxCount != null && cur.size >= maxCount) return;\n cur.add(v);\n emit('select', v, node);\n }\n } else {\n // cascade\n if (isCurrentlyChecked) {\n cur.delete(v);\n function uncheck(nodes: BTreeSelectNode[]) {\n for (const n of nodes) {\n cur.delete(getValue(n));\n const ch = getChildren(n);\n if (ch?.length) uncheck(ch);\n }\n }\n const ch = getChildren(node);\n if (ch?.length) uncheck(ch);\n emit('deselect', v, node);\n } else {\n if (maxCount != null && cur.size >= maxCount) return;\n cur.add(v);\n function check(nodes: BTreeSelectNode[]) {\n for (const n of nodes) {\n if (!n.disabled && !n.disableCheckbox) cur.add(getValue(n));\n const ch = getChildren(n);\n if (ch?.length) check(ch);\n }\n }\n const ch = getChildren(node);\n if (ch?.length) check(ch);\n emit('select', v, node);\n }\n // Recompute parent state by removing parents that aren't fully selected\n function syncParents(nodes: BTreeSelectNode[]): { all: boolean; some: boolean } {\n let all = true;\n let some = false;\n for (const n of nodes) {\n const value = getValue(n);\n const children = getChildren(n);\n if (children?.length) {\n const sub = syncParents(children);\n if (sub.all) {\n cur.add(value);\n some = true;\n } else if (sub.some) {\n cur.delete(value);\n all = false;\n some = true;\n } else {\n cur.delete(value);\n if (!cur.has(value)) all = false;\n }\n } else {\n if (!cur.has(value)) all = false;\n else some = true;\n }\n }\n return { all, some };\n }\n syncParents(treeData);\n }\n\n emit('treeCheck', [...cur], { checked: !isCurrentlyChecked, node });\n emitChange([...cur], node, { checked: !isCurrentlyChecked });\n}\n\nfunction removeTag(value: BTreeSelectValue, e?: Event) {\n e?.stopPropagation();\n const node = nodeByValue.value.get(value);\n if (treeCheckable && node) {\n handleCheck(node);\n return;\n }\n const next = selectedValues.value.filter((v) => v !== value);\n if (node) emit('deselect', value, node);\n emitChange(next, node ?? ({ [valueField.value]: value } as BTreeSelectNode), { selected: false });\n}\n\nfunction handleClear(e: Event) {\n e.stopPropagation();\n const dummy = { [valueField.value]: '' } as BTreeSelectNode;\n if (isMultiple.value) {\n model.value = [];\n } else {\n model.value = undefined;\n }\n searchValue.value = '';\n emit('clear');\n emit('change', model.value, isMultiple.value ? [] : '', {\n triggerNode: dummy,\n triggerValue: undefined,\n });\n}\n\n// ─── Click outside ────────────────────────────────────────────────────────────\nfunction onSelectorClick() {\n if (disabled) return;\n if (isOpen.value) closeMenu();\n else openMenu();\n}\n\nfunction onSelectorBlur(e: FocusEvent) {\n const related = e.relatedTarget as HTMLElement | null;\n if (popoverRef.value?.contains(related)) return;\n if (selectorRef.value?.contains(related)) return;\n emit('blur', e);\n}\n\nfunction onSelectorFocus(e: FocusEvent) {\n emit('focus', e);\n}\n\nfunction onSearchInput(e: Event) {\n const t = e.target as HTMLInputElement;\n searchValue.value = t.value;\n emit('search', t.value);\n if (!isOpen.value) openMenu();\n // Focus first visible node when searching\n nextTick(() => {\n focusedKey.value = visibleFlatNodes.value[0]?.key ?? null;\n });\n}\n\nfunction onPopupScroll(e: Event) {\n emit('popupScroll', e);\n}\n\n// ─── Keyboard handling ────────────────────────────────────────────────────────\nfunction focusVisibleNode(key: BTreeSelectValue) {\n focusedKey.value = key;\n nextTick(() => {\n const safe = String(key).replace(/[\"\\\\]/g, '\\\\$&');\n const el = treeRef.value?.querySelector<HTMLElement>(\n `[data-node-key=\"${safe}\"]`,\n );\n el?.focus();\n el?.scrollIntoView?.({ block: 'nearest' });\n });\n}\n\nfunction onSelectorKeyDown(e: KeyboardEvent) {\n if (disabled) return;\n switch (e.key) {\n case 'Enter':\n case ' ':\n if (!searchEnabled.value || !isOpen.value) {\n e.preventDefault();\n if (isOpen.value) closeMenu();\n else openMenu();\n }\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen.value) openMenu();\n nextTick(() => {\n const first = visibleFlatNodes.value[0];\n if (first) focusVisibleNode(first.key);\n });\n break;\n case 'Escape':\n if (isOpen.value) {\n e.preventDefault();\n closeMenu();\n }\n break;\n case 'Backspace':\n if (isMultiple.value && !searchValue.value && selectedValues.value.length > 0) {\n const last = selectedValues.value[selectedValues.value.length - 1];\n removeTag(last);\n }\n break;\n case 'Tab':\n if (isOpen.value) closeMenu();\n break;\n }\n}\n\nfunction onTreeKeyDown(e: KeyboardEvent) {\n const visible = visibleFlatNodes.value;\n if (!visible.length) return;\n const idx = visible.findIndex((n) => n.key === focusedKey.value);\n const cur = visible[idx];\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n const next = visible[idx + 1] ?? visible[0];\n focusVisibleNode(next.key);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const prev = visible[idx - 1] ?? visible[visible.length - 1];\n focusVisibleNode(prev.key);\n break;\n }\n case 'ArrowRight': {\n e.preventDefault();\n if (!cur) break;\n if (hasChildren(cur.data) && !activeExpanded.value.has(cur.key)) toggleExpand(cur.data);\n break;\n }\n case 'ArrowLeft': {\n e.preventDefault();\n if (!cur) break;\n if (activeExpanded.value.has(cur.key)) toggleExpand(cur.data);\n break;\n }\n case 'Enter':\n case ' ': {\n e.preventDefault();\n if (cur) selectNode(cur.data);\n break;\n }\n case 'Escape':\n e.preventDefault();\n closeMenu();\n break;\n case 'Home': {\n e.preventDefault();\n if (visible[0]) focusVisibleNode(visible[0].key);\n break;\n }\n case 'End': {\n e.preventDefault();\n const last = visible[visible.length - 1];\n if (last) focusVisibleNode(last.key);\n break;\n }\n case 'Tab': {\n closeMenu();\n break;\n }\n }\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\nfunction hasChildren(node: BTreeSelectNode): boolean {\n const ch = getChildren(node);\n return !!ch?.length || (!!loadData && !node.isLeaf);\n}\n\nfunction isExpanded(key: BTreeSelectValue) {\n return activeExpanded.value.has(key);\n}\n\nfunction isLoading(key: BTreeSelectValue) {\n return loadingKeys.value.has(key);\n}\n\nfunction nodeIsSelectable(node: BTreeSelectNode) {\n if (treeCheckable) return node.checkable !== false && !node.disabled && !node.disableCheckbox;\n return node.selectable !== false && !node.disabled;\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\ndefineExpose({\n focus: () => selectorRef.value?.focus(),\n blur: () => selectorRef.value?.blur(),\n});\n\n// ─── Computed UI helpers ──────────────────────────────────────────────────────\nconst showClear = computed(() => {\n if (!allowClear || disabled) return false;\n return selectedValues.value.length > 0;\n});\n\nconst sizeClass = computed(() => `b-tree-select--${size}`);\nconst variantClass = computed(() => `b-tree-select--${variant}`);\nconst statusClass = computed(() => (status ? `b-tree-select--${status}` : ''));\n\nconst expandTrigger = computed(() => treeExpandAction);\n\nfunction onNodeRowClick(node: BTreeSelectNode, event: MouseEvent) {\n if (expandTrigger.value === 'click' && hasChildren(node) && nodeIsSelectable(node)) {\n toggleExpand(node);\n }\n selectNode(node);\n void event;\n}\n\nfunction onNodeRowDblClick(node: BTreeSelectNode) {\n if (expandTrigger.value === 'doubleClick' && hasChildren(node)) {\n toggleExpand(node);\n }\n}\n</script>\n\n<template>\n <div\n class=\"b-tree-select b:relative b:inline-flex b:w-full\"\n :class=\"[sizeClass, variantClass, statusClass, { 'b-tree-select--disabled': disabled, 'b-tree-select--multiple': isMultiple, 'b-tree-select--open': isOpen }]\"\n >\n <!-- ─── Selector trigger ───────────────────────────────────────── -->\n <div\n ref=\"selectorRef\"\n v-bind=\"attrs\"\n class=\"b-tree-select__selector b:box-border b:flex b:w-full b:cursor-pointer b:items-center b:gap-1 b:transition-all b:outline-none\"\n :class=\"[\n {\n 'b:min-h-6 b:px-2 b:text-sm': size === BCommonSize.Small,\n 'b:min-h-8 b:px-3 b:text-sm': size === BCommonSize.Medium,\n 'b:min-h-10 b:px-3 b:text-base': size === BCommonSize.Large,\n },\n {\n 'b:rounded-lg b:border-1 b:border-[var(--b-tree-select-border-color)] b:bg-[var(--b-tree-select-bg)] b:hover:not-disabled:border-[var(--b-tree-select-hover-border-color)] b:focus:not-disabled:border-[var(--b-tree-select-active-border-color)] b:focus:not-disabled:shadow-[0_0_0_2px_var(--b-tree-select-active-outline-color)]':\n variant === BTreeSelectVariant.Outlined,\n 'b:rounded-lg b:border-1 b:border-transparent b:bg-[var(--b-tree-select-filled-bg)] b:focus:not-disabled:border-[var(--b-tree-select-active-border-color)] b:focus:not-disabled:bg-[var(--b-tree-select-bg)] b:focus:not-disabled:shadow-[0_0_0_2px_var(--b-tree-select-active-outline-color)]':\n variant === BTreeSelectVariant.Filled,\n 'b:rounded-lg b:border-1 b:border-transparent b:bg-transparent':\n variant === BTreeSelectVariant.Borderless,\n 'b:rounded-none b:border-0 b:border-b-1 b:border-[var(--b-tree-select-border-color)] b:bg-transparent':\n variant === BTreeSelectVariant.Underlined,\n },\n {\n 'b:border-red-500! b:hover:not-disabled:border-red-400! b:focus:not-disabled:border-red-500! b:focus:not-disabled:shadow-[0_0_0_2px_rgba(255,38,5,0.06)]!':\n status === BTreeSelectStatus.Error,\n 'b:border-yellow-500! b:hover:not-disabled:border-yellow-400! b:focus:not-disabled:border-yellow-500! b:focus:not-disabled:shadow-[0_0_0_2px_rgba(255,215,5,0.1)]!':\n status === BTreeSelectStatus.Warning,\n },\n {\n 'b:cursor-not-allowed b:opacity-40': disabled,\n },\n ]\"\n :tabindex=\"disabled ? -1 : 0\"\n role=\"combobox\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"isOpen ? treeId : undefined\"\n aria-haspopup=\"tree\"\n :aria-label=\"placeholder ?? 'Tree select'\"\n :aria-disabled=\"disabled || undefined\"\n @click=\"onSelectorClick\"\n @keydown=\"onSelectorKeyDown\"\n @focus=\"onSelectorFocus\"\n @blur=\"onSelectorBlur\"\n >\n <!-- ─── Multiple/checkable mode: tags ─── -->\n <template v-if=\"isMultiple\">\n <span\n v-for=\"tag in visibleTags\"\n :key=\"String(tag.value)\"\n class=\"b-tree-select__tag b:inline-flex b:max-w-full b:items-center b:gap-0.5 b:rounded b:border-1 b:border-[var(--b-tree-select-tag-border-color)] b:bg-[var(--b-tree-select-tag-bg)] b:leading-none\"\n :class=\"[\n {\n 'b:h-4 b:px-1 b:text-xs': size === BCommonSize.Small,\n 'b:h-6 b:px-1.5 b:text-xs': size === BCommonSize.Medium,\n 'b:h-8 b:px-2 b:text-sm': size === BCommonSize.Large,\n },\n ]\"\n >\n <slot\n name=\"tagRender\"\n :value=\"tag.value\"\n :label=\"tag.label\"\n :closable=\"!disabled\"\n :on-close=\"() => removeTag(tag.value)\"\n >\n <span class=\"b:truncate\">{{ tag.label }}</span>\n <button\n v-if=\"!disabled\"\n type=\"button\"\n class=\"b-tree-select__tag-close b:ml-0.5 b:flex b:h-3.5 b:w-3.5 b:cursor-pointer b:items-center b:justify-center b:rounded-full b:border-none b:bg-transparent b:text-[10px] b:text-zinc-400 b:hover:bg-zinc-200 b:hover:text-zinc-600\"\n :aria-label=\"`Remove ${tag.label}`\"\n tabindex=\"-1\"\n @click.stop=\"removeTag(tag.value)\"\n @mousedown.prevent\n >\n <svg aria-hidden=\"true\" width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\n <path d=\"M1 1l6 6M7 1L1 7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n </slot>\n </span>\n <span\n v-if=\"omittedTags.length > 0\"\n class=\"b-tree-select__tag b-tree-select__tag--count b:relative b:z-1 b:inline-flex b:shrink-0 b:items-center b:rounded b:bg-[var(--b-tree-select-multiple-count-bg)] b:px-1.5 b:text-xs b:leading-none b:text-[var(--b-tree-select-multiple-count-color)]\"\n :class=\"[\n {\n 'b:h-4': size === BCommonSize.Small,\n 'b:h-6': size === BCommonSize.Medium,\n 'b:h-8': size === BCommonSize.Large,\n },\n ]\"\n >\n {{ omittedPlaceholder }}\n </span>\n <input\n v-if=\"searchEnabled\"\n ref=\"searchInputRef\"\n class=\"b-tree-select__search b:min-w-4 b:flex-1 b:border-none b:bg-transparent b:text-sm b:outline-none b:placeholder:text-[var(--b-tree-select-placeholder-color)]\"\n :value=\"searchValue\"\n :placeholder=\"selectedValues.length === 0 ? placeholder : undefined\"\n :disabled=\"disabled\"\n aria-autocomplete=\"list\"\n :aria-label=\"placeholder ?? 'Search'\"\n autocomplete=\"off\"\n @input=\"onSearchInput\"\n />\n <span\n v-else-if=\"selectedValues.length === 0\"\n class=\"b-tree-select__placeholder b:flex-1 b:truncate b:text-[var(--b-tree-select-placeholder-color)]\"\n >\n {{ placeholder }}\n </span>\n </template>\n\n <!-- ─── Single mode ─── -->\n <template v-else>\n <span\n v-if=\"singleLabel && !searchValue\"\n class=\"b-tree-select__value b:flex-1 b:truncate b:text-[color:var(--b-tree-select-color)]\"\n >\n {{ singleLabel }}\n </span>\n <span\n v-else-if=\"!singleLabel && !searchValue\"\n class=\"b-tree-select__placeholder b:flex-1 b:truncate b:text-[var(--b-tree-select-placeholder-color)]\"\n >\n {{ placeholder }}\n </span>\n <input\n v-if=\"searchEnabled\"\n ref=\"searchInputRef\"\n class=\"b-tree-select__search b:absolute b:inset-0 b:w-full b:border-none b:bg-transparent b:px-3 b:text-sm b:outline-none b:placeholder:text-[var(--b-tree-select-placeholder-color)]\"\n :class=\"{ 'b:opacity-0': !isOpen }\"\n :value=\"searchValue\"\n :disabled=\"disabled\"\n autocomplete=\"off\"\n tabindex=\"-1\"\n aria-autocomplete=\"list\"\n :aria-label=\"placeholder ?? 'Search'\"\n @input=\"onSearchInput\"\n />\n </template>\n\n <!-- Clear button -->\n <button\n v-if=\"showClear\"\n type=\"button\"\n class=\"b-tree-select__clear b:z-1 b:flex b:h-4 b:w-4 b:shrink-0 b:cursor-pointer b:items-center b:justify-center b:rounded-full b:border-none b:bg-[var(--b-tree-select-bg)] b:text-xs b:text-zinc-400 b:hover:text-zinc-600\"\n aria-label=\"Clear selection\"\n tabindex=\"-1\"\n @click=\"handleClear\"\n @mousedown.prevent\n >\n <svg aria-hidden=\"true\" width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\n <path d=\"M1 1l6 6M7 1L1 7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n\n <!-- Suffix arrow -->\n <span\n class=\"b-tree-select__arrow b:ml-auto b:flex b:shrink-0 b:items-center b:text-zinc-400 b:transition-transform b:duration-200\"\n :class=\"{ 'b:rotate-180': isOpen }\"\n aria-hidden=\"true\"\n >\n <slot name=\"suffixIcon\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M2.5 4.5L6 8L9.5 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </slot>\n </span>\n </div>\n\n <!-- ─── Popup ─── -->\n <div\n :id=\"treeId\"\n ref=\"popoverRef\"\n class=\"b-tree-select__dropdown\"\n :class=\"{ 'b-tree-select__dropdown--match-width': popupMatchSelectWidth === true }\"\n :style=\"[\n typeof popupMatchSelectWidth === 'number'\n ? { width: `${popupMatchSelectWidth}px` }\n : undefined,\n { maxHeight: `${listHeight}px` },\n ]\"\n popover\n role=\"dialog\"\n aria-modal=\"false\"\n :aria-label=\"placeholder ?? 'Tree options'\"\n @scroll=\"onPopupScroll\"\n @keydown=\"onTreeKeyDown\"\n >\n <div\n ref=\"treeRef\"\n class=\"b-tree-select__tree\"\n :class=\"{ 'b-tree-select__tree--show-line': treeLine }\"\n role=\"tree\"\n :aria-multiselectable=\"isMultiple || undefined\"\n >\n <template v-if=\"visibleFlatNodes.length > 0\">\n <div\n v-for=\"flat in visibleFlatNodes\"\n :key=\"String(flat.key)\"\n :data-node-key=\"String(flat.key)\"\n class=\"b-tree-select__node\"\n :class=\"{\n 'b-tree-select__node--selected': !treeCheckable && selectedSet.has(flat.value),\n 'b-tree-select__node--disabled': flat.data.disabled,\n 'b-tree-select__node--focused': focusedKey === flat.key,\n 'b-tree-select__node--expanded': isExpanded(flat.key),\n }\"\n role=\"treeitem\"\n :aria-expanded=\"hasChildren(flat.data) ? isExpanded(flat.key) : undefined\"\n :aria-selected=\"!treeCheckable && selectedSet.has(flat.value)\"\n :aria-checked=\"treeCheckable\n ? halfCheckedSet.has(flat.value)\n ? 'mixed'\n : selectedSet.has(flat.value)\n : undefined\"\n :aria-disabled=\"flat.data.disabled || undefined\"\n :aria-level=\"flat.depth + 1\"\n :tabindex=\"focusedKey === flat.key ? 0 : -1\"\n :style=\"{ '--b-tree-select-node-indent': `${flat.depth * 24}px` }\"\n @click.stop=\"onNodeRowClick(flat.data, $event)\"\n @dblclick.stop=\"onNodeRowDblClick(flat.data)\"\n >\n <!-- Indent -->\n <span class=\"b-tree-select__indent\" aria-hidden=\"true\" />\n\n <!-- Switcher -->\n <span\n v-if=\"hasChildren(flat.data)\"\n class=\"b-tree-select__switcher\"\n :class=\"{\n 'b-tree-select__switcher--expanded': isExpanded(flat.key),\n 'b-tree-select__switcher--loading': isLoading(flat.key),\n }\"\n aria-hidden=\"true\"\n @click.stop=\"toggleExpand(flat.data)\"\n >\n <slot\n v-if=\"!isLoading(flat.key)\"\n name=\"switcherIcon\"\n :node=\"flat.data\"\n :expanded=\"isExpanded(flat.key)\"\n >\n <svg\n class=\"b-tree-select__switcher-icon\"\n viewBox=\"0 0 8 8\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M2 1.5L6 4L2 6.5z\" />\n </svg>\n </slot>\n <svg\n v-if=\"isLoading(flat.key)\"\n class=\"b-tree-select__switcher-icon b-tree-select__switcher-icon--spin\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-dasharray=\"42\"\n stroke-dashoffset=\"14\"\n stroke-linecap=\"round\"\n />\n </svg>\n </span>\n <span v-else class=\"b-tree-select__switcher b-tree-select__switcher--leaf\" aria-hidden=\"true\" />\n\n <!-- Checkbox (treeCheckable mode) -->\n <span\n v-if=\"treeCheckable && flat.data.checkable !== false\"\n class=\"b-tree-select__checkbox\"\n :class=\"{\n 'b-tree-select__checkbox--checked': selectedSet.has(flat.value),\n 'b-tree-select__checkbox--indeterminate': halfCheckedSet.has(flat.value),\n 'b-tree-select__checkbox--disabled': flat.data.disabled || flat.data.disableCheckbox,\n }\"\n role=\"checkbox\"\n :aria-checked=\"halfCheckedSet.has(flat.value) ? 'mixed' : selectedSet.has(flat.value)\"\n :aria-disabled=\"flat.data.disabled || flat.data.disableCheckbox || undefined\"\n tabindex=\"-1\"\n @click.stop=\"handleCheck(flat.data)\"\n >\n <span class=\"b-tree-select__checkbox-inner\" aria-hidden=\"true\" />\n </span>\n\n <!-- Icon -->\n <span v-if=\"treeIcon || $slots.treeIcon\" class=\"b-tree-select__icon\" aria-hidden=\"true\">\n <slot name=\"treeIcon\" :node=\"flat.data\" />\n </span>\n\n <!-- Title -->\n <span class=\"b-tree-select__title\">\n <slot name=\"title\" :node=\"flat.data\">\n {{ getDisplayLabel(flat.data) }}\n </slot>\n </span>\n </div>\n </template>\n\n <!-- Empty -->\n <div v-else class=\"b-tree-select__empty\">\n <slot name=\"notFoundContent\">{{ notFoundContent }}</slot>\n </div>\n </div>\n </div>\n\n <!-- a11y live region: announces selection count -->\n <span class=\"b-tree-select__sr-only\" role=\"status\" aria-live=\"polite\">\n <template v-if=\"isMultiple\">{{ selectedValues.length }} selected</template>\n <template v-else-if=\"singleLabel\">{{ singleLabel }} selected</template>\n </span>\n </div>\n</template>\n\n<style scoped>\n/* ─── Design tokens ─────────────────────────────────────────────────────────── */\n.b-tree-select {\n /* AntD: indentSize */\n --b-tree-select-indent-size: 24px;\n /* AntD: nodeHoverBg */\n --b-tree-select-node-hover-bg: rgba(0, 0, 0, 0.04);\n /* AntD: nodeHoverColor */\n --b-tree-select-node-hover-color: rgba(0, 0, 0, 0.88);\n /* AntD: nodeSelectedBg */\n --b-tree-select-node-selected-bg: #e6f4ff;\n /* AntD: nodeSelectedColor */\n --b-tree-select-node-selected-color: rgba(0, 0, 0, 0.88);\n /* AntD: switcherSize */\n --b-tree-select-switcher-size: 16px;\n /* AntD: titleHeight */\n --b-tree-select-title-height: 24px;\n\n /* Selector tokens */\n --b-tree-select-bg: #ffffff;\n --b-tree-select-color: rgba(0, 0, 0, 0.88);\n --b-tree-select-placeholder-color: #606870;\n --b-tree-select-border-color: #d9d9d9;\n --b-tree-select-hover-border-color: #4096ff;\n --b-tree-select-active-border-color: #1677ff;\n --b-tree-select-active-outline-color: rgba(5, 145, 255, 0.1);\n --b-tree-select-filled-bg: rgba(0, 0, 0, 0.04);\n\n /* Tag tokens */\n --b-tree-select-tag-bg: rgba(0, 0, 0, 0.06);\n --b-tree-select-tag-border-color: transparent;\n --b-tree-select-multiple-count-bg: #f0f0f0;\n --b-tree-select-multiple-count-color: #1f1f1f;\n\n /* Checkbox tokens */\n --b-tree-select-checkbox-size: 16px;\n --b-tree-select-checkbox-border: #d9d9d9;\n --b-tree-select-checkbox-bg: #ffffff;\n --b-tree-select-checkbox-checked-bg: #1677ff;\n\n /* Popup tokens */\n --b-tree-select-popup-bg: #ffffff;\n --b-tree-select-popup-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n --b-tree-select-popup-border-radius: 8px;\n --b-tree-select-z-index-popup: 1050;\n --b-tree-select-line-color: #d9d9d9;\n\n /* Motion */\n --b-tree-select-transition-duration: 200ms;\n}\n\n/* ─── Dark mode ─────────────────────────────────────────────────────────────── */\n[data-prefers-color='dark'] .b-tree-select {\n --b-tree-select-node-hover-bg: rgba(255, 255, 255, 0.08);\n --b-tree-select-node-hover-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-node-selected-bg: #111a2c;\n --b-tree-select-node-selected-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-bg: #1f1f1f;\n --b-tree-select-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-placeholder-color: #9ca3af;\n --b-tree-select-border-color: #424242;\n --b-tree-select-hover-border-color: #4096ff;\n --b-tree-select-active-border-color: #1668dc;\n --b-tree-select-active-outline-color: rgba(22, 104, 220, 0.15);\n --b-tree-select-filled-bg: rgba(255, 255, 255, 0.08);\n --b-tree-select-tag-bg: rgba(255, 255, 255, 0.1);\n --b-tree-select-multiple-count-bg: #353535;\n --b-tree-select-multiple-count-color: #e0e0e0;\n --b-tree-select-checkbox-border: #424242;\n --b-tree-select-checkbox-bg: #1f1f1f;\n --b-tree-select-popup-bg: #1f1f1f;\n --b-tree-select-popup-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.24),\n 0 3px 6px -4px rgba(0, 0, 0, 0.36),\n 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n --b-tree-select-line-color: #424242;\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-tree-select {\n --b-tree-select-node-hover-bg: rgba(255, 255, 255, 0.08);\n --b-tree-select-node-hover-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-node-selected-bg: #111a2c;\n --b-tree-select-node-selected-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-bg: #1f1f1f;\n --b-tree-select-color: rgba(255, 255, 255, 0.88);\n --b-tree-select-placeholder-color: #9ca3af;\n --b-tree-select-border-color: #424242;\n --b-tree-select-active-border-color: #1668dc;\n --b-tree-select-active-outline-color: rgba(22, 104, 220, 0.15);\n --b-tree-select-filled-bg: rgba(255, 255, 255, 0.08);\n --b-tree-select-tag-bg: rgba(255, 255, 255, 0.1);\n --b-tree-select-multiple-count-bg: #353535;\n --b-tree-select-multiple-count-color: #e0e0e0;\n --b-tree-select-checkbox-border: #424242;\n --b-tree-select-checkbox-bg: #1f1f1f;\n --b-tree-select-popup-bg: #1f1f1f;\n --b-tree-select-line-color: #424242;\n }\n}\n\n/* ─── Selector anchor ───────────────────────────────────────────────────────── */\n.b-tree-select__selector {\n anchor-name: v-bind('anchorName');\n}\n\n/* ─── Dropdown ──────────────────────────────────────────────────────────────── */\n.b-tree-select__dropdown {\n position: absolute;\n margin: 0;\n padding: 4px;\n border: none;\n background: var(--b-tree-select-popup-bg);\n border-radius: var(--b-tree-select-popup-border-radius);\n box-shadow: var(--b-tree-select-popup-shadow);\n overflow: auto;\n z-index: var(--b-tree-select-z-index-popup);\n\n position-anchor: v-bind('anchorName');\n position-try-fallbacks: --b-tree-select-top;\n inset: auto;\n top: anchor(bottom);\n left: anchor(left);\n margin-top: 4px;\n\n transition:\n display 0.2s,\n opacity 0.2s;\n transition-behavior: allow-discrete;\n opacity: 0;\n\n &:popover-open {\n opacity: 1;\n\n @starting-style {\n opacity: 0;\n }\n }\n}\n\n.b-tree-select__tree {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n outline: none;\n}\n\n.b-tree-select__dropdown--match-width {\n width: anchor-size(width);\n}\n\n@position-try --b-tree-select-top {\n inset: auto;\n bottom: anchor(top);\n left: anchor(left);\n margin-top: 0;\n margin-bottom: 4px;\n}\n\n.b-tree-select__node {\n position: relative;\n display: flex;\n align-items: center;\n gap: 4px;\n height: var(--b-tree-select-title-height);\n padding-inline-start: calc(8px + var(--b-tree-select-node-indent, 0px));\n padding-inline-end: 12px;\n border-radius: 6px;\n cursor: pointer;\n user-select: none;\n outline: none;\n color: inherit;\n transition:\n background-color var(--b-tree-select-transition-duration) ease,\n color var(--b-tree-select-transition-duration) ease;\n}\n\n.b-tree-select__node:hover {\n background-color: var(--b-tree-select-node-hover-bg);\n color: var(--b-tree-select-node-hover-color);\n}\n\n.b-tree-select__node--selected {\n background-color: var(--b-tree-select-node-selected-bg);\n color: var(--b-tree-select-node-selected-color);\n font-weight: 600;\n}\n\n.b-tree-select__node--selected:hover {\n background-color: var(--b-tree-select-node-selected-bg);\n}\n\n.b-tree-select__node--focused,\n.b-tree-select__node:focus-visible {\n background-color: var(--b-tree-select-node-hover-bg);\n outline: none;\n}\n\n.b-tree-select__node--disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.b-tree-select__node--disabled:hover {\n background-color: transparent;\n}\n\n/* Indent placeholder */\n.b-tree-select__indent {\n display: inline-block;\n flex-shrink: 0;\n}\n\n/* Switcher */\n.b-tree-select__switcher {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--b-tree-select-switcher-size);\n height: var(--b-tree-select-switcher-size);\n color: rgba(0, 0, 0, 0.45);\n}\n\n.b-tree-select__switcher--leaf {\n pointer-events: none;\n visibility: hidden;\n}\n\n.b-tree-select__switcher-icon {\n width: 10px;\n height: 10px;\n transition: transform var(--b-tree-select-transition-duration) ease;\n}\n\n.b-tree-select__switcher--expanded .b-tree-select__switcher-icon:not(.b-tree-select__switcher-icon--spin) {\n transform: rotate(90deg);\n}\n\n@keyframes b-tree-select-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.b-tree-select__switcher-icon--spin {\n animation: b-tree-select-spin 700ms linear infinite;\n}\n\n/* Checkbox */\n.b-tree-select__checkbox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n cursor: pointer;\n line-height: 1;\n}\n\n.b-tree-select__checkbox-inner {\n display: inline-block;\n width: var(--b-tree-select-checkbox-size);\n height: var(--b-tree-select-checkbox-size);\n border: 1.5px solid var(--b-tree-select-checkbox-border);\n border-radius: 3px;\n background-color: var(--b-tree-select-checkbox-bg);\n position: relative;\n transition:\n border-color var(--b-tree-select-transition-duration) ease,\n background-color var(--b-tree-select-transition-duration) ease;\n}\n\n.b-tree-select__checkbox--checked .b-tree-select__checkbox-inner {\n border-color: var(--b-tree-select-checkbox-checked-bg);\n background-color: var(--b-tree-select-checkbox-checked-bg);\n}\n\n.b-tree-select__checkbox--checked .b-tree-select__checkbox-inner::after {\n content: '';\n position: absolute;\n inset-inline-start: 4px;\n top: 1px;\n width: 5px;\n height: 8px;\n border: 2px solid #fff;\n border-top: none;\n border-inline-start: none;\n transform: rotate(45deg);\n}\n\n.b-tree-select__checkbox--indeterminate .b-tree-select__checkbox-inner {\n border-color: var(--b-tree-select-checkbox-checked-bg);\n background-color: var(--b-tree-select-checkbox-checked-bg);\n}\n\n.b-tree-select__checkbox--indeterminate .b-tree-select__checkbox-inner::after {\n content: '';\n position: absolute;\n inset-inline-start: 2px;\n top: 50%;\n width: calc(100% - 4px);\n height: 2px;\n background-color: #fff;\n transform: translateY(-50%);\n}\n\n.b-tree-select__checkbox--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Icon */\n.b-tree-select__icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n/* Title */\n.b-tree-select__title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Show line */\n.b-tree-select__tree--show-line .b-tree-select__node:not(:last-child)::before {\n content: '';\n position: absolute;\n inset-inline-start: calc(var(--b-tree-select-node-indent, 0px) + var(--b-tree-select-switcher-size) / 2);\n top: var(--b-tree-select-title-height);\n width: 1px;\n height: var(--b-tree-select-title-height);\n background-color: var(--b-tree-select-line-color);\n pointer-events: none;\n}\n\n/* Empty content */\n.b-tree-select__empty {\n padding: 16px;\n text-align: center;\n color: var(--b-tree-select-placeholder-color);\n font-size: 14px;\n}\n\n/* SR only */\n.b-tree-select__sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* Reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .b-tree-select,\n .b-tree-select__dropdown,\n .b-tree-select__node,\n .b-tree-select__switcher-icon,\n .b-tree-select__arrow {\n transition-duration: 0ms;\n }\n\n .b-tree-select__switcher-icon--spin {\n animation: none;\n }\n}\n</style>\n"],"mappings":""}
@@ -7,4 +7,4 @@ var e = /* @__PURE__ */ function(e) {
7
7
  //#endregion
8
8
  export { t as BUploadFileStatus, e as BUploadListType };
9
9
 
10
- //# sourceMappingURL=design-system259.js.map
10
+ //# sourceMappingURL=design-system277.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"design-system259.js","names":[],"sources":["../src/components/BUpload/types.ts"],"sourcesContent":["export enum BUploadListType {\n Text = 'text',\n Picture = 'picture',\n PictureCard = 'picture-card',\n PictureCircle = 'picture-circle',\n}\n\nexport enum BUploadFileStatus {\n Uploading = 'uploading',\n Done = 'done',\n Error = 'error',\n Removed = 'removed',\n}\n\nexport interface BUploadFile {\n uid: string;\n name: string;\n status?: BUploadFileStatus;\n percent?: number;\n url?: string;\n thumbUrl?: string;\n response?: unknown;\n error?: unknown;\n originFileObj?: File;\n size?: number;\n type?: string;\n}\n\nexport interface BUploadChangeInfo {\n file: BUploadFile;\n fileList: BUploadFile[];\n event?: ProgressEvent;\n}\n\nexport interface BUploadRequestOption {\n action: string;\n file: File;\n filename: string;\n headers?: Record<string, string>;\n data?: Record<string, unknown>;\n withCredentials?: boolean;\n method?: string;\n onProgress?: (event: { percent: number }) => void;\n onSuccess?: (response: unknown) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface BUploadShowUploadList {\n showPreviewIcon?: boolean;\n showRemoveIcon?: boolean;\n showDownloadIcon?: boolean;\n}\n"],"mappings":";AAAA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,OAAA,QACA,EAAA,UAAA,WACA,EAAA,cAAA,gBACA,EAAA,gBAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,YAAA,aACA,EAAA,OAAA,QACA,EAAA,QAAA,SACA,EAAA,UAAA;KACD"}
1
+ {"version":3,"file":"design-system277.js","names":[],"sources":["../src/components/BUpload/types.ts"],"sourcesContent":["export enum BUploadListType {\n Text = 'text',\n Picture = 'picture',\n PictureCard = 'picture-card',\n PictureCircle = 'picture-circle',\n}\n\nexport enum BUploadFileStatus {\n Uploading = 'uploading',\n Done = 'done',\n Error = 'error',\n Removed = 'removed',\n}\n\nexport interface BUploadFile {\n uid: string;\n name: string;\n status?: BUploadFileStatus;\n percent?: number;\n url?: string;\n thumbUrl?: string;\n response?: unknown;\n error?: unknown;\n originFileObj?: File;\n size?: number;\n type?: string;\n}\n\nexport interface BUploadChangeInfo {\n file: BUploadFile;\n fileList: BUploadFile[];\n event?: ProgressEvent;\n}\n\nexport interface BUploadRequestOption {\n action: string;\n file: File;\n filename: string;\n headers?: Record<string, string>;\n data?: Record<string, unknown>;\n withCredentials?: boolean;\n method?: string;\n onProgress?: (event: { percent: number }) => void;\n onSuccess?: (response: unknown) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface BUploadShowUploadList {\n showPreviewIcon?: boolean;\n showRemoveIcon?: boolean;\n showDownloadIcon?: boolean;\n}\n"],"mappings":";AAAA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,OAAA,QACA,EAAA,UAAA,WACA,EAAA,cAAA,gBACA,EAAA,gBAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,YAAA,aACA,EAAA,OAAA,QACA,EAAA,QAAA,SACA,EAAA,UAAA;KACD"}