@leaflink/stash 52.0.3 → 53.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 (273) hide show
  1. package/README.md +51 -52
  2. package/dist/Accordion.js +16 -16
  3. package/dist/Accordion.js.map +1 -1
  4. package/dist/AccordionGroup.js +7 -7
  5. package/dist/AccordionGroup.js.map +1 -1
  6. package/dist/ActionsDropdown.js +16 -16
  7. package/dist/ActionsDropdown.js.map +1 -1
  8. package/dist/AddressSelect.js.map +1 -1
  9. package/dist/AddressSelect.vue.d.ts +1 -1
  10. package/dist/Alert.js +34 -34
  11. package/dist/Alert.js.map +1 -1
  12. package/dist/AppNavigationItem.js +31 -31
  13. package/dist/AppNavigationItem.js.map +1 -1
  14. package/dist/AppSidebar.js +19 -19
  15. package/dist/AppSidebar.js.map +1 -1
  16. package/dist/AppTopbar.js +32 -32
  17. package/dist/AppTopbar.js.map +1 -1
  18. package/dist/Avatar.js +18 -18
  19. package/dist/Avatar.js.map +1 -1
  20. package/dist/Backdrop.js +5 -5
  21. package/dist/Backdrop.js.map +1 -1
  22. package/dist/Badge.js +38 -38
  23. package/dist/Badge.js.map +1 -1
  24. package/dist/Box.js +1 -1
  25. package/dist/{Box.vue_vue_type_script_setup_true_lang-rFnvwLVY.js → Box.vue_vue_type_script_setup_true_lang-dFFZN40_.js} +6 -6
  26. package/dist/{Box.vue_vue_type_script_setup_true_lang-rFnvwLVY.js.map → Box.vue_vue_type_script_setup_true_lang-dFFZN40_.js.map} +1 -1
  27. package/dist/Button.js +21 -21
  28. package/dist/Button.js.map +1 -1
  29. package/dist/ButtonGroup.js +26 -26
  30. package/dist/ButtonGroup.js.map +1 -1
  31. package/dist/Card.js +14 -14
  32. package/dist/Card.js.map +1 -1
  33. package/dist/CardContent.js +1 -1
  34. package/dist/CardContent.js.map +1 -1
  35. package/dist/CardFooter.js +1 -1
  36. package/dist/CardFooter.js.map +1 -1
  37. package/dist/CardHeader.js +4 -4
  38. package/dist/CardHeader.js.map +1 -1
  39. package/dist/CardMedia.js +20 -20
  40. package/dist/CardMedia.js.map +1 -1
  41. package/dist/Carousel.js +60 -60
  42. package/dist/Carousel.js.map +1 -1
  43. package/dist/Checkbox.js +30 -30
  44. package/dist/Checkbox.js.map +1 -1
  45. package/dist/Checkbox.vue.d.ts +0 -3
  46. package/dist/Chip.js +33 -33
  47. package/dist/Chip.js.map +1 -1
  48. package/dist/ConfirmationCodeInput.js +72 -72
  49. package/dist/ConfirmationCodeInput.js.map +1 -1
  50. package/dist/ContextSwitcher.js +27 -27
  51. package/dist/ContextSwitcher.js.map +1 -1
  52. package/dist/Copy.js +47 -48
  53. package/dist/Copy.js.map +1 -1
  54. package/dist/CurrencyInput.js +1 -1
  55. package/dist/CurrencyInput.js.map +1 -1
  56. package/dist/CurrencyInput.vue.d.ts +5 -5
  57. package/dist/DataView.js +23 -23
  58. package/dist/DataView.js.map +1 -1
  59. package/dist/DataViewFilters.js +26 -26
  60. package/dist/DataViewFilters.js.map +1 -1
  61. package/dist/DataViewSortButton.js +22 -22
  62. package/dist/DataViewSortButton.js.map +1 -1
  63. package/dist/DataViewToolbar.js +52 -52
  64. package/dist/DataViewToolbar.js.map +1 -1
  65. package/dist/DatePicker.js +10 -10
  66. package/dist/DatePicker.js.map +1 -1
  67. package/dist/DescriptionList.js +2 -2
  68. package/dist/DescriptionList.js.map +1 -1
  69. package/dist/DescriptionListDetail.js +2 -2
  70. package/dist/DescriptionListDetail.js.map +1 -1
  71. package/dist/DescriptionListGroup.js +9 -9
  72. package/dist/DescriptionListGroup.js.map +1 -1
  73. package/dist/DescriptionListTerm.js +8 -8
  74. package/dist/DescriptionListTerm.js.map +1 -1
  75. package/dist/Dialog.js +47 -47
  76. package/dist/Dialog.js.map +1 -1
  77. package/dist/Divider.js +6 -6
  78. package/dist/Divider.js.map +1 -1
  79. package/dist/Dropdown.js +20 -20
  80. package/dist/Dropdown.js.map +1 -1
  81. package/dist/EmptyState.js +26 -26
  82. package/dist/EmptyState.js.map +1 -1
  83. package/dist/Field.js +1 -1
  84. package/dist/{Field.vue_vue_type_script_setup_true_lang-DI6z3AE9.js → Field.vue_vue_type_script_setup_true_lang-dAGKfjf5.js} +17 -17
  85. package/dist/Field.vue_vue_type_script_setup_true_lang-dAGKfjf5.js.map +1 -0
  86. package/dist/FileUpload.js +47 -49
  87. package/dist/FileUpload.js.map +1 -1
  88. package/dist/FilterChip.js +20 -20
  89. package/dist/FilterChip.js.map +1 -1
  90. package/dist/FilterDrawerItem.js +13 -13
  91. package/dist/FilterDrawerItem.js.map +1 -1
  92. package/dist/FilterDropdown.js +27 -27
  93. package/dist/FilterDropdown.js.map +1 -1
  94. package/dist/FilterSelect.js +33 -33
  95. package/dist/FilterSelect.js.map +1 -1
  96. package/dist/Filters.js +29 -29
  97. package/dist/Filters.js.map +1 -1
  98. package/dist/Filters.vue.d.ts +2 -8
  99. package/dist/HttpError.js +29 -29
  100. package/dist/HttpError.js.map +1 -1
  101. package/dist/HttpError.vue.d.ts +0 -3
  102. package/dist/Icon.js +12 -12
  103. package/dist/Icon.js.map +1 -1
  104. package/dist/IconLabel.js +19 -19
  105. package/dist/IconLabel.js.map +1 -1
  106. package/dist/IconLabel.vue.d.ts +1 -1
  107. package/dist/Illustration.js +2 -2
  108. package/dist/{Illustration.vue_vue_type_script_setup_true_lang-BrqEF8xe.js → Illustration.vue_vue_type_script_setup_true_lang-C1bPkWZZ.js} +4 -4
  109. package/dist/{Illustration.vue_vue_type_script_setup_true_lang-BrqEF8xe.js.map → Illustration.vue_vue_type_script_setup_true_lang-C1bPkWZZ.js.map} +1 -1
  110. package/dist/Image.js +2 -2
  111. package/dist/Image.vue.d.ts +0 -3
  112. package/dist/{Image.vue_vue_type_script_setup_true_lang-D5u4av0_.js → Image.vue_vue_type_script_setup_true_lang-CAj0FH9h.js} +11 -11
  113. package/dist/Image.vue_vue_type_script_setup_true_lang-CAj0FH9h.js.map +1 -0
  114. package/dist/InlineEdit.js +8 -8
  115. package/dist/InlineEdit.js.map +1 -1
  116. package/dist/Input.js +29 -29
  117. package/dist/Input.js.map +1 -1
  118. package/dist/InputOptions.js +87 -84
  119. package/dist/InputOptions.js.map +1 -1
  120. package/dist/InputOptions.vue.d.ts +2 -2
  121. package/dist/IntegrationIcon.js +11 -11
  122. package/dist/IntegrationIcon.js.map +1 -1
  123. package/dist/Label.js +1 -1
  124. package/dist/{Label.vue_vue_type_script_setup_true_lang-CNquF3AP.js → Label.vue_vue_type_script_setup_true_lang-xwY3X-iV.js} +16 -16
  125. package/dist/{Label.vue_vue_type_script_setup_true_lang-CNquF3AP.js.map → Label.vue_vue_type_script_setup_true_lang-xwY3X-iV.js.map} +1 -1
  126. package/dist/ListItem.js +14 -14
  127. package/dist/ListItem.js.map +1 -1
  128. package/dist/ListItem.vue.d.ts +0 -6
  129. package/dist/ListItemCell.js +9 -9
  130. package/dist/ListItemCell.js.map +1 -1
  131. package/dist/ListView.js +138 -141
  132. package/dist/ListView.js.map +1 -1
  133. package/dist/ListView.vue.d.ts +6 -40
  134. package/dist/Loading.js +8 -8
  135. package/dist/Loading.js.map +1 -1
  136. package/dist/Logo.js +1 -1
  137. package/dist/{Logo.vue_vue_type_script_setup_true_lang-Dz8c98sc.js → Logo.vue_vue_type_script_setup_true_lang-DghNC_k6.js} +3 -3
  138. package/dist/{Logo.vue_vue_type_script_setup_true_lang-Dz8c98sc.js.map → Logo.vue_vue_type_script_setup_true_lang-DghNC_k6.js.map} +1 -1
  139. package/dist/Menu.js +5 -5
  140. package/dist/Menu.js.map +1 -1
  141. package/dist/MenuItem.js +12 -12
  142. package/dist/MenuItem.js.map +1 -1
  143. package/dist/Metric.js +24 -24
  144. package/dist/Metric.js.map +1 -1
  145. package/dist/Modal.js +60 -60
  146. package/dist/Modal.js.map +1 -1
  147. package/dist/Modals.js +1 -1
  148. package/dist/Modals.js.map +1 -1
  149. package/dist/Module.js +6 -6
  150. package/dist/Module.js.map +1 -1
  151. package/dist/ModuleContent.js +16 -16
  152. package/dist/ModuleContent.js.map +1 -1
  153. package/dist/ModuleFooter.js +13 -13
  154. package/dist/ModuleFooter.js.map +1 -1
  155. package/dist/ModuleHeader.js +29 -29
  156. package/dist/ModuleHeader.js.map +1 -1
  157. package/dist/MoreActions.js +81 -84
  158. package/dist/MoreActions.js.map +1 -1
  159. package/dist/ObfuscateText.js +4 -4
  160. package/dist/ObfuscateText.js.map +1 -1
  161. package/dist/PageContent.js +13 -13
  162. package/dist/PageContent.js.map +1 -1
  163. package/dist/PageHeader.js +28 -28
  164. package/dist/PageHeader.js.map +1 -1
  165. package/dist/PageNavigation.js +1 -1
  166. package/dist/Paginate.js +45 -45
  167. package/dist/Paginate.js.map +1 -1
  168. package/dist/QuickAction.js +18 -18
  169. package/dist/QuickAction.js.map +1 -1
  170. package/dist/Radio.js +17 -17
  171. package/dist/Radio.js.map +1 -1
  172. package/dist/RadioGroup.js +121 -121
  173. package/dist/RadioGroup.js.map +1 -1
  174. package/dist/RadioNew.js +80 -80
  175. package/dist/RadioNew.js.map +1 -1
  176. package/dist/RadioNew.vue.d.ts +0 -3
  177. package/dist/RangeInput.js +2 -2
  178. package/dist/RangeInput.js.map +1 -1
  179. package/dist/SearchBar.js +9 -9
  180. package/dist/SearchBar.js.map +1 -1
  181. package/dist/SectionHeader.js +14 -14
  182. package/dist/SectionHeader.js.map +1 -1
  183. package/dist/Select.js +369 -366
  184. package/dist/Select.js.map +1 -1
  185. package/dist/SelectStatus.js +26 -26
  186. package/dist/SelectStatus.js.map +1 -1
  187. package/dist/Skeleton.js +20 -20
  188. package/dist/Skeleton.js.map +1 -1
  189. package/dist/Step.js +37 -40
  190. package/dist/Step.js.map +1 -1
  191. package/dist/Stepper.js +17 -17
  192. package/dist/Stepper.js.map +1 -1
  193. package/dist/Switch.js +57 -57
  194. package/dist/Switch.js.map +1 -1
  195. package/dist/Tab.js +17 -19
  196. package/dist/Tab.js.map +1 -1
  197. package/dist/TabPanel.js +1 -1
  198. package/dist/TabPanel.js.map +1 -1
  199. package/dist/Table.js +22 -22
  200. package/dist/Table.js.map +1 -1
  201. package/dist/TableCell.js +32 -32
  202. package/dist/TableCell.js.map +1 -1
  203. package/dist/TableHeaderCell.js +35 -35
  204. package/dist/TableHeaderCell.js.map +1 -1
  205. package/dist/TableHeaderRow.js +10 -10
  206. package/dist/TableHeaderRow.js.map +1 -1
  207. package/dist/TableRow.js +51 -51
  208. package/dist/TableRow.js.map +1 -1
  209. package/dist/Tabs.js +2 -2
  210. package/dist/{Tabs.vue_vue_type_script_setup_true_lang-B3Irnlcd.js → Tabs.vue_vue_type_script_setup_true_lang-BVTCcK6M.js} +33 -33
  211. package/dist/Tabs.vue_vue_type_script_setup_true_lang-BVTCcK6M.js.map +1 -0
  212. package/dist/TextEditor.js +8 -8
  213. package/dist/TextEditor.js.map +1 -1
  214. package/dist/Textarea.js +15 -15
  215. package/dist/Textarea.js.map +1 -1
  216. package/dist/Thumbnail.js +41 -41
  217. package/dist/Thumbnail.js.map +1 -1
  218. package/dist/ThumbnailEmpty.js +3 -3
  219. package/dist/ThumbnailEmpty.js.map +1 -1
  220. package/dist/ThumbnailGroup.js +22 -22
  221. package/dist/ThumbnailGroup.js.map +1 -1
  222. package/dist/Timeline.js +6 -6
  223. package/dist/Timeline.js.map +1 -1
  224. package/dist/Timeline.vue.d.ts +2 -2
  225. package/dist/TimelineItem.js +22 -22
  226. package/dist/TimelineItem.js.map +1 -1
  227. package/dist/Toast.js +29 -29
  228. package/dist/Toast.js.map +1 -1
  229. package/dist/Toast.vue.d.ts +3 -0
  230. package/dist/Toasts.js +11 -11
  231. package/dist/Toasts.js.map +1 -1
  232. package/dist/Tooltip.js +2 -81
  233. package/dist/Tooltip.js.map +1 -1
  234. package/dist/Tooltip.vue.d.ts +1 -1
  235. package/dist/Tooltip.vue_vue_type_script_setup_true_lang-mzBLSXy3.js +84 -0
  236. package/dist/Tooltip.vue_vue_type_script_setup_true_lang-mzBLSXy3.js.map +1 -0
  237. package/dist/components.css +2 -2
  238. package/dist/constants.d.ts +9 -9
  239. package/dist/constants.js +17 -17
  240. package/dist/constants.js.map +1 -1
  241. package/dist/directives/tooltip.js +2 -2
  242. package/dist/directives/tooltip.js.map +1 -1
  243. package/dist/floating-ui.vue-CuGrC-z8.js.map +1 -1
  244. package/dist/formatDateTime-Dz8bXV0R.js.map +1 -1
  245. package/dist/index-D6bxWkZ1.js.map +1 -1
  246. package/dist/{index-C14LhAwV.js → index-DBV9Uz0C.js} +3 -3
  247. package/dist/index-DBV9Uz0C.js.map +1 -0
  248. package/dist/index.js.map +1 -1
  249. package/dist/isValid-DN-HkCoi.js.map +1 -1
  250. package/dist/parseISO-wlfIB_QJ.js.map +1 -1
  251. package/dist/searchFuzzy-B3TsUO-V.js.map +1 -1
  252. package/dist/tailwind-base.js +4 -4
  253. package/dist/tailwind-base.js.d.ts +12 -0
  254. package/dist/tailwind-base.js.map +1 -1
  255. package/dist/toTimeZone-Coq1oPTt.js.map +1 -1
  256. package/dist/useGoogleMaps.js.map +1 -1
  257. package/dist/useSortable.js +1 -1
  258. package/dist/useValidation.js.map +1 -1
  259. package/dist/utils/helpers.js +15 -15
  260. package/dist/utils/helpers.js.map +1 -1
  261. package/package.json +12 -82
  262. package/styles/backwards-compat.css +375 -2854
  263. package/styles/main.css +8 -0
  264. package/styles/sofia-font.css +23 -27
  265. package/styles/theme.css +1033 -0
  266. package/LICENSE +0 -21
  267. package/dist/Field.vue_vue_type_script_setup_true_lang-DI6z3AE9.js.map +0 -1
  268. package/dist/Image.vue_vue_type_script_setup_true_lang-D5u4av0_.js.map +0 -1
  269. package/dist/Tabs.vue_vue_type_script_setup_true_lang-B3Irnlcd.js.map +0 -1
  270. package/dist/index-C14LhAwV.js.map +0 -1
  271. package/dist/tailwind-base.d.ts +0 -333
  272. package/styles/base.css +0 -902
  273. package/tailwind-base.ts +0 -455
