@leavepulse/ui 0.31.1 → 0.33.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 (159) hide show
  1. package/dist/assets/{LpDropzone-DVDC-ABU.css → LpDropzone-BBoWvi-J.css} +12 -12
  2. package/dist/assets/{LpImageEditor-DqP5JKCy.css → LpImageEditor-BsSwej47.css} +6 -6
  3. package/dist/chunks/{LpAddressInput-BDkp3-Bp.js → LpAddressInput-C35TsJXt.js} +19 -14
  4. package/dist/chunks/{LpAppShell-Chz8Vbtu.js → LpAppShell-lVvpENMH.js} +18 -13
  5. package/dist/chunks/{LpBreadcrumbs-5uvViCXi.js → LpBreadcrumbs-p4jHe_V-.js} +9 -7
  6. package/dist/chunks/{LpCalendar-B7ZL0ty3.js → LpCalendar-B7Ko5RdR.js} +12 -7
  7. package/dist/chunks/{LpCard-D0M2ZCnB.js → LpCard-1SeUYPBT.js} +36 -9
  8. package/dist/chunks/{LpCheckbox-BO0zuuPh.js → LpCheckbox-CVccKYaH.js} +9 -4
  9. package/dist/chunks/{LpCodeBlock-BWX1KZwk.js → LpCodeBlock-Bo0B4TFR.js} +37 -32
  10. package/dist/chunks/{LpDatePicker-dY2q4dr4.js → LpDatePicker-6JFXllj5.js} +1 -1
  11. package/dist/chunks/{LpDisclosure-B4kVAWfg.js → LpDisclosure-y7wDBgLa.js} +11 -6
  12. package/dist/chunks/{LpEmptyState-BV3q7Qyi.js → LpEmptyState-Dsdqz1Wj.js} +13 -5
  13. package/dist/chunks/{LpFileTree-DfFqY__1.js → LpFileTree-C-NFRT0H.js} +19 -14
  14. package/dist/chunks/{LpFileTreeNode-COchUMNn.js → LpFileTreeNode-DNJUJiiB.js} +13 -6
  15. package/dist/chunks/{LpFormField-fV_2ZdCk.js → LpFormField-CazBc2-a.js} +14 -9
  16. package/dist/chunks/{LpInput-Bt4J71xn.js → LpInput-9EXWUM9B.js} +1 -1
  17. package/dist/chunks/{LpLightbox-Ci35Y_xP.js → LpLightbox-oLqyjOln.js} +30 -7
  18. package/dist/chunks/{LpLink-BHZ1CLlF.js → LpLink-DCND-zyu.js} +16 -9
  19. package/dist/chunks/{LpLogViewer-TSRyt3t9.js → LpLogViewer-y53ZqSVq.js} +20 -10
  20. package/dist/chunks/{LpMapPicker-CXvoTrAe.js → LpMapPicker-ul4oYno6.js} +14 -9
  21. package/dist/chunks/LpMediaGallery-Cid7PGYx.js +214 -0
  22. package/dist/chunks/{LpNotificationBell-gdvQY89m.js → LpNotificationBell-lHePf89W.js} +1 -1
  23. package/dist/chunks/{LpNumberField-NPE8Bumx.js → LpNumberField-CWuX08iX.js} +12 -5
  24. package/dist/chunks/{LpOtpInput-DqaT0Z75.js → LpOtpInput-y2v-pmiN.js} +11 -6
  25. package/dist/chunks/{LpPagination-CeGuNe_q.js → LpPagination-5FxjmmB5.js} +21 -19
  26. package/dist/chunks/{LpPasswordInput-BqMAc5HA.js → LpPasswordInput--sjYCkLS.js} +1 -1
  27. package/dist/chunks/{LpPhoneInput-NXXjciJJ.js → LpPhoneInput-BDSKVl_z.js} +16 -9
  28. package/dist/chunks/{LpPie-BL1vTDSM.js → LpPie-c2-q4DJu.js} +14 -8
  29. package/dist/chunks/{LpRadio-CL-pI0_O.js → LpRadio-B5AfqTpZ.js} +13 -5
  30. package/dist/chunks/{LpRadioGroup-B4yDTmi6.js → LpRadioGroup-xPIuVDO_.js} +12 -5
  31. package/dist/chunks/{LpSegmented-BmpanyAo.js → LpSegmented-fV0Sk92p.js} +16 -6
  32. package/dist/chunks/{LpSidebar-BiWM_lDB.js → LpSidebar-DcYavim2.js} +2 -2
  33. package/dist/chunks/{LpSidebarNav-CsgeuGAu.js → LpSidebarNav-CqwvT4H8.js} +21 -16
  34. package/dist/chunks/{LpSlider-B1SF3pRV.js → LpSlider-BwNIBkAK.js} +12 -5
  35. package/dist/chunks/{LpStat-CDanpzU0.js → LpStat-CQaW8R--.js} +23 -18
  36. package/dist/chunks/{LpStepper-Wtl-6nUh.js → LpStepper-Bk-XaQYU.js} +15 -10
  37. package/dist/chunks/{LpSwitch-v6fnccSM.js → LpSwitch-xgnRU2k0.js} +12 -5
  38. package/dist/chunks/{LpTextarea-BMIOfw5l.js → LpTextarea-t7F6gv8E.js} +1 -1
  39. package/dist/chunks/{LpUptimeBar-DcQ8HikG.js → LpUptimeBar-DvAMno0S.js} +26 -21
  40. package/dist/component-names.d.ts +1 -1
  41. package/dist/components/LpAddressInput.vue.d.ts +34 -17
  42. package/dist/components/LpAddressInput.vue.js +1 -1
  43. package/dist/components/LpAppShell.vue.d.ts +65 -31
  44. package/dist/components/LpAppShell.vue.js +1 -1
  45. package/dist/components/LpBreadcrumbs.vue.d.ts +12 -6
  46. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  47. package/dist/components/LpCalendar.vue.d.ts +15 -6
  48. package/dist/components/LpCalendar.vue.js +1 -1
  49. package/dist/components/LpCard.vue.d.ts +26 -0
  50. package/dist/components/LpCard.vue.js +1 -1
  51. package/dist/components/LpChart.vue.d.ts +54 -12
  52. package/dist/components/LpChart.vue.js +15 -9
  53. package/dist/components/LpCheckbox.vue.d.ts +16 -12
  54. package/dist/components/LpCheckbox.vue.js +1 -1
  55. package/dist/components/LpCodeBlock.vue.d.ts +25 -6
  56. package/dist/components/LpCodeBlock.vue.js +1 -1
  57. package/dist/components/LpDatePicker.vue.js +1 -1
  58. package/dist/components/LpDisclosure.vue.d.ts +24 -14
  59. package/dist/components/LpDisclosure.vue.js +1 -1
  60. package/dist/components/LpDropzone.vue.d.ts +38 -14
  61. package/dist/components/LpDropzone.vue.js +17 -11
  62. package/dist/components/LpEmptyState.vue.d.ts +15 -10
  63. package/dist/components/LpEmptyState.vue.js +1 -1
  64. package/dist/components/LpFileTree.vue.d.ts +51 -31
  65. package/dist/components/LpFileTree.vue.js +1 -1
  66. package/dist/components/LpFileTreeNode.vue.d.ts +31 -16
  67. package/dist/components/LpFileTreeNode.vue.js +1 -1
  68. package/dist/components/LpFormField.vue.d.ts +14 -13
  69. package/dist/components/LpFormField.vue.js +1 -1
  70. package/dist/components/LpImageEditor.vue.d.ts +33 -10
  71. package/dist/components/LpImageEditor.vue.js +13 -7
  72. package/dist/components/LpInput.vue.js +1 -1
  73. package/dist/components/LpLightbox.vue.js +1 -1
  74. package/dist/components/LpLink.vue.d.ts +46 -11
  75. package/dist/components/LpLink.vue.js +1 -1
  76. package/dist/components/LpLogViewer.vue.d.ts +63 -6
  77. package/dist/components/LpLogViewer.vue.js +1 -1
  78. package/dist/components/LpMapPicker.vue.d.ts +25 -10
  79. package/dist/components/LpMapPicker.vue.js +1 -1
  80. package/dist/components/LpMediaGallery.vue.d.ts +80 -0
  81. package/dist/components/LpMediaGallery.vue.js +4 -0
  82. package/dist/components/LpNotificationBell.vue.js +1 -1
  83. package/dist/components/LpNumberField.vue.d.ts +12 -6
  84. package/dist/components/LpNumberField.vue.js +1 -1
  85. package/dist/components/LpOtpInput.vue.d.ts +18 -6
  86. package/dist/components/LpOtpInput.vue.js +1 -1
  87. package/dist/components/LpPagination.vue.d.ts +16 -6
  88. package/dist/components/LpPagination.vue.js +1 -1
  89. package/dist/components/LpPasswordInput.vue.js +1 -1
  90. package/dist/components/LpPhoneInput.vue.d.ts +18 -6
  91. package/dist/components/LpPhoneInput.vue.js +1 -1
  92. package/dist/components/LpPie.vue.d.ts +96 -34
  93. package/dist/components/LpPie.vue.js +1 -1
  94. package/dist/components/LpRadio.vue.d.ts +10 -10
  95. package/dist/components/LpRadio.vue.js +1 -1
  96. package/dist/components/LpRadioGroup.vue.d.ts +12 -12
  97. package/dist/components/LpRadioGroup.vue.js +1 -1
  98. package/dist/components/LpSegmented.vue.d.ts +12 -6
  99. package/dist/components/LpSegmented.vue.js +1 -1
  100. package/dist/components/LpSidebar.vue.js +1 -1
  101. package/dist/components/LpSidebarNav.vue.d.ts +28 -17
  102. package/dist/components/LpSidebarNav.vue.js +1 -1
  103. package/dist/components/LpSlider.vue.d.ts +13 -6
  104. package/dist/components/LpSlider.vue.js +1 -1
  105. package/dist/components/LpStat.vue.d.ts +35 -11
  106. package/dist/components/LpStat.vue.js +1 -1
  107. package/dist/components/LpStepper.vue.d.ts +17 -5
  108. package/dist/components/LpStepper.vue.js +1 -1
  109. package/dist/components/LpSwitch.vue.d.ts +8 -6
  110. package/dist/components/LpSwitch.vue.js +1 -1
  111. package/dist/components/LpTable.vue.js +1 -1
  112. package/dist/components/LpTextarea.vue.js +1 -1
  113. package/dist/components/LpUptimeBar.vue.d.ts +21 -5
  114. package/dist/components/LpUptimeBar.vue.js +1 -1
  115. package/dist/components/lightbox.d.ts +10 -0
  116. package/dist/composables/useMergedClass.d.ts +20 -0
  117. package/dist/composables/useMergedClass.js +11 -0
  118. package/dist/index.d.ts +2 -0
  119. package/dist/index.js +95 -89
  120. package/package.json +1 -3
  121. package/src/component-names.ts +1 -0
  122. package/src/components/LpAddressInput.vue +16 -1
  123. package/src/components/LpAppShell.vue +16 -1
  124. package/src/components/LpBreadcrumbs.vue +16 -1
  125. package/src/components/LpCalendar.vue +15 -1
  126. package/src/components/LpCard.vue +50 -5
  127. package/src/components/LpChart.vue +16 -1
  128. package/src/components/LpCheckbox.vue +16 -1
  129. package/src/components/LpCodeBlock.vue +16 -1
  130. package/src/components/LpDisclosure.vue +15 -1
  131. package/src/components/LpDropzone.vue +21 -6
  132. package/src/components/LpEmptyState.vue +21 -3
  133. package/src/components/LpFileTree.vue +16 -1
  134. package/src/components/LpFileTreeNode.vue +15 -1
  135. package/src/components/LpFormField.vue +16 -1
  136. package/src/components/LpImageEditor.vue +16 -1
  137. package/src/components/LpLightbox.vue +68 -3
  138. package/src/components/LpLink.vue +25 -9
  139. package/src/components/LpLogViewer.vue +20 -2
  140. package/src/components/LpMapPicker.vue +15 -1
  141. package/src/components/LpMediaGallery.vue +365 -0
  142. package/src/components/LpNumberField.vue +15 -1
  143. package/src/components/LpOtpInput.vue +15 -1
  144. package/src/components/LpPagination.vue +16 -1
  145. package/src/components/LpPhoneInput.vue +23 -8
  146. package/src/components/LpPie.vue +16 -1
  147. package/src/components/LpRadio.vue +20 -3
  148. package/src/components/LpRadioGroup.vue +15 -1
  149. package/src/components/LpSegmented.vue +21 -2
  150. package/src/components/LpSidebarNav.vue +16 -1
  151. package/src/components/LpSlider.vue +15 -1
  152. package/src/components/LpStat.vue +16 -1
  153. package/src/components/LpStepper.vue +16 -1
  154. package/src/components/LpSwitch.vue +15 -1
  155. package/src/components/LpUptimeBar.vue +16 -1
  156. package/src/components/lightbox.ts +10 -0
  157. package/src/composables/useMergedClass.ts +30 -0
  158. package/src/index.ts +2 -0
  159. package/src/tokens/tokens.css +29 -0
