@7pmlabs/design-system 1.0.9 → 1.0.11

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 (438) hide show
  1. package/README.md +57 -6
  2. package/dist/design-system.css +1 -1
  3. package/dist/design-system.js +74 -60
  4. package/dist/design-system100.js +4 -5
  5. package/dist/design-system100.js.map +1 -1
  6. package/dist/design-system101.js +53 -506
  7. package/dist/design-system101.js.map +1 -1
  8. package/dist/{design-system93.js → design-system102.js} +1 -1
  9. package/dist/design-system102.js.map +1 -0
  10. package/dist/design-system103.js +13 -5
  11. package/dist/design-system103.js.map +1 -1
  12. package/dist/design-system104.js +109 -7
  13. package/dist/design-system104.js.map +1 -1
  14. package/dist/design-system106.js +9 -0
  15. package/dist/design-system106.js.map +1 -0
  16. package/dist/design-system107.js +206 -6
  17. package/dist/design-system107.js.map +1 -1
  18. package/dist/design-system109.js +9 -0
  19. package/dist/design-system109.js.map +1 -0
  20. package/dist/design-system110.js +507 -6
  21. package/dist/design-system110.js.map +1 -1
  22. package/dist/design-system112.js +8 -0
  23. package/dist/design-system112.js.map +1 -0
  24. package/dist/design-system113.js +7 -5
  25. package/dist/design-system113.js.map +1 -1
  26. package/dist/design-system114.js +209 -9
  27. package/dist/design-system114.js.map +1 -1
  28. package/dist/design-system116.js +9 -0
  29. package/dist/design-system116.js.map +1 -0
  30. package/dist/design-system117.js +224 -6
  31. package/dist/design-system117.js.map +1 -1
  32. package/dist/design-system119.js +9 -0
  33. package/dist/design-system119.js.map +1 -0
  34. package/dist/design-system12.js.map +1 -1
  35. package/dist/design-system120.js +163 -5
  36. package/dist/design-system120.js.map +1 -1
  37. package/dist/design-system122.js +5 -90
  38. package/dist/design-system122.js.map +1 -1
  39. package/dist/design-system123.js +12 -0
  40. package/dist/design-system123.js.map +1 -0
  41. package/dist/design-system124.js +274 -5
  42. package/dist/design-system124.js.map +1 -1
  43. package/dist/design-system126.js +9 -0
  44. package/dist/design-system126.js.map +1 -0
  45. package/dist/design-system127.js +16 -5
  46. package/dist/design-system127.js.map +1 -1
  47. package/dist/design-system129.js +8 -0
  48. package/dist/design-system129.js.map +1 -0
  49. package/dist/design-system130.js +12 -5
  50. package/dist/design-system130.js.map +1 -1
  51. package/dist/design-system131.js +76 -137
  52. package/dist/design-system131.js.map +1 -1
  53. package/dist/design-system133.js +1 -1
  54. package/dist/design-system133.js.map +1 -1
  55. package/dist/design-system134.js +37 -90
  56. package/dist/design-system134.js.map +1 -1
  57. package/dist/design-system136.js +1 -1
  58. package/dist/design-system136.js.map +1 -1
  59. package/dist/design-system137.js +226 -20
  60. package/dist/design-system137.js.map +1 -1
  61. package/dist/design-system139.js +4 -5
  62. package/dist/design-system139.js.map +1 -1
  63. package/dist/design-system140.js +151 -9
  64. package/dist/design-system140.js.map +1 -1
  65. package/dist/design-system142.js +3 -2
  66. package/dist/design-system142.js.map +1 -1
  67. package/dist/design-system143.js +93 -19
  68. package/dist/design-system143.js.map +1 -1
  69. package/dist/design-system145.js +5 -158
  70. package/dist/design-system145.js.map +1 -1
  71. package/dist/design-system146.js +12 -0
  72. package/dist/design-system146.js.map +1 -0
  73. package/dist/design-system147.js +37 -5
  74. package/dist/design-system147.js.map +1 -1
  75. package/dist/design-system148.js +4 -307
  76. package/dist/design-system148.js.map +1 -1
  77. package/dist/design-system149.js +24 -0
  78. package/dist/{design-system144.js.map → design-system149.js.map} +1 -1
  79. package/dist/design-system150.js +2 -3
  80. package/dist/design-system150.js.map +1 -1
  81. package/dist/design-system151.js +131 -213
  82. package/dist/design-system151.js.map +1 -1
  83. package/dist/design-system153.js +1 -1
  84. package/dist/design-system153.js.map +1 -1
  85. package/dist/design-system154.js +278 -160
  86. package/dist/design-system154.js.map +1 -1
  87. package/dist/design-system156.js +1 -1
  88. package/dist/design-system156.js.map +1 -1
  89. package/dist/design-system157.js +240 -3
  90. package/dist/design-system157.js.map +1 -1
  91. package/dist/design-system159.js +8 -0
  92. package/dist/design-system159.js.map +1 -0
  93. package/dist/design-system16.js.map +1 -1
  94. package/dist/design-system160.js +189 -6
  95. package/dist/design-system160.js.map +1 -1
  96. package/dist/design-system162.js +8 -0
  97. package/dist/design-system162.js.map +1 -0
  98. package/dist/design-system163.js +3 -6
  99. package/dist/design-system163.js.map +1 -1
  100. package/dist/design-system164.js +46 -57
  101. package/dist/design-system164.js.map +1 -1
  102. package/dist/design-system166.js +2 -2
  103. package/dist/design-system166.js.map +1 -1
  104. package/dist/design-system167.js +44 -170
  105. package/dist/design-system167.js.map +1 -1
  106. package/dist/design-system169.js +2 -2
  107. package/dist/design-system169.js.map +1 -1
  108. package/dist/design-system170.js +55 -101
  109. package/dist/design-system170.js.map +1 -1
  110. package/dist/design-system172.js +5 -4
  111. package/dist/design-system172.js.map +1 -1
  112. package/dist/design-system173.js +182 -11
  113. package/dist/design-system173.js.map +1 -1
  114. package/dist/design-system175.js +9 -0
  115. package/dist/design-system175.js.map +1 -0
  116. package/dist/design-system176.js +115 -6
  117. package/dist/design-system176.js.map +1 -1
  118. package/dist/design-system178.js +8 -0
  119. package/dist/design-system178.js.map +1 -0
  120. package/dist/design-system179.js +11 -5
  121. package/dist/design-system179.js.map +1 -1
  122. package/dist/design-system180.js +452 -90
  123. package/dist/design-system180.js.map +1 -1
  124. package/dist/design-system182.js +5 -4
  125. package/dist/design-system182.js.map +1 -1
  126. package/dist/design-system183.js +33 -106
  127. package/dist/design-system183.js.map +1 -1
  128. package/dist/design-system185.js +4 -5
  129. package/dist/design-system185.js.map +1 -1
  130. package/dist/design-system186.js +71 -89
  131. package/dist/design-system186.js.map +1 -1
  132. package/dist/design-system188.js +4 -5
  133. package/dist/design-system188.js.map +1 -1
  134. package/dist/design-system189.js +25 -727
  135. package/dist/design-system189.js.map +1 -1
  136. package/dist/design-system19.js.map +1 -1
  137. package/dist/design-system191.js +1 -1
  138. package/dist/design-system191.js.map +1 -1
  139. package/dist/design-system192.js +28 -11
  140. package/dist/design-system192.js.map +1 -1
  141. package/dist/design-system194.js +8 -0
  142. package/dist/design-system194.js.map +1 -0
  143. package/dist/design-system195.js +33 -5
  144. package/dist/design-system195.js.map +1 -1
  145. package/dist/design-system197.js +5 -46
  146. package/dist/design-system197.js.map +1 -1
  147. package/dist/design-system198.js +31 -4
  148. package/dist/design-system198.js.map +1 -1
  149. package/dist/design-system200.js +8 -0
  150. package/dist/design-system200.js.map +1 -0
  151. package/dist/design-system201.js +332 -5
  152. package/dist/design-system201.js.map +1 -1
  153. package/dist/design-system203.js +8 -0
  154. package/dist/design-system203.js.map +1 -0
  155. package/dist/design-system204.js +100 -5
  156. package/dist/design-system204.js.map +1 -1
  157. package/dist/design-system206.js +8 -0
  158. package/dist/design-system206.js.map +1 -0
  159. package/dist/design-system207.js +19 -5
  160. package/dist/design-system207.js.map +1 -1
  161. package/dist/design-system208.js +4 -54
  162. package/dist/design-system208.js.map +1 -1
  163. package/dist/design-system209.js +3 -4
  164. package/dist/design-system209.js.map +1 -1
  165. package/dist/design-system210.js +386 -137
  166. package/dist/design-system210.js.map +1 -1
  167. package/dist/design-system212.js +1 -1
  168. package/dist/design-system212.js.map +1 -1
  169. package/dist/design-system213.js +59 -7
  170. package/dist/design-system213.js.map +1 -1
  171. package/dist/design-system215.js +8 -0
  172. package/dist/design-system215.js.map +1 -0
  173. package/dist/design-system216.js +88 -5
  174. package/dist/design-system216.js.map +1 -1
  175. package/dist/design-system217.js +4 -580
  176. package/dist/design-system217.js.map +1 -1
  177. package/dist/design-system218.js +111 -0
  178. package/dist/design-system218.js.map +1 -0
  179. package/dist/design-system22.js.map +1 -1
  180. package/dist/design-system220.js +6 -7
  181. package/dist/design-system220.js.map +1 -1
  182. package/dist/design-system221.js +85 -353
  183. package/dist/design-system221.js.map +1 -1
  184. package/dist/design-system223.js +2 -2
  185. package/dist/design-system223.js.map +1 -1
  186. package/dist/design-system224.js +740 -0
  187. package/dist/design-system224.js.map +1 -0
  188. package/dist/design-system226.js +8 -0
  189. package/dist/design-system226.js.map +1 -0
  190. package/dist/{design-system60.js → design-system227.js} +6 -8
  191. package/dist/design-system227.js.map +1 -0
  192. package/dist/{design-system193.js → design-system228.js} +2 -2
  193. package/dist/design-system228.js.map +1 -0
  194. package/dist/design-system230.js +8 -0
  195. package/dist/design-system230.js.map +1 -0
  196. package/dist/{design-system196.js → design-system231.js} +1 -1
  197. package/dist/{design-system196.js.map → design-system231.js.map} +1 -1
  198. package/dist/design-system232.js +49 -0
  199. package/dist/design-system232.js.map +1 -0
  200. package/dist/design-system233.js +7 -0
  201. package/dist/design-system233.js.map +1 -0
  202. package/dist/{design-system199.js → design-system234.js} +2 -2
  203. package/dist/design-system234.js.map +1 -0
  204. package/dist/design-system236.js +8 -0
  205. package/dist/design-system236.js.map +1 -0
  206. package/dist/{design-system202.js → design-system237.js} +1 -1
  207. package/dist/design-system237.js.map +1 -0
  208. package/dist/design-system239.js +8 -0
  209. package/dist/design-system239.js.map +1 -0
  210. package/dist/{design-system205.js → design-system240.js} +1 -1
  211. package/dist/design-system240.js.map +1 -0
  212. package/dist/design-system242.js +8 -0
  213. package/dist/design-system242.js.map +1 -0
  214. package/dist/design-system243.js +57 -0
  215. package/dist/design-system243.js.map +1 -0
  216. package/dist/design-system244.js +7 -0
  217. package/dist/design-system244.js.map +1 -0
  218. package/dist/design-system245.js +173 -0
  219. package/dist/design-system245.js.map +1 -0
  220. package/dist/design-system247.js +8 -0
  221. package/dist/design-system247.js.map +1 -0
  222. package/dist/design-system248.js +10 -0
  223. package/dist/design-system248.js.map +1 -0
  224. package/dist/{design-system214.js → design-system249.js} +2 -2
  225. package/dist/design-system249.js.map +1 -0
  226. package/dist/design-system25.js.map +1 -1
  227. package/dist/design-system251.js +8 -0
  228. package/dist/design-system251.js.map +1 -0
  229. package/dist/design-system252.js +583 -0
  230. package/dist/design-system252.js.map +1 -0
  231. package/dist/{design-system219.js → design-system254.js} +2 -2
  232. package/dist/{design-system219.js.map → design-system254.js.map} +1 -1
  233. package/dist/design-system255.js +12 -0
  234. package/dist/design-system255.js.map +1 -0
  235. package/dist/design-system256.js +769 -0
  236. package/dist/design-system256.js.map +1 -0
  237. package/dist/design-system258.js +9 -0
  238. package/dist/design-system258.js.map +1 -0
  239. package/dist/design-system259.js +10 -0
  240. package/dist/design-system259.js.map +1 -0
  241. package/dist/design-system260.js +377 -0
  242. package/dist/design-system260.js.map +1 -0
  243. package/dist/design-system262.js +9 -0
  244. package/dist/design-system262.js.map +1 -0
  245. package/dist/design-system28.js.map +1 -1
  246. package/dist/design-system3.js.map +1 -1
  247. package/dist/design-system30.js +21 -138
  248. package/dist/design-system30.js.map +1 -1
  249. package/dist/design-system32.js +5 -4
  250. package/dist/design-system32.js.map +1 -1
  251. package/dist/design-system33.js +488 -14
  252. package/dist/design-system33.js.map +1 -1
  253. package/dist/design-system35.js +1 -1
  254. package/dist/design-system35.js.map +1 -1
  255. package/dist/design-system36.js +135 -17
  256. package/dist/design-system36.js.map +1 -1
  257. package/dist/design-system38.js +1 -1
  258. package/dist/design-system38.js.map +1 -1
  259. package/dist/design-system39.js +16 -11
  260. package/dist/design-system39.js.map +1 -1
  261. package/dist/design-system4.js.map +1 -1
  262. package/dist/design-system41.js +8 -0
  263. package/dist/design-system41.js.map +1 -0
  264. package/dist/design-system42.js +26 -5
  265. package/dist/design-system42.js.map +1 -1
  266. package/dist/design-system44.js +5 -71
  267. package/dist/design-system44.js.map +1 -1
  268. package/dist/design-system45.js +353 -0
  269. package/dist/design-system45.js.map +1 -0
  270. package/dist/design-system47.js +5 -50
  271. package/dist/design-system47.js.map +1 -1
  272. package/dist/design-system48.js +11 -4
  273. package/dist/design-system48.js.map +1 -1
  274. package/dist/design-system49.js +476 -3
  275. package/dist/design-system49.js.map +1 -1
  276. package/dist/design-system51.js +8 -0
  277. package/dist/design-system51.js.map +1 -0
  278. package/dist/design-system52.js +3 -5
  279. package/dist/design-system52.js.map +1 -1
  280. package/dist/design-system53.js +56 -83
  281. package/dist/design-system53.js.map +1 -1
  282. package/dist/design-system55.js +5 -4
  283. package/dist/design-system55.js.map +1 -1
  284. package/dist/design-system56.js +50 -11
  285. package/dist/design-system56.js.map +1 -1
  286. package/dist/design-system57.js +4 -591
  287. package/dist/design-system57.js.map +1 -1
  288. package/dist/design-system58.js +6 -0
  289. package/dist/design-system58.js.map +1 -0
  290. package/dist/design-system59.js +64 -5
  291. package/dist/design-system59.js.map +1 -1
  292. package/dist/design-system61.js +5 -696
  293. package/dist/design-system61.js.map +1 -1
  294. package/dist/design-system62.js +101 -0
  295. package/dist/design-system62.js.map +1 -0
  296. package/dist/design-system64.js +5 -158
  297. package/dist/design-system64.js.map +1 -1
  298. package/dist/design-system65.js +14 -0
  299. package/dist/design-system65.js.map +1 -0
  300. package/dist/design-system66.js +591 -5
  301. package/dist/design-system66.js.map +1 -1
  302. package/dist/design-system68.js +3 -2
  303. package/dist/design-system68.js.map +1 -1
  304. package/dist/design-system69.js +13 -49
  305. package/dist/design-system69.js.map +1 -1
  306. package/dist/design-system7.js.map +1 -1
  307. package/dist/design-system70.js +699 -0
  308. package/dist/{design-system63.js.map → design-system70.js.map} +1 -1
  309. package/dist/design-system72.js +5 -199
  310. package/dist/design-system72.js.map +1 -1
  311. package/dist/design-system73.js +161 -0
  312. package/dist/design-system73.js.map +1 -0
  313. package/dist/design-system75.js +5 -7
  314. package/dist/design-system75.js.map +1 -1
  315. package/dist/design-system76.js +25 -269
  316. package/dist/design-system76.js.map +1 -1
  317. package/dist/design-system77.js +7 -0
  318. package/dist/design-system77.js.map +1 -0
  319. package/dist/design-system78.js +49 -5
  320. package/dist/design-system78.js.map +1 -1
  321. package/dist/{design-system71.js → design-system80.js} +2 -2
  322. package/dist/{design-system71.js.map → design-system80.js.map} +1 -1
  323. package/dist/design-system81.js +199 -5
  324. package/dist/design-system81.js.map +1 -1
  325. package/dist/design-system83.js +5 -99
  326. package/dist/design-system83.js.map +1 -1
  327. package/dist/design-system84.js +10 -0
  328. package/dist/design-system84.js.map +1 -0
  329. package/dist/design-system85.js +273 -5
  330. package/dist/design-system85.js.map +1 -1
  331. package/dist/design-system87.js +8 -0
  332. package/dist/design-system87.js.map +1 -0
  333. package/dist/design-system88.js +57 -5
  334. package/dist/design-system88.js.map +1 -1
  335. package/dist/design-system90.js +8 -0
  336. package/dist/design-system90.js.map +1 -0
  337. package/dist/design-system91.js +11 -5
  338. package/dist/design-system91.js.map +1 -1
  339. package/dist/design-system92.js +98 -53
  340. package/dist/design-system92.js.map +1 -1
  341. package/dist/design-system94.js +5 -13
  342. package/dist/design-system94.js.map +1 -1
  343. package/dist/design-system95.js +61 -104
  344. package/dist/design-system95.js.map +1 -1
  345. package/dist/design-system97.js +4 -5
  346. package/dist/design-system97.js.map +1 -1
  347. package/dist/design-system98.js +80 -198
  348. package/dist/design-system98.js.map +1 -1
  349. package/dist/types/components/BCalendar/BCalendar.spec.d.ts +1 -0
  350. package/dist/types/components/BCalendar/BCalendar.vue.d.ts +114 -0
  351. package/dist/types/components/BCalendar/index.d.ts +2 -0
  352. package/dist/types/components/BCalendar/types.d.ts +54 -0
  353. package/dist/types/components/BCarousel/BCarousel.spec.d.ts +1 -0
  354. package/dist/types/components/BCarousel/BCarousel.vue.d.ts +133 -0
  355. package/dist/types/components/BCarousel/index.d.ts +2 -0
  356. package/dist/types/components/BCarousel/types.d.ts +15 -0
  357. package/dist/types/components/BPagination/BPagination.vue.d.ts +1 -1
  358. package/dist/types/components/BSkeleton/BSkeleton.spec.d.ts +1 -0
  359. package/dist/types/components/BSkeleton/BSkeleton.vue.d.ts +46 -0
  360. package/dist/types/components/BSkeleton/BSkeletonAvatar.vue.d.ts +12 -0
  361. package/dist/types/components/BSkeleton/BSkeletonButton.vue.d.ts +14 -0
  362. package/dist/types/components/BSkeleton/BSkeletonImage.vue.d.ts +7 -0
  363. package/dist/types/components/BSkeleton/BSkeletonInput.vue.d.ts +12 -0
  364. package/dist/types/components/BSkeleton/BSkeletonNode.vue.d.ts +19 -0
  365. package/dist/types/components/BSkeleton/index.d.ts +7 -0
  366. package/dist/types/components/BSkeleton/types.d.ts +20 -0
  367. package/dist/types/components/BSplitter/BSplitter.spec.d.ts +1 -0
  368. package/dist/types/components/BSplitter/BSplitter.vue.d.ts +45 -0
  369. package/dist/types/components/BSplitter/BSplitterPanel.vue.d.ts +40 -0
  370. package/dist/types/components/BSplitter/index.d.ts +3 -0
  371. package/dist/types/components/BSplitter/types.d.ts +42 -0
  372. package/dist/types/components/BStatistic/BStatistic.spec.d.ts +1 -0
  373. package/dist/types/components/BStatistic/BStatistic.vue.d.ts +44 -0
  374. package/dist/types/components/BStatistic/BStatisticTimer.vue.d.ts +50 -0
  375. package/dist/types/components/BStatistic/index.d.ts +3 -0
  376. package/dist/types/components/BStatistic/types.d.ts +6 -0
  377. package/dist/types/components/BTreeSelect/BTreeSelect.spec.d.ts +1 -0
  378. package/dist/types/components/BTreeSelect/BTreeSelect.vue.d.ts +143 -0
  379. package/dist/types/components/BTreeSelect/index.d.ts +2 -0
  380. package/dist/types/components/BTreeSelect/types.d.ts +77 -0
  381. package/dist/types/components/index.d.ts +6 -0
  382. package/dist/types/types.d.ts +3 -0
  383. package/package.json +6 -3
  384. package/dist/design-system105.js +0 -212
  385. package/dist/design-system105.js.map +0 -1
  386. package/dist/design-system108.js +0 -227
  387. package/dist/design-system108.js.map +0 -1
  388. package/dist/design-system111.js +0 -166
  389. package/dist/design-system111.js.map +0 -1
  390. package/dist/design-system115.js +0 -277
  391. package/dist/design-system115.js.map +0 -1
  392. package/dist/design-system118.js +0 -19
  393. package/dist/design-system118.js.map +0 -1
  394. package/dist/design-system121.js +0 -15
  395. package/dist/design-system121.js.map +0 -1
  396. package/dist/design-system125.js +0 -45
  397. package/dist/design-system125.js.map +0 -1
  398. package/dist/design-system128.js +0 -236
  399. package/dist/design-system128.js.map +0 -1
  400. package/dist/design-system141.js +0 -40
  401. package/dist/design-system141.js.map +0 -1
  402. package/dist/design-system144.js +0 -7
  403. package/dist/design-system158.js +0 -61
  404. package/dist/design-system158.js.map +0 -1
  405. package/dist/design-system161.js +0 -59
  406. package/dist/design-system161.js.map +0 -1
  407. package/dist/design-system174.js +0 -465
  408. package/dist/design-system174.js.map +0 -1
  409. package/dist/design-system177.js +0 -335
  410. package/dist/design-system177.js.map +0 -1
  411. package/dist/design-system193.js.map +0 -1
  412. package/dist/design-system199.js.map +0 -1
  413. package/dist/design-system202.js.map +0 -1
  414. package/dist/design-system205.js.map +0 -1
  415. package/dist/design-system214.js.map +0 -1
  416. package/dist/design-system40.js +0 -479
  417. package/dist/design-system40.js.map +0 -1
  418. package/dist/design-system43.js +0 -6
  419. package/dist/design-system43.js.map +0 -1
  420. package/dist/design-system46.js +0 -9
  421. package/dist/design-system46.js.map +0 -1
  422. package/dist/design-system50.js +0 -67
  423. package/dist/design-system50.js.map +0 -1
  424. package/dist/design-system60.js.map +0 -1
  425. package/dist/design-system63.js +0 -8
  426. package/dist/design-system67.js +0 -32
  427. package/dist/design-system67.js.map +0 -1
  428. package/dist/design-system74.js +0 -8
  429. package/dist/design-system74.js.map +0 -1
  430. package/dist/design-system79.js +0 -60
  431. package/dist/design-system79.js.map +0 -1
  432. package/dist/design-system82.js +0 -14
  433. package/dist/design-system82.js.map +0 -1
  434. package/dist/design-system86.js +0 -69
  435. package/dist/design-system86.js.map +0 -1
  436. package/dist/design-system89.js +0 -91
  437. package/dist/design-system89.js.map +0 -1
  438. package/dist/design-system93.js.map +0 -1
