@7pmlabs/design-system 2.0.9 → 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-system252.js","names":["$slots"],"sources":["../src/components/BTree/BTree.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch } from 'vue';\nimport type {\n BTreeCheckedKeys,\n BTreeCheckInfo,\n BTreeDragInfo,\n BTreeDropInfo,\n BTreeExpandInfo,\n BTreeFieldNames,\n BTreeFlatNode,\n BTreeNodeData,\n BTreeNodeKey,\n BTreeScrollToOptions,\n BTreeSelectInfo,\n} from './types';\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nconst {\n treeData = [],\n fieldNames = {},\n checkable = false,\n checkStrictly = false,\n checkedKeys: checkedKeysProp = undefined,\n defaultCheckedKeys = [],\n selectedKeys: selectedKeysProp = undefined,\n defaultSelectedKeys = [],\n expandedKeys: expandedKeysProp = undefined,\n defaultExpandedKeys = [],\n defaultExpandAll = false,\n defaultExpandParent = true,\n autoExpandParent = false,\n multiple = false,\n selectable = true,\n disabled = false,\n showIcon = false,\n showLine = false,\n blockNode = false,\n draggable = false,\n loadData = undefined,\n loadedKeys: loadedKeysProp = undefined,\n filterTreeNode = undefined,\n height = undefined,\n virtual: _virtual = false,\n directory = false,\n expandAction = 'click',\n} = defineProps<{\n /** Tree node data array */\n treeData?: BTreeNodeData[];\n /** Custom field name mappings (key/title/children) */\n fieldNames?: BTreeFieldNames;\n /** Whether to show checkboxes */\n checkable?: boolean;\n /** Check parent/child independently */\n checkStrictly?: boolean;\n /** Controlled checked node keys */\n checkedKeys?: BTreeNodeKey[] | BTreeCheckedKeys;\n /** Default checked node keys (uncontrolled) */\n defaultCheckedKeys?: BTreeNodeKey[];\n /** Controlled selected node keys */\n selectedKeys?: BTreeNodeKey[];\n /** Default selected node keys (uncontrolled) */\n defaultSelectedKeys?: BTreeNodeKey[];\n /** Controlled expanded node keys */\n expandedKeys?: BTreeNodeKey[];\n /** Default expanded node keys (uncontrolled) */\n defaultExpandedKeys?: BTreeNodeKey[];\n /** Expand all nodes on mount */\n defaultExpandAll?: boolean;\n /** Auto expand parent of defaultExpandedKeys nodes */\n defaultExpandParent?: boolean;\n /** Auto expand parent when expandedKeys changes */\n autoExpandParent?: boolean;\n /** Allow multiple selection */\n multiple?: boolean;\n /** Allow node selection */\n selectable?: boolean;\n /** Disable entire tree */\n disabled?: boolean;\n /** Show node icons */\n showIcon?: boolean;\n /** Show connector lines */\n showLine?: boolean;\n /** Node takes full row width */\n blockNode?: boolean;\n /** Enable drag-and-drop */\n draggable?: boolean;\n /** Async load children */\n loadData?: (node: BTreeNodeData) => Promise<void>;\n /** Controlled loaded node keys */\n loadedKeys?: BTreeNodeKey[];\n /** Predicate to highlight nodes */\n filterTreeNode?: (node: BTreeNodeData) => boolean;\n /** Fixed height for virtual scroll (px) */\n height?: number;\n /** Enable virtual scroll (requires height) */\n virtual?: boolean;\n /** Enable DirectoryTree mode */\n directory?: boolean;\n /** DirectoryTree: expansion trigger (click | doubleClick | false) */\n expandAction?: 'click' | 'doubleClick' | false;\n}>();\n\n// ─── Emits ────────────────────────────────────────────────────────────────────\n\nconst emit = defineEmits<{\n /** Fires when check state changes */\n check: [keys: BTreeNodeKey[] | BTreeCheckedKeys, info: BTreeCheckInfo];\n /** Fires when expand state changes */\n expand: [keys: BTreeNodeKey[], info: BTreeExpandInfo];\n /** Fires when selection changes */\n select: [keys: BTreeNodeKey[], info: BTreeSelectInfo];\n /** Fires when async load finishes */\n load: [keys: BTreeNodeKey[], info: { event: Event; node: BTreeNodeData }];\n /** Fires on right-click */\n rightClick: [info: { event: MouseEvent; node: BTreeNodeData }];\n /** Fires on drag start */\n dragStart: [info: BTreeDragInfo];\n /** Fires when dragged over a node */\n dragEnter: [info: { event: DragEvent; node: BTreeNodeData; expandedKeys: BTreeNodeKey[] }];\n /** Fires while dragging over a node */\n dragOver: [info: BTreeDragInfo];\n /** Fires when leaving a node during drag */\n dragLeave: [info: BTreeDragInfo];\n /** Fires when drag ends */\n dragEnd: [info: BTreeDragInfo];\n /** Fires on drop */\n drop: [info: BTreeDropInfo];\n /** Fires on double-click */\n dblclick: [event: MouseEvent, node: BTreeNodeData];\n /** v-model:checkedKeys */\n 'update:checkedKeys': [keys: BTreeNodeKey[] | BTreeCheckedKeys];\n /** v-model:selectedKeys */\n 'update:selectedKeys': [keys: BTreeNodeKey[]];\n /** v-model:expandedKeys */\n 'update:expandedKeys': [keys: BTreeNodeKey[]];\n /** v-model:loadedKeys */\n 'update:loadedKeys': [keys: BTreeNodeKey[]];\n}>();\n\n// ─── Slots ────────────────────────────────────────────────────────────────────\n\ndefineSlots<{\n /** Default icon for all nodes */\n icon(props: { node: BTreeNodeData }): unknown;\n /** Custom switcher icon */\n switcherIcon(props: { node: BTreeNodeData; expanded: boolean }): unknown;\n /** Custom title renderer */\n title(props: { node: BTreeNodeData }): unknown;\n}>();\n\n// ─── Resolved field names ─────────────────────────────────────────────────────\n\nconst fKey = computed(() => fieldNames.key ?? 'key');\nconst fTitle = computed(() => fieldNames.title ?? 'title');\nconst fChildren = computed(() => fieldNames.children ?? 'children');\n\nfunction nodeKey(n: BTreeNodeData): BTreeNodeKey {\n return n[fKey.value] as BTreeNodeKey;\n}\nfunction nodeTitle(n: BTreeNodeData): string {\n return (n[fTitle.value] as string) ?? '';\n}\nfunction nodeChildren(n: BTreeNodeData): BTreeNodeData[] | undefined {\n return n[fChildren.value] as BTreeNodeData[] | undefined;\n}\n\n// ─── Internal state ───────────────────────────────────────────────────────────\n\nconst internalExpanded = ref<Set<BTreeNodeKey>>(new Set());\nconst internalSelected = ref<Set<BTreeNodeKey>>(new Set());\nconst internalChecked = ref<Set<BTreeNodeKey>>(new Set());\nconst internalHalfChecked = ref<Set<BTreeNodeKey>>(new Set());\nconst internalLoaded = ref<Set<BTreeNodeKey>>(new Set());\nconst loadingKeys = ref<Set<BTreeNodeKey>>(new Set());\nconst dragNodeKey = ref<BTreeNodeKey | null>(null);\n\n// Controlled getters\nconst isControlledExpanded = computed(() => expandedKeysProp !== undefined);\nconst isControlledSelected = computed(() => selectedKeysProp !== undefined);\nconst isControlledChecked = computed(() => checkedKeysProp !== undefined);\nconst isControlledLoaded = computed(() => loadedKeysProp !== undefined);\n\nconst activeExpanded = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledExpanded.value) return new Set(expandedKeysProp);\n return internalExpanded.value;\n});\n\nconst activeSelected = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledSelected.value) return new Set(selectedKeysProp);\n return internalSelected.value;\n});\n\nconst activeChecked = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledChecked.value) {\n const raw = checkedKeysProp as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n if (Array.isArray(raw)) return new Set(raw);\n return new Set(raw.checked);\n }\n return internalChecked.value;\n});\n\nconst activeHalfChecked = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledChecked.value) {\n const raw = checkedKeysProp as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n if (!Array.isArray(raw) && 'halfChecked' in raw) return new Set(raw.halfChecked);\n }\n return internalHalfChecked.value;\n});\n\nconst activeLoaded = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledLoaded.value) return new Set(loadedKeysProp);\n return internalLoaded.value;\n});\n\n// ─── Flatten tree ─────────────────────────────────────────────────────────────\n\nfunction flattenTree(nodes: BTreeNodeData[], depth = 0, parentVisible = true): BTreeFlatNode[] {\n const result: BTreeFlatNode[] = [];\n for (const node of nodes) {\n const key = nodeKey(node);\n const isExpanded = activeExpanded.value.has(key);\n const visible = parentVisible;\n result.push({ key, data: node, depth, visible });\n const children = nodeChildren(node);\n if (children?.length) {\n result.push(...flattenTree(children, depth + 1, visible && isExpanded));\n }\n }\n return result;\n}\n\nconst flatNodes = computed(() => flattenTree(treeData));\nconst visibleNodes = computed(() => flatNodes.value.filter((n) => n.visible));\n\n// ─── Mount: apply defaults ────────────────────────────────────────────────────\n\nfunction collectAllKeys(nodes: BTreeNodeData[]): BTreeNodeKey[] {\n const keys: BTreeNodeKey[] = [];\n for (const n of nodes) {\n keys.push(nodeKey(n));\n const children = nodeChildren(n);\n if (children?.length) keys.push(...collectAllKeys(children));\n }\n return keys;\n}\n\nfunction collectParentKeys(nodes: BTreeNodeData[], targetKeys: Set<BTreeNodeKey>): BTreeNodeKey[] {\n const parents: BTreeNodeKey[] = [];\n function walk(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n const children = nodeChildren(n);\n if (children?.length) {\n const hasDescendant = children.some(\n (c) => targetKeys.has(nodeKey(c)) || walk([c]) !== undefined,\n );\n if (hasDescendant) parents.push(nodeKey(n));\n walk(children);\n }\n }\n }\n walk(nodes);\n return parents;\n}\n\n// Initialise uncontrolled state once\nif (!isControlledExpanded.value) {\n if (defaultExpandAll) {\n internalExpanded.value = new Set(\n collectAllKeys(treeData).filter((k) => {\n const flat = flatNodes.value.find((n) => n.key === k);\n return flat ? !!nodeChildren(flat.data)?.length : false;\n }),\n );\n } else if (defaultExpandedKeys.length) {\n const init = new Set<BTreeNodeKey>(defaultExpandedKeys);\n if (defaultExpandParent) {\n collectParentKeys(treeData, init).forEach((k) => init.add(k));\n }\n internalExpanded.value = init;\n }\n}\nif (!isControlledSelected.value && defaultSelectedKeys.length) {\n internalSelected.value = new Set(defaultSelectedKeys);\n}\nif (!isControlledChecked.value && defaultCheckedKeys.length) {\n internalChecked.value = new Set(defaultCheckedKeys);\n if (!checkStrictly) propagateChecks(internalChecked.value);\n}\n\n// Auto-expand parents when controlled expandedKeys change\nwatch(\n () => expandedKeysProp,\n (keys) => {\n if (!autoExpandParent || !keys) return;\n const set = new Set(keys);\n collectParentKeys(treeData, set).forEach((k) => set.add(k));\n emit('update:expandedKeys', [...set]);\n },\n);\n\n// ─── Checkbox propagation ─────────────────────────────────────────────────────\n\nfunction propagateChecks(checked: Set<BTreeNodeKey>) {\n // Bottom-up: compute half-checked from actual checked leaves\n const half = new Set<BTreeNodeKey>();\n function walk(nodes: BTreeNodeData[]): { all: boolean; some: boolean } {\n let allChecked = true;\n let someChecked = false;\n for (const n of nodes) {\n const key = nodeKey(n);\n const children = nodeChildren(n);\n if (children?.length) {\n const sub = walk(children);\n if (sub.all) {\n checked.add(key);\n someChecked = true;\n } else if (sub.some) {\n checked.delete(key);\n half.add(key);\n allChecked = false;\n someChecked = true;\n } else {\n if (!checked.has(key)) allChecked = false;\n else someChecked = true;\n }\n } else {\n if (!checked.has(key)) allChecked = false;\n else someChecked = true;\n }\n }\n return { all: allChecked, some: someChecked };\n }\n walk(treeData);\n internalHalfChecked.value = half;\n}\n\n// ─── Node helpers ─────────────────────────────────────────────────────────────\n\nfunction hasChildren(node: BTreeNodeData): boolean {\n const ch = nodeChildren(node);\n return !!ch?.length || (!!loadData && !node.isLeaf);\n}\n\nfunction isExpanded(key: BTreeNodeKey): boolean {\n return activeExpanded.value.has(key);\n}\nfunction isSelected(key: BTreeNodeKey): boolean {\n return activeSelected.value.has(key);\n}\nfunction isChecked(key: BTreeNodeKey): boolean {\n return activeChecked.value.has(key);\n}\nfunction isHalfChecked(key: BTreeNodeKey): boolean {\n return activeHalfChecked.value.has(key);\n}\nfunction isLoading(key: BTreeNodeKey): boolean {\n return loadingKeys.value.has(key);\n}\nfunction isLoaded(key: BTreeNodeKey): boolean {\n return activeLoaded.value.has(key);\n}\nfunction isFiltered(node: BTreeNodeData): boolean {\n return filterTreeNode ? filterTreeNode(node) : false;\n}\n\n// ─── Expand / collapse ────────────────────────────────────────────────────────\n\nasync function toggleExpand(node: BTreeNodeData, event?: MouseEvent | KeyboardEvent) {\n const key = nodeKey(node);\n if (node.disabled || disabled) return;\n\n const expanding = !isExpanded(key);\n\n // Async load\n if (expanding && loadData && !isLoaded(key) && !isLoading(key)) {\n loadingKeys.value.add(key);\n try {\n await loadData(node);\n if (!isControlledLoaded.value) internalLoaded.value.add(key);\n emit('update:loadedKeys', [...activeLoaded.value, key]);\n } finally {\n loadingKeys.value.delete(key);\n }\n }\n\n let nextSet: Set<BTreeNodeKey>;\n if (isControlledExpanded.value) {\n nextSet = new Set(expandedKeysProp);\n } else {\n nextSet = new Set(internalExpanded.value);\n }\n\n if (expanding) nextSet.add(key);\n else nextSet.delete(key);\n\n if (!isControlledExpanded.value) internalExpanded.value = nextSet;\n emit('update:expandedKeys', [...nextSet]);\n\n const info: BTreeExpandInfo = { expanded: expanding, node, event };\n emit('expand', [...nextSet], info);\n}\n\n// ─── Select ───────────────────────────────────────────────────────────────────\n\nfunction handleSelect(node: BTreeNodeData, event: MouseEvent | KeyboardEvent) {\n if (!selectable || node.selectable === false || node.disabled || disabled) return;\n const key = nodeKey(node);\n\n let nextSet: Set<BTreeNodeKey>;\n if (isControlledSelected.value) {\n nextSet = new Set(selectedKeysProp);\n } else {\n nextSet = new Set(internalSelected.value);\n }\n\n if (nextSet.has(key)) {\n nextSet.delete(key);\n } else {\n if (!multiple) nextSet.clear();\n nextSet.add(key);\n }\n\n if (!isControlledSelected.value) internalSelected.value = nextSet;\n emit('update:selectedKeys', [...nextSet]);\n\n const info: BTreeSelectInfo = {\n event,\n selected: nextSet.has(key),\n node,\n selectedNodes: flatNodes.value.filter((n) => nextSet.has(n.key)).map((n) => n.data),\n nativeEvent: event,\n };\n emit('select', [...nextSet], info);\n}\n\n// ─── Check ────────────────────────────────────────────────────────────────────\n\nfunction handleCheck(node: BTreeNodeData, event: MouseEvent | KeyboardEvent) {\n if (!checkable || node.disableCheckbox || node.disabled || disabled) return;\n const key = nodeKey(node);\n\n let nextChecked: Set<BTreeNodeKey>;\n if (isControlledChecked.value) {\n const raw = checkedKeysProp as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n nextChecked = new Set(Array.isArray(raw) ? raw : raw.checked);\n } else {\n nextChecked = new Set(internalChecked.value);\n }\n\n if (nextChecked.has(key)) {\n nextChecked.delete(key);\n // Uncheck all descendants\n if (!checkStrictly) {\n function uncheckDesc(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n nextChecked.delete(nodeKey(n));\n const ch = nodeChildren(n);\n if (ch?.length) uncheckDesc(ch);\n }\n }\n const children = nodeChildren(node);\n if (children?.length) uncheckDesc(children);\n }\n } else {\n nextChecked.add(key);\n // Check all descendants\n if (!checkStrictly) {\n function checkDesc(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n if (!n.disableCheckbox && !n.disabled) nextChecked.add(nodeKey(n));\n const ch = nodeChildren(n);\n if (ch?.length) checkDesc(ch);\n }\n }\n const children = nodeChildren(node);\n if (children?.length) checkDesc(children);\n }\n }\n\n if (!checkStrictly && !isControlledChecked.value) {\n propagateChecks(nextChecked);\n }\n\n const checkedNodes = flatNodes.value.filter((n) => nextChecked.has(n.key)).map((n) => n.data);\n\n const info: BTreeCheckInfo = {\n event,\n node,\n checked: nextChecked.has(key),\n checkedNodes,\n checkedNodesPositions: checkedNodes.map((n) => ({ node: n, pos: '0' })),\n halfCheckedKeys: [...activeHalfChecked.value],\n nativeEvent: event,\n };\n\n if (!isControlledChecked.value) internalChecked.value = nextChecked;\n\n const emitValue: BTreeNodeKey[] | BTreeCheckedKeys = checkStrictly\n ? { checked: [...nextChecked], halfChecked: [...activeHalfChecked.value] }\n : [...nextChecked];\n\n emit('update:checkedKeys', emitValue);\n emit('check', emitValue, info);\n}\n\n// ─── Drag & Drop ──────────────────────────────────────────────────────────────\n\nfunction handleDragStart(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n dragNodeKey.value = nodeKey(node);\n event.dataTransfer?.setData('text/plain', String(nodeKey(node)));\n emit('dragStart', { event, node });\n}\n\nfunction handleDragEnter(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n event.preventDefault();\n emit('dragEnter', { event, node, expandedKeys: [...activeExpanded.value] });\n}\n\nfunction handleDragOver(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n event.preventDefault();\n emit('dragOver', { event, node });\n}\n\nfunction handleDragLeave(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n emit('dragLeave', { event, node });\n}\n\nfunction handleDragEnd(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n dragNodeKey.value = null;\n emit('dragEnd', { event, node });\n}\n\nfunction handleDrop(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n event.preventDefault();\n const dragFlat = flatNodes.value.find((n) => n.key === dragNodeKey.value);\n if (!dragFlat) return;\n\n emit('drop', {\n event,\n node,\n dragNode: dragFlat.data,\n dragNodesKeys: [dragFlat.key],\n dropPosition: 0,\n dropToGap: false,\n });\n dragNodeKey.value = null;\n}\n\n// ─── Keyboard navigation ──────────────────────────────────────────────────────\n\nconst treeRef = ref<HTMLElement | null>(null);\n\nconst focusedNodeKey = ref<BTreeNodeKey | null>(visibleNodes.value[0]?.key ?? null);\n\nfunction handleTreeKeydown(event: KeyboardEvent) {\n const visible = visibleNodes.value;\n if (!visible.length) return;\n\n const currentIdx = visible.findIndex((n) => n.key === focusedNodeKey.value);\n const current = visible[currentIdx];\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n const next = visible[currentIdx + 1];\n if (next) {\n focusedNodeKey.value = next.key;\n nextTick(() => focusNode(next.key));\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n const prev = visible[currentIdx - 1];\n if (prev) {\n focusedNodeKey.value = prev.key;\n nextTick(() => focusNode(prev.key));\n }\n break;\n }\n case 'ArrowRight': {\n event.preventDefault();\n if (!current) break;\n if (hasChildren(current.data) && !isExpanded(current.key)) {\n toggleExpand(current.data, event);\n } else if (isExpanded(current.key)) {\n const firstChild = visible[currentIdx + 1];\n if (firstChild?.depth > current.depth) {\n focusedNodeKey.value = firstChild.key;\n nextTick(() => focusNode(firstChild.key));\n }\n }\n break;\n }\n case 'ArrowLeft': {\n event.preventDefault();\n if (!current) break;\n if (isExpanded(current.key)) {\n toggleExpand(current.data, event);\n } else if (current.depth > 0) {\n // Move to parent\n for (let i = currentIdx - 1; i >= 0; i--) {\n if (visible[i].depth < current.depth) {\n focusedNodeKey.value = visible[i].key;\n nextTick(() => focusNode(visible[i].key));\n break;\n }\n }\n }\n break;\n }\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (!current) break;\n if (checkable) {\n handleCheck(current.data, event);\n } else if (selectable) {\n handleSelect(current.data, event);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n if (visible[0]) {\n focusedNodeKey.value = visible[0].key;\n nextTick(() => focusNode(visible[0].key));\n }\n break;\n }\n case 'End': {\n event.preventDefault();\n const last = visible[visible.length - 1];\n if (last) {\n focusedNodeKey.value = last.key;\n nextTick(() => focusNode(last.key));\n }\n break;\n }\n }\n}\n\nfunction focusNode(key: BTreeNodeKey) {\n const el = treeRef.value?.querySelector<HTMLElement>(\n `[data-node-key=\"${String(key).replace(/[\"\\\\]/g, '\\\\$&')}\"]`,\n );\n el?.focus();\n}\n\n// ─── Directory-mode: click/dblclick expand ────────────────────────────────────\n\nfunction handleNodeClick(node: BTreeNodeData, event: MouseEvent) {\n if (directory && expandAction === 'click' && hasChildren(node)) {\n toggleExpand(node, event);\n }\n handleSelect(node, event);\n}\n\nfunction handleNodeDblClick(node: BTreeNodeData, event: MouseEvent) {\n if (directory && expandAction === 'doubleClick' && hasChildren(node)) {\n toggleExpand(node, event);\n }\n emit('dblclick', event, node);\n}\n\n// ─── Scroll to ────────────────────────────────────────────────────────────────\n\nfunction scrollTo(opts: BTreeScrollToOptions) {\n nextTick(() => {\n const el = treeRef.value?.querySelector<HTMLElement>(\n `[data-node-key=\"${String(opts.key).replace(/[\"\\\\]/g, '\\\\$&')}\"]`,\n );\n const alignMap = { top: 'start', bottom: 'end', auto: 'nearest' } as const;\n el?.scrollIntoView?.({ block: alignMap[opts.align ?? 'auto'] });\n });\n}\n\ndefineExpose({ scrollTo });\n\n// ─── Right click ─────────────────────────────────────────────────────────────\n\nfunction handleRightClick(event: MouseEvent, node: BTreeNodeData) {\n event.preventDefault();\n emit('rightClick', { event, node });\n}\n</script>\n\n<template>\n <div\n ref=\"treeRef\"\n class=\"b-tree\"\n :class=\"{\n 'b-tree--checkable': checkable,\n 'b-tree--show-line': showLine,\n 'b-tree--block-node': blockNode,\n 'b-tree--directory': directory,\n 'b-tree--disabled': disabled,\n }\"\n role=\"tree\"\n :aria-multiselectable=\"multiple || undefined\"\n :style=\"height ? { height: `${height}px`, overflowY: 'auto' } : undefined\"\n @keydown=\"handleTreeKeydown\"\n >\n <template v-for=\"flatNode in visibleNodes\" :key=\"flatNode.key\">\n <div\n :data-node-key=\"String(flatNode.key)\"\n class=\"b-tree__node\"\n :class=\"{\n 'b-tree__node--selected': isSelected(flatNode.key),\n 'b-tree__node--checked': isChecked(flatNode.key),\n 'b-tree__node--half-checked': isHalfChecked(flatNode.key),\n 'b-tree__node--expanded': isExpanded(flatNode.key),\n 'b-tree__node--disabled': flatNode.data.disabled || disabled,\n 'b-tree__node--leaf': !hasChildren(flatNode.data),\n 'b-tree__node--loading': isLoading(flatNode.key),\n 'b-tree__node--dragging': draggable && dragNodeKey === flatNode.key,\n 'b-tree__node--filtered': isFiltered(flatNode.data),\n 'b-tree__node--block': blockNode,\n }\"\n role=\"treeitem\"\n :aria-expanded=\"hasChildren(flatNode.data) ? isExpanded(flatNode.key) : undefined\"\n :aria-selected=\"selectable ? isSelected(flatNode.key) : undefined\"\n :aria-checked=\"checkable ? isChecked(flatNode.key) : undefined\"\n :aria-disabled=\"flatNode.data.disabled || disabled || undefined\"\n :aria-level=\"flatNode.depth + 1\"\n :tabindex=\"flatNode.key === focusedNodeKey ? 0 : -1\"\n :style=\"{ '--b-tree-node-indent': `${flatNode.depth * 24}px` }\"\n :draggable=\"draggable ? 'true' : undefined\"\n @click.stop=\"handleNodeClick(flatNode.data, $event)\"\n @dblclick.stop=\"handleNodeDblClick(flatNode.data, $event)\"\n @contextmenu.stop=\"handleRightClick($event, flatNode.data)\"\n @dragstart=\"handleDragStart($event, flatNode.data)\"\n @dragenter=\"handleDragEnter($event, flatNode.data)\"\n @dragover=\"handleDragOver($event, flatNode.data)\"\n @dragleave=\"handleDragLeave($event, flatNode.data)\"\n @dragend=\"handleDragEnd($event, flatNode.data)\"\n @drop=\"handleDrop($event, flatNode.data)\"\n >\n <!-- Drag handle (visible on row hover when draggable) -->\n <span v-if=\"draggable\" class=\"b-tree__drag-handle\" aria-hidden=\"true\">\n <!-- HolderOutlined: 2×3 dot grid -->\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"5\" cy=\"3.5\" r=\"1.25\" />\n <circle cx=\"5\" cy=\"8\" r=\"1.25\" />\n <circle cx=\"5\" cy=\"12.5\" r=\"1.25\" />\n <circle cx=\"11\" cy=\"3.5\" r=\"1.25\" />\n <circle cx=\"11\" cy=\"8\" r=\"1.25\" />\n <circle cx=\"11\" cy=\"12.5\" r=\"1.25\" />\n </svg>\n </span>\n\n <!-- Indent spacer -->\n <span class=\"b-tree__indent\" aria-hidden=\"true\" />\n\n <!-- Switcher (expand/collapse) -->\n <span\n v-if=\"hasChildren(flatNode.data)\"\n class=\"b-tree__switcher\"\n :class=\"{\n 'b-tree__switcher--expanded': isExpanded(flatNode.key),\n 'b-tree__switcher--loading': isLoading(flatNode.key),\n }\"\n aria-hidden=\"true\"\n @click.stop=\"toggleExpand(flatNode.data, $event)\"\n >\n <slot\n v-if=\"!isLoading(flatNode.key)\"\n name=\"switcherIcon\"\n :node=\"flatNode.data\"\n :expanded=\"isExpanded(flatNode.key)\"\n >\n <!-- Default chevron SVG -->\n <svg\n class=\"b-tree__switcher-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M9 18L15 12L9 6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </slot>\n <!-- Loading spinner -->\n <svg\n v-if=\"isLoading(flatNode.key)\"\n class=\"b-tree__switcher-icon b-tree__switcher-icon--spin\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\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 <!-- Leaf placeholder -->\n <span\n v-else-if=\"showLine\"\n class=\"b-tree__switcher b-tree__switcher--leaf\"\n aria-hidden=\"true\"\n />\n\n <!-- Checkbox -->\n <span\n v-if=\"checkable && flatNode.data.checkable !== false\"\n class=\"b-tree__checkbox\"\n :class=\"{\n 'b-tree__checkbox--checked': isChecked(flatNode.key),\n 'b-tree__checkbox--indeterminate': isHalfChecked(flatNode.key),\n 'b-tree__checkbox--disabled':\n flatNode.data.disableCheckbox || flatNode.data.disabled || disabled,\n }\"\n role=\"checkbox\"\n :aria-label=\"nodeTitle(flatNode.data)\"\n :aria-checked=\"isHalfChecked(flatNode.key) ? 'mixed' : isChecked(flatNode.key)\"\n :aria-disabled=\"\n flatNode.data.disableCheckbox || flatNode.data.disabled || disabled || undefined\n \"\n tabindex=\"-1\"\n @click.stop=\"handleCheck(flatNode.data, $event)\"\n @keydown.enter.prevent=\"handleCheck(flatNode.data, $event)\"\n @keydown.space.prevent=\"handleCheck(flatNode.data, $event)\"\n >\n <span class=\"b-tree__checkbox-inner\" aria-hidden=\"true\" />\n </span>\n\n <!-- Icon -->\n <span\n v-if=\"showIcon || flatNode.data.icon || $slots.icon\"\n class=\"b-tree__icon\"\n aria-hidden=\"true\"\n >\n <slot name=\"icon\" :node=\"flatNode.data\">\n <span v-if=\"flatNode.data.icon\">{{ flatNode.data.icon }}</span>\n </slot>\n </span>\n\n <!-- Title -->\n <span\n class=\"b-tree__title\"\n :class=\"{ 'b-tree__title--filtered': isFiltered(flatNode.data) }\"\n >\n <slot name=\"title\" :node=\"flatNode.data\">\n {{ nodeTitle(flatNode.data) }}\n </slot>\n </span>\n </div>\n </template>\n </div>\n</template>\n\n<style scoped>\n/* ─── Root ──────────────────────────────────────────────────────────────────── */\n.b-tree {\n /* Layout */\n --b-tree-indent-size: 24px;\n --b-tree-node-height: 24px;\n --b-tree-switcher-size: 24px;\n --b-tree-checkbox-size: 16px;\n --b-tree-icon-size: 14px;\n --b-tree-gap: 4px;\n --b-tree-border-radius: 6px;\n --b-tree-font-size: 14px;\n\n /* Colors – light mode */\n --b-tree-node-hover-bg: oklch(95% 0.003 264);\n --b-tree-node-hover-color: oklch(20% 0.014 264);\n --b-tree-node-selected-bg: oklch(94% 0.08 254);\n --b-tree-node-selected-color: oklch(20% 0.014 264);\n --b-tree-node-disabled-color: oklch(70% 0.005 264);\n --b-tree-switcher-color: oklch(55% 0.008 264);\n --b-tree-checkbox-border: oklch(75% 0.008 264);\n --b-tree-checkbox-bg: oklch(100% 0 0);\n --b-tree-checkbox-checked-bg: oklch(55% 0.22 260);\n --b-tree-checkbox-checked-border: oklch(55% 0.22 260);\n --b-tree-checkbox-indeterminate-bg: oklch(55% 0.22 260);\n --b-tree-line-color: oklch(88% 0.006 264);\n --b-tree-title-color: oklch(20% 0.014 264);\n --b-tree-title-filtered-color: oklch(55% 0.22 260);\n --b-tree-directory-selected-bg: oklch(55% 0.22 260);\n --b-tree-directory-selected-color: oklch(100% 0 0);\n\n /* Motion */\n --b-tree-transition-duration: 200ms;\n --b-tree-spin-duration: 700ms;\n\n display: block;\n font-size: var(--b-tree-font-size);\n line-height: var(--b-tree-node-height);\n color: var(--b-tree-title-color);\n outline: none;\n}\n\n/* ─── Dark mode ─────────────────────────────────────────────────────────────── */\n[data-prefers-color='dark'] .b-tree {\n --b-tree-node-hover-bg: oklch(28% 0.012 264);\n --b-tree-node-hover-color: oklch(92% 0.006 264);\n --b-tree-node-selected-bg: oklch(30% 0.06 254);\n --b-tree-node-selected-color: oklch(92% 0.006 264);\n --b-tree-node-disabled-color: oklch(45% 0.005 264);\n --b-tree-switcher-color: oklch(65% 0.008 264);\n --b-tree-checkbox-border: oklch(45% 0.008 264);\n --b-tree-checkbox-bg: oklch(22% 0.012 264);\n --b-tree-checkbox-checked-bg: oklch(55% 0.22 260);\n --b-tree-checkbox-checked-border: oklch(55% 0.22 260);\n --b-tree-checkbox-indeterminate-bg: oklch(55% 0.22 260);\n --b-tree-line-color: oklch(35% 0.008 264);\n --b-tree-title-color: oklch(92% 0.006 264);\n --b-tree-title-filtered-color: oklch(65% 0.22 260);\n --b-tree-directory-selected-bg: oklch(45% 0.22 260);\n --b-tree-directory-selected-color: oklch(100% 0 0);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-tree {\n --b-tree-node-hover-bg: oklch(28% 0.012 264);\n --b-tree-node-hover-color: oklch(92% 0.006 264);\n --b-tree-node-selected-bg: oklch(30% 0.06 254);\n --b-tree-node-selected-color: oklch(92% 0.006 264);\n --b-tree-node-disabled-color: oklch(45% 0.005 264);\n --b-tree-switcher-color: oklch(65% 0.008 264);\n --b-tree-checkbox-border: oklch(45% 0.008 264);\n --b-tree-checkbox-bg: oklch(22% 0.012 264);\n --b-tree-checkbox-checked-bg: oklch(55% 0.22 260);\n --b-tree-checkbox-checked-border: oklch(55% 0.22 260);\n --b-tree-checkbox-indeterminate-bg: oklch(55% 0.22 260);\n --b-tree-line-color: oklch(35% 0.008 264);\n --b-tree-title-color: oklch(92% 0.006 264);\n --b-tree-title-filtered-color: oklch(65% 0.22 260);\n --b-tree-directory-selected-bg: oklch(45% 0.22 260);\n --b-tree-directory-selected-color: oklch(100% 0 0);\n }\n}\n\n/* ─── Node ───────────────────────────────────────────────────────────────────── */\n.b-tree__node {\n display: flex;\n align-items: center;\n gap: var(--b-tree-gap);\n height: var(--b-tree-node-height);\n padding-inline-start: var(--b-tree-node-indent);\n border-radius: var(--b-tree-border-radius);\n cursor: pointer;\n outline: none;\n transition:\n background-color var(--b-tree-transition-duration) ease,\n color var(--b-tree-transition-duration) ease;\n user-select: none;\n position: relative;\n}\n\n.b-tree__node:hover {\n background-color: var(--b-tree-node-hover-bg);\n color: var(--b-tree-node-hover-color);\n}\n\n.b-tree__node:focus-visible {\n outline: 2px solid var(--b-tree-checkbox-checked-bg);\n outline-offset: -1px;\n}\n\n.b-tree__node--selected {\n background-color: var(--b-tree-node-selected-bg);\n color: var(--b-tree-node-selected-color);\n font-weight: 500;\n}\n\n.b-tree__node--selected:hover {\n background-color: var(--b-tree-node-selected-bg);\n}\n\n.b-tree__node--disabled {\n cursor: not-allowed;\n color: var(--b-tree-node-disabled-color);\n}\n\n.b-tree__node--disabled:hover {\n background-color: transparent;\n}\n\n.b-tree__node--block {\n padding-inline-end: 8px;\n}\n\n/* ─── Directory mode selected ───────────────────────────────────────────────── */\n.b-tree--directory .b-tree__node--selected {\n background-color: var(--b-tree-directory-selected-bg);\n color: var(--b-tree-directory-selected-color);\n}\n\n.b-tree--directory .b-tree__node--selected:hover {\n background-color: var(--b-tree-directory-selected-bg);\n}\n\n/* ─── Indent ─────────────────────────────────────────────────────────────────── */\n.b-tree__indent {\n display: inline-block;\n flex-shrink: 0;\n}\n\n/* ─── Switcher ───────────────────────────────────────────────────────────────── */\n.b-tree__switcher {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--b-tree-switcher-size);\n height: var(--b-tree-switcher-size);\n color: var(--b-tree-switcher-color);\n transition: color var(--b-tree-transition-duration) ease;\n}\n\n.b-tree__switcher:hover {\n color: var(--b-tree-checkbox-checked-bg);\n}\n\n.b-tree__switcher--leaf {\n pointer-events: none;\n}\n\n.b-tree__switcher-icon {\n width: 12px;\n height: 12px;\n flex-shrink: 0;\n transition: transform var(--b-tree-transition-duration) ease;\n}\n\n.b-tree__switcher--expanded .b-tree__switcher-icon:not(.b-tree__switcher-icon--spin) {\n transform: rotate(90deg);\n}\n\n/* Loading spinner */\n@keyframes b-tree-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.b-tree__switcher-icon--spin {\n animation: b-tree-spin var(--b-tree-spin-duration) linear infinite;\n}\n\n/* ─── Show lines ─────────────────────────────────────────────────────────────── */\n.b-tree--show-line .b-tree__node:not(:last-child)::before {\n content: '';\n position: absolute;\n inset-inline-start: calc(var(--b-tree-node-indent) + var(--b-tree-switcher-size) / 2);\n top: var(--b-tree-node-height);\n width: 1px;\n height: var(--b-tree-node-height);\n background-color: var(--b-tree-line-color);\n pointer-events: none;\n}\n\n/* ─── Checkbox ───────────────────────────────────────────────────────────────── */\n.b-tree__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__checkbox--disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.b-tree__checkbox-inner {\n display: inline-block;\n width: var(--b-tree-checkbox-size);\n height: var(--b-tree-checkbox-size);\n border: 1.5px solid var(--b-tree-checkbox-border);\n border-radius: 3px;\n background-color: var(--b-tree-checkbox-bg);\n position: relative;\n transition:\n border-color var(--b-tree-transition-duration) ease,\n background-color var(--b-tree-transition-duration) ease;\n}\n\n/* Checked tick */\n.b-tree__checkbox--checked .b-tree__checkbox-inner {\n border-color: var(--b-tree-checkbox-checked-border);\n background-color: var(--b-tree-checkbox-checked-bg);\n}\n\n.b-tree__checkbox--checked .b-tree__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/* Indeterminate dash */\n.b-tree__checkbox--indeterminate .b-tree__checkbox-inner {\n border-color: var(--b-tree-checkbox-indeterminate-bg);\n background-color: var(--b-tree-checkbox-indeterminate-bg);\n}\n\n.b-tree__checkbox--indeterminate .b-tree__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/* ─── Icon ───────────────────────────────────────────────────────────────────── */\n.b-tree__icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n font-size: var(--b-tree-icon-size);\n}\n\n/* ─── Title ──────────────────────────────────────────────────────────────────── */\n.b-tree__title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: inherit;\n}\n\n.b-tree__title--filtered {\n color: var(--b-tree-title-filtered-color);\n font-weight: 500;\n}\n\n/* ─── Drag handle ─────────────────────────────────────────────────────────── */\n.b-tree__drag-handle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 12px;\n height: var(--b-tree-node-height);\n color: var(--b-tree-switcher-color);\n cursor: grab;\n}\n\n.b-tree__drag-handle svg {\n width: 12px;\n height: 12px;\n display: block;\n}\n\n.b-tree__drag-handle:active {\n cursor: grabbing;\n}\n\n/* ─── Dragging node ──────────────────────────────────────────────────────────── */\n.b-tree__node--dragging {\n opacity: 0.5;\n}\n\n/* ─── Reduced motion ─────────────────────────────────────────────────────────── */\n@media (prefers-reduced-motion: reduce) {\n .b-tree {\n --b-tree-transition-duration: 0ms;\n --b-tree-spin-duration: 0ms;\n }\n\n .b-tree__switcher-icon {\n transition: none;\n }\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"design-system270.js","names":["$slots"],"sources":["../src/components/BTree/BTree.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch } from 'vue';\nimport type {\n BTreeCheckedKeys,\n BTreeCheckInfo,\n BTreeDragInfo,\n BTreeDropInfo,\n BTreeExpandInfo,\n BTreeFieldNames,\n BTreeFlatNode,\n BTreeNodeData,\n BTreeNodeKey,\n BTreeScrollToOptions,\n BTreeSelectInfo,\n} from './types';\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nconst {\n treeData = [],\n fieldNames = {},\n checkable = false,\n checkStrictly = false,\n checkedKeys: checkedKeysProp = undefined,\n defaultCheckedKeys = [],\n selectedKeys: selectedKeysProp = undefined,\n defaultSelectedKeys = [],\n expandedKeys: expandedKeysProp = undefined,\n defaultExpandedKeys = [],\n defaultExpandAll = false,\n defaultExpandParent = true,\n autoExpandParent = false,\n multiple = false,\n selectable = true,\n disabled = false,\n showIcon = false,\n showLine = false,\n blockNode = false,\n draggable = false,\n loadData = undefined,\n loadedKeys: loadedKeysProp = undefined,\n filterTreeNode = undefined,\n height = undefined,\n virtual: _virtual = false,\n directory = false,\n expandAction = 'click',\n} = defineProps<{\n /** Tree node data array */\n treeData?: BTreeNodeData[];\n /** Custom field name mappings (key/title/children) */\n fieldNames?: BTreeFieldNames;\n /** Whether to show checkboxes */\n checkable?: boolean;\n /** Check parent/child independently */\n checkStrictly?: boolean;\n /** Controlled checked node keys */\n checkedKeys?: BTreeNodeKey[] | BTreeCheckedKeys;\n /** Default checked node keys (uncontrolled) */\n defaultCheckedKeys?: BTreeNodeKey[];\n /** Controlled selected node keys */\n selectedKeys?: BTreeNodeKey[];\n /** Default selected node keys (uncontrolled) */\n defaultSelectedKeys?: BTreeNodeKey[];\n /** Controlled expanded node keys */\n expandedKeys?: BTreeNodeKey[];\n /** Default expanded node keys (uncontrolled) */\n defaultExpandedKeys?: BTreeNodeKey[];\n /** Expand all nodes on mount */\n defaultExpandAll?: boolean;\n /** Auto expand parent of defaultExpandedKeys nodes */\n defaultExpandParent?: boolean;\n /** Auto expand parent when expandedKeys changes */\n autoExpandParent?: boolean;\n /** Allow multiple selection */\n multiple?: boolean;\n /** Allow node selection */\n selectable?: boolean;\n /** Disable entire tree */\n disabled?: boolean;\n /** Show node icons */\n showIcon?: boolean;\n /** Show connector lines */\n showLine?: boolean;\n /** Node takes full row width */\n blockNode?: boolean;\n /** Enable drag-and-drop */\n draggable?: boolean;\n /** Async load children */\n loadData?: (node: BTreeNodeData) => Promise<void>;\n /** Controlled loaded node keys */\n loadedKeys?: BTreeNodeKey[];\n /** Predicate to highlight nodes */\n filterTreeNode?: (node: BTreeNodeData) => boolean;\n /** Fixed height for virtual scroll (px) */\n height?: number;\n /** Enable virtual scroll (requires height) */\n virtual?: boolean;\n /** Enable DirectoryTree mode */\n directory?: boolean;\n /** DirectoryTree: expansion trigger (click | doubleClick | false) */\n expandAction?: 'click' | 'doubleClick' | false;\n}>();\n\n// ─── Emits ────────────────────────────────────────────────────────────────────\n\nconst emit = defineEmits<{\n /** Fires when check state changes */\n check: [keys: BTreeNodeKey[] | BTreeCheckedKeys, info: BTreeCheckInfo];\n /** Fires when expand state changes */\n expand: [keys: BTreeNodeKey[], info: BTreeExpandInfo];\n /** Fires when selection changes */\n select: [keys: BTreeNodeKey[], info: BTreeSelectInfo];\n /** Fires when async load finishes */\n load: [keys: BTreeNodeKey[], info: { event: Event; node: BTreeNodeData }];\n /** Fires on right-click */\n rightClick: [info: { event: MouseEvent; node: BTreeNodeData }];\n /** Fires on drag start */\n dragStart: [info: BTreeDragInfo];\n /** Fires when dragged over a node */\n dragEnter: [info: { event: DragEvent; node: BTreeNodeData; expandedKeys: BTreeNodeKey[] }];\n /** Fires while dragging over a node */\n dragOver: [info: BTreeDragInfo];\n /** Fires when leaving a node during drag */\n dragLeave: [info: BTreeDragInfo];\n /** Fires when drag ends */\n dragEnd: [info: BTreeDragInfo];\n /** Fires on drop */\n drop: [info: BTreeDropInfo];\n /** Fires on double-click */\n dblclick: [event: MouseEvent, node: BTreeNodeData];\n /** v-model:checkedKeys */\n 'update:checkedKeys': [keys: BTreeNodeKey[] | BTreeCheckedKeys];\n /** v-model:selectedKeys */\n 'update:selectedKeys': [keys: BTreeNodeKey[]];\n /** v-model:expandedKeys */\n 'update:expandedKeys': [keys: BTreeNodeKey[]];\n /** v-model:loadedKeys */\n 'update:loadedKeys': [keys: BTreeNodeKey[]];\n}>();\n\n// ─── Slots ────────────────────────────────────────────────────────────────────\n\ndefineSlots<{\n /** Default icon for all nodes */\n icon(props: { node: BTreeNodeData }): unknown;\n /** Custom switcher icon */\n switcherIcon(props: { node: BTreeNodeData; expanded: boolean }): unknown;\n /** Custom title renderer */\n title(props: { node: BTreeNodeData }): unknown;\n}>();\n\n// ─── Resolved field names ─────────────────────────────────────────────────────\n\nconst fKey = computed(() => fieldNames.key ?? 'key');\nconst fTitle = computed(() => fieldNames.title ?? 'title');\nconst fChildren = computed(() => fieldNames.children ?? 'children');\n\nfunction nodeKey(n: BTreeNodeData): BTreeNodeKey {\n return n[fKey.value] as BTreeNodeKey;\n}\nfunction nodeTitle(n: BTreeNodeData): string {\n return (n[fTitle.value] as string) ?? '';\n}\nfunction nodeChildren(n: BTreeNodeData): BTreeNodeData[] | undefined {\n return n[fChildren.value] as BTreeNodeData[] | undefined;\n}\n\n// ─── Internal state ───────────────────────────────────────────────────────────\n\nconst internalExpanded = ref<Set<BTreeNodeKey>>(new Set());\nconst internalSelected = ref<Set<BTreeNodeKey>>(new Set());\nconst internalChecked = ref<Set<BTreeNodeKey>>(new Set());\nconst internalHalfChecked = ref<Set<BTreeNodeKey>>(new Set());\nconst internalLoaded = ref<Set<BTreeNodeKey>>(new Set());\nconst loadingKeys = ref<Set<BTreeNodeKey>>(new Set());\nconst dragNodeKey = ref<BTreeNodeKey | null>(null);\n\n// Controlled getters\nconst isControlledExpanded = computed(() => expandedKeysProp !== undefined);\nconst isControlledSelected = computed(() => selectedKeysProp !== undefined);\nconst isControlledChecked = computed(() => checkedKeysProp !== undefined);\nconst isControlledLoaded = computed(() => loadedKeysProp !== undefined);\n\nconst activeExpanded = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledExpanded.value) return new Set(expandedKeysProp);\n return internalExpanded.value;\n});\n\nconst activeSelected = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledSelected.value) return new Set(selectedKeysProp);\n return internalSelected.value;\n});\n\nconst activeChecked = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledChecked.value) {\n const raw = checkedKeysProp as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n if (Array.isArray(raw)) return new Set(raw);\n return new Set(raw.checked);\n }\n return internalChecked.value;\n});\n\nconst activeHalfChecked = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledChecked.value) {\n const raw = checkedKeysProp as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n if (!Array.isArray(raw) && 'halfChecked' in raw) return new Set(raw.halfChecked);\n }\n return internalHalfChecked.value;\n});\n\nconst activeLoaded = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledLoaded.value) return new Set(loadedKeysProp);\n return internalLoaded.value;\n});\n\n// ─── Flatten tree ─────────────────────────────────────────────────────────────\n\nfunction flattenTree(nodes: BTreeNodeData[], depth = 0, parentVisible = true): BTreeFlatNode[] {\n const result: BTreeFlatNode[] = [];\n for (const node of nodes) {\n const key = nodeKey(node);\n const isExpanded = activeExpanded.value.has(key);\n const visible = parentVisible;\n result.push({ key, data: node, depth, visible });\n const children = nodeChildren(node);\n if (children?.length) {\n result.push(...flattenTree(children, depth + 1, visible && isExpanded));\n }\n }\n return result;\n}\n\nconst flatNodes = computed(() => flattenTree(treeData));\nconst visibleNodes = computed(() => flatNodes.value.filter((n) => n.visible));\n\n// ─── Mount: apply defaults ────────────────────────────────────────────────────\n\nfunction collectAllKeys(nodes: BTreeNodeData[]): BTreeNodeKey[] {\n const keys: BTreeNodeKey[] = [];\n for (const n of nodes) {\n keys.push(nodeKey(n));\n const children = nodeChildren(n);\n if (children?.length) keys.push(...collectAllKeys(children));\n }\n return keys;\n}\n\nfunction collectParentKeys(nodes: BTreeNodeData[], targetKeys: Set<BTreeNodeKey>): BTreeNodeKey[] {\n const parents: BTreeNodeKey[] = [];\n function walk(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n const children = nodeChildren(n);\n if (children?.length) {\n const hasDescendant = children.some(\n (c) => targetKeys.has(nodeKey(c)) || walk([c]) !== undefined,\n );\n if (hasDescendant) parents.push(nodeKey(n));\n walk(children);\n }\n }\n }\n walk(nodes);\n return parents;\n}\n\n// Initialise uncontrolled state once\nif (!isControlledExpanded.value) {\n if (defaultExpandAll) {\n internalExpanded.value = new Set(\n collectAllKeys(treeData).filter((k) => {\n const flat = flatNodes.value.find((n) => n.key === k);\n return flat ? !!nodeChildren(flat.data)?.length : false;\n }),\n );\n } else if (defaultExpandedKeys.length) {\n const init = new Set<BTreeNodeKey>(defaultExpandedKeys);\n if (defaultExpandParent) {\n collectParentKeys(treeData, init).forEach((k) => init.add(k));\n }\n internalExpanded.value = init;\n }\n}\nif (!isControlledSelected.value && defaultSelectedKeys.length) {\n internalSelected.value = new Set(defaultSelectedKeys);\n}\nif (!isControlledChecked.value && defaultCheckedKeys.length) {\n internalChecked.value = new Set(defaultCheckedKeys);\n if (!checkStrictly) propagateChecks(internalChecked.value);\n}\n\n// Auto-expand parents when controlled expandedKeys change\nwatch(\n () => expandedKeysProp,\n (keys) => {\n if (!autoExpandParent || !keys) return;\n const set = new Set(keys);\n collectParentKeys(treeData, set).forEach((k) => set.add(k));\n emit('update:expandedKeys', [...set]);\n },\n);\n\n// ─── Checkbox propagation ─────────────────────────────────────────────────────\n\nfunction propagateChecks(checked: Set<BTreeNodeKey>) {\n // Bottom-up: compute half-checked from actual checked leaves\n const half = new Set<BTreeNodeKey>();\n function walk(nodes: BTreeNodeData[]): { all: boolean; some: boolean } {\n let allChecked = true;\n let someChecked = false;\n for (const n of nodes) {\n const key = nodeKey(n);\n const children = nodeChildren(n);\n if (children?.length) {\n const sub = walk(children);\n if (sub.all) {\n checked.add(key);\n someChecked = true;\n } else if (sub.some) {\n checked.delete(key);\n half.add(key);\n allChecked = false;\n someChecked = true;\n } else {\n if (!checked.has(key)) allChecked = false;\n else someChecked = true;\n }\n } else {\n if (!checked.has(key)) allChecked = false;\n else someChecked = true;\n }\n }\n return { all: allChecked, some: someChecked };\n }\n walk(treeData);\n internalHalfChecked.value = half;\n}\n\n// ─── Node helpers ─────────────────────────────────────────────────────────────\n\nfunction hasChildren(node: BTreeNodeData): boolean {\n const ch = nodeChildren(node);\n return !!ch?.length || (!!loadData && !node.isLeaf);\n}\n\nfunction isExpanded(key: BTreeNodeKey): boolean {\n return activeExpanded.value.has(key);\n}\nfunction isSelected(key: BTreeNodeKey): boolean {\n return activeSelected.value.has(key);\n}\nfunction isChecked(key: BTreeNodeKey): boolean {\n return activeChecked.value.has(key);\n}\nfunction isHalfChecked(key: BTreeNodeKey): boolean {\n return activeHalfChecked.value.has(key);\n}\nfunction isLoading(key: BTreeNodeKey): boolean {\n return loadingKeys.value.has(key);\n}\nfunction isLoaded(key: BTreeNodeKey): boolean {\n return activeLoaded.value.has(key);\n}\nfunction isFiltered(node: BTreeNodeData): boolean {\n return filterTreeNode ? filterTreeNode(node) : false;\n}\n\n// ─── Expand / collapse ────────────────────────────────────────────────────────\n\nasync function toggleExpand(node: BTreeNodeData, event?: MouseEvent | KeyboardEvent) {\n const key = nodeKey(node);\n if (node.disabled || disabled) return;\n\n const expanding = !isExpanded(key);\n\n // Async load\n if (expanding && loadData && !isLoaded(key) && !isLoading(key)) {\n loadingKeys.value.add(key);\n try {\n await loadData(node);\n if (!isControlledLoaded.value) internalLoaded.value.add(key);\n emit('update:loadedKeys', [...activeLoaded.value, key]);\n } finally {\n loadingKeys.value.delete(key);\n }\n }\n\n let nextSet: Set<BTreeNodeKey>;\n if (isControlledExpanded.value) {\n nextSet = new Set(expandedKeysProp);\n } else {\n nextSet = new Set(internalExpanded.value);\n }\n\n if (expanding) nextSet.add(key);\n else nextSet.delete(key);\n\n if (!isControlledExpanded.value) internalExpanded.value = nextSet;\n emit('update:expandedKeys', [...nextSet]);\n\n const info: BTreeExpandInfo = { expanded: expanding, node, event };\n emit('expand', [...nextSet], info);\n}\n\n// ─── Select ───────────────────────────────────────────────────────────────────\n\nfunction handleSelect(node: BTreeNodeData, event: MouseEvent | KeyboardEvent) {\n if (!selectable || node.selectable === false || node.disabled || disabled) return;\n const key = nodeKey(node);\n\n let nextSet: Set<BTreeNodeKey>;\n if (isControlledSelected.value) {\n nextSet = new Set(selectedKeysProp);\n } else {\n nextSet = new Set(internalSelected.value);\n }\n\n if (nextSet.has(key)) {\n nextSet.delete(key);\n } else {\n if (!multiple) nextSet.clear();\n nextSet.add(key);\n }\n\n if (!isControlledSelected.value) internalSelected.value = nextSet;\n emit('update:selectedKeys', [...nextSet]);\n\n const info: BTreeSelectInfo = {\n event,\n selected: nextSet.has(key),\n node,\n selectedNodes: flatNodes.value.filter((n) => nextSet.has(n.key)).map((n) => n.data),\n nativeEvent: event,\n };\n emit('select', [...nextSet], info);\n}\n\n// ─── Check ────────────────────────────────────────────────────────────────────\n\nfunction handleCheck(node: BTreeNodeData, event: MouseEvent | KeyboardEvent) {\n if (!checkable || node.disableCheckbox || node.disabled || disabled) return;\n const key = nodeKey(node);\n\n let nextChecked: Set<BTreeNodeKey>;\n if (isControlledChecked.value) {\n const raw = checkedKeysProp as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n nextChecked = new Set(Array.isArray(raw) ? raw : raw.checked);\n } else {\n nextChecked = new Set(internalChecked.value);\n }\n\n if (nextChecked.has(key)) {\n nextChecked.delete(key);\n // Uncheck all descendants\n if (!checkStrictly) {\n function uncheckDesc(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n nextChecked.delete(nodeKey(n));\n const ch = nodeChildren(n);\n if (ch?.length) uncheckDesc(ch);\n }\n }\n const children = nodeChildren(node);\n if (children?.length) uncheckDesc(children);\n }\n } else {\n nextChecked.add(key);\n // Check all descendants\n if (!checkStrictly) {\n function checkDesc(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n if (!n.disableCheckbox && !n.disabled) nextChecked.add(nodeKey(n));\n const ch = nodeChildren(n);\n if (ch?.length) checkDesc(ch);\n }\n }\n const children = nodeChildren(node);\n if (children?.length) checkDesc(children);\n }\n }\n\n if (!checkStrictly && !isControlledChecked.value) {\n propagateChecks(nextChecked);\n }\n\n const checkedNodes = flatNodes.value.filter((n) => nextChecked.has(n.key)).map((n) => n.data);\n\n const info: BTreeCheckInfo = {\n event,\n node,\n checked: nextChecked.has(key),\n checkedNodes,\n checkedNodesPositions: checkedNodes.map((n) => ({ node: n, pos: '0' })),\n halfCheckedKeys: [...activeHalfChecked.value],\n nativeEvent: event,\n };\n\n if (!isControlledChecked.value) internalChecked.value = nextChecked;\n\n const emitValue: BTreeNodeKey[] | BTreeCheckedKeys = checkStrictly\n ? { checked: [...nextChecked], halfChecked: [...activeHalfChecked.value] }\n : [...nextChecked];\n\n emit('update:checkedKeys', emitValue);\n emit('check', emitValue, info);\n}\n\n// ─── Drag & Drop ──────────────────────────────────────────────────────────────\n\nfunction handleDragStart(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n dragNodeKey.value = nodeKey(node);\n event.dataTransfer?.setData('text/plain', String(nodeKey(node)));\n emit('dragStart', { event, node });\n}\n\nfunction handleDragEnter(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n event.preventDefault();\n emit('dragEnter', { event, node, expandedKeys: [...activeExpanded.value] });\n}\n\nfunction handleDragOver(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n event.preventDefault();\n emit('dragOver', { event, node });\n}\n\nfunction handleDragLeave(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n emit('dragLeave', { event, node });\n}\n\nfunction handleDragEnd(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n dragNodeKey.value = null;\n emit('dragEnd', { event, node });\n}\n\nfunction handleDrop(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n event.preventDefault();\n const dragFlat = flatNodes.value.find((n) => n.key === dragNodeKey.value);\n if (!dragFlat) return;\n\n emit('drop', {\n event,\n node,\n dragNode: dragFlat.data,\n dragNodesKeys: [dragFlat.key],\n dropPosition: 0,\n dropToGap: false,\n });\n dragNodeKey.value = null;\n}\n\n// ─── Keyboard navigation ──────────────────────────────────────────────────────\n\nconst treeRef = ref<HTMLElement | null>(null);\n\nconst focusedNodeKey = ref<BTreeNodeKey | null>(visibleNodes.value[0]?.key ?? null);\n\nfunction handleTreeKeydown(event: KeyboardEvent) {\n const visible = visibleNodes.value;\n if (!visible.length) return;\n\n const currentIdx = visible.findIndex((n) => n.key === focusedNodeKey.value);\n const current = visible[currentIdx];\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n const next = visible[currentIdx + 1];\n if (next) {\n focusedNodeKey.value = next.key;\n nextTick(() => focusNode(next.key));\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n const prev = visible[currentIdx - 1];\n if (prev) {\n focusedNodeKey.value = prev.key;\n nextTick(() => focusNode(prev.key));\n }\n break;\n }\n case 'ArrowRight': {\n event.preventDefault();\n if (!current) break;\n if (hasChildren(current.data) && !isExpanded(current.key)) {\n toggleExpand(current.data, event);\n } else if (isExpanded(current.key)) {\n const firstChild = visible[currentIdx + 1];\n if (firstChild?.depth > current.depth) {\n focusedNodeKey.value = firstChild.key;\n nextTick(() => focusNode(firstChild.key));\n }\n }\n break;\n }\n case 'ArrowLeft': {\n event.preventDefault();\n if (!current) break;\n if (isExpanded(current.key)) {\n toggleExpand(current.data, event);\n } else if (current.depth > 0) {\n // Move to parent\n for (let i = currentIdx - 1; i >= 0; i--) {\n if (visible[i].depth < current.depth) {\n focusedNodeKey.value = visible[i].key;\n nextTick(() => focusNode(visible[i].key));\n break;\n }\n }\n }\n break;\n }\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (!current) break;\n if (checkable) {\n handleCheck(current.data, event);\n } else if (selectable) {\n handleSelect(current.data, event);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n if (visible[0]) {\n focusedNodeKey.value = visible[0].key;\n nextTick(() => focusNode(visible[0].key));\n }\n break;\n }\n case 'End': {\n event.preventDefault();\n const last = visible[visible.length - 1];\n if (last) {\n focusedNodeKey.value = last.key;\n nextTick(() => focusNode(last.key));\n }\n break;\n }\n }\n}\n\nfunction focusNode(key: BTreeNodeKey) {\n const el = treeRef.value?.querySelector<HTMLElement>(\n `[data-node-key=\"${String(key).replace(/[\"\\\\]/g, '\\\\$&')}\"]`,\n );\n el?.focus();\n}\n\n// ─── Directory-mode: click/dblclick expand ────────────────────────────────────\n\nfunction handleNodeClick(node: BTreeNodeData, event: MouseEvent) {\n if (directory && expandAction === 'click' && hasChildren(node)) {\n toggleExpand(node, event);\n }\n handleSelect(node, event);\n}\n\nfunction handleNodeDblClick(node: BTreeNodeData, event: MouseEvent) {\n if (directory && expandAction === 'doubleClick' && hasChildren(node)) {\n toggleExpand(node, event);\n }\n emit('dblclick', event, node);\n}\n\n// ─── Scroll to ────────────────────────────────────────────────────────────────\n\nfunction scrollTo(opts: BTreeScrollToOptions) {\n nextTick(() => {\n const el = treeRef.value?.querySelector<HTMLElement>(\n `[data-node-key=\"${String(opts.key).replace(/[\"\\\\]/g, '\\\\$&')}\"]`,\n );\n const alignMap = { top: 'start', bottom: 'end', auto: 'nearest' } as const;\n el?.scrollIntoView?.({ block: alignMap[opts.align ?? 'auto'] });\n });\n}\n\ndefineExpose({ scrollTo });\n\n// ─── Right click ─────────────────────────────────────────────────────────────\n\nfunction handleRightClick(event: MouseEvent, node: BTreeNodeData) {\n event.preventDefault();\n emit('rightClick', { event, node });\n}\n</script>\n\n<template>\n <div\n ref=\"treeRef\"\n class=\"b-tree\"\n :class=\"{\n 'b-tree--checkable': checkable,\n 'b-tree--show-line': showLine,\n 'b-tree--block-node': blockNode,\n 'b-tree--directory': directory,\n 'b-tree--disabled': disabled,\n }\"\n role=\"tree\"\n :aria-multiselectable=\"multiple || undefined\"\n :style=\"height ? { height: `${height}px`, overflowY: 'auto' } : undefined\"\n @keydown=\"handleTreeKeydown\"\n >\n <template v-for=\"flatNode in visibleNodes\" :key=\"flatNode.key\">\n <div\n :data-node-key=\"String(flatNode.key)\"\n class=\"b-tree__node\"\n :class=\"{\n 'b-tree__node--selected': isSelected(flatNode.key),\n 'b-tree__node--checked': isChecked(flatNode.key),\n 'b-tree__node--half-checked': isHalfChecked(flatNode.key),\n 'b-tree__node--expanded': isExpanded(flatNode.key),\n 'b-tree__node--disabled': flatNode.data.disabled || disabled,\n 'b-tree__node--leaf': !hasChildren(flatNode.data),\n 'b-tree__node--loading': isLoading(flatNode.key),\n 'b-tree__node--dragging': draggable && dragNodeKey === flatNode.key,\n 'b-tree__node--filtered': isFiltered(flatNode.data),\n 'b-tree__node--block': blockNode,\n }\"\n role=\"treeitem\"\n :aria-expanded=\"hasChildren(flatNode.data) ? isExpanded(flatNode.key) : undefined\"\n :aria-selected=\"selectable ? isSelected(flatNode.key) : undefined\"\n :aria-checked=\"checkable ? isChecked(flatNode.key) : undefined\"\n :aria-disabled=\"flatNode.data.disabled || disabled || undefined\"\n :aria-level=\"flatNode.depth + 1\"\n :tabindex=\"flatNode.key === focusedNodeKey ? 0 : -1\"\n :style=\"{ '--b-tree-node-indent': `${flatNode.depth * 24}px` }\"\n :draggable=\"draggable ? 'true' : undefined\"\n @click.stop=\"handleNodeClick(flatNode.data, $event)\"\n @dblclick.stop=\"handleNodeDblClick(flatNode.data, $event)\"\n @contextmenu.stop=\"handleRightClick($event, flatNode.data)\"\n @dragstart=\"handleDragStart($event, flatNode.data)\"\n @dragenter=\"handleDragEnter($event, flatNode.data)\"\n @dragover=\"handleDragOver($event, flatNode.data)\"\n @dragleave=\"handleDragLeave($event, flatNode.data)\"\n @dragend=\"handleDragEnd($event, flatNode.data)\"\n @drop=\"handleDrop($event, flatNode.data)\"\n >\n <!-- Drag handle (visible on row hover when draggable) -->\n <span v-if=\"draggable\" class=\"b-tree__drag-handle\" aria-hidden=\"true\">\n <!-- HolderOutlined: 2×3 dot grid -->\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"5\" cy=\"3.5\" r=\"1.25\" />\n <circle cx=\"5\" cy=\"8\" r=\"1.25\" />\n <circle cx=\"5\" cy=\"12.5\" r=\"1.25\" />\n <circle cx=\"11\" cy=\"3.5\" r=\"1.25\" />\n <circle cx=\"11\" cy=\"8\" r=\"1.25\" />\n <circle cx=\"11\" cy=\"12.5\" r=\"1.25\" />\n </svg>\n </span>\n\n <!-- Indent spacer -->\n <span class=\"b-tree__indent\" aria-hidden=\"true\" />\n\n <!-- Switcher (expand/collapse) -->\n <span\n v-if=\"hasChildren(flatNode.data)\"\n class=\"b-tree__switcher\"\n :class=\"{\n 'b-tree__switcher--expanded': isExpanded(flatNode.key),\n 'b-tree__switcher--loading': isLoading(flatNode.key),\n }\"\n aria-hidden=\"true\"\n @click.stop=\"toggleExpand(flatNode.data, $event)\"\n >\n <slot\n v-if=\"!isLoading(flatNode.key)\"\n name=\"switcherIcon\"\n :node=\"flatNode.data\"\n :expanded=\"isExpanded(flatNode.key)\"\n >\n <!-- Default chevron SVG -->\n <svg\n class=\"b-tree__switcher-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M9 18L15 12L9 6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </slot>\n <!-- Loading spinner -->\n <svg\n v-if=\"isLoading(flatNode.key)\"\n class=\"b-tree__switcher-icon b-tree__switcher-icon--spin\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\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 <!-- Leaf placeholder -->\n <span\n v-else-if=\"showLine\"\n class=\"b-tree__switcher b-tree__switcher--leaf\"\n aria-hidden=\"true\"\n />\n\n <!-- Checkbox -->\n <span\n v-if=\"checkable && flatNode.data.checkable !== false\"\n class=\"b-tree__checkbox\"\n :class=\"{\n 'b-tree__checkbox--checked': isChecked(flatNode.key),\n 'b-tree__checkbox--indeterminate': isHalfChecked(flatNode.key),\n 'b-tree__checkbox--disabled':\n flatNode.data.disableCheckbox || flatNode.data.disabled || disabled,\n }\"\n role=\"checkbox\"\n :aria-label=\"nodeTitle(flatNode.data)\"\n :aria-checked=\"isHalfChecked(flatNode.key) ? 'mixed' : isChecked(flatNode.key)\"\n :aria-disabled=\"\n flatNode.data.disableCheckbox || flatNode.data.disabled || disabled || undefined\n \"\n tabindex=\"-1\"\n @click.stop=\"handleCheck(flatNode.data, $event)\"\n @keydown.enter.prevent=\"handleCheck(flatNode.data, $event)\"\n @keydown.space.prevent=\"handleCheck(flatNode.data, $event)\"\n >\n <span class=\"b-tree__checkbox-inner\" aria-hidden=\"true\" />\n </span>\n\n <!-- Icon -->\n <span\n v-if=\"showIcon || flatNode.data.icon || $slots.icon\"\n class=\"b-tree__icon\"\n aria-hidden=\"true\"\n >\n <slot name=\"icon\" :node=\"flatNode.data\">\n <span v-if=\"flatNode.data.icon\">{{ flatNode.data.icon }}</span>\n </slot>\n </span>\n\n <!-- Title -->\n <span\n class=\"b-tree__title\"\n :class=\"{ 'b-tree__title--filtered': isFiltered(flatNode.data) }\"\n >\n <slot name=\"title\" :node=\"flatNode.data\">\n {{ nodeTitle(flatNode.data) }}\n </slot>\n </span>\n </div>\n </template>\n </div>\n</template>\n\n<style scoped>\n/* ─── Root ──────────────────────────────────────────────────────────────────── */\n.b-tree {\n /* Layout */\n --b-tree-indent-size: 24px;\n --b-tree-node-height: 24px;\n --b-tree-switcher-size: 24px;\n --b-tree-checkbox-size: 16px;\n --b-tree-icon-size: 14px;\n --b-tree-gap: 4px;\n --b-tree-border-radius: 6px;\n --b-tree-font-size: 14px;\n\n /* Colors – light mode */\n --b-tree-node-hover-bg: oklch(95% 0.003 264);\n --b-tree-node-hover-color: oklch(20% 0.014 264);\n --b-tree-node-selected-bg: oklch(94% 0.08 254);\n --b-tree-node-selected-color: oklch(20% 0.014 264);\n --b-tree-node-disabled-color: oklch(70% 0.005 264);\n --b-tree-switcher-color: oklch(55% 0.008 264);\n --b-tree-checkbox-border: oklch(75% 0.008 264);\n --b-tree-checkbox-bg: oklch(100% 0 0);\n --b-tree-checkbox-checked-bg: oklch(55% 0.22 260);\n --b-tree-checkbox-checked-border: oklch(55% 0.22 260);\n --b-tree-checkbox-indeterminate-bg: oklch(55% 0.22 260);\n --b-tree-line-color: oklch(88% 0.006 264);\n --b-tree-title-color: oklch(20% 0.014 264);\n --b-tree-title-filtered-color: oklch(55% 0.22 260);\n --b-tree-directory-selected-bg: oklch(55% 0.22 260);\n --b-tree-directory-selected-color: oklch(100% 0 0);\n\n /* Motion */\n --b-tree-transition-duration: 200ms;\n --b-tree-spin-duration: 700ms;\n\n display: block;\n font-size: var(--b-tree-font-size);\n line-height: var(--b-tree-node-height);\n color: var(--b-tree-title-color);\n outline: none;\n}\n\n/* ─── Dark mode ─────────────────────────────────────────────────────────────── */\n[data-prefers-color='dark'] .b-tree {\n --b-tree-node-hover-bg: oklch(28% 0.012 264);\n --b-tree-node-hover-color: oklch(92% 0.006 264);\n --b-tree-node-selected-bg: oklch(30% 0.06 254);\n --b-tree-node-selected-color: oklch(92% 0.006 264);\n --b-tree-node-disabled-color: oklch(45% 0.005 264);\n --b-tree-switcher-color: oklch(65% 0.008 264);\n --b-tree-checkbox-border: oklch(45% 0.008 264);\n --b-tree-checkbox-bg: oklch(22% 0.012 264);\n --b-tree-checkbox-checked-bg: oklch(55% 0.22 260);\n --b-tree-checkbox-checked-border: oklch(55% 0.22 260);\n --b-tree-checkbox-indeterminate-bg: oklch(55% 0.22 260);\n --b-tree-line-color: oklch(35% 0.008 264);\n --b-tree-title-color: oklch(92% 0.006 264);\n --b-tree-title-filtered-color: oklch(65% 0.22 260);\n --b-tree-directory-selected-bg: oklch(45% 0.22 260);\n --b-tree-directory-selected-color: oklch(100% 0 0);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-tree {\n --b-tree-node-hover-bg: oklch(28% 0.012 264);\n --b-tree-node-hover-color: oklch(92% 0.006 264);\n --b-tree-node-selected-bg: oklch(30% 0.06 254);\n --b-tree-node-selected-color: oklch(92% 0.006 264);\n --b-tree-node-disabled-color: oklch(45% 0.005 264);\n --b-tree-switcher-color: oklch(65% 0.008 264);\n --b-tree-checkbox-border: oklch(45% 0.008 264);\n --b-tree-checkbox-bg: oklch(22% 0.012 264);\n --b-tree-checkbox-checked-bg: oklch(55% 0.22 260);\n --b-tree-checkbox-checked-border: oklch(55% 0.22 260);\n --b-tree-checkbox-indeterminate-bg: oklch(55% 0.22 260);\n --b-tree-line-color: oklch(35% 0.008 264);\n --b-tree-title-color: oklch(92% 0.006 264);\n --b-tree-title-filtered-color: oklch(65% 0.22 260);\n --b-tree-directory-selected-bg: oklch(45% 0.22 260);\n --b-tree-directory-selected-color: oklch(100% 0 0);\n }\n}\n\n/* ─── Node ───────────────────────────────────────────────────────────────────── */\n.b-tree__node {\n display: flex;\n align-items: center;\n gap: var(--b-tree-gap);\n height: var(--b-tree-node-height);\n padding-inline-start: var(--b-tree-node-indent);\n border-radius: var(--b-tree-border-radius);\n cursor: pointer;\n outline: none;\n transition:\n background-color var(--b-tree-transition-duration) ease,\n color var(--b-tree-transition-duration) ease;\n user-select: none;\n position: relative;\n}\n\n.b-tree__node:hover {\n background-color: var(--b-tree-node-hover-bg);\n color: var(--b-tree-node-hover-color);\n}\n\n.b-tree__node:focus-visible {\n outline: 2px solid var(--b-tree-checkbox-checked-bg);\n outline-offset: -1px;\n}\n\n.b-tree__node--selected {\n background-color: var(--b-tree-node-selected-bg);\n color: var(--b-tree-node-selected-color);\n font-weight: 500;\n}\n\n.b-tree__node--selected:hover {\n background-color: var(--b-tree-node-selected-bg);\n}\n\n.b-tree__node--disabled {\n cursor: not-allowed;\n color: var(--b-tree-node-disabled-color);\n}\n\n.b-tree__node--disabled:hover {\n background-color: transparent;\n}\n\n.b-tree__node--block {\n padding-inline-end: 8px;\n}\n\n/* ─── Directory mode selected ───────────────────────────────────────────────── */\n.b-tree--directory .b-tree__node--selected {\n background-color: var(--b-tree-directory-selected-bg);\n color: var(--b-tree-directory-selected-color);\n}\n\n.b-tree--directory .b-tree__node--selected:hover {\n background-color: var(--b-tree-directory-selected-bg);\n}\n\n/* ─── Indent ─────────────────────────────────────────────────────────────────── */\n.b-tree__indent {\n display: inline-block;\n flex-shrink: 0;\n}\n\n/* ─── Switcher ───────────────────────────────────────────────────────────────── */\n.b-tree__switcher {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--b-tree-switcher-size);\n height: var(--b-tree-switcher-size);\n color: var(--b-tree-switcher-color);\n transition: color var(--b-tree-transition-duration) ease;\n}\n\n.b-tree__switcher:hover {\n color: var(--b-tree-checkbox-checked-bg);\n}\n\n.b-tree__switcher--leaf {\n pointer-events: none;\n}\n\n.b-tree__switcher-icon {\n width: 12px;\n height: 12px;\n flex-shrink: 0;\n transition: transform var(--b-tree-transition-duration) ease;\n}\n\n.b-tree__switcher--expanded .b-tree__switcher-icon:not(.b-tree__switcher-icon--spin) {\n transform: rotate(90deg);\n}\n\n/* Loading spinner */\n@keyframes b-tree-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.b-tree__switcher-icon--spin {\n animation: b-tree-spin var(--b-tree-spin-duration) linear infinite;\n}\n\n/* ─── Show lines ─────────────────────────────────────────────────────────────── */\n.b-tree--show-line .b-tree__node:not(:last-child)::before {\n content: '';\n position: absolute;\n inset-inline-start: calc(var(--b-tree-node-indent) + var(--b-tree-switcher-size) / 2);\n top: var(--b-tree-node-height);\n width: 1px;\n height: var(--b-tree-node-height);\n background-color: var(--b-tree-line-color);\n pointer-events: none;\n}\n\n/* ─── Checkbox ───────────────────────────────────────────────────────────────── */\n.b-tree__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__checkbox--disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.b-tree__checkbox-inner {\n display: inline-block;\n width: var(--b-tree-checkbox-size);\n height: var(--b-tree-checkbox-size);\n border: 1.5px solid var(--b-tree-checkbox-border);\n border-radius: 3px;\n background-color: var(--b-tree-checkbox-bg);\n position: relative;\n transition:\n border-color var(--b-tree-transition-duration) ease,\n background-color var(--b-tree-transition-duration) ease;\n}\n\n/* Checked tick */\n.b-tree__checkbox--checked .b-tree__checkbox-inner {\n border-color: var(--b-tree-checkbox-checked-border);\n background-color: var(--b-tree-checkbox-checked-bg);\n}\n\n.b-tree__checkbox--checked .b-tree__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/* Indeterminate dash */\n.b-tree__checkbox--indeterminate .b-tree__checkbox-inner {\n border-color: var(--b-tree-checkbox-indeterminate-bg);\n background-color: var(--b-tree-checkbox-indeterminate-bg);\n}\n\n.b-tree__checkbox--indeterminate .b-tree__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/* ─── Icon ───────────────────────────────────────────────────────────────────── */\n.b-tree__icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n font-size: var(--b-tree-icon-size);\n}\n\n/* ─── Title ──────────────────────────────────────────────────────────────────── */\n.b-tree__title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: inherit;\n}\n\n.b-tree__title--filtered {\n color: var(--b-tree-title-filtered-color);\n font-weight: 500;\n}\n\n/* ─── Drag handle ─────────────────────────────────────────────────────────── */\n.b-tree__drag-handle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 12px;\n height: var(--b-tree-node-height);\n color: var(--b-tree-switcher-color);\n cursor: grab;\n}\n\n.b-tree__drag-handle svg {\n width: 12px;\n height: 12px;\n display: block;\n}\n\n.b-tree__drag-handle:active {\n cursor: grabbing;\n}\n\n/* ─── Dragging node ──────────────────────────────────────────────────────────── */\n.b-tree__node--dragging {\n opacity: 0.5;\n}\n\n/* ─── Reduced motion ─────────────────────────────────────────────────────────── */\n@media (prefers-reduced-motion: reduce) {\n .b-tree {\n --b-tree-transition-duration: 0ms;\n --b-tree-spin-duration: 0ms;\n }\n\n .b-tree__switcher-icon {\n transition: 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-system270.js";
3
+ /* empty css */
4
+ //#region src/components/BTree/BTree.vue
5
+ var n = /* @__PURE__ */ e(t, [["__scopeId", "data-v-08bb45f2"]]);
6
+ //#endregion
7
+ export { n as default };
8
+
9
+ //# sourceMappingURL=design-system272.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-system272.js","names":[],"sources":["../src/components/BTree/BTree.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch } from 'vue';\nimport type {\n BTreeCheckedKeys,\n BTreeCheckInfo,\n BTreeDragInfo,\n BTreeDropInfo,\n BTreeExpandInfo,\n BTreeFieldNames,\n BTreeFlatNode,\n BTreeNodeData,\n BTreeNodeKey,\n BTreeScrollToOptions,\n BTreeSelectInfo,\n} from './types';\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nconst {\n treeData = [],\n fieldNames = {},\n checkable = false,\n checkStrictly = false,\n checkedKeys: checkedKeysProp = undefined,\n defaultCheckedKeys = [],\n selectedKeys: selectedKeysProp = undefined,\n defaultSelectedKeys = [],\n expandedKeys: expandedKeysProp = undefined,\n defaultExpandedKeys = [],\n defaultExpandAll = false,\n defaultExpandParent = true,\n autoExpandParent = false,\n multiple = false,\n selectable = true,\n disabled = false,\n showIcon = false,\n showLine = false,\n blockNode = false,\n draggable = false,\n loadData = undefined,\n loadedKeys: loadedKeysProp = undefined,\n filterTreeNode = undefined,\n height = undefined,\n virtual: _virtual = false,\n directory = false,\n expandAction = 'click',\n} = defineProps<{\n /** Tree node data array */\n treeData?: BTreeNodeData[];\n /** Custom field name mappings (key/title/children) */\n fieldNames?: BTreeFieldNames;\n /** Whether to show checkboxes */\n checkable?: boolean;\n /** Check parent/child independently */\n checkStrictly?: boolean;\n /** Controlled checked node keys */\n checkedKeys?: BTreeNodeKey[] | BTreeCheckedKeys;\n /** Default checked node keys (uncontrolled) */\n defaultCheckedKeys?: BTreeNodeKey[];\n /** Controlled selected node keys */\n selectedKeys?: BTreeNodeKey[];\n /** Default selected node keys (uncontrolled) */\n defaultSelectedKeys?: BTreeNodeKey[];\n /** Controlled expanded node keys */\n expandedKeys?: BTreeNodeKey[];\n /** Default expanded node keys (uncontrolled) */\n defaultExpandedKeys?: BTreeNodeKey[];\n /** Expand all nodes on mount */\n defaultExpandAll?: boolean;\n /** Auto expand parent of defaultExpandedKeys nodes */\n defaultExpandParent?: boolean;\n /** Auto expand parent when expandedKeys changes */\n autoExpandParent?: boolean;\n /** Allow multiple selection */\n multiple?: boolean;\n /** Allow node selection */\n selectable?: boolean;\n /** Disable entire tree */\n disabled?: boolean;\n /** Show node icons */\n showIcon?: boolean;\n /** Show connector lines */\n showLine?: boolean;\n /** Node takes full row width */\n blockNode?: boolean;\n /** Enable drag-and-drop */\n draggable?: boolean;\n /** Async load children */\n loadData?: (node: BTreeNodeData) => Promise<void>;\n /** Controlled loaded node keys */\n loadedKeys?: BTreeNodeKey[];\n /** Predicate to highlight nodes */\n filterTreeNode?: (node: BTreeNodeData) => boolean;\n /** Fixed height for virtual scroll (px) */\n height?: number;\n /** Enable virtual scroll (requires height) */\n virtual?: boolean;\n /** Enable DirectoryTree mode */\n directory?: boolean;\n /** DirectoryTree: expansion trigger (click | doubleClick | false) */\n expandAction?: 'click' | 'doubleClick' | false;\n}>();\n\n// ─── Emits ────────────────────────────────────────────────────────────────────\n\nconst emit = defineEmits<{\n /** Fires when check state changes */\n check: [keys: BTreeNodeKey[] | BTreeCheckedKeys, info: BTreeCheckInfo];\n /** Fires when expand state changes */\n expand: [keys: BTreeNodeKey[], info: BTreeExpandInfo];\n /** Fires when selection changes */\n select: [keys: BTreeNodeKey[], info: BTreeSelectInfo];\n /** Fires when async load finishes */\n load: [keys: BTreeNodeKey[], info: { event: Event; node: BTreeNodeData }];\n /** Fires on right-click */\n rightClick: [info: { event: MouseEvent; node: BTreeNodeData }];\n /** Fires on drag start */\n dragStart: [info: BTreeDragInfo];\n /** Fires when dragged over a node */\n dragEnter: [info: { event: DragEvent; node: BTreeNodeData; expandedKeys: BTreeNodeKey[] }];\n /** Fires while dragging over a node */\n dragOver: [info: BTreeDragInfo];\n /** Fires when leaving a node during drag */\n dragLeave: [info: BTreeDragInfo];\n /** Fires when drag ends */\n dragEnd: [info: BTreeDragInfo];\n /** Fires on drop */\n drop: [info: BTreeDropInfo];\n /** Fires on double-click */\n dblclick: [event: MouseEvent, node: BTreeNodeData];\n /** v-model:checkedKeys */\n 'update:checkedKeys': [keys: BTreeNodeKey[] | BTreeCheckedKeys];\n /** v-model:selectedKeys */\n 'update:selectedKeys': [keys: BTreeNodeKey[]];\n /** v-model:expandedKeys */\n 'update:expandedKeys': [keys: BTreeNodeKey[]];\n /** v-model:loadedKeys */\n 'update:loadedKeys': [keys: BTreeNodeKey[]];\n}>();\n\n// ─── Slots ────────────────────────────────────────────────────────────────────\n\ndefineSlots<{\n /** Default icon for all nodes */\n icon(props: { node: BTreeNodeData }): unknown;\n /** Custom switcher icon */\n switcherIcon(props: { node: BTreeNodeData; expanded: boolean }): unknown;\n /** Custom title renderer */\n title(props: { node: BTreeNodeData }): unknown;\n}>();\n\n// ─── Resolved field names ─────────────────────────────────────────────────────\n\nconst fKey = computed(() => fieldNames.key ?? 'key');\nconst fTitle = computed(() => fieldNames.title ?? 'title');\nconst fChildren = computed(() => fieldNames.children ?? 'children');\n\nfunction nodeKey(n: BTreeNodeData): BTreeNodeKey {\n return n[fKey.value] as BTreeNodeKey;\n}\nfunction nodeTitle(n: BTreeNodeData): string {\n return (n[fTitle.value] as string) ?? '';\n}\nfunction nodeChildren(n: BTreeNodeData): BTreeNodeData[] | undefined {\n return n[fChildren.value] as BTreeNodeData[] | undefined;\n}\n\n// ─── Internal state ───────────────────────────────────────────────────────────\n\nconst internalExpanded = ref<Set<BTreeNodeKey>>(new Set());\nconst internalSelected = ref<Set<BTreeNodeKey>>(new Set());\nconst internalChecked = ref<Set<BTreeNodeKey>>(new Set());\nconst internalHalfChecked = ref<Set<BTreeNodeKey>>(new Set());\nconst internalLoaded = ref<Set<BTreeNodeKey>>(new Set());\nconst loadingKeys = ref<Set<BTreeNodeKey>>(new Set());\nconst dragNodeKey = ref<BTreeNodeKey | null>(null);\n\n// Controlled getters\nconst isControlledExpanded = computed(() => expandedKeysProp !== undefined);\nconst isControlledSelected = computed(() => selectedKeysProp !== undefined);\nconst isControlledChecked = computed(() => checkedKeysProp !== undefined);\nconst isControlledLoaded = computed(() => loadedKeysProp !== undefined);\n\nconst activeExpanded = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledExpanded.value) return new Set(expandedKeysProp);\n return internalExpanded.value;\n});\n\nconst activeSelected = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledSelected.value) return new Set(selectedKeysProp);\n return internalSelected.value;\n});\n\nconst activeChecked = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledChecked.value) {\n const raw = checkedKeysProp as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n if (Array.isArray(raw)) return new Set(raw);\n return new Set(raw.checked);\n }\n return internalChecked.value;\n});\n\nconst activeHalfChecked = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledChecked.value) {\n const raw = checkedKeysProp as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n if (!Array.isArray(raw) && 'halfChecked' in raw) return new Set(raw.halfChecked);\n }\n return internalHalfChecked.value;\n});\n\nconst activeLoaded = computed<Set<BTreeNodeKey>>(() => {\n if (isControlledLoaded.value) return new Set(loadedKeysProp);\n return internalLoaded.value;\n});\n\n// ─── Flatten tree ─────────────────────────────────────────────────────────────\n\nfunction flattenTree(nodes: BTreeNodeData[], depth = 0, parentVisible = true): BTreeFlatNode[] {\n const result: BTreeFlatNode[] = [];\n for (const node of nodes) {\n const key = nodeKey(node);\n const isExpanded = activeExpanded.value.has(key);\n const visible = parentVisible;\n result.push({ key, data: node, depth, visible });\n const children = nodeChildren(node);\n if (children?.length) {\n result.push(...flattenTree(children, depth + 1, visible && isExpanded));\n }\n }\n return result;\n}\n\nconst flatNodes = computed(() => flattenTree(treeData));\nconst visibleNodes = computed(() => flatNodes.value.filter((n) => n.visible));\n\n// ─── Mount: apply defaults ────────────────────────────────────────────────────\n\nfunction collectAllKeys(nodes: BTreeNodeData[]): BTreeNodeKey[] {\n const keys: BTreeNodeKey[] = [];\n for (const n of nodes) {\n keys.push(nodeKey(n));\n const children = nodeChildren(n);\n if (children?.length) keys.push(...collectAllKeys(children));\n }\n return keys;\n}\n\nfunction collectParentKeys(nodes: BTreeNodeData[], targetKeys: Set<BTreeNodeKey>): BTreeNodeKey[] {\n const parents: BTreeNodeKey[] = [];\n function walk(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n const children = nodeChildren(n);\n if (children?.length) {\n const hasDescendant = children.some(\n (c) => targetKeys.has(nodeKey(c)) || walk([c]) !== undefined,\n );\n if (hasDescendant) parents.push(nodeKey(n));\n walk(children);\n }\n }\n }\n walk(nodes);\n return parents;\n}\n\n// Initialise uncontrolled state once\nif (!isControlledExpanded.value) {\n if (defaultExpandAll) {\n internalExpanded.value = new Set(\n collectAllKeys(treeData).filter((k) => {\n const flat = flatNodes.value.find((n) => n.key === k);\n return flat ? !!nodeChildren(flat.data)?.length : false;\n }),\n );\n } else if (defaultExpandedKeys.length) {\n const init = new Set<BTreeNodeKey>(defaultExpandedKeys);\n if (defaultExpandParent) {\n collectParentKeys(treeData, init).forEach((k) => init.add(k));\n }\n internalExpanded.value = init;\n }\n}\nif (!isControlledSelected.value && defaultSelectedKeys.length) {\n internalSelected.value = new Set(defaultSelectedKeys);\n}\nif (!isControlledChecked.value && defaultCheckedKeys.length) {\n internalChecked.value = new Set(defaultCheckedKeys);\n if (!checkStrictly) propagateChecks(internalChecked.value);\n}\n\n// Auto-expand parents when controlled expandedKeys change\nwatch(\n () => expandedKeysProp,\n (keys) => {\n if (!autoExpandParent || !keys) return;\n const set = new Set(keys);\n collectParentKeys(treeData, set).forEach((k) => set.add(k));\n emit('update:expandedKeys', [...set]);\n },\n);\n\n// ─── Checkbox propagation ─────────────────────────────────────────────────────\n\nfunction propagateChecks(checked: Set<BTreeNodeKey>) {\n // Bottom-up: compute half-checked from actual checked leaves\n const half = new Set<BTreeNodeKey>();\n function walk(nodes: BTreeNodeData[]): { all: boolean; some: boolean } {\n let allChecked = true;\n let someChecked = false;\n for (const n of nodes) {\n const key = nodeKey(n);\n const children = nodeChildren(n);\n if (children?.length) {\n const sub = walk(children);\n if (sub.all) {\n checked.add(key);\n someChecked = true;\n } else if (sub.some) {\n checked.delete(key);\n half.add(key);\n allChecked = false;\n someChecked = true;\n } else {\n if (!checked.has(key)) allChecked = false;\n else someChecked = true;\n }\n } else {\n if (!checked.has(key)) allChecked = false;\n else someChecked = true;\n }\n }\n return { all: allChecked, some: someChecked };\n }\n walk(treeData);\n internalHalfChecked.value = half;\n}\n\n// ─── Node helpers ─────────────────────────────────────────────────────────────\n\nfunction hasChildren(node: BTreeNodeData): boolean {\n const ch = nodeChildren(node);\n return !!ch?.length || (!!loadData && !node.isLeaf);\n}\n\nfunction isExpanded(key: BTreeNodeKey): boolean {\n return activeExpanded.value.has(key);\n}\nfunction isSelected(key: BTreeNodeKey): boolean {\n return activeSelected.value.has(key);\n}\nfunction isChecked(key: BTreeNodeKey): boolean {\n return activeChecked.value.has(key);\n}\nfunction isHalfChecked(key: BTreeNodeKey): boolean {\n return activeHalfChecked.value.has(key);\n}\nfunction isLoading(key: BTreeNodeKey): boolean {\n return loadingKeys.value.has(key);\n}\nfunction isLoaded(key: BTreeNodeKey): boolean {\n return activeLoaded.value.has(key);\n}\nfunction isFiltered(node: BTreeNodeData): boolean {\n return filterTreeNode ? filterTreeNode(node) : false;\n}\n\n// ─── Expand / collapse ────────────────────────────────────────────────────────\n\nasync function toggleExpand(node: BTreeNodeData, event?: MouseEvent | KeyboardEvent) {\n const key = nodeKey(node);\n if (node.disabled || disabled) return;\n\n const expanding = !isExpanded(key);\n\n // Async load\n if (expanding && loadData && !isLoaded(key) && !isLoading(key)) {\n loadingKeys.value.add(key);\n try {\n await loadData(node);\n if (!isControlledLoaded.value) internalLoaded.value.add(key);\n emit('update:loadedKeys', [...activeLoaded.value, key]);\n } finally {\n loadingKeys.value.delete(key);\n }\n }\n\n let nextSet: Set<BTreeNodeKey>;\n if (isControlledExpanded.value) {\n nextSet = new Set(expandedKeysProp);\n } else {\n nextSet = new Set(internalExpanded.value);\n }\n\n if (expanding) nextSet.add(key);\n else nextSet.delete(key);\n\n if (!isControlledExpanded.value) internalExpanded.value = nextSet;\n emit('update:expandedKeys', [...nextSet]);\n\n const info: BTreeExpandInfo = { expanded: expanding, node, event };\n emit('expand', [...nextSet], info);\n}\n\n// ─── Select ───────────────────────────────────────────────────────────────────\n\nfunction handleSelect(node: BTreeNodeData, event: MouseEvent | KeyboardEvent) {\n if (!selectable || node.selectable === false || node.disabled || disabled) return;\n const key = nodeKey(node);\n\n let nextSet: Set<BTreeNodeKey>;\n if (isControlledSelected.value) {\n nextSet = new Set(selectedKeysProp);\n } else {\n nextSet = new Set(internalSelected.value);\n }\n\n if (nextSet.has(key)) {\n nextSet.delete(key);\n } else {\n if (!multiple) nextSet.clear();\n nextSet.add(key);\n }\n\n if (!isControlledSelected.value) internalSelected.value = nextSet;\n emit('update:selectedKeys', [...nextSet]);\n\n const info: BTreeSelectInfo = {\n event,\n selected: nextSet.has(key),\n node,\n selectedNodes: flatNodes.value.filter((n) => nextSet.has(n.key)).map((n) => n.data),\n nativeEvent: event,\n };\n emit('select', [...nextSet], info);\n}\n\n// ─── Check ────────────────────────────────────────────────────────────────────\n\nfunction handleCheck(node: BTreeNodeData, event: MouseEvent | KeyboardEvent) {\n if (!checkable || node.disableCheckbox || node.disabled || disabled) return;\n const key = nodeKey(node);\n\n let nextChecked: Set<BTreeNodeKey>;\n if (isControlledChecked.value) {\n const raw = checkedKeysProp as\n | BTreeNodeKey[]\n | { checked: BTreeNodeKey[]; halfChecked: BTreeNodeKey[] };\n nextChecked = new Set(Array.isArray(raw) ? raw : raw.checked);\n } else {\n nextChecked = new Set(internalChecked.value);\n }\n\n if (nextChecked.has(key)) {\n nextChecked.delete(key);\n // Uncheck all descendants\n if (!checkStrictly) {\n function uncheckDesc(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n nextChecked.delete(nodeKey(n));\n const ch = nodeChildren(n);\n if (ch?.length) uncheckDesc(ch);\n }\n }\n const children = nodeChildren(node);\n if (children?.length) uncheckDesc(children);\n }\n } else {\n nextChecked.add(key);\n // Check all descendants\n if (!checkStrictly) {\n function checkDesc(nodes: BTreeNodeData[]) {\n for (const n of nodes) {\n if (!n.disableCheckbox && !n.disabled) nextChecked.add(nodeKey(n));\n const ch = nodeChildren(n);\n if (ch?.length) checkDesc(ch);\n }\n }\n const children = nodeChildren(node);\n if (children?.length) checkDesc(children);\n }\n }\n\n if (!checkStrictly && !isControlledChecked.value) {\n propagateChecks(nextChecked);\n }\n\n const checkedNodes = flatNodes.value.filter((n) => nextChecked.has(n.key)).map((n) => n.data);\n\n const info: BTreeCheckInfo = {\n event,\n node,\n checked: nextChecked.has(key),\n checkedNodes,\n checkedNodesPositions: checkedNodes.map((n) => ({ node: n, pos: '0' })),\n halfCheckedKeys: [...activeHalfChecked.value],\n nativeEvent: event,\n };\n\n if (!isControlledChecked.value) internalChecked.value = nextChecked;\n\n const emitValue: BTreeNodeKey[] | BTreeCheckedKeys = checkStrictly\n ? { checked: [...nextChecked], halfChecked: [...activeHalfChecked.value] }\n : [...nextChecked];\n\n emit('update:checkedKeys', emitValue);\n emit('check', emitValue, info);\n}\n\n// ─── Drag & Drop ──────────────────────────────────────────────────────────────\n\nfunction handleDragStart(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n dragNodeKey.value = nodeKey(node);\n event.dataTransfer?.setData('text/plain', String(nodeKey(node)));\n emit('dragStart', { event, node });\n}\n\nfunction handleDragEnter(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n event.preventDefault();\n emit('dragEnter', { event, node, expandedKeys: [...activeExpanded.value] });\n}\n\nfunction handleDragOver(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n event.preventDefault();\n emit('dragOver', { event, node });\n}\n\nfunction handleDragLeave(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n emit('dragLeave', { event, node });\n}\n\nfunction handleDragEnd(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n dragNodeKey.value = null;\n emit('dragEnd', { event, node });\n}\n\nfunction handleDrop(event: DragEvent, node: BTreeNodeData) {\n if (!draggable) return;\n event.preventDefault();\n const dragFlat = flatNodes.value.find((n) => n.key === dragNodeKey.value);\n if (!dragFlat) return;\n\n emit('drop', {\n event,\n node,\n dragNode: dragFlat.data,\n dragNodesKeys: [dragFlat.key],\n dropPosition: 0,\n dropToGap: false,\n });\n dragNodeKey.value = null;\n}\n\n// ─── Keyboard navigation ──────────────────────────────────────────────────────\n\nconst treeRef = ref<HTMLElement | null>(null);\n\nconst focusedNodeKey = ref<BTreeNodeKey | null>(visibleNodes.value[0]?.key ?? null);\n\nfunction handleTreeKeydown(event: KeyboardEvent) {\n const visible = visibleNodes.value;\n if (!visible.length) return;\n\n const currentIdx = visible.findIndex((n) => n.key === focusedNodeKey.value);\n const current = visible[currentIdx];\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n const next = visible[currentIdx + 1];\n if (next) {\n focusedNodeKey.value = next.key;\n nextTick(() => focusNode(next.key));\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n const prev = visible[currentIdx - 1];\n if (prev) {\n focusedNodeKey.value = prev.key;\n nextTick(() => focusNode(prev.key));\n }\n break;\n }\n case 'ArrowRight': {\n event.preventDefault();\n if (!current) break;\n if (hasChildren(current.data) && !isExpanded(current.key)) {\n toggleExpand(current.data, event);\n } else if (isExpanded(current.key)) {\n const firstChild = visible[currentIdx + 1];\n if (firstChild?.depth > current.depth) {\n focusedNodeKey.value = firstChild.key;\n nextTick(() => focusNode(firstChild.key));\n }\n }\n break;\n }\n case 'ArrowLeft': {\n event.preventDefault();\n if (!current) break;\n if (isExpanded(current.key)) {\n toggleExpand(current.data, event);\n } else if (current.depth > 0) {\n // Move to parent\n for (let i = currentIdx - 1; i >= 0; i--) {\n if (visible[i].depth < current.depth) {\n focusedNodeKey.value = visible[i].key;\n nextTick(() => focusNode(visible[i].key));\n break;\n }\n }\n }\n break;\n }\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (!current) break;\n if (checkable) {\n handleCheck(current.data, event);\n } else if (selectable) {\n handleSelect(current.data, event);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n if (visible[0]) {\n focusedNodeKey.value = visible[0].key;\n nextTick(() => focusNode(visible[0].key));\n }\n break;\n }\n case 'End': {\n event.preventDefault();\n const last = visible[visible.length - 1];\n if (last) {\n focusedNodeKey.value = last.key;\n nextTick(() => focusNode(last.key));\n }\n break;\n }\n }\n}\n\nfunction focusNode(key: BTreeNodeKey) {\n const el = treeRef.value?.querySelector<HTMLElement>(\n `[data-node-key=\"${String(key).replace(/[\"\\\\]/g, '\\\\$&')}\"]`,\n );\n el?.focus();\n}\n\n// ─── Directory-mode: click/dblclick expand ────────────────────────────────────\n\nfunction handleNodeClick(node: BTreeNodeData, event: MouseEvent) {\n if (directory && expandAction === 'click' && hasChildren(node)) {\n toggleExpand(node, event);\n }\n handleSelect(node, event);\n}\n\nfunction handleNodeDblClick(node: BTreeNodeData, event: MouseEvent) {\n if (directory && expandAction === 'doubleClick' && hasChildren(node)) {\n toggleExpand(node, event);\n }\n emit('dblclick', event, node);\n}\n\n// ─── Scroll to ────────────────────────────────────────────────────────────────\n\nfunction scrollTo(opts: BTreeScrollToOptions) {\n nextTick(() => {\n const el = treeRef.value?.querySelector<HTMLElement>(\n `[data-node-key=\"${String(opts.key).replace(/[\"\\\\]/g, '\\\\$&')}\"]`,\n );\n const alignMap = { top: 'start', bottom: 'end', auto: 'nearest' } as const;\n el?.scrollIntoView?.({ block: alignMap[opts.align ?? 'auto'] });\n });\n}\n\ndefineExpose({ scrollTo });\n\n// ─── Right click ─────────────────────────────────────────────────────────────\n\nfunction handleRightClick(event: MouseEvent, node: BTreeNodeData) {\n event.preventDefault();\n emit('rightClick', { event, node });\n}\n</script>\n\n<template>\n <div\n ref=\"treeRef\"\n class=\"b-tree\"\n :class=\"{\n 'b-tree--checkable': checkable,\n 'b-tree--show-line': showLine,\n 'b-tree--block-node': blockNode,\n 'b-tree--directory': directory,\n 'b-tree--disabled': disabled,\n }\"\n role=\"tree\"\n :aria-multiselectable=\"multiple || undefined\"\n :style=\"height ? { height: `${height}px`, overflowY: 'auto' } : undefined\"\n @keydown=\"handleTreeKeydown\"\n >\n <template v-for=\"flatNode in visibleNodes\" :key=\"flatNode.key\">\n <div\n :data-node-key=\"String(flatNode.key)\"\n class=\"b-tree__node\"\n :class=\"{\n 'b-tree__node--selected': isSelected(flatNode.key),\n 'b-tree__node--checked': isChecked(flatNode.key),\n 'b-tree__node--half-checked': isHalfChecked(flatNode.key),\n 'b-tree__node--expanded': isExpanded(flatNode.key),\n 'b-tree__node--disabled': flatNode.data.disabled || disabled,\n 'b-tree__node--leaf': !hasChildren(flatNode.data),\n 'b-tree__node--loading': isLoading(flatNode.key),\n 'b-tree__node--dragging': draggable && dragNodeKey === flatNode.key,\n 'b-tree__node--filtered': isFiltered(flatNode.data),\n 'b-tree__node--block': blockNode,\n }\"\n role=\"treeitem\"\n :aria-expanded=\"hasChildren(flatNode.data) ? isExpanded(flatNode.key) : undefined\"\n :aria-selected=\"selectable ? isSelected(flatNode.key) : undefined\"\n :aria-checked=\"checkable ? isChecked(flatNode.key) : undefined\"\n :aria-disabled=\"flatNode.data.disabled || disabled || undefined\"\n :aria-level=\"flatNode.depth + 1\"\n :tabindex=\"flatNode.key === focusedNodeKey ? 0 : -1\"\n :style=\"{ '--b-tree-node-indent': `${flatNode.depth * 24}px` }\"\n :draggable=\"draggable ? 'true' : undefined\"\n @click.stop=\"handleNodeClick(flatNode.data, $event)\"\n @dblclick.stop=\"handleNodeDblClick(flatNode.data, $event)\"\n @contextmenu.stop=\"handleRightClick($event, flatNode.data)\"\n @dragstart=\"handleDragStart($event, flatNode.data)\"\n @dragenter=\"handleDragEnter($event, flatNode.data)\"\n @dragover=\"handleDragOver($event, flatNode.data)\"\n @dragleave=\"handleDragLeave($event, flatNode.data)\"\n @dragend=\"handleDragEnd($event, flatNode.data)\"\n @drop=\"handleDrop($event, flatNode.data)\"\n >\n <!-- Drag handle (visible on row hover when draggable) -->\n <span v-if=\"draggable\" class=\"b-tree__drag-handle\" aria-hidden=\"true\">\n <!-- HolderOutlined: 2×3 dot grid -->\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"5\" cy=\"3.5\" r=\"1.25\" />\n <circle cx=\"5\" cy=\"8\" r=\"1.25\" />\n <circle cx=\"5\" cy=\"12.5\" r=\"1.25\" />\n <circle cx=\"11\" cy=\"3.5\" r=\"1.25\" />\n <circle cx=\"11\" cy=\"8\" r=\"1.25\" />\n <circle cx=\"11\" cy=\"12.5\" r=\"1.25\" />\n </svg>\n </span>\n\n <!-- Indent spacer -->\n <span class=\"b-tree__indent\" aria-hidden=\"true\" />\n\n <!-- Switcher (expand/collapse) -->\n <span\n v-if=\"hasChildren(flatNode.data)\"\n class=\"b-tree__switcher\"\n :class=\"{\n 'b-tree__switcher--expanded': isExpanded(flatNode.key),\n 'b-tree__switcher--loading': isLoading(flatNode.key),\n }\"\n aria-hidden=\"true\"\n @click.stop=\"toggleExpand(flatNode.data, $event)\"\n >\n <slot\n v-if=\"!isLoading(flatNode.key)\"\n name=\"switcherIcon\"\n :node=\"flatNode.data\"\n :expanded=\"isExpanded(flatNode.key)\"\n >\n <!-- Default chevron SVG -->\n <svg\n class=\"b-tree__switcher-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M9 18L15 12L9 6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </slot>\n <!-- Loading spinner -->\n <svg\n v-if=\"isLoading(flatNode.key)\"\n class=\"b-tree__switcher-icon b-tree__switcher-icon--spin\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\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 <!-- Leaf placeholder -->\n <span\n v-else-if=\"showLine\"\n class=\"b-tree__switcher b-tree__switcher--leaf\"\n aria-hidden=\"true\"\n />\n\n <!-- Checkbox -->\n <span\n v-if=\"checkable && flatNode.data.checkable !== false\"\n class=\"b-tree__checkbox\"\n :class=\"{\n 'b-tree__checkbox--checked': isChecked(flatNode.key),\n 'b-tree__checkbox--indeterminate': isHalfChecked(flatNode.key),\n 'b-tree__checkbox--disabled':\n flatNode.data.disableCheckbox || flatNode.data.disabled || disabled,\n }\"\n role=\"checkbox\"\n :aria-label=\"nodeTitle(flatNode.data)\"\n :aria-checked=\"isHalfChecked(flatNode.key) ? 'mixed' : isChecked(flatNode.key)\"\n :aria-disabled=\"\n flatNode.data.disableCheckbox || flatNode.data.disabled || disabled || undefined\n \"\n tabindex=\"-1\"\n @click.stop=\"handleCheck(flatNode.data, $event)\"\n @keydown.enter.prevent=\"handleCheck(flatNode.data, $event)\"\n @keydown.space.prevent=\"handleCheck(flatNode.data, $event)\"\n >\n <span class=\"b-tree__checkbox-inner\" aria-hidden=\"true\" />\n </span>\n\n <!-- Icon -->\n <span\n v-if=\"showIcon || flatNode.data.icon || $slots.icon\"\n class=\"b-tree__icon\"\n aria-hidden=\"true\"\n >\n <slot name=\"icon\" :node=\"flatNode.data\">\n <span v-if=\"flatNode.data.icon\">{{ flatNode.data.icon }}</span>\n </slot>\n </span>\n\n <!-- Title -->\n <span\n class=\"b-tree__title\"\n :class=\"{ 'b-tree__title--filtered': isFiltered(flatNode.data) }\"\n >\n <slot name=\"title\" :node=\"flatNode.data\">\n {{ nodeTitle(flatNode.data) }}\n </slot>\n </span>\n </div>\n </template>\n </div>\n</template>\n\n<style scoped>\n/* ─── Root ──────────────────────────────────────────────────────────────────── */\n.b-tree {\n /* Layout */\n --b-tree-indent-size: 24px;\n --b-tree-node-height: 24px;\n --b-tree-switcher-size: 24px;\n --b-tree-checkbox-size: 16px;\n --b-tree-icon-size: 14px;\n --b-tree-gap: 4px;\n --b-tree-border-radius: 6px;\n --b-tree-font-size: 14px;\n\n /* Colors – light mode */\n --b-tree-node-hover-bg: oklch(95% 0.003 264);\n --b-tree-node-hover-color: oklch(20% 0.014 264);\n --b-tree-node-selected-bg: oklch(94% 0.08 254);\n --b-tree-node-selected-color: oklch(20% 0.014 264);\n --b-tree-node-disabled-color: oklch(70% 0.005 264);\n --b-tree-switcher-color: oklch(55% 0.008 264);\n --b-tree-checkbox-border: oklch(75% 0.008 264);\n --b-tree-checkbox-bg: oklch(100% 0 0);\n --b-tree-checkbox-checked-bg: oklch(55% 0.22 260);\n --b-tree-checkbox-checked-border: oklch(55% 0.22 260);\n --b-tree-checkbox-indeterminate-bg: oklch(55% 0.22 260);\n --b-tree-line-color: oklch(88% 0.006 264);\n --b-tree-title-color: oklch(20% 0.014 264);\n --b-tree-title-filtered-color: oklch(55% 0.22 260);\n --b-tree-directory-selected-bg: oklch(55% 0.22 260);\n --b-tree-directory-selected-color: oklch(100% 0 0);\n\n /* Motion */\n --b-tree-transition-duration: 200ms;\n --b-tree-spin-duration: 700ms;\n\n display: block;\n font-size: var(--b-tree-font-size);\n line-height: var(--b-tree-node-height);\n color: var(--b-tree-title-color);\n outline: none;\n}\n\n/* ─── Dark mode ─────────────────────────────────────────────────────────────── */\n[data-prefers-color='dark'] .b-tree {\n --b-tree-node-hover-bg: oklch(28% 0.012 264);\n --b-tree-node-hover-color: oklch(92% 0.006 264);\n --b-tree-node-selected-bg: oklch(30% 0.06 254);\n --b-tree-node-selected-color: oklch(92% 0.006 264);\n --b-tree-node-disabled-color: oklch(45% 0.005 264);\n --b-tree-switcher-color: oklch(65% 0.008 264);\n --b-tree-checkbox-border: oklch(45% 0.008 264);\n --b-tree-checkbox-bg: oklch(22% 0.012 264);\n --b-tree-checkbox-checked-bg: oklch(55% 0.22 260);\n --b-tree-checkbox-checked-border: oklch(55% 0.22 260);\n --b-tree-checkbox-indeterminate-bg: oklch(55% 0.22 260);\n --b-tree-line-color: oklch(35% 0.008 264);\n --b-tree-title-color: oklch(92% 0.006 264);\n --b-tree-title-filtered-color: oklch(65% 0.22 260);\n --b-tree-directory-selected-bg: oklch(45% 0.22 260);\n --b-tree-directory-selected-color: oklch(100% 0 0);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-tree {\n --b-tree-node-hover-bg: oklch(28% 0.012 264);\n --b-tree-node-hover-color: oklch(92% 0.006 264);\n --b-tree-node-selected-bg: oklch(30% 0.06 254);\n --b-tree-node-selected-color: oklch(92% 0.006 264);\n --b-tree-node-disabled-color: oklch(45% 0.005 264);\n --b-tree-switcher-color: oklch(65% 0.008 264);\n --b-tree-checkbox-border: oklch(45% 0.008 264);\n --b-tree-checkbox-bg: oklch(22% 0.012 264);\n --b-tree-checkbox-checked-bg: oklch(55% 0.22 260);\n --b-tree-checkbox-checked-border: oklch(55% 0.22 260);\n --b-tree-checkbox-indeterminate-bg: oklch(55% 0.22 260);\n --b-tree-line-color: oklch(35% 0.008 264);\n --b-tree-title-color: oklch(92% 0.006 264);\n --b-tree-title-filtered-color: oklch(65% 0.22 260);\n --b-tree-directory-selected-bg: oklch(45% 0.22 260);\n --b-tree-directory-selected-color: oklch(100% 0 0);\n }\n}\n\n/* ─── Node ───────────────────────────────────────────────────────────────────── */\n.b-tree__node {\n display: flex;\n align-items: center;\n gap: var(--b-tree-gap);\n height: var(--b-tree-node-height);\n padding-inline-start: var(--b-tree-node-indent);\n border-radius: var(--b-tree-border-radius);\n cursor: pointer;\n outline: none;\n transition:\n background-color var(--b-tree-transition-duration) ease,\n color var(--b-tree-transition-duration) ease;\n user-select: none;\n position: relative;\n}\n\n.b-tree__node:hover {\n background-color: var(--b-tree-node-hover-bg);\n color: var(--b-tree-node-hover-color);\n}\n\n.b-tree__node:focus-visible {\n outline: 2px solid var(--b-tree-checkbox-checked-bg);\n outline-offset: -1px;\n}\n\n.b-tree__node--selected {\n background-color: var(--b-tree-node-selected-bg);\n color: var(--b-tree-node-selected-color);\n font-weight: 500;\n}\n\n.b-tree__node--selected:hover {\n background-color: var(--b-tree-node-selected-bg);\n}\n\n.b-tree__node--disabled {\n cursor: not-allowed;\n color: var(--b-tree-node-disabled-color);\n}\n\n.b-tree__node--disabled:hover {\n background-color: transparent;\n}\n\n.b-tree__node--block {\n padding-inline-end: 8px;\n}\n\n/* ─── Directory mode selected ───────────────────────────────────────────────── */\n.b-tree--directory .b-tree__node--selected {\n background-color: var(--b-tree-directory-selected-bg);\n color: var(--b-tree-directory-selected-color);\n}\n\n.b-tree--directory .b-tree__node--selected:hover {\n background-color: var(--b-tree-directory-selected-bg);\n}\n\n/* ─── Indent ─────────────────────────────────────────────────────────────────── */\n.b-tree__indent {\n display: inline-block;\n flex-shrink: 0;\n}\n\n/* ─── Switcher ───────────────────────────────────────────────────────────────── */\n.b-tree__switcher {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--b-tree-switcher-size);\n height: var(--b-tree-switcher-size);\n color: var(--b-tree-switcher-color);\n transition: color var(--b-tree-transition-duration) ease;\n}\n\n.b-tree__switcher:hover {\n color: var(--b-tree-checkbox-checked-bg);\n}\n\n.b-tree__switcher--leaf {\n pointer-events: none;\n}\n\n.b-tree__switcher-icon {\n width: 12px;\n height: 12px;\n flex-shrink: 0;\n transition: transform var(--b-tree-transition-duration) ease;\n}\n\n.b-tree__switcher--expanded .b-tree__switcher-icon:not(.b-tree__switcher-icon--spin) {\n transform: rotate(90deg);\n}\n\n/* Loading spinner */\n@keyframes b-tree-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.b-tree__switcher-icon--spin {\n animation: b-tree-spin var(--b-tree-spin-duration) linear infinite;\n}\n\n/* ─── Show lines ─────────────────────────────────────────────────────────────── */\n.b-tree--show-line .b-tree__node:not(:last-child)::before {\n content: '';\n position: absolute;\n inset-inline-start: calc(var(--b-tree-node-indent) + var(--b-tree-switcher-size) / 2);\n top: var(--b-tree-node-height);\n width: 1px;\n height: var(--b-tree-node-height);\n background-color: var(--b-tree-line-color);\n pointer-events: none;\n}\n\n/* ─── Checkbox ───────────────────────────────────────────────────────────────── */\n.b-tree__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__checkbox--disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.b-tree__checkbox-inner {\n display: inline-block;\n width: var(--b-tree-checkbox-size);\n height: var(--b-tree-checkbox-size);\n border: 1.5px solid var(--b-tree-checkbox-border);\n border-radius: 3px;\n background-color: var(--b-tree-checkbox-bg);\n position: relative;\n transition:\n border-color var(--b-tree-transition-duration) ease,\n background-color var(--b-tree-transition-duration) ease;\n}\n\n/* Checked tick */\n.b-tree__checkbox--checked .b-tree__checkbox-inner {\n border-color: var(--b-tree-checkbox-checked-border);\n background-color: var(--b-tree-checkbox-checked-bg);\n}\n\n.b-tree__checkbox--checked .b-tree__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/* Indeterminate dash */\n.b-tree__checkbox--indeterminate .b-tree__checkbox-inner {\n border-color: var(--b-tree-checkbox-indeterminate-bg);\n background-color: var(--b-tree-checkbox-indeterminate-bg);\n}\n\n.b-tree__checkbox--indeterminate .b-tree__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/* ─── Icon ───────────────────────────────────────────────────────────────────── */\n.b-tree__icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n font-size: var(--b-tree-icon-size);\n}\n\n/* ─── Title ──────────────────────────────────────────────────────────────────── */\n.b-tree__title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: inherit;\n}\n\n.b-tree__title--filtered {\n color: var(--b-tree-title-filtered-color);\n font-weight: 500;\n}\n\n/* ─── Drag handle ─────────────────────────────────────────────────────────── */\n.b-tree__drag-handle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 12px;\n height: var(--b-tree-node-height);\n color: var(--b-tree-switcher-color);\n cursor: grab;\n}\n\n.b-tree__drag-handle svg {\n width: 12px;\n height: 12px;\n display: block;\n}\n\n.b-tree__drag-handle:active {\n cursor: grabbing;\n}\n\n/* ─── Dragging node ──────────────────────────────────────────────────────────── */\n.b-tree__node--dragging {\n opacity: 0.5;\n}\n\n/* ─── Reduced motion ─────────────────────────────────────────────────────────── */\n@media (prefers-reduced-motion: reduce) {\n .b-tree {\n --b-tree-transition-duration: 0ms;\n --b-tree-spin-duration: 0ms;\n }\n\n .b-tree__switcher-icon {\n transition: none;\n }\n}\n</style>\n"],"mappings":""}
@@ -0,0 +1,12 @@
1
+ //#region src/components/BTreeSelect/types.ts
2
+ var e = /* @__PURE__ */ function(e) {
3
+ return e.Outlined = "outlined", e.Filled = "filled", e.Borderless = "borderless", e.Underlined = "underlined", e;
4
+ }({}), t = /* @__PURE__ */ function(e) {
5
+ return e.Error = "error", e.Warning = "warning", e;
6
+ }({}), n = /* @__PURE__ */ function(e) {
7
+ return e.BottomLeft = "bottomLeft", e.BottomRight = "bottomRight", e.TopLeft = "topLeft", e.TopRight = "topRight", e;
8
+ }({});
9
+ //#endregion
10
+ export { n as BTreeSelectPlacement, t as BTreeSelectStatus, e as BTreeSelectVariant };
11
+
12
+ //# sourceMappingURL=design-system273.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-system273.js","names":[],"sources":["../src/components/BTreeSelect/types.ts"],"sourcesContent":["export enum BTreeSelectVariant {\n Outlined = 'outlined',\n Filled = 'filled',\n Borderless = 'borderless',\n Underlined = 'underlined',\n}\n\nexport enum BTreeSelectStatus {\n Error = 'error',\n Warning = 'warning',\n}\n\nexport enum BTreeSelectPlacement {\n BottomLeft = 'bottomLeft',\n BottomRight = 'bottomRight',\n TopLeft = 'topLeft',\n TopRight = 'topRight',\n}\n\nexport type BTreeSelectExpandAction = 'click' | 'doubleClick' | false;\n\nexport type BTreeSelectValue = string | number;\n\nexport interface BTreeSelectLabeledValue {\n value: BTreeSelectValue;\n label: string;\n}\n\nexport type BTreeSelectModelValue =\n | BTreeSelectValue\n | BTreeSelectLabeledValue\n | BTreeSelectValue[]\n | BTreeSelectLabeledValue[]\n | null\n | undefined;\n\nexport interface BTreeSelectNode {\n /** The node's display title. */\n title?: string;\n /** Unique identification value. */\n value: BTreeSelectValue;\n /** Optional unique key. Falls back to `value` when omitted. */\n key?: BTreeSelectValue;\n /** Children nodes. */\n children?: BTreeSelectNode[];\n /** Whether this node is disabled. */\n disabled?: boolean;\n /** Whether to disable just the checkbox (treeCheckable mode). */\n disableCheckbox?: boolean;\n /** Whether the node can be selected (single mode). */\n selectable?: boolean;\n /** Whether the node is a leaf (used with loadData). */\n isLeaf?: boolean;\n /** Whether to show a checkbox for this node (treeCheckable mode). */\n checkable?: boolean;\n /** Arbitrary extra data passed through. */\n [key: string]: unknown;\n}\n\nexport interface BTreeSelectFieldNames {\n /** Custom field for label/title. Default: 'title' */\n label?: string;\n /** Custom field for value. Default: 'value' */\n value?: string;\n /** Custom field for children. Default: 'children' */\n children?: string;\n}\n\nexport interface BTreeSelectShowSearchConfig {\n /** Custom filter function. Returns true if a node matches. */\n filter?: (input: string, node: BTreeSelectNode) => boolean;\n}\n\nexport interface BTreeSelectChangeExtra {\n /** Whether selection was triggered by a check/uncheck or a single select. */\n triggerValue?: BTreeSelectValue;\n /** The node that triggered the change. */\n triggerNode?: BTreeSelectNode;\n /** Whether the change came from a \"select\" or \"deselect\". */\n preValue?: BTreeSelectValue[];\n /** Whether currently checked (treeCheckable mode). */\n checked?: boolean;\n /** Whether currently selected. */\n selected?: boolean;\n}\n\nexport interface BTreeSelectFlatNode {\n key: BTreeSelectValue;\n value: BTreeSelectValue;\n data: BTreeSelectNode;\n depth: number;\n visible: boolean;\n parents: BTreeSelectValue[];\n}\n"],"mappings":";AAAA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,WAAA,YACA,EAAA,SAAA,UACA,EAAA,aAAA,cACA,EAAA,aAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,QAAA,SACA,EAAA,UAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,aAAA,cACA,EAAA,cAAA,eACA,EAAA,UAAA,WACA,EAAA,WAAA;KACD"}
@@ -1,6 +1,6 @@
1
1
  import { BCommonSize as e } from "./design-system3.js";
2
2
  import { useComponentId as t } from "./design-system10.js";
3
- import { BTreeSelectPlacement as n, BTreeSelectStatus as r, BTreeSelectVariant as i } from "./design-system255.js";
3
+ import { BTreeSelectPlacement as n, BTreeSelectStatus as r, BTreeSelectVariant as i } from "./design-system273.js";
4
4
  import { Fragment as a, computed as o, createCommentVNode as s, createElementBlock as c, createElementVNode as l, createTextVNode as u, defineComponent as ee, mergeModels as te, mergeProps as ne, nextTick as d, normalizeClass as f, normalizeStyle as re, openBlock as p, ref as m, renderList as ie, renderSlot as h, toDisplayString as g, unref as _, useAttrs as ae, useCssVars as oe, useModel as se, watch as ce, withModifiers as v } from "vue";
5
5
  //#region src/components/BTreeSelect/BTreeSelect.vue?vue&type=script&setup=true&lang.ts
6
6
  var le = [
@@ -766,4 +766,4 @@ var le = [
766
766
  //#endregion
767
767
  export { Oe as default };
768
768
 
769
- //# sourceMappingURL=design-system256.js.map
769
+ //# sourceMappingURL=design-system274.js.map