package/dist/index.js CHANGED
@@ -1,90 +1,92 @@
1
1
  import { _ } from "./chunks/LayoutCanvas-Dd20boUG.js";
2
- import { _ as _2 } from "./chunks/LpAddressInput-BDkp3-Bp.js";
3
- import { _ as _3 } from "./chunks/LpMapPicker-CXvoTrAe.js";
2
+ import { _ as _2 } from "./chunks/LpAddressInput-C35TsJXt.js";
3
+ import { _ as _3 } from "./chunks/LpMapPicker-ul4oYno6.js";
4
4
  import { OSM_TILES, createNominatimProvider, emptyAddress, formatAddress, project, tileUrl, unproject } from "./components/address.js";
5
5
  import { _ as _4 } from "./chunks/LpActionBar-BlvtGB2P.js";
6
6
  import { _ as _5 } from "./chunks/LpAlert-BAYHDSS1.js";
7
- import { _ as _6 } from "./chunks/LpAppShell-Chz8Vbtu.js";
7
+ import { _ as _6 } from "./chunks/LpAppShell-lVvpENMH.js";
8
8
  import { _ as _7 } from "./chunks/LpAutocomplete-DExlIZe_.js";
9
9
  import { _ as _8 } from "./chunks/LpAvatar-D3l4nabg.js";
