@7pmlabs/design-system 2.0.8 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/README.md +4 -4
  2. package/dist/design-system.css +1 -1
  3. package/dist/design-system.js +65 -59
  4. package/dist/design-system100.js +1 -1
  5. package/dist/design-system100.js.map +1 -1
  6. package/dist/design-system101.js +87 -53
  7. package/dist/design-system101.js.map +1 -1
  8. package/dist/design-system103.js +5 -13
  9. package/dist/design-system103.js.map +1 -1
  10. package/dist/design-system104.js +53 -108
  11. package/dist/design-system104.js.map +1 -1
  12. package/dist/{design-system102.js → design-system105.js} +1 -1
  13. package/dist/{design-system102.js.map → design-system105.js.map} +1 -1
  14. package/dist/design-system106.js +13 -6
  15. package/dist/design-system106.js.map +1 -1
  16. package/dist/design-system107.js +93 -190
  17. package/dist/design-system107.js.map +1 -1
  18. package/dist/design-system109.js +2 -2
  19. package/dist/design-system109.js.map +1 -1
  20. package/dist/design-system110.js +183 -484
  21. package/dist/design-system110.js.map +1 -1
  22. package/dist/design-system112.js +5 -4
  23. package/dist/design-system112.js.map +1 -1
  24. package/dist/design-system113.js +507 -7
  25. package/dist/design-system113.js.map +1 -1
  26. package/dist/design-system115.js +8 -0
  27. package/dist/design-system115.js.map +1 -0
  28. package/dist/design-system116.js +7 -6
  29. package/dist/design-system116.js.map +1 -1
  30. package/dist/design-system117.js +154 -169
  31. package/dist/design-system117.js.map +1 -1
  32. package/dist/design-system119.js +2 -2
  33. package/dist/design-system119.js.map +1 -1
  34. package/dist/design-system120.js +210 -149
  35. package/dist/design-system120.js.map +1 -1
  36. package/dist/design-system122.js +5 -4
  37. package/dist/design-system122.js.map +1 -1
  38. package/dist/design-system123.js +160 -9
  39. package/dist/design-system123.js.map +1 -1
  40. package/dist/design-system125.js +8 -0
  41. package/dist/design-system125.js.map +1 -0
  42. package/dist/design-system126.js +176 -6
  43. package/dist/design-system126.js.map +1 -1
  44. package/dist/design-system128.js +8 -0
  45. package/dist/design-system128.js.map +1 -0
  46. package/dist/design-system129.js +213 -5
  47. package/dist/design-system129.js.map +1 -1
  48. package/dist/design-system131.js +5 -90
  49. package/dist/design-system131.js.map +1 -1
  50. package/dist/design-system132.js +166 -0
  51. package/dist/design-system132.js.map +1 -0
  52. package/dist/design-system134.js +5 -42
  53. package/dist/design-system134.js.map +1 -1
  54. package/dist/design-system135.js +12 -0
  55. package/dist/design-system135.js.map +1 -0
  56. package/dist/design-system136.js +274 -5
  57. package/dist/design-system136.js.map +1 -1
  58. package/dist/design-system138.js +9 -0
  59. package/dist/{design-system124.js.map → design-system138.js.map} +1 -1
  60. package/dist/design-system139.js +16 -5
  61. package/dist/design-system139.js.map +1 -1
  62. package/dist/design-system141.js +8 -0
  63. package/dist/{design-system127.js.map → design-system141.js.map} +1 -1
  64. package/dist/design-system142.js +12 -5
  65. package/dist/design-system142.js.map +1 -1
  66. package/dist/design-system143.js +78 -83
  67. package/dist/design-system143.js.map +1 -1
  68. package/dist/design-system145.js +1 -1
  69. package/dist/design-system145.js.map +1 -1
  70. package/dist/design-system146.js +42 -9
  71. package/dist/design-system146.js.map +1 -1
  72. package/dist/design-system148.js +3 -2
  73. package/dist/design-system148.js.map +1 -1
  74. package/dist/design-system149.js +230 -18
  75. package/dist/design-system149.js.map +1 -1
  76. package/dist/design-system151.js +5 -158
  77. package/dist/design-system151.js.map +1 -1
  78. package/dist/{design-system140.js → design-system152.js} +6 -6
  79. package/dist/{design-system140.js.map → design-system152.js.map} +1 -1
  80. package/dist/design-system154.js +5 -307
  81. package/dist/design-system154.js.map +1 -1
  82. package/dist/design-system155.js +98 -0
  83. package/dist/design-system155.js.map +1 -0
  84. package/dist/design-system157.js +5 -240
  85. package/dist/design-system157.js.map +1 -1
  86. package/dist/design-system158.js +12 -0
  87. package/dist/design-system158.js.map +1 -0
  88. package/dist/design-system159.js +37 -5
  89. package/dist/design-system159.js.map +1 -1
  90. package/dist/design-system160.js +4 -189
  91. package/dist/design-system160.js.map +1 -1
  92. package/dist/design-system161.js +24 -0
  93. package/dist/{design-system150.js.map → design-system161.js.map} +1 -1
  94. package/dist/design-system162.js +2 -3
  95. package/dist/design-system162.js.map +1 -1
  96. package/dist/design-system163.js +158 -3
  97. package/dist/design-system163.js.map +1 -1
  98. package/dist/{design-system153.js → design-system165.js} +2 -2
  99. package/dist/{design-system153.js.map → design-system165.js.map} +1 -1
  100. package/dist/design-system166.js +307 -6
  101. package/dist/design-system166.js.map +1 -1
  102. package/dist/{design-system156.js → design-system168.js} +2 -2
  103. package/dist/{design-system156.js.map → design-system168.js.map} +1 -1
  104. package/dist/design-system169.js +167 -6
  105. package/dist/design-system169.js.map +1 -1
  106. package/dist/design-system171.js +8 -0
  107. package/dist/design-system171.js.map +1 -0
  108. package/dist/design-system172.js +240 -6
  109. package/dist/design-system172.js.map +1 -1
  110. package/dist/design-system174.js +8 -0
  111. package/dist/design-system174.js.map +1 -0
  112. package/dist/design-system175.js +189 -6
  113. package/dist/design-system175.js.map +1 -1
  114. package/dist/design-system177.js +8 -0
  115. package/dist/design-system177.js.map +1 -0
  116. package/dist/design-system178.js +3 -5
  117. package/dist/design-system178.js.map +1 -1
  118. package/dist/design-system179.js +58 -11
  119. package/dist/design-system179.js.map +1 -1
  120. package/dist/design-system181.js +9 -0
  121. package/dist/design-system181.js.map +1 -0
  122. package/dist/design-system182.js +56 -6
  123. package/dist/design-system182.js.map +1 -1
  124. package/dist/design-system184.js +9 -0
  125. package/dist/{design-system167.js.map → design-system184.js.map} +1 -1
  126. package/dist/design-system185.js +69 -5
  127. package/dist/design-system185.js.map +1 -1
  128. package/dist/design-system187.js +9 -0
  129. package/dist/{design-system170.js.map → design-system187.js.map} +1 -1
  130. package/dist/design-system188.js +182 -5
  131. package/dist/design-system188.js.map +1 -1
  132. package/dist/design-system190.js +9 -0
  133. package/dist/design-system190.js.map +1 -0
  134. package/dist/design-system191.js +115 -5
  135. package/dist/design-system191.js.map +1 -1
  136. package/dist/design-system193.js +8 -0
  137. package/dist/{design-system176.js.map → design-system193.js.map} +1 -1
  138. package/dist/design-system194.js +11 -5
  139. package/dist/design-system194.js.map +1 -1
  140. package/dist/design-system195.js +453 -24
  141. package/dist/design-system195.js.map +1 -1
  142. package/dist/design-system197.js +5 -4
  143. package/dist/design-system197.js.map +1 -1
  144. package/dist/design-system198.js +20 -16
  145. package/dist/design-system198.js.map +1 -1
  146. package/dist/design-system200.js +1 -1
  147. package/dist/design-system200.js.map +1 -1
  148. package/dist/design-system201.js +70 -314
  149. package/dist/design-system201.js.map +1 -1
  150. package/dist/design-system203.js +1 -1
  151. package/dist/design-system203.js.map +1 -1
  152. package/dist/design-system204.js +24 -89
  153. package/dist/design-system204.js.map +1 -1
  154. package/dist/design-system206.js +1 -1
  155. package/dist/design-system206.js.map +1 -1
  156. package/dist/design-system207.js +26 -17
  157. package/dist/design-system207.js.map +1 -1
  158. package/dist/design-system209.js +5 -3
  159. package/dist/design-system209.js.map +1 -1
  160. package/dist/design-system210.js +22 -408
  161. package/dist/design-system210.js.map +1 -1
  162. package/dist/design-system212.js +1 -1
  163. package/dist/design-system212.js.map +1 -1
  164. package/dist/design-system213.js +24 -52
  165. package/dist/design-system213.js.map +1 -1
  166. package/dist/design-system215.js +1 -1
  167. package/dist/design-system215.js.map +1 -1
  168. package/dist/design-system216.js +329 -85
  169. package/dist/design-system216.js.map +1 -1
  170. package/dist/design-system218.js +5 -108
  171. package/dist/design-system218.js.map +1 -1
  172. package/dist/design-system219.js +103 -0
  173. package/dist/design-system219.js.map +1 -0
  174. package/dist/design-system221.js +5 -106
  175. package/dist/design-system221.js.map +1 -1
  176. package/dist/design-system222.js +22 -0
  177. package/dist/{design-system208.js.map → design-system222.js.map} +1 -1
  178. package/dist/design-system223.js +4 -6
  179. package/dist/design-system223.js.map +1 -1
  180. package/dist/design-system224.js +3 -737
  181. package/dist/design-system224.js.map +1 -1
  182. package/dist/design-system225.js +422 -0
  183. package/dist/design-system225.js.map +1 -0
  184. package/dist/design-system227.js +5 -11
  185. package/dist/design-system227.js.map +1 -1
  186. package/dist/design-system228.js +51 -517
  187. package/dist/design-system228.js.map +1 -1
  188. package/dist/design-system230.js +1 -1
  189. package/dist/design-system230.js.map +1 -1
  190. package/dist/design-system231.js +88 -3
  191. package/dist/design-system231.js.map +1 -1
  192. package/dist/design-system232.js +4 -46
  193. package/dist/design-system232.js.map +1 -1
  194. package/dist/design-system233.js +108 -4
  195. package/dist/design-system233.js.map +1 -1
  196. package/dist/{design-system220.js → design-system235.js} +2 -2
  197. package/dist/{design-system220.js.map → design-system235.js.map} +1 -1
  198. package/dist/design-system236.js +106 -5
  199. package/dist/design-system236.js.map +1 -1
  200. package/dist/design-system238.js +9 -0
  201. package/dist/design-system238.js.map +1 -0
  202. package/dist/design-system239.js +737 -5
  203. package/dist/design-system239.js.map +1 -1
  204. package/dist/{design-system226.js → design-system241.js} +2 -2
  205. package/dist/{design-system226.js.map → design-system241.js.map} +1 -1
  206. package/dist/design-system242.js +3 -5
  207. package/dist/design-system242.js.map +1 -1
  208. package/dist/design-system243.js +42 -50
  209. package/dist/design-system243.js.map +1 -1
  210. package/dist/design-system244.js +1 -1
  211. package/dist/design-system244.js.map +1 -1
  212. package/dist/design-system245.js +254 -141
  213. package/dist/design-system245.js.map +1 -1
  214. package/dist/design-system247.js +1 -1
  215. package/dist/design-system247.js.map +1 -1
  216. package/dist/design-system248.js +119 -7
  217. package/dist/design-system248.js.map +1 -1
  218. package/dist/design-system250.js +8 -0
  219. package/dist/design-system250.js.map +1 -0
  220. package/dist/design-system251.js +172 -5
  221. package/dist/design-system251.js.map +1 -1
  222. package/dist/design-system253.js +8 -0
  223. package/dist/design-system253.js.map +1 -0
  224. package/dist/design-system254.js +11 -6
  225. package/dist/design-system254.js.map +1 -1
  226. package/dist/design-system255.js +525 -9
  227. package/dist/design-system255.js.map +1 -1
  228. package/dist/design-system257.js +8 -0
  229. package/dist/design-system257.js.map +1 -0
  230. package/dist/design-system258.js +112 -6
  231. package/dist/design-system258.js.map +1 -1
  232. package/dist/design-system260.js +5 -374
  233. package/dist/design-system260.js.map +1 -1
  234. package/dist/design-system261.js +57 -0
  235. package/dist/design-system261.js.map +1 -0
  236. package/dist/design-system262.js +4 -6
  237. package/dist/design-system262.js.map +1 -1
  238. package/dist/design-system263.js +173 -0
  239. package/dist/design-system263.js.map +1 -0
  240. package/dist/design-system265.js +8 -0
  241. package/dist/design-system265.js.map +1 -0
  242. package/dist/design-system266.js +10 -0
  243. package/dist/design-system266.js.map +1 -0
  244. package/dist/{design-system249.js → design-system267.js} +2 -2
  245. package/dist/{design-system249.js.map → design-system267.js.map} +1 -1
  246. package/dist/design-system269.js +8 -0
  247. package/dist/design-system269.js.map +1 -0
  248. package/dist/{design-system252.js → design-system270.js} +1 -1
  249. package/dist/{design-system252.js.map → design-system270.js.map} +1 -1
  250. package/dist/design-system272.js +9 -0
  251. package/dist/design-system272.js.map +1 -0
  252. package/dist/design-system273.js +12 -0
  253. package/dist/design-system273.js.map +1 -0
  254. package/dist/{design-system256.js → design-system274.js} +2 -2
  255. package/dist/{design-system256.js.map → design-system274.js.map} +1 -1
  256. package/dist/design-system276.js +9 -0
  257. package/dist/design-system276.js.map +1 -0
  258. package/dist/{design-system259.js → design-system277.js} +1 -1
  259. package/dist/{design-system259.js.map → design-system277.js.map} +1 -1
  260. package/dist/design-system278.js +377 -0
  261. package/dist/design-system278.js.map +1 -0
  262. package/dist/design-system280.js +9 -0
  263. package/dist/design-system280.js.map +1 -0
  264. package/dist/design-system69.js +182 -13
  265. package/dist/design-system69.js.map +1 -1
  266. package/dist/design-system71.js +8 -0
  267. package/dist/design-system71.js.map +1 -0
  268. package/dist/design-system72.js +13 -5
  269. package/dist/design-system72.js.map +1 -1
  270. package/dist/design-system73.js +677 -139
  271. package/dist/design-system73.js.map +1 -1
  272. package/dist/design-system75.js +1 -1
  273. package/dist/design-system75.js.map +1 -1
  274. package/dist/design-system76.js +152 -23
  275. package/dist/design-system76.js.map +1 -1
  276. package/dist/design-system78.js +5 -49
  277. package/dist/design-system78.js.map +1 -1
  278. package/dist/design-system79.js +32 -0
  279. package/dist/design-system79.js.map +1 -0
  280. package/dist/design-system80.js +2 -3
  281. package/dist/design-system80.js.map +1 -1
  282. package/dist/design-system81.js +38 -188
  283. package/dist/design-system81.js.map +1 -1
  284. package/dist/design-system83.js +1 -1
  285. package/dist/design-system83.js.map +1 -1
  286. package/dist/design-system84.js +199 -7
  287. package/dist/design-system84.js.map +1 -1
  288. package/dist/design-system86.js +8 -0
  289. package/dist/design-system86.js.map +1 -0
  290. package/dist/design-system87.js +7 -5
  291. package/dist/design-system87.js.map +1 -1
  292. package/dist/design-system88.js +264 -48
  293. package/dist/design-system88.js.map +1 -1
  294. package/dist/design-system90.js +1 -1
  295. package/dist/design-system90.js.map +1 -1
  296. package/dist/design-system91.js +57 -11
  297. package/dist/design-system91.js.map +1 -1
  298. package/dist/design-system93.js +8 -0
  299. package/dist/design-system93.js.map +1 -0
  300. package/dist/design-system94.js +11 -5
  301. package/dist/design-system94.js.map +1 -1
  302. package/dist/design-system95.js +92 -59
  303. package/dist/design-system95.js.map +1 -1
  304. package/dist/design-system97.js +1 -1
  305. package/dist/design-system97.js.map +1 -1
  306. package/dist/design-system98.js +56 -78
  307. package/dist/design-system98.js.map +1 -1
  308. package/dist/types/components/BContextMenu/BContextMenu.spec.d.ts +1 -0
  309. package/dist/types/components/BContextMenu/BContextMenu.vue.d.ts +42 -0
  310. package/dist/types/components/BContextMenu/index.d.ts +2 -0
  311. package/dist/types/components/BContextMenu/types.d.ts +23 -0
  312. package/dist/types/components/BInputTags/BInputTags.spec.d.ts +1 -0
  313. package/dist/types/components/BInputTags/BInputTags.vue.d.ts +54 -0
  314. package/dist/types/components/BInputTags/index.d.ts +1 -0
  315. package/dist/types/components/BLink/BLink.spec.d.ts +1 -0
  316. package/dist/types/components/BLink/BLink.vue.d.ts +100 -0
  317. package/dist/types/components/BLink/index.d.ts +1 -0
  318. package/dist/types/components/BListbox/BListbox.spec.d.ts +1 -0
  319. package/dist/types/components/BListbox/BListbox.vue.d.ts +52 -0
  320. package/dist/types/components/BListbox/index.d.ts +1 -0
  321. package/dist/types/components/BModal/BModal.spec.d.ts +1 -0
  322. package/dist/types/components/BPinInput/BPinInput.spec.d.ts +1 -0
  323. package/dist/types/components/BPinInput/BPinInput.vue.d.ts +43 -0
  324. package/dist/types/components/BPinInput/index.d.ts +1 -0
  325. package/dist/types/components/BProgress/BProgress.vue.d.ts +47 -2
  326. package/dist/types/components/BTextarea/BTextarea.spec.d.ts +1 -0
  327. package/dist/types/components/BTextarea/BTextarea.vue.d.ts +77 -0
  328. package/dist/types/components/BTextarea/index.d.ts +1 -0
  329. package/dist/types/components/index.d.ts +7 -1
  330. package/package.json +1 -1
  331. package/dist/design-system114.js +0 -212
  332. package/dist/design-system114.js.map +0 -1
  333. package/dist/design-system124.js +0 -277
  334. package/dist/design-system127.js +0 -19
  335. package/dist/design-system130.js +0 -15
  336. package/dist/design-system130.js.map +0 -1
  337. package/dist/design-system133.js +0 -8
  338. package/dist/design-system133.js.map +0 -1
  339. package/dist/design-system137.js +0 -236
  340. package/dist/design-system137.js.map +0 -1
  341. package/dist/design-system147.js +0 -40
  342. package/dist/design-system147.js.map +0 -1
  343. package/dist/design-system150.js +0 -7
  344. package/dist/design-system164.js +0 -61
  345. package/dist/design-system164.js.map +0 -1
  346. package/dist/design-system167.js +0 -59
  347. package/dist/design-system170.js +0 -72
  348. package/dist/design-system173.js +0 -185
  349. package/dist/design-system173.js.map +0 -1
  350. package/dist/design-system176.js +0 -118
  351. package/dist/design-system180.js +0 -465
  352. package/dist/design-system180.js.map +0 -1
  353. package/dist/design-system183.js +0 -38
  354. package/dist/design-system183.js.map +0 -1
  355. package/dist/design-system186.js +0 -91
  356. package/dist/design-system186.js.map +0 -1
  357. package/dist/design-system189.js +0 -38
  358. package/dist/design-system189.js.map +0 -1
  359. package/dist/design-system192.js +0 -31
  360. package/dist/design-system192.js.map +0 -1
  361. package/dist/design-system208.js +0 -7
  362. package/dist/design-system217.js +0 -7
  363. package/dist/design-system217.js.map +0 -1
  364. package/dist/design-system234.js +0 -286
  365. package/dist/design-system234.js.map +0 -1
  366. package/dist/design-system237.js +0 -122
  367. package/dist/design-system237.js.map +0 -1
  368. package/dist/design-system240.js +0 -115
  369. package/dist/design-system240.js.map +0 -1
  370. package/dist/design-system70.js +0 -699
  371. package/dist/design-system70.js.map +0 -1
  372. package/dist/design-system77.js +0 -7
  373. package/dist/design-system77.js.map +0 -1
  374. package/dist/design-system85.js +0 -276
  375. package/dist/design-system85.js.map +0 -1
  376. package/dist/design-system92.js +0 -102
  377. package/dist/design-system92.js.map +0 -1
