@7pmlabs/design-system 2.0.8 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/README.md +4 -4
  2. package/dist/design-system.css +1 -1
  3. package/dist/design-system.js +65 -59
  4. package/dist/design-system100.js +1 -1
  5. package/dist/design-system100.js.map +1 -1
  6. package/dist/design-system101.js +87 -53
  7. package/dist/design-system101.js.map +1 -1
  8. package/dist/design-system103.js +5 -13
  9. package/dist/design-system103.js.map +1 -1
  10. package/dist/design-system104.js +53 -108
  11. package/dist/design-system104.js.map +1 -1
  12. package/dist/{design-system102.js → design-system105.js} +1 -1
  13. package/dist/{design-system102.js.map → design-system105.js.map} +1 -1
  14. package/dist/design-system106.js +13 -6
  15. package/dist/design-system106.js.map +1 -1
  16. package/dist/design-system107.js +93 -190
  17. package/dist/design-system107.js.map +1 -1
  18. package/dist/design-system109.js +2 -2
  19. package/dist/design-system109.js.map +1 -1
  20. package/dist/design-system110.js +183 -484
  21. package/dist/design-system110.js.map +1 -1
  22. package/dist/design-system112.js +5 -4
  23. package/dist/design-system112.js.map +1 -1
  24. package/dist/design-system113.js +507 -7
  25. package/dist/design-system113.js.map +1 -1
  26. package/dist/design-system115.js +8 -0
  27. package/dist/design-system115.js.map +1 -0
  28. package/dist/design-system116.js +7 -6
  29. package/dist/design-system116.js.map +1 -1
  30. package/dist/design-system117.js +154 -169
  31. package/dist/design-system117.js.map +1 -1
  32. package/dist/design-system119.js +2 -2
  33. package/dist/design-system119.js.map +1 -1
  34. package/dist/design-system120.js +210 -149
  35. package/dist/design-system120.js.map +1 -1
  36. package/dist/design-system122.js +5 -4
  37. package/dist/design-system122.js.map +1 -1
  38. package/dist/design-system123.js +160 -9
  39. package/dist/design-system123.js.map +1 -1
  40. package/dist/design-system125.js +8 -0
  41. package/dist/design-system125.js.map +1 -0
  42. package/dist/design-system126.js +176 -6
  43. package/dist/design-system126.js.map +1 -1
  44. package/dist/design-system128.js +8 -0
  45. package/dist/design-system128.js.map +1 -0
  46. package/dist/design-system129.js +213 -5
  47. package/dist/design-system129.js.map +1 -1
  48. package/dist/design-system131.js +5 -90
  49. package/dist/design-system131.js.map +1 -1
  50. package/dist/design-system132.js +166 -0
  51. package/dist/design-system132.js.map +1 -0
  52. package/dist/design-system134.js +5 -42
  53. package/dist/design-system134.js.map +1 -1
  54. package/dist/design-system135.js +12 -0
  55. package/dist/design-system135.js.map +1 -0
  56. package/dist/design-system136.js +274 -5
  57. package/dist/design-system136.js.map +1 -1
  58. package/dist/design-system138.js +9 -0
  59. package/dist/{design-system124.js.map → design-system138.js.map} +1 -1
  60. package/dist/design-system139.js +16 -5
  61. package/dist/design-system139.js.map +1 -1
  62. package/dist/design-system141.js +8 -0
  63. package/dist/{design-system127.js.map → design-system141.js.map} +1 -1
  64. package/dist/design-system142.js +12 -5
  65. package/dist/design-system142.js.map +1 -1
  66. package/dist/design-system143.js +78 -83
  67. package/dist/design-system143.js.map +1 -1
  68. package/dist/design-system145.js +1 -1
  69. package/dist/design-system145.js.map +1 -1
  70. package/dist/design-system146.js +42 -9
  71. package/dist/design-system146.js.map +1 -1
  72. package/dist/design-system148.js +3 -2
  73. package/dist/design-system148.js.map +1 -1
  74. package/dist/design-system149.js +230 -18
  75. package/dist/design-system149.js.map +1 -1
  76. package/dist/design-system151.js +5 -158
  77. package/dist/design-system151.js.map +1 -1
  78. package/dist/{design-system140.js → design-system152.js} +6 -6
  79. package/dist/{design-system140.js.map → design-system152.js.map} +1 -1
  80. package/dist/design-system154.js +5 -307
  81. package/dist/design-system154.js.map +1 -1
  82. package/dist/design-system155.js +98 -0
  83. package/dist/design-system155.js.map +1 -0
  84. package/dist/design-system157.js +5 -240
  85. package/dist/design-system157.js.map +1 -1
  86. package/dist/design-system158.js +12 -0
  87. package/dist/design-system158.js.map +1 -0
  88. package/dist/design-system159.js +37 -5
  89. package/dist/design-system159.js.map +1 -1
  90. package/dist/design-system160.js +4 -189
  91. package/dist/design-system160.js.map +1 -1
  92. package/dist/design-system161.js +24 -0
  93. package/dist/{design-system150.js.map → design-system161.js.map} +1 -1
  94. package/dist/design-system162.js +2 -3
  95. package/dist/design-system162.js.map +1 -1
  96. package/dist/design-system163.js +158 -3
  97. package/dist/design-system163.js.map +1 -1
  98. package/dist/{design-system153.js → design-system165.js} +2 -2
  99. package/dist/{design-system153.js.map → design-system165.js.map} +1 -1
  100. package/dist/design-system166.js +307 -6
  101. package/dist/design-system166.js.map +1 -1
  102. package/dist/{design-system156.js → design-system168.js} +2 -2
  103. package/dist/{design-system156.js.map → design-system168.js.map} +1 -1
  104. package/dist/design-system169.js +167 -6
  105. package/dist/design-system169.js.map +1 -1
  106. package/dist/design-system171.js +8 -0
  107. package/dist/design-system171.js.map +1 -0
  108. package/dist/design-system172.js +240 -6
  109. package/dist/design-system172.js.map +1 -1
  110. package/dist/design-system174.js +8 -0
  111. package/dist/design-system174.js.map +1 -0
  112. package/dist/design-system175.js +189 -6
  113. package/dist/design-system175.js.map +1 -1
  114. package/dist/design-system177.js +8 -0
  115. package/dist/design-system177.js.map +1 -0
  116. package/dist/design-system178.js +3 -5
  117. package/dist/design-system178.js.map +1 -1
  118. package/dist/design-system179.js +58 -11
  119. package/dist/design-system179.js.map +1 -1
  120. package/dist/design-system181.js +9 -0
  121. package/dist/design-system181.js.map +1 -0
  122. package/dist/design-system182.js +56 -6
  123. package/dist/design-system182.js.map +1 -1
  124. package/dist/design-system184.js +9 -0
  125. package/dist/{design-system167.js.map → design-system184.js.map} +1 -1
  126. package/dist/design-system185.js +69 -5
  127. package/dist/design-system185.js.map +1 -1
  128. package/dist/design-system187.js +9 -0
  129. package/dist/{design-system170.js.map → design-system187.js.map} +1 -1
  130. package/dist/design-system188.js +182 -5
  131. package/dist/design-system188.js.map +1 -1
  132. package/dist/design-system190.js +9 -0
  133. package/dist/design-system190.js.map +1 -0
  134. package/dist/design-system191.js +115 -5
  135. package/dist/design-system191.js.map +1 -1
  136. package/dist/design-system193.js +8 -0
  137. package/dist/{design-system176.js.map → design-system193.js.map} +1 -1
  138. package/dist/design-system194.js +11 -5
  139. package/dist/design-system194.js.map +1 -1
  140. package/dist/design-system195.js +453 -24
  141. package/dist/design-system195.js.map +1 -1
  142. package/dist/design-system197.js +5 -4
  143. package/dist/design-system197.js.map +1 -1
  144. package/dist/design-system198.js +20 -16
  145. package/dist/design-system198.js.map +1 -1
  146. package/dist/design-system200.js +1 -1
  147. package/dist/design-system200.js.map +1 -1
  148. package/dist/design-system201.js +70 -314
  149. package/dist/design-system201.js.map +1 -1
  150. package/dist/design-system203.js +1 -1
  151. package/dist/design-system203.js.map +1 -1
  152. package/dist/design-system204.js +24 -89
  153. package/dist/design-system204.js.map +1 -1
  154. package/dist/design-system206.js +1 -1
  155. package/dist/design-system206.js.map +1 -1
  156. package/dist/design-system207.js +26 -17
  157. package/dist/design-system207.js.map +1 -1
  158. package/dist/design-system209.js +5 -3
  159. package/dist/design-system209.js.map +1 -1
  160. package/dist/design-system210.js +22 -408
  161. package/dist/design-system210.js.map +1 -1
  162. package/dist/design-system212.js +1 -1
  163. package/dist/design-system212.js.map +1 -1
  164. package/dist/design-system213.js +24 -52
  165. package/dist/design-system213.js.map +1 -1
  166. package/dist/design-system215.js +1 -1
  167. package/dist/design-system215.js.map +1 -1
  168. package/dist/design-system216.js +329 -85
  169. package/dist/design-system216.js.map +1 -1
  170. package/dist/design-system218.js +5 -108
  171. package/dist/design-system218.js.map +1 -1
  172. package/dist/design-system219.js +103 -0
  173. package/dist/design-system219.js.map +1 -0
  174. package/dist/design-system221.js +5 -106
  175. package/dist/design-system221.js.map +1 -1
  176. package/dist/design-system222.js +22 -0
  177. package/dist/{design-system208.js.map → design-system222.js.map} +1 -1
  178. package/dist/design-system223.js +4 -6
  179. package/dist/design-system223.js.map +1 -1
  180. package/dist/design-system224.js +3 -737
  181. package/dist/design-system224.js.map +1 -1
  182. package/dist/design-system225.js +422 -0
  183. package/dist/design-system225.js.map +1 -0
  184. package/dist/design-system227.js +5 -11
  185. package/dist/design-system227.js.map +1 -1
  186. package/dist/design-system228.js +51 -517
  187. package/dist/design-system228.js.map +1 -1
  188. package/dist/design-system230.js +1 -1
  189. package/dist/design-system230.js.map +1 -1
  190. package/dist/design-system231.js +88 -3
  191. package/dist/design-system231.js.map +1 -1
  192. package/dist/design-system232.js +4 -46
  193. package/dist/design-system232.js.map +1 -1
  194. package/dist/design-system233.js +108 -4
  195. package/dist/design-system233.js.map +1 -1
  196. package/dist/{design-system220.js → design-system235.js} +2 -2
  197. package/dist/{design-system220.js.map → design-system235.js.map} +1 -1
  198. package/dist/design-system236.js +106 -5
  199. package/dist/design-system236.js.map +1 -1
  200. package/dist/design-system238.js +9 -0
  201. package/dist/design-system238.js.map +1 -0
  202. package/dist/design-system239.js +737 -5
  203. package/dist/design-system239.js.map +1 -1
  204. package/dist/{design-system226.js → design-system241.js} +2 -2
  205. package/dist/{design-system226.js.map → design-system241.js.map} +1 -1
  206. package/dist/design-system242.js +3 -5
  207. package/dist/design-system242.js.map +1 -1
  208. package/dist/design-system243.js +42 -50
  209. package/dist/design-system243.js.map +1 -1
  210. package/dist/design-system244.js +1 -1
  211. package/dist/design-system244.js.map +1 -1
  212. package/dist/design-system245.js +254 -141
  213. package/dist/design-system245.js.map +1 -1
  214. package/dist/design-system247.js +1 -1
  215. package/dist/design-system247.js.map +1 -1
  216. package/dist/design-system248.js +119 -7
  217. package/dist/design-system248.js.map +1 -1
  218. package/dist/design-system250.js +8 -0
  219. package/dist/design-system250.js.map +1 -0
  220. package/dist/design-system251.js +172 -5
  221. package/dist/design-system251.js.map +1 -1
  222. package/dist/design-system253.js +8 -0
  223. package/dist/design-system253.js.map +1 -0
  224. package/dist/design-system254.js +11 -6
  225. package/dist/design-system254.js.map +1 -1
  226. package/dist/design-system255.js +525 -9
  227. package/dist/design-system255.js.map +1 -1
  228. package/dist/design-system257.js +8 -0
  229. package/dist/design-system257.js.map +1 -0
  230. package/dist/design-system258.js +112 -6
  231. package/dist/design-system258.js.map +1 -1
  232. package/dist/design-system260.js +5 -374
  233. package/dist/design-system260.js.map +1 -1
  234. package/dist/design-system261.js +57 -0
  235. package/dist/design-system261.js.map +1 -0
  236. package/dist/design-system262.js +4 -6
  237. package/dist/design-system262.js.map +1 -1
  238. package/dist/design-system263.js +173 -0
  239. package/dist/design-system263.js.map +1 -0
  240. package/dist/design-system265.js +8 -0
  241. package/dist/design-system265.js.map +1 -0
  242. package/dist/design-system266.js +10 -0
  243. package/dist/design-system266.js.map +1 -0
  244. package/dist/{design-system249.js → design-system267.js} +2 -2
  245. package/dist/{design-system249.js.map → design-system267.js.map} +1 -1
  246. package/dist/design-system269.js +8 -0
  247. package/dist/design-system269.js.map +1 -0
  248. package/dist/{design-system252.js → design-system270.js} +1 -1
  249. package/dist/{design-system252.js.map → design-system270.js.map} +1 -1
  250. package/dist/design-system272.js +9 -0
  251. package/dist/design-system272.js.map +1 -0
  252. package/dist/design-system273.js +12 -0
  253. package/dist/design-system273.js.map +1 -0
  254. package/dist/{design-system256.js → design-system274.js} +2 -2
  255. package/dist/{design-system256.js.map → design-system274.js.map} +1 -1
  256. package/dist/design-system276.js +9 -0
  257. package/dist/design-system276.js.map +1 -0
  258. package/dist/{design-system259.js → design-system277.js} +1 -1
  259. package/dist/{design-system259.js.map → design-system277.js.map} +1 -1
  260. package/dist/design-system278.js +377 -0
  261. package/dist/design-system278.js.map +1 -0
  262. package/dist/design-system280.js +9 -0
  263. package/dist/design-system280.js.map +1 -0
  264. package/dist/design-system69.js +182 -13
  265. package/dist/design-system69.js.map +1 -1
  266. package/dist/design-system71.js +8 -0
  267. package/dist/design-system71.js.map +1 -0
  268. package/dist/design-system72.js +13 -5
  269. package/dist/design-system72.js.map +1 -1
  270. package/dist/design-system73.js +677 -139
  271. package/dist/design-system73.js.map +1 -1
  272. package/dist/design-system75.js +1 -1
  273. package/dist/design-system75.js.map +1 -1
  274. package/dist/design-system76.js +152 -23
  275. package/dist/design-system76.js.map +1 -1
  276. package/dist/design-system78.js +5 -49
  277. package/dist/design-system78.js.map +1 -1
  278. package/dist/design-system79.js +32 -0
  279. package/dist/design-system79.js.map +1 -0
  280. package/dist/design-system80.js +2 -3
  281. package/dist/design-system80.js.map +1 -1
  282. package/dist/design-system81.js +38 -188
  283. package/dist/design-system81.js.map +1 -1
  284. package/dist/design-system83.js +1 -1
  285. package/dist/design-system83.js.map +1 -1
  286. package/dist/design-system84.js +199 -7
  287. package/dist/design-system84.js.map +1 -1
  288. package/dist/design-system86.js +8 -0
  289. package/dist/design-system86.js.map +1 -0
  290. package/dist/design-system87.js +7 -5
  291. package/dist/design-system87.js.map +1 -1
  292. package/dist/design-system88.js +264 -48
  293. package/dist/design-system88.js.map +1 -1
  294. package/dist/design-system90.js +1 -1
  295. package/dist/design-system90.js.map +1 -1
  296. package/dist/design-system91.js +57 -11
  297. package/dist/design-system91.js.map +1 -1
  298. package/dist/design-system93.js +8 -0
  299. package/dist/design-system93.js.map +1 -0
  300. package/dist/design-system94.js +11 -5
  301. package/dist/design-system94.js.map +1 -1
  302. package/dist/design-system95.js +92 -59
  303. package/dist/design-system95.js.map +1 -1
  304. package/dist/design-system97.js +1 -1
  305. package/dist/design-system97.js.map +1 -1
  306. package/dist/design-system98.js +56 -78
  307. package/dist/design-system98.js.map +1 -1
  308. package/dist/types/components/BContextMenu/BContextMenu.spec.d.ts +1 -0
  309. package/dist/types/components/BContextMenu/BContextMenu.vue.d.ts +42 -0
  310. package/dist/types/components/BContextMenu/index.d.ts +2 -0
  311. package/dist/types/components/BContextMenu/types.d.ts +23 -0
  312. package/dist/types/components/BInputTags/BInputTags.spec.d.ts +1 -0
  313. package/dist/types/components/BInputTags/BInputTags.vue.d.ts +54 -0
  314. package/dist/types/components/BInputTags/index.d.ts +1 -0
  315. package/dist/types/components/BLink/BLink.spec.d.ts +1 -0
  316. package/dist/types/components/BLink/BLink.vue.d.ts +100 -0
  317. package/dist/types/components/BLink/index.d.ts +1 -0
  318. package/dist/types/components/BListbox/BListbox.spec.d.ts +1 -0
  319. package/dist/types/components/BListbox/BListbox.vue.d.ts +52 -0
  320. package/dist/types/components/BListbox/index.d.ts +1 -0
  321. package/dist/types/components/BModal/BModal.spec.d.ts +1 -0
  322. package/dist/types/components/BPinInput/BPinInput.spec.d.ts +1 -0
  323. package/dist/types/components/BPinInput/BPinInput.vue.d.ts +43 -0
  324. package/dist/types/components/BPinInput/index.d.ts +1 -0
  325. package/dist/types/components/BProgress/BProgress.vue.d.ts +47 -2
  326. package/dist/types/components/BTextarea/BTextarea.spec.d.ts +1 -0
  327. package/dist/types/components/BTextarea/BTextarea.vue.d.ts +77 -0
  328. package/dist/types/components/BTextarea/index.d.ts +1 -0
  329. package/dist/types/components/index.d.ts +7 -1
  330. package/package.json +1 -1
  331. package/dist/design-system114.js +0 -212
  332. package/dist/design-system114.js.map +0 -1
  333. package/dist/design-system124.js +0 -277
  334. package/dist/design-system127.js +0 -19
  335. package/dist/design-system130.js +0 -15
  336. package/dist/design-system130.js.map +0 -1
  337. package/dist/design-system133.js +0 -8
  338. package/dist/design-system133.js.map +0 -1
  339. package/dist/design-system137.js +0 -236
  340. package/dist/design-system137.js.map +0 -1
  341. package/dist/design-system147.js +0 -40
  342. package/dist/design-system147.js.map +0 -1
  343. package/dist/design-system150.js +0 -7
  344. package/dist/design-system164.js +0 -61
  345. package/dist/design-system164.js.map +0 -1
  346. package/dist/design-system167.js +0 -59
  347. package/dist/design-system170.js +0 -72
  348. package/dist/design-system173.js +0 -185
  349. package/dist/design-system173.js.map +0 -1
  350. package/dist/design-system176.js +0 -118
  351. package/dist/design-system180.js +0 -465
  352. package/dist/design-system180.js.map +0 -1
  353. package/dist/design-system183.js +0 -38
  354. package/dist/design-system183.js.map +0 -1
  355. package/dist/design-system186.js +0 -91
  356. package/dist/design-system186.js.map +0 -1
  357. package/dist/design-system189.js +0 -38
  358. package/dist/design-system189.js.map +0 -1
  359. package/dist/design-system192.js +0 -31
  360. package/dist/design-system192.js.map +0 -1
  361. package/dist/design-system208.js +0 -7
  362. package/dist/design-system217.js +0 -7
  363. package/dist/design-system217.js.map +0 -1
  364. package/dist/design-system234.js +0 -286
  365. package/dist/design-system234.js.map +0 -1
  366. package/dist/design-system237.js +0 -122
  367. package/dist/design-system237.js.map +0 -1
  368. package/dist/design-system240.js +0 -115
  369. package/dist/design-system240.js.map +0 -1
  370. package/dist/design-system70.js +0 -699
  371. package/dist/design-system70.js.map +0 -1
  372. package/dist/design-system77.js +0 -7
  373. package/dist/design-system77.js.map +0 -1
  374. package/dist/design-system85.js +0 -276
  375. package/dist/design-system85.js.map +0 -1
  376. package/dist/design-system92.js +0 -102
  377. package/dist/design-system92.js.map +0 -1