10
10
  import { _ as _9 } from "./chunks/LpBadge-Fe0D1bYx.js";
11
- import { _ as _10 } from "./chunks/LpBreadcrumbs-5uvViCXi.js";
11
+ import { _ as _10 } from "./chunks/LpBreadcrumbs-p4jHe_V-.js";
12
12
  import { _ as _11 } from "./chunks/LpButton-5VXXCjwF.js";
13
- import { _ as _12 } from "./chunks/LpCalendar-B7ZL0ty3.js";
14
- import { _ as _13 } from "./chunks/LpCard-D0M2ZCnB.js";
13
+ import { _ as _12 } from "./chunks/LpCalendar-B7Ko5RdR.js";
14
+ import { _ as _13 } from "./chunks/LpCard-1SeUYPBT.js";
15
15
  import { default as default2 } from "./components/LpChart.vue.js";
16
16
  import { CHART_PALETTE, axisTicks, formatTick, niceScale, resolveSlices } from "./components/chart.js";
17
- import { _ as _14 } from "./chunks/LpCheckbox-BO0zuuPh.js";
18
- import { _ as _15 } from "./chunks/LpCodeBlock-BWX1KZwk.js";
17
+ import { _ as _14 } from "./chunks/LpCheckbox-CVccKYaH.js";
18
+ import { _ as _15 } from "./chunks/LpCodeBlock-Bo0B4TFR.js";
19
19
  import { _ as _16 } from "./chunks/LpColorPicker-CFC6iaNK.js";
20
20
  import { DEFAULT_SWATCHES, clampHsv, formatColor, hsvToHsl, hsvToRgb, isLight, normalizeHue, opaqueCss, parseColor, parseHex, rgbToHex, rgbToHsv } from "./components/color.js";
21
21
  import { default as default3 } from "./components/LpCommandPalette.vue.js";
22
22
  import { _ as _17 } from "./chunks/LpConfirmDialog-CjOGcj1e.js";
23
23
  import { _ as _18 } from "./chunks/LpContextMenu-B6WBLleS.js";
24
- import { _ as _19 } from "./chunks/LpDatePicker-dY2q4dr4.js";
25
- import { _ as _20 } from "./chunks/LpDisclosure-B4kVAWfg.js";
24
+ import { _ as _19 } from "./chunks/LpDatePicker-6JFXllj5.js";
25
+ import { _ as _20 } from "./chunks/LpDisclosure-y7wDBgLa.js";
26
26
  import { _ as _21 } from "./chunks/LpDivider-CUX46KR0.js";
27
27
  import { _ as _22 } from "./chunks/LpDrawer-DAJN5rGK.js";
28
28
  import { _ as _23 } from "./chunks/LpDropdownMenu-DJpoqRCb.js";
29
29
  import { default as default4 } from "./components/LpDropzone.vue.js";
30
- import { _ as _24 } from "./chunks/LpEmptyState-BV3q7Qyi.js";
31
- import { _ as _25 } from "./chunks/LpFileTree-DfFqY__1.js";
30
+ import { _ as _24 } from "./chunks/LpEmptyState-Dsdqz1Wj.js";
31
+ import { _ as _25 } from "./chunks/LpFileTree-C-NFRT0H.js";
32
32
  import { ancestorIds, checkStateOf, checkedCount, computeStats, fileIcon, formatModified, formatSize, sortNodes, subtreeIds, subtreeSize } from "./components/fileTree.js";
33
- import { _ as _26 } from "./chunks/LpFormField-fV_2ZdCk.js";
33
+ import { _ as _26 } from "./chunks/LpFormField-CazBc2-a.js";
34
34
  import { _ as _27 } from "./chunks/LpIcon-CCnX5_2j.js";
35
35
  import { default as default5 } from "./components/LpImageEditor.vue.js";
36
36
  import { _ as _28 } from "./chunks/LpInfraNode-Ds_8SZgN.js";
37
- import { _ as _29 } from "./chunks/LpInput-Bt4J71xn.js";
38
- import { _ as _30 } from "./chunks/LpLightbox-Ci35Y_xP.js";
37
+ import { _ as _29 } from "./chunks/LpInput-9EXWUM9B.js";
38
+ import { _ as _30 } from "./chunks/LpLightbox-oLqyjOln.js";
39
39
  import { fileNameOf } from "./components/lightbox.js";