@@ -1,12 +1,163 @@
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
- }({});
1
+ import { BCommonSize as e } from "./design-system3.js";
2
+ import { useComponentId as t } from "./design-system10.js";
3
+ import { Fragment as n, computed as r, createElementBlock as i, createElementVNode as a, defineComponent as o, mergeModels as s, normalizeClass as c, openBlock as l, ref as u, renderList as d, toDisplayString as f, useModel as p, vModelText as m, withDirectives as h, withModifiers as g } from "vue";
4
+ //#region src/components/BInputTags/BInputTags.vue?vue&type=script&setup=true&lang.ts
5
+ var _ = ["aria-label", "aria-disabled"], v = { class: "b-input-tags__tag-label" }, y = [
6
+ "aria-label",
7
+ "disabled",
8
+ "onClick"
9
+ ], b = [
10
+ "id",
11
+ "placeholder",
12
+ "disabled",
13
+ "readonly",
14
+ "aria-label"
15
+ ], x = /* @__PURE__ */ o({
16
+ inheritAttrs: !1,
17
+ __name: "BInputTags",
18
+ props: /* @__PURE__ */ s({
19
+ placeholder: {},
20
+ size: { default: () => e.Medium },
21
+ disabled: {
22
+ type: Boolean,
23
+ default: !1
24
+ },
25
+ delimiter: { default: () => ["enter", "comma"] },
26
+ max: {},
27
+ validate: { type: Function },
28
+ allowDuplicate: {
29
+ type: Boolean,
30
+ default: !1
31
+ },
32
+ id: {},
33
+ inputAriaLabel: { default: "Add tag" }
34
+ }, {
35
+ modelValue: { default: () => [] },
36
+ modelModifiers: {}
37
+ }),
38
+ emits: /* @__PURE__ */ s([
39
+ "add",
40
+ "remove",
41
+ "invalid"
42
+ ], ["update:modelValue"]),
43
+ setup(e, { expose: o, emit: s }) {
44
+ let x = s, S = p(e, "modelValue"), { componentUID: C } = t(), w = r(() => e.id ?? `b-input-tags-${C.value}`), T = u(null), E = u(null), D = u(""), O = u(!1), k = r(() => S.value ?? []), A = r(() => typeof e.max == "number" && k.value.length >= e.max), j = r(() => Array.isArray(e.delimiter) ? e.delimiter : typeof e.delimiter == "string" ? [e.delimiter] : []), M = r(() => j.value.includes("enter")), N = r(() => j.value.includes("comma")), P = r(() => j.value.includes("space")), F = r(() => {
45
+ if (e.delimiter instanceof RegExp) return e.delimiter;
46
+ let t = [];
47
+ return N.value && t.push(","), P.value && t.push("\\s"), t.length === 0 ? null : RegExp(`[${t.join("")}]+`);
48
+ });
49
+ function I(t) {
50
+ let n = t.trim();
51
+ if (!n) return !1;
52
+ if (A.value) return x("invalid", n, "max-reached"), !1;
53
+ if (!e.allowDuplicate && k.value.includes(n)) return x("invalid", n, "duplicate"), !1;
54
+ if (e.validate) {
55
+ let t = e.validate(n);
56
+ if (t === !1) return x("invalid", n, "invalid"), !1;
57
+ if (typeof t == "string") return x("invalid", n, t), !1;
58
+ }
59
+ return S.value = [...k.value, n], x("add", n), !0;
60
+ }
61
+ function L() {
62
+ let e = D.value, t = F.value;
63
+ if (t) {
64
+ let n = e.split(t), r = !1;
65
+ for (let e of n) if (I(e) && (r = !0), A.value) break;
66
+ (r || n.every((e) => !e.trim())) && (D.value = "");
67
+ return;
68
+ }
69
+ I(e) && (D.value = "");
70
+ }
71
+ function R(t) {
72
+ if (e.disabled) return;
73
+ let n = k.value[t];
74
+ n !== void 0 && (S.value = k.value.filter((e, n) => n !== t), x("remove", n, t));
75
+ }
76
+ function z(t) {
77
+ if (!e.disabled) {
78
+ if (t.key === "Enter") {
79
+ M.value && (t.preventDefault(), L());
80
+ return;
81
+ }
82
+ if (t.key === "," && N.value) {
83
+ t.preventDefault(), L();
84
+ return;
85
+ }
86
+ if (t.key === " " && P.value) {
87
+ t.preventDefault(), L();
88
+ return;
89
+ }
90
+ t.key === "Backspace" && D.value === "" && k.value.length > 0 && R(k.value.length - 1);
91
+ }
92
+ }
93
+ function B(t) {
94
+ D.value = t.target.value, e.delimiter instanceof RegExp && e.delimiter.test(D.value) && L();
95
+ }
96
+ function V() {
97
+ O.value = !1, D.value.trim() !== "" && L();
98
+ }
99
+ function H() {
100
+ O.value = !0;
101
+ }
102
+ function U(e) {
103
+ let t = e.target;
104
+ (t === E.value || t.classList.contains("b-input-tags__tags")) && (e.preventDefault(), T.value?.focus());
105
+ }
106
+ function W() {
107
+ T.value?.focus();
108
+ }
109
+ function G() {
110
+ S.value = [], D.value = "";
111
+ }
112
+ return o({
113
+ focus: W,
114
+ clear: G
115
+ }), (t, r) => (l(), i("div", {
116
+ ref_key: "wrapperRef",
117
+ ref: E,
118
+ class: c(["b-input-tags", [`b-input-tags--${e.size}`, {
119
+ "b-input-tags--focused": O.value,
120
+ "b-input-tags--disabled": e.disabled,
121
+ "b-input-tags--max-reached": A.value
122
+ }]]),
123
+ role: "group",
124
+ "aria-label": e.inputAriaLabel,
125
+ "aria-disabled": e.disabled || void 0,
126
+ onMousedown: U
127
+ }, [(l(!0), i(n, null, d(k.value, (t, n) => (l(), i("span", {
128
+ key: `${t}-${n}`,
129
+ class: "b-input-tags__tag"
130
+ }, [a("span", v, f(t), 1), a("button", {
131
+ type: "button",
132
+ class: "b-input-tags__remove",
133
+ "aria-label": `Remove tag ${t}`,
134
+ disabled: e.disabled,
135
+ tabindex: "-1",
136
+ onMousedown: r[0] ||= g(() => {}, ["prevent"]),
137
+ onClick: (e) => R(n)
138
+ }, [...r[2] ||= [a("span", { "aria-hidden": "true" }, "×", -1)]], 40, y)]))), 128)), h(a("input", {
139
+ id: w.value,
140
+ ref_key: "inputRef",
141
+ ref: T,
142
+ "onUpdate:modelValue": r[1] ||= (e) => D.value = e,
143
+ type: "text",
144
+ class: "b-input-tags__input",
145
+ placeholder: e.placeholder,
146
+ disabled: e.disabled,
147
+ readonly: A.value,
148
+ "aria-label": e.inputAriaLabel,
149
+ autocomplete: "off",
150
+ autocapitalize: "off",
151
+ autocorrect: "off",
152
+ spellcheck: "false",
153
+ onInput: B,
154
+ onKeydown: z,
155
+ onFocus: H,
156
+ onBlur: V
157
+ }, null, 40, b), [[m, D.value]])], 42, _));
158
+ }
159
+ });
9
160
  //#endregion