@@ -1,69 +1,102 @@
1
- import { BFloatButtonShape as e, BFloatButtonType as t } from "./design-system91.js";
2
- import n from "./design-system94.js";
3
- import { Transition as r, createBlock as i, createCommentVNode as a, createElementVNode as o, defineComponent as s, onBeforeUnmount as c, onMounted as l, openBlock as u, ref as d, renderSlot as f, unref as p, withCtx as m } from "vue";
4
- //#region src/components/BFloatButton/BFloatButtonBackTop.vue?vue&type=script&setup=true&lang.ts
5
- var h = /* @__PURE__ */ s({
6
- __name: "BFloatButtonBackTop",
1
+ import e from "./design-system27.js";
2
+ import { BFloatButtonShape as t, BFloatButtonType as n } from "./design-system94.js";
3
+ import { Fragment as r, computed as i, createBlock as a, createCommentVNode as o, createElementBlock as s, createElementVNode as c, createTextVNode as l, defineComponent as u, normalizeClass as d, normalizeStyle as f, openBlock as p, renderSlot as m, resolveDynamicComponent as h, toDisplayString as g, withCtx as _ } from "vue";
4
+ //#region src/components/BFloatButton/BFloatButton.vue?vue&type=script&setup=true&lang.ts
5
+ var v = { class: "b-float-button__body" }, y = {
6
+ class: "b-float-button__icon",
7
+ "aria-hidden": "true"
8
+ }, b = {
9
+ key: 1,
10
+ width: "1em",
11
+ height: "1em",
12
+ viewBox: "0 0 24 24",
13
+ fill: "currentColor",
14
+ "aria-hidden": "true"
15
+ }, x = {
16
+ key: 0,
17
+ class: "b-float-button__description"
18
+ }, S = {
19
+ key: 1,
20
+ class: "b-float-button__tooltip",
21
+ role: "tooltip"
22
+ }, C = /* @__PURE__ */ u({
23
+ __name: "BFloatButton",
7
24
  props: {
8
- duration: { default: 450 },
9
- target: { type: Function },
10
- visibilityHeight: { default: 400 },
11
- shape: { default: () => e.Circle },
12
- type: { default: () => t.Default }
25
+ icon: {},
26
+ description: {},
27
+ tooltip: {},
28
+ type: { default: () => n.Default },
29
+ shape: { default: () => t.Circle },
30
+ href: {},
31
+ target: { default: "_blank" },
32
+ htmlType: { default: "button" },
33
+ badge: {},
34
+ disabled: {
35
+ type: Boolean,
36
+ default: !1
37
+ },
38
+ ariaLabel: {}
13
39
  },
14
40
  emits: ["click"],
15
- setup(e, { emit: t }) {
16
- let s = t, h = d(!1), g = window;
17
- function _() {
18
- return g === window ? window.scrollY : g.scrollTop;
41
+ setup(t, { emit: n }) {
42
+ let u = n, C = (e) => t.type === e, w = (e) => t.shape === e, T = i(() => {
43
+ if (t.badge && !t.badge.dot) return t.badge.count;
44
+ }), E = i(() => t.badge?.dot ?? !1), D = i(() => t.badge?.overflowCount ?? 99), O = i(() => {
45
+ let e = T.value;
46
+ if (e !== void 0 && !(e === 0 && !t.badge?.showZero)) return e > D.value ? `${D.value}+` : String(e);
47
+ }), k = i(() => E.value || O.value !== void 0);
48
+ function A(e) {
49
+ t.disabled || u("click", e);
19
50
  }
20
- function v() {
21
- h.value = _() > e.visibilityHeight;
22
- }
23
- function y(e) {
24
- return e < .5 ? 4 * e * e * e : 1 - (-2 * e + 2) ** 3 / 2;
25
- }
26
- function b() {
27
- let t = performance.now(), n = _();
28
- function r(i) {
29
- let a = i - t, o = Math.min(a / e.duration, 1), s = n * (1 - y(o));
30
- g === window ? window.scrollTo(0, s) : g.scrollTop = s, o < 1 && requestAnimationFrame(r);
31
- }
32
- requestAnimationFrame(r);
33
- }
34
- function x(e) {
35
- b(), s("click", e);
36
- }
37
- l(() => {
38
- g = e.target?.() ?? window, g.addEventListener("scroll", v, { passive: !0 }), v();
39
- }), c(() => {
40
- g.removeEventListener("scroll", v);
41
- });
42
- let S = h;
43
- return (t, s) => (u(), i(r, { name: "b-float-button-backtop" }, {
44
- default: m(() => [p(S) ? (u(), i(n, {
45
- key: 0,
46
- shape: e.shape,
47
- type: e.type,
48
- "aria-label": "Back to top",
49
- class: "b-float-button-backtop",
50
- onClick: x
51
- }, {
52
- icon: m(() => [f(t.$slots, "default", {}, () => [s[0] ||= o("svg", {
53
- width: "1em",
54
- height: "1em",
55
- viewBox: "0 0 24 24",
56
- fill: "currentColor",
57
- "aria-hidden": "true",
58
- focusable: "false"
59
- }, [o("path", { d: "M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z" })], -1)])]),
60
- _: 3
61
- }, 8, ["shape", "type"])) : a("", !0)]),
51
+ let j = i(() => t.href ? "a" : "button");
52
+ return (n, i) => (p(), a(h(j.value), {
53
+ href: t.href,
54
+ target: t.href ? t.target : void 0,
55
+ type: t.href ? void 0 : t.htmlType,
56
+ disabled: !t.href && t.disabled ? !0 : void 0,
57
+ "aria-disabled": t.href && t.disabled ? "true" : void 0,
58
+ "aria-label": t.ariaLabel ?? t.tooltip,
59
+ title: t.tooltip,
60
+ class: d(["b-float-button", {
61
+ "b-float-button--circle": w("circle"),
62
+ "b-float-button--square": w("square"),
63
+ "b-float-button--default": C("default"),
64
+ "b-float-button--primary": C("primary"),
65
+ "b-float-button--disabled": t.disabled
66
+ }]),
67
+ onClick: A
68
+ }, {
69
+ default: _(() => [
70
+ k.value ? (p(), s("span", {
71
+ key: 0,
72
+ class: d(["b-float-button__badge", {
73
+ "b-float-button__badge--dot": E.value,
74
+ "b-float-button__badge--count": !E.value
75
+ }]),
76
+ style: f(t.badge?.color ? { backgroundColor: t.badge.color } : void 0),
77
+ "aria-hidden": "true"
78
+ }, [E.value ? o("", !0) : (p(), s(r, { key: 0 }, [l(g(O.value), 1)], 64))], 6)) : o("", !0),
79
+ c("span", v, [c("span", y, [m(n.$slots, "icon", {}, () => [t.icon ? (p(), a(e, {
80
+ key: 0,
81
+ icon: t.icon,
82
+ size: "md"
83
+ }, null, 8, ["icon"])) : (p(), s("svg", b, [...i[0] ||= [c("path", { d: "M19 13H13v6h-2v-6H5v-2h6V5h2v6h6v2z" }, null, -1)]]))])]), (n.$slots.description || t.description) && w("square") ? (p(), s("span", x, [m(n.$slots, "description", {}, () => [l(g(t.description), 1)])])) : o("", !0)]),
84
+ n.$slots.tooltip || t.tooltip && !t.ariaLabel ? (p(), s("span", S, [m(n.$slots, "tooltip", {}, () => [l(g(t.tooltip), 1)])])) : o("", !0)
85
+ ]),
62
86
  _: 3
63
- }));
87
+ }, 8, [
88
+ "href",
89
+ "target",
90
+ "type",
91
+ "disabled",
92
+ "aria-disabled",
93
+ "aria-label",
94
+ "title",
95
+ "class"
96
+ ]));
64
97
  }
65
98
  });
66
99
  //#endregion
67
- export { h as default };
100
+ export { C as default };
68
101
 
69
102
  //# sourceMappingURL=design-system95.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"design-system95.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":";;;;;;;;;;;;;;;EA0CA,IAAM,IAAO,GAaP,IAAU,EAAI,GAAM,EACtB,IAAwC;EAE5C,SAAS,IAAuB;AAE9B,UADI,MAAoB,SAAe,OAAO,UACtC,EAAgC;;EAG1C,SAAS,IAAW;AAClB,KAAQ,QAAQ,GAAc,GAAG,EAAA;;EAGnC,SAAS,EAAe,GAAmB;AACzC,UAAO,IAAI,KAAM,IAAI,IAAI,IAAI,IAAI,KAAa,KAAK,IAAI,MAAG,IAAK;;EAGjE,SAAS,IAAc;GACrB,IAAM,IAAY,YAAY,KAAK,EAC7B,IAAW,GAAc;GAE/B,SAAS,EAAK,GAAa;IACzB,IAAM,IAAU,IAAM,GAChB,IAAW,KAAK,IAAI,IAAU,EAAA,UAAU,EAAE,EAE1C,IAAS,KAAY,IADb,EAAe,EAAS;AAStC,IANI,MAAoB,SACtB,OAAO,SAAS,GAAG,EAAO,GAEzB,EAAgC,YAAY,GAG3C,IAAW,KACb,sBAAsB,EAAK;;AAI/B,yBAAsB,EAAK;;EAG7B,SAAS,EAAY,GAAmB;AAEtC,GADA,GAAa,EACb,EAAK,SAAS,EAAM;;AAStB,EANA,QAAgB;AAGd,GAFA,IAAkB,EAAA,UAAU,IAAI,QAChC,EAAgB,iBAAiB,UAAU,GAAU,EAAE,SAAS,IAAM,CAAC,EACvE,GAAU;IACV,EAEF,QAAsB;AACpB,KAAgB,oBAAoB,UAAU,EAAS;IACvD;EAEF,IAAM,IAAY;yBAIhB,EAyBa,GAAA,EAzBD,MAAK,0BAAwB,EAAA;oBAwBxB,CAtBP,EAAA,EAAS,IAAA,GAAA,EADjB,EAuBe,GAAA;;IArBZ,OAAO,EAAA;IACP,MAAM,EAAA;IACP,cAAW;IACX,OAAM;IACL,SAAO;;IAEG,MAAI,QAaN,CAZP,EAYO,EAAA,QAAA,WAAA,EAAA,QAAA,CAAA,AAAA,EAAA,OAVL,EASM,OAAA;KARJ,OAAM;KACN,QAAO;KACP,SAAQ;KACR,MAAK;KACL,eAAY;KACZ,WAAU;QAEV,EAAwE,QAAA,EAAlE,GAAE,+DAA6D,CAAA,CAAA,EAAA,GAAA,CAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"design-system95.js","names":["$slots"],"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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2EA,IAAM,IAAO,GAiBP,KAAU,MAAiC,EAAA,SAAS,GACpD,KAAW,MAAkC,EAAA,UAAU,GAEvD,IAAa,QAAe;AAC3B,SAAA,SACD,GAAA,MAAM,IACV,QAAO,EAAA,MAAM;IACb,EAEI,IAAe,QAAe,EAAA,OAAO,OAAO,GAAM,EAElD,IAAgB,QAAe,EAAA,OAAO,iBAAiB,GAAG,EAE1D,IAAoB,QAAe;GACvC,IAAM,IAAQ,EAAW;AACrB,aAAU,KAAA,KACV,QAAU,KAAK,CAAC,EAAA,OAAO,UAC3B,QAAO,IAAQ,EAAc,QAAQ,GAAG,EAAc,MAAM,KAAK,OAAO,EAAM;IAC9E,EAEI,IAAY,QACT,EAAa,SAAS,EAAkB,UAAU,KAAA,EACzD;EAEF,SAAS,EAAY,GAAmB;AAClC,KAAA,YACJ,EAAK,SAAS,EAAM;;EAGtB,IAAM,IAAU,QAAgB,EAAA,OAAO,MAAM,SAAU;yBAIrD,EAwEY,EAvEL,EAAA,MAAO,EAAA;GACX,MAAM,EAAA;GACN,QAAQ,EAAA,OAAO,EAAA,SAAS,KAAA;GACxB,MAAO,EAAA,OAAkB,KAAA,IAAX,EAAA;GACd,UAAQ,CAAG,EAAA,QAAQ,EAAA,WAAQ,KAAU,KAAA;GACrC,iBAAe,EAAA,QAAQ,EAAA,WAAQ,SAAY,KAAA;GAC3C,cAAY,EAAA,aAAa,EAAA;GACzB,OAAO,EAAA;GACP,OAAK,EAAA,CAAA,kBAAA;8BAAsE,EAAO,SAAA;8BAA8C,EAAO,SAAA;+BAA+C,EAAM,UAAA;+BAAgD,EAAM,UAAA;gCAAiD,EAAA;;GAUnS,SAAO;;oBAcD;IAVC,EAAA,SAAA,GAAA,EADR,EAWO,QAAA;;KATL,OAAK,EAAA,CAAC,yBAAuB;oCACmB,EAAA;uCAAuD,EAAA;;KAItG,OAAK,EAAE,EAAA,OAAO,QAAK,EAAA,iBAAsB,EAAA,MAAM,OAAK,GAAK,KAAA,EAAS;KACnE,eAAY;QAEK,EAAA,QAAkC,EAAA,IAAA,GAAA,IAAlC,GAAA,EAAjB,EAAiE,GAAA,EAAA,KAAA,GAAA,EAAA,CAAA,EAAA,EAA/B,EAAA,MAAiB,EAAA,EAAA,CAAA,EAAA,GAAA,EAAA,EAAA,EAAA,IAAA,EAAA,IAAA,GAAA;IAIrD,EA0BO,QA1BP,GA0BO,CAxBL,EAeO,QAfP,GAeO,CAdL,EAaO,EAAA,QAAA,QAAA,EAAA,QAAA,CAZQ,EAAA,QAAA,GAAA,EAAb,EAA4C,GAAA;;KAAxB,MAAM,EAAA;KAAM,MAAK;mCAErC,EASM,OATN,GASM,CAAA,GAAA,AAAA,EAAA,OAAA,CADJ,EAAgD,QAAA,EAA1C,GAAE,uCAAqC,EAAA,MAAA,GAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,GAO1CA,EAAAA,OAAO,eAAe,EAAA,gBAAgB,EAAO,SAAA,IAAA,GAAA,EADtD,EAKO,QALP,GAKO,CADL,EAAiD,EAAA,QAAA,eAAA,EAAA,QAAA,CAAA,EAAA,EAArB,EAAA,YAAW,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAAA,IAAA,GAAA,CAAA,CAAA;IAMnCA,EAAAA,OAAO,WAAY,EAAA,WAAO,CAAK,EAAA,aAAA,GAAA,EADvC,EAMO,QANP,GAMO,CADL,EAAyC,EAAA,QAAA,WAAA,EAAA,QAAA,CAAA,EAAA,EAAjB,EAAA,QAAO,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAAA,IAAA,GAAA"}
@@ -1,6 +1,6 @@
1
1
  import e from "./design-system95.js";
2
2
  /* empty css */
3
- //#region src/components/BFloatButton/BFloatButtonBackTop.vue
3
+ //#region src/components/BFloatButton/BFloatButton.vue
4
4
  var t = e;
5
5
  //#endregion
6
6
  export { t as default };
@@ -1 +1 @@
1
- {"version":3,"file":"design-system97.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-system97.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,91 +1,69 @@
1
- import { BFloatButtonGroupPlacement as e, BFloatButtonShape as t, BFloatButtonTrigger as n } from "./design-system91.js";
2
- import { computed as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, defineComponent as s, normalizeClass as c, onBeforeUnmount as l, openBlock as u, provide as d, ref as f, renderSlot as p, watch as m } from "vue";
3
- //#region src/components/BFloatButton/BFloatButtonGroup.vue?vue&type=script&setup=true&lang.ts
4
- var h = ["role", "aria-label"], g = ["aria-hidden", "inert"], _ = ["aria-expanded", "aria-label"], v = { class: "b-float-button__body" }, y = {
5
- class: "b-float-button__icon",
6
- "aria-hidden": "true"
7
- }, b = /* @__PURE__ */ s({
8
- __name: "BFloatButtonGroup",
1
+ import { BFloatButtonShape as e, BFloatButtonType as t } from "./design-system94.js";
2
+ import n from "./design-system97.js";
3
+ import { Transition as r, createBlock as i, createCommentVNode as a, createElementVNode as o, defineComponent as s, onBeforeUnmount as c, onMounted as l, openBlock as u, ref as d, renderSlot as f, unref as p, withCtx as m } from "vue";
4
+ //#region src/components/BFloatButton/BFloatButtonBackTop.vue?vue&type=script&setup=true&lang.ts
5
+ var h = /* @__PURE__ */ s({
6
+ __name: "BFloatButtonBackTop",
9
7
  props: {
10
- open: { type: [Boolean, null] },
11
- trigger: {},
12
- placement: {},
13
- shape: {},
14
- closeIcon: {}
8
+ duration: { default: 450 },
9
+ target: { type: Function },
10
+ visibilityHeight: { default: 400 },
11
+ shape: { default: () => e.Circle },
12
+ type: { default: () => t.Default }
15
13
  },
16
- emits: ["openChange", "update:open"],
17
- setup(s, { emit: b }) {
18
- let x = s, S = b, C = f(!1);
19
- m(() => x.open, (e) => {
20
- e === !0 ? C.value = !0 : e === !1 && (C.value = !1);
21
- }, { immediate: !0 });
22
- function w(e) {
23
- C.value = e, S("update:open", e), S("openChange", e);
14
+ emits: ["click"],
15
+ setup(e, { emit: t }) {
16
+ let s = t, h = d(!1), g = window;
17
+ function _() {
18
+ return g === window ? window.scrollY : g.scrollTop;
24
19
  }
25
- function T() {
26
- w(!C.value);
20
+ function v() {
21
+ h.value = _() > e.visibilityHeight;
27
22
  }
28
- function E() {
29
- w(!0);
23
+ function y(e) {
24
+ return e < .5 ? 4 * e * e * e : 1 - (-2 * e + 2) ** 3 / 2;
30
25
  }
31
- function D() {
32
- w(!1);
26
+ function b() {
27
+ let t = performance.now(), n = _();
28
+ function r(i) {
29
+ let a = i - t, o = Math.min(a / e.duration, 1), s = n * (1 - y(o));
30
+ g === window ? window.scrollTo(0, s) : g.scrollTop = s, o < 1 && requestAnimationFrame(r);
31
+ }
32
+ requestAnimationFrame(r);
33
33
  }
34
- let O = null;
35
- function k() {
36
- x.trigger === n.Hover && (O &&= (clearTimeout(O), null), E());
37
- }
38
- function A() {
39
- x.trigger === n.Hover && (O = setTimeout(() => D(), 100));
34
+ function x(e) {
35
+ b(), s("click", e);
40
36
  }
41
37
  l(() => {
42
- O && clearTimeout(O);
43
- }), d("bFloatButtonGroupShape", r(() => x.shape ?? t.Circle));
44
- let j = r(() => x.trigger !== void 0), M = r(() => `b-float-button-group--${x.placement ?? e.Top}`), N = r(() => `b-float-button-group--shape-${x.shape ?? t.Circle}`);
45
- return (e, t) => (u(), a("div", {
46
- class: c(["b-float-button-group", [
47
- M.value,
48
- N.value,
49
- {
50
- "b-float-button-group--menu": j.value,
51
- "b-float-button-group--open": j.value && C.value
52
- }
53
- ]]),
54
- role: j.value ? void 0 : "group",
55
- "aria-label": j.value ? void 0 : "Float button group",
56
- onMouseenter: k,
57
- onMouseleave: A
58
- }, [o("div", {
59
- class: "b-float-button-group__list",
60
- "aria-hidden": j.value ? !C.value : void 0,
61
- inert: j.value && !C.value ? !0 : void 0
62
- }, [p(e.$slots, "default")], 8, g), j.value ? (u(), a("button", {
63
- key: 0,
64
- type: "button",
65
- class: c(["b-float-button-group__trigger", [
66
- "b-float-button",
67
- `b-float-button--${x.shape ?? "circle"}`,
68
- "b-float-button--primary"
69
- ]]),
70
- "aria-expanded": C.value,
71
- "aria-label": C.value ? "Collapse button group" : "Expand button group",
72
- onClick: T
73
- }, [o("span", v, [o("span", y, [C.value ? p(e.$slots, "closeIcon", { key: 0 }, () => [t[0] ||= o("svg", {
74
- width: "1em",
75
- height: "1em",
76
- viewBox: "0 0 24 24",
77
- fill: "currentColor",
78
- "aria-hidden": "true"
79
- }, [o("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" })], -1)]) : p(e.$slots, "icon", { key: 1 }, () => [t[1] ||= o("svg", {
80
- width: "1em",
81
- height: "1em",
82
- viewBox: "0 0 24 24",
83
- fill: "currentColor",
84
- "aria-hidden": "true"
85
- }, [o("path", { d: "M19 13H13v6h-2v-6H5v-2h6V5h2v6h6v2z" })], -1)])])])], 10, _)) : i("", !0)], 42, h));
38
+ g = e.target?.() ?? window, g.addEventListener("scroll", v, { passive: !0 }), v();
39
+ }), c(() => {
40
+ g.removeEventListener("scroll", v);
41
+ });
42
+ let S = h;
43
+ return (t, s) => (u(), i(r, { name: "b-float-button-backtop" }, {
44
+ default: m(() => [p(S) ? (u(), i(n, {
45
+ key: 0,
46
+ shape: e.shape,
47
+ type: e.type,
48
+ "aria-label": "Back to top",
49
+ class: "b-float-button-backtop",
50
+ onClick: x
51
+ }, {
52
+ icon: m(() => [f(t.$slots, "default", {}, () => [s[0] ||= o("svg", {
53
+ width: "1em",
54
+ height: "1em",
55
+ viewBox: "0 0 24 24",
56
+ fill: "currentColor",
57
+ "aria-hidden": "true",
58
+ focusable: "false"
59
+ }, [o("path", { d: "M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z" })], -1)])]),
60
+ _: 3
61
+ }, 8, ["shape", "type"])) : a("", !0)]),
62
+ _: 3
63
+ }));
86
64
  }
87
65
  });
88
66
  //#endregion
89
- export { b as default };
67
+ export { h as default };
90
68
 
91
69
  //# sourceMappingURL=design-system98.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"design-system98.js","names":[],"sources":["../src/components/BFloatButton/BFloatButtonGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, provide, ref, watch } from 'vue';\nimport { BFloatButtonGroupPlacement, BFloatButtonShape, BFloatButtonTrigger } from './types.ts';\n\n// ─────────────────────────────────────────────\n// Props & emits\n// ─────────────────────────────────────────────\nconst props = defineProps<{\n /**\n * Controlled open state. Use with `v-model:open` for two-way binding.\n * When this prop changes, the internal state syncs to it.\n */\n open?: boolean | null;\n /**\n * The trigger mode for expanding/collapsing the group menu.\n * When set, a trigger button is shown that reveals child buttons.\n */\n trigger?: `${BFloatButtonTrigger}`;\n /**\n * Animation direction when expanding/collapsing.\n * @default 'top'\n */\n placement?: `${BFloatButtonGroupPlacement}`;\n /**\n * Shape applied to all child float buttons.\n * @default 'circle'\n */\n shape?: `${BFloatButtonShape}`;\n /**\n * Icon name for the close/collapse trigger button.\n */\n closeIcon?: string;\n}>();\n\nconst emit = defineEmits<{\n /** Emitted when the group open state changes. */\n (e: 'openChange', open: boolean): void;\n /** v-model support. */\n (e: 'update:open', open: boolean): void;\n}>();\n\ndefineSlots<{\n /** Float button children. */\n default?(): unknown;\n /** Custom trigger icon (open state). */\n icon?(): unknown;\n /** Custom close icon (close state). */\n closeIcon?(): unknown;\n}>();\n\n// ─────────────────────────────────────────────\n// Internal state — always the rendering source of truth\n// ─────────────────────────────────────────────\nconst internalOpen = ref(false);\n\n// Sync from controlled prop internal state when explicitly changed\nwatch(\n () => props.open,\n (val) => {\n if (val === true) internalOpen.value = true;\n else if (val === false) internalOpen.value = false;\n // null/undefined means \"uncontrolled\" do not override internal state\n },\n { immediate: true },\n);\n\nfunction setOpen(val: boolean) {\n internalOpen.value = val;\n emit('update:open', val);\n emit('openChange', val);\n}\n\nfunction toggle() {\n setOpen(!internalOpen.value);\n}\n\nfunction openGroup() {\n setOpen(true);\n}\n\nfunction closeGroup() {\n setOpen(false);\n}\n\n// ─────────────────────────────────────────────\n// Hover trigger\n// ─────────────────────────────────────────────\nlet hideTimer: ReturnType<typeof setTimeout> | null = null;\n\nfunction onMouseEnter() {\n if (props.trigger !== BFloatButtonTrigger.Hover) return;\n if (hideTimer) {\n clearTimeout(hideTimer);\n hideTimer = null;\n }\n openGroup();\n}\n\nfunction onMouseLeave() {\n if (props.trigger !== BFloatButtonTrigger.Hover) return;\n hideTimer = setTimeout(() => closeGroup(), 100);\n}\n\nonBeforeUnmount(() => {\n if (hideTimer) clearTimeout(hideTimer);\n});\n\n// ─────────────────────────────────────────────\n// Provide shape to children\n// ─────────────────────────────────────────────\nprovide(\n 'bFloatButtonGroupShape',\n computed(() => props.shape ?? BFloatButtonShape.Circle),\n);\n\nconst isGroup = computed(() => props.trigger !== undefined);\nconst placementClass = computed(\n () => `b-float-button-group--${props.placement ?? BFloatButtonGroupPlacement.Top}`,\n);\nconst shapeClass = computed(\n () => `b-float-button-group--shape-${props.shape ?? BFloatButtonShape.Circle}`,\n);\n</script>\n\n<template>\n <div\n class=\"b-float-button-group\"\n :class=\"[\n placementClass,\n shapeClass,\n {\n 'b-float-button-group--menu': isGroup,\n 'b-float-button-group--open': isGroup && internalOpen,\n },\n ]\"\n :role=\"!isGroup ? 'group' : undefined\"\n :aria-label=\"!isGroup ? 'Float button group' : undefined\"\n @mouseenter=\"onMouseEnter\"\n @mouseleave=\"onMouseLeave\"\n >\n <!-- Child buttons list (always rendered; hidden when group is collapsed) -->\n <div\n class=\"b-float-button-group__list\"\n :aria-hidden=\"isGroup ? !internalOpen : undefined\"\n :inert=\"isGroup && !internalOpen ? true : undefined\"\n >\n <slot />\n </div>\n\n <!-- Trigger button (only rendered when trigger is set) -->\n <button\n v-if=\"isGroup\"\n type=\"button\"\n class=\"b-float-button-group__trigger\"\n :class=\"[\n 'b-float-button',\n `b-float-button--${props.shape ?? 'circle'}`,\n 'b-float-button--primary',\n ]\"\n :aria-expanded=\"internalOpen\"\n :aria-label=\"internalOpen ? 'Collapse button group' : 'Expand button group'\"\n @click=\"toggle\"\n >\n <span class=\"b-float-button__body\">\n <span class=\"b-float-button__icon\" aria-hidden=\"true\">\n <template v-if=\"internalOpen\">\n <slot name=\"closeIcon\">\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n />\n </svg>\n </slot>\n </template>\n <template v-else>\n <slot name=\"icon\">\n <svg\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 </template>\n </span>\n </span>\n </button>\n </div>\n</template>\n\n<style>\n/* ─────────────────────────────────────────────\n Group container\n ───────────────────────────────────────────── */\n.b-float-button-group {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.75rem;\n position: relative;\n}\n\n.b-float-button-group--menu {\n position: relative;\n}\n\n/* ─────────────────────────────────────────────\n Items list (collapsible)\n ───────────────────────────────────────────── */\n.b-float-button-group__list {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.75rem;\n list-style: none;\n padding: 0;\n margin: 0 0 0.75rem 0;\n\n /* Collapsed: hidden */\n overflow: hidden;\n max-height: 0;\n opacity: 0;\n pointer-events: none;\n transition:\n max-height 300ms cubic-bezier(0.4, 0, 0.2, 1),\n opacity 250ms ease;\n}\n\n.b-float-button-group--open .b-float-button-group__list {\n max-height: 60vh;\n opacity: 1;\n pointer-events: auto;\n}\n\n/* ── Placement variants for list direction ──\n DOM order is always [list, trigger]. For `bottom`/`right` we reverse\n the container so the trigger comes before the list visually. */\n.b-float-button-group--top .b-float-button-group__list {\n flex-direction: column-reverse;\n}\n\n.b-float-button-group--bottom {\n flex-direction: column-reverse;\n}\n\n.b-float-button-group--bottom .b-float-button-group__list {\n flex-direction: column;\n margin: 0.75rem 0 0 0;\n}\n\n.b-float-button-group--left .b-float-button-group__list {\n flex-direction: row-reverse;\n margin: 0 0.75rem 0 0;\n}\n\n.b-float-button-group--right .b-float-button-group__list {\n flex-direction: row;\n margin: 0 0 0 0.75rem;\n}\n\n/* ── Horizontal layout for left/right placements ── */\n.b-float-button-group--left {\n flex-direction: row;\n align-items: center;\n}\n\n.b-float-button-group--right {\n flex-direction: row-reverse;\n align-items: center;\n}\n\n/* ── Trigger button ── */\n.b-float-button-group__trigger {\n flex-shrink: 0;\n}\n\n/* ─────────────────────────────────────────────\n Reduced motion\n ───────────────────────────────────────────── */\n@media (prefers-reduced-motion: reduce) {\n .b-float-button-group__list {\n transition-duration: 0ms;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;EAOA,IAAM,IAAQ,GA2BR,IAAO,GAmBP,IAAe,EAAI,GAAM;AAG/B,UACQ,EAAM,OACX,MAAQ;AACP,GAAI,MAAQ,KAAM,EAAa,QAAQ,KAC9B,MAAQ,OAAO,EAAa,QAAQ;KAG/C,EAAE,WAAW,IAAM,CACpB;EAED,SAAS,EAAQ,GAAc;AAG7B,GAFA,EAAa,QAAQ,GACrB,EAAK,eAAe,EAAI,EACxB,EAAK,cAAc,EAAI;;EAGzB,SAAS,IAAS;AAChB,KAAQ,CAAC,EAAa,MAAM;;EAG9B,SAAS,IAAY;AACnB,KAAQ,GAAK;;EAGf,SAAS,IAAa;AACpB,KAAQ,GAAM;;EAMhB,IAAI,IAAkD;EAEtD,SAAS,IAAe;AAClB,KAAM,YAAY,EAAoB,UAC1C,AAEE,OADA,aAAa,EAAU,EACX,OAEd,GAAW;;EAGb,SAAS,IAAe;AAClB,KAAM,YAAY,EAAoB,UAC1C,IAAY,iBAAiB,GAAY,EAAE,IAAI;;AAUjD,EAPA,QAAsB;AACpB,GAAI,KAAW,aAAa,EAAU;IACtC,EAKF,EACE,0BACA,QAAe,EAAM,SAAS,EAAkB,OAAO,CACxD;EAED,IAAM,IAAU,QAAe,EAAM,YAAY,KAAA,EAAU,EACrD,IAAiB,QACf,yBAAyB,EAAM,aAAa,EAA2B,MAC9E,EACK,IAAa,QACX,+BAA+B,EAAM,SAAS,EAAkB,SACvE;yBAIC,EAuEM,OAAA;GAtEJ,OAAK,EAAA,CAAC,wBAAsB;IACZ,EAAA;IAAsB,EAAA;;mCAA0D,EAAA;mCAA+C,EAAA,SAAW,EAAA;;;GAQzJ,MAAO,EAAA,QAAoB,KAAA,IAAb;GACd,cAAa,EAAA,QAAiC,KAAA,IAA1B;GACpB,cAAY;GACZ,cAAY;MAGb,EAMM,OAAA;GALJ,OAAM;GACL,eAAa,EAAA,QAAO,CAAI,EAAA,QAAe,KAAA;GACvC,OAAO,EAAA,SAAO,CAAK,EAAA,QAAY,KAAU,KAAA;MAE1C,EAAQ,EAAA,QAAA,UAAA,CAAA,EAAA,GAAA,EAAA,EAKF,EAAA,SAAA,GAAA,EADR,EA6CS,UAAA;;GA3CP,MAAK;GACL,OAAK,EAAA,CAAC,iCAA+B;;uBAC0B,EAAM,SAAK;;;GAKzE,iBAAe,EAAA;GACf,cAAY,EAAA,QAAY,0BAAA;GACxB,SAAO;MAER,EA+BO,QA/BP,GA+BO,CA9BL,EA6BO,QA7BP,GA6BO,CA5BW,EAAA,QACd,EAYO,EAAA,QAAA,aAAA,EAAA,KAAA,GAAA,QAAA,CAAA,AAAA,EAAA,OAXL,EAUM,OAAA;GATJ,OAAM;GACN,QAAO;GACP,SAAQ;GACR,MAAK;GACL,eAAY;MAEZ,EAEE,QAAA,EADA,GAAE,yGAAuG,CAAA,CAAA,EAAA,GAAA,CAAA,CAAA,GAM/G,EAUO,EAAA,QAAA,QAAA,EAAA,KAAA,GAAA,QAAA,CAAA,AAAA,EAAA,OATL,EAQM,OAAA;GAPJ,OAAM;GACN,QAAO;GACP,SAAQ;GACR,MAAK;GACL,eAAY;MAEZ,EAAgD,QAAA,EAA1C,GAAE,uCAAqC,CAAA,CAAA,EAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,IAAA,EAAA,IAAA,EAAA,IAAA,GAAA,CAAA,EAAA,IAAA,EAAA"}
1
+ {"version":3,"file":"design-system98.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":";;;;;;;;;;;;;;;EA0CA,IAAM,IAAO,GAaP,IAAU,EAAI,GAAM,EACtB,IAAwC;EAE5C,SAAS,IAAuB;AAE9B,UADI,MAAoB,SAAe,OAAO,UACtC,EAAgC;;EAG1C,SAAS,IAAW;AAClB,KAAQ,QAAQ,GAAc,GAAG,EAAA;;EAGnC,SAAS,EAAe,GAAmB;AACzC,UAAO,IAAI,KAAM,IAAI,IAAI,IAAI,IAAI,KAAa,KAAK,IAAI,MAAG,IAAK;;EAGjE,SAAS,IAAc;GACrB,IAAM,IAAY,YAAY,KAAK,EAC7B,IAAW,GAAc;GAE/B,SAAS,EAAK,GAAa;IACzB,IAAM,IAAU,IAAM,GAChB,IAAW,KAAK,IAAI,IAAU,EAAA,UAAU,EAAE,EAE1C,IAAS,KAAY,IADb,EAAe,EAAS;AAStC,IANI,MAAoB,SACtB,OAAO,SAAS,GAAG,EAAO,GAEzB,EAAgC,YAAY,GAG3C,IAAW,KACb,sBAAsB,EAAK;;AAI/B,yBAAsB,EAAK;;EAG7B,SAAS,EAAY,GAAmB;AAEtC,GADA,GAAa,EACb,EAAK,SAAS,EAAM;;AAStB,EANA,QAAgB;AAGd,GAFA,IAAkB,EAAA,UAAU,IAAI,QAChC,EAAgB,iBAAiB,UAAU,GAAU,EAAE,SAAS,IAAM,CAAC,EACvE,GAAU;IACV,EAEF,QAAsB;AACpB,KAAgB,oBAAoB,UAAU,EAAS;IACvD;EAEF,IAAM,IAAY;yBAIhB,EAyBa,GAAA,EAzBD,MAAK,0BAAwB,EAAA;oBAwBxB,CAtBP,EAAA,EAAS,IAAA,GAAA,EADjB,EAuBe,GAAA;;IArBZ,OAAO,EAAA;IACP,MAAM,EAAA;IACP,cAAW;IACX,OAAM;IACL,SAAO;;IAEG,MAAI,QAaN,CAZP,EAYO,EAAA,QAAA,WAAA,EAAA,QAAA,CAAA,AAAA,EAAA,OAVL,EASM,OAAA;KARJ,OAAM;KACN,QAAO;KACP,SAAQ;KACR,MAAK;KACL,eAAY;KACZ,WAAU;QAEV,EAAwE,QAAA,EAAlE,GAAE,+DAA6D,CAAA,CAAA,EAAA,GAAA,CAAA,CAAA,CAAA,CAAA"}
@@ -0,0 +1,42 @@
1
+ import type { BContextMenuItem } from './types.ts';
2
+ type __VLS_Props = {
3
+ /** Items to render. Each item is either a regular entry (with `label`) or a divider (`{ divider: true, key }`). */
4
+ items: BContextMenuItem[];
5
+ /** When true, the trigger area ignores `contextmenu` events — the menu cannot be opened. @default false */
6
+ disabled?: boolean;
7
+ /** Optional explicit `id` for the menu element. Falls back to a per-instance auto-generated id. */
8
+ id?: string;
9
+ /** Accessible label announced when the menu opens. @default 'Context menu' */
10
+ ariaLabel?: string;
11
+ };
12
+ type __VLS_Slots = {
13
+ /** The trigger area. The component listens for `contextmenu` on the wrapping element. */
14
+ default?(): unknown;
15
+ /** Optional per-item override. Receives `{ item, active }`. */
16
+ item?(props: {
17
+ item: BContextMenuItem;
18
+ active: boolean;
19
+ }): unknown;
20
+ };
21
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
22
+ /** Open the menu programmatically at viewport coordinates. */
23
+ open: (px: number, py: number) => void;
24
+ /** Close the menu programmatically. */
25
+ close: () => void;
26
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
27
+ close: () => any;
28
+ select: (item: BContextMenuItem, event: Event) => any;
29
+ open: (event: MouseEvent) => any;
30
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
31
+ onClose?: () => any;
32
+ onSelect?: (item: BContextMenuItem, event: Event) => any;
33
+ onOpen?: (event: MouseEvent) => any;
34
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
35
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
36
+ declare const _default: typeof __VLS_export;
37
+ export default _default;
38
+ type __VLS_WithSlots<T, S> = T & {
39
+ new (): {
40
+ $slots: S;
41
+ };
42
+ };
@@ -0,0 +1,2 @@
1
+ export { default as BContextMenu } from './BContextMenu.vue';
2
+ export type { BContextMenuItem } from './types';
@@ -0,0 +1,23 @@
1
+ /**
2
+ * A single item displayed inside `BContextMenu`. Items can be:
3
+ * - a regular menu entry (with `label`)
4
+ * - a divider (`divider: true`) — rendered as <hr role="separator">
5
+ */
6
+ export interface BContextMenuItem {
7
+ /** Stable identifier used for keyed rendering and selection. */
8
+ key: string;
9
+ /** Visible label. Required unless `divider: true`. */
10
+ label?: string;
11
+ /** Optional icon name forwarded to `BIcon`. */
12
+ icon?: string;
13
+ /** Whether the item is disabled — non-activatable, skipped by keyboard nav. */
14
+ disabled?: boolean;
15
+ /** Render in destructive styling (e.g. "Delete"). */
16
+ danger?: boolean;
17
+ /** Render this item as a separator instead of a regular entry. */
18
+ divider?: boolean;
19
+ /** Per-item callback invoked on activation, before `select` is emitted. */
20
+ onSelect?: () => void;
21
+ /** Nested children (rendered inline as a flat-ish menu). */
22
+ children?: BContextMenuItem[];
23
+ }