40
- import { _ as _31 } from "./chunks/LpLink-BHZ1CLlF.js";
41
- import { _ as _32 } from "./chunks/LpLogViewer-TSRyt3t9.js";
42
- import { _ as _33 } from "./chunks/LpModal-D_o-56To.js";
43
- import { _ as _34 } from "./chunks/LpNotificationBell-gdvQY89m.js";
44
- import { _ as _35 } from "./chunks/LpNumberField-NPE8Bumx.js";
45
- import { _ as _36 } from "./chunks/LpNumberFlow-amWYaeuA.js";
46
- import { _ as _37 } from "./chunks/LpOtpInput-DqaT0Z75.js";
47
- import { _ as _38 } from "./chunks/LpPagination-CeGuNe_q.js";
48
- import { _ as _39 } from "./chunks/LpPasswordInput-BqMAc5HA.js";
49
- import { _ as _40 } from "./chunks/LpPie-BL1vTDSM.js";
50
- import { _ as _41 } from "./chunks/LpPhoneInput-NXXjciJJ.js";
40
+ import { _ as _31 } from "./chunks/LpLink-DCND-zyu.js";
41
+ import { _ as _32 } from "./chunks/LpLogViewer-y53ZqSVq.js";
42
+ import { _ as _33 } from "./chunks/LpMediaGallery-Cid7PGYx.js";
43
+ import { _ as _34 } from "./chunks/LpModal-D_o-56To.js";
44
+ import { _ as _35 } from "./chunks/LpNotificationBell-lHePf89W.js";
45
+ import { _ as _36 } from "./chunks/LpNumberField-CWuX08iX.js";
46
+ import { _ as _37 } from "./chunks/LpNumberFlow-amWYaeuA.js";
47
+ import { _ as _38 } from "./chunks/LpOtpInput-y2v-pmiN.js";
48
+ import { _ as _39 } from "./chunks/LpPagination-5FxjmmB5.js";
49
+ import { _ as _40 } from "./chunks/LpPasswordInput--sjYCkLS.js";
50
+ import { _ as _41 } from "./chunks/LpPie-c2-q4DJu.js";
51
+ import { _ as _42 } from "./chunks/LpPhoneInput-BDSKVl_z.js";
51
52
  import { flagEmoji, loadCountries, matchCountryByValue } from "./components/countries.js";
52
- import { _ as _42 } from "./chunks/LpPopover-8268UmlC.js";
53
- import { _ as _43 } from "./chunks/LpProgress-Btq5W4Ut.js";
54
- import { _ as _44 } from "./chunks/LpRadio-CL-pI0_O.js";
55
- import { _ as _45 } from "./chunks/LpRadioGroup-B4yDTmi6.js";
56
- import { _ as _46 } from "./chunks/LpRollingText-CM5gkSeF.js";
57
- import { _ as _47 } from "./chunks/LpScrollArea-D8xyKXcF.js";
58
- import { _ as _48 } from "./chunks/LpSegmented-BmpanyAo.js";
59
- import { _ as _49 } from "./chunks/LpSection-aM6J_u51.js";
60
- import { _ as _50 } from "./chunks/LpSelect-ANIVtrpM.js";
61
- import { _ as _51 } from "./chunks/LpServiceNode-D8uJ8sGk.js";
62
- import { _ as _52 } from "./chunks/LpShift-DXNsauQZ.js";
53
+ import { _ as _43 } from "./chunks/LpPopover-8268UmlC.js";
54
+ import { _ as _44 } from "./chunks/LpProgress-Btq5W4Ut.js";
55
+ import { _ as _45 } from "./chunks/LpRadio-B5AfqTpZ.js";
56
+ import { _ as _46 } from "./chunks/LpRadioGroup-xPIuVDO_.js";
57
+ import { _ as _47 } from "./chunks/LpRollingText-CM5gkSeF.js";
58
+ import { _ as _48 } from "./chunks/LpScrollArea-D8xyKXcF.js";
59
+ import { _ as _49 } from "./chunks/LpSegmented-fV0Sk92p.js";
60
+ import { _ as _50 } from "./chunks/LpSection-aM6J_u51.js";
61
+ import { _ as _51 } from "./chunks/LpSelect-ANIVtrpM.js";
62
+ import { _ as _52 } from "./chunks/LpServiceNode-D8uJ8sGk.js";
63
+ import { _ as _53 } from "./chunks/LpShift-DXNsauQZ.js";
63
64
  import { default as default6 } from "./components/LpShortcutsDialog.vue.js";
64
- import { _ as _53 } from "./chunks/LpSidebar-BiWM_lDB.js";
65
- import { _ as _54 } from "./chunks/LpSkeleton-CTI-vBgW.js";
66
- import { _ as _55 } from "./chunks/LpSlider-B1SF3pRV.js";
67
- import { _ as _56 } from "./chunks/LpSparkline-C6xQ2dwv.js";
68
- import { _ as _57 } from "./chunks/LpStat-CDanpzU0.js";
69
- import { _ as _58 } from "./chunks/LpStepper-Wtl-6nUh.js";
70
- import { _ as _59 } from "./chunks/LpSwitch-v6fnccSM.js";
65
+ import { _ as _54 } from "./chunks/LpSidebar-DcYavim2.js";
66
+ import { _ as _55 } from "./chunks/LpSkeleton-CTI-vBgW.js";
67
+ import { _ as _56 } from "./chunks/LpSlider-BwNIBkAK.js";
68
+ import { _ as _57 } from "./chunks/LpSparkline-C6xQ2dwv.js";
69
+ import { _ as _58 } from "./chunks/LpStat-CQaW8R--.js";
70
+ import { _ as _59 } from "./chunks/LpStepper-Bk-XaQYU.js";
71
+ import { _ as _60 } from "./chunks/LpSwitch-xgnRU2k0.js";
71
72
  import { default as default7 } from "./components/LpTable.vue.js";
72
- import { _ as _60 } from "./chunks/LpTableOfContents-CjvxPMpU.js";
73
- import { _ as _61 } from "./chunks/LpTabs-Cefe_lys.js";
74
- import { _ as _62 } from "./chunks/LpTextarea-BMIOfw5l.js";
73
+ import { _ as _61 } from "./chunks/LpTableOfContents-CjvxPMpU.js";
74
+ import { _ as _62 } from "./chunks/LpTabs-Cefe_lys.js";
75
+ import { _ as _63 } from "./chunks/LpTextarea-t7F6gv8E.js";
75
76
  import { p as presets, a as parseTheme, s as serializeTheme } from "./chunks/LpThemeSwitcher-r1te9nB2.js";
