@leavepulse/ui 0.43.4 → 0.45.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 (437) hide show
  1. package/README.md +121 -7
  2. package/dist/assets/{LpCommandPalette-B-0Est4Z.css → LpCommandPalette-nGNnzXqQ.css} +21 -21
  3. package/dist/assets/{LpDropzone-BBoWvi-J.css → LpDropzone-i4BdMi1H.css} +12 -12
  4. package/dist/assets/{LpImageEditor-Ct7Y3aNu.css → LpImageEditor-CbMA82g8.css} +6 -6
  5. package/dist/assets/{LpRollingText-CR1mb0Vt.css → LpRollingText-BGnE6q9j.css} +3 -0
  6. package/dist/assets/{LpShortcutsDialog-C6YoQ8_M.css → LpShortcutsDialog-CqYX3yy6.css} +28 -7
  7. package/dist/assets/{LpSkeleton-D7xU8IPV.css → LpSkeleton-H3Z5dEIk.css} +4 -1
  8. package/dist/assets/{LpTable-BgPLJOXa.css → LpTable-CPwWxTJS.css} +49 -9
  9. package/dist/chunks/ContextMenuItems-BtKU7074.js +124 -0
  10. package/dist/chunks/{LayoutCanvas-Dd20boUG.js → LayoutCanvas-BkaGXTjx.js} +26 -9
  11. package/dist/chunks/{LayoutNode-DGpZA9LX.js → LayoutNode-B3_9E1Xa.js} +28 -12
  12. package/dist/chunks/{LpActionBar-BlvtGB2P.js → LpActionBar-CnfFVIwC.js} +26 -12
  13. package/dist/chunks/{LpAddressInput-B-Zvxsn7.js → LpAddressInput-BwX8uo4_.js} +54 -49
  14. package/dist/chunks/{LpAlert-BAYHDSS1.js → LpAlert-B6ilrM7T.js} +16 -9
  15. package/dist/chunks/{LpAppShell-BGQVIY-3.js → LpAppShell-C53_RaGF.js} +53 -26
  16. package/dist/chunks/{LpAutocomplete-DExlIZe_.js → LpAutocomplete-C8IgSMsi.js} +52 -24
  17. package/dist/chunks/{LpAvatar-B3-xAOH3.js → LpAvatar-C1XStdOo.js} +19 -10
  18. package/dist/chunks/LpBreadcrumbs-CQJd73Gm.js +95 -0
  19. package/dist/chunks/{LpButton-5VXXCjwF.js → LpButton-CKSwC6Mu.js} +45 -15
  20. package/dist/chunks/{LpCalendar-B7Ko5RdR.js → LpCalendar-DrA2McTU.js} +1 -1
  21. package/dist/chunks/{LpCard-BhI1N_vL.js → LpCard-C2IvucmX.js} +1 -1
  22. package/dist/chunks/{LpCheckbox-CVccKYaH.js → LpCheckbox-Bkj13CbW.js} +8 -4
  23. package/dist/chunks/{LpCodeBlock-Bo0B4TFR.js → LpCodeBlock-ca7ANFyW.js} +49 -17
  24. package/dist/chunks/{LpColorPicker-BlXea7LM.js → LpColorPicker-zz4VGkG4.js} +75 -26
  25. package/dist/chunks/{LpConfirmDialog-Q-bxff8z.js → LpConfirmDialog-DCw5jR1t.js} +59 -17
  26. package/dist/chunks/LpConfirmHost-CbywMpMP.js +49 -0
  27. package/dist/chunks/LpContextMenu-BqkAYa9X.js +69 -0
  28. package/dist/chunks/LpDatePicker-DuusgT69.js +195 -0
  29. package/dist/chunks/LpDateRangePicker-DHeuznfC.js +208 -0
  30. package/dist/chunks/{LpDisclosure-ChQYmjlR.js → LpDisclosure-Cc23-JOT.js} +1 -1
  31. package/dist/chunks/{LpDrawer-BZ6k3hvo.js → LpDrawer-Dt4aB4Fr.js} +65 -28
  32. package/dist/chunks/{LpDropdownMenu-DJpoqRCb.js → LpDropdownMenu-DdJGQzPn.js} +2 -1
  33. package/dist/chunks/{LpEmptyState-Dsdqz1Wj.js → LpEmptyState-BJbZXC8D.js} +1 -1
  34. package/dist/chunks/LpFieldNotice-wtieLUTj.js +64 -0
  35. package/dist/chunks/{LpFileTree-_5vFBgaK.js → LpFileTree-CNurOvkV.js} +25 -10
  36. package/dist/chunks/{LpFileTreeNode-BdcIYKIE.js → LpFileTreeNode-D_qRRdsH.js} +3 -3
  37. package/dist/chunks/LpFormField-CtVYj6tO.js +101 -0
  38. package/dist/chunks/{LpIcon-CCnX5_2j.js → LpIcon-DYtaid0K.js} +20 -6
  39. package/dist/chunks/{LpInput-9EXWUM9B.js → LpInput-D-YGQbEv.js} +58 -20
  40. package/dist/chunks/{LpLightbox-2sYVMY-S.js → LpLightbox-DSDahF23.js} +148 -61
  41. package/dist/chunks/{LpLink-DCND-zyu.js → LpLink-Krkjhe_y.js} +15 -6
  42. package/dist/chunks/{LpLogViewer-CaRy5MeS.js → LpLogViewer-KypbgOyo.js} +300 -72
  43. package/dist/chunks/{LpMapPicker-ul4oYno6.js → LpMapPicker-Cc84LaM3.js} +39 -14
  44. package/dist/chunks/{LpMediaGallery-FF-NquIo.js → LpMediaGallery-YKr-cQPN.js} +7 -4
  45. package/dist/chunks/{LpModal-Bt0pQCI_.js → LpModal-DMMDQHAu.js} +52 -29
  46. package/dist/chunks/{LpModalNav-YaifHrXC.js → LpModalNav-BVPDyIup.js} +10 -7
  47. package/dist/chunks/{LpNotificationBell-DyGGsMAM.js → LpNotificationBell-CCwyJP5C.js} +79 -33
  48. package/dist/chunks/{LpNumberField-CWuX08iX.js → LpNumberField-B77O-z28.js} +21 -8
  49. package/dist/chunks/{LpNumberFlow-amWYaeuA.js → LpNumberFlow-z4WPZcZu.js} +22 -12
  50. package/dist/chunks/{LpOtpInput-y2v-pmiN.js → LpOtpInput-CziPF3Oq.js} +37 -8
  51. package/dist/chunks/{LpPagination-5FxjmmB5.js → LpPagination-BcDlo3r_.js} +31 -20
  52. package/dist/chunks/{LpPasswordInput--sjYCkLS.js → LpPasswordInput-eKzQhbQP.js} +11 -8
  53. package/dist/chunks/LpPhoneInput-BCbrrhgE.js +336 -0
  54. package/dist/chunks/{LpPie-D6OnzwlJ.js → LpPie-BEJ2SfI6.js} +84 -28
  55. package/dist/chunks/{LpPopover-8268UmlC.js → LpPopover-DCKeqiVn.js} +5 -2
  56. package/dist/chunks/{LpProgress-Btq5W4Ut.js → LpProgress-CBU1iI69.js} +5 -4
  57. package/dist/chunks/{LpRadioGroup-xPIuVDO_.js → LpRadioGroup-DmEW0l78.js} +9 -2
  58. package/dist/chunks/LpRangeCalendar-DZuaRV0W.js +331 -0
  59. package/dist/chunks/{LpRollingText-CM5gkSeF.js → LpRollingText-DB7upf-5.js} +1 -1
  60. package/dist/chunks/{LpScrollArea-D8xyKXcF.js → LpScrollArea-Bry1fdOM.js} +14 -2
  61. package/dist/chunks/{LpSection-aM6J_u51.js → LpSection-tKEH0jYf.js} +1 -1
  62. package/dist/chunks/{LpSegmented-fV0Sk92p.js → LpSegmented-C09EEam2.js} +8 -4
  63. package/dist/chunks/{LpSelect-ANIVtrpM.js → LpSelect-DNIL6MB9.js} +50 -31
  64. package/dist/chunks/{LpSidebar-ClBUwoEz.js → LpSidebar-CQNB0-yU.js} +30 -22
  65. package/dist/chunks/{LpSidebarNav-llOcs_Fn.js → LpSidebarNav-kx-LdqNU.js} +16 -11
  66. package/dist/chunks/{LpSkeleton-CTI-vBgW.js → LpSkeleton-BB6XIV-w.js} +1 -1
  67. package/dist/chunks/{LpSlider-BwNIBkAK.js → LpSlider-Cuzmrd7p.js} +7 -2
  68. package/dist/chunks/{LpSparkline-C6xQ2dwv.js → LpSparkline-CB80N8SJ.js} +11 -4
  69. package/dist/chunks/{LpStat-CQaW8R--.js → LpStat-B-7udBRP.js} +2 -2
  70. package/dist/chunks/{LpStepper-Bk-XaQYU.js → LpStepper-C7XiVKZj.js} +34 -19
  71. package/dist/chunks/{LpSwitch-Blizvqyt.js → LpSwitch-OrcOJX9m.js} +41 -27
  72. package/dist/chunks/LpTableFilter-BV8PpLM9.js +158 -0
  73. package/dist/chunks/{LpTableOfContents-CjvxPMpU.js → LpTableOfContents-BUcAfGPQ.js} +36 -41
  74. package/dist/chunks/{LpTabs-Cefe_lys.js → LpTabs-29iW1XOx.js} +20 -6
  75. package/dist/chunks/LpTagsInput-D1SuqbhB.js +300 -0
  76. package/dist/chunks/LpTextarea-uuScWo6-.js +77 -0
  77. package/dist/chunks/LpThemeProvider-Be4r2TQX.js +35 -0
  78. package/dist/chunks/LpThemeSwitcher-B4aVPbNC.js +166 -0
  79. package/dist/chunks/{LpTilt-DuyKbpkA.js → LpTilt-B7KHX1zH.js} +2 -2
  80. package/dist/chunks/{LpTimeField-K6nAGboX.js → LpTimeField-Cqe7fXnh.js} +14 -8
  81. package/dist/chunks/{LpToaster-gDB1EaU3.js → LpToaster-DpJvoCOh.js} +94 -31
  82. package/dist/chunks/{LpTooltip-hCLPAqMG.js → LpTooltip-CXVKcOXT.js} +14 -6
  83. package/dist/chunks/LpTooltipProvider-CftjV7Xc.js +25 -0
  84. package/dist/chunks/{LpTopologyCanvas-Cm1L39uL.js → LpTopologyCanvas-6ozNrQKh.js} +8 -2
  85. package/dist/chunks/{LpUptimeBar-DvAMno0S.js → LpUptimeBar-ugcv25xj.js} +44 -15
  86. package/dist/chunks/icons-CkA0njzm.js +43 -0
  87. package/dist/chunks/{LpThemeSwitcher-Cue-myST.js → useTheme-DJm1JSsY.js} +215 -260
  88. package/dist/component-names.d.ts +1 -1
  89. package/dist/components/ContextMenuItems.vue.d.ts +8 -0
  90. package/dist/components/ContextMenuItems.vue.js +4 -0
  91. package/dist/components/LayoutCanvas.vue.js +1 -1
  92. package/dist/components/LayoutNode.vue.d.ts +4 -0
  93. package/dist/components/LayoutNode.vue.js +1 -1
  94. package/dist/components/LpActionBar.vue.d.ts +3 -0
  95. package/dist/components/LpActionBar.vue.js +1 -1
  96. package/dist/components/LpAddressInput.vue.d.ts +1 -1
  97. package/dist/components/LpAddressInput.vue.js +1 -1
  98. package/dist/components/LpAlert.vue.d.ts +9 -0
  99. package/dist/components/LpAlert.vue.js +1 -1
  100. package/dist/components/LpAppShell.vue.d.ts +10 -0
  101. package/dist/components/LpAppShell.vue.js +1 -1
  102. package/dist/components/LpAutocomplete.vue.d.ts +31 -6
  103. package/dist/components/LpAutocomplete.vue.js +1 -1
  104. package/dist/components/LpAvatar.vue.d.ts +3 -3
  105. package/dist/components/LpAvatar.vue.js +1 -1
  106. package/dist/components/LpBadge.vue.d.ts +2 -2
  107. package/dist/components/LpBreadcrumbs.vue.d.ts +13 -9
  108. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  109. package/dist/components/LpButton.vue.d.ts +35 -98
  110. package/dist/components/LpButton.vue.js +1 -1
  111. package/dist/components/LpCalendar.vue.js +1 -1
  112. package/dist/components/LpCard.vue.js +1 -1
  113. package/dist/components/LpChart.vue.d.ts +47 -3
  114. package/dist/components/LpChart.vue.js +377 -97
  115. package/dist/components/LpCheckbox.vue.js +1 -1
  116. package/dist/components/LpCodeBlock.vue.d.ts +2 -0
  117. package/dist/components/LpCodeBlock.vue.js +1 -1
  118. package/dist/components/LpColorPicker.vue.d.ts +2 -2
  119. package/dist/components/LpColorPicker.vue.js +1 -1
  120. package/dist/components/LpCommandPalette.vue.d.ts +14 -3
  121. package/dist/components/LpCommandPalette.vue.js +142 -77
  122. package/dist/components/LpConfirmDialog.vue.d.ts +15 -3
  123. package/dist/components/LpConfirmDialog.vue.js +1 -1
  124. package/dist/components/LpConfirmHost.vue.d.ts +9 -0
  125. package/dist/components/LpConfirmHost.vue.js +4 -0
  126. package/dist/components/LpContextMenu.vue.d.ts +3 -5
  127. package/dist/components/LpContextMenu.vue.js +1 -1
  128. package/dist/components/LpDatePicker.vue.d.ts +24 -6
  129. package/dist/components/LpDatePicker.vue.js +1 -1
  130. package/dist/components/LpDateRangePicker.vue.d.ts +60 -0
  131. package/dist/components/LpDateRangePicker.vue.js +4 -0
  132. package/dist/components/LpDisclosure.vue.js +1 -1
  133. package/dist/components/LpDrawer.vue.d.ts +10 -0
  134. package/dist/components/LpDrawer.vue.js +1 -1
  135. package/dist/components/LpDropdownMenu.vue.js +1 -1
  136. package/dist/components/LpDropzone.vue.js +23 -7
  137. package/dist/components/LpEmptyState.vue.js +1 -1
  138. package/dist/components/LpFieldNotice.vue.d.ts +8 -0
  139. package/dist/components/LpFieldNotice.vue.js +4 -0
  140. package/dist/components/LpFileTree.vue.d.ts +11 -2
  141. package/dist/components/LpFileTree.vue.js +1 -1
  142. package/dist/components/LpFileTreeNode.vue.js +1 -1
  143. package/dist/components/LpFormField.vue.d.ts +13 -1
  144. package/dist/components/LpFormField.vue.js +1 -1
  145. package/dist/components/LpIcon.vue.d.ts +0 -1
  146. package/dist/components/LpIcon.vue.js +1 -1
  147. package/dist/components/LpImageEditor.vue.js +93 -58
  148. package/dist/components/LpInput.vue.d.ts +22 -3
  149. package/dist/components/LpInput.vue.js +1 -1
  150. package/dist/components/LpLightbox.vue.d.ts +17 -0
  151. package/dist/components/LpLightbox.vue.js +1 -1
  152. package/dist/components/LpLink.vue.d.ts +11 -11
  153. package/dist/components/LpLink.vue.js +1 -1
  154. package/dist/components/LpLogViewer.vue.d.ts +72 -3
  155. package/dist/components/LpLogViewer.vue.js +1 -1
  156. package/dist/components/LpMapPicker.vue.d.ts +4 -4
  157. package/dist/components/LpMapPicker.vue.js +1 -1
  158. package/dist/components/LpMediaGallery.vue.js +1 -1
  159. package/dist/components/LpModal.vue.d.ts +16 -6
  160. package/dist/components/LpModal.vue.js +1 -1
  161. package/dist/components/LpModalNav.vue.d.ts +0 -1
  162. package/dist/components/LpModalNav.vue.js +1 -1
  163. package/dist/components/LpNotificationBell.vue.d.ts +11 -2
  164. package/dist/components/LpNotificationBell.vue.js +1 -1
  165. package/dist/components/LpNumberField.vue.d.ts +2 -0
  166. package/dist/components/LpNumberField.vue.js +1 -1
  167. package/dist/components/LpNumberFlow.vue.js +1 -1
  168. package/dist/components/LpOtpInput.vue.js +1 -1
  169. package/dist/components/LpPagination.vue.d.ts +2 -0
  170. package/dist/components/LpPagination.vue.js +1 -1
  171. package/dist/components/LpPasswordInput.vue.js +1 -1
  172. package/dist/components/LpPhoneInput.vue.d.ts +13 -0
  173. package/dist/components/LpPhoneInput.vue.js +1 -1
  174. package/dist/components/LpPie.vue.d.ts +21 -2
  175. package/dist/components/LpPie.vue.js +1 -1
  176. package/dist/components/LpPopover.vue.d.ts +2 -0
  177. package/dist/components/LpPopover.vue.js +1 -1
  178. package/dist/components/LpProgress.vue.d.ts +1 -1
  179. package/dist/components/LpProgress.vue.js +1 -1
  180. package/dist/components/LpRadioGroup.vue.js +1 -1
  181. package/dist/components/LpRangeCalendar.vue.d.ts +51 -0
  182. package/dist/components/LpRangeCalendar.vue.js +4 -0
  183. package/dist/components/LpRollingText.vue.d.ts +1 -1
  184. package/dist/components/LpRollingText.vue.js +1 -1
  185. package/dist/components/LpScrollArea.vue.d.ts +2 -2
  186. package/dist/components/LpScrollArea.vue.js +1 -1
  187. package/dist/components/LpSection.vue.d.ts +1 -1
  188. package/dist/components/LpSection.vue.js +1 -1
  189. package/dist/components/LpSegmented.vue.d.ts +5 -0
  190. package/dist/components/LpSegmented.vue.js +1 -1
  191. package/dist/components/LpSelect.vue.d.ts +1 -0
  192. package/dist/components/LpSelect.vue.js +1 -1
  193. package/dist/components/LpShortcutsDialog.vue.d.ts +7 -1
  194. package/dist/components/LpShortcutsDialog.vue.js +60 -15
  195. package/dist/components/LpSidebar.vue.d.ts +6 -2
  196. package/dist/components/LpSidebar.vue.js +1 -1
  197. package/dist/components/LpSidebarNav.vue.js +1 -1
  198. package/dist/components/LpSkeleton.vue.js +1 -1
  199. package/dist/components/LpSlider.vue.js +1 -1
  200. package/dist/components/LpSparkline.vue.d.ts +1 -0
  201. package/dist/components/LpSparkline.vue.js +1 -1
  202. package/dist/components/LpStat.vue.js +1 -1
  203. package/dist/components/LpStepper.vue.js +1 -1
  204. package/dist/components/LpSwitch.vue.js +1 -1
  205. package/dist/components/LpTable.vue.d.ts +107 -3
  206. package/dist/components/LpTable.vue.js +540 -128
  207. package/dist/components/LpTableFilter.vue.d.ts +31 -0
  208. package/dist/components/LpTableFilter.vue.js +4 -0
  209. package/dist/components/LpTableOfContents.vue.d.ts +4 -2
  210. package/dist/components/LpTableOfContents.vue.js +1 -1
  211. package/dist/components/LpTabs.vue.d.ts +2 -0
  212. package/dist/components/LpTabs.vue.js +1 -1
  213. package/dist/components/LpTagsInput.vue.d.ts +77 -0
  214. package/dist/components/LpTagsInput.vue.js +4 -0
  215. package/dist/components/LpTextarea.vue.d.ts +19 -6
  216. package/dist/components/LpTextarea.vue.js +1 -1
  217. package/dist/components/LpThemeProvider.vue.d.ts +22 -0
  218. package/dist/components/LpThemeProvider.vue.js +4 -0
  219. package/dist/components/LpThemeSwitcher.vue.d.ts +15 -2
  220. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  221. package/dist/components/LpTilt.vue.js +1 -1
  222. package/dist/components/LpTimeField.vue.js +1 -1
  223. package/dist/components/LpToaster.vue.d.ts +6 -1
  224. package/dist/components/LpToaster.vue.js +1 -1
  225. package/dist/components/LpTooltip.vue.d.ts +1 -2
  226. package/dist/components/LpTooltip.vue.js +1 -1
  227. package/dist/components/LpTooltipProvider.vue.d.ts +22 -0
  228. package/dist/components/LpTooltipProvider.vue.js +4 -0
  229. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  230. package/dist/components/LpUptimeBar.vue.d.ts +4 -0
  231. package/dist/components/LpUptimeBar.vue.js +1 -1
  232. package/dist/components/chart.d.ts +32 -1
  233. package/dist/components/chart.js +42 -6
  234. package/dist/components/codeHighlight.d.ts +6 -0
  235. package/dist/components/codeHighlight.js +92 -20
  236. package/dist/components/color.d.ts +1 -1
  237. package/dist/components/color.js +20 -9
  238. package/dist/components/commandSearch.js +3 -0
  239. package/dist/components/confirm.d.ts +25 -0
  240. package/dist/components/confirm.js +26 -0
  241. package/dist/components/countries.d.ts +6 -0
  242. package/dist/components/countries.js +7 -0
  243. package/dist/components/dateRange.d.ts +43 -0
  244. package/dist/components/dateRange.js +76 -0
  245. package/dist/components/exportData.d.ts +58 -0
  246. package/dist/components/exportData.js +165 -0
  247. package/dist/components/fileTree.js +16 -7
  248. package/dist/components/imageCrop.d.ts +42 -0
  249. package/dist/components/imageCrop.js +47 -0
  250. package/dist/components/link.d.ts +12 -0
  251. package/dist/components/link.js +19 -0
  252. package/dist/components/logSearch.d.ts +18 -0
  253. package/dist/components/logSearch.js +36 -0
  254. package/dist/components/modalDepth.d.ts +18 -2
  255. package/dist/components/modalDepth.js +17 -5
  256. package/dist/components/otp.d.ts +5 -0
  257. package/dist/components/otp.js +10 -0
  258. package/dist/components/phone.d.ts +41 -0
  259. package/dist/components/phone.js +80 -0
  260. package/dist/components/sidebar.d.ts +7 -1
  261. package/dist/components/tableFilter.d.ts +36 -0
  262. package/dist/components/tableFilter.js +84 -0
  263. package/dist/components/tableSort.d.ts +8 -0
  264. package/dist/components/tableSort.js +31 -0
  265. package/dist/components/tags.d.ts +20 -0
  266. package/dist/components/tags.js +37 -0
  267. package/dist/composables/useField.d.ts +38 -0
  268. package/dist/composables/useField.js +45 -0
  269. package/dist/composables/useFieldNotice.d.ts +17 -0
  270. package/dist/composables/useFieldNotice.js +28 -0
  271. package/dist/composables/useForm.d.ts +53 -0
  272. package/dist/composables/useForm.js +207 -0
  273. package/dist/composables/useFormDraft.d.ts +10 -3
  274. package/dist/composables/useFormDraft.js +9 -14
  275. package/dist/composables/useHotkeys.d.ts +81 -5
  276. package/dist/composables/useHotkeys.js +223 -25
  277. package/dist/composables/useInputFilter.d.ts +17 -0
  278. package/dist/composables/useInputFilter.js +47 -10
  279. package/dist/composables/useInputMask.d.ts +59 -0
  280. package/dist/composables/useInputMask.js +170 -0
  281. package/dist/composables/useLpConfig.d.ts +24 -0
  282. package/dist/composables/useLpConfig.js +44 -0
  283. package/dist/composables/usePaintSelect.d.ts +22 -0
  284. package/dist/composables/usePaintSelect.js +169 -0
  285. package/dist/composables/useRovingFocus.js +7 -0
  286. package/dist/composables/useShift.js +7 -2
  287. package/dist/composables/useTilt.d.ts +2 -2
  288. package/dist/composables/useTilt.js +5 -6
  289. package/dist/composables/useToast.d.ts +20 -0
  290. package/dist/composables/useToast.js +28 -4
  291. package/dist/composables/useZoomPan.d.ts +3 -3
  292. package/dist/composables/useZoomPan.js +4 -4
  293. package/dist/icons-all.d.ts +1 -0
  294. package/dist/icons-all.js +3 -0
  295. package/dist/icons.d.ts +14 -1
  296. package/dist/index.d.ts +60 -4
  297. package/dist/index.js +245 -141
  298. package/dist/kit-icons.d.ts +2 -0
  299. package/dist/layout/tree.d.ts +2 -0
  300. package/dist/layout/tree.js +16 -1
  301. package/dist/layout/useLayout.d.ts +15 -0
  302. package/dist/layout/useLayout.js +41 -14
  303. package/dist/theme/backdrop.d.ts +12 -0
  304. package/dist/theme/presets.d.ts +0 -2
  305. package/dist/theme/useTheme.d.ts +32 -9
  306. package/package.json +18 -8
  307. package/src/component-names.ts +9 -7
  308. package/src/components/ContextMenuItems.vue +88 -0
  309. package/src/components/LayoutCanvas.vue +26 -6
  310. package/src/components/LayoutNode.vue +30 -4
  311. package/src/components/LpActionBar.vue +31 -8
  312. package/src/components/LpAddressInput.vue +57 -41
  313. package/src/components/LpAlert.vue +16 -3
  314. package/src/components/LpAppShell.vue +45 -12
  315. package/src/components/LpAutocomplete.vue +47 -10
  316. package/src/components/LpAvatar.vue +20 -6
  317. package/src/components/LpBreadcrumbs.vue +65 -41
  318. package/src/components/LpButton.vue +60 -14
  319. package/src/components/LpChart.vue +351 -28
  320. package/src/components/LpCheckbox.vue +7 -3
  321. package/src/components/LpCodeBlock.vue +50 -14
  322. package/src/components/LpColorPicker.vue +73 -10
  323. package/src/components/LpCommandPalette.vue +115 -20
  324. package/src/components/LpConfirmDialog.vue +68 -17
  325. package/src/components/LpConfirmHost.vue +59 -0
  326. package/src/components/LpContextMenu.vue +15 -116
  327. package/src/components/LpDatePicker.vue +104 -68
  328. package/src/components/LpDateRangePicker.vue +224 -0
  329. package/src/components/LpDrawer.vue +56 -19
  330. package/src/components/LpDropdownMenu.vue +1 -0
  331. package/src/components/LpDropzone.vue +21 -4
  332. package/src/components/LpFieldNotice.vue +65 -0
  333. package/src/components/LpFileTree.vue +33 -7
  334. package/src/components/LpFormField.vue +59 -7
  335. package/src/components/LpIcon.vue +22 -4
  336. package/src/components/LpImageEditor.vue +96 -57
  337. package/src/components/LpInput.vue +62 -11
  338. package/src/components/LpLightbox.vue +140 -29
  339. package/src/components/LpLink.vue +24 -13
  340. package/src/components/LpLogViewer.vue +311 -39
  341. package/src/components/LpMapPicker.vue +36 -13
  342. package/src/components/LpMediaGallery.vue +8 -2
  343. package/src/components/LpModal.vue +54 -28
  344. package/src/components/LpModalNav.vue +5 -2
  345. package/src/components/LpNotificationBell.vue +77 -23
  346. package/src/components/LpNumberField.vue +21 -6
  347. package/src/components/LpNumberFlow.vue +26 -10
  348. package/src/components/LpOtpInput.vue +43 -8
  349. package/src/components/LpPagination.vue +23 -7
  350. package/src/components/LpPasswordInput.vue +4 -1
  351. package/src/components/LpPhoneInput.vue +224 -39
  352. package/src/components/LpPie.vue +102 -20
  353. package/src/components/LpPopover.vue +4 -0
  354. package/src/components/LpProgress.vue +5 -3
  355. package/src/components/LpRadioGroup.vue +9 -2
  356. package/src/components/LpRangeCalendar.vue +365 -0
  357. package/src/components/LpRollingText.vue +3 -0
  358. package/src/components/LpScrollArea.vue +22 -2
  359. package/src/components/LpSegmented.vue +12 -2
  360. package/src/components/LpSelect.vue +0 -0
  361. package/src/components/LpShortcutsDialog.vue +83 -9
  362. package/src/components/LpSidebar.vue +14 -9
  363. package/src/components/LpSidebarNav.vue +17 -5
  364. package/src/components/LpSkeleton.vue +4 -1
  365. package/src/components/LpSlider.vue +7 -1
  366. package/src/components/LpSparkline.vue +11 -3
  367. package/src/components/LpStepper.vue +23 -10
  368. package/src/components/LpSwitch.vue +31 -8
  369. package/src/components/LpTable.vue +668 -90
  370. package/src/components/LpTableFilter.vue +175 -0
  371. package/src/components/LpTableOfContents.vue +50 -32
  372. package/src/components/LpTabs.vue +23 -6
  373. package/src/components/LpTagsInput.vue +364 -0
  374. package/src/components/LpTextarea.vue +44 -6
  375. package/src/components/LpThemeProvider.vue +41 -0
  376. package/src/components/LpThemeSwitcher.vue +76 -33
  377. package/src/components/LpTilt.vue +2 -2
  378. package/src/components/LpTimeField.vue +14 -3
  379. package/src/components/LpToaster.vue +115 -27
  380. package/src/components/LpTooltip.vue +29 -5
  381. package/src/components/LpTooltipProvider.vue +24 -0
  382. package/src/components/LpTopologyCanvas.vue +19 -2
  383. package/src/components/LpUptimeBar.vue +46 -8
  384. package/src/components/chart.ts +82 -8
  385. package/src/components/codeHighlight.ts +111 -15
  386. package/src/components/color.ts +30 -9
  387. package/src/components/commandSearch.ts +6 -0
  388. package/src/components/confirm.ts +58 -0
  389. package/src/components/countries.ts +12 -0
  390. package/src/components/dateRange.ts +134 -0
  391. package/src/components/exportData.ts +228 -0
  392. package/src/components/fileTree.ts +19 -7
  393. package/src/components/imageCrop.ts +107 -0
  394. package/src/components/link.ts +34 -0
  395. package/src/components/logSearch.ts +46 -0
  396. package/src/components/modalDepth.ts +48 -6
  397. package/src/components/otp.ts +16 -0
  398. package/src/components/phone.ts +140 -0
  399. package/src/components/sidebar.ts +7 -1
  400. package/src/components/tableFilter.ts +122 -0
  401. package/src/components/tableSort.ts +37 -0
  402. package/src/components/tags.ts +62 -0
  403. package/src/composables/useField.ts +83 -0
  404. package/src/composables/useFieldNotice.ts +59 -0
  405. package/src/composables/useForm.ts +314 -0
  406. package/src/composables/useFormDraft.ts +25 -20
  407. package/src/composables/useHotkeys.ts +355 -28
  408. package/src/composables/useInputFilter.ts +77 -14
  409. package/src/composables/useInputMask.ts +254 -0
  410. package/src/composables/useLpConfig.ts +87 -0
  411. package/src/composables/usePaintSelect.ts +243 -0
  412. package/src/composables/useRovingFocus.ts +11 -0
  413. package/src/composables/useShift.ts +13 -2
  414. package/src/composables/useTilt.ts +5 -6
  415. package/src/composables/useToast.ts +56 -4
  416. package/src/composables/useZoomPan.ts +6 -6
  417. package/src/iconSubset.d.mts +10 -0
  418. package/src/iconSubset.mjs +51 -0
  419. package/src/icons-all.ts +10 -0
  420. package/src/icons.ts +59 -8
  421. package/src/index.ts +73 -4
  422. package/src/kit-icons.ts +5 -0
  423. package/src/layout/tree.ts +30 -0
  424. package/src/layout/useLayout.ts +68 -18
  425. package/src/nuxt.ts +87 -17
  426. package/src/runtime/config.plugin.ts +14 -0
  427. package/src/runtime/theme.plugin.ts +43 -23
  428. package/src/theme/backdrop.ts +69 -0
  429. package/src/theme/presets.ts +6 -64
  430. package/src/theme/useTheme.ts +206 -100
  431. package/src/tokens/tokens.css +46 -0
  432. package/dist/chunks/LpBreadcrumbs-p4jHe_V-.js +0 -62
  433. package/dist/chunks/LpContextMenu-CwW1QXe_.js +0 -217
  434. package/dist/chunks/LpDatePicker-CwOToxGq.js +0 -164
  435. package/dist/chunks/LpFormField-CazBc2-a.js +0 -62
  436. package/dist/chunks/LpPhoneInput-BDSKVl_z.js +0 -209
  437. package/dist/chunks/LpTextarea-t7F6gv8E.js +0 -47