@@ -1,8 +1,276 @@
1
- import e from "./design-system83.js";
2
- /* empty css */
3
- //#region src/components/BFloatButton/BFloatButton.vue
4
- var t = e;
1
+ import { useComponentId as e } from "./design-system10.js";
2
+ import { BDropdownPlacement as t, BDropdownTrigger as n } from "./design-system84.js";
3
+ import { Fragment as r, computed as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, defineComponent as c, nextTick as l, normalizeClass as u, normalizeStyle as d, onBeforeUnmount as ee, onMounted as te, openBlock as f, ref as p, renderList as m, renderSlot as h, toDisplayString as g, unref as ne, useId as re, watch as _ } from "vue";
4
+ //#region src/components/BDropdown/BDropdown.vue?vue&type=script&setup=true&lang.ts
5
+ var ie = {
6
+ key: 0,
7
+ class: "b-dropdown__indicator",
8
+ "aria-hidden": "true"
9
+ }, ae = ["aria-labelledby"], v = {
10
+ key: 0,
11
+ class: "b-dropdown__content"
12
+ }, y = {
13
+ key: 0,
14
+ class: "b-dropdown__divider",
15
+ role: "separator"
16
+ }, oe = ["aria-label"], se = { class: "b-dropdown__group-title" }, ce = [
17
+ "tabindex",
18
+ "aria-disabled",
19
+ "onClick"
20
+ ], le = {
21
+ key: 0,
22
+ class: "b-dropdown__item-icon",
23
+ "aria-hidden": "true"
24
+ }, ue = { class: "b-dropdown__item-label" }, de = [
25
+ "tabindex",
26
+ "aria-disabled",
27
+ "onClick"
28
+ ], fe = {
29
+ key: 0,
30
+ class: "b-dropdown__item-icon",
31
+ "aria-hidden": "true"
32
+ }, b = { class: "b-dropdown__item-label" }, x = "[role=\"menuitem\"]:not([aria-disabled=\"true\"])", S = /* @__PURE__ */ c({
33
+ __name: "BDropdown",
34
+ props: {
35
+ trigger: { default: () => n.Hover },
36
+ placement: { default: () => t.BottomLeft },
37
+ arrow: {
38
+ type: Boolean,
39
+ default: !1
40
+ },
41
+ disabled: {
42
+ type: Boolean,
43
+ default: !1
44
+ },
45
+ destroyOnHidden: {
46
+ type: Boolean,
47
+ default: !1
48
+ },
49
+ mouseEnterDelay: { default: 100 },
50
+ mouseLeaveDelay: { default: 100 },
51
+ menu: {},
52
+ modelValue: {
53
+ type: Boolean,
54
+ default: () => void 0
55
+ }
56
+ },
57
+ emits: [
58
+ "openChange",
59
+ "update:modelValue",
60
+ "menuClick"
61
+ ],
62
+ setup(c, { expose: S, emit: pe }) {
63
+ let C = pe, { componentUID: me } = e(), w = re(), he = `${w}-menu`, T = p(!1), E = i(() => c.modelValue === void 0 ? T.value : c.modelValue), ge = i(() => c.destroyOnHidden ? E.value : !0), D = null, O = null;
64
+ function k() {
65
+ D &&= (clearTimeout(D), null), O &&= (clearTimeout(O), null);
66
+ }
67
+ function A(e = 0) {
68
+ c.disabled || (k(), !E.value && (e > 0 ? D = setTimeout(() => M(), e) : M()));
69
+ }
70
+ function j(e = 0) {
71
+ k(), E.value && (e > 0 ? O = setTimeout(() => N(), e) : N());
72
+ }
73
+ function M() {
74
+ I.value?.showPopover();
75
+ }
76
+ function N() {
77
+ I.value?.hidePopover();
78
+ }
79
+ function P(e) {
80
+ c.modelValue === void 0 ? T.value = e : C("update:modelValue", e), C("openChange", e);
81
+ }
82
+ let F = ({ newState: e }) => {
83
+ P(e === "open");
84
+ }, I = p(null), L = p(null), R = null, z = p(-1);
85
+ function B() {
86
+ return I.value ? Array.from(I.value.querySelectorAll(x)) : [];
87
+ }
88
+ function V(e) {
89
+ let t = B();
90
+ if (t.length === 0) return;
91
+ let n = Math.max(0, Math.min(e, t.length - 1));
92
+ z.value = n, t[n]?.focus();
93
+ }
94
+ function H() {
95
+ l(() => V(0));
96
+ }
97
+ function U() {
98
+ l(() => {
99
+ V(B().length - 1);
100
+ });
101
+ }
102
+ _(E, (e) => {
103
+ e ? (R = document.activeElement, H()) : (z.value = -1, R && l(() => R?.focus()));
104
+ });
105
+ function W(e) {
106
+ e.disabled || (C("menuClick", {
107
+ key: e.key,
108
+ item: e
109
+ }), j());
110
+ }
111
+ function G() {
112
+ c.disabled || (E.value ? j() : A());
113
+ }
114
+ function K(e) {
115
+ c.disabled || (e.preventDefault(), E.value ? j() : A());
116
+ }
117
+ function q() {
118
+ c.disabled || A(c.mouseEnterDelay);
119
+ }
120
+ function J() {
121
+ j(c.mouseLeaveDelay);
122
+ }
123
+ function Y(e) {
124
+ if (!c.disabled) switch (e.key) {
125
+ case "Enter":
126
+ case " ":
127
+ case "ArrowDown":
128
+ e.preventDefault(), E.value ? H() : (A(), l(() => H()));
129
+ break;
130
+ case "ArrowUp":
131
+ e.preventDefault(), E.value ? U() : (A(), l(() => U()));
132
+ break;
133
+ case "Escape":
134
+ E.value && (e.preventDefault(), j());
135
+ break;
136
+ }
137
+ }
138
+ function _e(e) {
139
+ let t = B(), n = t.indexOf(document.activeElement);
140
+ switch (e.key) {
141
+ case "ArrowDown":
142
+ e.preventDefault(), V(n < t.length - 1 ? n + 1 : 0);
143
+ break;
144
+ case "ArrowUp":
145
+ e.preventDefault(), V(n > 0 ? n - 1 : t.length - 1);
146
+ break;
147
+ case "Home":
148
+ e.preventDefault(), V(0);
149
+ break;
150
+ case "End":
151
+ e.preventDefault(), V(t.length - 1);
152
+ break;
153
+ case "Enter":
154
+ case " ":
155
+ e.preventDefault(), document.activeElement && document.activeElement.click();
156
+ break;
157
+ case "Escape":
158
+ e.preventDefault(), j();
159
+ break;
160
+ case "Tab":
161
+ j();
162
+ break;
163
+ }
164
+ }
165
+ function ve() {
166
+ c.trigger === n.Hover && k();
167
+ }
168
+ function ye() {
169
+ c.trigger === n.Hover && j(c.mouseLeaveDelay);
170
+ }
171
+ function X(e) {
172
+ if (!E.value) return;
173
+ let t = e.target;
174
+ L.value?.contains(t) || I.value?.contains(t) || j();
175
+ }
176
+ function Z() {
177
+ let e = L.value;
178
+ if (e) switch (e.addEventListener("keydown", Y), c.trigger) {
179
+ case n.Click:
180
+ e.addEventListener("click", G);
181
+ break;
182
+ case n.ContextMenu:
183
+ e.addEventListener("contextmenu", K);
184
+ break;
185
+ case n.Hover:
186
+ default:
187
+ e.addEventListener("mouseenter", q), e.addEventListener("mouseleave", J);
188
+ break;
189
+ }
190
+ }
191
+ function Q() {
192
+ let e = L.value;
193
+ e && (e.removeEventListener("keydown", Y), e.removeEventListener("click", G), e.removeEventListener("contextmenu", K), e.removeEventListener("mouseenter", q), e.removeEventListener("mouseleave", J));
194
+ }
195
+ te(() => {
196
+ Z();
197
+ }), ee(() => {
198
+ Q(), document.removeEventListener("click", X, !0), k();
199
+ }), _(E, (e) => {
200
+ e ? document.addEventListener("click", X, !0) : document.removeEventListener("click", X, !0);
201
+ }), _(() => c.trigger, () => {
202
+ Q(), Z();
203
+ }), _(() => c.modelValue, (e) => {
204
+ e !== void 0 && (e ? I.value?.showPopover() : I.value?.hidePopover());
205
+ });
206
+ let $ = i(() => `--b-dropdown-anchor-${me.value}`), be = i(() => ({
207
+ [t.Bottom]: "bottom-center",
208
+ [t.BottomLeft]: "bottom-left",
209
+ [t.BottomRight]: "bottom-right",
210
+ [t.Top]: "top-center",
211
+ [t.TopLeft]: "top-left",
212
+ [t.TopRight]: "top-right"
213
+ })[c.placement] ?? "bottom-left"), xe = i(() => c.menu?.items ?? []), Se = i(() => ({
214
+ id: w,
215
+ "aria-haspopup": "menu",
216
+ "aria-expanded": E.value,
217
+ "aria-disabled": c.disabled || void 0
218
+ }));
219
+ return S({
220
+ open: M,
221
+ close: N
222
+ }), (e, t) => (f(), o(r, null, [s("div", {
223
+ ref_key: "toggleRef",
224
+ ref: L,
225
+ class: u(["b-dropdown__toggle", { "b-dropdown__toggle--open": E.value }]),
226
+ style: d({ anchorName: $.value })
227
+ }, [h(e.$slots, "default", { triggerProps: Se.value }), c.arrow ? (f(), o("span", ie)) : a("", !0)], 6), s("div", {
228
+ ref_key: "popoverRef",
229
+ ref: I,
230
+ popover: "manual",
231
+ class: u(["b-dropdown", be.value]),
232
+ style: d({ positionAnchor: $.value }),
233
+ id: he,
234
+ role: "menu",
235
+ "aria-labelledby": ne(w),
236
+ tabindex: "-1",
237
+ onToggle: F,
238
+ onKeydown: _e,
239
+ onMouseenter: ve,
240
+ onMouseleave: ye
241
+ }, [ge.value ? (f(), o("div", v, [h(e.$slots, "overlay", {}, () => [(f(!0), o(r, null, m(xe.value, (e) => (f(), o(r, { key: e.key }, [e.type === "divider" ? (f(), o("div", y)) : e.type === "group" ? (f(), o("div", {
242
+ key: 1,
243
+ class: "b-dropdown__group",
244
+ role: "group",
245
+ "aria-label": e.title
246
+ }, [s("div", se, g(e.title), 1), (f(!0), o(r, null, m(e.children, (e) => (f(), o("div", {
247
+ key: e.key,
248
+ class: u([
249
+ "b-dropdown__item",
250
+ { "b-dropdown__item--disabled": e.disabled },
251
+ { "b-dropdown__item--danger": e.danger },
252
+ { "b-dropdown__item--selected": c.menu?.selectedKeys?.includes(e.key) }
253
+ ]),
254
+ role: "menuitem",
255
+ tabindex: e.disabled ? -1 : 0,
256
+ "aria-disabled": e.disabled || void 0,
257
+ onClick: (t) => W(e)
258
+ }, [e.icon ? (f(), o("span", le, g(e.icon), 1)) : a("", !0), s("span", ue, g(e.label), 1)], 10, ce))), 128))], 8, oe)) : (f(), o("div", {
259
+ key: 2,
260
+ class: u([
261
+ "b-dropdown__item",
262
+ { "b-dropdown__item--disabled": e.disabled },
263
+ { "b-dropdown__item--danger": e.danger },
264
+ { "b-dropdown__item--selected": c.menu?.selectedKeys?.includes(e.key) }
265
+ ]),
266
+ role: "menuitem",
267
+ tabindex: e.disabled ? -1 : 0,
268
+ "aria-disabled": e.disabled || void 0,
269
+ onClick: (t) => W(e)
270
+ }, [e.icon ? (f(), o("span", fe, g(e.icon), 1)) : a("", !0), s("span", b, g(e.label), 1)], 10, de))], 64))), 128))])])) : a("", !0)], 46, ae)], 64));
271
+ }
272
+ });
5
273
  //#endregion