76
- import { D, _ as _63, N, T, b, c, d, e, f, g, i, l, h, j, n, r, t, k, m, u, v } from "./chunks/LpThemeSwitcher-r1te9nB2.js";
77
- import { _ as _64 } from "./chunks/LpTilt-DuyKbpkA.js";
78
- import { _ as _65 } from "./chunks/LpToaster-gDB1EaU3.js";
79
- import { _ as _66 } from "./chunks/LpTooltip-hCLPAqMG.js";
80
- import { _ as _67 } from "./chunks/LpTopologyCanvas-Cm1L39uL.js";
81
- import { _ as _68 } from "./chunks/LpUptimeBar-DcQ8HikG.js";
77
+ import { D, _ as _64, N, T, b, c, d, e, f, g, i, l, h, j, n, r, t, k, m, u, v } from "./chunks/LpThemeSwitcher-r1te9nB2.js";
78
+ import { _ as _65 } from "./chunks/LpTilt-DuyKbpkA.js";
79
+ import { _ as _66 } from "./chunks/LpToaster-gDB1EaU3.js";
80
+ import { _ as _67 } from "./chunks/LpTooltip-hCLPAqMG.js";
81
+ import { _ as _68 } from "./chunks/LpTopologyCanvas-Cm1L39uL.js";
82
+ import { _ as _69 } from "./chunks/LpUptimeBar-DvAMno0S.js";
82
83
  import { deserializeLayout, serializeLayout } from "./layout/tree.js";
83
84
  import { addLeaf, addTab, countBlocks, countLeaves, makeLayout, moveLeaf, removeBlock, removeLeaf, reorderTab, resizeAt, setActiveTab } from "./layout/tree.js";
84
85
  import { blockTitle, defineBlocks } from "./layout/registry.js";
85
86
  import { useLayout } from "./layout/useLayout.js";
86
87
  import { useClipboard } from "./composables/useClipboard.js";
87
88
  import { appleModifierLabel, isAppleKeyboard, useHotkeys } from "./composables/useHotkeys.js";
89
+ import { mergeClass, useMergedAttrs, useMergedClass } from "./composables/useMergedClass.js";
88
90
  import { useInputFilter } from "./composables/useInputFilter.js";
89
91
  import { easeOut, easeTravel, easingToken, prefersReducedMotion } from "./composables/easing.js";
90
92
  import { useReveal } from "./composables/useReveal.js";