@@ -0,0 +1,175 @@
1
+ <script lang="ts">
2
+ export interface TableFilterOption {
3
+ value: unknown
4
+ label: string
5
+ /** Rows holding the value; omitted when unknown (a server-backed table). */
6
+ count?: number
7
+ }
8
+
9
+ export interface TableFilterLabels {
10
+ search: string
11
+ all: string
12
+ none: string
13
+ invert: string
14
+ only: string
15
+ onlyShown: string
16
+ addShown: string
17
+ noValues: string
18
+ }
19
+ </script>
20
+
21
+ <script setup lang="ts">
22
+ /*
23
+ * The value filter of one LpTable column, opened from the funnel in its
24
+ * header. Built for columns with many values: a search narrows the LIST
25
+ * without touching what is ticked, "Only" next to a value shows just that one
26
+ * in a click, and after a search the matches can be taken as a whole.
27
+ */
28
+ import { computed, ref } from "vue"
29
+ import LpCheckbox from "./LpCheckbox.vue"
30
+ import LpInput from "./LpInput.vue"
31
+ import LpShift from "./LpShift.vue"
32
+ import { usePaintSelect } from "../composables/usePaintSelect"
33
+ import { hideAllValues, invertHidden, matchesQuery, onlyValues, unhideValues } from "./tableFilter"
34
+
35
+ const props = defineProps<{
36
+ options: TableFilterOption[]
37
+ hidden: ReadonlySet<unknown>
38
+ labels: TableFilterLabels
39
+ }>()
40
+
41
+ const emit = defineEmits<{ (e: "update:hidden", value: Set<unknown>): void }>()
42
+
43
+ /** Past this many values a list is easier searched than scanned. */
44
+ const SEARCH_FROM = 8
45
+
46
+ const query = ref("")
47
+ const values = computed(() => props.options.map((o) => o.value))
48
+ const shown = computed(() => props.options.filter((o) => matchesQuery(o.label, query.value)))
49
+
50
+ function set(next: Set<unknown>) {
51
+ emit("update:hidden", next)
52
+ }
53
+
54
+ function toggle(value: unknown) {
55
+ const next = new Set(props.hidden)
56
+ if (next.has(value)) next.delete(value)
57
+ else next.add(value)
58
+ set(next)
59
+ }
60
+
61
+ const list = ref<HTMLElement | null>(null)
62
+
63
+ /*
64
+ * Press a value's tick and sweep down the list to tick or clear the run, the
65
+ * same way rows of the table are painted. The selection here is the values
66
+ * shown, so painting writes back the complement as the hidden set.
67
+ */
68
+ const byKey = computed(() => new Map(props.options.map((o) => [String(o.value), o.value])))
69
+ const paint = usePaintSelect<unknown>({
70
+ root: list,
71
+ selection: () => values.value.filter((v) => !props.hidden.has(v)),
72
+ set: (shownValues) => {
73
+ const keep = new Set(shownValues)
74
+ set(new Set(values.value.filter((v) => !keep.has(v))))
75
+ },
76
+ resolve: (raw) => (byKey.value.has(raw) ? byKey.value.get(raw) : undefined),
77
+ })
78
+
79
+ /* Up and down walk the ticks, so a long list is not a long run of Tab. */
80
+ function onListKeydown(event: KeyboardEvent) {
81
+ if (event.key !== "ArrowDown" && event.key !== "ArrowUp") return
82
+ const boxes = [...(list.value?.querySelectorAll<HTMLElement>("[role=checkbox]") ?? [])]
83
+ const at = boxes.indexOf(document.activeElement as HTMLElement)
84
+ const next = boxes[at + (event.key === "ArrowDown" ? 1 : -1)]
85
+ if (!next) return
86
+ event.preventDefault()
87
+ next.focus()
88
+ }
89
+
90
+ const action =
91
+ "rounded-control px-1.5 py-0.5 text-xs font-medium text-muted outline-none transition-colors duration-fast hover:bg-surface-soft hover:text-ink focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40"
92
+ </script>
93
+
94
+ <template>
95
+ <div class="flex flex-col gap-2">
96
+ <LpInput
97
+ v-if="options.length >= SEARCH_FROM"
98
+ v-model="query"
99
+ size="sm"
100
+ icon="lucide:search"
101
+ :placeholder="labels.search"
102
+ :aria-label="labels.search"
103
+ />
104
+
105
+ <div class="flex flex-wrap items-center gap-1">
106
+ <template v-if="query">
107
+ <button
108
+ type="button"
109
+ :class="action"
110
+ :disabled="!shown.length"
111
+ @click="set(onlyValues(values, shown.map((o) => o.value)))"
112
+ >
113
+ {{ labels.onlyShown.replace("{count}", String(shown.length)) }}
114
+ </button>
115
+ <button
116
+ type="button"
117
+ :class="action"
118
+ :disabled="!shown.length"
119
+ @click="set(unhideValues(hidden, shown.map((o) => o.value)))"
120
+ >
121
+ {{ labels.addShown.replace("{count}", String(shown.length)) }}
122
+ </button>
123
+ </template>
124
+ <template v-else>
125
+ <button type="button" :class="action" :disabled="!hidden.size" @click="set(new Set())">
126
+ {{ labels.all }}
127
+ </button>
128
+ <button
129
+ type="button"
130
+ :class="action"
131
+ :disabled="hidden.size === options.length"
132
+ @click="set(hideAllValues(values))"
133
+ >
134
+ {{ labels.none }}
135
+ </button>
136
+ <button type="button" :class="action" @click="set(invertHidden(values, hidden))">
137
+ {{ labels.invert }}
138
+ </button>
139
+ </template>
140
+ </div>
141
+
142
+ <LpShift>
143
+ <div
144
+ ref="list"
145
+ class="-mx-1 flex max-h-64 flex-col overflow-y-auto overscroll-contain"
146
+ @keydown="onListKeydown"
147
+ >
148
+ <div
149
+ v-for="option in shown"
150
+ :key="String(option.value)"
151
+ class="group/opt flex items-center gap-2 rounded-control px-1.5 py-1 transition-colors duration-fast select-none hover:bg-surface-soft"
152
+ :data-paint-key="String(option.value)"
153
+ >
154
+ <LpCheckbox
155
+ :model-value="!hidden.has(option.value)"
156
+ class="min-w-0 flex-1"
157
+ @pointerdown="paint.onPointerDown($event, option.value)"
158
+ @update:model-value="toggle(option.value)"
159
+ >
160
+ <span class="truncate">{{ option.label }}</span>
161
+ </LpCheckbox>
162
+ <span v-if="option.count !== undefined" class="text-xs text-muted tabular-nums">{{ option.count }}</span>
163
+ <button
164
+ type="button"
165
+ class="rounded-control px-1.5 py-0.5 text-xs font-medium text-brand opacity-0 outline-none transition-opacity duration-fast group-hover/opt:opacity-100 hover:bg-brand-soft focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-ring"
166
+ @click="set(onlyValues(values, [option.value]))"
167
+ >
168
+ {{ labels.only }}
169
+ </button>
170
+ </div>
171
+ <p v-if="!shown.length" class="px-1.5 py-2 text-xs text-muted">{{ labels.noValues }}</p>
172
+ </div>
173
+ </LpShift>
174
+ </div>
175
+ </template>
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import { Motion } from "motion-v"
13
13
  import { computed, onBeforeUnmount, onMounted, ref, useId, watch } from "vue"