6
- export { t as default };
274
+ export { S as default };
7
275
 
8
276
  //# sourceMappingURL=design-system85.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"design-system85.js","names":[],"sources":["../src/components/BFloatButton/BFloatButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport BIcon from '@/components/BIcon/BIcon.vue';\nimport { type BIconName } from '@/components/BIcon/BIconEnum.ts';\nimport { computed } from 'vue';\nimport type { BFloatButtonBadgeProps } from './types.ts';\nimport { BFloatButtonShape, BFloatButtonType } from './types.ts';\n\n// ─────────────────────────────────────────────\n// Props & emits\n// ─────────────────────────────────────────────\nconst {\n icon,\n description,\n tooltip,\n type = BFloatButtonType.Default,\n shape = BFloatButtonShape.Circle,\n href,\n target = '_blank',\n htmlType = 'button',\n badge,\n disabled = false,\n ariaLabel,\n} = defineProps<{\n /**\n * Icon name for the float button.\n * @example 'arrow-up', 'plus', 'question'\n */\n icon?: `${BIconName}`;\n /**\n * Description text shown below the icon (square shape only).\n */\n description?: string;\n /**\n * Tooltip text shown on hover.\n */\n tooltip?: string;\n /**\n * Visual type of the button.\n * @default 'default'\n */\n type?: `${BFloatButtonType}`;\n /**\n * Shape of the button.\n * @default 'circle'\n */\n shape?: `${BFloatButtonShape}`;\n /**\n * When set, renders as an anchor element with this href.\n */\n href?: string;\n /**\n * Link target attribute (only used with href).\n * @default '_blank'\n */\n target?: string;\n /**\n * HTML button type attribute (only used when not href).\n * @default 'button'\n */\n htmlType?: 'button' | 'submit' | 'reset';\n /**\n * Badge configuration to display on the button.\n */\n badge?: BFloatButtonBadgeProps;\n /**\n * Whether the button is disabled.\n * @default false\n */\n disabled?: boolean;\n /**\n * Accessible label for the button (important when no visible text).\n */\n ariaLabel?: string;\n}>();\n\nconst emit = defineEmits<{\n /** Emitted when the button is clicked. */\n (e: 'click', event: MouseEvent): void;\n}>();\n\ndefineSlots<{\n /** Custom icon content. */\n icon?(): unknown;\n /** Description content (square shape only). */\n description?(): unknown;\n /** Tooltip content. */\n tooltip?(): unknown;\n}>();\n\n// ─────────────────────────────────────────────\n// Computed helpers\n// ─────────────────────────────────────────────\nconst isType = (value: `${BFloatButtonType}`) => type === value;\nconst isShape = (value: `${BFloatButtonShape}`) => shape === value;\n\nconst badgeCount = computed(() => {\n if (!badge) return undefined;\n if (badge.dot) return undefined;\n return badge.count;\n});\n\nconst showBadgeDot = computed(() => badge?.dot ?? false);\n\nconst badgeOverflow = computed(() => badge?.overflowCount ?? 99);\n\nconst badgeDisplayCount = computed(() => {\n const count = badgeCount.value;\n if (count === undefined) return undefined;\n if (count === 0 && !badge?.showZero) return undefined;\n return count > badgeOverflow.value ? `${badgeOverflow.value}+` : String(count);\n});\n\nconst showBadge = computed(() => {\n return showBadgeDot.value || badgeDisplayCount.value !== undefined;\n});\n\nfunction handleClick(event: MouseEvent) {\n if (disabled) return;\n emit('click', event);\n}\n\nconst rootTag = computed(() => (href ? 'a' : 'button'));\n</script>\n\n<template>\n <component\n :is=\"rootTag\"\n :href=\"href\"\n :target=\"href ? target : undefined\"\n :type=\"!href ? htmlType : undefined\"\n :disabled=\"!href && disabled ? true : undefined\"\n :aria-disabled=\"href && disabled ? 'true' : undefined\"\n :aria-label=\"ariaLabel ?? tooltip\"\n :title=\"tooltip\"\n :class=\"[\n 'b-float-button',\n {\n 'b-float-button--circle': isShape('circle'),\n 'b-float-button--square': isShape('square'),\n 'b-float-button--default': isType('default'),\n 'b-float-button--primary': isType('primary'),\n 'b-float-button--disabled': disabled,\n },\n ]\"\n @click=\"handleClick\"\n >\n <!-- Badge -->\n <span\n v-if=\"showBadge\"\n class=\"b-float-button__badge\"\n :class=\"{\n 'b-float-button__badge--dot': showBadgeDot,\n 'b-float-button__badge--count': !showBadgeDot,\n }\"\n :style=\"badge?.color ? { backgroundColor: badge.color } : undefined\"\n aria-hidden=\"true\"\n >\n <template v-if=\"!showBadgeDot\">{{ badgeDisplayCount }}</template>\n </span>\n\n <!-- Body -->\n <span class=\"b-float-button__body\">\n <!-- Icon -->\n <span class=\"b-float-button__icon\" aria-hidden=\"true\">\n <slot name=\"icon\">\n <BIcon v-if=\"icon\" :icon=\"icon\" size=\"md\" />\n <!-- Default plus icon when no icon prop or slot is provided -->\n <svg\n v-else\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M19 13H13v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n </svg>\n </slot>\n </span>\n\n <!-- Description (square shape only) -->\n <span\n v-if=\"($slots.description || description) && isShape('square')\"\n class=\"b-float-button__description\"\n >\n <slot name=\"description\">{{ description }}</slot>\n </span>\n </span>\n\n <!-- Tooltip overlay -->\n <span\n v-if=\"$slots.tooltip || (tooltip && !ariaLabel)\"\n class=\"b-float-button__tooltip\"\n role=\"tooltip\"\n >\n <slot name=\"tooltip\">{{ tooltip }}</slot>\n </span>\n </component>\n</template>\n\n<style>\n/* ────────────────────────────────────────────\n CSS Custom Properties (tokens)\n scoped to .b-float-button — never on :root\n ──────────────────────────────────────────── */\n.b-float-button {\n /* Size tokens — AntD: floatButtonSize (40px) */\n --b-float-button-size: 40px;\n /* Icon size — AntD: floatButtonIconSize (21px) */\n --b-float-button-icon-size: 1.3125rem;\n /* Background — AntD: colorBgContainer */\n --b-float-button-bg: #fff;\n /* Primary background */\n --b-float-button-primary-bg: oklch(55% 0.2 264);\n /* Primary hover background */\n --b-float-button-primary-bg-hover: oklch(62% 0.2 264);\n /* Default hover background */\n --b-float-button-bg-hover: oklch(96% 0 0);\n /* Text / icon color — AntD: colorText */\n --b-float-button-color: oklch(20% 0 0);\n /* Primary text color */\n --b-float-button-primary-color: #fff;\n /* Border radius (circle: 50%, square: 8px) */\n --b-float-button-border-radius-circle: 50%;\n --b-float-button-border-radius-square: 0.5rem;\n /* Shadow — AntD: boxShadowSecondary */\n --b-float-button-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n /* Bottom inset — AntD: floatButtonInsetBlockEnd (48px) */\n --b-float-button-inset-block-end: 3rem;\n /* Inline inset — AntD: floatButtonInsetInlineEnd (24px) */\n --b-float-button-inset-inline-end: 1.5rem;\n /* z-index — AntD: zIndexPopupBase (1000) */\n --b-float-button-z-index: 1000;\n /* Transition */\n --b-float-button-transition-duration: 200ms;\n /* Description font size (sm) */\n --b-float-button-description-font-size: 0.75rem;\n /* Badge */\n --b-float-button-badge-bg: oklch(57% 0.22 25);\n --b-float-button-badge-color: #fff;\n --b-float-button-badge-font-size: 0.6875rem;\n /* Tooltip */\n --b-float-button-tooltip-bg: oklch(20% 0.02 260);\n --b-float-button-tooltip-color: oklch(96% 0 0);\n}\n\n/* ── Dark mode ── */\n[data-prefers-color='dark'] .b-float-button,\n[data-prefers-color='dark'].b-float-button {\n --b-float-button-bg: oklch(20% 0.02 260);\n --b-float-button-bg-hover: oklch(28% 0.02 260);\n --b-float-button-color: oklch(88% 0.01 260);\n --b-float-button-primary-bg: oklch(50% 0.2 264);\n --b-float-button-primary-bg-hover: oklch(57% 0.2 264);\n --b-float-button-shadow:\n 0 6px 16px 0 oklch(0% 0 0 / 30%), 0 3px 6px -4px oklch(0% 0 0 / 40%),\n 0 9px 28px 8px oklch(0% 0 0 / 25%);\n --b-float-button-tooltip-bg: oklch(30% 0.02 260);\n --b-float-button-tooltip-color: oklch(88% 0.01 260);\n --b-float-button-badge-bg: oklch(55% 0.22 25);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'].b-float-button {\n --b-float-button-bg: oklch(20% 0.02 260);\n --b-float-button-bg-hover: oklch(28% 0.02 260);\n --b-float-button-color: oklch(88% 0.01 260);\n --b-float-button-primary-bg: oklch(50% 0.2 264);\n --b-float-button-primary-bg-hover: oklch(57% 0.2 264);\n --b-float-button-shadow:\n 0 6px 16px 0 oklch(0% 0 0 / 30%), 0 3px 6px -4px oklch(0% 0 0 / 40%),\n 0 9px 28px 8px oklch(0% 0 0 / 25%);\n --b-float-button-tooltip-bg: oklch(30% 0.02 260);\n --b-float-button-tooltip-color: oklch(88% 0.01 260);\n --b-float-button-badge-bg: oklch(55% 0.22 25);\n }\n}\n\n/* ─────────────────────────────────────────────\n Base button\n ───────────────────────────────────────────── */\n.b-float-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: relative;\n width: var(--b-float-button-size);\n height: var(--b-float-button-size);\n min-height: var(--b-float-button-size);\n background-color: var(--b-float-button-bg);\n color: var(--b-float-button-color);\n border: none;\n padding: 0;\n cursor: pointer;\n box-shadow: var(--b-float-button-shadow);\n text-decoration: none;\n transition:\n background-color var(--b-float-button-transition-duration) ease,\n color var(--b-float-button-transition-duration) ease,\n box-shadow var(--b-float-button-transition-duration) ease,\n transform var(--b-float-button-transition-duration) ease;\n outline-offset: 2px;\n\n /* Tooltip hidden by default */\n &:hover .b-float-button__tooltip {\n opacity: 1;\n pointer-events: auto;\n transform: translateX(-50%) scale(1);\n }\n}\n\n/* ── Shape: circle ── */\n.b-float-button--circle {\n border-radius: var(--b-float-button-border-radius-circle);\n}\n\n/* ── Shape: square ── */\n.b-float-button--square {\n border-radius: var(--b-float-button-border-radius-square);\n height: auto;\n min-height: var(--b-float-button-size);\n padding: 0.5rem;\n}\n\n/* ── Type: default ── */\n.b-float-button--default {\n background-color: var(--b-float-button-bg);\n color: var(--b-float-button-color);\n\n &:not(.b-float-button--disabled):hover {\n background-color: var(--b-float-button-bg-hover);\n }\n}\n\n/* ── Type: primary ── */\n.b-float-button--primary {\n background-color: var(--b-float-button-primary-bg);\n color: var(--b-float-button-primary-color);\n\n &:not(.b-float-button--disabled):hover {\n background-color: var(--b-float-button-primary-bg-hover);\n }\n}\n\n/* ── Disabled state ── */\n.b-float-button--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ── Focus visible ring ── */\n.b-float-button:focus-visible {\n outline: 2px solid var(--b-float-button-primary-bg);\n}\n\n/* ─────────────────────────────────────────────\n Body (icon + description wrapper)\n ───────────────────────────────────────────── */\n.b-float-button__body {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.125rem;\n}\n\n/* ─────────────────────────────────────────────\n Icon\n ───────────────────────────────────────────── */\n.b-float-button__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--b-float-button-icon-size);\n line-height: 1;\n}\n\n/* ─────────────────────────────────────────────\n Description\n ───────────────────────────────────────────── */\n.b-float-button__description {\n font-size: var(--b-float-button-description-font-size);\n line-height: 1.2;\n text-align: center;\n white-space: nowrap;\n}\n\n/* ─────────────────────────────────────────────\n Tooltip overlay\n ───────────────────────────────────────────── */\n.b-float-button__tooltip {\n position: absolute;\n right: calc(100% + 0.75rem);\n top: 50%;\n transform: translateX(-50%) scale(0.95);\n white-space: nowrap;\n background: var(--b-float-button-tooltip-bg);\n color: var(--b-float-button-tooltip-color);\n font-size: 0.875rem;\n padding: 0.25rem 0.5rem;\n border-radius: 0.375rem;\n pointer-events: none;\n opacity: 0;\n transition:\n opacity var(--b-float-button-transition-duration) ease,\n transform var(--b-float-button-transition-duration) ease;\n\n /* Arrow */\n &::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 100%;\n transform: translateY(-50%);\n border: 5px solid transparent;\n border-left-color: var(--b-float-button-tooltip-bg);\n }\n}\n\n/* ─────────────────────────────────────────────\n Badge\n ───────────────────────────────────────────── */\n.b-float-button__badge {\n position: absolute;\n top: -4px;\n right: -4px;\n z-index: 1;\n background: var(--b-float-button-badge-bg);\n color: var(--b-float-button-badge-color);\n font-size: var(--b-float-button-badge-font-size);\n line-height: 1;\n border-radius: 10px;\n padding: 2px 5px;\n min-width: 1.25rem;\n text-align: center;\n box-shadow: 0 0 0 2px var(--b-float-button-bg);\n}\n\n.b-float-button__badge--dot {\n width: 8px;\n height: 8px;\n min-width: 0;\n padding: 0;\n border-radius: 50%;\n}\n\n/* ─────────────────────────────────────────────\n Reduced motion\n ───────────────────────────────────────────── */\n@media (prefers-reduced-motion: reduce) {\n .b-float-button,\n .b-float-button__tooltip {\n transition-duration: 0ms;\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"design-system85.js","names":[],"sources":["../src/components/BDropdown/BDropdown.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useComponentId } from '@/composables/useComponentId.ts';\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useId, watch } from 'vue';\n\nimport type { BDropdownMenuItem, BDropdownMenuProps } from './types.ts';\nimport { BDropdownPlacement, BDropdownTrigger } from './types.ts';\n\nconst {\n trigger = BDropdownTrigger.Hover,\n placement = BDropdownPlacement.BottomLeft,\n arrow = false,\n disabled = false,\n destroyOnHidden = false,\n mouseEnterDelay = 100,\n mouseLeaveDelay = 100,\n menu,\n modelValue = undefined,\n} = defineProps<{\n /** The trigger mode which executes the dropdown action. */\n trigger?: `${BDropdownTrigger}`;\n /** Placement of popup menu. */\n placement?: `${BDropdownPlacement}`;\n /** Whether to show the dropdown chevron indicator next to the trigger. */\n arrow?: boolean;\n /** Whether the dropdown menu is disabled. */\n disabled?: boolean;\n /** Whether to destroy popup on hide. */\n destroyOnHidden?: boolean;\n /** Delay in ms before showing on mouseenter (hover trigger only). */\n mouseEnterDelay?: number;\n /** Delay in ms before hiding on mouseleave (hover trigger only). */\n mouseLeaveDelay?: number;\n /** Menu configuration: items, selectable, multiple, selectedKeys. */\n menu?: BDropdownMenuProps;\n /** Controlled open state - bind with `v-model:open`. */\n modelValue?: boolean;\n}>();\n\nconst emit = defineEmits<{\n /** Emitted when the dropdown visibility changes. */\n (e: 'openChange', open: boolean): void;\n /** v-model:open support. */\n (e: 'update:modelValue', value: boolean): void;\n /** Emitted when a menu item is clicked. */\n (e: 'menuClick', info: { key: string | number; item: BDropdownMenuItem }): void;\n}>();\n\ndefineSlots<{\n /** The trigger element. Receives `triggerProps` to bind ARIA attributes. */\n default?(props: { triggerProps: Record<string, unknown> }): unknown;\n /** Custom overlay content (replaces default menu rendering). */\n overlay?(): unknown;\n}>();\n\n// ─────────────────────────────────────────────\n// Internal state\n// ─────────────────────────────────────────────\nconst { componentUID } = useComponentId();\nconst dropdownId = useId();\nconst menuId = `${dropdownId}-menu`;\n\nconst internalOpen = ref(false);\nconst isOpen = computed(() => (modelValue !== undefined ? modelValue : internalOpen.value));\n\nconst shouldRender = computed(() => {\n if (destroyOnHidden) return isOpen.value;\n return true;\n});\n\n// ─────────────────────────────────────────────\n// Visibility control\n// ─────────────────────────────────────────────\nlet showTimer: ReturnType<typeof setTimeout> | null = null;\nlet hideTimer: ReturnType<typeof setTimeout> | null = null;\n\nfunction clearTimers() {\n if (showTimer) {\n clearTimeout(showTimer);\n showTimer = null;\n }\n if (hideTimer) {\n clearTimeout(hideTimer);\n hideTimer = null;\n }\n}\n\nfunction requestOpen(delay = 0) {\n if (disabled) return;\n clearTimers();\n if (isOpen.value) return;\n if (delay > 0) {\n showTimer = setTimeout(() => doOpen(), delay);\n } else {\n doOpen();\n }\n}\n\nfunction requestClose(delay = 0) {\n clearTimers();\n if (!isOpen.value) return;\n if (delay > 0) {\n hideTimer = setTimeout(() => doClose(), delay);\n } else {\n doClose();\n }\n}\n\nfunction doOpen() {\n popoverRef.value?.showPopover();\n}\n\nfunction doClose() {\n popoverRef.value?.hidePopover();\n}\n\nfunction setOpen(val: boolean) {\n if (modelValue !== undefined) {\n emit('update:modelValue', val);\n } else {\n internalOpen.value = val;\n }\n emit('openChange', val);\n}\n\n// ─────────────────────────────────────────────\n// Popover toggle event\n// ─────────────────────────────────────────────\nconst onPopoverToggle = ({ newState }: ToggleEvent) => {\n setOpen(newState === 'open');\n};\n\n// ─────────────────────────────────────────────\n// Refs\n// ─────────────────────────────────────────────\nconst popoverRef = ref<HTMLDivElement | null>(null);\nconst toggleRef = ref<HTMLDivElement | null>(null);\n\n// ─────────────────────────────────────────────\n// Focus management\n// ─────────────────────────────────────────────\nlet previouslyFocusedElement: HTMLElement | null = null;\nconst focusedIndex = ref(-1);\n\nconst focusableSelector = '[role=\"menuitem\"]:not([aria-disabled=\"true\"])';\n\nfunction getFocusableItems(): HTMLElement[] {\n if (!popoverRef.value) return [];\n return Array.from(popoverRef.value.querySelectorAll<HTMLElement>(focusableSelector));\n}\n\nfunction focusItem(index: number) {\n const items = getFocusableItems();\n if (items.length === 0) return;\n const clamped = Math.max(0, Math.min(index, items.length - 1));\n focusedIndex.value = clamped;\n items[clamped]?.focus();\n}\n\nfunction focusFirst() {\n nextTick(() => focusItem(0));\n}\n\nfunction focusLast() {\n nextTick(() => {\n const items = getFocusableItems();\n focusItem(items.length - 1);\n });\n}\n\nwatch(isOpen, (val) => {\n if (val) {\n previouslyFocusedElement = document.activeElement as HTMLElement | null;\n focusFirst();\n } else {\n focusedIndex.value = -1;\n if (previouslyFocusedElement) {\n nextTick(() => previouslyFocusedElement?.focus());\n }\n }\n});\n\n// ─────────────────────────────────────────────\n// Menu item click\n// ─────────────────────────────────────────────\nfunction onItemClick(item: BDropdownMenuItem) {\n if (item.disabled) return;\n emit('menuClick', { key: item.key, item });\n requestClose();\n}\n\n// ─────────────────────────────────────────────\n// Event handlers\n// ─────────────────────────────────────────────\nfunction onClick() {\n if (disabled) return;\n if (isOpen.value) {\n requestClose();\n } else {\n requestOpen();\n }\n}\n\nfunction onContextMenu(event: MouseEvent) {\n if (disabled) return;\n event.preventDefault();\n if (isOpen.value) {\n requestClose();\n } else {\n requestOpen();\n }\n}\n\nfunction onMouseEnter() {\n if (disabled) return;\n requestOpen(mouseEnterDelay);\n}\n\nfunction onMouseLeave() {\n requestClose(mouseLeaveDelay);\n}\n\nfunction onTriggerKeydown(event: KeyboardEvent) {\n if (disabled) return;\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault();\n if (!isOpen.value) {\n requestOpen();\n nextTick(() => focusFirst());\n } else {\n focusFirst();\n }\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (!isOpen.value) {\n requestOpen();\n nextTick(() => focusLast());\n } else {\n focusLast();\n }\n break;\n case 'Escape':\n if (isOpen.value) {\n event.preventDefault();\n requestClose();\n }\n break;\n }\n}\n\nfunction onMenuKeydown(event: KeyboardEvent) {\n const items = getFocusableItems();\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n focusItem(currentIndex < items.length - 1 ? currentIndex + 1 : 0);\n break;\n case 'ArrowUp':\n event.preventDefault();\n focusItem(currentIndex > 0 ? currentIndex - 1 : items.length - 1);\n break;\n case 'Home':\n event.preventDefault();\n focusItem(0);\n break;\n case 'End':\n event.preventDefault();\n focusItem(items.length - 1);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (document.activeElement) {\n (document.activeElement as HTMLElement).click();\n }\n break;\n case 'Escape':\n event.preventDefault();\n requestClose();\n break;\n case 'Tab':\n requestClose();\n break;\n }\n}\n\n// ─────────────────────────────────────────────\n// Popover hover (keep open when hovering content)\n// ─────────────────────────────────────────────\nfunction onPopoverMouseEnter() {\n if (trigger === BDropdownTrigger.Hover) {\n clearTimers();\n }\n}\n\nfunction onPopoverMouseLeave() {\n if (trigger === BDropdownTrigger.Hover) {\n requestClose(mouseLeaveDelay);\n }\n}\n\n// ─────────────────────────────────────────────\n// Click outside handler\n// ─────────────────────────────────────────────\nfunction onDocumentClick(event: MouseEvent) {\n if (!isOpen.value) return;\n const target = event.target as Node;\n if (toggleRef.value?.contains(target)) return;\n if (popoverRef.value?.contains(target)) return;\n requestClose();\n}\n\n// ─────────────────────────────────────────────\n// Event listener management\n// ─────────────────────────────────────────────\nfunction attachListeners() {\n const el = toggleRef.value;\n if (!el) return;\n\n el.addEventListener('keydown', onTriggerKeydown);\n\n switch (trigger) {\n case BDropdownTrigger.Click:\n el.addEventListener('click', onClick);\n break;\n case BDropdownTrigger.ContextMenu:\n el.addEventListener('contextmenu', onContextMenu);\n break;\n case BDropdownTrigger.Hover:\n default:\n el.addEventListener('mouseenter', onMouseEnter);\n el.addEventListener('mouseleave', onMouseLeave);\n break;\n }\n}\n\nfunction detachListeners() {\n const el = toggleRef.value;\n if (!el) return;\n\n el.removeEventListener('keydown', onTriggerKeydown);\n el.removeEventListener('click', onClick);\n el.removeEventListener('contextmenu', onContextMenu);\n el.removeEventListener('mouseenter', onMouseEnter);\n el.removeEventListener('mouseleave', onMouseLeave);\n}\n\nonMounted(() => {\n attachListeners();\n});\n\nonBeforeUnmount(() => {\n detachListeners();\n document.removeEventListener('click', onDocumentClick, true);\n clearTimers();\n});\n\nwatch(isOpen, (val) => {\n if (val) {\n document.addEventListener('click', onDocumentClick, true);\n } else {\n document.removeEventListener('click', onDocumentClick, true);\n }\n});\n\nwatch(\n () => trigger,\n () => {\n detachListeners();\n attachListeners();\n },\n);\n\nwatch(\n () => modelValue,\n (val) => {\n if (val === undefined) return;\n if (val) {\n popoverRef.value?.showPopover();\n } else {\n popoverRef.value?.hidePopover();\n }\n },\n);\n\n// ─────────────────────────────────────────────\n// Computed styles\n// ─────────────────────────────────────────────\nconst anchorName = computed(() => `--b-dropdown-anchor-${componentUID.value}`);\n\nconst placementClass = computed(() => {\n const map: Record<string, string> = {\n [BDropdownPlacement.Bottom]: 'bottom-center',\n [BDropdownPlacement.BottomLeft]: 'bottom-left',\n [BDropdownPlacement.BottomRight]: 'bottom-right',\n [BDropdownPlacement.Top]: 'top-center',\n [BDropdownPlacement.TopLeft]: 'top-left',\n [BDropdownPlacement.TopRight]: 'top-right',\n };\n return map[placement] ?? 'bottom-left';\n});\n\nconst menuItems = computed(() => menu?.items ?? []);\n\nconst triggerProps = computed(() => ({\n id: dropdownId,\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': isOpen.value,\n 'aria-disabled': disabled || undefined,\n}));\n\n// ─────────────────────────────────────────────\n// Public API\n// ─────────────────────────────────────────────\ndefineExpose({ open: doOpen, close: doClose });\n</script>\n\n<template>\n <div\n ref=\"toggleRef\"\n :class=\"['b-dropdown__toggle', { 'b-dropdown__toggle--open': isOpen }]\"\n :style=\"{ anchorName: anchorName }\"\n >\n <slot :trigger-props=\"triggerProps\" />\n <span v-if=\"arrow\" class=\"b-dropdown__indicator\" aria-hidden=\"true\" />\n </div>\n\n <div\n ref=\"popoverRef\"\n popover=\"manual\"\n :class=\"['b-dropdown', placementClass]\"\n :style=\"{ positionAnchor: anchorName }\"\n :id=\"menuId\"\n role=\"menu\"\n :aria-labelledby=\"dropdownId\"\n tabindex=\"-1\"\n @toggle=\"onPopoverToggle\"\n @keydown=\"onMenuKeydown\"\n @mouseenter=\"onPopoverMouseEnter\"\n @mouseleave=\"onPopoverMouseLeave\"\n >\n <template v-if=\"shouldRender\">\n <div class=\"b-dropdown__content\">\n <slot name=\"overlay\">\n <template v-for=\"item in menuItems\" :key=\"item.key\">\n <div v-if=\"item.type === 'divider'\" class=\"b-dropdown__divider\" role=\"separator\" />\n <div\n v-else-if=\"item.type === 'group'\"\n class=\"b-dropdown__group\"\n role=\"group\"\n :aria-label=\"item.title\"\n >\n <div class=\"b-dropdown__group-title\">{{ item.title }}</div>\n <div\n v-for=\"child in item.children\"\n :key=\"child.key\"\n :class=\"[\n 'b-dropdown__item',\n { 'b-dropdown__item--disabled': child.disabled },\n { 'b-dropdown__item--danger': child.danger },\n { 'b-dropdown__item--selected': menu?.selectedKeys?.includes(child.key) },\n ]\"\n role=\"menuitem\"\n :tabindex=\"child.disabled ? -1 : 0\"\n :aria-disabled=\"child.disabled || undefined\"\n @click=\"onItemClick(child)\"\n >\n <span v-if=\"child.icon\" class=\"b-dropdown__item-icon\" aria-hidden=\"true\">{{\n child.icon\n }}</span>\n <span class=\"b-dropdown__item-label\">{{ child.label }}</span>\n </div>\n </div>\n <div\n v-else\n :class=\"[\n 'b-dropdown__item',\n { 'b-dropdown__item--disabled': item.disabled },\n { 'b-dropdown__item--danger': item.danger },\n { 'b-dropdown__item--selected': menu?.selectedKeys?.includes(item.key) },\n ]\"\n role=\"menuitem\"\n :tabindex=\"item.disabled ? -1 : 0\"\n :aria-disabled=\"item.disabled || undefined\"\n @click=\"onItemClick(item)\"\n >\n <span v-if=\"item.icon\" class=\"b-dropdown__item-icon\" aria-hidden=\"true\">{{\n item.icon\n }}</span>\n <span class=\"b-dropdown__item-label\">{{ item.label }}</span>\n </div>\n </template>\n </slot>\n </div>\n </template>\n </div>\n</template>\n\n<style>\n/* ────────────────────────────────────────────\n CSS Custom Properties (tokens)\n ──────────────────────────────────────────── */\n.b-dropdown {\n --b-dropdown-z-index: 1050;\n --b-dropdown-bg: #fff;\n --b-dropdown-color: rgba(0, 0, 0, 0.88);\n --b-dropdown-border-radius: 8px;\n --b-dropdown-padding-block: 4px;\n --b-dropdown-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n --b-dropdown-font-size: 14px;\n --b-dropdown-line-height: 1.5714;\n --b-dropdown-min-width: 120px;\n --b-dropdown-max-width: 320px;\n --b-dropdown-gap: 4px;\n --b-dropdown-transition-duration: 200ms;\n\n --b-dropdown-item-padding-x: 12px;\n --b-dropdown-item-padding-y: 5px;\n --b-dropdown-item-border-radius: 4px;\n --b-dropdown-item-color: rgba(0, 0, 0, 0.88);\n --b-dropdown-item-hover-bg: rgba(0, 0, 0, 0.04);\n --b-dropdown-item-active-bg: rgba(0, 0, 0, 0.06);\n --b-dropdown-item-disabled-color: rgba(0, 0, 0, 0.25);\n --b-dropdown-item-danger-color: #ff4d4f;\n --b-dropdown-item-danger-hover-bg: #fff2f0;\n --b-dropdown-item-selected-bg: #e6f4ff;\n --b-dropdown-item-selected-color: #1677ff;\n --b-dropdown-item-icon-margin-right: 8px;\n --b-dropdown-item-icon-size: 14px;\n\n --b-dropdown-divider-color: rgba(5, 5, 5, 0.06);\n --b-dropdown-divider-margin: 4px 0;\n\n --b-dropdown-group-title-color: rgba(0, 0, 0, 0.45);\n --b-dropdown-group-title-font-size: 12px;\n --b-dropdown-group-title-padding: 5px 12px;\n}\n\n/* ── Dark mode ── */\n[data-prefers-color='dark'] .b-dropdown {\n --b-dropdown-bg: #1f1f1f;\n --b-dropdown-color: rgba(255, 255, 255, 0.85);\n --b-dropdown-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.24), 0 3px 6px -4px rgba(0, 0, 0, 0.36),\n 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n --b-dropdown-item-color: rgba(255, 255, 255, 0.85);\n --b-dropdown-item-hover-bg: rgba(255, 255, 255, 0.08);\n --b-dropdown-item-active-bg: rgba(255, 255, 255, 0.12);\n --b-dropdown-item-disabled-color: rgba(255, 255, 255, 0.25);\n --b-dropdown-item-danger-color: #ff7875;\n --b-dropdown-item-danger-hover-bg: rgba(255, 77, 79, 0.12);\n --b-dropdown-item-selected-bg: rgba(22, 119, 255, 0.15);\n --b-dropdown-item-selected-color: #4096ff;\n --b-dropdown-divider-color: rgba(253, 253, 253, 0.12);\n --b-dropdown-group-title-color: rgba(255, 255, 255, 0.45);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-dropdown {\n --b-dropdown-bg: #1f1f1f;\n --b-dropdown-color: rgba(255, 255, 255, 0.85);\n --b-dropdown-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.24), 0 3px 6px -4px rgba(0, 0, 0, 0.36),\n 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n --b-dropdown-item-color: rgba(255, 255, 255, 0.85);\n --b-dropdown-item-hover-bg: rgba(255, 255, 255, 0.08);\n --b-dropdown-item-active-bg: rgba(255, 255, 255, 0.12);\n --b-dropdown-item-disabled-color: rgba(255, 255, 255, 0.25);\n --b-dropdown-item-danger-color: #ff7875;\n --b-dropdown-item-danger-hover-bg: rgba(255, 77, 79, 0.12);\n --b-dropdown-item-selected-bg: rgba(22, 119, 255, 0.15);\n --b-dropdown-item-selected-color: #4096ff;\n --b-dropdown-divider-color: rgba(253, 253, 253, 0.12);\n --b-dropdown-group-title-color: rgba(255, 255, 255, 0.45);\n }\n}\n\n/* ─────────────────────────────────────────────\n Toggle wrapper\n ───────────────────────────────────────────── */\n.b-dropdown__toggle {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n\n &[aria-disabled='true'] {\n cursor: not-allowed;\n opacity: 0.5;\n }\n}\n\n/* ─────────────────────────────────────────────\n Chevron indicator (CSS-only)\n ───────────────────────────────────────────── */\n.b-dropdown__indicator {\n display: inline-block;\n width: 0.625em;\n height: 0.625em;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n transform: rotate(45deg) translateY(-2px);\n transition: transform 200ms;\n opacity: 0.65;\n flex-shrink: 0;\n}\n\n.b-dropdown__toggle--open .b-dropdown__indicator {\n transform: rotate(-135deg) translateY(-1px);\n}\n\n/* ─────────────────────────────────────────────\n Dropdown popover\n ───────────────────────────────────────────── */\n.b-dropdown {\n position: absolute;\n border: none;\n padding: 0;\n margin: 0;\n background: transparent;\n overflow: visible;\n z-index: var(--b-dropdown-z-index);\n min-width: var(--b-dropdown-min-width);\n max-width: var(--b-dropdown-max-width);\n box-sizing: border-box;\n pointer-events: auto;\n\n transition:\n display var(--b-dropdown-transition-duration),\n opacity var(--b-dropdown-transition-duration);\n transition-behavior: allow-discrete;\n opacity: 0;\n\n &:popover-open {\n opacity: 1;\n\n @starting-style {\n opacity: 0;\n }\n }\n\n /* ── Placement: Bottom ── */\n &.bottom-left {\n inset: auto;\n top: anchor(bottom);\n left: anchor(left);\n margin-top: var(--b-dropdown-gap);\n }\n &.bottom-center {\n inset: auto;\n top: anchor(bottom);\n justify-self: anchor-center;\n margin-top: var(--b-dropdown-gap);\n }\n &.bottom-right {\n inset: auto;\n top: anchor(bottom);\n right: anchor(right);\n margin-top: var(--b-dropdown-gap);\n }\n\n /* ── Placement: Top ── */\n &.top-left {\n inset: auto;\n bottom: anchor(top);\n left: anchor(left);\n margin-bottom: var(--b-dropdown-gap);\n }\n &.top-center {\n inset: auto;\n bottom: anchor(top);\n justify-self: anchor-center;\n margin-bottom: var(--b-dropdown-gap);\n }\n &.top-right {\n inset: auto;\n bottom: anchor(top);\n right: anchor(right);\n margin-bottom: var(--b-dropdown-gap);\n }\n}\n\n/* ─────────────────────────────────────────────\n Content wrapper\n ───────────────────────────────────────────── */\n.b-dropdown__content {\n background: var(--b-dropdown-bg);\n color: var(--b-dropdown-color);\n font-size: var(--b-dropdown-font-size);\n line-height: var(--b-dropdown-line-height);\n padding: var(--b-dropdown-padding-block) 0;\n border-radius: var(--b-dropdown-border-radius);\n box-shadow: var(--b-dropdown-shadow);\n overflow: hidden auto;\n max-height: 60vh;\n}\n\n/* ─────────────────────────────────────────────\n Menu items\n ───────────────────────────────────────────── */\n.b-dropdown__item {\n display: flex;\n align-items: center;\n padding: var(--b-dropdown-item-padding-y) var(--b-dropdown-item-padding-x);\n margin: 0 4px;\n border-radius: var(--b-dropdown-item-border-radius);\n color: var(--b-dropdown-item-color);\n cursor: pointer;\n user-select: none;\n outline: none;\n transition: background-color 150ms;\n\n &:hover,\n &:focus-visible {\n background: var(--b-dropdown-item-hover-bg);\n }\n\n &:active {\n background: var(--b-dropdown-item-active-bg);\n }\n\n &--disabled {\n color: var(--b-dropdown-item-disabled-color);\n cursor: not-allowed;\n pointer-events: none;\n }\n\n &--danger {\n color: var(--b-dropdown-item-danger-color);\n\n &:hover,\n &:focus-visible {\n background: var(--b-dropdown-item-danger-hover-bg);\n }\n }\n\n &--selected {\n background: var(--b-dropdown-item-selected-bg);\n color: var(--b-dropdown-item-selected-color);\n }\n}\n\n.b-dropdown__item-icon {\n margin-right: var(--b-dropdown-item-icon-margin-right);\n font-size: var(--b-dropdown-item-icon-size);\n display: inline-flex;\n align-items: center;\n}\n\n.b-dropdown__item-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* ─────────────────────────────────────────────\n Divider\n ───────────────────────────────────────────── */\n.b-dropdown__divider {\n height: 1px;\n margin: var(--b-dropdown-divider-margin);\n background: var(--b-dropdown-divider-color);\n}\n\n/* ─────────────────────────────────────────────\n Group\n ───────────────────────────────────────────── */\n.b-dropdown__group-title {\n padding: var(--b-dropdown-group-title-padding);\n color: var(--b-dropdown-group-title-color);\n font-size: var(--b-dropdown-group-title-font-size);\n font-weight: 500;\n}\n\n/* ─────────────────────────────────────────────\n Position fallbacks\n ───────────────────────────────────────────── */\n@position-try --b-dropdown-bottom {\n inset: auto;\n top: anchor(bottom);\n left: anchor(left);\n margin-top: var(--b-dropdown-gap);\n}\n\n@position-try --b-dropdown-top {\n inset: auto;\n bottom: anchor(top);\n left: anchor(left);\n margin-bottom: var(--b-dropdown-gap);\n}\n\n/* ── Reduced motion ── */\n@media (prefers-reduced-motion: reduce) {\n .b-dropdown {\n transition-duration: 0ms;\n }\n\n .b-dropdown__item {\n transition-duration: 0ms;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CA+IM,IAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAzG1B,IAAM,IAAO,IAmBP,EAAE,qBAAiB,GAAgB,EACnC,IAAa,IAAO,EACpB,KAAS,GAAG,EAAW,QAEvB,IAAe,EAAI,GAAM,EACzB,IAAS,QAAgB,EAAA,eAAe,KAAA,IAAyB,EAAa,QAA1B,EAAA,WAAiC,EAErF,KAAe,QACf,EAAA,kBAAwB,EAAO,QAC5B,GACP,EAKE,IAAkD,MAClD,IAAkD;EAEtD,SAAS,IAAc;AAKrB,GAJA,AAEE,OADA,aAAa,EAAU,EACX,OAEd,AAEE,OADA,aAAa,EAAU,EACX;;EAIhB,SAAS,EAAY,IAAQ,GAAG;AAC1B,KAAA,aACJ,GAAa,EACT,GAAO,UACP,IAAQ,IACV,IAAY,iBAAiB,GAAQ,EAAE,EAAM,GAE7C,GAAQ;;EAIZ,SAAS,EAAa,IAAQ,GAAG;AAC/B,MAAa,EACR,EAAO,UACR,IAAQ,IACV,IAAY,iBAAiB,GAAS,EAAE,EAAM,GAE9C,GAAS;;EAIb,SAAS,IAAS;AAChB,KAAW,OAAO,aAAa;;EAGjC,SAAS,IAAU;AACjB,KAAW,OAAO,aAAa;;EAGjC,SAAS,EAAQ,GAAc;AAM7B,GALI,EAAA,eAAe,KAAA,IAGjB,EAAa,QAAQ,IAFrB,EAAK,qBAAqB,EAAI,EAIhC,EAAK,cAAc,EAAI;;EAMzB,IAAM,KAAmB,EAAE,kBAA4B;AACrD,KAAQ,MAAa,OAAO;KAMxB,IAAa,EAA2B,KAAK,EAC7C,IAAY,EAA2B,KAAK,EAK9C,IAA+C,MAC7C,IAAe,EAAI,GAAG;EAI5B,SAAS,IAAmC;AAE1C,UADK,EAAW,QACT,MAAM,KAAK,EAAW,MAAM,iBAA8B,EAAkB,CAAC,GADtD,EAAE;;EAIlC,SAAS,EAAU,GAAe;GAChC,IAAM,IAAQ,GAAmB;AACjC,OAAI,EAAM,WAAW,EAAG;GACxB,IAAM,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAO,EAAM,SAAS,EAAE,CAAC;AAE9D,GADA,EAAa,QAAQ,GACrB,EAAM,IAAU,OAAO;;EAGzB,SAAS,IAAa;AACpB,WAAe,EAAU,EAAE,CAAC;;EAG9B,SAAS,IAAY;AACnB,WAAe;AAEb,MADc,GAAmB,CACjB,SAAS,EAAE;KAC3B;;AAGJ,IAAM,IAAS,MAAQ;AACrB,GAAI,KACF,IAA2B,SAAS,eACpC,GAAY,KAEZ,EAAa,QAAQ,IACjB,KACF,QAAe,GAA0B,OAAO,CAAC;IAGrD;EAKF,SAAS,EAAY,GAAyB;AACxC,KAAK,aACT,EAAK,aAAa;IAAE,KAAK,EAAK;IAAK;IAAM,CAAC,EAC1C,GAAc;;EAMhB,SAAS,IAAU;AACb,KAAA,aACA,EAAO,QACT,GAAc,GAEd,GAAa;;EAIjB,SAAS,EAAc,GAAmB;AACpC,KAAA,aACJ,EAAM,gBAAgB,EAClB,EAAO,QACT,GAAc,GAEd,GAAa;;EAIjB,SAAS,IAAe;AAClB,KAAA,YACJ,EAAY,EAAA,gBAAgB;;EAG9B,SAAS,IAAe;AACtB,KAAa,EAAA,gBAAgB;;EAG/B,SAAS,EAAiB,GAAsB;AAC1C,UAAA,SAEJ,SAAQ,EAAM,KAAd;IACE,KAAK;IACL,KAAK;IACL,KAAK;AAEH,KADA,EAAM,gBAAgB,EACjB,EAAO,QAIV,GAAY,IAHZ,GAAa,EACb,QAAe,GAAY,CAAC;AAI9B;IACF,KAAK;AAEH,KADA,EAAM,gBAAgB,EACjB,EAAO,QAIV,GAAW,IAHX,GAAa,EACb,QAAe,GAAW,CAAC;AAI7B;IACF,KAAK;AACH,KAAI,EAAO,UACT,EAAM,gBAAgB,EACtB,GAAc;AAEhB;;;EAIN,SAAS,GAAc,GAAsB;GAC3C,IAAM,IAAQ,GAAmB,EAC3B,IAAe,EAAM,QAAQ,SAAS,cAA6B;AAEzE,WAAQ,EAAM,KAAd;IACE,KAAK;AAEH,KADA,EAAM,gBAAgB,EACtB,EAAU,IAAe,EAAM,SAAS,IAAI,IAAe,IAAI,EAAE;AACjE;IACF,KAAK;AAEH,KADA,EAAM,gBAAgB,EACtB,EAAU,IAAe,IAAI,IAAe,IAAI,EAAM,SAAS,EAAE;AACjE;IACF,KAAK;AAEH,KADA,EAAM,gBAAgB,EACtB,EAAU,EAAE;AACZ;IACF,KAAK;AAEH,KADA,EAAM,gBAAgB,EACtB,EAAU,EAAM,SAAS,EAAE;AAC3B;IACF,KAAK;IACL,KAAK;AAEH,KADA,EAAM,gBAAgB,EAClB,SAAS,iBACV,SAAS,cAA8B,OAAO;AAEjD;IACF,KAAK;AAEH,KADA,EAAM,gBAAgB,EACtB,GAAc;AACd;IACF,KAAK;AACH,QAAc;AACd;;;EAON,SAAS,KAAsB;AAC7B,GAAI,EAAA,YAAY,EAAiB,SAC/B,GAAa;;EAIjB,SAAS,KAAsB;AAC7B,GAAI,EAAA,YAAY,EAAiB,SAC/B,EAAa,EAAA,gBAAgB;;EAOjC,SAAS,EAAgB,GAAmB;AAC1C,OAAI,CAAC,EAAO,MAAO;GACnB,IAAM,IAAS,EAAM;AACjB,KAAU,OAAO,SAAS,EAAO,IACjC,EAAW,OAAO,SAAS,EAAO,IACtC,GAAc;;EAMhB,SAAS,IAAkB;GACzB,IAAM,IAAK,EAAU;AAChB,SAIL,SAFA,EAAG,iBAAiB,WAAW,EAAiB,EAExC,EAAA,SAAR;IACE,KAAK,EAAiB;AACpB,OAAG,iBAAiB,SAAS,EAAQ;AACrC;IACF,KAAK,EAAiB;AACpB,OAAG,iBAAiB,eAAe,EAAc;AACjD;IACF,KAAK,EAAiB;IACtB;AAEE,KADA,EAAG,iBAAiB,cAAc,EAAa,EAC/C,EAAG,iBAAiB,cAAc,EAAa;AAC/C;;;EAIN,SAAS,IAAkB;GACzB,IAAM,IAAK,EAAU;AAChB,SAEL,EAAG,oBAAoB,WAAW,EAAiB,EACnD,EAAG,oBAAoB,SAAS,EAAQ,EACxC,EAAG,oBAAoB,eAAe,EAAc,EACpD,EAAG,oBAAoB,cAAc,EAAa,EAClD,EAAG,oBAAoB,cAAc,EAAa;;AA6BpD,EA1BA,SAAgB;AACd,MAAiB;IACjB,EAEF,SAAsB;AAGpB,GAFA,GAAiB,EACjB,SAAS,oBAAoB,SAAS,GAAiB,GAAK,EAC5D,GAAa;IACb,EAEF,EAAM,IAAS,MAAQ;AACrB,GAAI,IACF,SAAS,iBAAiB,SAAS,GAAiB,GAAK,GAEzD,SAAS,oBAAoB,SAAS,GAAiB,GAAK;IAE9D,EAEF,QACQ,EAAA,eACA;AAEJ,GADA,GAAiB,EACjB,GAAiB;IAEpB,EAED,QACQ,EAAA,aACL,MAAQ;AACH,SAAQ,KAAA,MACR,IACF,EAAW,OAAO,aAAa,GAE/B,EAAW,OAAO,aAAa;IAGpC;EAKD,IAAM,IAAa,QAAe,uBAAuB,GAAa,QAAQ,EAExE,KAAiB,SACe;IACjC,EAAmB,SAAS;IAC5B,EAAmB,aAAa;IAChC,EAAmB,cAAc;IACjC,EAAmB,MAAM;IACzB,EAAmB,UAAU;IAC7B,EAAmB,WAAW;GAChC,EACU,EAAA,cAAc,cACzB,EAEI,KAAY,QAAe,EAAA,MAAM,SAAS,EAAE,CAAC,EAE7C,KAAe,SAAgB;GACnC,IAAI;GACJ,iBAAiB;GACjB,iBAAiB,EAAO;GACxB,iBAAiB,EAAA,YAAY,KAAA;GAC9B,EAAE;SAKH,EAAa;GAAE,MAAM;GAAQ,OAAO;GAAS,CAAC,8BAI5C,EAOM,OAAA;YANA;GAAJ,KAAI;GACH,OAAK,EAAA,CAAA,sBAAA,EAAA,4BAAuD,EAAA,OAAM,CAAA,CAAA;GAClE,OAAK,EAAA,EAAA,YAAgB,EAAA,OAAU,CAAA;MAEhC,EAAsC,EAAA,QAAA,WAAA,EAA/B,cAAe,GAAA,OAAY,CAAA,EACtB,EAAA,SAAA,GAAA,EAAZ,EAAsE,QAAtE,GAAsE,IAAA,EAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAGxE,EAoEM,OAAA;YAnEA;GAAJ,KAAI;GACJ,SAAQ;GACP,OAAK,EAAA,CAAA,cAAiB,GAAA,MAAc,CAAA;GACpC,OAAK,EAAA,EAAA,gBAAoB,EAAA,OAAU,CAAA;GACnC,IAAI;GACL,MAAK;GACJ,mBAAiB,GAAA,EAAU;GAC5B,UAAS;GACR,UAAQ;GACR,WAAS;GACT,cAAY;GACZ,cAAY;MAEG,GAAA,SAAA,GAAA,EACd,EAmDM,OAnDN,GAmDM,CAlDJ,EAiDO,EAAA,QAAA,WAAA,EAAA,QAAA,EAAA,EAAA,GAAA,EAhDL,EA+CW,GAAA,MAAA,EA/Cc,GAAA,QAAR,wBAAyB,EAAK,KAAA,EAAA,CAClC,EAAK,SAAI,aAAA,GAAA,EAApB,EAAmF,OAAnF,EAAmF,IAEtE,EAAK,SAAI,WAAA,GAAA,EADtB,EA0BM,OAAA;;GAxBJ,OAAM;GACN,MAAK;GACJ,cAAY,EAAK;MAElB,EAA2D,OAA3D,IAA2D,EAAnB,EAAK,MAAK,EAAA,EAAA,GAAA,EAAA,GAAA,EAClD,EAkBM,GAAA,MAAA,EAjBY,EAAK,WAAd,YADT,EAkBM,OAAA;GAhBH,KAAK,EAAM;GACX,OAAK,EAAA;;oCAA4F,EAAM,UAAQ;kCAAoD,EAAM,QAAM;oCAAsD,EAAA,MAAM,cAAc,SAAS,EAAM,IAAG,EAAA;;GAM5Q,MAAK;GACJ,UAAU,EAAM,WAAQ,KAAA;GACxB,iBAAe,EAAM,YAAY,KAAA;GACjC,UAAK,MAAE,EAAY,EAAK;MAEb,EAAM,QAAA,GAAA,EAAlB,EAES,QAFT,IAES,EADP,EAAM,KAAI,EAAA,EAAA,IAAA,EAAA,IAAA,GAAA,EAEZ,EAA6D,QAA7D,IAA6D,EAArB,EAAM,MAAK,EAAA,EAAA,CAAA,EAAA,IAAA,GAAA,4BAGvD,EAiBM,OAAA;;GAfH,OAAK,EAAA;;oCAAwF,EAAK,UAAQ;kCAAkD,EAAK,QAAM;oCAAoD,EAAA,MAAM,cAAc,SAAS,EAAK,IAAG,EAAA;;GAMjQ,MAAK;GACJ,UAAU,EAAK,WAAQ,KAAA;GACvB,iBAAe,EAAK,YAAY,KAAA;GAChC,UAAK,MAAE,EAAY,EAAI;MAEZ,EAAK,QAAA,GAAA,EAAjB,EAES,QAFT,IAES,EADP,EAAK,KAAI,EAAA,EAAA,IAAA,EAAA,IAAA,GAAA,EAEX,EAA4D,QAA5D,GAA4D,EAApB,EAAK,MAAK,EAAA,EAAA,CAAA,EAAA,IAAA,GAAA,EAAA,EAAA,GAAA"}