@@ -165,44 +167,45 @@ export {
165
167
  _31 as LpLink,
166
168
  _32 as LpLogViewer,
167
169
  _3 as LpMapPicker,
168
- _33 as LpModal,
169
- _34 as LpNotificationBell,
170
- _35 as LpNumberField,
171
- _36 as LpNumberFlow,
172
- _37 as LpOtpInput,
173
- _38 as LpPagination,
174
- _39 as LpPasswordInput,
175
- _41 as LpPhoneInput,
176
- _40 as LpPie,
177
- _42 as LpPopover,
178
- _43 as LpProgress,
179
- _44 as LpRadio,
180
- _45 as LpRadioGroup,
181
- _46 as LpRollingText,
182
- _47 as LpScrollArea,
183
- _49 as LpSection,
184
- _48 as LpSegmented,
185
- _50 as LpSelect,
186
- _51 as LpServiceNode,
187
- _52 as LpShift,
170
+ _33 as LpMediaGallery,
171
+ _34 as LpModal,
172
+ _35 as LpNotificationBell,
173
+ _36 as LpNumberField,
174
+ _37 as LpNumberFlow,
175
+ _38 as LpOtpInput,
176
+ _39 as LpPagination,
177
+ _40 as LpPasswordInput,
178
+ _42 as LpPhoneInput,
179
+ _41 as LpPie,
180
+ _43 as LpPopover,
181
+ _44 as LpProgress,
182
+ _45 as LpRadio,
183
+ _46 as LpRadioGroup,
184
+ _47 as LpRollingText,
185
+ _48 as LpScrollArea,
186
+ _50 as LpSection,
187
+ _49 as LpSegmented,
188
+ _51 as LpSelect,
189
+ _52 as LpServiceNode,
190
+ _53 as LpShift,
188
191
  default6 as LpShortcutsDialog,
189
- _53 as LpSidebar,
190
- _54 as LpSkeleton,
191
- _55 as LpSlider,
192
- _56 as LpSparkline,
193
- _57 as LpStat,
194
- _58 as LpStepper,
195
- _59 as LpSwitch,
192
+ _54 as LpSidebar,
193
+ _55 as LpSkeleton,
194
+ _56 as LpSlider,
195
+ _57 as LpSparkline,
196
+ _58 as LpStat,
197
+ _59 as LpStepper,
198
+ _60 as LpSwitch,
196
199
  default7 as LpTable,
197
- _60 as LpTableOfContents,
198
- _61 as LpTabs,
199
- _62 as LpTextarea,
200
- _63 as LpThemeSwitcher,
201
- _64 as LpTilt,
202
- _65 as LpToaster,
203
- _66 as LpTooltip,
204
- _67 as LpTopologyCanvas,
205
- _68 as LpUptimeBar,
200
+ _61 as LpTableOfContents,
201
+ _62 as LpTabs,
202
+ _63 as LpTextarea,
203
+ _64 as LpThemeSwitcher,
204
+ _65 as LpTilt,
205
+ _66 as LpToaster,
206
+ _67 as LpTooltip,
207
+ _68 as LpTopologyCanvas,
208
+ _69 as LpUptimeBar,
206
209
  N as NO_BACKDROP_ATTR,
207
210
  OSM_TILES,
208
211
  T as THEME_COOKIE,
@@ -252,6 +255,7 @@ export {
252
255
  loadCountries,
253
256
  makeLayout,
254
257
  matchCountryByValue,
258
+ mergeClass,
255
259
  moveLeaf,
256
260
  niceScale,
257
261
  n as nord,
@@ -289,6 +293,8 @@ export {
289
293
  useHotkeys,
290
294
  useInputFilter,
291
295
  useLayout,
296
+ useMergedAttrs,
297
+ useMergedClass,
292
298
  useReveal,
293
299
  useRovingFocus,
294
300
  useSettled,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leavepulse/ui",
3
- "version": "0.31.1",
3
+ "version": "0.33.0",
4
4
  "type": "module",
5
5
  "description": "LeavePulse token-driven Vue component kit.",
6
6
  "repository": {
@@ -61,7 +61,6 @@
61
61
  "@vueuse/core": "^12.0.0 || ^13.0.0 || ^14.0.0",
62
62
  "motion-v": "^2.2.0",
63
63
  "reka-ui": "^2.9.0",
64
- "tailwind-merge": "^3.0.0",
65
64
  "tailwind-variants": "^3.0.0",
66
65
  "tailwindcss": "^4.0.0",
67
66
  "vue": "^3.5.0"
@@ -80,7 +79,6 @@
80
79
  "motion-v": "^2.2.1",
81
80
  "reka-ui": "^2.9.10",
82
81
  "shiki": "^4.2.0",
83
- "tailwind-merge": "^3.6.0",
84
82
  "tailwind-variants": "^3.2.2",
85
83
  "tailwindcss": "^4.2.4",
86
84
  "typescript": "^5.6.3",
@@ -41,6 +41,7 @@ export const COMPONENT_NAMES = [
41
41
  "LpLink",
42
42
  "LpLogViewer",
43
43
  "LpMapPicker",
44
+ "LpMediaGallery",
44
45
  "LpModal",
45
46
  "LpNotificationBell",
46
47
  "LpNumberField",
@@ -1,3 +1,10 @@
1
+ <script lang="ts">
2
+ // The consumer's `class` is merged into the root's own (below) rather than
3
+ // appended to it, so opt out of the automatic pass-through that would add it
4
+ // a second time, unmerged.
5
+ export default { inheritAttrs: false }
6
+ </script>
7
+
1
8
  <script setup lang="ts">
2
9
  /*
3
10
  * Postal address form — street, optional second line, city, postcode and
@@ -33,6 +40,7 @@ import LpIcon from "./LpIcon.vue"
33
40
  import LpInput from "./LpInput.vue"
34
41
  import LpModal from "./LpModal.vue"
35
42
  import LpSelect from "./LpSelect.vue"
43
+ import { useMergedAttrs } from "../composables/useMergedClass"
36
44
 
37
45
  const LpMapPicker = defineAsyncComponent(() => import("./LpMapPicker.vue"))
38
46
 
@@ -252,10 +260,17 @@ function confirmPoint() {
252
260
  emit("pick", point.value)
253
261
  mapOpen.value = false
254
262
  }
263
+
264
+ // The group stacks its fields on a fixed gap that a tighter form has to close.
265
+ const { class: rootClass, attrs: rest } = useMergedAttrs(
266
+ "flex flex-col gap-3",
267
+ )
255
268
  </script>
256
269
 
257
270
  <template>
258
- <div class="flex flex-col gap-3">
271
+ <div
272
+ :class="rootClass"
273
+ v-bind="rest">
259
274
  <LpFormField :label="text.line">
260
275
  <!-- Typing is the fast path and stands on its own; the map is one button
261
276
  away for when an address is easier pointed at than spelled. -->
@@ -1,3 +1,10 @@
1
+ <script lang="ts">
2
+ // The consumer's `class` is merged into the root's own (below) rather than
3
+ // appended to it, so opt out of the automatic pass-through that would add it
4
+ // a second time, unmerged.
5
+ export default { inheritAttrs: false }
6
+ </script>
7
+
1
8
  <script setup lang="ts">
2
9
  /*
3
10
  * Full application shell: a fixed-height (h-dvh) flex frame holding the side
@@ -31,6 +38,7 @@ import LpScrollArea from "./LpScrollArea.vue"
31
38
  import LpShift from "./LpShift.vue"
32
39
  import LpSidebar from "./LpSidebar.vue"
33
40
  import type { SidebarItem, SidebarSection } from "./sidebar"
41
+ import { useMergedAttrs } from "../composables/useMergedClass"
34
42
 
35
43
  export type { SidebarItem, SidebarSection } from "./sidebar"
36
44
 
@@ -157,10 +165,17 @@ const burgerClass = computed(() => burgerHidden[props.mobileBreakpoint])
157
165
  // Expose the burger trigger so a host can omit its own header entirely.
158
166
  const _openDrawer = () => emit("update:open", true)
159
167
  defineExpose({ openDrawer: _openDrawer })
168
+
169
+ // The shell claims the full viewport height, which is wrong when it is embedded in a page that already has a header of its own.
170
+ const { class: rootClass, attrs: rest } = useMergedAttrs(
171
+ "flex h-dvh overflow-hidden bg-surface text-ink",
172
+ )
160
173
  </script>
161
174
 
162
175
  <template>
163
- <div class="flex h-dvh overflow-hidden bg-surface text-ink">
176
+ <div
177
+ :class="rootClass"
178
+ v-bind="rest">
164
179
  <LpSidebar
165
180
  :model-value="modelValue"
166
181
  :items="items"
@@ -1,6 +1,14 @@
1
+ <script lang="ts">
2
+ // The consumer's `class` is merged into the root's own (below) rather than
3
+ // appended to it, so opt out of the automatic pass-through that would add it
4
+ // a second time, unmerged.
5
+ export default { inheritAttrs: false }
6
+ </script>
7
+
1
8
  <script setup lang="ts">
2
9
  import type { Component } from "vue"
3
10
  import LpIcon from "./LpIcon.vue"
11
+ import { useMergedAttrs } from "../composables/useMergedClass"
4
12
 
5
13
  export interface Crumb {
6
14
  label: string
@@ -23,10 +31,17 @@ withDefaults(
23
31
  { as: "a" },
24
32
  )
25
33
  defineEmits<{ (e: "navigate", item: Crumb, index: number): void }>()
34
+
35
+ // The trail sets its own gap, which a dense header bar needs to reduce.
36
+ const { class: rootClass, attrs: rest } = useMergedAttrs(
37
+ "flex items-center gap-1.5 text-sm",
38
+ )
26
39
  </script>
27
40
 
28
41
  <template>
29
- <nav class="flex items-center gap-1.5 text-sm" aria-label="Breadcrumb">
42
+ <nav
43
+ :class="rootClass"
44
+ v-bind="rest" aria-label="Breadcrumb">
30
45
  <template v-for="(item, i) in items" :key="i">
31
46
  <LpIcon
32
47
  v-if="i > 0"
@@ -1,3 +1,10 @@
1
+ <script lang="ts">
2
+ // The consumer's `class` is merged into the root's own (below) rather than
3
+ // appended to it, so opt out of the automatic pass-through that would add it
4
+ // a second time, unmerged.
5
+ export default { inheritAttrs: false }
6
+ </script>
7
+
1
8
  <script setup lang="ts">
2
9
  /*
3
10
  * Inline month calendar (reka Calendar). The kit-facing model is an ISO date
@@ -23,6 +30,7 @@ import {
23
30
  } from "reka-ui"
24
31
  import { computed } from "vue"
25
32
  import LpIcon from "./LpIcon.vue"
33
+ import { useMergedAttrs } from "../composables/useMergedClass"
26
34
 
27
35
  const props = withDefaults(
28
36
  defineProps<{
@@ -68,6 +76,11 @@ function disabledFor(date: DateValue): boolean {
68
76
 
69
77
  const navBtn =
70
78
  "flex size-8 items-center justify-center rounded-control text-muted outline-none transition-[color,background-color,scale] duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] hover:bg-surface-soft hover:text-ink active:scale-90 motion-reduce:active:scale-100 focus-visible:ring-2 focus-visible:ring-ring"
79
+
80
+ // The calendar draws its own card frame, which has to give way when it is placed inside a popover that already has one.
81
+ const { class: rootClass, attrs: rest } = useMergedAttrs(
82
+ "inline-block rounded-card border border-line bg-surface-raised p-3",
83
+ )
71
84
  </script>
72
85
 
73
86
  <template>
@@ -80,7 +93,8 @@ const navBtn =
80
93
  :weekday-format="weekdayFormat"
81
94
  :is-date-disabled="disabledFor"
82
95
  fixed-weeks
83
- class="inline-block rounded-card border border-line bg-surface-raised p-3"
96
+ :class="rootClass"
97
+ v-bind="rest"
84
98
  @update:model-value="onUpdate"
85
99
  >
86
100
  <CalendarHeader class="mb-2 flex items-center justify-between gap-2">
@@ -1,13 +1,14 @@
1
1
  <script lang="ts">
2
2
  // Opt out of auto attr inheritance: the template has two root branches (menu /
3
3
  // no-menu), so fallthrough class/attrs/events are bound explicitly onto the
4
- // inner <div> via v-bind="$attrs" in both — keeping them on the card surface.
4
+ // inner <div> in both — keeping them on the card surface.
5
5
  export default { inheritAttrs: false }
6
6
  </script>
7
7
 
8
8
  <script setup lang="ts">
9
9
  import { tv, type VariantProps } from "tailwind-variants"
10
10
  import { computed } from "vue"
11
+ import { useMergedAttrs } from "../composables/useMergedClass"
11
12
  import LpContextMenu, { type ContextMenuItemDef } from "./LpContextMenu.vue"
12
13
 
13
14
  const card = tv({
@@ -35,6 +36,9 @@ const card = tv({
35
36
  ghost: "border-transparent bg-transparent",
36
37
  },
37
38
  padded: { true: "p-5", false: "" },
39
+ // The stripe itself lives in .lp-card-accent (tokens.css), which composes
40
+ // it with the skin painter's shadows instead of overwriting them.
41
+ accent: { true: "lp-card-accent", false: "" },
38
42
  // Lift on hover with a BRAND-tinted glow + brand border (a black drop-shadow
39
43
  // was invisible on dark themes — it only showed on light). We write the glow
40
44
  // through `--surface-panel-shadow`, the very variable the skin-painter feeds
@@ -45,6 +49,12 @@ const card = tv({
45
49
  // (not `transform`), so the transition list MUST name `translate` explicitly
46
50
  // or the lift snaps while the rest eases.
47
51
  //
52
+ // `hover:shadow-*` sets box-shadow whole, which on an accented card dropped
53
+ // the stripe on hover — the card lit up and its colour went with it.
54
+ // .lp-card-accent is declared outside @layer, so it outranks the utility and
55
+ // keeps the stripe; the `--surface-panel-shadow` swap on the same line is
56
+ // what actually carries the glow there. See tokens.css.
57
+ //
48
58
  // The glow reaches past the card, so a clipping ancestor (scroll area,
49
59
  // dialog body) will slice it unless the list reserves room — see the
50
60
  // `.lp-glow-room` helper in tokens.css, whose spread tokens describe exactly
@@ -68,12 +78,47 @@ const props = withDefaults(
68
78
  menuItems?: ContextMenuItemDef[]
69
79
  /** Element to render as. A card inside a <ul> has to be an `li` to be valid. */
70
80
  as?: string
81
+ /**
82
+ * Colour of a stripe down the card's leading edge. ANY CSS colour — this is
83
+ * for sources that hand you an arbitrary value (a Discord role colour, a
84
+ * per-project hex out of a config), which is why it is a string and not a
85
+ * set of tonal variants. When the colour IS semantic, LpAlert's
86
+ * info/success/warning/danger say so in a way a raw hex cannot.
87
+ *
88
+ * The stripe costs no layout: content starts in the same place with and
89
+ * without it, and it rounds into `rounded-card` by itself.
90
+ */
91
+ accent?: string
92
+ /** Width of the `accent` stripe. */
93
+ accentWidth?: string
71
94
  }>(),
72
95
  { variant: "raised", padded: true, interactive: false, as: "div" },
73
96
  )
74
97
 
75
- const classes = computed(() =>
76
- card({ variant: props.variant, padded: props.padded, interactive: props.interactive }),
98
+ // Merged rather than concatenated: binding the raw `$attrs` would otherwise put the
99
+ // consumer's `class` next to ours and leave the winner to stylesheet order —
100
+ // `class="p-1"` lost to the `p-5` of `padded`. useMergedAttrs merges it in and
101
+ // hands back the remaining attrs, so the class never arrives a second time.
102
+ const { class: classes, attrs: rest } = useMergedAttrs(() =>
103
+ card({
104
+ variant: props.variant,
105
+ padded: props.padded,
106
+ interactive: props.interactive,
107
+ accent: Boolean(props.accent),
108
+ }),
109
+ )
110
+
111
+ // Through custom properties rather than a box-shadow written here: the shadow
112
+ // list in .lp-card-accent also carries the skin painter's own shadows, and an
113
+ // inline box-shadow would replace all three — taking the card's elevation with
114
+ // it, and blocking the swap `interactive` makes on hover.
115
+ const accentStyle = computed(() =>
116
+ props.accent
117
+ ? {
118
+ "--lp-card-accent": props.accent,
119
+ ...(props.accentWidth ? { "--lp-card-accent-width": props.accentWidth } : {}),
120
+ }
121
+ : undefined,
77
122
  )
78
123
  </script>
79
124
 
@@ -82,11 +127,11 @@ const classes = computed(() =>
82
127
  (inheritAttrs:false above), so the card surface looks identical whether or
83
128
  not it's wrapped in a context menu. -->
84
129
  <LpContextMenu v-if="menuItems?.length" :items="menuItems">
85
- <component :is="as" :class="classes" v-bind="$attrs">
130
+ <component :is="as" :class="classes" :style="accentStyle" v-bind="rest">
86
131
  <slot />
87
132
  </component>
88
133
  </LpContextMenu>
89
- <component :is="as" v-else :class="classes" v-bind="$attrs">
134
+ <component :is="as" v-else :class="classes" :style="accentStyle" v-bind="rest">
90
135
  <slot />
91
136
  </component>
92
137
  </template>
@@ -1,3 +1,10 @@
1
+ <script lang="ts">
2
+ // The consumer's `class` is merged into the root's own (below) rather than
3
+ // appended to it, so opt out of the automatic pass-through that would add it
4
+ // a second time, unmerged.
5
+ export default { inheritAttrs: false }
6
+ </script>
7
+
1
8
  <script setup lang="ts">
2
9
  /*
3
10
  * Token-driven SVG chart: line, area and bar off one data shape. No charting
@@ -36,6 +43,7 @@ import {
36
43
  import LpContextMenu, { type ContextMenuItemDef } from "./LpContextMenu.vue"
37
44
  import LpIcon from "./LpIcon.vue"
38
45
  import LpShift from "./LpShift.vue"
46
+ import { useMergedAttrs } from "../composables/useMergedClass"
39
47
 
40
48
  /** What was under the pointer when a point was clicked or right-clicked. */
41
49
  export interface ChartPointEvent {
@@ -845,10 +853,17 @@ const clipId = `lp-chart-${Math.random().toString(36).slice(2, 9)}`
845
853
  */
846
854
  const gradientId = (name: string, index: number) =>
847
855
  `${clipId}-g-${index}-${name.replace(/[^a-zA-Z0-9_-]/g, "-")}`
856
+
857
+ // The chart fills its container's width and sets its own gap between plot and legend — both are layout decisions the page makes, not the chart.
858
+ const { class: rootClass, attrs: rest } = useMergedAttrs(
859
+ "flex w-full flex-col gap-3",
860
+ )
848
861
  </script>
849
862
 
850
863
  <template>
851
- <div ref="root" class="flex w-full flex-col gap-3">
864
+ <div ref="root"
865
+ :class="rootClass"
866
+ v-bind="rest">
852
867
  <div v-if="title || subtitle || $slots.actions" class="flex items-start justify-between gap-3">
853
868
  <div class="flex flex-col gap-0.5">
854
869
  <span v-if="title" class="text-sm font-medium text-ink">{{ title }}</span>
@@ -1,6 +1,14 @@
1
+ <script lang="ts">
2
+ // The consumer's `class` is merged into the root's own (below) rather than
3
+ // appended to it, so opt out of the automatic pass-through that would add it
4
+ // a second time, unmerged.
5
+ export default { inheritAttrs: false }
6
+ </script>
7
+
1
8
  <script setup lang="ts">
2
9
  import { CheckboxIndicator, CheckboxRoot } from "reka-ui"
3
10
  import LpIcon from "./LpIcon.vue"
11
+ import { useMergedAttrs } from "../composables/useMergedClass"
4
12
 
5
13
  defineProps<{
6
14
  modelValue?: boolean
@@ -21,10 +29,17 @@ function onUpdate(v: boolean | "indeterminate") {
21
29
  emit("update:modelValue", checked)
22
30
  emit("change", checked)
23
31
  }
32
+
33
+ // The label sits a fixed distance from the box; a dense list of options needs that closer.
34
+ const { class: rootClass, attrs: rest } = useMergedAttrs(
35
+ "group inline-flex cursor-pointer items-center gap-2 text-sm text-ink",
36
+ )
24
37
  </script>
25
38
 
26
39
  <template>
27
- <label class="group inline-flex cursor-pointer items-center gap-2 text-sm text-ink">
40
+ <label
41
+ :class="rootClass"
42
+ v-bind="rest">
28
43
  <CheckboxRoot
29
44
  :id="id"
30
45
  :name="name"
@@ -1,3 +1,10 @@
1
+ <script lang="ts">
2
+ // The consumer's `class` is merged into the root's own (below) rather than
3
+ // appended to it, so opt out of the automatic pass-through that would add it
4
+ // a second time, unmerged.
5
+ export default { inheritAttrs: false }
6
+ </script>
7
+
1
8
  <script setup lang="ts">
2
9
  /*
3
10
  * Code block with lightweight, theme-aware syntax highlighting (codeHighlight.ts
@@ -19,6 +26,7 @@ import { computed, reactive, ref, watch } from "vue"
19
26
  import { useClipboard } from "../composables/useClipboard"
20
27
  import { type CodeLang, tokenizeLine } from "./codeHighlight"
21
28
  import LpIcon from "./LpIcon.vue"
29
+ import { useMergedAttrs } from "../composables/useMergedClass"
22
30
 
23
31
  const props = withDefaults(
24
32
  defineProps<{
@@ -181,10 +189,17 @@ function toggleLock() {
181
189
  function onInput(e: Event) {
182
190
  emit("update:modelValue", (e.target as HTMLTextAreaElement).value)
183
191
  }
192
+
193
+ // A code block is a framed panel; embedding one inside another panel means dropping its border or its radius, which a consumer can only do from the outside.
194
+ const { class: rootClass, attrs: rest } = useMergedAttrs(
195
+ "overflow-hidden rounded-card border border-line bg-surface font-mono text-xs",
196
+ )
184
197
  </script>
185
198
 
186
199
  <template>
187
- <div class="overflow-hidden rounded-card border border-line bg-surface font-mono text-xs">
200
+ <div
201
+ :class="rootClass"
202
+ v-bind="rest">
188
203
  <!-- Header -->
189
204
  <div
190
205
  v-if="showHeader"