@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-system132.js","names":["$slots"],"sources":["../src/components/BMasonry/BMasonry.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport type {\n BMasonryBreakpoint,\n BMasonryClassNames,\n BMasonryItem,\n BMasonryLayoutChangePayload,\n BMasonryResponsive,\n BMasonryStyles,\n} from './types';\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nconst {\n columns = 3,\n // eslint-disable-next-line vue/require-valid-default-prop\n gutter = 0,\n items = [],\n fresh = false,\n classNames,\n styles,\n} = defineProps<{\n /**\n * Number of columns. Accepts a fixed number or a breakpoint map.\n * @example 3\n * @example { xs: 1, sm: 2, md: 3, lg: 4 }\n * @default 3\n */\n columns?: BMasonryResponsive;\n\n /**\n * Gap between items in pixels. Accepts a fixed value, a [colGap, rowGap] tuple,\n * or a breakpoint map for responsive gaps.\n * @example 16\n * @example [16, 8]\n * @example { xs: 8, md: 16 }\n * @default 0\n */\n gutter?: BMasonryResponsive | [BMasonryResponsive, BMasonryResponsive];\n\n /**\n * Array of masonry items to render.\n * @default []\n */\n items?: BMasonryItem[];\n\n /**\n * When true, observe every item's size so the layout re-flows when children resize.\n * Requires ResizeObserver support; degrades gracefully when unavailable.\n * @default false\n */\n fresh?: boolean;\n\n /**\n * Customize CSS classes on semantic DOM elements (`root`, `column`, `item`).\n * Can be a plain object or a per-item function `(item, columnIndex) => classes`.\n */\n classNames?: BMasonryClassNames;\n\n /**\n * Customize inline styles on semantic DOM elements (`root`, `column`, `item`).\n * Can be a plain object or a per-item function `(item, columnIndex) => styles`.\n */\n styles?: BMasonryStyles;\n}>();\n\n// ─── Emits ────────────────────────────────────────────────────────────────────\n\nconst emit = defineEmits<{\n /**\n * Fires after each layout recalculation with the resolved column count and\n * the column assignment map (item key → 0-based column index).\n */\n layoutChange: [payload: BMasonryLayoutChangePayload];\n}>();\n\n// ─── Slots ────────────────────────────────────────────────────────────────────\n\ndefineSlots<{\n /**\n * Custom rendering for each item. Receives `{ item: BMasonryItem, index: number, column: number }`.\n */\n item?: (props: { item: BMasonryItem; index: number; column: number }) => unknown;\n\n /**\n * Default slot used when no `items` prop is provided — raw child nodes are\n * distributed across columns automatically.\n */\n default?: (props: Record<string, never>) => unknown;\n}>();\n\n// ─── Responsive helpers ───────────────────────────────────────────────────────\n\nconst BREAKPOINTS: Record<BMasonryBreakpoint, number> = {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1600,\n};\n\nfunction resolveResponsive(value: BMasonryResponsive, width: number): number {\n if (typeof value === 'number') return Math.max(1, value);\n\n // Breakpoint map — pick the largest breakpoint that still fits\n const keys = (Object.keys(BREAKPOINTS) as BMasonryBreakpoint[]).sort(\n (a, b) => BREAKPOINTS[b] - BREAKPOINTS[a],\n );\n\n for (const bp of keys) {\n if (width >= BREAKPOINTS[bp] && value[bp] !== undefined) {\n return Math.max(1, value[bp]!);\n }\n }\n // Fallback to smallest defined value\n const smallest = (Object.keys(value) as BMasonryBreakpoint[]).sort(\n (a, b) => BREAKPOINTS[a] - BREAKPOINTS[b],\n )[0];\n return smallest ? Math.max(1, value[smallest]!) : 1;\n}\n\n// ─── Container width tracking ─────────────────────────────────────────────────\n\nconst rootEl = ref<HTMLElement | null>(null);\nconst containerWidth = ref(0);\n\nlet containerObserver: ResizeObserver | null = null;\n\nfunction updateWidth() {\n if (rootEl.value) {\n containerWidth.value = rootEl.value.offsetWidth;\n }\n}\n\n// ─── Item height tracking (fresh mode) ────────────────────────────────────────\n\nconst itemHeights = ref<Record<string | number, number>>({});\nlet itemObserver: ResizeObserver | null = null;\nconst itemEls = ref<Map<string | number, Element>>(new Map());\n\nfunction registerItemEl(key: string | number, el: Element | null) {\n if (el) {\n itemEls.value.set(key, el);\n if (fresh && itemObserver) {\n itemObserver.observe(el);\n }\n } else {\n const old = itemEls.value.get(key);\n if (old && itemObserver) itemObserver.unobserve(old);\n itemEls.value.delete(key);\n const next = { ...itemHeights.value };\n delete next[key];\n itemHeights.value = next;\n }\n}\n\nfunction setupItemObserver() {\n if (!fresh || typeof ResizeObserver === 'undefined') return;\n itemObserver = new ResizeObserver((entries) => {\n let changed = false;\n for (const entry of entries) {\n const el = entry.target as HTMLElement;\n const key = el.dataset.masonryKey;\n if (key !== undefined) {\n const h = entry.contentRect.height;\n if (itemHeights.value[key] !== h) {\n itemHeights.value = { ...itemHeights.value, [key]: h };\n changed = true;\n }\n }\n }\n if (changed) {\n // trigger layout recompute (handled reactively via computed)\n }\n });\n // Observe any already-mounted elements\n itemEls.value.forEach((el) => itemObserver!.observe(el));\n}\n\n// ─── Core layout algorithm ────────────────────────────────────────────────────\n\nconst resolvedColumns = computed(() => resolveResponsive(columns, containerWidth.value));\n\nconst resolvedGutter = computed<[number, number]>(() => {\n const g = gutter;\n if (Array.isArray(g)) {\n const colGap = resolveResponsive(g[0] as BMasonryResponsive, containerWidth.value);\n const rowGap = resolveResponsive(g[1] as BMasonryResponsive, containerWidth.value);\n return [colGap, rowGap];\n }\n const v = resolveResponsive(g as BMasonryResponsive, containerWidth.value);\n return [v, v];\n});\n\n/** Distribute items across columns using the \"shortest column first\" strategy. */\nconst columnBuckets = computed<{ item: BMasonryItem; originalIndex: number }[][]>(() => {\n const cols = resolvedColumns.value;\n const buckets: { item: BMasonryItem; originalIndex: number }[][] = Array.from(\n { length: cols },\n () => [],\n );\n const heights = Array<number>(cols).fill(0);\n const [, rowGap] = resolvedGutter.value;\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n let targetCol: number;\n\n if (item.column !== undefined) {\n // Pinned column (1-based → 0-based, clamped)\n targetCol = Math.max(0, Math.min(cols - 1, item.column - 1));\n } else {\n // Shortest column\n targetCol = heights.indexOf(Math.min(...heights));\n }\n\n buckets[targetCol].push({ item, originalIndex: i });\n const h = itemHeights.value[item.key] ?? item.height ?? 0;\n heights[targetCol] += h + (buckets[targetCol].length > 1 ? rowGap : 0);\n }\n\n return buckets;\n});\n\nconst layoutColumnMap = computed(() => {\n const cols = resolvedColumns.value;\n const map: Record<string | number, number> = {};\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const bucket = columnBuckets.value.findIndex((b) =>\n b.some((entry) => entry.item.key === item.key),\n );\n if (bucket >= 0) map[item.key] = bucket;\n }\n return { columns: cols, columnMap: map };\n});\n\nwatch(layoutColumnMap, (val) => {\n emit('layoutChange', val);\n}, { immediate: true });\n\n// ─── CSS class/style helpers ──────────────────────────────────────────────────\n\nfunction getItemClasses(item: BMasonryItem, columnIndex: number) {\n const base = ['b-masonry__item'];\n if (!classNames) return base;\n\n if (typeof classNames === 'function') {\n const extra = classNames(item, columnIndex);\n if (extra) base.push(...(Array.isArray(extra) ? extra : [extra as string]));\n } else if (typeof classNames.item === 'function') {\n const extra = classNames.item(item, columnIndex);\n if (extra) base.push(...(Array.isArray(extra) ? extra : [extra as string]));\n } else if (typeof classNames.item === 'string') {\n base.push(classNames.item);\n }\n return base;\n}\n\nfunction getItemStyles(item: BMasonryItem, columnIndex: number): Record<string, string> {\n if (!styles) return {};\n if (typeof styles === 'function') return styles(item, columnIndex) ?? {};\n if (typeof styles.item === 'function') return styles.item(item, columnIndex) ?? {};\n if (styles.item && typeof styles.item === 'object') return styles.item as Record<string, string>;\n return {};\n}\n\nfunction getColumnClasses(_colIndex: number): string[] {\n const base = ['b-masonry__column'];\n if (!classNames || typeof classNames === 'function') return base;\n if (classNames.column) base.push(classNames.column);\n return base;\n}\n\nfunction getColumnStyles(_colIndex: number): Record<string, string> {\n if (!styles || typeof styles === 'function') return {};\n return (styles.column as Record<string, string>) ?? {};\n}\n\nconst rootClasses = computed(() => {\n const base = ['b-masonry'];\n if (!classNames || typeof classNames === 'function') return base;\n if (classNames.root) base.push(classNames.root);\n return base;\n});\n\nconst rootStyles = computed(() => {\n const base: Record<string, string> = {\n '--b-masonry-columns': String(resolvedColumns.value),\n '--b-masonry-col-gap': `${resolvedGutter.value[0]}px`,\n '--b-masonry-row-gap': `${resolvedGutter.value[1]}px`,\n };\n if (styles && typeof styles === 'object' && !('root' in styles) === false) {\n const s = styles as { root?: Record<string, string> };\n if (s.root) Object.assign(base, s.root);\n }\n return base;\n});\n\n// ─── Lifecycle ────────────────────────────────────────────────────────────────\n\nonMounted(() => {\n updateWidth();\n\n if (typeof ResizeObserver !== 'undefined') {\n containerObserver = new ResizeObserver(() => updateWidth());\n if (rootEl.value) containerObserver.observe(rootEl.value);\n } else {\n // SSR / no ResizeObserver: listen to window resize\n window.addEventListener('resize', updateWidth);\n }\n\n if (fresh) setupItemObserver();\n});\n\nwatch(\n () => fresh,\n (enabled) => {\n if (enabled) {\n setupItemObserver();\n } else {\n itemObserver?.disconnect();\n itemObserver = null;\n itemHeights.value = {};\n }\n },\n);\n\nonBeforeUnmount(() => {\n containerObserver?.disconnect();\n itemObserver?.disconnect();\n window.removeEventListener('resize', updateWidth);\n});\n</script>\n\n<template>\n <!-- role=\"list\" lets screen readers announce item count -->\n <div\n ref=\"rootEl\"\n :class=\"rootClasses\"\n :style=\"rootStyles\"\n role=\"list\"\n aria-label=\"Masonry layout\"\n >\n <!-- Column-based layout: each column is a flex column -->\n <div\n v-for=\"(bucket, colIdx) in columnBuckets\"\n :key=\"colIdx\"\n :class=\"getColumnClasses(colIdx)\"\n :style=\"getColumnStyles(colIdx)\"\n role=\"presentation\"\n >\n <div\n v-for=\"{ item, originalIndex } in bucket\"\n :key=\"item.key\"\n :ref=\"(el) => registerItemEl(item.key, el as Element | null)\"\n :data-masonry-key=\"item.key\"\n :class=\"getItemClasses(item, colIdx)\"\n :style=\"getItemStyles(item, colIdx)\"\n role=\"listitem\"\n >\n <!-- Named item slot (prop-driven items) -->\n <slot v-if=\"$slots.item\" name=\"item\" :item=\"item\" :index=\"originalIndex\" :column=\"colIdx\" />\n <!-- Default slot fallback when using raw children (no items prop) -->\n <template v-else>\n <slot />\n </template>\n </div>\n </div>\n </div>\n</template>\n\n<style>\n/* ─────────────────────────────────────────────────────────────────────────────\n BMasonry — CSS custom properties (scoped to component root)\n ───────────────────────────────────────────────────────────────────────────── */\n.b-masonry {\n /* Layout tokens */\n --b-masonry-columns: 3;\n --b-masonry-col-gap: 0px;\n --b-masonry-row-gap: 0px;\n\n /* Item tokens */\n --b-masonry-item-transition-duration: 200ms;\n --b-masonry-item-transition-timing: ease;\n --b-masonry-item-border-radius: 0px;\n --b-masonry-item-bg: transparent;\n\n /* ── Layout ── */\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n gap: var(--b-masonry-col-gap);\n width: 100%;\n box-sizing: border-box;\n}\n\n/* ── Column ── */\n.b-masonry__column {\n display: flex;\n flex: 1 1 0;\n min-width: 0;\n flex-direction: column;\n gap: var(--b-masonry-row-gap);\n}\n\n/* ── Item ── */\n.b-masonry__item {\n width: 100%;\n box-sizing: border-box;\n background: var(--b-masonry-item-bg);\n border-radius: var(--b-masonry-item-border-radius);\n transition:\n transform var(--b-masonry-item-transition-duration) var(--b-masonry-item-transition-timing),\n opacity var(--b-masonry-item-transition-duration) var(--b-masonry-item-transition-timing);\n}\n\n/* ── Dark mode ── */\n[data-prefers-color='dark'] .b-masonry {\n /* Tokens that shift in dark mode — override as needed by the consumer */\n --b-masonry-item-bg: transparent;\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-masonry {\n /* Tokens that shift in dark mode — override as needed by the consumer */\n --b-masonry-item-bg: transparent;\n }\n}\n\n/* ── Reduced motion ── */\n@media (prefers-reduced-motion: reduce) {\n .b-masonry {\n --b-masonry-item-transition-duration: 0ms;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;EAoEA,IAAM,IAAO,GAyBP,IAAkD;GACtD,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,KAAK;GACN;EAED,SAAS,EAAkB,GAA2B,GAAuB;AAC3E,OAAI,OAAO,KAAU,SAAU,QAAO,KAAK,IAAI,GAAG,EAAM;GAGxD,IAAM,IAAQ,OAAO,KAAK,EAAY,CAA0B,MAC7D,GAAG,MAAM,EAAY,KAAK,EAAY,GACxC;AAED,QAAK,IAAM,KAAM,EACf,KAAI,KAAS,EAAY,MAAO,EAAM,OAAQ,KAAA,EAC5C,QAAO,KAAK,IAAI,GAAG,EAAM,GAAK;GAIlC,IAAM,IAAY,OAAO,KAAK,EAAM,CAA0B,MAC3D,GAAG,MAAM,EAAY,KAAK,EAAY,GACxC,CAAC;AACF,UAAO,IAAW,KAAK,IAAI,GAAG,EAAM,GAAW,GAAG;;EAKpD,IAAM,IAAS,EAAwB,KAAK,EACtC,IAAiB,EAAI,EAAE,EAEzB,IAA2C;EAE/C,SAAS,IAAc;AACrB,GAAI,EAAO,UACT,EAAe,QAAQ,EAAO,MAAM;;EAMxC,IAAM,IAAc,EAAqC,EAAE,CAAC,EACxD,IAAsC,MACpC,IAAU,kBAAmC,IAAI,KAAK,CAAC;EAE7D,SAAS,EAAe,GAAsB,GAAoB;AAChE,OAAI,EAEF,CADA,EAAQ,MAAM,IAAI,GAAK,EAAG,EACtB,EAAA,SAAS,KACX,EAAa,QAAQ,EAAG;QAErB;IACL,IAAM,IAAM,EAAQ,MAAM,IAAI,EAAI;AAElC,IADI,KAAO,KAAc,EAAa,UAAU,EAAI,EACpD,EAAQ,MAAM,OAAO,EAAI;IACzB,IAAM,IAAO,EAAE,GAAG,EAAY,OAAO;AAErC,IADA,OAAO,EAAK,IACZ,EAAY,QAAQ;;;EAIxB,SAAS,IAAoB;AACvB,IAAC,EAAA,SAAS,OAAO,iBAAmB,QACxC,IAAe,IAAI,gBAAgB,MAAY;AAE7C,SAAK,IAAM,KAAS,GAAS;KAE3B,IAAM,IADK,EAAM,OACF,QAAQ;AACvB,SAAI,MAAQ,KAAA,GAAW;MACrB,IAAM,IAAI,EAAM,YAAY;AAC5B,MAAI,EAAY,MAAM,OAAS,MAC7B,EAAY,QAAQ;OAAE,GAAG,EAAY;QAAQ,IAAM;OAAG;;;KAQ5D,EAEF,EAAQ,MAAM,SAAS,MAAO,EAAc,QAAQ,EAAG,CAAC;;EAK1D,IAAM,IAAkB,QAAe,EAAkB,EAAA,SAAS,EAAe,MAAM,CAAC,EAElF,IAAiB,QAAiC;GACtD,IAAM,IAAI,EAAA;AACV,OAAI,MAAM,QAAQ,EAAE,CAGlB,QAAO,CAFQ,EAAkB,EAAE,IAA0B,EAAe,MAAM,EACnE,EAAkB,EAAE,IAA0B,EAAe,MAAM,CAC3D;GAEzB,IAAM,IAAI,EAAkB,GAAyB,EAAe,MAAM;AAC1E,UAAO,CAAC,GAAG,EAAE;IACb,EAGI,IAAgB,QAAkE;GACtF,IAAM,IAAO,EAAgB,OACvB,IAA6D,MAAM,KACvE,EAAE,QAAQ,GAAM,QACV,EAAE,CACT,EACK,IAAU,MAAc,EAAK,CAAC,KAAK,EAAE,EACrC,GAAG,KAAU,EAAe;AAElC,QAAK,IAAI,IAAI,GAAG,IAAI,EAAA,MAAM,QAAQ,KAAK;IACrC,IAAM,IAAO,EAAA,MAAM,IACf;AAUJ,IARA,AAEE,IAFE,EAAK,WAAW,KAAA,IAKN,EAAQ,QAAQ,KAAK,IAAI,GAAG,EAAQ,CAAC,GAHrC,KAAK,IAAI,GAAG,KAAK,IAAI,IAAO,GAAG,EAAK,SAAS,EAAE,CAAC,EAM9D,EAAQ,GAAW,KAAK;KAAE;KAAM,eAAe;KAAG,CAAC;IACnD,IAAM,IAAI,EAAY,MAAM,EAAK,QAAQ,EAAK,UAAU;AACxD,MAAQ,MAAc,KAAK,EAAQ,GAAW,SAAS,IAAI,IAAS;;AAGtE,UAAO;IACP;AAeF,IAbwB,QAAe;GACrC,IAAM,IAAO,EAAgB,OACvB,IAAuC,EAAE;AAC/C,QAAK,IAAI,IAAI,GAAG,IAAI,EAAA,MAAM,QAAQ,KAAK;IACrC,IAAM,IAAO,EAAA,MAAM,IACb,IAAS,EAAc,MAAM,WAAW,MAC5C,EAAE,MAAM,MAAU,EAAM,KAAK,QAAQ,EAAK,IAAI,CAC/C;AACD,IAAI,KAAU,MAAG,EAAI,EAAK,OAAO;;AAEnC,UAAO;IAAE,SAAS;IAAM,WAAW;IAAK;IACxC,GAEsB,MAAQ;AAC9B,KAAK,gBAAgB,EAAI;KACxB,EAAE,WAAW,IAAM,CAAC;EAIvB,SAAS,EAAe,GAAoB,GAAqB;GAC/D,IAAM,IAAO,CAAC,kBAAkB;AAChC,OAAI,CAAC,EAAA,WAAY,QAAO;AAExB,OAAI,OAAO,EAAA,cAAe,YAAY;IACpC,IAAM,IAAQ,EAAA,WAAW,GAAM,EAAY;AAC3C,IAAI,KAAO,EAAK,KAAK,GAAI,MAAM,QAAQ,EAAM,GAAG,IAAQ,CAAC,EAAgB,CAAE;cAClE,OAAO,EAAA,WAAW,QAAS,YAAY;IAChD,IAAM,IAAQ,EAAA,WAAW,KAAK,GAAM,EAAY;AAChD,IAAI,KAAO,EAAK,KAAK,GAAI,MAAM,QAAQ,EAAM,GAAG,IAAQ,CAAC,EAAgB,CAAE;UAClE,OAAO,EAAA,WAAW,QAAS,YACpC,EAAK,KAAK,EAAA,WAAW,KAAK;AAE5B,UAAO;;EAGT,SAAS,EAAc,GAAoB,GAA6C;AAKtF,UAJK,EAAA,SACD,OAAO,EAAA,UAAW,aAAmB,EAAA,OAAO,GAAM,EAAY,IAAI,EAAE,GACpE,OAAO,EAAA,OAAO,QAAS,aAAmB,EAAA,OAAO,KAAK,GAAM,EAAY,IAAI,EAAE,GAC9E,EAAA,OAAO,QAAQ,OAAO,EAAA,OAAO,QAAS,WAAiB,EAAA,OAAO,OAC3D,EAAE,GAJW,EAAE;;EAOxB,SAAS,EAAiB,GAA6B;GACrD,IAAM,IAAO,CAAC,oBAAoB;AAGlC,UAFI,CAAC,EAAA,cAAc,OAAO,EAAA,cAAe,cACrC,EAAA,WAAW,UAAQ,EAAK,KAAK,EAAA,WAAW,OAAO,EADS;;EAK9D,SAAS,EAAgB,GAA2C;AAElE,UADI,CAAC,EAAA,UAAU,OAAO,EAAA,UAAW,aAAmB,EAAE,GAC9C,EAAA,OAAO,UAAqC,EAAE;;EAGxD,IAAM,IAAc,QAAe;GACjC,IAAM,IAAO,CAAC,YAAY;AAG1B,UAFI,CAAC,EAAA,cAAc,OAAO,EAAA,cAAe,cACrC,EAAA,WAAW,QAAM,EAAK,KAAK,EAAA,WAAW,KAAK,EADa;IAG5D,EAEI,IAAa,QAAe;GAChC,IAAM,IAA+B;IACnC,uBAAuB,OAAO,EAAgB,MAAM;IACpD,uBAAuB,GAAG,EAAe,MAAM,GAAG;IAClD,uBAAuB,GAAG,EAAe,MAAM,GAAG;IACnD;AACD,OAAI,EAAA,UAAU,OAAO,EAAA,UAAW,YAAc,UAAU,EAAA,QAAmB;IACzE,IAAM,IAAI,EAAA;AACV,IAAI,EAAE,QAAM,OAAO,OAAO,GAAM,EAAE,KAAK;;AAEzC,UAAO;IACP;SAIF,QAAgB;AAWd,GAVA,GAAa,EAET,OAAO,iBAAmB,OAC5B,IAAoB,IAAI,qBAAqB,GAAa,CAAC,EACvD,EAAO,SAAO,EAAkB,QAAQ,EAAO,MAAM,IAGzD,OAAO,iBAAiB,UAAU,EAAY,EAG5C,EAAA,SAAO,GAAmB;IAC9B,EAEF,QACQ,EAAA,QACL,MAAY;AACX,GAAI,IACF,GAAmB,IAEnB,GAAc,YAAY,EAC1B,IAAe,MACf,EAAY,QAAQ,EAAE;IAG3B,EAED,QAAsB;AAGpB,GAFA,GAAmB,YAAY,EAC/B,GAAc,YAAY,EAC1B,OAAO,oBAAoB,UAAU,EAAY;IACjD,kBAKA,EAgCM,OAAA;YA/BA;GAAJ,KAAI;GACH,OAAK,EAAE,EAAA,MAAW;GAClB,OAAK,EAAE,EAAA,MAAU;GAClB,MAAK;GACL,cAAW;cAGX,EAuBM,GAAA,MAAA,EAtBuB,EAAA,QAAnB,GAAQ,YADlB,EAuBM,OAAA;GArBH,KAAK;GACL,OAAK,EAAE,EAAiB,EAAM,CAAA;GAC9B,OAAK,EAAE,EAAgB,EAAM,CAAA;GAC9B,MAAK;cAEL,EAeM,GAAA,MAAA,EAd8B,IAAM,EAA/B,SAAM,6BADjB,EAeM,OAAA;GAbH,KAAK,EAAK;;GACV,MAAM,MAAO,EAAe,EAAK,KAAK,EAAE;GACxC,oBAAkB,EAAK;GACvB,OAAK,EAAE,EAAe,GAAM,EAAM,CAAA;GAClC,OAAK,EAAE,EAAc,GAAM,EAAM,CAAA;GAClC,MAAK;MAGOA,EAAAA,OAAO,OAAnB,EAA4F,EAAA,QAAA,QAAA;;GAAhD;GAAO,OAAO;GAAgB,QAAQ;OAGhF,EAAQ,EAAA,QAAA,WAAA,EAAA,KAAA,GAAA,CAAA,CAAA,EAAA,IAAA,EAAA"}
@@ -1,45 +1,8 @@
1
- import { BMenuContextKey as e } from "./design-system130.js";
2
- import t from "./design-system133.js";
3
- import { Fragment as n, createBlock as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, createTextVNode as s, defineComponent as c, inject as l, openBlock as u, renderList as d, renderSlot as f, toDisplayString as p, unref as m } from "vue";
4
- //#region src/components/BMenu/BMenuItemGroup.vue?vue&type=script&setup=true&lang.ts
5
- var h = {
6
- class: "b-menu-item-group",
7
- role: "presentation"
8
- }, g = {
9
- key: 0,
10
- class: "b-menu-item-group__title",
11
- role: "presentation"
12
- }, _ = ["aria-label"], v = /* @__PURE__ */ c({
13
- __name: "BMenuItemGroup",
14
- props: {
15
- label: { default: "" },
16
- children: { default: () => [] }
17
- },
18
- setup(c) {
19
- let v = c, y = l(e);
20
- return (e, c) => (u(), a("li", h, [m(y).inlineCollapsed.value ? i("", !0) : (u(), a("div", g, [f(e.$slots, "title", {}, () => [s(p(v.label), 1)])])), o("ul", {
21
- class: "b-menu-item-group__list",
22
- role: "group",
23
- "aria-label": v.label
24
- }, [f(e.$slots, "default", {}, () => [(u(!0), a(n, null, d(v.children, (e) => (u(), r(t, {
25
- key: e.key,
26
- "item-key": e.key,
27
- label: e.label,
28
- icon: e.icon,
29
- disabled: e.disabled,
30
- danger: e.danger,
31
- extra: e.extra
32
- }, null, 8, [
33
- "item-key",
34
- "label",
35
- "icon",
36
- "disabled",
37
- "danger",
38
- "extra"
39
- ]))), 128))])], 8, _)]));
40
- }
41
- });
1
+ import e from "./design-system132.js";
2
+ /* empty css */
3
+ //#region src/components/BMasonry/BMasonry.vue
4
+ var t = e;
42
5
  //#endregion
43
- export { v as default };
6
+ export { t as default };
44
7
 
45
8
  //# sourceMappingURL=design-system134.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"design-system134.js","names":[],"sources":["../src/components/BMenu/BMenuItemGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { inject } from 'vue';\nimport BMenuItem from './BMenuItem.vue';\nimport { BMenuContextKey, type BMenuContext, type BMenuItemType } from './types';\n\n// ─────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────\nconst props = withDefaults(\n defineProps<{\n /** Group title label. */\n label?: string;\n /** Items within this group. */\n children?: BMenuItemType[];\n }>(),\n {\n label: '',\n children: () => [],\n },\n);\n\ndefineSlots<{\n default?(): unknown;\n title?(): unknown;\n}>();\n\nconst menu = inject<BMenuContext>(BMenuContextKey)!;\n</script>\n\n<template>\n <li class=\"b-menu-item-group\" role=\"presentation\">\n <div v-if=\"!menu.inlineCollapsed.value\" class=\"b-menu-item-group__title\" role=\"presentation\">\n <slot name=\"title\">{{ props.label }}</slot>\n </div>\n <ul class=\"b-menu-item-group__list\" role=\"group\" :aria-label=\"props.label\">\n <slot>\n <BMenuItem\n v-for=\"item in props.children\"\n :key=\"item.key\"\n :item-key=\"item.key\"\n :label=\"item.label\"\n :icon=\"item.icon\"\n :disabled=\"item.disabled\"\n :danger=\"item.danger\"\n :extra=\"item.extra\"\n />\n </slot>\n </ul>\n </li>\n</template>\n\n<style>\n/* ─────────────────────────────────────────────\n BMenuItemGroup\n ───────────────────────────────────────────── */\n.b-menu-item-group {\n list-style: none;\n}\n\n.b-menu-item-group__title {\n padding: 8px 16px 4px;\n color: var(--b-menu-group-title-color);\n font-size: var(--b-menu-group-title-font-size);\n line-height: var(--b-menu-group-title-line-height);\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.b-menu-item-group__list {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAQA,IAAM,IAAQ,GAkBR,IAAO,EAAqB,EAAgB;yBAIhD,EAkBK,MAlBL,GAkBK,CAjBS,EAAA,EAAI,CAAC,gBAAgB,QACE,EAAA,IAAA,GAAA,IADF,GAAA,EAAjC,EAEM,OAFN,GAEM,CADJ,EAA2C,EAAA,QAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAArB,EAAM,MAAK,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,GAEnC,EAaK,MAAA;GAbD,OAAM;GAA0B,MAAK;GAAS,cAAY,EAAM;MAClE,EAWO,EAAA,QAAA,WAAA,EAAA,QAAA,EAAA,EAAA,GAAA,EAVL,EASE,GAAA,MAAA,EARe,EAAM,WAAd,YADT,EASE,GAAA;GAPC,KAAK,EAAK;GACV,YAAU,EAAK;GACf,OAAO,EAAK;GACZ,MAAM,EAAK;GACX,UAAU,EAAK;GACf,QAAQ,EAAK;GACb,OAAO,EAAK"}
1
+ {"version":3,"file":"design-system134.js","names":[],"sources":["../src/components/BMasonry/BMasonry.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport type {\n BMasonryBreakpoint,\n BMasonryClassNames,\n BMasonryItem,\n BMasonryLayoutChangePayload,\n BMasonryResponsive,\n BMasonryStyles,\n} from './types';\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nconst {\n columns = 3,\n // eslint-disable-next-line vue/require-valid-default-prop\n gutter = 0,\n items = [],\n fresh = false,\n classNames,\n styles,\n} = defineProps<{\n /**\n * Number of columns. Accepts a fixed number or a breakpoint map.\n * @example 3\n * @example { xs: 1, sm: 2, md: 3, lg: 4 }\n * @default 3\n */\n columns?: BMasonryResponsive;\n\n /**\n * Gap between items in pixels. Accepts a fixed value, a [colGap, rowGap] tuple,\n * or a breakpoint map for responsive gaps.\n * @example 16\n * @example [16, 8]\n * @example { xs: 8, md: 16 }\n * @default 0\n */\n gutter?: BMasonryResponsive | [BMasonryResponsive, BMasonryResponsive];\n\n /**\n * Array of masonry items to render.\n * @default []\n */\n items?: BMasonryItem[];\n\n /**\n * When true, observe every item's size so the layout re-flows when children resize.\n * Requires ResizeObserver support; degrades gracefully when unavailable.\n * @default false\n */\n fresh?: boolean;\n\n /**\n * Customize CSS classes on semantic DOM elements (`root`, `column`, `item`).\n * Can be a plain object or a per-item function `(item, columnIndex) => classes`.\n */\n classNames?: BMasonryClassNames;\n\n /**\n * Customize inline styles on semantic DOM elements (`root`, `column`, `item`).\n * Can be a plain object or a per-item function `(item, columnIndex) => styles`.\n */\n styles?: BMasonryStyles;\n}>();\n\n// ─── Emits ────────────────────────────────────────────────────────────────────\n\nconst emit = defineEmits<{\n /**\n * Fires after each layout recalculation with the resolved column count and\n * the column assignment map (item key → 0-based column index).\n */\n layoutChange: [payload: BMasonryLayoutChangePayload];\n}>();\n\n// ─── Slots ────────────────────────────────────────────────────────────────────\n\ndefineSlots<{\n /**\n * Custom rendering for each item. Receives `{ item: BMasonryItem, index: number, column: number }`.\n */\n item?: (props: { item: BMasonryItem; index: number; column: number }) => unknown;\n\n /**\n * Default slot used when no `items` prop is provided — raw child nodes are\n * distributed across columns automatically.\n */\n default?: (props: Record<string, never>) => unknown;\n}>();\n\n// ─── Responsive helpers ───────────────────────────────────────────────────────\n\nconst BREAKPOINTS: Record<BMasonryBreakpoint, number> = {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1600,\n};\n\nfunction resolveResponsive(value: BMasonryResponsive, width: number): number {\n if (typeof value === 'number') return Math.max(1, value);\n\n // Breakpoint map — pick the largest breakpoint that still fits\n const keys = (Object.keys(BREAKPOINTS) as BMasonryBreakpoint[]).sort(\n (a, b) => BREAKPOINTS[b] - BREAKPOINTS[a],\n );\n\n for (const bp of keys) {\n if (width >= BREAKPOINTS[bp] && value[bp] !== undefined) {\n return Math.max(1, value[bp]!);\n }\n }\n // Fallback to smallest defined value\n const smallest = (Object.keys(value) as BMasonryBreakpoint[]).sort(\n (a, b) => BREAKPOINTS[a] - BREAKPOINTS[b],\n )[0];\n return smallest ? Math.max(1, value[smallest]!) : 1;\n}\n\n// ─── Container width tracking ─────────────────────────────────────────────────\n\nconst rootEl = ref<HTMLElement | null>(null);\nconst containerWidth = ref(0);\n\nlet containerObserver: ResizeObserver | null = null;\n\nfunction updateWidth() {\n if (rootEl.value) {\n containerWidth.value = rootEl.value.offsetWidth;\n }\n}\n\n// ─── Item height tracking (fresh mode) ────────────────────────────────────────\n\nconst itemHeights = ref<Record<string | number, number>>({});\nlet itemObserver: ResizeObserver | null = null;\nconst itemEls = ref<Map<string | number, Element>>(new Map());\n\nfunction registerItemEl(key: string | number, el: Element | null) {\n if (el) {\n itemEls.value.set(key, el);\n if (fresh && itemObserver) {\n itemObserver.observe(el);\n }\n } else {\n const old = itemEls.value.get(key);\n if (old && itemObserver) itemObserver.unobserve(old);\n itemEls.value.delete(key);\n const next = { ...itemHeights.value };\n delete next[key];\n itemHeights.value = next;\n }\n}\n\nfunction setupItemObserver() {\n if (!fresh || typeof ResizeObserver === 'undefined') return;\n itemObserver = new ResizeObserver((entries) => {\n let changed = false;\n for (const entry of entries) {\n const el = entry.target as HTMLElement;\n const key = el.dataset.masonryKey;\n if (key !== undefined) {\n const h = entry.contentRect.height;\n if (itemHeights.value[key] !== h) {\n itemHeights.value = { ...itemHeights.value, [key]: h };\n changed = true;\n }\n }\n }\n if (changed) {\n // trigger layout recompute (handled reactively via computed)\n }\n });\n // Observe any already-mounted elements\n itemEls.value.forEach((el) => itemObserver!.observe(el));\n}\n\n// ─── Core layout algorithm ────────────────────────────────────────────────────\n\nconst resolvedColumns = computed(() => resolveResponsive(columns, containerWidth.value));\n\nconst resolvedGutter = computed<[number, number]>(() => {\n const g = gutter;\n if (Array.isArray(g)) {\n const colGap = resolveResponsive(g[0] as BMasonryResponsive, containerWidth.value);\n const rowGap = resolveResponsive(g[1] as BMasonryResponsive, containerWidth.value);\n return [colGap, rowGap];\n }\n const v = resolveResponsive(g as BMasonryResponsive, containerWidth.value);\n return [v, v];\n});\n\n/** Distribute items across columns using the \"shortest column first\" strategy. */\nconst columnBuckets = computed<{ item: BMasonryItem; originalIndex: number }[][]>(() => {\n const cols = resolvedColumns.value;\n const buckets: { item: BMasonryItem; originalIndex: number }[][] = Array.from(\n { length: cols },\n () => [],\n );\n const heights = Array<number>(cols).fill(0);\n const [, rowGap] = resolvedGutter.value;\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n let targetCol: number;\n\n if (item.column !== undefined) {\n // Pinned column (1-based → 0-based, clamped)\n targetCol = Math.max(0, Math.min(cols - 1, item.column - 1));\n } else {\n // Shortest column\n targetCol = heights.indexOf(Math.min(...heights));\n }\n\n buckets[targetCol].push({ item, originalIndex: i });\n const h = itemHeights.value[item.key] ?? item.height ?? 0;\n heights[targetCol] += h + (buckets[targetCol].length > 1 ? rowGap : 0);\n }\n\n return buckets;\n});\n\nconst layoutColumnMap = computed(() => {\n const cols = resolvedColumns.value;\n const map: Record<string | number, number> = {};\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const bucket = columnBuckets.value.findIndex((b) =>\n b.some((entry) => entry.item.key === item.key),\n );\n if (bucket >= 0) map[item.key] = bucket;\n }\n return { columns: cols, columnMap: map };\n});\n\nwatch(layoutColumnMap, (val) => {\n emit('layoutChange', val);\n}, { immediate: true });\n\n// ─── CSS class/style helpers ──────────────────────────────────────────────────\n\nfunction getItemClasses(item: BMasonryItem, columnIndex: number) {\n const base = ['b-masonry__item'];\n if (!classNames) return base;\n\n if (typeof classNames === 'function') {\n const extra = classNames(item, columnIndex);\n if (extra) base.push(...(Array.isArray(extra) ? extra : [extra as string]));\n } else if (typeof classNames.item === 'function') {\n const extra = classNames.item(item, columnIndex);\n if (extra) base.push(...(Array.isArray(extra) ? extra : [extra as string]));\n } else if (typeof classNames.item === 'string') {\n base.push(classNames.item);\n }\n return base;\n}\n\nfunction getItemStyles(item: BMasonryItem, columnIndex: number): Record<string, string> {\n if (!styles) return {};\n if (typeof styles === 'function') return styles(item, columnIndex) ?? {};\n if (typeof styles.item === 'function') return styles.item(item, columnIndex) ?? {};\n if (styles.item && typeof styles.item === 'object') return styles.item as Record<string, string>;\n return {};\n}\n\nfunction getColumnClasses(_colIndex: number): string[] {\n const base = ['b-masonry__column'];\n if (!classNames || typeof classNames === 'function') return base;\n if (classNames.column) base.push(classNames.column);\n return base;\n}\n\nfunction getColumnStyles(_colIndex: number): Record<string, string> {\n if (!styles || typeof styles === 'function') return {};\n return (styles.column as Record<string, string>) ?? {};\n}\n\nconst rootClasses = computed(() => {\n const base = ['b-masonry'];\n if (!classNames || typeof classNames === 'function') return base;\n if (classNames.root) base.push(classNames.root);\n return base;\n});\n\nconst rootStyles = computed(() => {\n const base: Record<string, string> = {\n '--b-masonry-columns': String(resolvedColumns.value),\n '--b-masonry-col-gap': `${resolvedGutter.value[0]}px`,\n '--b-masonry-row-gap': `${resolvedGutter.value[1]}px`,\n };\n if (styles && typeof styles === 'object' && !('root' in styles) === false) {\n const s = styles as { root?: Record<string, string> };\n if (s.root) Object.assign(base, s.root);\n }\n return base;\n});\n\n// ─── Lifecycle ────────────────────────────────────────────────────────────────\n\nonMounted(() => {\n updateWidth();\n\n if (typeof ResizeObserver !== 'undefined') {\n containerObserver = new ResizeObserver(() => updateWidth());\n if (rootEl.value) containerObserver.observe(rootEl.value);\n } else {\n // SSR / no ResizeObserver: listen to window resize\n window.addEventListener('resize', updateWidth);\n }\n\n if (fresh) setupItemObserver();\n});\n\nwatch(\n () => fresh,\n (enabled) => {\n if (enabled) {\n setupItemObserver();\n } else {\n itemObserver?.disconnect();\n itemObserver = null;\n itemHeights.value = {};\n }\n },\n);\n\nonBeforeUnmount(() => {\n containerObserver?.disconnect();\n itemObserver?.disconnect();\n window.removeEventListener('resize', updateWidth);\n});\n</script>\n\n<template>\n <!-- role=\"list\" lets screen readers announce item count -->\n <div\n ref=\"rootEl\"\n :class=\"rootClasses\"\n :style=\"rootStyles\"\n role=\"list\"\n aria-label=\"Masonry layout\"\n >\n <!-- Column-based layout: each column is a flex column -->\n <div\n v-for=\"(bucket, colIdx) in columnBuckets\"\n :key=\"colIdx\"\n :class=\"getColumnClasses(colIdx)\"\n :style=\"getColumnStyles(colIdx)\"\n role=\"presentation\"\n >\n <div\n v-for=\"{ item, originalIndex } in bucket\"\n :key=\"item.key\"\n :ref=\"(el) => registerItemEl(item.key, el as Element | null)\"\n :data-masonry-key=\"item.key\"\n :class=\"getItemClasses(item, colIdx)\"\n :style=\"getItemStyles(item, colIdx)\"\n role=\"listitem\"\n >\n <!-- Named item slot (prop-driven items) -->\n <slot v-if=\"$slots.item\" name=\"item\" :item=\"item\" :index=\"originalIndex\" :column=\"colIdx\" />\n <!-- Default slot fallback when using raw children (no items prop) -->\n <template v-else>\n <slot />\n </template>\n </div>\n </div>\n </div>\n</template>\n\n<style>\n/* ─────────────────────────────────────────────────────────────────────────────\n BMasonry — CSS custom properties (scoped to component root)\n ───────────────────────────────────────────────────────────────────────────── */\n.b-masonry {\n /* Layout tokens */\n --b-masonry-columns: 3;\n --b-masonry-col-gap: 0px;\n --b-masonry-row-gap: 0px;\n\n /* Item tokens */\n --b-masonry-item-transition-duration: 200ms;\n --b-masonry-item-transition-timing: ease;\n --b-masonry-item-border-radius: 0px;\n --b-masonry-item-bg: transparent;\n\n /* ── Layout ── */\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n gap: var(--b-masonry-col-gap);\n width: 100%;\n box-sizing: border-box;\n}\n\n/* ── Column ── */\n.b-masonry__column {\n display: flex;\n flex: 1 1 0;\n min-width: 0;\n flex-direction: column;\n gap: var(--b-masonry-row-gap);\n}\n\n/* ── Item ── */\n.b-masonry__item {\n width: 100%;\n box-sizing: border-box;\n background: var(--b-masonry-item-bg);\n border-radius: var(--b-masonry-item-border-radius);\n transition:\n transform var(--b-masonry-item-transition-duration) var(--b-masonry-item-transition-timing),\n opacity var(--b-masonry-item-transition-duration) var(--b-masonry-item-transition-timing);\n}\n\n/* ── Dark mode ── */\n[data-prefers-color='dark'] .b-masonry {\n /* Tokens that shift in dark mode — override as needed by the consumer */\n --b-masonry-item-bg: transparent;\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-masonry {\n /* Tokens that shift in dark mode — override as needed by the consumer */\n --b-masonry-item-bg: transparent;\n }\n}\n\n/* ── Reduced motion ── */\n@media (prefers-reduced-motion: reduce) {\n .b-masonry {\n --b-masonry-item-transition-duration: 0ms;\n }\n}\n</style>\n"],"mappings":""}
@@ -0,0 +1,12 @@
1
+ //#region src/components/BMentions/types.ts
2
+ var e = /* @__PURE__ */ function(e) {
3
+ return e.Error = "error", e.Warning = "warning", e;
4
+ }({}), t = /* @__PURE__ */ function(e) {
5
+ return e.Outlined = "outlined", e.Filled = "filled", e.Borderless = "borderless", e;
6
+ }({}), n = /* @__PURE__ */ function(e) {
7
+ return e.Top = "top", e.Bottom = "bottom", e;
8
+ }({});
9
+ //#endregion
10
+ export { n as BMentionsPlacement, e as BMentionsStatus, t as BMentionsVariant };
11
+
12
+ //# sourceMappingURL=design-system135.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-system135.js","names":[],"sources":["../src/components/BMentions/types.ts"],"sourcesContent":["export interface BMentionsOption {\n /** Display label for the mention suggestion. Falls back to `value` if omitted. */\n label?: string;\n /** The value inserted when this option is selected. */\n value: string;\n /** Whether this option is disabled. */\n disabled?: boolean;\n}\n\nexport enum BMentionsStatus {\n Error = 'error',\n Warning = 'warning',\n}\n\nexport enum BMentionsVariant {\n Outlined = 'outlined',\n Filled = 'filled',\n Borderless = 'borderless',\n}\n\nexport enum BMentionsPlacement {\n Top = 'top',\n Bottom = 'bottom',\n}\n"],"mappings":";AASA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,QAAA,SACA,EAAA,UAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,WAAA,YACA,EAAA,SAAA,UACA,EAAA,aAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,MAAA,OACA,EAAA,SAAA;KACD"}
@@ -1,8 +1,277 @@
1
- import e from "./design-system134.js";
2
- /* empty css */
3
- //#region src/components/BMenu/BMenuItemGroup.vue
4
- var t = e;
1
+ import { BCommonSize as e } from "./design-system3.js";
2
+ import { useComponentId as t } from "./design-system10.js";
3
+ import { BMentionsStatus as n, BMentionsVariant as r } from "./design-system135.js";
4
+ import { Fragment as i, computed as a, createCommentVNode as o, createElementBlock as s, createElementVNode as c, createTextVNode as l, defineComponent as u, mergeModels as d, mergeProps as f, nextTick as p, normalizeClass as m, openBlock as h, ref as g, renderList as _, renderSlot as v, toDisplayString as y, unref as b, useAttrs as ee, useCssVars as x, useModel as te, watch as S, withModifiers as C } from "vue";
5
+ //#region src/components/BMentions/BMentions.vue?vue&type=script&setup=true&lang.ts
6
+ var w = [
7
+ "aria-label",
8
+ "aria-expanded",
9
+ "aria-controls"
10
+ ], T = [
11
+ "value",
12
+ "placeholder",
13
+ "disabled",
14
+ "readonly",
15
+ "rows",
16
+ "aria-label",
17
+ "aria-activedescendant"
18
+ ], E = ["id", "aria-label"], D = {
19
+ key: 0,
20
+ class: "b-mentions__options"
21
+ }, O = [
22
+ "id",
23
+ "data-active",
24
+ "aria-selected",
25
+ "aria-disabled",
26
+ "onMousedown",
27
+ "onMouseenter"
28
+ ], k = {
29
+ key: 1,
30
+ class: "b-mentions__not-found"
31
+ }, A = /* @__PURE__ */ u({
32
+ inheritAttrs: !1,
33
+ __name: "BMentions",
34
+ props: /* @__PURE__ */ d({
35
+ options: { default: () => [] },
36
+ size: { default: () => e.Medium },
37
+ variant: { default: () => r.Outlined },
38
+ placement: {},
39
+ prefix: { default: "@" },
40
+ split: { default: " " },
41
+ autoSize: {
42
+ type: [Boolean, Object],
43
+ default: !1
44
+ },
45
+ allowClear: {
46
+ type: Boolean,
47
+ default: !1
48
+ },
49
+ filterOption: {
50
+ type: [Boolean, Function],
51
+ default: !0
52
+ },
53
+ notFoundContent: { default: "Not Found" },
54
+ disabled: { type: Boolean },
55
+ readOnly: { type: Boolean },
56
+ status: {},
57
+ placeholder: {},
58
+ rows: { default: 3 }
59
+ }, {
60
+ modelValue: { default: "" },
61
+ modelModifiers: {}
62
+ }),
63
+ emits: /* @__PURE__ */ d([
64
+ "change",
65
+ "select",
66
+ "search",
67
+ "focus",
68
+ "blur",
69
+ "clear",
70
+ "resize",
71
+ "popupScroll"
72
+ ], ["update:modelValue"]),
73
+ setup(e, { expose: r, emit: u }) {
74
+ x((e) => ({ v21fd39a6: N.value }));
75
+ let d = ee(), A = u, j = te(e, "modelValue"), { componentUID: M } = t(), N = a(() => `--b-mentions-anchor-${M.value}`), P = a(() => `b-mentions-listbox-${M.value}`), F = g(null), I = g(null), L = g(!1), R = g(!1), z = g(-1), B = g(!1), V = g(""), H = g(""), U = g(0), W = a(() => Array.isArray(e.prefix) ? e.prefix : [e.prefix]), G = a(() => {
76
+ let t = H.value.toLowerCase();
77
+ return e.filterOption ? typeof e.filterOption == "function" ? e.options.filter((n) => e.filterOption(t, n)) : t ? e.options.filter((e) => (e.label ?? e.value).toLowerCase().includes(t)) : e.options : e.options;
78
+ }), K = a(() => !B.value || G.value.length === 0 && e.notFoundContent === null ? !1 : R.value), q = (e) => e.label ?? e.value;
79
+ function J() {
80
+ R.value || I.value?.showPopover();
81
+ }
82
+ function Y() {
83
+ R.value && I.value?.hidePopover();
84
+ }
85
+ function X({ newState: e }) {
86
+ let t = e === "open";
87
+ R.value = t, t && G.value.length > 0 ? z.value = 0 : t || (z.value = -1, B.value = !1);
88
+ }
89
+ function Z(t, n) {
90
+ for (let r of W.value) {
91
+ let i = t.slice(0, n), a = i.lastIndexOf(r);
92
+ if (a < 0) continue;
93
+ let o = i.slice(a + r.length);
94
+ if (!/\s/.test(o) && (a === 0 || t[a - 1] === e.split || /\s/.test(t[a - 1]))) return {
95
+ start: a,
96
+ prefix: r
97
+ };
98
+ }
99
+ return null;
100
+ }
101
+ function ne(e, t) {
102
+ let n = Z(e, t);
103
+ n ? (B.value = !0, V.value = n.prefix, U.value = n.start, H.value = e.slice(n.start + n.prefix.length, t), A("search", H.value, n.prefix), p(() => J())) : Q();
104
+ }
105
+ function Q() {
106
+ Y(), B.value = !1, H.value = "", V.value = "", U.value = 0;
107
+ }
108
+ function $(t) {
109
+ if (t.disabled) return;
110
+ let n = F.value;
111
+ if (!n) return;
112
+ let r = j.value ?? "", i = n.selectionStart, a = r.slice(0, U.value), o = r.slice(i), s = `${V.value}${t.value}`, c = o && !o.startsWith(e.split) && e.split, l = `${a}${s}${c ? e.split : ""}${o}`;
113
+ j.value = l, A("change", l), A("select", t, V.value), Q();
114
+ let u = a.length + s.length + (c ? e.split.length : 0);
115
+ p(() => {
116
+ n.focus(), n.setSelectionRange(u, u);
117
+ });
118
+ }
119
+ function re(e) {
120
+ let t = e.target, n = t.value;
121
+ j.value = n, A("change", n);
122
+ let r = t.selectionStart;
123
+ ne(n, r), le();
124
+ }
125
+ function ie(e) {
126
+ L.value = !0, A("focus", e);
127
+ }
128
+ function ae(e) {
129
+ let t = e.relatedTarget;
130
+ I.value?.contains(t) || (L.value = !1, A("blur", e), Q());
131
+ }
132
+ function oe(e) {
133
+ if (K.value) switch (e.key) {
134
+ case "ArrowDown": {
135
+ e.preventDefault();
136
+ let t = G.value;
137
+ if (t.length === 0) return;
138
+ let n = z.value + 1;
139
+ for (let e = 0; e < t.length; e++) {
140
+ let r = (n + e) % t.length;
141
+ if (!t[r].disabled) {
142
+ z.value = r;
143
+ break;
144
+ }
145
+ }
146
+ break;
147
+ }
148
+ case "ArrowUp": {
149
+ e.preventDefault();
150
+ let t = G.value;
151
+ if (t.length === 0) return;
152
+ let n = z.value - 1;
153
+ for (let e = 0; e < t.length; e++) {
154
+ let r = ((n - e) % t.length + t.length) % t.length;
155
+ if (!t[r].disabled) {
156
+ z.value = r;
157
+ break;
158
+ }
159
+ }
160
+ break;
161
+ }
162
+ case "Enter":
163
+ if (e.preventDefault(), z.value >= 0) {
164
+ let e = G.value[z.value];
165
+ e && !e.disabled && $(e);
166
+ }
167
+ break;
168
+ case "Escape":
169
+ e.preventDefault(), Q();
170
+ break;
171
+ }
172
+ }
173
+ function se() {
174
+ j.value = "", A("change", ""), A("clear"), Q(), F.value?.focus();
175
+ }
176
+ function ce(e) {
177
+ A("popupScroll", e);
178
+ }
179
+ function le() {
180
+ if (!e.autoSize || !F.value) return;
181
+ let t = F.value;
182
+ t.style.height = "auto";
183
+ let n = typeof e.autoSize == "object" ? e.autoSize : {}, r = parseFloat(getComputedStyle(t).lineHeight) || 20, i = t.scrollHeight;
184
+ n.minRows && (i = Math.max(i, n.minRows * r)), n.maxRows && (i = Math.min(i, n.maxRows * r)), t.style.height = `${i}px`, A("resize", {
185
+ width: t.offsetWidth,
186
+ height: i
187
+ });
188
+ }
189
+ return S(z, () => {
190
+ p(() => {
191
+ (I.value?.querySelector("[data-active=\"true\"]"))?.scrollIntoView({ block: "nearest" });
192
+ });
193
+ }), S(j, (e) => {
194
+ F.value && F.value.value !== e && (F.value.value = e ?? "");
195
+ }), r({
196
+ focus: () => F.value?.focus(),
197
+ blur: () => F.value?.blur()
198
+ }), (t, r) => (h(), s("div", {
199
+ class: m(["b-mentions", [
200
+ `b-mentions--${e.size}`,
201
+ `b-mentions--${e.variant}`,
202
+ {
203
+ "b-mentions--focused": L.value,
204
+ "b-mentions--disabled": e.disabled,
205
+ "b-mentions--error": e.status === b(n).Error,
206
+ "b-mentions--warning": e.status === b(n).Warning,
207
+ "b-mentions--has-clear": e.allowClear
208
+ }
209
+ ]]),
210
+ role: "combobox",
211
+ "aria-label": e.placeholder || "Mentions input",
212
+ "aria-expanded": K.value,
213
+ "aria-haspopup": "listbox",
214
+ "aria-controls": K.value ? P.value : void 0
215
+ }, [
216
+ c("textarea", f({
217
+ ref_key: "textareaRef",
218
+ ref: F
219
+ }, b(d), {
220
+ value: j.value,
221
+ class: "b-mentions__textarea",
222
+ placeholder: e.placeholder,
223
+ disabled: e.disabled,
224
+ readonly: e.readOnly,
225
+ rows: e.autoSize ? void 0 : e.rows,
226
+ "aria-label": e.placeholder || "Mentions input",
227
+ autocomplete: "off",
228
+ "aria-activedescendant": z.value >= 0 ? `${P.value}-option-${z.value}` : void 0,
229
+ "aria-autocomplete": "list",
230
+ onInput: re,
231
+ onFocus: ie,
232
+ onBlur: ae,
233
+ onKeydown: oe
234
+ }), null, 16, T),
235
+ e.allowClear && j.value && !e.disabled ? (h(), s("button", {
236
+ key: 0,
237
+ type: "button",
238
+ class: "b-mentions__clear",
239
+ "aria-label": "Clear input",
240
+ tabindex: "-1",
241
+ onMousedown: C(se, ["prevent"])
242
+ }, null, 32)) : o("", !0),
243
+ B.value || R.value ? (h(), s("div", {
244
+ key: 1,
245
+ ref_key: "menuRef",
246
+ ref: I,
247
+ id: P.value,
248
+ class: "b-mentions__dropdown",
249
+ popover: "manual",
250
+ role: "listbox",
251
+ "aria-label": `Mention suggestions for ${V.value}`,
252
+ onToggle: X,
253
+ onScroll: ce
254
+ }, [G.value.length > 0 ? (h(), s("ul", D, [(h(!0), s(i, null, _(G.value, (e, n) => (h(), s("li", {
255
+ key: e.value,
256
+ id: `${P.value}-option-${n}`,
257
+ class: m(["b-mentions__option", {
258
+ "b-mentions__option--active": n === z.value && !e.disabled,
259
+ "b-mentions__option--disabled": e.disabled
260
+ }]),
261
+ "data-active": n === z.value,
262
+ "aria-selected": n === z.value,
263
+ "aria-disabled": e.disabled ?? !1,
264
+ role: "option",
265
+ onMousedown: C((t) => $(e), ["prevent"]),
266
+ onMouseenter: (e) => z.value = n
267
+ }, [v(t.$slots, "option", {
268
+ option: e,
269
+ index: n
270
+ }, () => [l(y(q(e)), 1)], !0)], 42, O))), 128))])) : e.notFoundContent ? (h(), s("div", k, [v(t.$slots, "notFoundContent", {}, () => [l(y(e.notFoundContent), 1)], !0)])) : o("", !0)], 40, E)) : o("", !0)
271
+ ], 10, w));
272
+ }
273
+ });
5
274
  //#endregion
6
- export { t as default };
275
+ export { A as default };
7
276
 
8
277
  //# sourceMappingURL=design-system136.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"design-system136.js","names":[],"sources":["../src/components/BMenu/BMenuItemGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { inject } from 'vue';\nimport BMenuItem from './BMenuItem.vue';\nimport { BMenuContextKey, type BMenuContext, type BMenuItemType } from './types';\n\n// ─────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────\nconst props = withDefaults(\n defineProps<{\n /** Group title label. */\n label?: string;\n /** Items within this group. */\n children?: BMenuItemType[];\n }>(),\n {\n label: '',\n children: () => [],\n },\n);\n\ndefineSlots<{\n default?(): unknown;\n title?(): unknown;\n}>();\n\nconst menu = inject<BMenuContext>(BMenuContextKey)!;\n</script>\n\n<template>\n <li class=\"b-menu-item-group\" role=\"presentation\">\n <div v-if=\"!menu.inlineCollapsed.value\" class=\"b-menu-item-group__title\" role=\"presentation\">\n <slot name=\"title\">{{ props.label }}</slot>\n </div>\n <ul class=\"b-menu-item-group__list\" role=\"group\" :aria-label=\"props.label\">\n <slot>\n <BMenuItem\n v-for=\"item in props.children\"\n :key=\"item.key\"\n :item-key=\"item.key\"\n :label=\"item.label\"\n :icon=\"item.icon\"\n :disabled=\"item.disabled\"\n :danger=\"item.danger\"\n :extra=\"item.extra\"\n />\n </slot>\n </ul>\n </li>\n</template>\n\n<style>\n/* ─────────────────────────────────────────────\n BMenuItemGroup\n ───────────────────────────────────────────── */\n.b-menu-item-group {\n list-style: none;\n}\n\n.b-menu-item-group__title {\n padding: 8px 16px 4px;\n color: var(--b-menu-group-title-color);\n font-size: var(--b-menu-group-title-font-size);\n line-height: var(--b-menu-group-title-line-height);\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.b-menu-item-group__list {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"design-system136.js","names":[],"sources":["../src/components/BMentions/BMentions.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useComponentId } from '@/composables/useComponentId.ts';\nimport { BCommonSize } from '@/types.ts';\nimport { computed, nextTick, ref, useAttrs, watch } from 'vue';\n\nimport { BMentionsStatus, BMentionsVariant, type BMentionsOption } from './types.ts';\n\ndefineOptions({ inheritAttrs: false });\n\nconst attrs = useAttrs();\n\nconst {\n options = [],\n size = BCommonSize.Medium,\n variant = BMentionsVariant.Outlined,\n prefix = '@',\n split = ' ',\n autoSize = false,\n allowClear = false,\n filterOption = true,\n notFoundContent = 'Not Found',\n placeholder,\n rows = 3,\n} = defineProps<{\n /** Data source for mention suggestions. */\n options?: BMentionsOption[];\n /** Size of the textarea. */\n size?: `${BCommonSize}`;\n /** Visual variant. */\n variant?: `${BMentionsVariant}`;\n /** Popup positioning relative to cursor. */\n placement?: 'top' | 'bottom';\n /** Trigger character(s) for mention lookup. */\n prefix?: string | string[];\n /** Delimiter character(s) inserted before/after mention. */\n split?: string;\n /** Auto-resize the textarea height. Can be boolean or { minRows, maxRows }. */\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n /** Show clear button when there is content. */\n allowClear?: boolean;\n /** Filter options by search text. `true` for default filter, function for custom. */\n filterOption?: boolean | ((search: string, option: BMentionsOption) => boolean);\n /** Content shown when no results match. Set to `null` to hide dropdown when empty. */\n notFoundContent?: string | null;\n /** Whether the textarea is disabled. */\n disabled?: boolean;\n /** Whether the textarea is read-only. */\n readOnly?: boolean;\n /** Validation status. */\n status?: `${BMentionsStatus}`;\n /** Placeholder text. */\n placeholder?: string;\n /** Number of visible text lines (when autoSize is false). */\n rows?: number;\n}>();\n\nconst emit = defineEmits<{\n /** Fired when the input value changes. */\n change: [value: string];\n /** Fired when an option is selected. */\n select: [option: BMentionsOption, prefix: string];\n /** Fired when a prefix character is typed and search begins. */\n search: [text: string, prefix: string];\n /** Fired when input gains focus. */\n focus: [event: FocusEvent];\n /** Fired when input loses focus. */\n blur: [event: FocusEvent];\n /** Fired when the clear button is clicked. */\n clear: [];\n /** Fired on textarea resize (when autoSize is active). */\n resize: [size: { width: number; height: number }];\n /** Fired during popup scroll. */\n popupScroll: [event: Event];\n}>();\n\nconst model = defineModel<string>({ default: '' });\n\nconst { componentUID } = useComponentId();\nconst anchorName = computed(() => `--b-mentions-anchor-${componentUID.value}`);\nconst listboxId = computed(() => `b-mentions-listbox-${componentUID.value}`);\n\nconst textareaRef = ref<HTMLTextAreaElement | null>(null);\nconst menuRef = ref<HTMLElement | null>(null);\nconst isFocused = ref(false);\nconst isOpen = ref(false);\nconst activeIndex = ref(-1);\nconst measuring = ref(false);\nconst measurePrefix = ref('');\nconst measureText = ref('');\nconst measureStart = ref(0);\n\nconst prefixes = computed(() => (Array.isArray(prefix) ? prefix : [prefix]));\n\nconst filteredOptions = computed(() => {\n const search = measureText.value.toLowerCase();\n if (!filterOption) return options;\n if (typeof filterOption === 'function') {\n return options.filter((opt) => filterOption(search, opt));\n }\n if (!search) return options;\n return options.filter((opt) => {\n const text = (opt.label ?? opt.value).toLowerCase();\n return text.includes(search);\n });\n});\n\nconst showDropdown = computed(() => {\n if (!measuring.value) return false;\n if (filteredOptions.value.length === 0 && notFoundContent === null) return false;\n return isOpen.value;\n});\n\nconst getOptionLabel = (opt: BMentionsOption) => opt.label ?? opt.value;\n\nfunction openMenu() {\n if (isOpen.value) return;\n menuRef.value?.showPopover();\n}\n\nfunction closeMenu() {\n if (!isOpen.value) return;\n menuRef.value?.hidePopover();\n}\n\nfunction handleToggle({ newState }: ToggleEvent) {\n const nowOpen = newState === 'open';\n isOpen.value = nowOpen;\n if (nowOpen && filteredOptions.value.length > 0) {\n activeIndex.value = 0;\n } else if (!nowOpen) {\n activeIndex.value = -1;\n measuring.value = false;\n }\n}\n\nfunction getLastMeasureIndex(\n text: string,\n cursorPos: number,\n): { start: number; prefix: string } | null {\n for (const p of prefixes.value) {\n const beforeCursor = text.slice(0, cursorPos);\n const lastPrefixIdx = beforeCursor.lastIndexOf(p);\n if (lastPrefixIdx < 0) continue;\n const afterPrefix = beforeCursor.slice(lastPrefixIdx + p.length);\n if (/\\s/.test(afterPrefix)) continue;\n if (\n lastPrefixIdx === 0 ||\n text[lastPrefixIdx - 1] === split ||\n /\\s/.test(text[lastPrefixIdx - 1])\n ) {\n return { start: lastPrefixIdx, prefix: p };\n }\n }\n return null;\n}\n\nfunction startMeasure(text: string, cursorPos: number) {\n const measure = getLastMeasureIndex(text, cursorPos);\n if (measure) {\n measuring.value = true;\n measurePrefix.value = measure.prefix;\n measureStart.value = measure.start;\n measureText.value = text.slice(measure.start + measure.prefix.length, cursorPos);\n emit('search', measureText.value, measure.prefix);\n nextTick(() => openMenu());\n } else {\n stopMeasure();\n }\n}\n\nfunction stopMeasure() {\n closeMenu();\n measuring.value = false;\n measureText.value = '';\n measurePrefix.value = '';\n measureStart.value = 0;\n}\n\nfunction selectOption(opt: BMentionsOption) {\n if (opt.disabled) return;\n\n const textarea = textareaRef.value;\n if (!textarea) return;\n\n const value = model.value ?? '';\n const cursorPos = textarea.selectionStart;\n const beforeMention = value.slice(0, measureStart.value);\n const afterMention = value.slice(cursorPos);\n\n const mentionValue = `${measurePrefix.value}${opt.value}`;\n const needsTrailingSplit = afterMention && !afterMention.startsWith(split) && split;\n const newValue = `${beforeMention}${mentionValue}${needsTrailingSplit ? split : ''}${afterMention}`;\n\n model.value = newValue;\n emit('change', newValue);\n emit('select', opt, measurePrefix.value);\n\n stopMeasure();\n\n const newCursorPos =\n beforeMention.length + mentionValue.length + (needsTrailingSplit ? split.length : 0);\n nextTick(() => {\n textarea.focus();\n textarea.setSelectionRange(newCursorPos, newCursorPos);\n });\n}\n\nfunction handleInput(e: Event) {\n const target = e.target as HTMLTextAreaElement;\n const value = target.value;\n model.value = value;\n emit('change', value);\n\n const cursorPos = target.selectionStart;\n startMeasure(value, cursorPos);\n adjustHeight();\n}\n\nfunction handleFocus(e: FocusEvent) {\n isFocused.value = true;\n emit('focus', e);\n}\n\nfunction handleBlur(e: FocusEvent) {\n const related = e.relatedTarget as HTMLElement | null;\n if (menuRef.value?.contains(related)) return;\n isFocused.value = false;\n emit('blur', e);\n stopMeasure();\n}\n\nfunction handleKeyDown(e: KeyboardEvent) {\n if (!showDropdown.value) return;\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n const opts = filteredOptions.value;\n if (opts.length === 0) return;\n const next = activeIndex.value + 1;\n for (let i = 0; i < opts.length; i++) {\n const idx = (next + i) % opts.length;\n if (!opts[idx].disabled) {\n activeIndex.value = idx;\n break;\n }\n }\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const opts = filteredOptions.value;\n if (opts.length === 0) return;\n const prev = activeIndex.value - 1;\n for (let i = 0; i < opts.length; i++) {\n const idx = (((prev - i) % opts.length) + opts.length) % opts.length;\n if (!opts[idx].disabled) {\n activeIndex.value = idx;\n break;\n }\n }\n break;\n }\n case 'Enter': {\n e.preventDefault();\n if (activeIndex.value >= 0) {\n const opt = filteredOptions.value[activeIndex.value];\n if (opt && !opt.disabled) {\n selectOption(opt);\n }\n }\n break;\n }\n case 'Escape': {\n e.preventDefault();\n stopMeasure();\n break;\n }\n }\n}\n\nfunction handleClear() {\n model.value = '';\n emit('change', '');\n emit('clear');\n stopMeasure();\n textareaRef.value?.focus();\n}\n\nfunction handlePopupScroll(e: Event) {\n emit('popupScroll', e);\n}\n\nfunction adjustHeight() {\n if (!autoSize || !textareaRef.value) return;\n const textarea = textareaRef.value;\n textarea.style.height = 'auto';\n\n const config = typeof autoSize === 'object' ? autoSize : {};\n const lineHeight = parseFloat(getComputedStyle(textarea).lineHeight) || 20;\n\n let newHeight = textarea.scrollHeight;\n if (config.minRows) {\n newHeight = Math.max(newHeight, config.minRows * lineHeight);\n }\n if (config.maxRows) {\n newHeight = Math.min(newHeight, config.maxRows * lineHeight);\n }\n\n textarea.style.height = `${newHeight}px`;\n emit('resize', { width: textarea.offsetWidth, height: newHeight });\n}\n\nconst scrollActiveIntoView = () => {\n nextTick(() => {\n const active = menuRef.value?.querySelector('[data-active=\"true\"]');\n active?.scrollIntoView({ block: 'nearest' });\n });\n};\n\nwatch(activeIndex, scrollActiveIntoView);\n\nwatch(model, (val) => {\n if (textareaRef.value && textareaRef.value.value !== val) {\n textareaRef.value.value = val ?? '';\n }\n});\n\ndefineExpose({\n focus: () => textareaRef.value?.focus(),\n blur: () => textareaRef.value?.blur(),\n});\n</script>\n\n<template>\n <div\n class=\"b-mentions\"\n :class=\"[\n `b-mentions--${size}`,\n `b-mentions--${variant}`,\n {\n 'b-mentions--focused': isFocused,\n 'b-mentions--disabled': disabled,\n 'b-mentions--error': status === BMentionsStatus.Error,\n 'b-mentions--warning': status === BMentionsStatus.Warning,\n 'b-mentions--has-clear': allowClear,\n },\n ]\"\n role=\"combobox\"\n :aria-label=\"placeholder || 'Mentions input'\"\n :aria-expanded=\"showDropdown\"\n :aria-haspopup=\"'listbox'\"\n :aria-controls=\"showDropdown ? listboxId : undefined\"\n >\n <textarea\n ref=\"textareaRef\"\n v-bind=\"attrs\"\n :value=\"model\"\n class=\"b-mentions__textarea\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readOnly\"\n :rows=\"autoSize ? undefined : rows\"\n :aria-label=\"placeholder || 'Mentions input'\"\n autocomplete=\"off\"\n :aria-activedescendant=\"activeIndex >= 0 ? `${listboxId}-option-${activeIndex}` : undefined\"\n aria-autocomplete=\"list\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @keydown=\"handleKeyDown\"\n />\n\n <button\n v-if=\"allowClear && model && !disabled\"\n type=\"button\"\n class=\"b-mentions__clear\"\n aria-label=\"Clear input\"\n tabindex=\"-1\"\n @mousedown.prevent=\"handleClear\"\n ></button>\n\n <div\n v-if=\"measuring || isOpen\"\n ref=\"menuRef\"\n :id=\"listboxId\"\n class=\"b-mentions__dropdown\"\n popover=\"manual\"\n role=\"listbox\"\n :aria-label=\"`Mention suggestions for ${measurePrefix}`\"\n @toggle=\"handleToggle\"\n @scroll=\"handlePopupScroll\"\n >\n <ul v-if=\"filteredOptions.length > 0\" class=\"b-mentions__options\">\n <li\n v-for=\"(opt, idx) in filteredOptions\"\n :key=\"opt.value\"\n :id=\"`${listboxId}-option-${idx}`\"\n class=\"b-mentions__option\"\n :class=\"{\n 'b-mentions__option--active': idx === activeIndex && !opt.disabled,\n 'b-mentions__option--disabled': opt.disabled,\n }\"\n :data-active=\"idx === activeIndex\"\n :aria-selected=\"idx === activeIndex\"\n :aria-disabled=\"opt.disabled ?? false\"\n role=\"option\"\n @mousedown.prevent=\"selectOption(opt)\"\n @mouseenter=\"activeIndex = idx\"\n >\n <slot name=\"option\" :option=\"opt\" :index=\"idx\">\n {{ getOptionLabel(opt) }}\n </slot>\n </li>\n </ul>\n <div v-else-if=\"notFoundContent\" class=\"b-mentions__not-found\">\n <slot name=\"notFoundContent\">\n {{ notFoundContent }}\n </slot>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.b-mentions {\n --b-mentions-active-bg: #ffffff;\n --b-mentions-active-border-color: #1677ff;\n --b-mentions-active-shadow: 0 0 0 2px rgba(5, 145, 255, 0.1);\n --b-mentions-hover-bg: #ffffff;\n --b-mentions-hover-border-color: #4096ff;\n --b-mentions-border-color: #d9d9d9;\n --b-mentions-bg: #ffffff;\n --b-mentions-color: rgba(0, 0, 0, 0.88);\n --b-mentions-placeholder-color: rgba(0, 0, 0, 0.25);\n --b-mentions-font-size: 14px;\n --b-mentions-font-size-lg: 16px;\n --b-mentions-font-size-sm: 14px;\n --b-mentions-padding-block: 4px;\n --b-mentions-padding-block-lg: 7px;\n --b-mentions-padding-block-sm: 0px;\n --b-mentions-padding-inline: 11px;\n --b-mentions-padding-inline-lg: 11px;\n --b-mentions-padding-inline-sm: 7px;\n --b-mentions-border-radius: 6px;\n --b-mentions-disabled-bg: rgba(0, 0, 0, 0.04);\n --b-mentions-disabled-color: rgba(0, 0, 0, 0.25);\n --b-mentions-error-border-color: #ff4d4f;\n --b-mentions-error-hover-border-color: #ff7875;\n --b-mentions-error-active-shadow: 0 0 0 2px rgba(255, 38, 5, 0.06);\n --b-mentions-warning-border-color: #faad14;\n --b-mentions-warning-hover-border-color: #ffc53d;\n --b-mentions-warning-active-shadow: 0 0 0 2px rgba(255, 215, 5, 0.1);\n --b-mentions-dropdown-bg: #ffffff;\n --b-mentions-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-mentions-dropdown-height: 250px;\n --b-mentions-option-active-bg: rgba(0, 0, 0, 0.04);\n --b-mentions-option-selected-bg: #e6f4ff;\n --b-mentions-option-font-size: 14px;\n --b-mentions-option-padding-x: 12px;\n --b-mentions-option-padding-y: 5px;\n --b-mentions-clear-color: rgba(0, 0, 0, 0.25);\n --b-mentions-clear-hover-color: rgba(0, 0, 0, 0.45);\n --b-mentions-z-index-popup: 1050;\n\n display: flex;\n width: 100%;\n}\n\n.b-mentions--has-clear {\n position: relative;\n}\n\n/* ── Textarea ── */\n.b-mentions__textarea {\n position: relative;\n width: 100%;\n box-sizing: border-box;\n outline: none;\n resize: vertical;\n font-family: inherit;\n line-height: 1.5714;\n color: var(--b-mentions-color);\n background-color: var(--b-mentions-bg);\n border: 1px solid var(--b-mentions-border-color);\n border-radius: var(--b-mentions-border-radius);\n transition:\n border-color 0.2s,\n box-shadow 0.2s,\n background-color 0.2s;\n anchor-name: v-bind('anchorName');\n}\n\n.b-mentions__textarea::placeholder {\n color: var(--b-mentions-placeholder-color);\n}\n\n/* ── Sizes ── */\n.b-mentions--sm .b-mentions__textarea {\n padding: var(--b-mentions-padding-block-sm) var(--b-mentions-padding-inline-sm);\n font-size: var(--b-mentions-font-size-sm);\n}\n\n.b-mentions--md .b-mentions__textarea {\n padding: var(--b-mentions-padding-block) var(--b-mentions-padding-inline);\n font-size: var(--b-mentions-font-size);\n}\n\n.b-mentions--lg .b-mentions__textarea {\n padding: var(--b-mentions-padding-block-lg) var(--b-mentions-padding-inline-lg);\n font-size: var(--b-mentions-font-size-lg);\n}\n\n/* ── Variants ── */\n.b-mentions--outlined .b-mentions__textarea {\n border-color: var(--b-mentions-border-color);\n}\n\n.b-mentions--filled .b-mentions__textarea {\n border-color: transparent;\n background-color: var(--b-mentions-disabled-bg);\n}\n\n.b-mentions--borderless .b-mentions__textarea {\n border-color: transparent;\n background-color: transparent;\n box-shadow: none;\n}\n\n/* ── States ── */\n.b-mentions--focused:not(.b-mentions--disabled) .b-mentions__textarea {\n border-color: var(--b-mentions-active-border-color);\n box-shadow: var(--b-mentions-active-shadow);\n background-color: var(--b-mentions-active-bg);\n}\n\n.b-mentions:not(.b-mentions--focused):not(.b-mentions--disabled):hover .b-mentions__textarea {\n border-color: var(--b-mentions-hover-border-color);\n background-color: var(--b-mentions-hover-bg);\n}\n\n.b-mentions--borderless.b-mentions--focused .b-mentions__textarea {\n box-shadow: none;\n}\n\n/* ── Disabled ── */\n.b-mentions--disabled .b-mentions__textarea {\n cursor: not-allowed;\n background-color: var(--b-mentions-disabled-bg);\n color: var(--b-mentions-disabled-color);\n}\n\n/* ── Error status ── */\n.b-mentions--error .b-mentions__textarea {\n border-color: var(--b-mentions-error-border-color);\n}\n\n.b-mentions--error:not(.b-mentions--disabled):hover .b-mentions__textarea {\n border-color: var(--b-mentions-error-hover-border-color);\n}\n\n.b-mentions--error.b-mentions--focused .b-mentions__textarea {\n border-color: var(--b-mentions-error-border-color);\n box-shadow: var(--b-mentions-error-active-shadow);\n}\n\n/* ── Warning status ── */\n.b-mentions--warning .b-mentions__textarea {\n border-color: var(--b-mentions-warning-border-color);\n}\n\n.b-mentions--warning:not(.b-mentions--disabled):hover .b-mentions__textarea {\n border-color: var(--b-mentions-warning-hover-border-color);\n}\n\n.b-mentions--warning.b-mentions--focused .b-mentions__textarea {\n border-color: var(--b-mentions-warning-border-color);\n box-shadow: var(--b-mentions-warning-active-shadow);\n}\n\n/* ── Clear button ── */\n.b-mentions__clear {\n position: absolute;\n top: 8px;\n right: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: var(--b-mentions-clear-color);\n font-size: 10px;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.b-mentions__clear::after {\n content: '\\2715';\n}\n\n.b-mentions__clear:hover {\n color: var(--b-mentions-clear-hover-color);\n}\n\n/* ── Dropdown ── */\n.b-mentions__dropdown {\n margin: 0;\n padding: 4px;\n border: none;\n border-radius: var(--b-mentions-border-radius);\n background: var(--b-mentions-dropdown-bg);\n box-shadow: var(--b-mentions-dropdown-shadow);\n max-height: var(--b-mentions-dropdown-height);\n overflow-y: auto;\n z-index: var(--b-mentions-z-index-popup);\n\n position: absolute;\n position-anchor: v-bind('anchorName');\n inset: auto;\n top: anchor(bottom);\n left: anchor(left);\n width: anchor-size(width);\n position-try-fallbacks: --b-mentions-top;\n\n opacity: 0;\n transition:\n display 0.2s allow-discrete,\n opacity 0.2s;\n}\n\n.b-mentions__dropdown:popover-open {\n opacity: 1;\n\n @starting-style {\n opacity: 0;\n }\n}\n\n@position-try --b-mentions-top {\n inset: auto;\n bottom: anchor(top);\n left: anchor(left);\n}\n\n/* ── Options list ── */\n.b-mentions__options {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.b-mentions__option {\n padding: var(--b-mentions-option-padding-y) var(--b-mentions-option-padding-x);\n font-size: var(--b-mentions-option-font-size);\n line-height: 1.5714;\n border-radius: 4px;\n cursor: pointer;\n transition: background-color 0.15s;\n}\n\n.b-mentions__option--active {\n background: var(--b-mentions-option-active-bg);\n}\n\n.b-mentions__option:hover:not(.b-mentions__option--disabled) {\n background: var(--b-mentions-option-active-bg);\n}\n\n.b-mentions__option--disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n/* ── Not found ── */\n.b-mentions__not-found {\n padding: var(--b-mentions-option-padding-y) var(--b-mentions-option-padding-x);\n font-size: var(--b-mentions-option-font-size);\n color: var(--b-mentions-disabled-color);\n text-align: center;\n}\n\n/* ── Dark mode ── */\n[data-prefers-color='dark'] .b-mentions {\n --b-mentions-active-bg: #1f1f1f;\n --b-mentions-active-border-color: #1668dc;\n --b-mentions-active-shadow: 0 0 0 2px rgba(22, 104, 220, 0.15);\n --b-mentions-hover-bg: #1f1f1f;\n --b-mentions-hover-border-color: #3c89e8;\n --b-mentions-border-color: #424242;\n --b-mentions-bg: #1f1f1f;\n --b-mentions-color: rgba(255, 255, 255, 0.88);\n --b-mentions-placeholder-color: rgba(255, 255, 255, 0.25);\n --b-mentions-disabled-bg: rgba(255, 255, 255, 0.08);\n --b-mentions-disabled-color: rgba(255, 255, 255, 0.25);\n --b-mentions-dropdown-bg: #2a2a2a;\n --b-mentions-dropdown-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 3px 6px -4px rgba(0, 0, 0, 0.48),\n 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n --b-mentions-option-active-bg: rgba(255, 255, 255, 0.08);\n --b-mentions-option-selected-bg: #111a2c;\n --b-mentions-clear-color: rgba(255, 255, 255, 0.25);\n --b-mentions-clear-hover-color: rgba(255, 255, 255, 0.45);\n --b-mentions-error-border-color: #d32029;\n --b-mentions-error-hover-border-color: #e84749;\n --b-mentions-error-active-shadow: 0 0 0 2px rgba(211, 32, 41, 0.1);\n --b-mentions-warning-border-color: #d89614;\n --b-mentions-warning-hover-border-color: #e8b339;\n --b-mentions-warning-active-shadow: 0 0 0 2px rgba(216, 150, 20, 0.1);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-mentions {\n --b-mentions-active-bg: #1f1f1f;\n --b-mentions-active-border-color: #1668dc;\n --b-mentions-active-shadow: 0 0 0 2px rgba(22, 104, 220, 0.15);\n --b-mentions-hover-bg: #1f1f1f;\n --b-mentions-hover-border-color: #3c89e8;\n --b-mentions-border-color: #424242;\n --b-mentions-bg: #1f1f1f;\n --b-mentions-color: rgba(255, 255, 255, 0.88);\n --b-mentions-placeholder-color: rgba(255, 255, 255, 0.25);\n --b-mentions-disabled-bg: rgba(255, 255, 255, 0.08);\n --b-mentions-disabled-color: rgba(255, 255, 255, 0.25);\n --b-mentions-dropdown-bg: #2a2a2a;\n --b-mentions-dropdown-shadow:\n 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 3px 6px -4px rgba(0, 0, 0, 0.48),\n 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n --b-mentions-option-active-bg: rgba(255, 255, 255, 0.08);\n --b-mentions-option-selected-bg: #111a2c;\n --b-mentions-clear-color: rgba(255, 255, 255, 0.25);\n --b-mentions-clear-hover-color: rgba(255, 255, 255, 0.45);\n --b-mentions-error-border-color: #d32029;\n --b-mentions-error-hover-border-color: #e84749;\n --b-mentions-error-active-shadow: 0 0 0 2px rgba(211, 32, 41, 0.1);\n --b-mentions-warning-border-color: #d89614;\n --b-mentions-warning-hover-border-color: #e8b339;\n --b-mentions-warning-active-shadow: 0 0 0 2px rgba(216, 150, 20, 0.1);\n }\n}\n\n/* ── Reduced motion ── */\n@media (prefers-reduced-motion: reduce) {\n .b-mentions__textarea,\n .b-mentions__dropdown,\n .b-mentions__option,\n .b-mentions__clear {\n transition: none;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASA,IAAM,IAAQ,IAAU,EA+ClB,IAAO,GAmBP,IAAQ,GAAmB,GAAA,aAAiB,EAE5C,EAAE,oBAAiB,GAAgB,EACnC,IAAa,QAAe,uBAAuB,EAAa,QAAQ,EACxE,IAAY,QAAe,sBAAsB,EAAa,QAAQ,EAEtE,IAAc,EAAgC,KAAK,EACnD,IAAU,EAAwB,KAAK,EACvC,IAAY,EAAI,GAAM,EACtB,IAAS,EAAI,GAAM,EACnB,IAAc,EAAI,GAAG,EACrB,IAAY,EAAI,GAAM,EACtB,IAAgB,EAAI,GAAG,EACvB,IAAc,EAAI,GAAG,EACrB,IAAe,EAAI,EAAE,EAErB,IAAW,QAAgB,MAAM,QAAQ,EAAA,OAAO,GAAG,EAAA,SAAS,CAAC,EAAA,OAAO,CAAE,EAEtE,IAAkB,QAAe;GACrC,IAAM,IAAS,EAAY,MAAM,aAAa;AAM9C,UALK,EAAA,eACD,OAAO,EAAA,gBAAiB,aACnB,EAAA,QAAQ,QAAQ,MAAQ,EAAA,aAAa,GAAQ,EAAI,CAAC,GAEtD,IACE,EAAA,QAAQ,QAAQ,OACP,EAAI,SAAS,EAAI,OAAO,aAAa,CACvC,SAAS,EAAO,CAC5B,GAJkB,EAAA,UAJM,EAAA;IAS1B,EAEI,IAAe,QACf,CAAC,EAAU,SACX,EAAgB,MAAM,WAAW,KAAK,EAAA,oBAAoB,OAAa,KACpE,EAAO,MACd,EAEI,KAAkB,MAAyB,EAAI,SAAS,EAAI;EAElE,SAAS,IAAW;AACd,KAAO,SACX,EAAQ,OAAO,aAAa;;EAG9B,SAAS,IAAY;AACd,KAAO,SACZ,EAAQ,OAAO,aAAa;;EAG9B,SAAS,EAAa,EAAE,eAAyB;GAC/C,IAAM,IAAU,MAAa;AAE7B,GADA,EAAO,QAAQ,GACX,KAAW,EAAgB,MAAM,SAAS,IAC5C,EAAY,QAAQ,IACV,MACV,EAAY,QAAQ,IACpB,EAAU,QAAQ;;EAItB,SAAS,EACP,GACA,GAC0C;AAC1C,QAAK,IAAM,KAAK,EAAS,OAAO;IAC9B,IAAM,IAAe,EAAK,MAAM,GAAG,EAAU,EACvC,IAAgB,EAAa,YAAY,EAAE;AACjD,QAAI,IAAgB,EAAG;IACvB,IAAM,IAAc,EAAa,MAAM,IAAgB,EAAE,OAAO;AAC5D,cAAK,KAAK,EAAY,KAExB,MAAkB,KAClB,EAAK,IAAgB,OAAO,EAAA,SAC5B,KAAK,KAAK,EAAK,IAAgB,GAAE,EAEjC,QAAO;KAAE,OAAO;KAAe,QAAQ;KAAG;;AAG9C,UAAO;;EAGT,SAAS,GAAa,GAAc,GAAmB;GACrD,IAAM,IAAU,EAAoB,GAAM,EAAU;AACpD,GAAI,KACF,EAAU,QAAQ,IAClB,EAAc,QAAQ,EAAQ,QAC9B,EAAa,QAAQ,EAAQ,OAC7B,EAAY,QAAQ,EAAK,MAAM,EAAQ,QAAQ,EAAQ,OAAO,QAAQ,EAAU,EAChF,EAAK,UAAU,EAAY,OAAO,EAAQ,OAAO,EACjD,QAAe,GAAU,CAAC,IAE1B,GAAa;;EAIjB,SAAS,IAAc;AAKrB,GAJA,GAAW,EACX,EAAU,QAAQ,IAClB,EAAY,QAAQ,IACpB,EAAc,QAAQ,IACtB,EAAa,QAAQ;;EAGvB,SAAS,EAAa,GAAsB;AAC1C,OAAI,EAAI,SAAU;GAElB,IAAM,IAAW,EAAY;AAC7B,OAAI,CAAC,EAAU;GAEf,IAAM,IAAQ,EAAM,SAAS,IACvB,IAAY,EAAS,gBACrB,IAAgB,EAAM,MAAM,GAAG,EAAa,MAAM,EAClD,IAAe,EAAM,MAAM,EAAU,EAErC,IAAe,GAAG,EAAc,QAAQ,EAAI,SAC5C,IAAqB,KAAgB,CAAC,EAAa,WAAW,EAAA,MAAM,IAAI,EAAA,OACxE,IAAW,GAAG,IAAgB,IAAe,IAAqB,EAAA,QAAQ,KAAK;AAMrF,GAJA,EAAM,QAAQ,GACd,EAAK,UAAU,EAAS,EACxB,EAAK,UAAU,GAAK,EAAc,MAAM,EAExC,GAAa;GAEb,IAAM,IACJ,EAAc,SAAS,EAAa,UAAU,IAAqB,EAAA,MAAM,SAAS;AACpF,WAAe;AAEb,IADA,EAAS,OAAO,EAChB,EAAS,kBAAkB,GAAc,EAAa;KACtD;;EAGJ,SAAS,GAAY,GAAU;GAC7B,IAAM,IAAS,EAAE,QACX,IAAQ,EAAO;AAErB,GADA,EAAM,QAAQ,GACd,EAAK,UAAU,EAAM;GAErB,IAAM,IAAY,EAAO;AAEzB,GADA,GAAa,GAAO,EAAU,EAC9B,IAAc;;EAGhB,SAAS,GAAY,GAAe;AAElC,GADA,EAAU,QAAQ,IAClB,EAAK,SAAS,EAAE;;EAGlB,SAAS,GAAW,GAAe;GACjC,IAAM,IAAU,EAAE;AACd,KAAQ,OAAO,SAAS,EAAQ,KACpC,EAAU,QAAQ,IAClB,EAAK,QAAQ,EAAE,EACf,GAAa;;EAGf,SAAS,GAAc,GAAkB;AAClC,SAAa,MAElB,SAAQ,EAAE,KAAV;IACE,KAAK,aAAa;AAChB,OAAE,gBAAgB;KAClB,IAAM,IAAO,EAAgB;AAC7B,SAAI,EAAK,WAAW,EAAG;KACvB,IAAM,IAAO,EAAY,QAAQ;AACjC,UAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK;MACpC,IAAM,KAAO,IAAO,KAAK,EAAK;AAC9B,UAAI,CAAC,EAAK,GAAK,UAAU;AACvB,SAAY,QAAQ;AACpB;;;AAGJ;;IAEF,KAAK,WAAW;AACd,OAAE,gBAAgB;KAClB,IAAM,IAAO,EAAgB;AAC7B,SAAI,EAAK,WAAW,EAAG;KACvB,IAAM,IAAO,EAAY,QAAQ;AACjC,UAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK;MACpC,IAAM,MAAS,IAAO,KAAK,EAAK,SAAU,EAAK,UAAU,EAAK;AAC9D,UAAI,CAAC,EAAK,GAAK,UAAU;AACvB,SAAY,QAAQ;AACpB;;;AAGJ;;IAEF,KAAK;AAEH,SADA,EAAE,gBAAgB,EACd,EAAY,SAAS,GAAG;MAC1B,IAAM,IAAM,EAAgB,MAAM,EAAY;AAC9C,MAAI,KAAO,CAAC,EAAI,YACd,EAAa,EAAI;;AAGrB;IAEF,KAAK;AAEH,KADA,EAAE,gBAAgB,EAClB,GAAa;AACb;;;EAKN,SAAS,KAAc;AAKrB,GAJA,EAAM,QAAQ,IACd,EAAK,UAAU,GAAG,EAClB,EAAK,QAAQ,EACb,GAAa,EACb,EAAY,OAAO,OAAO;;EAG5B,SAAS,GAAkB,GAAU;AACnC,KAAK,eAAe,EAAE;;EAGxB,SAAS,KAAe;AACtB,OAAI,CAAC,EAAA,YAAY,CAAC,EAAY,MAAO;GACrC,IAAM,IAAW,EAAY;AAC7B,KAAS,MAAM,SAAS;GAExB,IAAM,IAAS,OAAO,EAAA,YAAa,WAAW,EAAA,WAAW,EAAE,EACrD,IAAa,WAAW,iBAAiB,EAAS,CAAC,WAAW,IAAI,IAEpE,IAAY,EAAS;AASzB,GARI,EAAO,YACT,IAAY,KAAK,IAAI,GAAW,EAAO,UAAU,EAAW,GAE1D,EAAO,YACT,IAAY,KAAK,IAAI,GAAW,EAAO,UAAU,EAAW,GAG9D,EAAS,MAAM,SAAS,GAAG,EAAU,KACrC,EAAK,UAAU;IAAE,OAAO,EAAS;IAAa,QAAQ;IAAW,CAAC;;SAUpE,EAAM,SAP6B;AACjC,WAAe;AAEb,KADe,EAAQ,OAAO,cAAc,yBAAuB,GAC3D,eAAe,EAAE,OAAO,WAAW,CAAC;KAC5C;IAGoC,EAExC,EAAM,IAAQ,MAAQ;AACpB,GAAI,EAAY,SAAS,EAAY,MAAM,UAAU,MACnD,EAAY,MAAM,QAAQ,KAAO;IAEnC,EAEF,EAAa;GACX,aAAa,EAAY,OAAO,OAAO;GACvC,YAAY,EAAY,OAAO,MAAM;GACtC,CAAC,kBAIA,EAsFM,OAAA;GArFJ,OAAK,EAAA,CAAC,cAAY;mBACa,EAAA;mBAA6B,EAAA;;4BAAkD,EAAA;6BAA2C,EAAA;0BAAuC,EAAA,WAAW,EAAA,EAAe,CAAC;4BAAsC,EAAA,WAAW,EAAA,EAAe,CAAC;8BAA0C,EAAA;;;GAWtU,MAAK;GACJ,cAAY,EAAA,eAAW;GACvB,iBAAe,EAAA;GACf,iBAAe;GACf,iBAAe,EAAA,QAAe,EAAA,QAAY,KAAA;;GAE3C,EAiBE,YAjBF,EAiBE;aAhBI;IAAJ,KAAI;MACI,EAAA,EAAK,EAAA;IACZ,OAAO,EAAA;IACR,OAAM;IACL,aAAa,EAAA;IACb,UAAU,EAAA;IACV,UAAU,EAAA;IACV,MAAM,EAAA,WAAW,KAAA,IAAY,EAAA;IAC7B,cAAY,EAAA,eAAW;IACxB,cAAa;IACZ,yBAAuB,EAAA,SAAW,IAAA,GAAW,EAAA,MAAS,UAAW,EAAA,UAAgB,KAAA;IAClF,qBAAkB;IACjB,SAAO;IACP,SAAO;IACP,QAAM;IACN,WAAS;;GAIJ,EAAA,cAAc,EAAA,SAAK,CAAK,EAAA,YAAA,GAAA,EADhC,EAOU,UAAA;;IALR,MAAK;IACL,OAAM;IACN,cAAW;IACX,UAAS;IACR,aAAS,EAAU,IAAW,CAAA,UAAA,CAAA;;GAIzB,EAAA,SAAa,EAAA,SAAA,GAAA,EADrB,EAsCM,OAAA;;aApCA;IAAJ,KAAI;IACH,IAAI,EAAA;IACL,OAAM;IACN,SAAQ;IACR,MAAK;IACJ,cAAU,2BAA6B,EAAA;IACvC,UAAQ;IACR,UAAQ;OAEC,EAAA,MAAgB,SAAM,KAAA,GAAA,EAAhC,EAqBK,MArBL,GAqBK,EAAA,EAAA,GAAA,EApBH,EAmBK,GAAA,MAAA,EAlBkB,EAAA,QAAb,GAAK,YADf,EAmBK,MAAA;IAjBF,KAAK,EAAI;IACT,IAAE,GAAK,EAAA,MAAS,UAAW;IAC5B,OAAK,EAAA,CAAC,sBAAoB;mCAC0B,MAAQ,EAAA,SAAW,CAAK,EAAI;qCAAsD,EAAI;;IAIzI,eAAa,MAAQ,EAAA;IACrB,iBAAe,MAAQ,EAAA;IACvB,iBAAe,EAAI,YAAQ;IAC5B,MAAK;IACJ,aAAS,GAAA,MAAU,EAAa,EAAG,EAAA,CAAA,UAAA,CAAA;IACnC,eAAU,MAAE,EAAA,QAAc;OAE3B,EAEO,EAAA,QAAA,UAAA;IAFc,QAAQ;IAAM,OAAO;YAEnC,CAAA,EAAA,EADF,EAAe,EAAG,CAAA,EAAA,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,IAAA,EAAA,eAIX,EAAA,mBAAA,GAAA,EAAhB,EAIM,OAJN,GAIM,CAHJ,EAEO,EAAA,QAAA,mBAAA,EAAA,QAAA,CAAA,EAAA,EADF,EAAA,gBAAe,EAAA,EAAA,CAAA,EAAA,GAAA,CAAA,CAAA,IAAA,EAAA,IAAA,GAAA,CAAA,EAAA,IAAA,EAAA,IAAA,EAAA,IAAA,GAAA"}
@@ -0,0 +1,9 @@
1
+ import e from "./design-system14.js";
2
+ import t from "./design-system136.js";
3
+ /* empty css */
4
+ //#region src/components/BMentions/BMentions.vue
5
+ var n = /* @__PURE__ */ e(t, [["__scopeId", "data-v-8c92c351"]]);
6
+ //#endregion
7
+ export { n as default };
8
+
9
+ //# sourceMappingURL=design-system138.js.map