@@ -0,0 +1,8 @@
1
+ import e from "./design-system85.js";
2
+ /* empty css */
3
+ //#region src/components/BDropdown/BDropdown.vue
4
+ var t = e;
5
+ //#endregion
6
+ export { t as default };
7
+
8
+ //# sourceMappingURL=design-system87.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-system87.js","names":[],"sources":["../src/components/BDropdown/BDropdown.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useComponentId } from '@/composables/useComponentId.ts';\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useId, watch } from 'vue';\n\nimport type { BDropdownMenuItem, BDropdownMenuProps } from './types.ts';\nimport { BDropdownPlacement, BDropdownTrigger } from './types.ts';\n\nconst {\n trigger = BDropdownTrigger.Hover,\n placement = BDropdownPlacement.BottomLeft,\n arrow = false,\n disabled = false,\n destroyOnHidden = false,\n mouseEnterDelay = 100,\n mouseLeaveDelay = 100,\n menu,\n modelValue = undefined,\n} = defineProps<{\n /** The trigger mode which executes the dropdown action. */\n trigger?: `${BDropdownTrigger}`;\n /** Placement of popup menu. */\n placement?: `${BDropdownPlacement}`;\n /** Whether to show the dropdown chevron indicator next to the trigger. */\n arrow?: boolean;\n /** Whether the dropdown menu is disabled. */\n disabled?: boolean;\n /** Whether to destroy popup on hide. */\n destroyOnHidden?: boolean;\n /** Delay in ms before showing on mouseenter (hover trigger only). */\n mouseEnterDelay?: number;\n /** Delay in ms before hiding on mouseleave (hover trigger only). */\n mouseLeaveDelay?: number;\n /** Menu configuration: items, selectable, multiple, selectedKeys. */\n menu?: BDropdownMenuProps;\n /** Controlled open state - bind with `v-model:open`. */\n modelValue?: boolean;\n}>();\n\nconst emit = defineEmits<{\n /** Emitted when the dropdown visibility changes. */\n (e: 'openChange', open: boolean): void;\n /** v-model:open support. */\n (e: 'update:modelValue', value: boolean): void;\n /** Emitted when a menu item is clicked. */\n (e: 'menuClick', info: { key: string | number; item: BDropdownMenuItem }): void;\n}>();\n\ndefineSlots<{\n /** The trigger element. Receives `triggerProps` to bind ARIA attributes. */\n default?(props: { triggerProps: Record<string, unknown> }): unknown;\n /** Custom overlay content (replaces default menu rendering). */\n overlay?(): unknown;\n}>();\n\n// ─────────────────────────────────────────────\n// Internal state\n// ─────────────────────────────────────────────\nconst { componentUID } = useComponentId();\nconst dropdownId = useId();\nconst menuId = `${dropdownId}-menu`;\n\nconst internalOpen = ref(false);\nconst isOpen = computed(() => (modelValue !== undefined ? modelValue : internalOpen.value));\n\nconst shouldRender = computed(() => {\n if (destroyOnHidden) return isOpen.value;\n return true;\n});\n\n// ─────────────────────────────────────────────\n// Visibility control\n// ─────────────────────────────────────────────\nlet showTimer: ReturnType<typeof setTimeout> | null = null;\nlet hideTimer: ReturnType<typeof setTimeout> | null = null;\n\nfunction clearTimers() {\n if (showTimer) {\n clearTimeout(showTimer);\n showTimer = null;\n }\n if (hideTimer) {\n clearTimeout(hideTimer);\n hideTimer = null;\n }\n}\n\nfunction requestOpen(delay = 0) {\n if (disabled) return;\n clearTimers();\n if (isOpen.value) return;\n if (delay > 0) {\n showTimer = setTimeout(() => doOpen(), delay);\n } else {\n doOpen();\n }\n}\n\nfunction requestClose(delay = 0) {\n clearTimers();\n if (!isOpen.value) return;\n if (delay > 0) {\n hideTimer = setTimeout(() => doClose(), delay);\n } else {\n doClose();\n }\n}\n\nfunction doOpen() {\n popoverRef.value?.showPopover();\n}\n\nfunction doClose() {\n popoverRef.value?.hidePopover();\n}\n\nfunction setOpen(val: boolean) {\n if (modelValue !== undefined) {\n emit('update:modelValue', val);\n } else {\n internalOpen.value = val;\n }\n emit('openChange', val);\n}\n\n// ─────────────────────────────────────────────\n// Popover toggle event\n// ─────────────────────────────────────────────\nconst onPopoverToggle = ({ newState }: ToggleEvent) => {\n setOpen(newState === 'open');\n};\n\n// ─────────────────────────────────────────────\n// Refs\n// ─────────────────────────────────────────────\nconst popoverRef = ref<HTMLDivElement | null>(null);\nconst toggleRef = ref<HTMLDivElement | null>(null);\n\n// ─────────────────────────────────────────────\n// Focus management\n// ─────────────────────────────────────────────\nlet previouslyFocusedElement: HTMLElement | null = null;\nconst focusedIndex = ref(-1);\n\nconst focusableSelector = '[role=\"menuitem\"]:not([aria-disabled=\"true\"])';\n\nfunction getFocusableItems(): HTMLElement[] {\n if (!popoverRef.value) return [];\n return Array.from(popoverRef.value.querySelectorAll<HTMLElement>(focusableSelector));\n}\n\nfunction focusItem(index: number) {\n const items = getFocusableItems();\n if (items.length === 0) return;\n const clamped = Math.max(0, Math.min(index, items.length - 1));\n focusedIndex.value = clamped;\n items[clamped]?.focus();\n}\n\nfunction focusFirst() {\n nextTick(() => focusItem(0));\n}\n\nfunction focusLast() {\n nextTick(() => {\n const items = getFocusableItems();\n focusItem(items.length - 1);\n });\n}\n\nwatch(isOpen, (val) => {\n if (val) {\n previouslyFocusedElement = document.activeElement as HTMLElement | null;\n focusFirst();\n } else {\n focusedIndex.value = -1;\n if (previouslyFocusedElement) {\n nextTick(() => previouslyFocusedElement?.focus());\n }\n }\n});\n\n// ─────────────────────────────────────────────\n// Menu item click\n// ─────────────────────────────────────────────\nfunction onItemClick(item: BDropdownMenuItem) {\n if (item.disabled) return;\n emit('menuClick', { key: item.key, item });\n requestClose();\n}\n\n// ─────────────────────────────────────────────\n// Event handlers\n// ─────────────────────────────────────────────\nfunction onClick() {\n if (disabled) return;\n if (isOpen.value) {\n requestClose();\n } else {\n requestOpen();\n }\n}\n\nfunction onContextMenu(event: MouseEvent) {\n if (disabled) return;\n event.preventDefault();\n if (isOpen.value) {\n requestClose();\n } else {\n requestOpen();\n }\n}\n\nfunction onMouseEnter() {\n if (disabled) return;\n requestOpen(mouseEnterDelay);\n}\n\nfunction onMouseLeave() {\n requestClose(mouseLeaveDelay);\n}\n\nfunction onTriggerKeydown(event: KeyboardEvent) {\n if (disabled) return;\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault();\n if (!isOpen.value) {\n requestOpen();\n nextTick(() => focusFirst());\n } else {\n focusFirst();\n }\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (!isOpen.value) {\n requestOpen();\n nextTick(() => focusLast());\n } else {\n focusLast();\n }\n break;\n case 'Escape':\n if (isOpen.value) {\n event.preventDefault();\n requestClose();\n }\n break;\n }\n}\n\nfunction onMenuKeydown(event: KeyboardEvent) {\n const items = getFocusableItems();\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n focusItem(currentIndex < items.length - 1 ? currentIndex + 1 : 0);\n break;\n case 'ArrowUp':\n event.preventDefault();\n focusItem(currentIndex > 0 ? currentIndex - 1 : items.length - 1);\n break;\n case 'Home':\n event.preventDefault();\n focusItem(0);\n break;\n case 'End':\n event.preventDefault();\n focusItem(items.length - 1);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (document.activeElement) {\n (document.activeElement as HTMLElement).click();\n }\n break;\n case 'Escape':\n event.preventDefault();\n requestClose();\n break;\n case 'Tab':\n requestClose();\n break;\n }\n}\n\n// ─────────────────────────────────────────────\n// Popover hover (keep open when hovering content)\n// ─────────────────────────────────────────────\nfunction onPopoverMouseEnter() {\n if (trigger === BDropdownTrigger.Hover) {\n clearTimers();\n }\n}\n\nfunction onPopoverMouseLeave() {\n if (trigger === BDropdownTrigger.Hover) {\n requestClose(mouseLeaveDelay);\n }\n}\n\n// ─────────────────────────────────────────────\n// Click outside handler\n// ─────────────────────────────────────────────\nfunction onDocumentClick(event: MouseEvent) {\n if (!isOpen.value) return;\n const target = event.target as Node;\n if (toggleRef.value?.contains(target)) return;\n if (popoverRef.value?.contains(target)) return;\n requestClose();\n}\n\n// ─────────────────────────────────────────────\n// Event listener management\n// ─────────────────────────────────────────────\nfunction attachListeners() {\n const el = toggleRef.value;\n if (!el) return;\n\n el.addEventListener('keydown', onTriggerKeydown);\n\n switch (trigger) {\n case BDropdownTrigger.Click:\n el.addEventListener('click', onClick);\n break;\n case BDropdownTrigger.ContextMenu:\n el.addEventListener('contextmenu', onContextMenu);\n break;\n case BDropdownTrigger.Hover:\n default:\n el.addEventListener('mouseenter', onMouseEnter);\n el.addEventListener('mouseleave', onMouseLeave);\n break;\n }\n}\n\nfunction detachListeners() {\n const el = toggleRef.value;\n if (!el) return;\n\n el.removeEventListener('keydown', onTriggerKeydown);\n el.removeEventListener('click', onClick);\n el.removeEventListener('contextmenu', onContextMenu);\n el.removeEventListener('mouseenter', onMouseEnter);\n el.removeEventListener('mouseleave', onMouseLeave);\n}\n\nonMounted(() => {\n attachListeners();\n});\n\nonBeforeUnmount(() => {\n detachListeners();\n document.removeEventListener('click', onDocumentClick, true);\n clearTimers();\n});\n\nwatch(isOpen, (val) => {\n if (val) {\n document.addEventListener('click', onDocumentClick, true);\n } else {\n document.removeEventListener('click', onDocumentClick, true);\n }\n});\n\nwatch(\n () => trigger,\n () => {\n detachListeners();\n attachListeners();\n },\n);\n\nwatch(\n () => modelValue,\n (val) => {\n if (val === undefined) return;\n if (val) {\n popoverRef.value?.showPopover();\n } else {\n popoverRef.value?.hidePopover();\n }\n },\n);\n\n// ─────────────────────────────────────────────\n// Computed styles\n// ─────────────────────────────────────────────\nconst anchorName = computed(() => `--b-dropdown-anchor-${componentUID.value}`);\n\nconst placementClass = computed(() => {\n const map: Record<string, string> = {\n [BDropdownPlacement.Bottom]: 'bottom-center',\n [BDropdownPlacement.BottomLeft]: 'bottom-left',\n [BDropdownPlacement.BottomRight]: 'bottom-right',\n [BDropdownPlacement.Top]: 'top-center',\n [BDropdownPlacement.TopLeft]: 'top-left',\n [BDropdownPlacement.TopRight]: 'top-right',\n };\n return map[placement] ?? 'bottom-left';\n});\n\nconst menuItems = computed(() => menu?.items ?? []);\n\nconst triggerProps = computed(() => ({\n id: dropdownId,\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': isOpen.value,\n 'aria-disabled': disabled || undefined,\n}));\n\n// ─────────────────────────────────────────────\n// Public API\n// ─────────────────────────────────────────────\ndefineExpose({ open: doOpen, close: doClose });\n</script>\n\n<template>\n <div\n ref=\"toggleRef\"\n :class=\"['b-dropdown__toggle', { 'b-dropdown__toggle--open': isOpen }]\"\n :style=\"{ anchorName: anchorName }\"\n >\n <slot :trigger-props=\"triggerProps\" />\n <span v-if=\"arrow\" class=\"b-dropdown__indicator\" aria-hidden=\"true\" />\n </div>\n\n <div\n ref=\"popoverRef\"\n popover=\"manual\"\n :class=\"['b-dropdown', placementClass]\"\n :style=\"{ positionAnchor: anchorName }\"\n :id=\"menuId\"\n role=\"menu\"\n :aria-labelledby=\"dropdownId\"\n tabindex=\"-1\"\n @toggle=\"onPopoverToggle\"\n @keydown=\"onMenuKeydown\"\n @mouseenter=\"onPopoverMouseEnter\"\n @mouseleave=\"onPopoverMouseLeave\"\n >\n <template v-if=\"shouldRender\">\n <div class=\"b-dropdown__content\">\n <slot name=\"overlay\">\n <template v-for=\"item in menuItems\" :key=\"item.key\">\n <div v-if=\"item.type === 'divider'\" class=\"b-dropdown__divider\" role=\"separator\" />\n <div\n v-else-if=\"item.type === 'group'\"\n class=\"b-dropdown__group\"\n role=\"group\"\n :aria-label=\"item.title\"\n >\n <div class=\"b-dropdown__group-title\">{{ item.title }}</div>\n <div\n v-for=\"child in item.children\"\n :key=\"child.key\"\n :class=\"[\n 'b-dropdown__item',\n { 'b-dropdown__item--disabled': child.disabled },\n { 'b-dropdown__item--danger': child.danger },\n { 'b-dropdown__item--selected': menu?.selectedKeys?.includes(child.key) },\n ]\"\n role=\"menuitem\"\n :tabindex=\"child.disabled ? -1 : 0\"\n :aria-disabled=\"child.disabled || undefined\"\n @click=\"onItemClick(child)\"\n >\n <span v-if=\"child.icon\" class=\"b-dropdown__item-icon\" aria-hidden=\"true\">{{\n child.icon\n }}</span>\n <span class=\"b-dropdown__item-label\">{{ child.label }}</span>\n </div>\n </div>\n <div\n v-else\n :class=\"[\n 'b-dropdown__item',\n { 'b-dropdown__item--disabled': item.disabled },\n { 'b-dropdown__item--danger': item.danger },\n { 'b-dropdown__item--selected': menu?.selectedKeys?.includes(item.key) },\n ]\"\n role=\"menuitem\"\n :tabindex=\"item.disabled ? -1 : 0\"\n :aria-disabled=\"item.disabled || undefined\"\n @click=\"onItemClick(item)\"\n >\n <span v-if=\"item.icon\" class=\"b-dropdown__item-icon\" aria-hidden=\"true\">{{\n item.icon\n }}</span>\n <span class=\"b-dropdown__item-label\">{{ item.label }}</span>\n </div>\n </template>\n </slot>\n </div>\n </template>\n </div>\n</template>\n\n<style>\n/* ────────────────────────────────────────────\n CSS Custom Properties (tokens)\n ──────────────────────────────────────────── */\n.b-dropdown {\n --b-dropdown-z-index: 1050;\n --b-dropdown-bg: #fff;\n --b-dropdown-color: rgba(0, 0, 0, 0.88);\n --b-dropdown-border-radius: 8px;\n --b-dropdown-padding-block: 4px;\n --b-dropdown-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n --b-dropdown-font-size: 14px;\n --b-dropdown-line-height: 1.5714;\n --b-dropdown-min-width: 120px;\n --b-dropdown-max-width: 320px;\n --b-dropdown-gap: 4px;\n --b-dropdown-transition-duration: 200ms;\n\n --b-dropdown-item-padding-x: 12px;\n --b-dropdown-item-padding-y: 5px;\n --b-dropdown-item-border-radius: 4px;\n --b-dropdown-item-color: rgba(0, 0, 0, 0.88);\n --b-dropdown-item-hover-bg: rgba(0, 0, 0, 0.04);\n --b-dropdown-item-active-bg: rgba(0, 0, 0, 0.06);\n --b-dropdown-item-disabled-color: rgba(0, 0, 0, 0.25);\n --b-dropdown-item-danger-color: #ff4d4f;\n --b-dropdown-item-danger-hover-bg: #fff2f0;\n --b-dropdown-item-selected-bg: #e6f4ff;\n --b-dropdown-item-selected-color: #1677ff;\n --b-dropdown-item-icon-margin-right: 8px;\n --b-dropdown-item-icon-size: 14px;\n\n --b-dropdown-divider-color: rgba(5, 5, 5, 0.06);\n --b-dropdown-divider-margin: 4px 0;\n\n --b-dropdown-group-title-color: rgba(0, 0, 0, 0.45);\n --b-dropdown-group-title-font-size: 12px;\n --b-dropdown-group-title-padding: 5px 12px;\n}\n\n/* ── Dark mode ── */\n[data-prefers-color='dark'] .b-dropdown {\n --b-dropdown-bg: #1f1f1f;\n --b-dropdown-color: rgba(255, 255, 255, 0.85);\n --b-dropdown-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.24), 0 3px 6px -4px rgba(0, 0, 0, 0.36),\n 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n --b-dropdown-item-color: rgba(255, 255, 255, 0.85);\n --b-dropdown-item-hover-bg: rgba(255, 255, 255, 0.08);\n --b-dropdown-item-active-bg: rgba(255, 255, 255, 0.12);\n --b-dropdown-item-disabled-color: rgba(255, 255, 255, 0.25);\n --b-dropdown-item-danger-color: #ff7875;\n --b-dropdown-item-danger-hover-bg: rgba(255, 77, 79, 0.12);\n --b-dropdown-item-selected-bg: rgba(22, 119, 255, 0.15);\n --b-dropdown-item-selected-color: #4096ff;\n --b-dropdown-divider-color: rgba(253, 253, 253, 0.12);\n --b-dropdown-group-title-color: rgba(255, 255, 255, 0.45);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-dropdown {\n --b-dropdown-bg: #1f1f1f;\n --b-dropdown-color: rgba(255, 255, 255, 0.85);\n --b-dropdown-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.24), 0 3px 6px -4px rgba(0, 0, 0, 0.36),\n 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n --b-dropdown-item-color: rgba(255, 255, 255, 0.85);\n --b-dropdown-item-hover-bg: rgba(255, 255, 255, 0.08);\n --b-dropdown-item-active-bg: rgba(255, 255, 255, 0.12);\n --b-dropdown-item-disabled-color: rgba(255, 255, 255, 0.25);\n --b-dropdown-item-danger-color: #ff7875;\n --b-dropdown-item-danger-hover-bg: rgba(255, 77, 79, 0.12);\n --b-dropdown-item-selected-bg: rgba(22, 119, 255, 0.15);\n --b-dropdown-item-selected-color: #4096ff;\n --b-dropdown-divider-color: rgba(253, 253, 253, 0.12);\n --b-dropdown-group-title-color: rgba(255, 255, 255, 0.45);\n }\n}\n\n/* ─────────────────────────────────────────────\n Toggle wrapper\n ───────────────────────────────────────────── */\n.b-dropdown__toggle {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n\n &[aria-disabled='true'] {\n cursor: not-allowed;\n opacity: 0.5;\n }\n}\n\n/* ─────────────────────────────────────────────\n Chevron indicator (CSS-only)\n ───────────────────────────────────────────── */\n.b-dropdown__indicator {\n display: inline-block;\n width: 0.625em;\n height: 0.625em;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n transform: rotate(45deg) translateY(-2px);\n transition: transform 200ms;\n opacity: 0.65;\n flex-shrink: 0;\n}\n\n.b-dropdown__toggle--open .b-dropdown__indicator {\n transform: rotate(-135deg) translateY(-1px);\n}\n\n/* ─────────────────────────────────────────────\n Dropdown popover\n ───────────────────────────────────────────── */\n.b-dropdown {\n position: absolute;\n border: none;\n padding: 0;\n margin: 0;\n background: transparent;\n overflow: visible;\n z-index: var(--b-dropdown-z-index);\n min-width: var(--b-dropdown-min-width);\n max-width: var(--b-dropdown-max-width);\n box-sizing: border-box;\n pointer-events: auto;\n\n transition:\n display var(--b-dropdown-transition-duration),\n opacity var(--b-dropdown-transition-duration);\n transition-behavior: allow-discrete;\n opacity: 0;\n\n &:popover-open {\n opacity: 1;\n\n @starting-style {\n opacity: 0;\n }\n }\n\n /* ── Placement: Bottom ── */\n &.bottom-left {\n inset: auto;\n top: anchor(bottom);\n left: anchor(left);\n margin-top: var(--b-dropdown-gap);\n }\n &.bottom-center {\n inset: auto;\n top: anchor(bottom);\n justify-self: anchor-center;\n margin-top: var(--b-dropdown-gap);\n }\n &.bottom-right {\n inset: auto;\n top: anchor(bottom);\n right: anchor(right);\n margin-top: var(--b-dropdown-gap);\n }\n\n /* ── Placement: Top ── */\n &.top-left {\n inset: auto;\n bottom: anchor(top);\n left: anchor(left);\n margin-bottom: var(--b-dropdown-gap);\n }\n &.top-center {\n inset: auto;\n bottom: anchor(top);\n justify-self: anchor-center;\n margin-bottom: var(--b-dropdown-gap);\n }\n &.top-right {\n inset: auto;\n bottom: anchor(top);\n right: anchor(right);\n margin-bottom: var(--b-dropdown-gap);\n }\n}\n\n/* ─────────────────────────────────────────────\n Content wrapper\n ───────────────────────────────────────────── */\n.b-dropdown__content {\n background: var(--b-dropdown-bg);\n color: var(--b-dropdown-color);\n font-size: var(--b-dropdown-font-size);\n line-height: var(--b-dropdown-line-height);\n padding: var(--b-dropdown-padding-block) 0;\n border-radius: var(--b-dropdown-border-radius);\n box-shadow: var(--b-dropdown-shadow);\n overflow: hidden auto;\n max-height: 60vh;\n}\n\n/* ─────────────────────────────────────────────\n Menu items\n ───────────────────────────────────────────── */\n.b-dropdown__item {\n display: flex;\n align-items: center;\n padding: var(--b-dropdown-item-padding-y) var(--b-dropdown-item-padding-x);\n margin: 0 4px;\n border-radius: var(--b-dropdown-item-border-radius);\n color: var(--b-dropdown-item-color);\n cursor: pointer;\n user-select: none;\n outline: none;\n transition: background-color 150ms;\n\n &:hover,\n &:focus-visible {\n background: var(--b-dropdown-item-hover-bg);\n }\n\n &:active {\n background: var(--b-dropdown-item-active-bg);\n }\n\n &--disabled {\n color: var(--b-dropdown-item-disabled-color);\n cursor: not-allowed;\n pointer-events: none;\n }\n\n &--danger {\n color: var(--b-dropdown-item-danger-color);\n\n &:hover,\n &:focus-visible {\n background: var(--b-dropdown-item-danger-hover-bg);\n }\n }\n\n &--selected {\n background: var(--b-dropdown-item-selected-bg);\n color: var(--b-dropdown-item-selected-color);\n }\n}\n\n.b-dropdown__item-icon {\n margin-right: var(--b-dropdown-item-icon-margin-right);\n font-size: var(--b-dropdown-item-icon-size);\n display: inline-flex;\n align-items: center;\n}\n\n.b-dropdown__item-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* ─────────────────────────────────────────────\n Divider\n ───────────────────────────────────────────── */\n.b-dropdown__divider {\n height: 1px;\n margin: var(--b-dropdown-divider-margin);\n background: var(--b-dropdown-divider-color);\n}\n\n/* ─────────────────────────────────────────────\n Group\n ───────────────────────────────────────────── */\n.b-dropdown__group-title {\n padding: var(--b-dropdown-group-title-padding);\n color: var(--b-dropdown-group-title-color);\n font-size: var(--b-dropdown-group-title-font-size);\n font-weight: 500;\n}\n\n/* ─────────────────────────────────────────────\n Position fallbacks\n ───────────────────────────────────────────── */\n@position-try --b-dropdown-bottom {\n inset: auto;\n top: anchor(bottom);\n left: anchor(left);\n margin-top: var(--b-dropdown-gap);\n}\n\n@position-try --b-dropdown-top {\n inset: auto;\n bottom: anchor(top);\n left: anchor(left);\n margin-bottom: var(--b-dropdown-gap);\n}\n\n/* ── Reduced motion ── */\n@media (prefers-reduced-motion: reduce) {\n .b-dropdown {\n transition-duration: 0ms;\n }\n\n .b-dropdown__item {\n transition-duration: 0ms;\n }\n}\n</style>\n"],"mappings":""}
@@ -1,8 +1,60 @@
1
- import e from "./design-system86.js";
2
- /* empty css */
3
- //#region src/components/BFloatButton/BFloatButtonBackTop.vue
4
- var t = e;
1
+ import { BEmptyImage as e } from "./design-system3.js";
2
+ import { computed as t, createCommentVNode as n, createElementBlock as r, createElementVNode as i, createStaticVNode as a, createTextVNode as o, defineComponent as s, normalizeClass as c, normalizeStyle as l, openBlock as u, renderSlot as d, toDisplayString as f, unref as p, useSlots as m } from "vue";
3
+ //#region src/components/BEmpty/BEmpty.vue?vue&type=script&setup=true&lang.ts
4
+ var h = ["aria-label"], g = {
5
+ key: 0,
6
+ class: "b-empty__svg b-empty__svg--default",
7
+ viewBox: "0 0 184 152",
8
+ xmlns: "http://www.w3.org/2000/svg",
9
+ "aria-hidden": "true",
10
+ focusable: "false"
11
+ }, _ = {
12
+ key: 1,
13
+ class: "b-empty__svg b-empty__svg--simple",
14
+ viewBox: "0 0 64 41",
15
+ xmlns: "http://www.w3.org/2000/svg",
16
+ "aria-hidden": "true",
17
+ focusable: "false"
18
+ }, v = ["src"], y = {
19
+ key: 0,
20
+ class: "b-empty__description"
21
+ }, b = {
22
+ key: 1,
23
+ class: "b-empty__footer"
24
+ }, x = /* @__PURE__ */ s({
25
+ __name: "BEmpty",
26
+ props: {
27
+ description: { default: "No data" },
28
+ hideDescription: {
29
+ type: Boolean,
30
+ default: !1
31
+ },
32
+ image: { default: e.Default },
33
+ imageStyle: {}
34
+ },
35
+ setup(s) {
36
+ let x = s, S = m(), C = t(() => x.image === e.Simple), w = t(() => x.image === e.Default || x.image === e.Simple), T = t(() => !w.value && typeof x.image == "string" && x.image.length > 0), E = t(() => S.description ? !0 : !x.hideDescription), D = t(() => x.description);
37
+ return (t, s) => (u(), r("div", {
38
+ class: c(["b-empty", { "b-empty--simple": C.value }]),
39
+ role: "status",
40
+ "aria-label": x.description || "No data"
41
+ }, [
42
+ i("div", {
43
+ class: "b-empty__image",
44
+ style: l(x.imageStyle)
45
+ }, [d(t.$slots, "image", {}, () => [x.image === p(e).Default ? (u(), r("svg", g, [...s[0] ||= [a("<g fill=\"none\" fill-rule=\"evenodd\"><g transform=\"translate(24 31.67)\"><ellipse class=\"b-empty__ellipse\" cx=\"67.797\" cy=\"106.89\" rx=\"67.797\" ry=\"12.668\"></ellipse><path class=\"b-empty__path-bg\" d=\"M122.034 69.674L98.109 40.229c-1.148-1.386-2.826-2.225-4.593-2.225h-51.44c-1.766 0-3.444.839-4.592 2.225L13.56 69.674v15.383h108.475V69.674z\"></path><path class=\"b-empty__path-main\" d=\"M101.537 86.214L80.63 61.102c-1.001-1.207-2.507-1.867-4.048-1.867H31.724c-1.54 0-3.047.66-4.048 1.867L6.769 86.214v13.792h94.768V86.214z\" transform=\"translate(13.56)\"></path><path class=\"b-empty__path-front\" d=\"M33.83 0h67.933a4 4 0 014 4v93.344H29.83V4a4 4 0 014-4z\"></path><path class=\"b-empty__path-panel\" d=\"M42.678 9.953h50.237a2 2 0 012 2V36.91h-54.237V11.953a2 2 0 012-2zM42.94 49.767h49.713a2.262 2.262 0 110 4.524H42.94a2.262 2.262 0 110-4.524zM42.94 61.53h49.713a2.262 2.262 0 110 4.525H42.94a2.262 2.262 0 010-4.525zM121.813 105.032c-.775 3.071-3.497 5.36-6.735 5.36H20.515c-3.238 0-5.96-2.29-6.734-5.36a7.309 7.309 0 01-.222-1.79V69.675h26.318c2.907 0 5.25 2.448 5.25 5.42v.04c0 2.971 2.37 5.37 5.277 5.37h34.785c2.907 0 5.277-2.421 5.277-5.393 0-2.972 2.343-5.426 5.25-5.426h26.318v33.569c0 .617-.077 1.216-.221 1.789z\"></path></g><path class=\"b-empty__path-dot\" d=\"M149.121 33.292l-6.83 2.65a1 1 0 01-1.317-1.23l1.937-6.207c-2.589-2.944-4.109-6.534-4.109-10.408C138.802 8.102 148.92 0 161.402 0 173.881 0 184 8.102 184 18.097c0 9.995-10.118 18.097-22.599 18.097-4.528 0-8.744-1.066-12.28-2.902z\"></path><g class=\"b-empty__path-dots-group\" transform=\"translate(149.65 15.383)\"><ellipse cx=\"20.654\" cy=\"3.167\" rx=\"2.849\" ry=\"2.815\"></ellipse><path d=\"M5.698 5.63H0L2.898.704zM9.259.704h4.985V5.63H9.259z\"></path></g></g>", 1)]])) : x.image === p(e).Simple ? (u(), r("svg", _, [...s[1] ||= [a("<g transform=\"translate(0 1)\" fill=\"none\" fill-rule=\"evenodd\"><ellipse class=\"b-empty__simple-ellipse\" cx=\"32\" cy=\"33\" rx=\"32\" ry=\"7\"></ellipse><g class=\"b-empty__simple-group\" fill-rule=\"nonzero\"><path d=\"M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46V12.76z\"></path><path class=\"b-empty__simple-inner\" d=\"M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z\"></path></g></g>", 1)]])) : T.value ? (u(), r("img", {
46
+ key: 2,
47
+ src: x.image,
48
+ alt: "",
49
+ class: "b-empty__custom-image",
50
+ "aria-hidden": "true"
51
+ }, null, 8, v)) : n("", !0)])], 4),
52
+ E.value ? (u(), r("div", y, [d(t.$slots, "description", {}, () => [o(f(D.value), 1)])])) : n("", !0),
53
+ S.default ? (u(), r("div", b, [d(t.$slots, "default")])) : n("", !0)
54
+ ], 10, h));
55
+ }
56
+ });
5
57
  //#endregion