14
+ import { useLabels } from "../composables/useLpConfig"
14
15
  import { usePillTransition } from "../composables/usePillTransition"
15
16
 
16
17
  export interface TocLink {
@@ -23,14 +24,29 @@ export interface TocLink {
23
24
  const props = withDefaults(
24
25
  defineProps<{
25
26
  links: TocLink[]
26
- /** Heading shown above the list. */
27
+ /** Heading shown above the list (defaults to the `title` label). */
27
28
  title?: string
28
29
  /** px offset from the top used as the scroll-spy trigger line. */
29
30
  offset?: number
31
+ labels?: Partial<{ title: string }>
30
32
  }>(),
31
- { title: "On this page", offset: 96 },
33
+ { offset: 96 },
32
34
  )
33
35
 
36
+ const text = useLabels("toc", { title: "On this page" }, () => props.labels)
37
+ const heading = computed(() => props.title ?? text.value.title)
38
+
39
+ // Every level of the tree as one ordered list; depth drives the indent, so
40
+ // links nested deeper than two levels render instead of vanishing.
41
+ interface TocRow {
42
+ link: TocLink
43
+ depth: number
44
+ }
45
+ function flatten(links: TocLink[], depth = 0): TocRow[] {
46
+ return links.flatMap((link) => [{ link, depth }, ...flatten(link.children ?? [], depth + 1)])
47
+ }
48
+ const rows = computed(() => flatten(props.links))
49
+
34
50
  const activeId = ref<string>("")
35
51
  // The id the pointer is hovering (null when not hovering). The indicator bar
36
52
  // follows the hovered link, falling back to the scroll-spy active one — same
@@ -97,13 +113,28 @@ function unfreeze() {
97
113
  safetyTimer = null
98
114
  }
99
115
 
100
- function suppressSpyUntilScrollEnds() {
116
+ /*
117
+ * The element that actually scrolls to the heading. Inside an app shell that is
118
+ * a scroll region, not the window, and watching window.scrollY there saw no
119
+ * movement and unfroze on the first frame.
120
+ */
121
+ function scrollerOf(el: HTMLElement): HTMLElement | null {
122
+ for (let node = el.parentElement; node; node = node.parentElement) {
123
+ const { overflowY } = getComputedStyle(node)
124
+ if (/(auto|scroll|overlay)/.test(overflowY) && node.scrollHeight > node.clientHeight) return node
125
+ }
126
+ return null
127
+ }
128
+
129
+ function suppressSpyUntilScrollEnds(target: HTMLElement) {
101
130
  spySuppressed = true
102
131
  if (rafId != null) cancelAnimationFrame(rafId)
103
132
  if (safetyTimer != null) clearTimeout(safetyTimer)
104
- let last = window.scrollY
133
+ const scroller = scrollerOf(target)
134
+ const position = () => (scroller ? scroller.scrollTop : window.scrollY)
135
+ let last = position()
105
136
  const tick = () => {
106
- const y = window.scrollY
137
+ const y = position()
107
138
  if (y === last) {
108
139
  unfreeze() // position held for a frame → scrolling has come to rest
109
140
  return
@@ -122,9 +153,11 @@ function onClick(id: string, ev: MouseEvent) {
122
153
  if (!el) return
123
154
  ev.preventDefault()
124
155
  activeId.value = id // mark immediately so the bar jumps to the clicked item
125
- suppressSpyUntilScrollEnds()
156
+ suppressSpyUntilScrollEnds(el)
126
157
  el.scrollIntoView({ behavior: "smooth", block: "start" })
127
- history.replaceState(null, "", `#${id}`)
158
+ // Keep the router's own state: replacing it with null broke scroll
159
+ // restoration and back/forward bookkeeping in vue-router apps.
160
+ history.replaceState(history.state, "", `#${id}`)
128
161
  }
129
162
 
130
163
  onMounted(setup)
@@ -136,16 +169,21 @@ onBeforeUnmount(() => {
136
169
  </script>
137
170
 
138
171
  <template>
139
- <nav :aria-label="title" class="text-sm">
172
+ <nav :aria-label="heading" class="text-sm">
140
173
  <p class="mb-2.5 text-[11px] font-semibold uppercase tracking-[0.08em] text-muted">
141
- {{ title }}
174
+ {{ heading }}
142
175
  </p>
143
176
  <ul class="relative flex flex-col gap-0.5 border-l border-line" @mouseleave="hoveredId = null">
144
- <li v-for="link in links" :key="link.id" class="flex flex-col">
177
+ <li v-for="{ link, depth } in rows" :key="link.id" class="flex flex-col">
145
178
  <a
146
179
  :href="`#${link.id}`"
147
- class="relative -ml-px block py-1 pl-3.5 leading-snug transition-colors duration-[var(--duration-fast)]"
148
- :class="litId === link.id ? 'text-brand' : 'text-muted hover:text-ink'"
180
+ class="relative -ml-px block py-1 leading-snug transition-colors duration-[var(--duration-fast)]"
181
+ :class="[
182
+ depth > 0 ? 'text-[13px]' : '',
183
+ litId === link.id ? 'text-brand' : 'text-muted hover:text-ink',
184
+ ]"
185
+ :style="{ paddingLeft: `${0.875 + depth * 0.875}rem` }"
186
+ :aria-current="activeId === link.id ? 'location' : undefined"
149
187
  @click="onClick(link.id, $event)"
150
188
  @mouseenter="hoveredId = link.id"
151
189
  >
@@ -157,26 +195,6 @@ onBeforeUnmount(() => {
157
195
  />
158
196
  {{ link.text }}
159
197
  </a>
160
-
161
- <ul v-if="link.children?.length" class="flex flex-col gap-0.5">
162
- <li v-for="child in link.children" :key="child.id">
163
- <a
164
- :href="`#${child.id}`"
165
- class="relative -ml-px block py-1 pl-7 text-[13px] leading-snug transition-colors duration-[var(--duration-fast)]"
166
- :class="litId === child.id ? 'text-brand' : 'text-muted hover:text-ink'"
167
- @click="onClick(child.id, $event)"
168
- @mouseenter="hoveredId = child.id"
169
- >
170
- <Motion
171
- v-if="litId === child.id"
172
- :layout-id="pillId"
173
- :transition="pillTransition"
174
- class="absolute -left-px top-0 h-full w-0.5 rounded-full bg-brand"
175
- />
176
- {{ child.text }}
177
- </a>
178
- </li>
179
- </ul>
180
198
  </li>
181
199
  </ul>
182
200
  </nav>
@@ -1,7 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  import { Motion, useReducedMotion } from "motion-v"
3
3
  import { TabsContent, TabsList, TabsRoot, TabsTrigger } from "reka-ui"
4
- import { computed, ref, useId } from "vue"
4
+ import { computed, ref, useId, watch } from "vue"
5
5
  import { usePillTransition } from "../composables/usePillTransition"
6
6
  import LpIcon from "./LpIcon.vue"
7
7
 
@@ -12,9 +12,11 @@ export interface TabItem {
12
12
  icon?: string
13
13
  }
14
14
 
15
- withDefaults(
15
+ const props = withDefaults(
16
16
  defineProps<{
17
17
  modelValue?: string
18
+ /** Initially active tab when `v-model` is not bound (default: the first). */
19
+ defaultValue?: string
18
20
  items: TabItem[]
19
21
  /**
20
22
  * "contained" (default) wraps the triggers in a bordered, filled bar.
@@ -31,7 +33,22 @@ withDefaults(
31
33
  }>(),
32
34
  { variant: "contained", accent: false, block: false },
33
35
  )
34
- defineEmits<{ (e: "update:modelValue", value: string): void }>()
36
+ const emit = defineEmits<{ (e: "update:modelValue", value: string): void }>()
37
+
38
+ // Held here rather than left to reka, so the active marker follows the active
39
+ // tab in uncontrolled use too: reading the prop alone left it unmarked.
40
+ const current = ref(props.modelValue ?? props.defaultValue ?? props.items[0]?.value)
41
+ watch(
42
+ () => props.modelValue,
43
+ (value) => {
44
+ if (value !== undefined) current.value = value
45
+ },
46
+ )
47
+
48
+ function select(value: string) {
49
+ if (props.modelValue === undefined) current.value = value
50
+ emit("update:modelValue", value)
51
+ }
35
52
 
36
53
  // The pill sits under the hovered tab, falling back to the active one
37
54
  // (UAProject header behaviour). motion-v shared layoutId animates the move.
@@ -80,8 +97,8 @@ function releaseFocusAfterPointer(event: PointerEvent) {
80
97
 
81
98
  <template>
82
99
  <TabsRoot
83
- :model-value="modelValue"
84
- @update:model-value="(v) => $emit('update:modelValue', v as string)"
100
+ :model-value="current"
101
+ @update:model-value="(v) => select(v as string)"
85
102
  >
86
103
  <TabsList
87
104
  class="gap-1"
@@ -109,7 +126,7 @@ function releaseFocusAfterPointer(event: PointerEvent) {
109
126
  <!-- Active marker: a bottom bar in "underline", a filled pill otherwise.
110
127
  Both slide between tabs via the shared motion layoutId. -->
111
128
  <Motion
112
- v-if="pillUnder(item.value, modelValue)"
129
+ v-if="pillUnder(item.value, current)"
113
130
  :layout-id="pillId"
114
131
  :transition="pillTransition"
115
132
  :class="variant === 'underline'