package/dist/Badge.js CHANGED
@@ -1,9 +1,9 @@
1
- import { defineComponent as u, useCssModule as g, computed as l, ref as w, watch as b, createElementBlock as h, openBlock as m, renderSlot as v, withDirectives as _, createElementVNode as r, normalizeStyle as x, normalizeClass as c, unref as i, toDisplayString as y, vShow as k } from "vue";
2
- import { _ as B } from "./_plugin-vue_export-helper-CHgC5LLL.js";
3
- const D = {
4
- class: "stash-badge tw-relative tw-inline-block",
1
+ import { defineComponent as u, useCssModule as g, computed as d, ref as m, watch as v, createElementBlock as b, openBlock as h, renderSlot as _, withDirectives as x, createElementVNode as r, normalizeStyle as w, normalizeClass as c, unref as i, toDisplayString as y, vShow as B } from "vue";
2
+ import { _ as D } from "./_plugin-vue_export-helper-CHgC5LLL.js";
3
+ const S = {
4
+ class: "stash-badge relative inline-block",
5
5
  "data-test": "stash-badge"
6
- }, S = /* @__PURE__ */ u({
6
+ }, C = /* @__PURE__ */ u({
7
7
  name: "ll-badge",
8
8
  __name: "Badge",
9
9
  props: {
@@ -21,60 +21,60 @@ const D = {
21
21
  variant: { default: "standard" }
22
22
  },
23
23
  setup(p) {
24
- const o = g(), t = p, s = l(() => {
25
- const e = parseInt(t.content, 10), a = parseInt(t.max, 10);
26
- return e != t.content || a != t.max ? t.content : e > a ? `${a}+` : e;
27
- }), d = (e) => e === 0 ? "0" : `${e}px`, f = l(() => ({
28
- top: t.offset.top !== void 0 ? d(t.offset.top) : void 0,
29
- right: t.offset.right !== void 0 ? d(t.offset.right) : void 0
30
- })), n = w(!1);
31
- return b(
24
+ const a = g(), t = p, s = d(() => {
25
+ const e = parseInt(t.content, 10), o = parseInt(t.max, 10);
26
+ return e != t.content || o != t.max ? t.content : e > o ? `${o}+` : e;
27
+ }), l = (e) => e === 0 ? "0" : `${e}px`, f = d(() => ({
28
+ top: t.offset.top !== void 0 ? l(t.offset.top) : void 0,
29
+ right: t.offset.right !== void 0 ? l(t.offset.right) : void 0
30
+ })), n = m(!1);
31
+ return v(
32
32
  () => t.content,
33
- (e, a) => {
34
- t.animate && a !== e && (n.value = !0, setTimeout(() => {
33
+ (e, o) => {
34
+ t.animate && o !== e && (n.value = !0, setTimeout(() => {
35
35
  n.value = !1;
36
36
  }, 1e3));
37
37
  }
38
- ), (e, a) => (m(), h("span", D, [
39
- v(e.$slots, "default"),
40
- _(r("span", {
38
+ ), (e, o) => (h(), b("span", S, [
39
+ _(e.$slots, "default"),
40
+ x(r("span", {
41
41
  "data-test": "stash-badge|content-wrapper",
42
42
  class: c([
43
43
  {
44
- [i(o)["top-right"]]: t.position === "top-right" && t.variant !== "dot",
45
- "tw-absolute": t.variant === "dot" || t.position === "top-right",
46
- "tw-ml-1.5": t.position === "inline"
44
+ [i(a)["top-right"]]: t.position === "top-right" && t.variant !== "dot",
45
+ absolute: t.variant === "dot" || t.position === "top-right",
46
+ "ml-1.5": t.position === "inline"
47
47
  }
48
48
  ]),
49
- style: x(t.variant === "dot" || t.position === "top-right" ? f.value : "")
49
+ style: w(t.variant === "dot" || t.position === "top-right" ? f.value : "")
50
50
  }, [
51
51
  r("span", {
52
52
  "data-test": "stash-badge|content",
53
- class: c(["tw-inline-block tw-whitespace-nowrap tw-rounded-full tw-text-center tw-text-[10px] tw-font-semibold tw-leading-4 tw-text-white", [
53
+ class: c(["inline-block whitespace-nowrap rounded-full text-center text-[10px] font-semibold leading-4 text-white", [
54
54
  {
55
- "tw-animate-grow": n.value,
56
- "tw-bg-red-500": t.color === "red" && !t.isDisabled,
57
- "tw-bg-blue-500": t.color === "blue" && !t.isDisabled,
58
- "tw-absolute": t.variant === "dot",
59
- "tw-bg-ice-200 tw-text-white": t.isDisabled,
60
- [i(o)["badge-dot"]]: t.variant === "dot",
61
- [i(o)["badge-standard"]]: t.variant === "standard",
62
- "tw-px-1.5": t.variant !== "dot"
55
+ "animate-grow": n.value,
56
+ "bg-red-500": t.color === "red" && !t.isDisabled,
57
+ "bg-blue-500": t.color === "blue" && !t.isDisabled,
58
+ absolute: t.variant === "dot",
59
+ "bg-ice-200 text-white": t.isDisabled,
60
+ [i(a)["badge-dot"]]: t.variant === "dot",
61
+ [i(a)["badge-standard"]]: t.variant === "standard",
62
+ "px-1.5": t.variant !== "dot"
63
63
  }
64
64
  ]])
65
65
  }, y(t.variant === "dot" ? null : s.value), 3)
66
66
  ], 6), [
67
- [k, t.variant === "dot" || s.value || s.value === 0 && t.showZero]
67
+ [B, t.variant === "dot" || s.value || s.value === 0 && t.showZero]
68
68
  ])
69
69
  ]));
70
70
  }
71
- }), C = {
72
- "badge-standard": "_badge-standard_hcbk5_2",
73
- "badge-dot": "_badge-dot_hcbk5_7",
74
- "top-right": "_top-right_hcbk5_14"
71
+ }), k = {
72
+ "badge-standard": "_badge-standard_1gool_3",
73
+ "badge-dot": "_badge-dot_1gool_8",
74
+ "top-right": "_top-right_1gool_15"
75
75
  }, M = {
76
- $style: C
77
- }, E = /* @__PURE__ */ B(S, [["__cssModules", M]]);
76
+ $style: k
77
+ }, E = /* @__PURE__ */ D(C, [["__cssModules", M]]);
78
78
  export {
79
79
  E as default
80
80
  };
package/dist/Badge.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.js","sources":["../src/components/Badge/Badge.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n import { computed, ref, useCssModule, watch } from 'vue';\n\n defineOptions({\n name: 'll-badge',\n });\n\n const classes = useCssModule();\n\n export interface BadgeProps {\n /**\n * If true, the badge will animate when the content changes\n */\n animate?: boolean;\n\n /**\n * Color of the badge\n * Options: 'red' or 'blue'\n */\n color?: 'red' | 'blue';\n\n /**\n * The badge's content\n */\n content?: number | string;\n\n /**\n * Shows a gray badge with content\n */\n isDisabled?: boolean;\n\n /**\n * The max value of the `content` prop. If the value is greater than this, the badge will show the max value and a `+` sign.\n */\n max?: number | string;\n\n /**\n * Offset to adjust the badge's position. It does not apply to inline position badges.\n */\n offset?: {\n top?: number;\n right?: number;\n };\n\n /**\n * Badge position. Options:\n *\n * - inline: shows the badge directly next to the content (on the right), with a left margin of 6px\n * - top-right: will overlap the badge over whatever is passed in the default slot\n */\n position?: 'top-right' | 'inline';\n\n /**\n * The badge will be hidden if the content is `0` unless this prop is set to true.\n */\n showZero?: boolean;\n\n /**\n * Badge variant\n */\n variant?: 'dot' | 'standard';\n }\n\n const props = withDefaults(defineProps<BadgeProps>(), {\n animate: false,\n color: 'red',\n content: undefined,\n isDisabled: false,\n max: 99,\n position: 'top-right',\n offset: () => ({\n top: undefined,\n right: undefined,\n }),\n showZero: false,\n variant: 'standard',\n });\n\n const computedContent = computed(() => {\n const numericContent = parseInt(props.content as string, 10);\n const numericMax = parseInt(props.max as string, 10);\n // We want to compare the values, not the types, so it's okay to use `!=` here. i.e. if '23' = 23, then we know\n // the props are numbers, and we can compare the values. If you pass '23foobar' parseInt will return still return 23\n // but this check will fail like we want it to.\n // eslint-disable-next-line eqeqeq\n if (numericContent != props.content || numericMax != props.max) {\n return props.content;\n }\n\n return numericContent > numericMax ? `${numericMax}+` : numericContent;\n });\n\n const formatOffsetStyleValue = (value: number) => (value === 0 ? '0' : `${value}px`);\n\n const computedOffsetStyle = computed(() => ({\n top: props.offset.top !== undefined ? formatOffsetStyleValue(props.offset.top) : undefined,\n right: props.offset.right !== undefined ? formatOffsetStyleValue(props.offset.right) : undefined,\n }));\n\n const playAnimation = ref(false);\n\n watch(\n () => props.content,\n (value, oldValue) => {\n if (!props.animate) {\n return;\n }\n\n if (oldValue !== value) {\n playAnimation.value = true;\n\n setTimeout(() => {\n playAnimation.value = false;\n }, 1000);\n }\n },\n );\n</script>\n\n<template>\n <span class=\"stash-badge tw-relative tw-inline-block\" data-test=\"stash-badge\">\n <slot />\n <span\n v-show=\"props.variant === 'dot' || computedContent || (computedContent === 0 && props.showZero)\"\n data-test=\"stash-badge|content-wrapper\"\n :class=\"[\n {\n [classes['top-right']]: props.position === 'top-right' && props.variant !== 'dot',\n 'tw-absolute': props.variant === 'dot' || props.position === 'top-right',\n 'tw-ml-1.5': props.position === 'inline',\n },\n ]\"\n :style=\"props.variant === 'dot' || props.position === 'top-right' ? computedOffsetStyle : ''\"\n >\n <span\n data-test=\"stash-badge|content\"\n class=\"tw-inline-block tw-whitespace-nowrap tw-rounded-full tw-text-center tw-text-[10px] tw-font-semibold tw-leading-4 tw-text-white\"\n :class=\"[\n {\n 'tw-animate-grow': playAnimation,\n 'tw-bg-red-500': props.color === 'red' && !props.isDisabled,\n 'tw-bg-blue-500': props.color === 'blue' && !props.isDisabled,\n 'tw-absolute': props.variant === 'dot',\n 'tw-bg-ice-200 tw-text-white': props.isDisabled,\n [classes['badge-dot']]: props.variant === 'dot',\n [classes['badge-standard']]: props.variant === 'standard',\n 'tw-px-1.5': props.variant !== 'dot',\n },\n ]\"\n >\n {{ props.variant === 'dot' ? null : computedContent }}\n </span>\n </span>\n </span>\n</template>\n\n<style module>\n .badge-standard {\n height: 15px;\n vertical-align: middle;\n }\n\n .badge-dot {\n border: 2px solid var(--color-ice-100);\n height: 10px;\n right: 0;\n width: 10px;\n }\n\n .top-right {\n top: 0;\n right: 0;\n transform: translateX(50%) translateY(-48%);\n }\n</style>\n"],"names":["classes","useCssModule","props","__props","computedContent","computed","numericContent","numericMax","formatOffsetStyleValue","value","computedOffsetStyle","playAnimation","ref","watch","oldValue"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAOE,UAAMA,IAAUC,EAAA,GAwDVC,IAAQC,GAeRC,IAAkBC,EAAS,MAAM;AACrC,YAAMC,IAAiB,SAASJ,EAAM,SAAmB,EAAE,GACrDK,IAAa,SAASL,EAAM,KAAe,EAAE;AAKnD,aAAII,KAAkBJ,EAAM,WAAWK,KAAcL,EAAM,MAClDA,EAAM,UAGRI,IAAiBC,IAAa,GAAGA,CAAU,MAAMD;AAAA,IAC1D,CAAC,GAEKE,IAAyB,CAACC,MAAmBA,MAAU,IAAI,MAAM,GAAGA,CAAK,MAEzEC,IAAsBL,EAAS,OAAO;AAAA,MAC1C,KAAKH,EAAM,OAAO,QAAQ,SAAYM,EAAuBN,EAAM,OAAO,GAAG,IAAI;AAAA,MACjF,OAAOA,EAAM,OAAO,UAAU,SAAYM,EAAuBN,EAAM,OAAO,KAAK,IAAI;AAAA,IAAA,EACvF,GAEIS,IAAgBC,EAAI,EAAK;AAE/B,WAAAC;AAAA,MACE,MAAMX,EAAM;AAAA,MACZ,CAACO,GAAOK,MAAa;AACnB,QAAKZ,EAAM,WAIPY,MAAaL,MACfE,EAAc,QAAQ,IAEtB,WAAW,MAAM;AACf,UAAAA,EAAc,QAAQ;AAAA,QACxB,GAAG,GAAI;AAAA,MAEX;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Badge.js","sources":["../src/components/Badge/Badge.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n import { computed, ref, useCssModule, watch } from 'vue';\n\n defineOptions({\n name: 'll-badge',\n });\n\n const classes = useCssModule();\n\n export interface BadgeProps {\n /**\n * If true, the badge will animate when the content changes\n */\n animate?: boolean;\n\n /**\n * Color of the badge\n * Options: 'red' or 'blue'\n */\n color?: 'red' | 'blue';\n\n /**\n * The badge's content\n */\n content?: number | string;\n\n /**\n * Shows a gray badge with content\n */\n isDisabled?: boolean;\n\n /**\n * The max value of the `content` prop. If the value is greater than this, the badge will show the max value and a `+` sign.\n */\n max?: number | string;\n\n /**\n * Offset to adjust the badge's position. It does not apply to inline position badges.\n */\n offset?: {\n top?: number;\n right?: number;\n };\n\n /**\n * Badge position. Options:\n *\n * - inline: shows the badge directly next to the content (on the right), with a left margin of 6px\n * - top-right: will overlap the badge over whatever is passed in the default slot\n */\n position?: 'top-right' | 'inline';\n\n /**\n * The badge will be hidden if the content is `0` unless this prop is set to true.\n */\n showZero?: boolean;\n\n /**\n * Badge variant\n */\n variant?: 'dot' | 'standard';\n }\n\n const props = withDefaults(defineProps<BadgeProps>(), {\n animate: false,\n color: 'red',\n content: undefined,\n isDisabled: false,\n max: 99,\n position: 'top-right',\n offset: () => ({\n top: undefined,\n right: undefined,\n }),\n showZero: false,\n variant: 'standard',\n });\n\n const computedContent = computed(() => {\n const numericContent = parseInt(props.content as string, 10);\n const numericMax = parseInt(props.max as string, 10);\n // We want to compare the values, not the types, so it's okay to use `!=` here. i.e. if '23' = 23, then we know\n // the props are numbers, and we can compare the values. If you pass '23foobar' parseInt will return still return 23\n // but this check will fail like we want it to.\n // eslint-disable-next-line eqeqeq\n if (numericContent != props.content || numericMax != props.max) {\n return props.content;\n }\n\n return numericContent > numericMax ? `${numericMax}+` : numericContent;\n });\n\n const formatOffsetStyleValue = (value: number) => (value === 0 ? '0' : `${value}px`);\n\n const computedOffsetStyle = computed(() => ({\n top: props.offset.top !== undefined ? formatOffsetStyleValue(props.offset.top) : undefined,\n right: props.offset.right !== undefined ? formatOffsetStyleValue(props.offset.right) : undefined,\n }));\n\n const playAnimation = ref(false);\n\n watch(\n () => props.content,\n (value, oldValue) => {\n if (!props.animate) {\n return;\n }\n\n if (oldValue !== value) {\n playAnimation.value = true;\n\n setTimeout(() => {\n playAnimation.value = false;\n }, 1000);\n }\n },\n );\n</script>\n\n<template>\n <span class=\"stash-badge relative inline-block\" data-test=\"stash-badge\">\n <slot />\n <span\n v-show=\"props.variant === 'dot' || computedContent || (computedContent === 0 && props.showZero)\"\n data-test=\"stash-badge|content-wrapper\"\n :class=\"[\n {\n [classes['top-right']]: props.position === 'top-right' && props.variant !== 'dot',\n absolute: props.variant === 'dot' || props.position === 'top-right',\n 'ml-1.5': props.position === 'inline',\n },\n ]\"\n :style=\"props.variant === 'dot' || props.position === 'top-right' ? computedOffsetStyle : ''\"\n >\n <span\n data-test=\"stash-badge|content\"\n class=\"inline-block whitespace-nowrap rounded-full text-center text-[10px] font-semibold leading-4 text-white\"\n :class=\"[\n {\n 'animate-grow': playAnimation,\n 'bg-red-500': props.color === 'red' && !props.isDisabled,\n 'bg-blue-500': props.color === 'blue' && !props.isDisabled,\n absolute: props.variant === 'dot',\n 'bg-ice-200 text-white': props.isDisabled,\n [classes['badge-dot']]: props.variant === 'dot',\n [classes['badge-standard']]: props.variant === 'standard',\n 'px-1.5': props.variant !== 'dot',\n },\n ]\"\n >\n {{ props.variant === 'dot' ? null : computedContent }}\n </span>\n </span>\n </span>\n</template>\n\n<style module>\n @layer utilities {\n .badge-standard {\n height: 15px;\n vertical-align: middle;\n }\n\n .badge-dot {\n border: 2px solid var(--color-ice-100);\n height: 10px;\n right: 0;\n width: 10px;\n }\n\n .top-right {\n top: 0;\n right: 0;\n transform: translateX(50%) translateY(-48%);\n }\n }\n</style>\n"],"names":["classes","useCssModule","props","__props","computedContent","computed","numericContent","numericMax","formatOffsetStyleValue","value","computedOffsetStyle","playAnimation","ref","watch","oldValue"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAOE,UAAMA,IAAUC,EAAA,GAwDVC,IAAQC,GAeRC,IAAkBC,EAAS,MAAM;AACrC,YAAMC,IAAiB,SAASJ,EAAM,SAAmB,EAAE,GACrDK,IAAa,SAASL,EAAM,KAAe,EAAE;AAKnD,aAAII,KAAkBJ,EAAM,WAAWK,KAAcL,EAAM,MAClDA,EAAM,UAGRI,IAAiBC,IAAa,GAAGA,CAAU,MAAMD;AAAA,IAC1D,CAAC,GAEKE,IAAyB,CAACC,MAAmBA,MAAU,IAAI,MAAM,GAAGA,CAAK,MAEzEC,IAAsBL,EAAS,OAAO;AAAA,MAC1C,KAAKH,EAAM,OAAO,QAAQ,SAAYM,EAAuBN,EAAM,OAAO,GAAG,IAAI;AAAA,MACjF,OAAOA,EAAM,OAAO,UAAU,SAAYM,EAAuBN,EAAM,OAAO,KAAK,IAAI;AAAA,IAAA,EACvF,GAEIS,IAAgBC,EAAI,EAAK;AAE/B,WAAAC;AAAA,MACE,MAAMX,EAAM;AAAA,MACZ,CAACO,GAAOK,MAAa;AACnB,QAAKZ,EAAM,WAIPY,MAAaL,MACfE,EAAc,QAAQ,IAEtB,WAAW,MAAM;AACf,UAAAA,EAAc,QAAQ;AAAA,QACxB,GAAG,GAAI;AAAA,MAEX;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/Box.js CHANGED
@@ -1,4 +1,4 @@
1
- import { _ as f } from "./Box.vue_vue_type_script_setup_true_lang-rFnvwLVY.js";
1
+ import { _ as f } from "./Box.vue_vue_type_script_setup_true_lang-dFFZN40_.js";
2
2
  export {
3
3
  f as default
4
4
  };
@@ -11,11 +11,11 @@ const u = /* @__PURE__ */ s({
11
11
  setup(t) {
12
12
  const e = t;
13
13
  return (a, r) => (l(), o("section", {
14
- class: d(["stash-box tw-bg-white", {
15
- "tw-rounded": e.radius === "rounded",
16
- "tw-p-gutter": !e.disablePadding && !e.disableGutters,
17
- "tw-py-gutter": e.disableGutters,
18
- "tw-shadow": !e.disableElevation
14
+ class: d(["stash-box bg-white", {
15
+ rounded: e.radius === "rounded",
16
+ "p-gutter": !e.disablePadding && !e.disableGutters,
17
+ "py-gutter": e.disableGutters,
18
+ shadow: !e.disableElevation
19
19
  }]),
20
20
  "data-test": "stash-box"
21
21
  }, [
@@ -26,4 +26,4 @@ const u = /* @__PURE__ */ s({
26
26
  export {
27
27
  u as _
28
28
  };
29
- //# sourceMappingURL=Box.vue_vue_type_script_setup_true_lang-rFnvwLVY.js.map
29
+ //# sourceMappingURL=Box.vue_vue_type_script_setup_true_lang-dFFZN40_.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Box.vue_vue_type_script_setup_true_lang-rFnvwLVY.js","sources":["../src/components/Box/Box.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n defineOptions({\n name: 'll-box',\n });\n\n export interface BoxProps {\n /**\n * Remove the padding around the entire Box.\n */\n disablePadding?: boolean;\n\n /**\n * Remove the padding on the left and right of the Box.\n */\n disableGutters?: boolean;\n\n /**\n * Remove the padding on the left and right of the Box.\n */\n disableElevation?: boolean;\n\n /**\n * Border radius style. Defaults to `rounded`.\n */\n radius?: 'none' | 'rounded';\n }\n\n const props = withDefaults(defineProps<BoxProps>(), {\n disablePadding: false,\n disableGutters: false,\n disableElevation: false,\n radius: 'rounded',\n });\n</script>\n\n<template>\n <section\n class=\"stash-box tw-bg-white\"\n :class=\"{\n 'tw-rounded': props.radius === 'rounded',\n 'tw-p-gutter': !props.disablePadding && !props.disableGutters,\n 'tw-py-gutter': props.disableGutters,\n 'tw-shadow': !props.disableElevation,\n }\"\n data-test=\"stash-box\"\n >\n <!-- @slot default -->\n <slot></slot>\n </section>\n</template>\n"],"names":["props","__props"],"mappings":";;;;;;;;;;;AA2BE,UAAMA,IAAQC;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Box.vue_vue_type_script_setup_true_lang-dFFZN40_.js","sources":["../src/components/Box/Box.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n defineOptions({\n name: 'll-box',\n });\n\n export interface BoxProps {\n /**\n * Remove the padding around the entire Box.\n */\n disablePadding?: boolean;\n\n /**\n * Remove the padding on the left and right of the Box.\n */\n disableGutters?: boolean;\n\n /**\n * Remove the padding on the left and right of the Box.\n */\n disableElevation?: boolean;\n\n /**\n * Border radius style. Defaults to `rounded`.\n */\n radius?: 'none' | 'rounded';\n }\n\n const props = withDefaults(defineProps<BoxProps>(), {\n disablePadding: false,\n disableGutters: false,\n disableElevation: false,\n radius: 'rounded',\n });\n</script>\n\n<template>\n <section\n class=\"stash-box bg-white\"\n :class=\"{\n rounded: props.radius === 'rounded',\n 'p-gutter': !props.disablePadding && !props.disableGutters,\n 'py-gutter': props.disableGutters,\n shadow: !props.disableElevation,\n }\"\n data-test=\"stash-box\"\n >\n <!-- @slot default -->\n <slot></slot>\n </section>\n</template>\n"],"names":["props","__props"],"mappings":";;;;;;;;;;;AA2BE,UAAMA,IAAQC;;;;;;;;;;;;;;"}
package/dist/Button.js CHANGED
@@ -1,6 +1,6 @@
1
- import { defineComponent as c, useCssModule as d, computed as a, createBlock as s, openBlock as u, resolveDynamicComponent as f, mergeProps as h, unref as r, withCtx as p, renderSlot as y } from "vue";
1
+ import { defineComponent as c, useCssModule as d, computed as a, createBlock as s, openBlock as u, resolveDynamicComponent as f, mergeProps as p, unref as r, withCtx as y, renderSlot as v } from "vue";
2
2
  import m from "./Icon.js";
3
- import { _ as w } from "./_plugin-vue_export-helper-CHgC5LLL.js";
3
+ import { _ as h } from "./_plugin-vue_export-helper-CHgC5LLL.js";
4
4
  const q = /* @__PURE__ */ c({
5
5
  name: "ll-button",
6
6
  __name: "Button",
@@ -32,7 +32,7 @@ const q = /* @__PURE__ */ c({
32
32
  } : t.href ? {
33
33
  href: t.href
34
34
  } : {});
35
- return (o, B) => (u(), s(f(_.value), h({
35
+ return (o, $) => (u(), s(f(_.value), p({
36
36
  disabled: t.isLoading || t.disabled ? !0 : void 0
37
37
  }, b.value, {
38
38
  class: ["stash-button", [
@@ -47,32 +47,32 @@ const q = /* @__PURE__ */ c({
47
47
  ]],
48
48
  "data-test": "ll-button"
49
49
  }), {
50
- default: p(() => [
50
+ default: y(() => [
51
51
  t.isLoading ? (u(), s(m, {
52
52
  key: 0,
53
53
  name: "loading-empty",
54
- class: "tw-animate-spin"
55
- })) : y(o.$slots, "default", { key: 1 })
54
+ class: "animate-spin"
55
+ })) : v(o.$slots, "default", { key: 1 })
56
56
  ]),
57
57
  _: 3
58
58
  }, 16, ["disabled", "class"]));
59
59
  }
60
- }), g = "_button_4w1qh_2", v = {
60
+ }), g = "_button_v7aq8_5", L = {
61
61
  button: g,
62
- "button--solid": "_button--solid_4w1qh_36",
63
- "button--ghost": "_button--ghost_4w1qh_58",
64
- "button--primary": "_button--primary_4w1qh_81 _button--solid_4w1qh_36",
65
- "button--secondary": "_button--secondary_4w1qh_88 _button--ghost_4w1qh_58",
66
- "button--tertiary": "_button--tertiary_4w1qh_95 _button--ghost_4w1qh_58",
67
- "button--icon": "_button--icon_4w1qh_102",
68
- "button--iconLabel": "_button--iconLabel_4w1qh_103",
69
- "button--inline": "_button--inline_4w1qh_143",
70
- "button--blue": "_button--blue_4w1qh_161",
71
- "button--red": "_button--red_4w1qh_175"
72
- }, L = {
73
- $style: v
74
- }, I = /* @__PURE__ */ w(q, [["__cssModules", L]]);
62
+ "button--solid": "_button--solid_v7aq8_39",
63
+ "button--ghost": "_button--ghost_v7aq8_61",
64
+ "button--primary": "_button--primary_v7aq8_84 _button--solid_v7aq8_39",
65
+ "button--secondary": "_button--secondary_v7aq8_91 _button--ghost_v7aq8_61",
66
+ "button--tertiary": "_button--tertiary_v7aq8_98 _button--ghost_v7aq8_61",
67
+ "button--icon": "_button--icon_v7aq8_105",
68
+ "button--iconLabel": "_button--iconLabel_v7aq8_106",
69
+ "button--inline": "_button--inline_v7aq8_146",
70
+ "button--blue": "_button--blue_v7aq8_164",
71
+ "button--red": "_button--red_v7aq8_178"
72
+ }, B = {
73
+ $style: L
74
+ }, x = /* @__PURE__ */ h(q, [["__cssModules", B]]);
75
75
  export {
76
- I as default
76
+ x as default
77
77
  };
78
78
  //# sourceMappingURL=Button.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sources":["../src/components/Button/Button.vue"],"sourcesContent":["<script lang=\"ts\">\n export interface ButtonProps {\n /**\n * Renders the secondary variant\n */\n secondary?: boolean;\n\n /**\n * Renders the button as a container for an Icon\n */\n icon?: boolean;\n\n /**\n * Renders the button as a container for an IconLabel\n */\n iconLabel?: boolean;\n\n /**\n * Renders the tertiary variant\n */\n tertiary?: boolean;\n\n /**\n * Renders the component inline\n */\n inline?: boolean;\n\n /**\n * Renders a color variant\n */\n color?: 'blue' | 'red';\n\n /**\n * The `to` prop for vue-router's `RouterLink` component. If defined, the button will render as a `<router-link />`.\n */\n to?: RouteLocationRaw;\n\n /**\n * Button link. If defined, the button will render as an `<a />` tag.\n */\n href?: string;\n\n /**\n * Displays a spinning loading icon in place of the button text and disables the button\n */\n isLoading?: boolean;\n\n /**\n * Disables the button\n */\n disabled?: boolean;\n }\n</script>\n\n<script lang=\"ts\" setup>\n import { computed, useCssModule } from 'vue';\n import { RouteLocationRaw } from 'vue-router';\n\n import Icon from '../Icon/Icon.vue';\n\n defineOptions({\n name: 'll-button',\n });\n\n const props = withDefaults(defineProps<ButtonProps>(), {\n secondary: false,\n icon: false,\n iconLabel: false,\n tertiary: false,\n inline: false,\n color: undefined,\n href: '',\n to: undefined,\n isLoading: false,\n disabled: undefined,\n });\n const classes = useCssModule();\n\n enum ButtonTypes {\n Icon = 'icon',\n IconLabel = 'iconLabel',\n Secondary = 'secondary',\n Tertiary = 'tertiary',\n Inline = 'inline',\n Primary = 'primary',\n }\n\n type ButtonType = `${ButtonTypes}`;\n\n const buttonType = computed<ButtonType>(() => {\n for (const type of Object.values(ButtonTypes)) {\n if (props[type]) {\n return type;\n }\n }\n\n return ButtonTypes.Primary;\n });\n\n const is = computed(() => {\n if (props.to) {\n return 'router-link';\n }\n\n if (props.href) {\n return 'a';\n }\n\n return 'button';\n });\n\n const buttonAttrs = computed(() => {\n if (props.to) {\n return {\n to: props.to,\n };\n }\n\n if (props.href) {\n return {\n href: props.href,\n };\n }\n\n return {};\n });\n</script>\n\n<template>\n <component\n :is=\"is\"\n :disabled=\"props.isLoading || props.disabled ? true : undefined\"\n v-bind=\"buttonAttrs\"\n class=\"stash-button\"\n :class=\"[\n classes.button,\n `stash-button--${buttonType}`,\n classes[`button--${buttonType}`],\n {\n [`stash-button--${props.color}`]: props.color,\n [classes[`button--${props.color}`]]: props.color,\n 'stash-button--is-loading': props.isLoading,\n },\n ]\"\n data-test=\"ll-button\"\n >\n <Icon v-if=\"props.isLoading\" name=\"loading-empty\" class=\"tw-animate-spin\" />\n <!-- @slot default -->\n <slot v-else></slot>\n </component>\n</template>\n\n<style module>\n .button {\n border-radius: theme('borderRadius.DEFAULT');\n border-width: 1px;\n display: inline-block;\n font-size: 0.875rem;\n font-weight: theme('fontWeight.semibold');\n line-height: 2.125rem;\n margin: 0;\n min-width: 144px;\n padding: 0 theme('spacing.3');\n text-align: center;\n text-decoration: none;\n vertical-align: middle;\n white-space: nowrap;\n }\n\n @media screen('lg') {\n /* `focus` and `hover` should be added only for large screens */\n .button:focus {\n box-shadow: 0 0 0 3px rgb(0 123 255 / 14%);\n outline: none;\n }\n\n .button:hover {\n text-decoration: none;\n }\n }\n\n .button[disabled] {\n cursor: default;\n pointer-events: none;\n }\n\n /* Solid treatment */\n .button--solid {\n background-color: var(--button-color);\n border-color: transparent;\n color: var(--text-color);\n }\n\n @media screen('lg') {\n /* `hover` should be added only for large screens */\n .button--solid:hover {\n background-color: var(--button-hover-color);\n }\n }\n\n .button--solid:active {\n background-color: var(--button-hover-color);\n }\n\n .button--solid[disabled]:not(:global(.stash-button--is-loading)) {\n --button-color: var(--color-ice-500) !important;\n }\n\n /* Ghost treatment */\n .button--ghost {\n background-color: rgb(0 0 0 / 0%);\n border-color: var(--button-color);\n color: var(--text-color);\n }\n\n @media screen('lg') {\n /* `hover` should be added only for large screens */\n .button--ghost:hover {\n background-color: var(--button-hover-color);\n }\n }\n\n .button--ghost:active {\n background-color: var(--button-hover-color);\n }\n\n .button--ghost[disabled]:not(:global(.stash-button--is-loading)) {\n --button-color: var(--color-ice-500) !important;\n --text-color: var(--color-ice-500) !important;\n }\n\n /* Types */\n .button--primary {\n composes: button--solid;\n --button-color: var(--color-blue-500);\n --button-hover-color: var(--color-blue-hover);\n --text-color: var(--color-white);\n }\n\n .button--secondary {\n composes: button--ghost;\n --button-color: var(--color-ice-500);\n --button-hover-color: var(--color-ice-700-hover);\n --text-color: var(--color-ice-700);\n }\n\n .button--tertiary {\n composes: button--ghost;\n --button-color: var(--color-white);\n --button-hover-color: var(--color-white-hover);\n --text-color: var(--color-white);\n }\n\n .button--icon,\n .button--iconLabel {\n /* https://developers.google.com/web/fundamentals/accessibility/accessible-styles */\n border: 0;\n border-radius: theme('borderRadius.DEFAULT');\n height: theme('spacing.12');\n min-width: theme('spacing.12');\n text-decoration: none;\n }\n\n .button--icon {\n padding: theme('spacing.3');\n width: theme('spacing.12');\n }\n\n .button--iconLabel {\n padding: 0;\n width: unset;\n }\n\n @media screen('lg') {\n /* `hover` should be added only for large screens */\n .button--icon:hover,\n .button--iconLabel:hover {\n text-decoration: none;\n }\n }\n\n .button--icon svg,\n .button--iconLabel svg {\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n\n .button--icon[disabled]:not(:global(.stash-button--is-loading)) svg,\n .button--iconLabel[disabled]:not(:global(.stash-button--is-loading)),\n .button--iconLabel[disabled]:not(:global(.stash-button--is-loading)) svg {\n color: var(--color-ice-500);\n }\n\n .button--inline {\n border: 0;\n color: var(--color-blue-500);\n font-weight: theme('fontWeight.medium');\n line-height: 1.5;\n min-width: 0;\n padding: 0;\n }\n\n .button--inline:hover {\n text-decoration: underline;\n }\n\n .button--inline[disabled] {\n color: var(--color-ice-500);\n }\n\n /* Colors */\n .button--blue.button--primary,\n .button--blue.button--secondary {\n --button-color: var(--color-blue-500);\n }\n\n .button--blue.button--primary {\n --button-hover-color: var(--color-blue-hover);\n }\n\n .button--blue.button--secondary {\n --text-color: var(--color-blue-500);\n --button-hover-color: var(--button-secondary-blue-hover);\n }\n\n .button--red.button--primary,\n .button--red.button--secondary {\n --button-color: var(--color-red-500);\n }\n\n .button--red.button--primary {\n --button-hover-color: var(--color-red-hover);\n }\n\n .button--red.button--secondary {\n --text-color: var(--color-red-500);\n --button-hover-color: var(--button-secondary-red-hover);\n }\n\n /**\n * Button Grid\n * TODO: Move into separate component\n * https://leaflink.atlassian.net/browse/STASH-230\n * See `styles/elements/_buttons.scss` for button-grid (parent element) specific styles.\n */\n :global(.button-grid) > .button,\n :global(.header-button-grid) > .button {\n width: 50%;\n }\n\n :global(.button-grid) > .button + .button {\n margin-left: theme('spacing.6');\n }\n\n @media screen('md') {\n :global(.button-grid) > .button {\n width: auto;\n }\n }\n\n :global(.header-button-grid) > .button + .button {\n margin-left: theme('spacing.6');\n }\n\n @media screen('lg') {\n :global(.header-button-grid) > .button {\n width: auto;\n }\n }\n</style>\n"],"names":["props","__props","classes","useCssModule","ButtonTypes","buttonType","computed","type","is","buttonAttrs"],"mappings":";;;;;;;;;;;;;;;;;;;AAgEE,UAAMA,IAAQC,GAYRC,IAAUC,EAAA;AAEhB,QAAKC;AAAL,KAAA,CAAKA,MAAL;AACEA,MAAAA,EAAA,OAAO,QACPA,EAAA,YAAY,aACZA,EAAA,YAAY,aACZA,EAAA,WAAW,YACXA,EAAA,SAAS,UACTA,EAAA,UAAU;AAAA,IAAA,GANPA,MAAAA,IAAA,CAAA,EAAA;AAWL,UAAMC,IAAaC,EAAqB,MAAM;AAC5C,iBAAWC,KAAQ,OAAO,OAAOH,CAAW;AAC1C,YAAIJ,EAAMO,CAAI;AACZ,iBAAOA;AAIX,aAAO;AAAA,IACT,CAAC,GAEKC,IAAKF,EAAS,MACdN,EAAM,KACD,gBAGLA,EAAM,OACD,MAGF,QACR,GAEKS,IAAcH,EAAS,MACvBN,EAAM,KACD;AAAA,MACL,IAAIA,EAAM;AAAA,IAAA,IAIVA,EAAM,OACD;AAAA,MACL,MAAMA,EAAM;AAAA,IAAA,IAIT,CAAA,CACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Button.js","sources":["../src/components/Button/Button.vue"],"sourcesContent":["<script lang=\"ts\">\n export interface ButtonProps {\n /**\n * Renders the secondary variant\n */\n secondary?: boolean;\n\n /**\n * Renders the button as a container for an Icon\n */\n icon?: boolean;\n\n /**\n * Renders the button as a container for an IconLabel\n */\n iconLabel?: boolean;\n\n /**\n * Renders the tertiary variant\n */\n tertiary?: boolean;\n\n /**\n * Renders the component inline\n */\n inline?: boolean;\n\n /**\n * Renders a color variant\n */\n color?: 'blue' | 'red';\n\n /**\n * The `to` prop for vue-router's `RouterLink` component. If defined, the button will render as a `<router-link />`.\n */\n to?: RouteLocationRaw;\n\n /**\n * Button link. If defined, the button will render as an `<a />` tag.\n */\n href?: string;\n\n /**\n * Displays a spinning loading icon in place of the button text and disables the button\n */\n isLoading?: boolean;\n\n /**\n * Disables the button\n */\n disabled?: boolean;\n }\n</script>\n\n<script lang=\"ts\" setup>\n import { computed, useCssModule } from 'vue';\n import { RouteLocationRaw } from 'vue-router';\n\n import Icon from '../Icon/Icon.vue';\n\n defineOptions({\n name: 'll-button',\n });\n\n const props = withDefaults(defineProps<ButtonProps>(), {\n secondary: false,\n icon: false,\n iconLabel: false,\n tertiary: false,\n inline: false,\n color: undefined,\n href: '',\n to: undefined,\n isLoading: false,\n disabled: undefined,\n });\n const classes = useCssModule();\n\n enum ButtonTypes {\n Icon = 'icon',\n IconLabel = 'iconLabel',\n Secondary = 'secondary',\n Tertiary = 'tertiary',\n Inline = 'inline',\n Primary = 'primary',\n }\n\n type ButtonType = `${ButtonTypes}`;\n\n const buttonType = computed<ButtonType>(() => {\n for (const type of Object.values(ButtonTypes)) {\n if (props[type]) {\n return type;\n }\n }\n\n return ButtonTypes.Primary;\n });\n\n const is = computed(() => {\n if (props.to) {\n return 'router-link';\n }\n\n if (props.href) {\n return 'a';\n }\n\n return 'button';\n });\n\n const buttonAttrs = computed(() => {\n if (props.to) {\n return {\n to: props.to,\n };\n }\n\n if (props.href) {\n return {\n href: props.href,\n };\n }\n\n return {};\n });\n</script>\n\n<template>\n <component\n :is=\"is\"\n :disabled=\"props.isLoading || props.disabled ? true : undefined\"\n v-bind=\"buttonAttrs\"\n class=\"stash-button\"\n :class=\"[\n classes.button,\n `stash-button--${buttonType}`,\n classes[`button--${buttonType}`],\n {\n [`stash-button--${props.color}`]: props.color,\n [classes[`button--${props.color}`]]: props.color,\n 'stash-button--is-loading': props.isLoading,\n },\n ]\"\n data-test=\"ll-button\"\n >\n <Icon v-if=\"props.isLoading\" name=\"loading-empty\" class=\"animate-spin\" />\n <!-- @slot default -->\n <slot v-else></slot>\n </component>\n</template>\n\n<style module>\n @reference \"../../../styles/main.css\";\n\n @layer utilities {\n .button {\n border-radius: var(--radius-sm);\n border-width: 1px;\n display: inline-block;\n font-size: 0.875rem;\n font-weight: var(--font-weight-semibold);\n line-height: 2.125rem;\n margin: 0;\n min-width: 144px;\n padding: 0 --spacing(3);\n text-align: center;\n text-decoration: none;\n vertical-align: middle;\n white-space: nowrap;\n }\n\n @media (width >= theme(--breakpoint-lg)) {\n /* `focus` and `hover` should be added only for large screens */\n .button:focus {\n box-shadow: 0 0 0 3px rgb(0 123 255 / 14%);\n outline: none;\n }\n\n .button:hover {\n text-decoration: none;\n }\n }\n\n .button[disabled] {\n cursor: default;\n pointer-events: none;\n }\n\n /* Solid treatment */\n .button--solid {\n background-color: var(--button-color);\n border-color: transparent;\n color: var(--text-color);\n }\n\n @media (width >= theme(--breakpoint-lg)) {\n /* `hover` should be added only for large screens */\n .button--solid:hover {\n background-color: var(--button-hover-color);\n }\n }\n\n .button--solid:active {\n background-color: var(--button-hover-color);\n }\n\n .button--solid[disabled]:not(:global(.stash-button--is-loading)) {\n --button-color: var(--color-ice-500) !important;\n }\n\n /* Ghost treatment */\n .button--ghost {\n background-color: rgb(0 0 0 / 0%);\n border-color: var(--button-color);\n color: var(--text-color);\n }\n\n @media (width >= theme(--breakpoint-lg)) {\n /* `hover` should be added only for large screens */\n .button--ghost:hover {\n background-color: var(--button-hover-color);\n }\n }\n\n .button--ghost:active {\n background-color: var(--button-hover-color);\n }\n\n .button--ghost[disabled]:not(:global(.stash-button--is-loading)) {\n --button-color: var(--color-ice-500) !important;\n --text-color: var(--color-ice-500) !important;\n }\n\n /* Types */\n .button--primary {\n composes: button--solid;\n --button-color: var(--color-blue-500);\n --button-hover-color: var(--color-blue-hover);\n --text-color: var(--color-white);\n }\n\n .button--secondary {\n composes: button--ghost;\n --button-color: var(--color-ice-500);\n --button-hover-color: var(--color-ice-700-hover);\n --text-color: var(--color-ice-700);\n }\n\n .button--tertiary {\n composes: button--ghost;\n --button-color: var(--color-white);\n --button-hover-color: var(--color-white-hover);\n --text-color: var(--color-white);\n }\n\n .button--icon,\n .button--iconLabel {\n /* https://developers.google.com/web/fundamentals/accessibility/accessible-styles */\n border: 0;\n border-radius: var(--radius-sm);\n height: --spacing(12);\n min-width: --spacing(12);\n text-decoration: none;\n }\n\n .button--icon {\n padding: --spacing(3);\n width: --spacing(12);\n }\n\n .button--iconLabel {\n padding: 0;\n width: unset;\n }\n\n @media (width >= theme(--breakpoint-lg)) {\n /* `hover` should be added only for large screens */\n .button--icon:hover,\n .button--iconLabel:hover {\n text-decoration: none;\n }\n }\n\n .button--icon svg,\n .button--iconLabel svg {\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n\n .button--icon[disabled]:not(:global(.stash-button--is-loading)) svg,\n .button--iconLabel[disabled]:not(:global(.stash-button--is-loading)),\n .button--iconLabel[disabled]:not(:global(.stash-button--is-loading)) svg {\n color: var(--color-ice-500);\n }\n\n .button--inline {\n border: 0;\n color: var(--color-blue-500);\n font-weight: var(--font-weight-medium);\n line-height: 1.5;\n min-width: 0;\n padding: 0;\n }\n\n .button--inline:hover {\n text-decoration: underline;\n }\n\n .button--inline[disabled] {\n color: var(--color-ice-500);\n }\n\n /* Colors */\n .button--blue.button--primary,\n .button--blue.button--secondary {\n --button-color: var(--color-blue-500);\n }\n\n .button--blue.button--primary {\n --button-hover-color: var(--color-blue-hover);\n }\n\n .button--blue.button--secondary {\n --text-color: var(--color-blue-500);\n --button-hover-color: var(--button-secondary-blue-hover);\n }\n\n .button--red.button--primary,\n .button--red.button--secondary {\n --button-color: var(--color-red-500);\n }\n\n .button--red.button--primary {\n --button-hover-color: var(--color-red-hover);\n }\n\n .button--red.button--secondary {\n --text-color: var(--color-red-500);\n --button-hover-color: var(--button-secondary-red-hover);\n }\n\n /**\n * Button Grid\n * TODO: Move into separate component\n * https://leaflink.atlassian.net/browse/STASH-230\n * See `styles/elements/_buttons.scss` for button-grid (parent element) specific styles.\n */\n :global(.button-grid) > .button,\n :global(.header-button-grid) > .button {\n width: 50%;\n }\n\n :global(.button-grid) > .button + .button {\n margin-left: --spacing(6);\n }\n\n @media (width >= theme(--breakpoint-md)) {\n :global(.button-grid) > .button {\n width: auto;\n }\n }\n\n :global(.header-button-grid) > .button + .button {\n margin-left: --spacing(6);\n }\n\n @media (width >= theme(--breakpoint-lg)) {\n :global(.header-button-grid) > .button {\n width: auto;\n }\n }\n }\n</style>\n"],"names":["props","__props","classes","useCssModule","ButtonTypes","buttonType","computed","type","is","buttonAttrs"],"mappings":";;;;;;;;;;;;;;;;;;;AAgEE,UAAMA,IAAQC,GAYRC,IAAUC,EAAA;AAEhB,QAAKC;AAAL,KAAA,CAAKA,MAAL;AACEA,MAAAA,EAAA,OAAO,QACPA,EAAA,YAAY,aACZA,EAAA,YAAY,aACZA,EAAA,WAAW,YACXA,EAAA,SAAS,UACTA,EAAA,UAAU;AAAA,IAAA,GANPA,MAAAA,IAAA,CAAA,EAAA;AAWL,UAAMC,IAAaC,EAAqB,MAAM;AAC5C,iBAAWC,KAAQ,OAAO,OAAOH,CAAW;AAC1C,YAAIJ,EAAMO,CAAI;AACZ,iBAAOA;AAIX,aAAO;AAAA,IACT,CAAC,GAEKC,IAAKF,EAAS,MACdN,EAAM,KACD,gBAGLA,EAAM,OACD,MAGF,QACR,GAEKS,IAAcH,EAAS,MACvBN,EAAM,KACD;AAAA,MACL,IAAIA,EAAM;AAAA,IAAA,IAIVA,EAAM,OACD;AAAA,MACL,MAAMA,EAAM;AAAA,IAAA,IAIT,CAAA,CACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,12 +1,12 @@
1
- import { defineComponent as m, computed as r, ref as g, createElementBlock as l, openBlock as s, normalizeClass as p, Fragment as $, renderList as y, withModifiers as B, toDisplayString as h } from "vue";
2
- import w from "lodash-es/uniqueId";
3
- import { _ as z } from "./_plugin-vue_export-helper-CHgC5LLL.js";
4
- const k = ["data-test"], C = ["data-test", "disabled", "onClick"], G = {
1
+ import { defineComponent as b, computed as r, ref as g, createElementBlock as n, openBlock as l, normalizeClass as p, Fragment as $, renderList as y, withModifiers as B, toDisplayString as h } from "vue";
2
+ import j from "lodash-es/uniqueId";
3
+ import { _ as k } from "./_plugin-vue_export-helper-CHgC5LLL.js";
4
+ const C = ["data-test"], G = ["data-test", "disabled", "onClick"], w = {
5
5
  name: "ll-button-group"
6
- }, D = /* @__PURE__ */ m({
7
- ...G,
6
+ }, D = /* @__PURE__ */ b({
7
+ ...w,
8
8
  props: {
9
- groupName: { default: w() },
9
+ groupName: { default: j() },
10
10
  options: {},
11
11
  fullWidth: { type: Boolean, default: !1 },
12
12
  disabled: { type: Boolean, default: !1 },
@@ -14,43 +14,43 @@ const k = ["data-test"], C = ["data-test", "disabled", "onClick"], G = {
14
14
  },
15
15
  emits: ["input"],
16
16
  setup(v, { emit: _ }) {
17
- const e = v, f = _, u = r(() => e.options.length === 1), i = r(() => e.allowDeactivate || u.value), n = g(e.options.find((t) => t.active) || null);
18
- function b(t) {
19
- var o;
20
- i.value && ((o = n.value) == null ? void 0 : o.id) === t.id ? n.value = null : n.value = t, f("input", n.value);
17
+ const e = v, f = _, u = r(() => e.options.length === 1), i = r(() => e.allowDeactivate || u.value), a = g(e.options.find((t) => t.active) || null);
18
+ function m(t) {
19
+ var s;
20
+ i.value && ((s = a.value) == null ? void 0 : s.id) === t.id ? a.value = null : a.value = t, f("input", a.value);
21
21
  }
22
- return (t, o) => (s(), l("div", {
22
+ return (t, s) => (l(), n("div", {
23
23
  class: p([
24
- "tw-flex",
24
+ "flex",
25
25
  t.$style.buttonGroup,
26
- { "tw-w-full": e.fullWidth },
26
+ { "w-full": e.fullWidth },
27
27
  { [t.$style.single]: u.value },
28
28
  { [t.$style["can-deactivate"]]: i.value }
29
29
  ]),
30
30
  "data-test": `button-group-${t.$props.groupName}`
31
31
  }, [
32
- (s(!0), l($, null, y(e.options, (a) => {
32
+ (l(!0), n($, null, y(e.options, (o) => {
33
33
  var c, d;
34
- return s(), l("button", {
35
- key: `${e.groupName}-${a.id}`,
36
- class: p([t.$style.button, { [t.$style.active]: ((c = n.value) == null ? void 0 : c.id) === a.id }]),
37
- "data-test": `${e.groupName}-button-${((d = n.value) == null ? void 0 : d.id) === a.id ? "active" : "inactive"}`,
34
+ return l(), n("button", {
35
+ key: `${e.groupName}-${o.id}`,
36
+ class: p([t.$style.button, { [t.$style.active]: ((c = a.value) == null ? void 0 : c.id) === o.id }]),
37
+ "data-test": `${e.groupName}-button-${((d = a.value) == null ? void 0 : d.id) === o.id ? "active" : "inactive"}`,
38
38
  tabindex: 0,
39
39
  disabled: e.disabled,
40
- onClick: B((F) => b(a), ["prevent"])
41
- }, h(a.text), 11, C);
40
+ onClick: B((E) => m(o), ["prevent"])
41
+ }, h(o.text), 11, G);
42
42
  }), 128))
43
- ], 10, k));
43
+ ], 10, C));
44
44
  }
45
- }), N = "_buttonGroup_1bnlz_3", M = "_button_1bnlz_3", S = "_single_1bnlz_17", W = "_active_1bnlz_29", q = {
45
+ }), N = "_buttonGroup_189sj_4", M = "_button_189sj_4", S = "_single_189sj_18", W = "_active_189sj_30", q = {
46
46
  buttonGroup: N,
47
47
  button: M,
48
48
  single: S,
49
49
  active: W,
50
- "can-deactivate": "_can-deactivate_1bnlz_42"
51
- }, E = {
50
+ "can-deactivate": "_can-deactivate_189sj_43"
51
+ }, z = {
52
52
  $style: q
53
- }, x = /* @__PURE__ */ z(D, [["__cssModules", E]]);
53
+ }, x = /* @__PURE__ */ k(D, [["__cssModules", z]]);
54
54
  export {
55
55
  x as default
56
56
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ButtonGroup.js","sources":["../src/components/ButtonGroup/ButtonGroup.vue"],"sourcesContent":["<script lang=\"ts\">\n /**\n * @deprecated use RadioGroup instead with `variant=\"button\"`.\n * RadioGroup uses pretty much the same API as the ButtonGroup,\n * but every button is a radio element which makes more sense semantically.\n */\n export default {\n name: 'll-button-group',\n };\n</script>\n\n<script lang=\"ts\" setup>\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, ref } from 'vue';\n\n export interface ButtonGroupOption {\n id: string;\n active?: boolean;\n text: string;\n }\n\n export interface ButtonGroupProps {\n /**\n * A name for the group, useful when multiple ButtonGroups exist on the page\n */\n groupName?: string;\n\n /**\n * The list of buttons to render\n */\n options: ButtonGroupOption[];\n\n /**\n * Whether the group should expand to the parent's width\n */\n fullWidth?: boolean;\n\n /**\n * Whether the entire group should be disabled\n */\n disabled?: boolean;\n\n /**\n * Whether the active button can be deactivated\n */\n allowDeactivate?: boolean;\n }\n\n const props = withDefaults(defineProps<ButtonGroupProps>(), {\n groupName: uniqueId(),\n fullWidth: false,\n disabled: false,\n allowDeactivate: false,\n });\n\n const emit = defineEmits<{\n (e: 'input', activeButton: ButtonGroupOption | null): void;\n }>();\n\n const isSingleButton = computed(() => props.options.length === 1);\n\n const canDeactivate = computed(() => props.allowDeactivate || isSingleButton.value);\n\n const activeButton = ref(props.options.find((o) => o.active) || null);\n\n function onClick(clickedOption: ButtonGroupOption) {\n if (canDeactivate.value && activeButton.value?.id === clickedOption.id) {\n activeButton.value = null;\n } else {\n activeButton.value = clickedOption;\n }\n\n emit('input', activeButton.value);\n }\n</script>\n\n<template>\n <div\n :class=\"[\n 'tw-flex',\n $style.buttonGroup,\n { 'tw-w-full': props.fullWidth },\n { [$style.single]: isSingleButton },\n { [$style['can-deactivate']]: canDeactivate },\n ]\"\n :data-test=\"`button-group-${$props.groupName}`\"\n >\n <button\n v-for=\"option in props.options\"\n :key=\"`${props.groupName}-${option.id}`\"\n :class=\"[$style.button, { [$style.active]: activeButton?.id === option.id }]\"\n :data-test=\"`${props.groupName}-button-${activeButton?.id === option.id ? 'active' : 'inactive'}`\"\n :tabindex=\"0\"\n :disabled=\"props.disabled\"\n @click.prevent=\"onClick(option)\"\n >\n {{ option.text }}\n </button>\n </div>\n</template>\n\n<style module>\n /* full width buttons */\n .buttonGroup:global(.w-full) > button {\n flex: 1 1 50%;\n max-width: 100%;\n }\n\n .button {\n border: 1px solid var(--color-ice-500);\n border-radius: 0;\n font-weight: theme('fontWeight.semibold');\n line-height: theme('lineHeight.body');\n min-width: 100px;\n padding: 7px 8px;\n }\n\n .single .button {\n border: 1px solid var(--color-ice-700);\n color: var(--color-ice-700);\n }\n\n .button:focus,\n .button:hover {\n border: 1px solid var(--color-blue-500) !important;\n color: var(--color-blue-500);\n z-index: 1;\n }\n\n .button.active {\n background-color: var(--color-blue-100);\n border: 1px solid var(--color-blue-500) !important;\n color: var(--color-blue-500);\n cursor: default;\n z-index: 1;\n }\n\n .button.active + button {\n border-left: 1px solid transparent;\n }\n\n .single .button.active,\n .can-deactivate .button.active {\n cursor: pointer;\n }\n\n .button[disabled] {\n color: var(--color-ice-500);\n cursor: default;\n pointer-events: none;\n }\n\n .button:focus {\n box-shadow: none;\n outline: 0;\n }\n\n .button:not(:first-child) {\n margin-left: -1px;\n }\n\n .button:not(:last-child) {\n border-right: 1px solid transparent;\n }\n\n .button:first-child {\n border-bottom-left-radius: theme('borderRadius.DEFAULT');\n border-top-left-radius: theme('borderRadius.DEFAULT');\n }\n\n .button:last-child {\n border-bottom-right-radius: theme('borderRadius.DEFAULT');\n border-top-right-radius: theme('borderRadius.DEFAULT');\n }\n</style>\n"],"names":["__default__","props","__props","emit","__emit","isSingleButton","computed","canDeactivate","activeButton","ref","o","onClick","clickedOption","_a"],"mappings":";;;mEAMEA,IAAe;AAAA,EACb,MAAM;AACR;;;;;;;;;;;AAwCA,UAAMC,IAAQC,GAORC,IAAOC,GAIPC,IAAiBC,EAAS,MAAML,EAAM,QAAQ,WAAW,CAAC,GAE1DM,IAAgBD,EAAS,MAAML,EAAM,mBAAmBI,EAAe,KAAK,GAE5EG,IAAeC,EAAIR,EAAM,QAAQ,KAAK,CAACS,MAAMA,EAAE,MAAM,KAAK,IAAI;AAEpE,aAASC,EAAQC,GAAkC;;AACjD,MAAIL,EAAc,WAASM,IAAAL,EAAa,UAAb,gBAAAK,EAAoB,QAAOD,EAAc,KAClEJ,EAAa,QAAQ,OAErBA,EAAa,QAAQI,GAGvBT,EAAK,SAASK,EAAa,KAAK;AAAA,IAClC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"ButtonGroup.js","sources":["../src/components/ButtonGroup/ButtonGroup.vue"],"sourcesContent":["<script lang=\"ts\">\n /**\n * @deprecated use RadioGroup instead with `variant=\"button\"`.\n * RadioGroup uses pretty much the same API as the ButtonGroup,\n * but every button is a radio element which makes more sense semantically.\n */\n export default {\n name: 'll-button-group',\n };\n</script>\n\n<script lang=\"ts\" setup>\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, ref } from 'vue';\n\n export interface ButtonGroupOption {\n id: string;\n active?: boolean;\n text: string;\n }\n\n export interface ButtonGroupProps {\n /**\n * A name for the group, useful when multiple ButtonGroups exist on the page\n */\n groupName?: string;\n\n /**\n * The list of buttons to render\n */\n options: ButtonGroupOption[];\n\n /**\n * Whether the group should expand to the parent's width\n */\n fullWidth?: boolean;\n\n /**\n * Whether the entire group should be disabled\n */\n disabled?: boolean;\n\n /**\n * Whether the active button can be deactivated\n */\n allowDeactivate?: boolean;\n }\n\n const props = withDefaults(defineProps<ButtonGroupProps>(), {\n groupName: uniqueId(),\n fullWidth: false,\n disabled: false,\n allowDeactivate: false,\n });\n\n const emit = defineEmits<{\n (e: 'input', activeButton: ButtonGroupOption | null): void;\n }>();\n\n const isSingleButton = computed(() => props.options.length === 1);\n\n const canDeactivate = computed(() => props.allowDeactivate || isSingleButton.value);\n\n const activeButton = ref(props.options.find((o) => o.active) || null);\n\n function onClick(clickedOption: ButtonGroupOption) {\n if (canDeactivate.value && activeButton.value?.id === clickedOption.id) {\n activeButton.value = null;\n } else {\n activeButton.value = clickedOption;\n }\n\n emit('input', activeButton.value);\n }\n</script>\n\n<template>\n <div\n :class=\"[\n 'flex',\n $style.buttonGroup,\n { 'w-full': props.fullWidth },\n { [$style.single]: isSingleButton },\n { [$style['can-deactivate']]: canDeactivate },\n ]\"\n :data-test=\"`button-group-${$props.groupName}`\"\n >\n <button\n v-for=\"option in props.options\"\n :key=\"`${props.groupName}-${option.id}`\"\n :class=\"[$style.button, { [$style.active]: activeButton?.id === option.id }]\"\n :data-test=\"`${props.groupName}-button-${activeButton?.id === option.id ? 'active' : 'inactive'}`\"\n :tabindex=\"0\"\n :disabled=\"props.disabled\"\n @click.prevent=\"onClick(option)\"\n >\n {{ option.text }}\n </button>\n </div>\n</template>\n\n<style module>\n @layer utilities {\n /* full width buttons */\n .buttonGroup:global(.w-full) > button {\n flex: 1 1 50%;\n max-width: 100%;\n }\n\n .button {\n border: 1px solid var(--color-ice-500);\n border-radius: 0;\n font-weight: var(--font-weight-semibold);\n line-height: var(--line-height-body);\n min-width: 100px;\n padding: 7px 8px;\n }\n\n .single .button {\n border: 1px solid var(--color-ice-700);\n color: var(--color-ice-700);\n }\n\n .button:focus,\n .button:hover {\n border: 1px solid var(--color-blue-500) !important;\n color: var(--color-blue-500);\n z-index: 1;\n }\n\n .button.active {\n background-color: var(--color-blue-100);\n border: 1px solid var(--color-blue-500) !important;\n color: var(--color-blue-500);\n cursor: default;\n z-index: 1;\n }\n\n .button.active + button {\n border-left: 1px solid transparent;\n }\n\n .single .button.active,\n .can-deactivate .button.active {\n cursor: pointer;\n }\n\n .button[disabled] {\n color: var(--color-ice-500);\n cursor: default;\n pointer-events: none;\n }\n\n .button:focus {\n box-shadow: none;\n outline: 0;\n }\n\n .button:not(:first-child) {\n margin-left: -1px;\n }\n\n .button:not(:last-child) {\n border-right: 1px solid transparent;\n }\n\n .button:first-child {\n border-bottom-left-radius: var(--radius-sm);\n border-top-left-radius: var(--radius-sm);\n }\n\n .button:last-child {\n border-bottom-right-radius: var(--radius-sm);\n border-top-right-radius: var(--radius-sm);\n }\n }\n</style>\n"],"names":["__default__","props","__props","emit","__emit","isSingleButton","computed","canDeactivate","activeButton","ref","o","onClick","clickedOption","_a"],"mappings":";;;mEAMEA,IAAe;AAAA,EACb,MAAM;AACR;;;;;;;;;;;AAwCA,UAAMC,IAAQC,GAORC,IAAOC,GAIPC,IAAiBC,EAAS,MAAML,EAAM,QAAQ,WAAW,CAAC,GAE1DM,IAAgBD,EAAS,MAAML,EAAM,mBAAmBI,EAAe,KAAK,GAE5EG,IAAeC,EAAIR,EAAM,QAAQ,KAAK,CAACS,MAAMA,EAAE,MAAM,KAAK,IAAI;AAEpE,aAASC,EAAQC,GAAkC;;AACjD,MAAIL,EAAc,WAASM,IAAAL,EAAa,UAAb,gBAAAK,EAAoB,QAAOD,EAAc,KAClEJ,EAAa,QAAQ,OAErBA,EAAa,QAAQI,GAGvBT,EAAK,SAASK,EAAa,KAAK;AAAA,IAClC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/Card.js CHANGED
@@ -1,36 +1,36 @@
1
- import { defineComponent as w, useSlots as i, createElementBlock as a, openBlock as r, createCommentVNode as f, createElementVNode as s, unref as l, normalizeClass as n, renderSlot as o } from "vue";
2
- const p = {
3
- class: "stash-card tw-relative tw-inline-block tw-rounded tw-border tw-bg-white tw-shadow-md",
1
+ import { defineComponent as i, useSlots as f, createElementBlock as a, openBlock as r, createCommentVNode as p, createElementVNode as s, unref as l, normalizeClass as n, renderSlot as o } from "vue";
2
+ const u = {
3
+ class: "stash-card relative inline-block rounded border bg-white shadow-md",
4
4
  "data-test": "stash-card"
5
- }, h = /* @__PURE__ */ w({
5
+ }, b = /* @__PURE__ */ i({
6
6
  __name: "Card",
7
7
  props: {
8
8
  detachActions: { type: Boolean, default: !1 }
9
9
  },
10
10
  setup(d) {
11
- const c = d, t = i();
12
- return (e, u) => (r(), a("article", p, [
13
- l(t)["top-left"] || l(t)["top-right"] ? (r(), a("div", {
11
+ const c = d, e = f();
12
+ return (t, m) => (r(), a("article", u, [
13
+ l(e)["top-left"] || l(e)["top-right"] ? (r(), a("div", {
14
14
  key: 0,
15
15
  "data-test": "card-actions",
16
- class: n([{ "tw-absolute tw-top-0 tw-w-full": c.detachActions }, "tw-flex tw-flex-wrap tw-items-start tw-justify-between tw-p-6"])
16
+ class: n([{ "absolute top-0 w-full": c.detachActions }, "flex flex-wrap items-start justify-between p-6"])
17
17
  }, [
18
18
  s("div", null, [
19
- o(e.$slots, "top-left")
19
+ o(t.$slots, "top-left")
20
20
  ]),
21
21
  s("div", null, [
22
- o(e.$slots, "top-right")
22
+ o(t.$slots, "top-right")
23
23
  ])
24
- ], 2)) : f("", !0),
24
+ ], 2)) : p("", !0),
25
25
  s("div", {
26
- class: n({ "tw-mb-6 tw-flex tw-h-full tw-flex-col tw-gap-y-6": l(t).default })
26
+ class: n({ "mb-6 flex h-full flex-col gap-y-6": l(e).default })
27
27
  }, [
28
- o(e.$slots, "default")
28
+ o(t.$slots, "default")
29
29
  ], 2)
30
30
  ]));
31
31
  }
32
32
  });
33
33
  export {
34
- h as default
34
+ b as default
35
35
  };
36
36
  //# sourceMappingURL=Card.js.map
package/dist/Card.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Card.js","sources":["../src/components/Card/Card.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { useSlots } from 'vue';\n\n export interface CardProps {\n /**\n * Detach the actions from the top of the card, making them absolute-positioned.\n * @default false\n */\n detachActions?: boolean;\n }\n\n const props = withDefaults(defineProps<CardProps>(), {\n detachActions: false,\n });\n\n const slots = useSlots();\n</script>\n\n<template>\n <article\n class=\"stash-card tw-relative tw-inline-block tw-rounded tw-border tw-bg-white tw-shadow-md\"\n data-test=\"stash-card\"\n >\n <div\n v-if=\"slots['top-left'] || slots['top-right']\"\n data-test=\"card-actions\"\n :class=\"{ 'tw-absolute tw-top-0 tw-w-full': props.detachActions }\"\n class=\"tw-flex tw-flex-wrap tw-items-start tw-justify-between tw-p-6\"\n >\n <div>\n <!-- @slot Top left actions slot, for rendering content on the card top-left -->\n <slot name=\"top-left\"></slot>\n </div>\n <div>\n <!-- @slot Top right actions slot, for rendering content on the card top-right -->\n <slot name=\"top-right\"></slot>\n </div>\n </div>\n\n <div :class=\"{ 'tw-mb-6 tw-flex tw-h-full tw-flex-col tw-gap-y-6': slots['default'] }\">\n <!-- @slot Default slot, for rendering card subcomponents -->\n <slot></slot>\n </div>\n </article>\n</template>\n"],"names":["props","__props","slots","useSlots"],"mappings":";;;;;;;;;;AAWE,UAAMA,IAAQC,GAIRC,IAAQC,EAAA;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Card.js","sources":["../src/components/Card/Card.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { useSlots } from 'vue';\n\n export interface CardProps {\n /**\n * Detach the actions from the top of the card, making them absolute-positioned.\n * @default false\n */\n detachActions?: boolean;\n }\n\n const props = withDefaults(defineProps<CardProps>(), {\n detachActions: false,\n });\n\n const slots = useSlots();\n</script>\n\n<template>\n <article class=\"stash-card relative inline-block rounded border bg-white shadow-md\" data-test=\"stash-card\">\n <div\n v-if=\"slots['top-left'] || slots['top-right']\"\n data-test=\"card-actions\"\n :class=\"{ 'absolute top-0 w-full': props.detachActions }\"\n class=\"flex flex-wrap items-start justify-between p-6\"\n >\n <div>\n <!-- @slot Top left actions slot, for rendering content on the card top-left -->\n <slot name=\"top-left\"></slot>\n </div>\n <div>\n <!-- @slot Top right actions slot, for rendering content on the card top-right -->\n <slot name=\"top-right\"></slot>\n </div>\n </div>\n\n <div :class=\"{ 'mb-6 flex h-full flex-col gap-y-6': slots['default'] }\">\n <!-- @slot Default slot, for rendering card subcomponents -->\n <slot></slot>\n </div>\n </article>\n</template>\n"],"names":["props","__props","slots","useSlots"],"mappings":";;;;;;;;;;AAWE,UAAMA,IAAQC,GAIRC,IAAQC,EAAA;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,7 +1,7 @@
1
1
  import { createElementBlock as e, openBlock as o, renderSlot as n } from "vue";
2
2
  import { _ as r } from "./_plugin-vue_export-helper-CHgC5LLL.js";
3
3
  const s = {}, c = {
4
- class: "stash-card-content tw-px-6",
4
+ class: "stash-card-content px-6",
5
5
  "data-test": "stash-card-content"
6
6
  };
7
7
  function a(t, d) {
@@ -1 +1 @@
1
- {"version":3,"file":"CardContent.js","sources":["../src/components/CardContent/CardContent.vue"],"sourcesContent":["<template>\n <div class=\"stash-card-content tw-px-6\" data-test=\"stash-card-content\">\n <!-- @slot Default slot, for rendering any card content -->\n <slot></slot>\n </div>\n</template>\n"],"names":["_hoisted_1","_sfc_render","_ctx","_cache","_openBlock","_createElementBlock"],"mappings":";;cACOA,IAAM;AAAA,EAA6B,OAAA;AAAA;;AAAxC,SAAAC,EAAAC,GAAAC,GAAA;SAEEC,EAAa,GAAAC,EAAA,OAAAL,GAAA;AAAA;;;;"}
1
+ {"version":3,"file":"CardContent.js","sources":["../src/components/CardContent/CardContent.vue"],"sourcesContent":["<template>\n <div class=\"stash-card-content px-6\" data-test=\"stash-card-content\">\n <!-- @slot Default slot, for rendering any card content -->\n <slot></slot>\n </div>\n</template>\n"],"names":["_hoisted_1","_sfc_render","_ctx","_cache","_openBlock","_createElementBlock"],"mappings":";;cACOA,IAAM;AAAA,EAA0B,OAAA;AAAA;;AAArC,SAAAC,EAAAC,GAAAC,GAAA;SAEEC,EAAa,GAAAC,EAAA,OAAAL,GAAA;AAAA;;;;"}
@@ -1,7 +1,7 @@
1
1
  import { createElementBlock as o, openBlock as e, renderSlot as r } from "vue";
2
2
  import { _ as s } from "./_plugin-vue_export-helper-CHgC5LLL.js";
3
3
  const a = {}, c = {
4
- class: "stash-card-footer tw-px-6",
4
+ class: "stash-card-footer px-6",
5
5
  "data-test": "stash-card-footer"
6
6
  };
7
7
  function n(t, f) {
@@ -1 +1 @@
1
- {"version":3,"file":"CardFooter.js","sources":["../src/components/CardFooter/CardFooter.vue"],"sourcesContent":["<template>\n <footer class=\"stash-card-footer tw-px-6\" data-test=\"stash-card-footer\">\n <!-- @slot Default slot, for rendering any card footer content -->\n <slot></slot>\n </footer>\n</template>\n"],"names":["_hoisted_1","_sfc_render","_ctx","_cache","_openBlock","_createElementBlock"],"mappings":";;cACUA,IAAM;AAAA,EAA4B,OAAA;AAAA;;AAA1C,SAAAC,EAAAC,GAAAC,GAAA;SAEEC,EAAa,GAAAC,EAAA,UAAAL,GAAA;AAAA;;;;"}
1
+ {"version":3,"file":"CardFooter.js","sources":["../src/components/CardFooter/CardFooter.vue"],"sourcesContent":["<template>\n <footer class=\"stash-card-footer px-6\" data-test=\"stash-card-footer\">\n <!-- @slot Default slot, for rendering any card footer content -->\n <slot></slot>\n </footer>\n</template>\n"],"names":["_hoisted_1","_sfc_render","_ctx","_cache","_openBlock","_createElementBlock"],"mappings":";;cACUA,IAAM;AAAA,EAAyB,OAAA;AAAA;;AAAvC,SAAAC,EAAAC,GAAAC,GAAA;SAEEC,EAAa,GAAAC,EAAA,UAAAL,GAAA;AAAA;;;;"}
@@ -1,13 +1,13 @@
1
1
  import { defineComponent as r, createElementBlock as e, openBlock as s, createElementVNode as n, createCommentVNode as o, toDisplayString as a } from "vue";
2
2
  const d = {
3
- class: "stash-card-header tw-px-6 tw-font-medium tw-text-ice-900",
3
+ class: "stash-card-header px-6 font-medium text-ice-900",
4
4
  "data-test": "stash-card-header"
5
- }, i = { class: "tw-text-base" }, l = {
5
+ }, i = { class: "text-base" }, l = {
6
6
  key: 0,
7
- class: "tw-mb-0 tw-mt-1.5"
7
+ class: "mb-0 mt-1.5"
8
8
  }, m = {
9
9
  key: 1,
10
- class: "tw-mt-1.5 tw-text-ice-700"
10
+ class: "mt-1.5 text-ice-700"
11
11
  }, u = /* @__PURE__ */ r({
12
12
  __name: "CardHeader",
13
13
  props: {
@@ -1 +1 @@
1
- {"version":3,"file":"CardHeader.js","sources":["../src/components/CardHeader/CardHeader.vue"],"sourcesContent":["<script setup lang=\"ts\">\n export interface CardHeaderProps {\n /**\n * Title to be displayed\n */\n title: string;\n /**\n * Subtitle to be displayed\n */\n subtitle?: string;\n /**\n * Additional text to be displayed\n */\n text?: string;\n }\n\n const props = defineProps<CardHeaderProps>();\n</script>\n\n<template>\n <header class=\"stash-card-header tw-px-6 tw-font-medium tw-text-ice-900\" data-test=\"stash-card-header\">\n <h4 class=\"tw-text-base\">\n {{ props.title }}\n </h4>\n <p v-if=\"props.subtitle\" class=\"tw-mb-0 tw-mt-1.5\">\n {{ props.subtitle }}\n </p>\n <span v-if=\"props.text\" class=\"tw-mt-1.5 tw-text-ice-700\">\n {{ props.text }}\n </span>\n </header>\n</template>\n"],"names":["props","__props"],"mappings":";;;;;;;;;;;;;;;;;;AAgBE,UAAMA,IAAQC;;;;;;;;"}
1
+ {"version":3,"file":"CardHeader.js","sources":["../src/components/CardHeader/CardHeader.vue"],"sourcesContent":["<script setup lang=\"ts\">\n export interface CardHeaderProps {\n /**\n * Title to be displayed\n */\n title: string;\n /**\n * Subtitle to be displayed\n */\n subtitle?: string;\n /**\n * Additional text to be displayed\n */\n text?: string;\n }\n\n const props = defineProps<CardHeaderProps>();\n</script>\n\n<template>\n <header class=\"stash-card-header px-6 font-medium text-ice-900\" data-test=\"stash-card-header\">\n <h4 class=\"text-base\">\n {{ props.title }}\n </h4>\n <p v-if=\"props.subtitle\" class=\"mb-0 mt-1.5\">\n {{ props.subtitle }}\n </p>\n <span v-if=\"props.text\" class=\"mt-1.5 text-ice-700\">\n {{ props.text }}\n </span>\n </header>\n</template>\n"],"names":["props","__props"],"mappings":";;;;;;;;;;;;;;;;;;AAgBE,UAAMA,IAAQC;;;;;;;;"}