6
- export { t as default };
58
+ export { x as default };
7
59
 
8
60
  //# sourceMappingURL=design-system88.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"design-system88.js","names":[],"sources":["../src/components/BFloatButton/BFloatButtonBackTop.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref } from 'vue';\nimport BFloatButton from './BFloatButton.vue';\nimport { BFloatButtonShape, BFloatButtonType } from './types.ts';\n\n// ─────────────────────────────────────────────\n// Props & emits\n// ─────────────────────────────────────────────\nconst {\n duration = 450,\n target,\n visibilityHeight = 400,\n shape = BFloatButtonShape.Circle,\n type = BFloatButtonType.Default,\n} = defineProps<{\n /**\n * Scroll animation duration in milliseconds.\n * @default 450\n */\n duration?: number;\n /**\n * A function that returns the scrollable container.\n * Defaults to `window`. May return `null` (e.g. if the element hasn't mounted yet).\n */\n target?: () => HTMLElement | Window | null;\n /**\n * The button becomes visible when the scroll position exceeds this value (px).\n * @default 400\n */\n visibilityHeight?: number;\n /**\n * Shape of the back-top button.\n * @default 'circle'\n */\n shape?: `${BFloatButtonShape}`;\n /**\n * Type of the back-top button.\n * @default 'default'\n */\n type?: `${BFloatButtonType}`;\n}>();\n\nconst emit = defineEmits<{\n /** Emitted when the back-top button is clicked. */\n (e: 'click', event: MouseEvent): void;\n}>();\n\ndefineSlots<{\n /** Custom content for the button. If omitted, renders an up-arrow icon. */\n default?(): unknown;\n}>();\n\n// ─────────────────────────────────────────────\n// Scroll logic\n// ─────────────────────────────────────────────\nconst visible = ref(false);\nlet scrollContainer: HTMLElement | Window = window;\n\nfunction getScrollTop(): number {\n if (scrollContainer === window) return window.scrollY;\n return (scrollContainer as HTMLElement).scrollTop;\n}\n\nfunction onScroll() {\n visible.value = getScrollTop() > visibilityHeight;\n}\n\nfunction easeInOutCubic(t: number): number {\n return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n}\n\nfunction scrollToTop() {\n const startTime = performance.now();\n const startTop = getScrollTop();\n\n function step(now: number) {\n const elapsed = now - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const eased = easeInOutCubic(progress);\n const newTop = startTop * (1 - eased);\n\n if (scrollContainer === window) {\n window.scrollTo(0, newTop);\n } else {\n (scrollContainer as HTMLElement).scrollTop = newTop;\n }\n\n if (progress < 1) {\n requestAnimationFrame(step);\n }\n }\n\n requestAnimationFrame(step);\n}\n\nfunction handleClick(event: MouseEvent) {\n scrollToTop();\n emit('click', event);\n}\n\nonMounted(() => {\n scrollContainer = target?.() ?? window;\n scrollContainer.addEventListener('scroll', onScroll, { passive: true });\n onScroll();\n});\n\nonBeforeUnmount(() => {\n scrollContainer.removeEventListener('scroll', onScroll);\n});\n\nconst isVisible = visible;\n</script>\n\n<template>\n <Transition name=\"b-float-button-backtop\">\n <BFloatButton\n v-if=\"isVisible\"\n :shape=\"shape\"\n :type=\"type\"\n aria-label=\"Back to top\"\n class=\"b-float-button-backtop\"\n @click=\"handleClick\"\n >\n <template #icon>\n <slot>\n <!-- Default: up arrow -->\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\" />\n </svg>\n </slot>\n </template>\n </BFloatButton>\n </Transition>\n</template>\n\n<style>\n/* ─────────────────────────────────────────────\n BackTop enter/leave transitions\n ───────────────────────────────────────────── */\n.b-float-button-backtop-enter-active,\n.b-float-button-backtop-leave-active {\n transition:\n opacity 300ms ease,\n transform 300ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.b-float-button-backtop-enter-from,\n.b-float-button-backtop-leave-to {\n opacity: 0;\n transform: scale(0.8);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .b-float-button-backtop-enter-active,\n .b-float-button-backtop-leave-active {\n transition-duration: 0ms;\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"design-system88.js","names":[],"sources":["../src/components/BEmpty/BEmpty.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { BEmptyImage } from '@/types.ts';\nimport { computed } from 'vue';\n\n// ─────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────\nconst props = withDefaults(\n defineProps<{\n /**\n * Customize description text. Pass empty string to show no text,\n * or set hideDescription to true to hide the description entirely.\n */\n description?: string;\n /**\n * Set to true to hide the description area completely.\n * @default false\n */\n hideDescription?: boolean;\n /**\n * Image type or custom image URL string.\n * Use BEmptyImage.Default for the detailed illustration or\n * BEmptyImage.Simple for the minimal version.\n * @default BEmptyImage.Default\n */\n image?: `${BEmptyImage}` | string;\n /**\n * Inline styles applied to the image element.\n */\n imageStyle?: Record<string, string>;\n }>(),\n {\n description: 'No data',\n hideDescription: false,\n image: BEmptyImage.Default,\n },\n);\n\n// ─────────────────────────────────────────────\n// Slots\n// ─────────────────────────────────────────────\nconst slots = defineSlots<{\n /** Default slot: action content below description (e.g. button). */\n default?(): unknown;\n /** Custom description content, overrides the description prop. */\n description?(): unknown;\n /** Custom image content, overrides the image prop entirely. */\n image?(): unknown;\n}>();\n\n// ─────────────────────────────────────────────\n// Derived state\n// ─────────────────────────────────────────────\nconst isSimple = computed(() => props.image === BEmptyImage.Simple);\n\nconst isBuiltInImage = computed(\n () => props.image === BEmptyImage.Default || props.image === BEmptyImage.Simple,\n);\n\nconst isCustomUrl = computed(\n () => !isBuiltInImage.value && typeof props.image === 'string' && props.image.length > 0,\n);\n\nconst showDescription = computed(() => {\n if (slots.description) return true;\n return !props.hideDescription;\n});\n\nconst descriptionText = computed(() => {\n return props.description;\n});\n</script>\n\n<template>\n <div\n class=\"b-empty\"\n :class=\"{ 'b-empty--simple': isSimple }\"\n role=\"status\"\n :aria-label=\"props.description || 'No data'\"\n >\n <!-- Image -->\n <div class=\"b-empty__image\" :style=\"props.imageStyle\">\n <slot name=\"image\">\n <!-- Default built-in illustration -->\n <svg\n v-if=\"props.image === BEmptyImage.Default\"\n class=\"b-empty__svg b-empty__svg--default\"\n viewBox=\"0 0 184 152\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <g fill=\"none\" fill-rule=\"evenodd\">\n <g transform=\"translate(24 31.67)\">\n <ellipse class=\"b-empty__ellipse\" cx=\"67.797\" cy=\"106.89\" rx=\"67.797\" ry=\"12.668\" />\n <path\n class=\"b-empty__path-bg\"\n d=\"M122.034 69.674L98.109 40.229c-1.148-1.386-2.826-2.225-4.593-2.225h-51.44c-1.766 0-3.444.839-4.592 2.225L13.56 69.674v15.383h108.475V69.674z\"\n />\n <path\n class=\"b-empty__path-main\"\n d=\"M101.537 86.214L80.63 61.102c-1.001-1.207-2.507-1.867-4.048-1.867H31.724c-1.54 0-3.047.66-4.048 1.867L6.769 86.214v13.792h94.768V86.214z\"\n transform=\"translate(13.56)\"\n />\n <path\n class=\"b-empty__path-front\"\n d=\"M33.83 0h67.933a4 4 0 014 4v93.344H29.83V4a4 4 0 014-4z\"\n />\n <path\n class=\"b-empty__path-panel\"\n d=\"M42.678 9.953h50.237a2 2 0 012 2V36.91h-54.237V11.953a2 2 0 012-2zM42.94 49.767h49.713a2.262 2.262 0 110 4.524H42.94a2.262 2.262 0 110-4.524zM42.94 61.53h49.713a2.262 2.262 0 110 4.525H42.94a2.262 2.262 0 010-4.525zM121.813 105.032c-.775 3.071-3.497 5.36-6.735 5.36H20.515c-3.238 0-5.96-2.29-6.734-5.36a7.309 7.309 0 01-.222-1.79V69.675h26.318c2.907 0 5.25 2.448 5.25 5.42v.04c0 2.971 2.37 5.37 5.277 5.37h34.785c2.907 0 5.277-2.421 5.277-5.393 0-2.972 2.343-5.426 5.25-5.426h26.318v33.569c0 .617-.077 1.216-.221 1.789z\"\n />\n </g>\n <path\n class=\"b-empty__path-dot\"\n d=\"M149.121 33.292l-6.83 2.65a1 1 0 01-1.317-1.23l1.937-6.207c-2.589-2.944-4.109-6.534-4.109-10.408C138.802 8.102 148.92 0 161.402 0 173.881 0 184 8.102 184 18.097c0 9.995-10.118 18.097-22.599 18.097-4.528 0-8.744-1.066-12.28-2.902z\"\n />\n <g class=\"b-empty__path-dots-group\" transform=\"translate(149.65 15.383)\">\n <ellipse cx=\"20.654\" cy=\"3.167\" rx=\"2.849\" ry=\"2.815\" />\n <path d=\"M5.698 5.63H0L2.898.704zM9.259.704h4.985V5.63H9.259z\" />\n </g>\n </g>\n </svg>\n\n <!-- Simple built-in illustration -->\n <svg\n v-else-if=\"props.image === BEmptyImage.Simple\"\n class=\"b-empty__svg b-empty__svg--simple\"\n viewBox=\"0 0 64 41\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <g transform=\"translate(0 1)\" fill=\"none\" fill-rule=\"evenodd\">\n <ellipse class=\"b-empty__simple-ellipse\" cx=\"32\" cy=\"33\" rx=\"32\" ry=\"7\" />\n <g class=\"b-empty__simple-group\" fill-rule=\"nonzero\">\n <path\n d=\"M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46V12.76z\"\n />\n <path\n class=\"b-empty__simple-inner\"\n d=\"M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z\"\n />\n </g>\n </g>\n </svg>\n\n <!-- Custom URL image -->\n <img\n v-else-if=\"isCustomUrl\"\n :src=\"props.image\"\n alt=\"\"\n class=\"b-empty__custom-image\"\n aria-hidden=\"true\"\n />\n </slot>\n </div>\n\n <!-- Description -->\n <div v-if=\"showDescription\" class=\"b-empty__description\">\n <slot name=\"description\">\n {{ descriptionText }}\n </slot>\n </div>\n\n <!-- Footer / actions -->\n <div v-if=\"slots.default\" class=\"b-empty__footer\">\n <slot />\n </div>\n </div>\n</template>\n\n<style>\n/* ────────────────────────────────────────────\n CSS Custom Properties (tokens)\n ──────────────────────────────────────────── */\n.b-empty {\n /* Layout */\n --b-empty-padding: 32px 0;\n --b-empty-text-align: center;\n\n /* Image */\n --b-empty-image-height: 152px;\n --b-empty-image-height-simple: 35px;\n --b-empty-image-margin-bottom: 8px;\n --b-empty-image-opacity: 1;\n\n /* Default SVG colors */\n --b-empty-ellipse-fill: oklch(93% 0.005 260);\n --b-empty-path-bg-fill: oklch(95% 0.003 260);\n --b-empty-path-main-fill: oklch(97% 0.002 260);\n --b-empty-path-front-stroke: oklch(83% 0.01 260);\n --b-empty-path-front-fill: oklch(97% 0.002 260);\n --b-empty-path-panel-fill: oklch(93% 0.005 260);\n --b-empty-path-dot-fill: oklch(83% 0.01 260);\n --b-empty-path-dots-group-fill: oklch(100% 0 0);\n\n /* Simple SVG colors */\n --b-empty-simple-ellipse-fill: oklch(93% 0.005 260);\n --b-empty-simple-group-stroke: oklch(83% 0.01 260);\n --b-empty-simple-group-fill: oklch(97% 0.002 260);\n --b-empty-simple-inner-fill: oklch(93% 0.005 260);\n\n /* Description */\n --b-empty-description-color: oklch(55% 0.01 260);\n --b-empty-description-font-size: 14px;\n --b-empty-description-line-height: 1.572;\n --b-empty-description-margin-top: 8px;\n\n /* Footer */\n --b-empty-footer-margin-top: 16px;\n\n /* Animation */\n --b-empty-transition-duration: 200ms;\n}\n\n/* ── Dark mode ───────────────────────────────── */\n[data-prefers-color='dark'] .b-empty {\n --b-empty-ellipse-fill: oklch(25% 0.005 260);\n --b-empty-path-bg-fill: oklch(22% 0.005 260);\n --b-empty-path-main-fill: oklch(18% 0.003 260);\n --b-empty-path-front-stroke: oklch(40% 0.01 260);\n --b-empty-path-front-fill: oklch(20% 0.005 260);\n --b-empty-path-panel-fill: oklch(28% 0.005 260);\n --b-empty-path-dot-fill: oklch(40% 0.01 260);\n --b-empty-path-dots-group-fill: oklch(18% 0 0);\n\n --b-empty-simple-ellipse-fill: oklch(25% 0.005 260);\n --b-empty-simple-group-stroke: oklch(40% 0.01 260);\n --b-empty-simple-group-fill: oklch(20% 0.005 260);\n --b-empty-simple-inner-fill: oklch(28% 0.005 260);\n\n --b-empty-description-color: oklch(70% 0.01 260);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-empty {\n --b-empty-ellipse-fill: oklch(25% 0.005 260);\n --b-empty-path-bg-fill: oklch(22% 0.005 260);\n --b-empty-path-main-fill: oklch(18% 0.003 260);\n --b-empty-path-front-stroke: oklch(40% 0.01 260);\n --b-empty-path-front-fill: oklch(20% 0.005 260);\n --b-empty-path-panel-fill: oklch(28% 0.005 260);\n --b-empty-path-dot-fill: oklch(40% 0.01 260);\n --b-empty-path-dots-group-fill: oklch(18% 0 0);\n \n --b-empty-simple-ellipse-fill: oklch(25% 0.005 260);\n --b-empty-simple-group-stroke: oklch(40% 0.01 260);\n --b-empty-simple-group-fill: oklch(20% 0.005 260);\n --b-empty-simple-inner-fill: oklch(28% 0.005 260);\n \n --b-empty-description-color: oklch(70% 0.01 260);\n }\n}\n\n/* ─────────────────────────────────────────────\n Base layout\n ───────────────────────────────────────────── */\n.b-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: var(--b-empty-padding);\n text-align: var(--b-empty-text-align);\n box-sizing: border-box;\n}\n\n/* ─────────────────────────────────────────────\n Image area\n ───────────────────────────────────────────── */\n.b-empty__image {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--b-empty-image-height);\n margin-bottom: var(--b-empty-image-margin-bottom);\n opacity: var(--b-empty-image-opacity);\n}\n\n.b-empty--simple .b-empty__image {\n height: var(--b-empty-image-height-simple);\n}\n\n.b-empty__svg {\n width: auto;\n height: 100%;\n}\n\n.b-empty__custom-image {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n}\n\n/* ─────────────────────────────────────────────\n Default SVG illustration colors\n ───────────────────────────────────────────── */\n.b-empty__ellipse {\n fill: var(--b-empty-ellipse-fill);\n}\n\n.b-empty__path-bg {\n fill: var(--b-empty-path-bg-fill);\n}\n\n.b-empty__path-main {\n fill: var(--b-empty-path-main-fill);\n}\n\n.b-empty__path-front {\n stroke: var(--b-empty-path-front-stroke);\n fill: var(--b-empty-path-front-fill);\n}\n\n.b-empty__path-panel {\n fill: var(--b-empty-path-panel-fill);\n}\n\n.b-empty__path-dot {\n fill: var(--b-empty-path-dot-fill);\n}\n\n.b-empty__path-dots-group {\n fill: var(--b-empty-path-dots-group-fill);\n}\n\n/* ─────────────────────────────────────────────\n Simple SVG illustration colors\n ───────────────────────────────────────────── */\n.b-empty__simple-ellipse {\n fill: var(--b-empty-simple-ellipse-fill);\n}\n\n.b-empty__simple-group {\n stroke: var(--b-empty-simple-group-stroke);\n fill: var(--b-empty-simple-group-fill);\n}\n\n.b-empty__simple-inner {\n fill: var(--b-empty-simple-inner-fill);\n}\n\n/* ─────────────────────────────────────────────\n Description\n ───────────────────────────────────────────── */\n.b-empty__description {\n color: var(--b-empty-description-color);\n font-size: var(--b-empty-description-font-size);\n line-height: var(--b-empty-description-line-height);\n margin-top: var(--b-empty-description-margin-top);\n}\n\n/* ─────────────────────────────────────────────\n Footer (actions area)\n ───────────────────────────────────────────── */\n.b-empty__footer {\n margin-top: var(--b-empty-footer-margin-top);\n}\n\n/* ─────────────────────────────────────────────\n Reduced motion\n ───────────────────────────────────────────── */\n@media (prefers-reduced-motion: reduce) {\n .b-empty {\n --b-empty-transition-duration: 0ms;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOA,IAAM,IAAQ,GAkCR,IAAQ,GAOV,EAKE,IAAW,QAAe,EAAM,UAAU,EAAY,OAAO,EAE7D,IAAiB,QACf,EAAM,UAAU,EAAY,WAAW,EAAM,UAAU,EAAY,OAC1E,EAEK,IAAc,QACZ,CAAC,EAAe,SAAS,OAAO,EAAM,SAAU,YAAY,EAAM,MAAM,SAAS,EACxF,EAEK,IAAkB,QAClB,EAAM,cAAoB,KACvB,CAAC,EAAM,gBACd,EAEI,IAAkB,QACf,EAAM,YACb;yBAIA,EA+FM,OAAA;GA9FJ,OAAK,EAAA,CAAC,WAAS,EAAA,mBACc,EAAA,OAAQ,CAAA,CAAA;GACrC,MAAK;GACJ,cAAY,EAAM,eAAW;;GAG9B,EA2EM,OAAA;IA3ED,OAAM;IAAkB,OAAK,EAAE,EAAM,WAAU;OAClD,EAyEO,EAAA,QAAA,SAAA,EAAA,QAAA,CAtEG,EAAM,UAAU,EAAA,EAAW,CAAC,WAAA,GAAA,EADpC,EAsCM,OAtCN,GAsCM,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAA,yuDAAA,EAAA,CAAA,CAAA,CAAA,IAIO,EAAM,UAAU,EAAA,EAAW,CAAC,UAAA,GAAA,EADzC,EAoBM,OApBN,GAoBM,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAA,uoBAAA,EAAA,CAAA,CAAA,CAAA,IAIO,EAAA,SAAA,GAAA,EADb,EAME,OAAA;;IAJC,KAAK,EAAM;IACZ,KAAI;IACJ,OAAM;IACN,eAAY;;GAMP,EAAA,SAAA,GAAA,EAAX,EAIM,OAJN,GAIM,CAHJ,EAEO,EAAA,QAAA,eAAA,EAAA,QAAA,CAAA,EAAA,EADF,EAAA,MAAe,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAAA,IAAA,GAAA;GAKX,EAAM,WAAA,GAAA,EAAjB,EAEM,OAFN,GAEM,CADJ,EAAQ,EAAA,QAAA,UAAA,CAAA,CAAA,IAAA,EAAA,IAAA,GAAA"}
@@ -0,0 +1,8 @@
1
+ import e from "./design-system88.js";
2
+ /* empty css */
3
+ //#region src/components/BEmpty/BEmpty.vue
4
+ var t = e;
5
+ //#endregion
6
+ export { t as default };
7
+
8
+ //# sourceMappingURL=design-system90.js.map