10
- export { n as BMentionsPlacement, e as BMentionsStatus, t as BMentionsVariant };
161
+ export { x as default };
11
162
 
12
163
  //# sourceMappingURL=design-system123.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"design-system123.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
+ {"version":3,"file":"design-system123.js","names":[],"sources":["../src/components/BInputTags/BInputTags.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useComponentId } from '@/composables/useComponentId.ts';\nimport { BCommonSize } from '@/types.ts';\nimport { computed, ref } from 'vue';\n\ndefineOptions({ inheritAttrs: false });\n\ntype DelimiterToken = 'enter' | 'comma' | 'space';\ntype DelimiterProp = DelimiterToken | RegExp | Array<DelimiterToken>;\n\nconst {\n size = BCommonSize.Medium,\n disabled = false,\n delimiter = ['enter', 'comma'] as Array<DelimiterToken>,\n max,\n validate,\n allowDuplicate = false,\n placeholder,\n id,\n inputAriaLabel = 'Add tag',\n} = defineProps<{\n /** Placeholder shown in the inner input when empty. */\n placeholder?: string;\n /** Visual size preset (sm | md | lg). @default 'md' */\n size?: `${BCommonSize}`;\n /** Disables the whole control (input and remove buttons). @default false */\n disabled?: boolean;\n /**\n * Which key(s) commit the input as a tag. May be a single token, an array of\n * tokens, or a `RegExp` matched against the input value to detect delimiters\n * inside the value itself (used for paste / typed delimiters).\n * Tokens: 'enter' | 'comma' | 'space'.\n * @default ['enter', 'comma']\n */\n delimiter?: DelimiterProp;\n /** Maximum number of tags. When reached the inner input becomes readonly. */\n max?: number;\n /**\n * Optional validator. Return `true` to accept, `false` to reject silently,\n * or a string to reject and emit it as the `invalid` reason.\n */\n validate?: (value: string) => boolean | string;\n /** Whether duplicate tag values are accepted. @default false */\n allowDuplicate?: boolean;\n /** Optional explicit DOM id for the inner input. */\n id?: string;\n /** ARIA label for the inner input. @default 'Add tag' */\n inputAriaLabel?: string;\n}>();\n\nconst emit = defineEmits<{\n /** Fired after a tag is successfully added. */\n add: [value: string];\n /** Fired after a tag is removed. */\n remove: [value: string, index: number];\n /** Fired when an attempted tag value is rejected. */\n invalid: [value: string, reason: string];\n}>();\n\nconst model = defineModel<string[]>({ default: () => [] });\n\nconst { componentUID } = useComponentId();\nconst inputId = computed(() => id ?? `b-input-tags-${componentUID.value}`);\n\nconst inputRef = ref<HTMLInputElement | null>(null);\nconst wrapperRef = ref<HTMLElement | null>(null);\nconst inputValue = ref('');\nconst isFocused = ref(false);\n\nconst tags = computed<string[]>(() => model.value ?? []);\n\nconst isMaxReached = computed(() => typeof max === 'number' && tags.value.length >= max);\n\nconst delimiterTokens = computed<DelimiterToken[]>(() => {\n if (Array.isArray(delimiter)) return delimiter;\n if (typeof delimiter === 'string') return [delimiter];\n return [];\n});\n\nconst enterCommits = computed(() => delimiterTokens.value.includes('enter'));\nconst commaCommits = computed(() => delimiterTokens.value.includes('comma'));\nconst spaceCommits = computed(() => delimiterTokens.value.includes('space'));\n\n/**\n * Returns a regex that, when matched against the raw input value, splits it\n * into committable chunks. Used so that pasting \"a, b, c\" commits three tags.\n */\nconst valueDelimiterRegex = computed<RegExp | null>(() => {\n if (delimiter instanceof RegExp) return delimiter;\n const parts: string[] = [];\n if (commaCommits.value) parts.push(',');\n if (spaceCommits.value) parts.push('\\\\s');\n if (parts.length === 0) return null;\n return new RegExp(`[${parts.join('')}]+`);\n});\n\nfunction tryCommit(rawValue: string): boolean {\n const value = rawValue.trim();\n if (!value) return false;\n\n if (isMaxReached.value) {\n emit('invalid', value, 'max-reached');\n return false;\n }\n\n if (!allowDuplicate && tags.value.includes(value)) {\n emit('invalid', value, 'duplicate');\n return false;\n }\n\n if (validate) {\n const result = validate(value);\n if (result === false) {\n emit('invalid', value, 'invalid');\n return false;\n }\n if (typeof result === 'string') {\n emit('invalid', value, result);\n return false;\n }\n }\n\n model.value = [...tags.value, value];\n emit('add', value);\n return true;\n}\n\nfunction commitFromInput(): void {\n const raw = inputValue.value;\n const re = valueDelimiterRegex.value;\n\n if (re) {\n const parts = raw.split(re);\n let anyAdded = false;\n for (const part of parts) {\n if (tryCommit(part)) anyAdded = true;\n if (isMaxReached.value) break;\n }\n if (anyAdded || parts.every((p) => !p.trim())) {\n inputValue.value = '';\n }\n return;\n }\n\n if (tryCommit(raw)) {\n inputValue.value = '';\n }\n}\n\nfunction removeTag(index: number): void {\n if (disabled) return;\n const value = tags.value[index];\n if (value === undefined) return;\n model.value = tags.value.filter((_, i) => i !== index);\n emit('remove', value, index);\n}\n\nfunction handleKeydown(e: KeyboardEvent): void {\n if (disabled) return;\n\n if (e.key === 'Enter') {\n if (enterCommits.value) {\n e.preventDefault();\n commitFromInput();\n }\n return;\n }\n\n if (e.key === ',' && commaCommits.value) {\n e.preventDefault();\n commitFromInput();\n return;\n }\n\n if (e.key === ' ' && spaceCommits.value) {\n e.preventDefault();\n commitFromInput();\n return;\n }\n\n if (e.key === 'Backspace' && inputValue.value === '' && tags.value.length > 0) {\n removeTag(tags.value.length - 1);\n }\n}\n\nfunction handleInput(e: Event): void {\n const target = e.target as HTMLInputElement;\n inputValue.value = target.value;\n\n // If a RegExp delimiter was provided, react as the user types.\n if (delimiter instanceof RegExp && delimiter.test(inputValue.value)) {\n commitFromInput();\n }\n}\n\nfunction handleBlur(): void {\n isFocused.value = false;\n if (inputValue.value.trim() !== '') {\n commitFromInput();\n }\n}\n\nfunction handleFocus(): void {\n isFocused.value = true;\n}\n\nfunction handleWrapperMousedown(e: MouseEvent): void {\n // Click anywhere on the wrapper background focuses the input. We must NOT\n // hijack clicks on the remove buttons or the input itself.\n const target = e.target as HTMLElement;\n if (target === wrapperRef.value || target.classList.contains('b-input-tags__tags')) {\n e.preventDefault();\n inputRef.value?.focus();\n }\n}\n\nfunction focus(): void {\n inputRef.value?.focus();\n}\n\nfunction clear(): void {\n model.value = [];\n inputValue.value = '';\n}\n\ndefineExpose({ focus, clear });\n</script>\n\n<template>\n <div\n ref=\"wrapperRef\"\n class=\"b-input-tags\"\n :class=\"[\n `b-input-tags--${size}`,\n {\n 'b-input-tags--focused': isFocused,\n 'b-input-tags--disabled': disabled,\n 'b-input-tags--max-reached': isMaxReached,\n },\n ]\"\n role=\"group\"\n :aria-label=\"inputAriaLabel\"\n :aria-disabled=\"disabled || undefined\"\n @mousedown=\"handleWrapperMousedown\"\n >\n <span\n v-for=\"(tag, index) in tags\"\n :key=\"`${tag}-${index}`\"\n class=\"b-input-tags__tag\"\n >\n <span class=\"b-input-tags__tag-label\">{{ tag }}</span>\n <button\n type=\"button\"\n class=\"b-input-tags__remove\"\n :aria-label=\"`Remove tag ${tag}`\"\n :disabled=\"disabled\"\n tabindex=\"-1\"\n @mousedown.prevent\n @click=\"removeTag(index)\"\n >\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </span>\n\n <input\n :id=\"inputId\"\n ref=\"inputRef\"\n v-model=\"inputValue\"\n type=\"text\"\n class=\"b-input-tags__input\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"isMaxReached\"\n :aria-label=\"inputAriaLabel\"\n autocomplete=\"off\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n @input=\"handleInput\"\n @keydown=\"handleKeydown\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n />\n </div>\n</template>\n\n<style>\n.b-input-tags {\n --b-input-tags-bg: #ffffff;\n --b-input-tags-border-color: #d9d9d9;\n --b-input-tags-border-color-focus: #1677ff;\n --b-input-tags-radius: 6px;\n --b-input-tags-padding: 2px 4px;\n --b-input-tags-gap: 4px;\n --b-input-tags-color: rgba(0, 0, 0, 0.88);\n --b-input-tags-placeholder-color: rgba(0, 0, 0, 0.25);\n --b-input-tags-shadow-focus: 0 0 0 2px rgba(5, 145, 255, 0.1);\n --b-input-tags-disabled-bg: rgba(0, 0, 0, 0.04);\n --b-input-tags-disabled-color: rgba(0, 0, 0, 0.25);\n\n --b-input-tags-tag-bg: rgba(0, 0, 0, 0.06);\n --b-input-tags-tag-fg: rgba(0, 0, 0, 0.88);\n --b-input-tags-tag-radius: 4px;\n --b-input-tags-tag-padding: 0 6px;\n --b-input-tags-tag-gap: 4px;\n --b-input-tags-tag-remove-color: rgba(0, 0, 0, 0.45);\n --b-input-tags-tag-remove-color-hover: rgba(0, 0, 0, 0.88);\n\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--b-input-tags-gap);\n width: 100%;\n min-height: 32px;\n padding: var(--b-input-tags-padding);\n background: var(--b-input-tags-bg);\n border: 1px solid var(--b-input-tags-border-color);\n border-radius: var(--b-input-tags-radius);\n color: var(--b-input-tags-color);\n font-size: 14px;\n line-height: 1.5714;\n cursor: text;\n transition: border-color 0.2s, box-shadow 0.2s, background 0.2s;\n}\n\n.b-input-tags--sm {\n min-height: 24px;\n font-size: 14px;\n --b-input-tags-padding: 0 4px;\n}\n\n.b-input-tags--lg {\n min-height: 40px;\n font-size: 16px;\n --b-input-tags-padding: 4px 6px;\n}\n\n.b-input-tags:hover:not(.b-input-tags--disabled) {\n border-color: var(--b-input-tags-border-color-focus);\n}\n\n.b-input-tags--focused {\n border-color: var(--b-input-tags-border-color-focus);\n box-shadow: var(--b-input-tags-shadow-focus);\n}\n\n.b-input-tags--disabled {\n background: var(--b-input-tags-disabled-bg);\n color: var(--b-input-tags-disabled-color);\n cursor: not-allowed;\n}\n\n.b-input-tags--disabled .b-input-tags__input {\n cursor: not-allowed;\n color: var(--b-input-tags-disabled-color);\n}\n\n.b-input-tags--max-reached .b-input-tags__input {\n cursor: not-allowed;\n}\n\n.b-input-tags__tag {\n display: inline-flex;\n align-items: center;\n gap: var(--b-input-tags-tag-gap);\n padding: var(--b-input-tags-tag-padding);\n background: var(--b-input-tags-tag-bg);\n color: var(--b-input-tags-tag-fg);\n border-radius: var(--b-input-tags-tag-radius);\n font-size: 0.92em;\n line-height: 1.4;\n max-width: 100%;\n}\n\n.b-input-tags__tag-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.b-input-tags__remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n border: none;\n background: transparent;\n color: var(--b-input-tags-tag-remove-color);\n font-size: 14px;\n line-height: 1;\n cursor: pointer;\n border-radius: 2px;\n transition: color 0.2s, background 0.2s;\n}\n\n.b-input-tags__remove:hover:not(:disabled) {\n color: var(--b-input-tags-tag-remove-color-hover);\n background: rgba(0, 0, 0, 0.06);\n}\n\n.b-input-tags__remove:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.b-input-tags__input {\n flex: 1 1 60px;\n min-width: 60px;\n border: none;\n outline: none;\n background: transparent;\n color: inherit;\n font-size: inherit;\n font-family: inherit;\n line-height: inherit;\n padding: 2px 4px;\n}\n\n.b-input-tags__input::placeholder {\n color: var(--b-input-tags-placeholder-color);\n}\n\n[data-prefers-color='dark'] .b-input-tags {\n --b-input-tags-bg: #141414;\n --b-input-tags-border-color: #424242;\n --b-input-tags-border-color-focus: #1668dc;\n --b-input-tags-color: rgba(255, 255, 255, 0.88);\n --b-input-tags-placeholder-color: rgba(255, 255, 255, 0.25);\n --b-input-tags-shadow-focus: 0 0 0 2px rgba(22, 104, 220, 0.15);\n --b-input-tags-disabled-bg: rgba(255, 255, 255, 0.08);\n --b-input-tags-disabled-color: rgba(255, 255, 255, 0.25);\n --b-input-tags-tag-bg: rgba(255, 255, 255, 0.08);\n --b-input-tags-tag-fg: rgba(255, 255, 255, 0.88);\n --b-input-tags-tag-remove-color: rgba(255, 255, 255, 0.45);\n --b-input-tags-tag-remove-color-hover: rgba(255, 255, 255, 0.88);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-input-tags {\n --b-input-tags-bg: #141414;\n --b-input-tags-border-color: #424242;\n --b-input-tags-border-color-focus: #1668dc;\n --b-input-tags-color: rgba(255, 255, 255, 0.88);\n --b-input-tags-placeholder-color: rgba(255, 255, 255, 0.25);\n --b-input-tags-shadow-focus: 0 0 0 2px rgba(22, 104, 220, 0.15);\n --b-input-tags-disabled-bg: rgba(255, 255, 255, 0.08);\n --b-input-tags-disabled-color: rgba(255, 255, 255, 0.25);\n --b-input-tags-tag-bg: rgba(255, 255, 255, 0.08);\n --b-input-tags-tag-fg: rgba(255, 255, 255, 0.88);\n --b-input-tags-tag-remove-color: rgba(255, 255, 255, 0.45);\n --b-input-tags-tag-remove-color-hover: rgba(255, 255, 255, 0.88);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .b-input-tags,\n .b-input-tags__remove {\n transition: none;\n }\n}\n</style>\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import e from "./design-system123.js";
2
+ /* empty css */
3
+ //#region src/components/BInputTags/BInputTags.vue
4
+ var t = e;
5
+ //#endregion
6
+ export { t as default };
7
+
8
+ //# sourceMappingURL=design-system125.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-system125.js","names":[],"sources":["../src/components/BInputTags/BInputTags.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useComponentId } from '@/composables/useComponentId.ts';\nimport { BCommonSize } from '@/types.ts';\nimport { computed, ref } from 'vue';\n\ndefineOptions({ inheritAttrs: false });\n\ntype DelimiterToken = 'enter' | 'comma' | 'space';\ntype DelimiterProp = DelimiterToken | RegExp | Array<DelimiterToken>;\n\nconst {\n size = BCommonSize.Medium,\n disabled = false,\n delimiter = ['enter', 'comma'] as Array<DelimiterToken>,\n max,\n validate,\n allowDuplicate = false,\n placeholder,\n id,\n inputAriaLabel = 'Add tag',\n} = defineProps<{\n /** Placeholder shown in the inner input when empty. */\n placeholder?: string;\n /** Visual size preset (sm | md | lg). @default 'md' */\n size?: `${BCommonSize}`;\n /** Disables the whole control (input and remove buttons). @default false */\n disabled?: boolean;\n /**\n * Which key(s) commit the input as a tag. May be a single token, an array of\n * tokens, or a `RegExp` matched against the input value to detect delimiters\n * inside the value itself (used for paste / typed delimiters).\n * Tokens: 'enter' | 'comma' | 'space'.\n * @default ['enter', 'comma']\n */\n delimiter?: DelimiterProp;\n /** Maximum number of tags. When reached the inner input becomes readonly. */\n max?: number;\n /**\n * Optional validator. Return `true` to accept, `false` to reject silently,\n * or a string to reject and emit it as the `invalid` reason.\n */\n validate?: (value: string) => boolean | string;\n /** Whether duplicate tag values are accepted. @default false */\n allowDuplicate?: boolean;\n /** Optional explicit DOM id for the inner input. */\n id?: string;\n /** ARIA label for the inner input. @default 'Add tag' */\n inputAriaLabel?: string;\n}>();\n\nconst emit = defineEmits<{\n /** Fired after a tag is successfully added. */\n add: [value: string];\n /** Fired after a tag is removed. */\n remove: [value: string, index: number];\n /** Fired when an attempted tag value is rejected. */\n invalid: [value: string, reason: string];\n}>();\n\nconst model = defineModel<string[]>({ default: () => [] });\n\nconst { componentUID } = useComponentId();\nconst inputId = computed(() => id ?? `b-input-tags-${componentUID.value}`);\n\nconst inputRef = ref<HTMLInputElement | null>(null);\nconst wrapperRef = ref<HTMLElement | null>(null);\nconst inputValue = ref('');\nconst isFocused = ref(false);\n\nconst tags = computed<string[]>(() => model.value ?? []);\n\nconst isMaxReached = computed(() => typeof max === 'number' && tags.value.length >= max);\n\nconst delimiterTokens = computed<DelimiterToken[]>(() => {\n if (Array.isArray(delimiter)) return delimiter;\n if (typeof delimiter === 'string') return [delimiter];\n return [];\n});\n\nconst enterCommits = computed(() => delimiterTokens.value.includes('enter'));\nconst commaCommits = computed(() => delimiterTokens.value.includes('comma'));\nconst spaceCommits = computed(() => delimiterTokens.value.includes('space'));\n\n/**\n * Returns a regex that, when matched against the raw input value, splits it\n * into committable chunks. Used so that pasting \"a, b, c\" commits three tags.\n */\nconst valueDelimiterRegex = computed<RegExp | null>(() => {\n if (delimiter instanceof RegExp) return delimiter;\n const parts: string[] = [];\n if (commaCommits.value) parts.push(',');\n if (spaceCommits.value) parts.push('\\\\s');\n if (parts.length === 0) return null;\n return new RegExp(`[${parts.join('')}]+`);\n});\n\nfunction tryCommit(rawValue: string): boolean {\n const value = rawValue.trim();\n if (!value) return false;\n\n if (isMaxReached.value) {\n emit('invalid', value, 'max-reached');\n return false;\n }\n\n if (!allowDuplicate && tags.value.includes(value)) {\n emit('invalid', value, 'duplicate');\n return false;\n }\n\n if (validate) {\n const result = validate(value);\n if (result === false) {\n emit('invalid', value, 'invalid');\n return false;\n }\n if (typeof result === 'string') {\n emit('invalid', value, result);\n return false;\n }\n }\n\n model.value = [...tags.value, value];\n emit('add', value);\n return true;\n}\n\nfunction commitFromInput(): void {\n const raw = inputValue.value;\n const re = valueDelimiterRegex.value;\n\n if (re) {\n const parts = raw.split(re);\n let anyAdded = false;\n for (const part of parts) {\n if (tryCommit(part)) anyAdded = true;\n if (isMaxReached.value) break;\n }\n if (anyAdded || parts.every((p) => !p.trim())) {\n inputValue.value = '';\n }\n return;\n }\n\n if (tryCommit(raw)) {\n inputValue.value = '';\n }\n}\n\nfunction removeTag(index: number): void {\n if (disabled) return;\n const value = tags.value[index];\n if (value === undefined) return;\n model.value = tags.value.filter((_, i) => i !== index);\n emit('remove', value, index);\n}\n\nfunction handleKeydown(e: KeyboardEvent): void {\n if (disabled) return;\n\n if (e.key === 'Enter') {\n if (enterCommits.value) {\n e.preventDefault();\n commitFromInput();\n }\n return;\n }\n\n if (e.key === ',' && commaCommits.value) {\n e.preventDefault();\n commitFromInput();\n return;\n }\n\n if (e.key === ' ' && spaceCommits.value) {\n e.preventDefault();\n commitFromInput();\n return;\n }\n\n if (e.key === 'Backspace' && inputValue.value === '' && tags.value.length > 0) {\n removeTag(tags.value.length - 1);\n }\n}\n\nfunction handleInput(e: Event): void {\n const target = e.target as HTMLInputElement;\n inputValue.value = target.value;\n\n // If a RegExp delimiter was provided, react as the user types.\n if (delimiter instanceof RegExp && delimiter.test(inputValue.value)) {\n commitFromInput();\n }\n}\n\nfunction handleBlur(): void {\n isFocused.value = false;\n if (inputValue.value.trim() !== '') {\n commitFromInput();\n }\n}\n\nfunction handleFocus(): void {\n isFocused.value = true;\n}\n\nfunction handleWrapperMousedown(e: MouseEvent): void {\n // Click anywhere on the wrapper background focuses the input. We must NOT\n // hijack clicks on the remove buttons or the input itself.\n const target = e.target as HTMLElement;\n if (target === wrapperRef.value || target.classList.contains('b-input-tags__tags')) {\n e.preventDefault();\n inputRef.value?.focus();\n }\n}\n\nfunction focus(): void {\n inputRef.value?.focus();\n}\n\nfunction clear(): void {\n model.value = [];\n inputValue.value = '';\n}\n\ndefineExpose({ focus, clear });\n</script>\n\n<template>\n <div\n ref=\"wrapperRef\"\n class=\"b-input-tags\"\n :class=\"[\n `b-input-tags--${size}`,\n {\n 'b-input-tags--focused': isFocused,\n 'b-input-tags--disabled': disabled,\n 'b-input-tags--max-reached': isMaxReached,\n },\n ]\"\n role=\"group\"\n :aria-label=\"inputAriaLabel\"\n :aria-disabled=\"disabled || undefined\"\n @mousedown=\"handleWrapperMousedown\"\n >\n <span\n v-for=\"(tag, index) in tags\"\n :key=\"`${tag}-${index}`\"\n class=\"b-input-tags__tag\"\n >\n <span class=\"b-input-tags__tag-label\">{{ tag }}</span>\n <button\n type=\"button\"\n class=\"b-input-tags__remove\"\n :aria-label=\"`Remove tag ${tag}`\"\n :disabled=\"disabled\"\n tabindex=\"-1\"\n @mousedown.prevent\n @click=\"removeTag(index)\"\n >\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </span>\n\n <input\n :id=\"inputId\"\n ref=\"inputRef\"\n v-model=\"inputValue\"\n type=\"text\"\n class=\"b-input-tags__input\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"isMaxReached\"\n :aria-label=\"inputAriaLabel\"\n autocomplete=\"off\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n @input=\"handleInput\"\n @keydown=\"handleKeydown\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n />\n </div>\n</template>\n\n<style>\n.b-input-tags {\n --b-input-tags-bg: #ffffff;\n --b-input-tags-border-color: #d9d9d9;\n --b-input-tags-border-color-focus: #1677ff;\n --b-input-tags-radius: 6px;\n --b-input-tags-padding: 2px 4px;\n --b-input-tags-gap: 4px;\n --b-input-tags-color: rgba(0, 0, 0, 0.88);\n --b-input-tags-placeholder-color: rgba(0, 0, 0, 0.25);\n --b-input-tags-shadow-focus: 0 0 0 2px rgba(5, 145, 255, 0.1);\n --b-input-tags-disabled-bg: rgba(0, 0, 0, 0.04);\n --b-input-tags-disabled-color: rgba(0, 0, 0, 0.25);\n\n --b-input-tags-tag-bg: rgba(0, 0, 0, 0.06);\n --b-input-tags-tag-fg: rgba(0, 0, 0, 0.88);\n --b-input-tags-tag-radius: 4px;\n --b-input-tags-tag-padding: 0 6px;\n --b-input-tags-tag-gap: 4px;\n --b-input-tags-tag-remove-color: rgba(0, 0, 0, 0.45);\n --b-input-tags-tag-remove-color-hover: rgba(0, 0, 0, 0.88);\n\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--b-input-tags-gap);\n width: 100%;\n min-height: 32px;\n padding: var(--b-input-tags-padding);\n background: var(--b-input-tags-bg);\n border: 1px solid var(--b-input-tags-border-color);\n border-radius: var(--b-input-tags-radius);\n color: var(--b-input-tags-color);\n font-size: 14px;\n line-height: 1.5714;\n cursor: text;\n transition: border-color 0.2s, box-shadow 0.2s, background 0.2s;\n}\n\n.b-input-tags--sm {\n min-height: 24px;\n font-size: 14px;\n --b-input-tags-padding: 0 4px;\n}\n\n.b-input-tags--lg {\n min-height: 40px;\n font-size: 16px;\n --b-input-tags-padding: 4px 6px;\n}\n\n.b-input-tags:hover:not(.b-input-tags--disabled) {\n border-color: var(--b-input-tags-border-color-focus);\n}\n\n.b-input-tags--focused {\n border-color: var(--b-input-tags-border-color-focus);\n box-shadow: var(--b-input-tags-shadow-focus);\n}\n\n.b-input-tags--disabled {\n background: var(--b-input-tags-disabled-bg);\n color: var(--b-input-tags-disabled-color);\n cursor: not-allowed;\n}\n\n.b-input-tags--disabled .b-input-tags__input {\n cursor: not-allowed;\n color: var(--b-input-tags-disabled-color);\n}\n\n.b-input-tags--max-reached .b-input-tags__input {\n cursor: not-allowed;\n}\n\n.b-input-tags__tag {\n display: inline-flex;\n align-items: center;\n gap: var(--b-input-tags-tag-gap);\n padding: var(--b-input-tags-tag-padding);\n background: var(--b-input-tags-tag-bg);\n color: var(--b-input-tags-tag-fg);\n border-radius: var(--b-input-tags-tag-radius);\n font-size: 0.92em;\n line-height: 1.4;\n max-width: 100%;\n}\n\n.b-input-tags__tag-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.b-input-tags__remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n border: none;\n background: transparent;\n color: var(--b-input-tags-tag-remove-color);\n font-size: 14px;\n line-height: 1;\n cursor: pointer;\n border-radius: 2px;\n transition: color 0.2s, background 0.2s;\n}\n\n.b-input-tags__remove:hover:not(:disabled) {\n color: var(--b-input-tags-tag-remove-color-hover);\n background: rgba(0, 0, 0, 0.06);\n}\n\n.b-input-tags__remove:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.b-input-tags__input {\n flex: 1 1 60px;\n min-width: 60px;\n border: none;\n outline: none;\n background: transparent;\n color: inherit;\n font-size: inherit;\n font-family: inherit;\n line-height: inherit;\n padding: 2px 4px;\n}\n\n.b-input-tags__input::placeholder {\n color: var(--b-input-tags-placeholder-color);\n}\n\n[data-prefers-color='dark'] .b-input-tags {\n --b-input-tags-bg: #141414;\n --b-input-tags-border-color: #424242;\n --b-input-tags-border-color-focus: #1668dc;\n --b-input-tags-color: rgba(255, 255, 255, 0.88);\n --b-input-tags-placeholder-color: rgba(255, 255, 255, 0.25);\n --b-input-tags-shadow-focus: 0 0 0 2px rgba(22, 104, 220, 0.15);\n --b-input-tags-disabled-bg: rgba(255, 255, 255, 0.08);\n --b-input-tags-disabled-color: rgba(255, 255, 255, 0.25);\n --b-input-tags-tag-bg: rgba(255, 255, 255, 0.08);\n --b-input-tags-tag-fg: rgba(255, 255, 255, 0.88);\n --b-input-tags-tag-remove-color: rgba(255, 255, 255, 0.45);\n --b-input-tags-tag-remove-color-hover: rgba(255, 255, 255, 0.88);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-input-tags {\n --b-input-tags-bg: #141414;\n --b-input-tags-border-color: #424242;\n --b-input-tags-border-color-focus: #1668dc;\n --b-input-tags-color: rgba(255, 255, 255, 0.88);\n --b-input-tags-placeholder-color: rgba(255, 255, 255, 0.25);\n --b-input-tags-shadow-focus: 0 0 0 2px rgba(22, 104, 220, 0.15);\n --b-input-tags-disabled-bg: rgba(255, 255, 255, 0.08);\n --b-input-tags-disabled-color: rgba(255, 255, 255, 0.25);\n --b-input-tags-tag-bg: rgba(255, 255, 255, 0.08);\n --b-input-tags-tag-fg: rgba(255, 255, 255, 0.88);\n --b-input-tags-tag-remove-color: rgba(255, 255, 255, 0.45);\n --b-input-tags-tag-remove-color-hover: rgba(255, 255, 255, 0.88);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .b-input-tags,\n .b-input-tags__remove {\n transition: none;\n }\n}\n</style>\n"],"mappings":""}
@@ -1,9 +1,179 @@
1
- import e from "./design-system14.js";
2
- import t from "./design-system124.js";
3
- /* empty css */
4
- //#region src/components/BMentions/BMentions.vue
5
- var n = /* @__PURE__ */ e(t, [["__scopeId", "data-v-8c92c351"]]);
1
+ import { BCommonColor as e } from "./design-system3.js";
2
+ import t from "./design-system27.js";
3
+ import { computed as n, createBlock as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, defineComponent as s, mergeProps as c, openBlock as l, renderSlot as u, resolveComponent as d, resolveDynamicComponent as f, useSlots as p, withCtx as m } from "vue";
4
+ //#region src/components/BLink/BLink.vue?vue&type=script&setup=true&lang.ts
5
+ var h = {
6
+ key: 0,
7
+ class: "b-link__leading",
8
+ "aria-hidden": "true"
9
+ }, g = { class: "b-link__label" }, _ = {
10
+ key: 1,
11
+ class: "b-link__trailing",
12
+ "aria-hidden": "true"
13
+ }, v = [
14
+ "href",
15
+ "target",
16
+ "rel"
17
+ ], y = {
18
+ key: 0,
19
+ class: "b-link__leading",
20
+ "aria-hidden": "true"
21
+ }, b = { class: "b-link__label" }, x = {
22
+ key: 1,
23
+ class: "b-link__trailing",
24
+ "aria-hidden": "true"
25
+ }, S = ["disabled", "aria-disabled"], C = {
26
+ key: 0,
27
+ class: "b-link__leading",
28
+ "aria-hidden": "true"
29
+ }, w = { class: "b-link__label" }, T = {
30
+ key: 1,
31
+ class: "b-link__trailing",
32
+ "aria-hidden": "true"
33
+ }, E = {
34
+ key: 0,
35
+ class: "b-link__leading",
36
+ "aria-hidden": "true"
37
+ }, D = { class: "b-link__label" }, O = {
38
+ key: 1,
39
+ class: "b-link__trailing",
40
+ "aria-hidden": "true"
41
+ }, k = /* @__PURE__ */ s({
42
+ inheritAttrs: !1,
43
+ __name: "BLink",
44
+ props: {
45
+ href: {},
46
+ to: {},
47
+ target: {},
48
+ rel: {},
49
+ disabled: {
50
+ type: Boolean,
51
+ default: !1
52
+ },
53
+ external: {
54
+ type: Boolean,
55
+ default: !1
56
+ },
57
+ underline: { default: "hover" },
58
+ color: { default: () => e.Primary },
59
+ as: {},
60
+ showExternalIcon: {
61
+ type: Boolean,
62
+ default: !0
63
+ }
64
+ },
65
+ emits: ["click"],
66
+ setup(e, { emit: s }) {
67
+ let k = p(), A = s, j = n(() => typeof f("RouterLink") != "string"), M = n(() => e.as === "button" ? "button" : e.as === "a" ? e.disabled ? "span" : "a" : e.to !== void 0 && e.to !== null ? j.value ? e.disabled ? "span" : "router-link" : e.disabled ? "span" : "a" : e.href === void 0 ? "button" : e.disabled ? "span" : "a"), N = n(() => {
68
+ if (!(e.to === void 0 || e.to === null)) {
69
+ if (typeof e.to == "string") return e.to;
70
+ if (typeof e.to == "object" && "path" in e.to && typeof e.to.path == "string") return e.to.path;
71
+ try {
72
+ return JSON.stringify(e.to);
73
+ } catch {
74
+ return;
75
+ }
76
+ }
77
+ }), P = n(() => e.external ? "_blank" : e.target), F = n(() => {
78
+ let t = /* @__PURE__ */ new Set();
79
+ return e.rel && e.rel.split(/\s+/).filter(Boolean).forEach((e) => t.add(e)), (e.external || P.value === "_blank") && (t.add("noopener"), t.add("noreferrer")), t.size > 0 ? Array.from(t).join(" ") : void 0;
80
+ }), I = (t) => {
81
+ if (e.disabled) {
82
+ t.preventDefault(), t.stopPropagation();
83
+ return;
84
+ }
85
+ A("click", t);
86
+ }, L = n(() => !!k.leading), R = n(() => !!k.trailing), z = n(() => e.external && e.showExternalIcon && !R.value), B = n(() => [
87
+ "b-link",
88
+ `b-link--${e.color}`,
89
+ `b-link--underline-${e.underline}`,
90
+ {
91
+ "b-link--disabled": e.disabled,
92
+ "b-link--external": e.external
93
+ }
94
+ ]);
95
+ return (n, s) => {
96
+ let f = d("RouterLink");
97
+ return M.value === "router-link" ? (l(), r(f, c({
98
+ key: 0,
99
+ to: e.to,
100
+ class: B.value,
101
+ target: P.value,
102
+ rel: F.value
103
+ }, n.$attrs, { onClick: I }), {
104
+ default: m(() => [
105
+ L.value ? (l(), a("span", h, [u(n.$slots, "leading")])) : i("", !0),
106
+ o("span", g, [u(n.$slots, "default")]),
107
+ R.value ? (l(), a("span", _, [u(n.$slots, "trailing")])) : i("", !0),
108
+ z.value ? (l(), r(t, {
109
+ key: 2,
110
+ class: "b-link__external-icon",
111
+ icon: "up-right-from-square",
112
+ size: "xs",
113
+ "aria-hidden": "true"
114
+ })) : i("", !0)
115
+ ]),
116
+ _: 3
117
+ }, 16, [
118
+ "to",
119
+ "class",
120
+ "target",
121
+ "rel"
122
+ ])) : M.value === "a" ? (l(), a("a", c({
123
+ key: 1,
124
+ class: B.value,
125
+ href: e.href ?? N.value,
126
+ target: P.value,
127
+ rel: F.value
128
+ }, n.$attrs, { onClick: I }), [
129
+ L.value ? (l(), a("span", y, [u(n.$slots, "leading")])) : i("", !0),
130
+ o("span", b, [u(n.$slots, "default")]),
131
+ R.value ? (l(), a("span", x, [u(n.$slots, "trailing")])) : i("", !0),
132
+ z.value ? (l(), r(t, {
133
+ key: 2,
134
+ class: "b-link__external-icon",
135
+ icon: "up-right-from-square",
136
+ size: "xs",
137
+ "aria-hidden": "true"
138
+ })) : i("", !0)
139
+ ], 16, v)) : M.value === "button" ? (l(), a("button", c({
140
+ key: 2,
141
+ class: B.value,
142
+ type: "button",
143
+ disabled: e.disabled,
144
+ "aria-disabled": e.disabled || void 0
145
+ }, n.$attrs, { onClick: I }), [
146
+ L.value ? (l(), a("span", C, [u(n.$slots, "leading")])) : i("", !0),
147
+ o("span", w, [u(n.$slots, "default")]),
148
+ R.value ? (l(), a("span", T, [u(n.$slots, "trailing")])) : i("", !0),
149
+ z.value ? (l(), r(t, {
150
+ key: 2,
151
+ class: "b-link__external-icon",
152
+ icon: "up-right-from-square",
153
+ size: "xs",
154
+ "aria-hidden": "true"
155
+ })) : i("", !0)
156
+ ], 16, S)) : (l(), a("span", c({
157
+ key: 3,
158
+ class: B.value,
159
+ role: "link",
160
+ "aria-disabled": "true"
161
+ }, n.$attrs), [
162
+ L.value ? (l(), a("span", E, [u(n.$slots, "leading")])) : i("", !0),
163
+ o("span", D, [u(n.$slots, "default")]),
164
+ R.value ? (l(), a("span", O, [u(n.$slots, "trailing")])) : i("", !0),
165
+ z.value ? (l(), r(t, {
166
+ key: 2,
167
+ class: "b-link__external-icon",
168
+ icon: "up-right-from-square",
169
+ size: "xs",
170
+ "aria-hidden": "true"
171
+ })) : i("", !0)
172
+ ], 16));
173
+ };
174
+ }
175
+ });
6
176
  //#endregion
7
- export { n as default };
177
+ export { k as default };
8
178
 
9
179
  //# sourceMappingURL=design-system126.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"design-system126.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":""}
1
+ {"version":3,"file":"design-system126.js","names":["$attrs"],"sources":["../src/components/BLink/BLink.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport BIcon from '@/components/BIcon/BIcon.vue';\nimport { BCommonColor } from '@/types.ts';\nimport { computed, resolveDynamicComponent, useSlots } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\n\ndefineOptions({ inheritAttrs: false });\n\nconst slots = useSlots();\n\nconst {\n href,\n to,\n target,\n rel,\n disabled = false,\n external = false,\n underline = 'hover',\n color = BCommonColor.Primary,\n as,\n showExternalIcon = true,\n} = defineProps<{\n /**\n * URL for an anchor link. When set (and `to` is not), the component\n * renders as an `<a href=\"...\">`.\n * @example 'https://example.com'\n */\n href?: string;\n /**\n * Vue Router target. When set, the component renders as `<RouterLink>`\n * (gracefully falls back to `<a>` if vue-router is not registered).\n */\n to?: RouteLocationRaw;\n /**\n * Anchor `target` attribute. Forced to `_blank` when `external` is true.\n * @example '_blank' | '_self' | '_parent' | '_top'\n */\n target?: string;\n /**\n * Anchor `rel` attribute. When `external` is true the value is augmented\n * with `noopener noreferrer`.\n */\n rel?: string;\n /**\n * Disables interaction. `<a>` and `<RouterLink>` are downgraded to a\n * `<span aria-disabled=\"true\">` since native anchors do not support `:disabled`.\n * @default false\n */\n disabled?: boolean;\n /**\n * Marks the link as external — forces `target=\"_blank\"`,\n * `rel=\"noopener noreferrer\"`, and renders a trailing external-link icon.\n * @default false\n */\n external?: boolean;\n /**\n * Underline behaviour.\n * - `always` — text-decoration always visible\n * - `hover` — only on hover / focus-visible\n * - `none` — never\n * @default 'hover'\n */\n underline?: 'always' | 'hover' | 'none';\n /**\n * Color family applied to the link text.\n * @default 'primary'\n */\n color?: `${BCommonColor}`;\n /**\n * Explicit element override. When set takes the highest priority over\n * `to` / `href`. `'a'` requires either `href` or generates a no-op\n * placeholder; `'button'` renders `<button type=\"button\">`.\n */\n as?: 'a' | 'button';\n /**\n * Whether to render the trailing external-link icon when `external` is true.\n * @default true\n */\n showExternalIcon?: boolean;\n}>();\n\nconst emit = defineEmits<{\n /** Fired on click. Suppressed when disabled. */\n click: [event: MouseEvent];\n}>();\n\n// ─────────────────────────────────────────────\n// Router availability (SSR-safe)\n// ─────────────────────────────────────────────\nconst hasRouterLink = computed(() => {\n const resolved = resolveDynamicComponent('RouterLink');\n return typeof resolved !== 'string';\n});\n\n// ─────────────────────────────────────────────\n// Element resolution priority:\n// 1. `as` prop → explicit override\n// 2. `to` → RouterLink (or <a> fallback if router not registered)\n// 3. `href` → <a>\n// 4. otherwise → <button type=\"button\">\n// When disabled, <a>/<RouterLink> are downgraded to <span aria-disabled=\"true\">.\n// ─────────────────────────────────────────────\ntype ResolvedTag = 'a' | 'button' | 'span' | 'router-link';\n\nconst resolvedTag = computed<ResolvedTag>(() => {\n if (as === 'button') return 'button';\n if (as === 'a') return disabled ? 'span' : 'a';\n if (to !== undefined && to !== null) {\n if (!hasRouterLink.value) return disabled ? 'span' : 'a';\n return disabled ? 'span' : 'router-link';\n }\n if (href !== undefined) return disabled ? 'span' : 'a';\n return 'button';\n});\n\n// Stringify a `to` prop into a usable href when RouterLink is unavailable.\nconst fallbackHref = computed(() => {\n if (to === undefined || to === null) return undefined;\n if (typeof to === 'string') return to;\n if (typeof to === 'object' && 'path' in to && typeof to.path === 'string') return to.path;\n try {\n return JSON.stringify(to);\n } catch {\n return undefined;\n }\n});\n\n// ─────────────────────────────────────────────\n// target / rel — `external` forces _blank + noopener noreferrer\n// ─────────────────────────────────────────────\nconst computedTarget = computed(() => {\n if (external) return '_blank';\n return target;\n});\n\nconst computedRel = computed(() => {\n const tokens = new Set<string>();\n if (rel) rel.split(/\\s+/).filter(Boolean).forEach((t) => tokens.add(t));\n if (external || computedTarget.value === '_blank') {\n tokens.add('noopener');\n tokens.add('noreferrer');\n }\n return tokens.size > 0 ? Array.from(tokens).join(' ') : undefined;\n});\n\n// ─────────────────────────────────────────────\n// Click handling — block when disabled\n// ─────────────────────────────────────────────\nconst onClick = (event: MouseEvent) => {\n if (disabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n emit('click', event);\n};\n\n// ─────────────────────────────────────────────\n// Slots\n// ─────────────────────────────────────────────\nconst hasLeading = computed(() => !!slots.leading);\nconst hasTrailing = computed(() => !!slots.trailing);\nconst showExternalGlyph = computed(\n () => external && showExternalIcon && !hasTrailing.value,\n);\n\n// ─────────────────────────────────────────────\n// Class binding (CSS-first)\n// ─────────────────────────────────────────────\nconst rootClasses = computed(() => [\n 'b-link',\n `b-link--${color}`,\n `b-link--underline-${underline}`,\n {\n 'b-link--disabled': disabled,\n 'b-link--external': external,\n },\n]);\n</script>\n\n<template>\n <RouterLink\n v-if=\"resolvedTag === 'router-link'\"\n :to=\"to!\"\n :class=\"rootClasses\"\n :target=\"computedTarget\"\n :rel=\"computedRel\"\n v-bind=\"$attrs\"\n @click=\"onClick\"\n >\n <span v-if=\"hasLeading\" class=\"b-link__leading\" aria-hidden=\"true\">\n <slot name=\"leading\" />\n </span>\n <span class=\"b-link__label\">\n <slot />\n </span>\n <span v-if=\"hasTrailing\" class=\"b-link__trailing\" aria-hidden=\"true\">\n <slot name=\"trailing\" />\n </span>\n <BIcon\n v-if=\"showExternalGlyph\"\n class=\"b-link__external-icon\"\n icon=\"up-right-from-square\"\n size=\"xs\"\n aria-hidden=\"true\"\n />\n </RouterLink>\n\n <a\n v-else-if=\"resolvedTag === 'a'\"\n :class=\"rootClasses\"\n :href=\"href ?? fallbackHref\"\n :target=\"computedTarget\"\n :rel=\"computedRel\"\n v-bind=\"$attrs\"\n @click=\"onClick\"\n >\n <span v-if=\"hasLeading\" class=\"b-link__leading\" aria-hidden=\"true\">\n <slot name=\"leading\" />\n </span>\n <span class=\"b-link__label\">\n <slot />\n </span>\n <span v-if=\"hasTrailing\" class=\"b-link__trailing\" aria-hidden=\"true\">\n <slot name=\"trailing\" />\n </span>\n <BIcon\n v-if=\"showExternalGlyph\"\n class=\"b-link__external-icon\"\n icon=\"up-right-from-square\"\n size=\"xs\"\n aria-hidden=\"true\"\n />\n </a>\n\n <button\n v-else-if=\"resolvedTag === 'button'\"\n :class=\"rootClasses\"\n type=\"button\"\n :disabled=\"disabled\"\n :aria-disabled=\"disabled || undefined\"\n v-bind=\"$attrs\"\n @click=\"onClick\"\n >\n <span v-if=\"hasLeading\" class=\"b-link__leading\" aria-hidden=\"true\">\n <slot name=\"leading\" />\n </span>\n <span class=\"b-link__label\">\n <slot />\n </span>\n <span v-if=\"hasTrailing\" class=\"b-link__trailing\" aria-hidden=\"true\">\n <slot name=\"trailing\" />\n </span>\n <BIcon\n v-if=\"showExternalGlyph\"\n class=\"b-link__external-icon\"\n icon=\"up-right-from-square\"\n size=\"xs\"\n aria-hidden=\"true\"\n />\n </button>\n\n <span\n v-else\n :class=\"rootClasses\"\n role=\"link\"\n aria-disabled=\"true\"\n v-bind=\"$attrs\"\n >\n <span v-if=\"hasLeading\" class=\"b-link__leading\" aria-hidden=\"true\">\n <slot name=\"leading\" />\n </span>\n <span class=\"b-link__label\">\n <slot />\n </span>\n <span v-if=\"hasTrailing\" class=\"b-link__trailing\" aria-hidden=\"true\">\n <slot name=\"trailing\" />\n </span>\n <BIcon\n v-if=\"showExternalGlyph\"\n class=\"b-link__external-icon\"\n icon=\"up-right-from-square\"\n size=\"xs\"\n aria-hidden=\"true\"\n />\n </span>\n</template>\n\n<style>\n.b-link {\n /* ── Component tokens ── */\n --b-link-color: var(--color-primary, oklch(55% 0.169 237.323));\n --b-link-color-hover: var(--color-primary-hover, oklch(48% 0.158 241.966));\n --b-link-color-disabled: oklch(0 0 0 / 0.35);\n --b-link-underline-color: currentColor;\n --b-link-underline-offset: 2px;\n --b-link-underline-thickness: 1px;\n --b-link-gap: 0.25rem;\n --b-link-focus-outline-color: currentColor;\n --b-link-focus-outline-width: 2px;\n --b-link-focus-outline-offset: 2px;\n --b-link-transition-duration: 150ms;\n\n display: inline-flex;\n align-items: center;\n gap: var(--b-link-gap);\n color: var(--b-link-color);\n background: transparent;\n border: none;\n padding: 0;\n font: inherit;\n line-height: inherit;\n cursor: pointer;\n text-decoration: none;\n text-decoration-color: var(--b-link-underline-color);\n text-underline-offset: var(--b-link-underline-offset);\n text-decoration-thickness: var(--b-link-underline-thickness);\n transition:\n color var(--b-link-transition-duration) ease,\n text-decoration-color var(--b-link-transition-duration) ease;\n}\n\n.b-link:hover:not(.b-link--disabled),\n.b-link:focus-visible:not(.b-link--disabled) {\n color: var(--b-link-color-hover);\n}\n\n.b-link:focus-visible {\n outline: var(--b-link-focus-outline-width) solid var(--b-link-focus-outline-color);\n outline-offset: var(--b-link-focus-outline-offset);\n border-radius: 2px;\n}\n\n/* ── Underline modes (CSS-first) ── */\n.b-link--underline-always {\n text-decoration: underline;\n}\n\n.b-link--underline-hover:hover:not(.b-link--disabled),\n.b-link--underline-hover:focus-visible:not(.b-link--disabled) {\n text-decoration: underline;\n}\n\n.b-link--underline-none,\n.b-link--underline-none:hover {\n text-decoration: none;\n}\n\n/* ── Color families ── */\n.b-link--primary {\n --b-link-color: var(--color-primary, oklch(55% 0.169 237.323));\n --b-link-color-hover: var(--color-primary-hover, oklch(48% 0.158 241.966));\n}\n.b-link--secondary {\n --b-link-color: oklch(0 0 0 / 0.85);\n --b-link-color-hover: var(--color-secondary-hover, oklch(87.1% 0.006 286.286));\n}\n.b-link--success {\n --b-link-color: var(--color-success, oklch(50% 0.17 149.579));\n --b-link-color-hover: var(--color-success-hover, oklch(43% 0.15 149.214));\n}\n.b-link--failure {\n --b-link-color: var(--color-failure, oklch(55% 0.22 25.331));\n --b-link-color-hover: var(--color-failure-hover, oklch(49% 0.21 27.325));\n}\n.b-link--warning {\n --b-link-color: var(--color-warning, oklch(55% 0.16 55.934));\n --b-link-color-hover: var(--color-warning-hover, oklch(48% 0.15 47.604));\n}\n.b-link--info {\n --b-link-color: var(--color-info, oklch(55% 0.2 259.815));\n --b-link-color-hover: var(--color-info-hover, oklch(48% 0.2 262.881));\n}\n\n/* ── Disabled ── */\n.b-link--disabled {\n color: var(--b-link-color-disabled);\n cursor: not-allowed;\n pointer-events: none;\n text-decoration: none;\n}\n\nbutton.b-link:disabled {\n color: var(--b-link-color-disabled);\n cursor: not-allowed;\n}\n\n/* ── Sub-elements ── */\n.b-link__leading,\n.b-link__trailing,\n.b-link__external-icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n line-height: 1;\n}\n\n/* ── Dark mode ── */\n[data-prefers-color='dark'] .b-link {\n --b-link-color-disabled: oklch(100% 0 0 / 0.35);\n}\n[data-prefers-color='dark'] .b-link--secondary {\n --b-link-color: oklch(100% 0 0 / 0.85);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-link {\n --b-link-color-disabled: oklch(100% 0 0 / 0.35);\n }\n [data-prefers-color='system'] .b-link--secondary {\n --b-link-color: oklch(100% 0 0 / 0.85);\n }\n}\n\n/* ── Reduced motion ── */\n@media (prefers-reduced-motion: reduce) {\n .b-link {\n transition: none;\n }\n}\n</style>\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import e from "./design-system126.js";
2
+ /* empty css */
3
+ //#region src/components/BLink/BLink.vue
4
+ var t = e;
5
+ //#endregion
6
+ export { t as default };
7
+
8
+ //# sourceMappingURL=design-system128.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-system128.js","names":[],"sources":["../src/components/BLink/BLink.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport BIcon from '@/components/BIcon/BIcon.vue';\nimport { BCommonColor } from '@/types.ts';\nimport { computed, resolveDynamicComponent, useSlots } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\n\ndefineOptions({ inheritAttrs: false });\n\nconst slots = useSlots();\n\nconst {\n href,\n to,\n target,\n rel,\n disabled = false,\n external = false,\n underline = 'hover',\n color = BCommonColor.Primary,\n as,\n showExternalIcon = true,\n} = defineProps<{\n /**\n * URL for an anchor link. When set (and `to` is not), the component\n * renders as an `<a href=\"...\">`.\n * @example 'https://example.com'\n */\n href?: string;\n /**\n * Vue Router target. When set, the component renders as `<RouterLink>`\n * (gracefully falls back to `<a>` if vue-router is not registered).\n */\n to?: RouteLocationRaw;\n /**\n * Anchor `target` attribute. Forced to `_blank` when `external` is true.\n * @example '_blank' | '_self' | '_parent' | '_top'\n */\n target?: string;\n /**\n * Anchor `rel` attribute. When `external` is true the value is augmented\n * with `noopener noreferrer`.\n */\n rel?: string;\n /**\n * Disables interaction. `<a>` and `<RouterLink>` are downgraded to a\n * `<span aria-disabled=\"true\">` since native anchors do not support `:disabled`.\n * @default false\n */\n disabled?: boolean;\n /**\n * Marks the link as external — forces `target=\"_blank\"`,\n * `rel=\"noopener noreferrer\"`, and renders a trailing external-link icon.\n * @default false\n */\n external?: boolean;\n /**\n * Underline behaviour.\n * - `always` — text-decoration always visible\n * - `hover` — only on hover / focus-visible\n * - `none` — never\n * @default 'hover'\n */\n underline?: 'always' | 'hover' | 'none';\n /**\n * Color family applied to the link text.\n * @default 'primary'\n */\n color?: `${BCommonColor}`;\n /**\n * Explicit element override. When set takes the highest priority over\n * `to` / `href`. `'a'` requires either `href` or generates a no-op\n * placeholder; `'button'` renders `<button type=\"button\">`.\n */\n as?: 'a' | 'button';\n /**\n * Whether to render the trailing external-link icon when `external` is true.\n * @default true\n */\n showExternalIcon?: boolean;\n}>();\n\nconst emit = defineEmits<{\n /** Fired on click. Suppressed when disabled. */\n click: [event: MouseEvent];\n}>();\n\n// ─────────────────────────────────────────────\n// Router availability (SSR-safe)\n// ─────────────────────────────────────────────\nconst hasRouterLink = computed(() => {\n const resolved = resolveDynamicComponent('RouterLink');\n return typeof resolved !== 'string';\n});\n\n// ─────────────────────────────────────────────\n// Element resolution priority:\n// 1. `as` prop → explicit override\n// 2. `to` → RouterLink (or <a> fallback if router not registered)\n// 3. `href` → <a>\n// 4. otherwise → <button type=\"button\">\n// When disabled, <a>/<RouterLink> are downgraded to <span aria-disabled=\"true\">.\n// ─────────────────────────────────────────────\ntype ResolvedTag = 'a' | 'button' | 'span' | 'router-link';\n\nconst resolvedTag = computed<ResolvedTag>(() => {\n if (as === 'button') return 'button';\n if (as === 'a') return disabled ? 'span' : 'a';\n if (to !== undefined && to !== null) {\n if (!hasRouterLink.value) return disabled ? 'span' : 'a';\n return disabled ? 'span' : 'router-link';\n }\n if (href !== undefined) return disabled ? 'span' : 'a';\n return 'button';\n});\n\n// Stringify a `to` prop into a usable href when RouterLink is unavailable.\nconst fallbackHref = computed(() => {\n if (to === undefined || to === null) return undefined;\n if (typeof to === 'string') return to;\n if (typeof to === 'object' && 'path' in to && typeof to.path === 'string') return to.path;\n try {\n return JSON.stringify(to);\n } catch {\n return undefined;\n }\n});\n\n// ─────────────────────────────────────────────\n// target / rel — `external` forces _blank + noopener noreferrer\n// ─────────────────────────────────────────────\nconst computedTarget = computed(() => {\n if (external) return '_blank';\n return target;\n});\n\nconst computedRel = computed(() => {\n const tokens = new Set<string>();\n if (rel) rel.split(/\\s+/).filter(Boolean).forEach((t) => tokens.add(t));\n if (external || computedTarget.value === '_blank') {\n tokens.add('noopener');\n tokens.add('noreferrer');\n }\n return tokens.size > 0 ? Array.from(tokens).join(' ') : undefined;\n});\n\n// ─────────────────────────────────────────────\n// Click handling — block when disabled\n// ─────────────────────────────────────────────\nconst onClick = (event: MouseEvent) => {\n if (disabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n emit('click', event);\n};\n\n// ─────────────────────────────────────────────\n// Slots\n// ─────────────────────────────────────────────\nconst hasLeading = computed(() => !!slots.leading);\nconst hasTrailing = computed(() => !!slots.trailing);\nconst showExternalGlyph = computed(\n () => external && showExternalIcon && !hasTrailing.value,\n);\n\n// ─────────────────────────────────────────────\n// Class binding (CSS-first)\n// ─────────────────────────────────────────────\nconst rootClasses = computed(() => [\n 'b-link',\n `b-link--${color}`,\n `b-link--underline-${underline}`,\n {\n 'b-link--disabled': disabled,\n 'b-link--external': external,\n },\n]);\n</script>\n\n<template>\n <RouterLink\n v-if=\"resolvedTag === 'router-link'\"\n :to=\"to!\"\n :class=\"rootClasses\"\n :target=\"computedTarget\"\n :rel=\"computedRel\"\n v-bind=\"$attrs\"\n @click=\"onClick\"\n >\n <span v-if=\"hasLeading\" class=\"b-link__leading\" aria-hidden=\"true\">\n <slot name=\"leading\" />\n </span>\n <span class=\"b-link__label\">\n <slot />\n </span>\n <span v-if=\"hasTrailing\" class=\"b-link__trailing\" aria-hidden=\"true\">\n <slot name=\"trailing\" />\n </span>\n <BIcon\n v-if=\"showExternalGlyph\"\n class=\"b-link__external-icon\"\n icon=\"up-right-from-square\"\n size=\"xs\"\n aria-hidden=\"true\"\n />\n </RouterLink>\n\n <a\n v-else-if=\"resolvedTag === 'a'\"\n :class=\"rootClasses\"\n :href=\"href ?? fallbackHref\"\n :target=\"computedTarget\"\n :rel=\"computedRel\"\n v-bind=\"$attrs\"\n @click=\"onClick\"\n >\n <span v-if=\"hasLeading\" class=\"b-link__leading\" aria-hidden=\"true\">\n <slot name=\"leading\" />\n </span>\n <span class=\"b-link__label\">\n <slot />\n </span>\n <span v-if=\"hasTrailing\" class=\"b-link__trailing\" aria-hidden=\"true\">\n <slot name=\"trailing\" />\n </span>\n <BIcon\n v-if=\"showExternalGlyph\"\n class=\"b-link__external-icon\"\n icon=\"up-right-from-square\"\n size=\"xs\"\n aria-hidden=\"true\"\n />\n </a>\n\n <button\n v-else-if=\"resolvedTag === 'button'\"\n :class=\"rootClasses\"\n type=\"button\"\n :disabled=\"disabled\"\n :aria-disabled=\"disabled || undefined\"\n v-bind=\"$attrs\"\n @click=\"onClick\"\n >\n <span v-if=\"hasLeading\" class=\"b-link__leading\" aria-hidden=\"true\">\n <slot name=\"leading\" />\n </span>\n <span class=\"b-link__label\">\n <slot />\n </span>\n <span v-if=\"hasTrailing\" class=\"b-link__trailing\" aria-hidden=\"true\">\n <slot name=\"trailing\" />\n </span>\n <BIcon\n v-if=\"showExternalGlyph\"\n class=\"b-link__external-icon\"\n icon=\"up-right-from-square\"\n size=\"xs\"\n aria-hidden=\"true\"\n />\n </button>\n\n <span\n v-else\n :class=\"rootClasses\"\n role=\"link\"\n aria-disabled=\"true\"\n v-bind=\"$attrs\"\n >\n <span v-if=\"hasLeading\" class=\"b-link__leading\" aria-hidden=\"true\">\n <slot name=\"leading\" />\n </span>\n <span class=\"b-link__label\">\n <slot />\n </span>\n <span v-if=\"hasTrailing\" class=\"b-link__trailing\" aria-hidden=\"true\">\n <slot name=\"trailing\" />\n </span>\n <BIcon\n v-if=\"showExternalGlyph\"\n class=\"b-link__external-icon\"\n icon=\"up-right-from-square\"\n size=\"xs\"\n aria-hidden=\"true\"\n />\n </span>\n</template>\n\n<style>\n.b-link {\n /* ── Component tokens ── */\n --b-link-color: var(--color-primary, oklch(55% 0.169 237.323));\n --b-link-color-hover: var(--color-primary-hover, oklch(48% 0.158 241.966));\n --b-link-color-disabled: oklch(0 0 0 / 0.35);\n --b-link-underline-color: currentColor;\n --b-link-underline-offset: 2px;\n --b-link-underline-thickness: 1px;\n --b-link-gap: 0.25rem;\n --b-link-focus-outline-color: currentColor;\n --b-link-focus-outline-width: 2px;\n --b-link-focus-outline-offset: 2px;\n --b-link-transition-duration: 150ms;\n\n display: inline-flex;\n align-items: center;\n gap: var(--b-link-gap);\n color: var(--b-link-color);\n background: transparent;\n border: none;\n padding: 0;\n font: inherit;\n line-height: inherit;\n cursor: pointer;\n text-decoration: none;\n text-decoration-color: var(--b-link-underline-color);\n text-underline-offset: var(--b-link-underline-offset);\n text-decoration-thickness: var(--b-link-underline-thickness);\n transition:\n color var(--b-link-transition-duration) ease,\n text-decoration-color var(--b-link-transition-duration) ease;\n}\n\n.b-link:hover:not(.b-link--disabled),\n.b-link:focus-visible:not(.b-link--disabled) {\n color: var(--b-link-color-hover);\n}\n\n.b-link:focus-visible {\n outline: var(--b-link-focus-outline-width) solid var(--b-link-focus-outline-color);\n outline-offset: var(--b-link-focus-outline-offset);\n border-radius: 2px;\n}\n\n/* ── Underline modes (CSS-first) ── */\n.b-link--underline-always {\n text-decoration: underline;\n}\n\n.b-link--underline-hover:hover:not(.b-link--disabled),\n.b-link--underline-hover:focus-visible:not(.b-link--disabled) {\n text-decoration: underline;\n}\n\n.b-link--underline-none,\n.b-link--underline-none:hover {\n text-decoration: none;\n}\n\n/* ── Color families ── */\n.b-link--primary {\n --b-link-color: var(--color-primary, oklch(55% 0.169 237.323));\n --b-link-color-hover: var(--color-primary-hover, oklch(48% 0.158 241.966));\n}\n.b-link--secondary {\n --b-link-color: oklch(0 0 0 / 0.85);\n --b-link-color-hover: var(--color-secondary-hover, oklch(87.1% 0.006 286.286));\n}\n.b-link--success {\n --b-link-color: var(--color-success, oklch(50% 0.17 149.579));\n --b-link-color-hover: var(--color-success-hover, oklch(43% 0.15 149.214));\n}\n.b-link--failure {\n --b-link-color: var(--color-failure, oklch(55% 0.22 25.331));\n --b-link-color-hover: var(--color-failure-hover, oklch(49% 0.21 27.325));\n}\n.b-link--warning {\n --b-link-color: var(--color-warning, oklch(55% 0.16 55.934));\n --b-link-color-hover: var(--color-warning-hover, oklch(48% 0.15 47.604));\n}\n.b-link--info {\n --b-link-color: var(--color-info, oklch(55% 0.2 259.815));\n --b-link-color-hover: var(--color-info-hover, oklch(48% 0.2 262.881));\n}\n\n/* ── Disabled ── */\n.b-link--disabled {\n color: var(--b-link-color-disabled);\n cursor: not-allowed;\n pointer-events: none;\n text-decoration: none;\n}\n\nbutton.b-link:disabled {\n color: var(--b-link-color-disabled);\n cursor: not-allowed;\n}\n\n/* ── Sub-elements ── */\n.b-link__leading,\n.b-link__trailing,\n.b-link__external-icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n line-height: 1;\n}\n\n/* ── Dark mode ── */\n[data-prefers-color='dark'] .b-link {\n --b-link-color-disabled: oklch(100% 0 0 / 0.35);\n}\n[data-prefers-color='dark'] .b-link--secondary {\n --b-link-color: oklch(100% 0 0 / 0.85);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-link {\n --b-link-color-disabled: oklch(100% 0 0 / 0.35);\n }\n [data-prefers-color='system'] .b-link--secondary {\n --b-link-color: oklch(100% 0 0 / 0.85);\n }\n}\n\n/* ── Reduced motion ── */\n@media (prefers-reduced-motion: reduce) {\n .b-link {\n transition: none;\n }\n}\n</style>\n"],"mappings":""}