@leaflink/stash 44.0.0-beta.6 → 44.0.0-beta.8

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 (164) hide show
  1. package/README.md +107 -39
  2. package/dist/ActionsDropdown.js +2 -2
  3. package/dist/ActionsDropdown.js.map +1 -1
  4. package/dist/AddressSelect.js +2 -2
  5. package/dist/AppNavigationItem.js +1 -1
  6. package/dist/AppSidebar.js +13 -13
  7. package/dist/AppSidebar.js.map +1 -1
  8. package/dist/Badge.vue.d.ts +1 -1
  9. package/dist/Button.js +1 -1
  10. package/dist/Button.js.map +1 -1
  11. package/dist/Button.vue_used_vue_type_style_index_0_lang.module-63d31dc0.js +17 -0
  12. package/dist/Button.vue_used_vue_type_style_index_0_lang.module-63d31dc0.js.map +1 -0
  13. package/dist/ButtonGroup.js +19 -19
  14. package/dist/ButtonGroup.js.map +1 -1
  15. package/dist/Carousel.js +258 -246
  16. package/dist/Carousel.js.map +1 -1
  17. package/dist/Checkbox.js +57 -46
  18. package/dist/Checkbox.js.map +1 -1
  19. package/dist/Checkbox.vue.d.ts +2 -0
  20. package/dist/Checkbox.vue_used_vue_type_style_index_0_lang.module-fa8d9c06.js +9 -0
  21. package/dist/Checkbox.vue_used_vue_type_style_index_0_lang.module-fa8d9c06.js.map +1 -0
  22. package/dist/ChevronToggle.js +1 -1
  23. package/dist/Copy.js +1 -1
  24. package/dist/CurrencyInput.js +2 -2
  25. package/dist/DataView.js +1 -1
  26. package/dist/DataViewFilters.js +4 -4
  27. package/dist/DataViewSortButton.js +47 -38
  28. package/dist/DataViewSortButton.js.map +1 -1
  29. package/dist/DataViewToolbar.js +2 -2
  30. package/dist/DatePicker.js +9 -9
  31. package/dist/DatePicker.js.map +1 -1
  32. package/dist/DescriptionListTerm.js +1 -1
  33. package/dist/DescriptionListTerm.js.map +1 -1
  34. package/dist/Dialog.js +33 -33
  35. package/dist/Dialog.js.map +1 -1
  36. package/dist/Divider.js +4 -4
  37. package/dist/Divider.js.map +1 -1
  38. package/dist/Expand.js +1 -1
  39. package/dist/{Expand.vue_vue_type_script_setup_true_lang-5fe03d51.js → Expand.vue_vue_type_script_setup_true_lang-1751f4a6.js} +14 -15
  40. package/dist/Expand.vue_vue_type_script_setup_true_lang-1751f4a6.js.map +1 -0
  41. package/dist/Field.js +2 -2
  42. package/dist/Field.vue.d.ts +1 -1
  43. package/dist/{Field.vue_vue_type_script_setup_true_lang-4483019d.js → Field.vue_vue_type_script_setup_true_lang-42ba3c5a.js} +2 -2
  44. package/dist/Field.vue_vue_type_script_setup_true_lang-42ba3c5a.js.map +1 -0
  45. package/dist/FileUpload.js +7 -7
  46. package/dist/FileUpload.js.map +1 -1
  47. package/dist/FilterChip.js +30 -30
  48. package/dist/FilterChip.js.map +1 -1
  49. package/dist/FilterDropdown.js +2 -2
  50. package/dist/FilterSelect.js +27 -27
  51. package/dist/FilterSelect.js.map +1 -1
  52. package/dist/Filters.js +39 -39
  53. package/dist/Filters.js.map +1 -1
  54. package/dist/HttpError.js +6 -6
  55. package/dist/IconLabel.js +6 -6
  56. package/dist/IconLabel.js.map +1 -1
  57. package/dist/IconLabel.vue.d.ts +1 -1
  58. package/dist/Illustration.js +10 -60
  59. package/dist/Illustration.js.map +1 -1
  60. package/dist/Illustration.vue_vue_type_script_setup_true_lang-d6a94e17.js +56 -0
  61. package/dist/Illustration.vue_vue_type_script_setup_true_lang-d6a94e17.js.map +1 -0
  62. package/dist/Image.js +67 -72
  63. package/dist/Image.js.map +1 -1
  64. package/dist/InlineEdit.js +2 -2
  65. package/dist/Input.js +53 -53
  66. package/dist/Input.js.map +1 -1
  67. package/dist/InputOptions.js +2 -2
  68. package/dist/Label.js +1 -1
  69. package/dist/Label.vue.d.ts +13 -2
  70. package/dist/{Label.vue_vue_type_script_setup_true_lang-2de35913.js → Label.vue_vue_type_script_setup_true_lang-4b02087f.js} +12 -11
  71. package/dist/Label.vue_vue_type_script_setup_true_lang-4b02087f.js.map +1 -0
  72. package/dist/ListItem.js +11 -11
  73. package/dist/ListItem.js.map +1 -1
  74. package/dist/ListItemCell.js +9 -9
  75. package/dist/ListItemCell.js.map +1 -1
  76. package/dist/ListView.js +55 -52
  77. package/dist/ListView.js.map +1 -1
  78. package/dist/Loading.js +17 -10
  79. package/dist/Loading.js.map +1 -1
  80. package/dist/Loading.vue_used_vue_type_style_index_0_lang.module-ef5a3bc6.js +8 -0
  81. package/dist/Loading.vue_used_vue_type_style_index_0_lang.module-ef5a3bc6.js.map +1 -0
  82. package/dist/MenuItem.js +20 -14
  83. package/dist/MenuItem.js.map +1 -1
  84. package/dist/Modal.js +2 -2
  85. package/dist/Modal.js.map +1 -1
  86. package/dist/ObfuscateText.js +30 -32
  87. package/dist/ObfuscateText.js.map +1 -1
  88. package/dist/ObfuscateText.vue.d.ts +1 -1
  89. package/dist/PageContent.js +9 -9
  90. package/dist/PageContent.js.map +1 -1
  91. package/dist/PageHeader.js +22 -22
  92. package/dist/PageHeader.js.map +1 -1
  93. package/dist/PageNavigation.js +3 -3
  94. package/dist/PageNavigation.js.map +1 -1
  95. package/dist/Paginate.js +1 -1
  96. package/dist/Paginate.js.map +1 -1
  97. package/dist/Paginate.vue_used_vue_type_style_index_0_lang.module-18343da7.js +11 -0
  98. package/dist/Paginate.vue_used_vue_type_style_index_0_lang.module-18343da7.js.map +1 -0
  99. package/dist/QuickAction.js +22 -19
  100. package/dist/QuickAction.js.map +1 -1
  101. package/dist/Radio.js +30 -15
  102. package/dist/Radio.js.map +1 -1
  103. package/dist/RadioGroup.js +135 -106
  104. package/dist/RadioGroup.js.map +1 -1
  105. package/dist/RadioNew.js +118 -91
  106. package/dist/RadioNew.js.map +1 -1
  107. package/dist/SearchBar.js +32 -32
  108. package/dist/SearchBar.js.map +1 -1
  109. package/dist/Select.js +7 -7
  110. package/dist/Select.js.map +1 -1
  111. package/dist/SelectStatus.js +2 -2
  112. package/dist/Switch.js +41 -34
  113. package/dist/Switch.js.map +1 -1
  114. package/dist/Tab.js +2 -2
  115. package/dist/{Tab.vue_vue_type_script_setup_true_lang-4a40f015.js → Tab.vue_vue_type_script_setup_true_lang-69d1b046.js} +2 -2
  116. package/dist/{Tab.vue_vue_type_script_setup_true_lang-4a40f015.js.map → Tab.vue_vue_type_script_setup_true_lang-69d1b046.js.map} +1 -1
  117. package/dist/Table.js +6 -6
  118. package/dist/Table.keys-cf93df19.js +27 -0
  119. package/dist/{Table.keys-1ebe4ecb.js.map → Table.keys-cf93df19.js.map} +1 -1
  120. package/dist/TableCell.js +5 -5
  121. package/dist/TableCell.js.map +1 -1
  122. package/dist/TableHeaderCell.js +32 -32
  123. package/dist/TableHeaderCell.js.map +1 -1
  124. package/dist/TableHeaderRow.js +10 -10
  125. package/dist/TableHeaderRow.js.map +1 -1
  126. package/dist/TableRow.js +42 -41
  127. package/dist/TableRow.js.map +1 -1
  128. package/dist/Tabs.js +2 -2
  129. package/dist/{Tabs.vue_used_vue_type_style_index_0_lang.module-0af1e1cf.js → Tabs.vue_used_vue_type_style_index_0_lang.module-2a131332.js} +25 -25
  130. package/dist/Tabs.vue_used_vue_type_style_index_0_lang.module-2a131332.js.map +1 -0
  131. package/dist/Textarea.js +49 -41
  132. package/dist/Textarea.js.map +1 -1
  133. package/dist/Toast.js +23 -23
  134. package/dist/Toast.js.map +1 -1
  135. package/dist/components.css +1 -1
  136. package/dist/constants.d.ts +26 -19
  137. package/dist/constants.js +41 -26
  138. package/dist/constants.js.map +1 -1
  139. package/dist/index.js +1 -1
  140. package/dist/tailwind-base.d.ts +16 -16
  141. package/dist/tailwind-base.js +16 -6
  142. package/dist/tailwind-base.js.map +1 -1
  143. package/package.json +2 -2
  144. package/styles/backwards-compat.css +41 -104
  145. package/styles/base.css +258 -112
  146. package/tailwind-base.ts +6 -1
  147. package/dist/Button.vue_used_vue_type_style_index_0_lang.module-b2ee90e6.js +0 -17
  148. package/dist/Button.vue_used_vue_type_style_index_0_lang.module-b2ee90e6.js.map +0 -1
  149. package/dist/Checkbox.vue_vue_type_style_index_0_scoped_dbd26d7f_lang-4ed993c7.js +0 -2
  150. package/dist/Checkbox.vue_vue_type_style_index_0_scoped_dbd26d7f_lang-4ed993c7.js.map +0 -1
  151. package/dist/Expand.vue_vue_type_script_setup_true_lang-5fe03d51.js.map +0 -1
  152. package/dist/Field.vue_vue_type_script_setup_true_lang-4483019d.js.map +0 -1
  153. package/dist/Label.vue_vue_type_script_setup_true_lang-2de35913.js.map +0 -1
  154. package/dist/Loading.vue_vue_type_style_index_0_scoped_bb8d5f15_lang-4ed993c7.js +0 -2
  155. package/dist/Loading.vue_vue_type_style_index_0_scoped_bb8d5f15_lang-4ed993c7.js.map +0 -1
  156. package/dist/Paginate.vue_used_vue_type_style_index_0_lang.module-1a2084f9.js +0 -11
  157. package/dist/Paginate.vue_used_vue_type_style_index_0_lang.module-1a2084f9.js.map +0 -1
  158. package/dist/Table.keys-1ebe4ecb.js +0 -27
  159. package/dist/Tabs.vue_used_vue_type_style_index_0_lang.module-0af1e1cf.js.map +0 -1
  160. package/styles/_base.scss +0 -493
  161. package/styles/elements/_links.scss +0 -32
  162. package/styles/elements/_lists.scss +0 -31
  163. package/styles/elements/_misc.scss +0 -16
  164. package/styles/main.scss +0 -38
package/dist/TableRow.js CHANGED
@@ -1,23 +1,23 @@
1
- import { defineComponent as A, useAttrs as D, useCssModule as M, useSlots as V, inject as j, ref as P, computed as g, watch as q, openBlock as p, createElementBlock as k, Fragment as z, createElementVNode as F, mergeProps as y, unref as e, createBlock as C, normalizeClass as c, withCtx as m, createVNode as w, createCommentVNode as x, renderSlot as S } from "vue";
1
+ import { defineComponent as A, useAttrs as D, useCssModule as M, useSlots as V, inject as j, ref as P, computed as k, watch as q, openBlock as c, createElementBlock as g, Fragment as z, createElementVNode as F, mergeProps as y, unref as e, createBlock as C, normalizeClass as p, withCtx as m, createVNode as w, createCommentVNode as x, renderSlot as S } from "vue";
2
2
  import J from "lodash-es/uniqueId";
3
- import { t as f } from "./locale.js";
3
+ import { t as b } from "./locale.js";
4
4
  import L from "./Checkbox.js";
5
5
  import { _ as O } from "./ChevronToggle.vue_vue_type_script_setup_true_lang-1591294c.js";
6
- import { _ as U } from "./Expand.vue_vue_type_script_setup_true_lang-5fe03d51.js";
6
+ import { _ as U } from "./Expand.vue_vue_type_script_setup_true_lang-1751f4a6.js";
7
7
  import "lodash-es/cloneDeep";
8
8
  import "./Icon.vue_used_vue_type_style_index_0_lang.module-eb359559.js";
9
- import "./Paginate.vue_used_vue_type_style_index_0_lang.module-1a2084f9.js";
9
+ import "./Paginate.vue_used_vue_type_style_index_0_lang.module-18343da7.js";
10
10
  import "./DataView.vue_used_vue_type_style_index_0_lang.module-d878ca9a.js";
11
11
  import "./EmptyState.vue_used_vue_type_style_index_0_lang.module-f5d89366.js";
12
- import "./Loading.vue_vue_type_style_index_0_scoped_bb8d5f15_lang-4ed993c7.js";
12
+ import "./Loading.vue_used_vue_type_style_index_0_lang.module-ef5a3bc6.js";
13
13
  import T from "./TableCell.js";
14
- import { T as G, a as H } from "./Table.keys-1ebe4ecb.js";
14
+ import { T as G, a as H } from "./Table.keys-cf93df19.js";
15
15
  import { _ as K } from "./_plugin-vue_export-helper-dad06003.js";
16
16
  import "lodash-es/get";
17
17
  import "@leaflink/snitch";
18
- import "./Checkbox.vue_vue_type_style_index_0_scoped_dbd26d7f_lang-4ed993c7.js";
18
+ import "./Checkbox.vue_used_vue_type_style_index_0_lang.module-fa8d9c06.js";
19
19
  import "./Button.js";
20
- import "./Button.vue_used_vue_type_style_index_0_lang.module-b2ee90e6.js";
20
+ import "./Button.vue_used_vue_type_style_index_0_lang.module-63d31dc0.js";
21
21
  import "./Icon.js";
22
22
  import "./index-79ce320f.js";
23
23
  const Q = /* @__PURE__ */ A({
@@ -30,93 +30,94 @@ const Q = /* @__PURE__ */ A({
30
30
  isSelectDisabled: { type: Boolean, default: !1 }
31
31
  },
32
32
  emits: ["update:isSelected", "update:isExpanded"],
33
- setup(B, { emit: b }) {
33
+ setup(B, { emit: f }) {
34
34
  const n = B, h = D(), t = M(), i = V(), E = j(G.key);
35
35
  if (!E)
36
36
  throw new Error("TableRow must be used within a Table component");
37
- const { hasActions: R, hasCustomExpandToggle: v, isExpandable: $, isSelectable: u, layout: r } = E, a = P(n.isExpanded), s = g(() => $ && !!i.expansion), I = g(() => {
38
- var l;
39
- let o = ((l = i.default) == null ? void 0 : l.call(i, { toggleExpand: d }).length) ?? 0;
40
- return u.value && (o += 1), s.value && !v.value && (o += 1), o;
37
+ const { hasActions: R, hasCustomExpandToggle: v, isExpandable: $, isSelectable: u, layout: r } = E, o = P(n.isExpanded), l = k(() => $ && !!i.expansion), I = k(() => {
38
+ var s;
39
+ let a = ((s = i.default) == null ? void 0 : s.call(i, { toggleExpand: d }).length) ?? 0;
40
+ return u.value && (a += 1), l.value && !v.value && (a += 1), a;
41
41
  }), _ = J("table-row-");
42
- function d(o) {
43
- if (!s.value)
42
+ function d(a) {
43
+ if (!l.value)
44
44
  throw new Error("Cannot call `toggleExpand` on a non-expandable row. Provide an `expansion` slot.");
45
- const l = typeof o == "boolean" ? o : !a.value;
46
- a.value = l, b("update:isExpanded", l);
45
+ const s = typeof a == "boolean" ? a : !o.value;
46
+ o.value = s, f("update:isExpanded", s);
47
47
  }
48
48
  return q(
49
49
  () => n.isExpanded,
50
50
  () => d(n.isExpanded)
51
- ), (o, l) => (p(), k(z, null, [
51
+ ), (a, s) => (c(), g(z, null, [
52
52
  F("tr", y({
53
53
  class: ["stash-table-row", [
54
54
  e(t).root,
55
55
  e(t)[`layout--${e(r)}`],
56
56
  {
57
- [e(t)["is-expandable"]]: s.value,
58
- [e(t)["is-expanded"]]: a.value,
59
- [e(t)["root--hidden-divider"]]: o.hideExpansionDivider,
57
+ [e(t)["is-expandable"]]: l.value,
58
+ [e(t)["is-expanded"]]: o.value,
59
+ [e(t)["root--hidden-divider"]]: a.hideExpansionDivider,
60
60
  "tw-p-gutter": e(r) === "stack",
61
- "tw-mb-6 tw-shadow lg:tw-mb-0 lg:tw-shadow-none": e(r) === "stack" && !s.value,
61
+ "tw-mb-6 tw-shadow lg:tw-mb-0 lg:tw-shadow-none": e(r) === "stack" && !l.value,
62
62
  "tw-pt-[60px]": e(R) && e(r) === "stack" && !e(u)
63
63
  }
64
64
  ]],
65
65
  "data-test": "stash-table-row"
66
66
  }, e(h)), [
67
- e(u) ? (p(), C(T, {
67
+ e(u) ? (c(), C(T, {
68
68
  key: 0,
69
69
  "is-control": "",
70
- class: c(["stash-table-row__selection-cell tw-min-w-[48px]", e(t)["row-control-cell"]])
70
+ class: p(["stash-table-row__selection-cell tw-min-w-[48px]", e(t)["row-control-cell"]]),
71
+ "data-test": "stash-table-row|selection-cell"
71
72
  }, {
72
73
  default: m(() => [
73
74
  w(L, {
74
- class: c(e(t)["row-selection-checkbox"]),
75
+ class: p(e(t)["row-selection-checkbox"]),
75
76
  checked: n.isSelected,
76
77
  disabled: n.isSelectDisabled,
77
- title: e(f)("ll.select.self"),
78
- "onUpdate:checked": l[0] || (l[0] = (N) => b("update:isSelected", N))
78
+ title: e(b)("ll.select.self"),
79
+ "onUpdate:checked": s[0] || (s[0] = (N) => f("update:isSelected", N))
79
80
  }, null, 8, ["class", "checked", "disabled", "title"])
80
81
  ]),
81
82
  _: 1
82
83
  }, 8, ["class"])) : x("", !0),
83
- s.value && !e(v) ? (p(), C(T, {
84
+ l.value && !e(v) ? (c(), C(T, {
84
85
  key: 1,
85
- class: c(["row-toggle-expansion-cell tw-px-0", e(t)["row-control-cell"]]),
86
- "data-test": "table-row-toggle-expansion-cell",
86
+ class: p(["stash-table-row__toggle-expansion-cell tw-px-0", e(t)["row-control-cell"]]),
87
+ "data-test": "stash-table-row|custom-expansion-cell",
87
88
  "is-control": ""
88
89
  }, {
89
90
  default: m(() => [
90
91
  w(O, {
91
92
  "aria-controls": e(_),
92
- "aria-label": a.value ? e(f)("ll.table.collapseRow") : e(f)("ll.table.expandRow"),
93
- direction: a.value ? "up" : "down",
94
- "is-expanded": a.value,
93
+ "aria-label": o.value ? e(b)("ll.table.collapseRow") : e(b)("ll.table.expandRow"),
94
+ direction: o.value ? "up" : "down",
95
+ "is-expanded": o.value,
95
96
  onClick: d
96
97
  }, null, 8, ["aria-controls", "aria-label", "direction", "is-expanded"])
97
98
  ]),
98
99
  _: 1
99
100
  }, 8, ["class"])) : x("", !0),
100
- S(o.$slots, "default", {
101
- isRowExpanded: a.value,
101
+ S(a.$slots, "default", {
102
+ isRowExpanded: o.value,
102
103
  toggleExpand: d
103
104
  })
104
105
  ], 16),
105
- s.value ? (p(), k("tr", y({
106
+ l.value ? (c(), g("tr", y({
106
107
  key: 0,
107
- class: ["stash-table-row stash-table-row-expansion", e(t)["row-expansion"]],
108
+ class: ["stash-table-row stash-table-row--expandable", e(t)["row-expansion"]],
108
109
  "data-test": "stash-table-row"
109
110
  }, e(h)), [
110
111
  w(U, {
111
112
  is: "td",
112
113
  id: e(_),
113
- class: c(["tw-border-none tw-bg-white tw-px-3 tw-py-0", e(t)["row-expansion-content"]]),
114
- "data-test": "table-row-expansion-cell",
114
+ class: p(["tw-border-none tw-bg-white tw-px-3 tw-py-0", e(t)["row-expansion-content"]]),
115
+ "data-test": "stash-table-row|expansion-cell",
115
116
  colspan: I.value,
116
- "is-expanded": a.value
117
+ "is-expanded": o.value
117
118
  }, {
118
119
  default: m(() => [
119
- S(o.$slots, "expansion")
120
+ S(a.$slots, "expansion")
120
121
  ]),
121
122
  _: 3
122
123
  }, 8, ["id", "class", "colspan", "is-expanded"])
@@ -1 +1 @@
1
- {"version":3,"file":"TableRow.js","sources":["../src/components/TableRow/TableRow.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, inject, ref, useAttrs, useCssModule, useSlots, watch } from 'vue';\n\n import { t } from '../../locale';\n import Checkbox, { CheckboxProps } from '../Checkbox/Checkbox.vue';\n import ChevronToggle from '../ChevronToggle/ChevronToggle.vue';\n import Expand from '../Expand/Expand.vue';\n import { TABLE_INJECTION } from '../Table/Table.vue';\n import TableCell from '../TableCell/TableCell.vue';\n\n defineOptions({ inheritAttrs: false });\n\n export interface TableRowProps {\n hideExpansionDivider?: boolean;\n isExpanded?: boolean;\n isSelected?: boolean;\n isSelectDisabled?: boolean;\n }\n\n const props = withDefaults(defineProps<TableRowProps>(), {\n /**\n * If true, hides the divider between the parent row and expansion row\n */\n hideExpansionDivider: false,\n isExpanded: false,\n isSelected: false,\n isSelectDisabled: false,\n });\n\n const emit =\n defineEmits<{\n 'update:isSelected': [isChecked: CheckboxProps['checked']];\n 'update:isExpanded': [isExpanded: boolean];\n }>();\n\n const attrs = useAttrs();\n const classes = useCssModule();\n const slots = useSlots();\n\n const tableInjection = inject(TABLE_INJECTION.key);\n\n if (!tableInjection) {\n throw new Error('TableRow must be used within a Table component');\n }\n\n const { hasActions, hasCustomExpandToggle, isExpandable, isSelectable, layout } = tableInjection;\n\n const isRowExpanded = ref(props.isExpanded);\n const isRowExpandable = computed(() => isExpandable && !!slots.expansion);\n\n const childCellCount = computed(() => {\n let count = slots.default?.({ toggleExpand }).length ?? 0;\n\n if (isSelectable.value) {\n count += 1;\n }\n\n if (isRowExpandable.value && !hasCustomExpandToggle.value) {\n count += 1;\n }\n\n return count;\n });\n const rowId = uniqueId('table-row-');\n\n function toggleExpand(value?: boolean) {\n if (!isRowExpandable.value) {\n throw new Error('Cannot call `toggleExpand` on a non-expandable row. Provide an `expansion` slot.');\n }\n\n const isExpanded = typeof value === 'boolean' ? value : !isRowExpanded.value;\n\n isRowExpanded.value = isExpanded;\n emit('update:isExpanded', isExpanded);\n }\n\n watch(\n () => props.isExpanded,\n () => toggleExpand(props.isExpanded),\n );\n</script>\n\n<template>\n <tr\n class=\"stash-table-row\"\n :class=\"[\n classes.root,\n classes[`layout--${layout}`],\n {\n [classes['is-expandable']]: isRowExpandable,\n [classes['is-expanded']]: isRowExpanded,\n [classes['root--hidden-divider']]: hideExpansionDivider,\n 'tw-p-gutter': layout === 'stack',\n 'tw-mb-6 tw-shadow lg:tw-mb-0 lg:tw-shadow-none': layout === 'stack' && !isRowExpandable,\n 'tw-pt-[60px]': hasActions && layout === 'stack' && !isSelectable,\n },\n ]\"\n data-test=\"stash-table-row\"\n v-bind=\"attrs\"\n >\n <TableCell\n v-if=\"isSelectable\"\n is-control\n class=\"stash-table-row__selection-cell tw-min-w-[48px]\"\n :class=\"classes['row-control-cell']\"\n >\n <Checkbox\n :class=\"classes['row-selection-checkbox']\"\n :checked=\"props.isSelected\"\n :disabled=\"props.isSelectDisabled\"\n :title=\"t('ll.select.self')\"\n @update:checked=\"emit('update:isSelected', $event)\"\n />\n </TableCell>\n <TableCell\n v-if=\"isRowExpandable && !hasCustomExpandToggle\"\n class=\"row-toggle-expansion-cell tw-px-0\"\n data-test=\"table-row-toggle-expansion-cell\"\n is-control\n :class=\"classes['row-control-cell']\"\n >\n <ChevronToggle\n :aria-controls=\"rowId\"\n :aria-label=\"isRowExpanded ? t('ll.table.collapseRow') : t('ll.table.expandRow')\"\n :direction=\"isRowExpanded ? 'up' : 'down'\"\n :is-expanded=\"isRowExpanded\"\n @click=\"toggleExpand\"\n />\n </TableCell>\n <!-- @slot default -->\n <slot :is-row-expanded=\"isRowExpanded\" :toggle-expand=\"toggleExpand\"></slot>\n </tr>\n <tr\n v-if=\"isRowExpandable\"\n class=\"stash-table-row stash-table-row-expansion\"\n :class=\"classes['row-expansion']\"\n data-test=\"stash-table-row\"\n v-bind=\"attrs\"\n >\n <Expand\n is=\"td\"\n :id=\"rowId\"\n class=\"tw-border-none tw-bg-white tw-px-3 tw-py-0\"\n data-test=\"table-row-expansion-cell\"\n :class=\"classes['row-expansion-content']\"\n :colspan=\"childCellCount\"\n :is-expanded=\"isRowExpanded\"\n >\n <!-- @slot expansion, for expandable content -->\n <slot name=\"expansion\"></slot>\n </Expand>\n </tr>\n</template>\n\n<style module>\n .root {\n border: 0;\n }\n\n /**\n * Only takes effect when hideExpansionDivider is true, for a softer collapse transition as the bottom border re-appears\n */\n .is-expandable > td {\n border-bottom-color: var(--color-ice-200);\n transition: border-bottom-color 0.5s;\n }\n\n .root--hidden-divider.is-expanded > td {\n transition: border-bottom-color 0s;\n /**\n * Removes the grey cell background for 'control' cells at lower breakpoints, letting the white of the tr come through.\n */\n border-bottom-color: transparent;\n }\n\n .layout--scroll {\n border-radius: 0;\n box-shadow: none !important;\n margin: 0;\n }\n\n .layout--scroll:last-of-type {\n border: 0;\n }\n\n .layout--scroll:last-of-type td {\n border-bottom: none;\n }\n\n .layout--stack {\n align-items: stretch;\n background-color: var(--color-white);\n column-gap: var(--grid-gutter);\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n position: relative;\n row-gap: var(--grid-gutter);\n }\n\n .layout--stack:not(.is-expanded) {\n border-radius: var(--border-radius);\n transition: border-radius 0.5s;\n }\n\n .layout--stack.is-expanded {\n border-top-left-radius: var(--border-radius);\n border-top-right-radius: var(--border-radius);\n }\n\n .row-selection-checkbox label {\n padding: 0;\n min-height: var(--ll-space-3);\n vertical-align: middle;\n }\n\n .layout--stack .row-control-cell {\n display: flex;\n align-items: center;\n min-width: 0;\n }\n\n /* On mobile, display controls on their own row, pushing other cells below */\n .row-control-cell + :not(.row-control-cell) {\n grid-column-start: 1;\n }\n\n .row-expansion-content {\n box-shadow: inset 0 -1px 0 0 var(--color-ice-200);\n }\n\n .layout--stack + .row-expansion,\n .layout--stack + .row-expansion > .row-expansion-content {\n display: block;\n }\n\n .layout--stack + .row-expansion > .row-expansion-content {\n border-top: 1px solid var(--color-ice-200);\n border-bottom-left-radius: var(--border-radius);\n border-bottom-right-radius: var(--border-radius);\n margin-bottom: var(--ll-space-3);\n }\n\n .layout--stack.root--hidden-divider + .row-expansion > .row-expansion-content {\n border-top: none;\n }\n\n /* On large screens, match the styles for layout-SCROLL */\n @media screen(lg) {\n .layout--stack {\n align-items: unset;\n background-color: unset;\n border: 0;\n border-bottom: 1px solid var(--color-ice-200);\n border-radius: 0;\n box-shadow: none;\n column-gap: unset;\n display: table-row;\n grid-template-columns: unset;\n row-gap: unset;\n }\n\n .layout--stack:last-of-type {\n border-bottom: 0;\n }\n\n .layout--stack .row-control-cell {\n display: table-cell;\n }\n\n .layout--stack + .row-expansion {\n display: table-row;\n }\n\n .layout--stack + .row-expansion > .row-expansion-content {\n border-top: unset;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n display: table-cell;\n margin-bottom: unset;\n }\n\n .row-control-cell + :not(.row-control-cell) {\n grid-column-start: unset;\n }\n }\n</style>\n"],"names":["attrs","useAttrs","classes","useCssModule","slots","useSlots","tableInjection","inject","TABLE_INJECTION","hasActions","hasCustomExpandToggle","isExpandable","isSelectable","layout","isRowExpanded","ref","props","isRowExpandable","computed","childCellCount","count","_a","toggleExpand","rowId","uniqueId","value","isExpanded","emit","watch"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoCQA,IAAQC,KACRC,IAAUC,KACVC,IAAQC,KAERC,IAAiBC,EAAOC,EAAgB,GAAG;AAEjD,QAAI,CAACF;AACG,YAAA,IAAI,MAAM,gDAAgD;AAGlE,UAAM,EAAE,YAAAG,GAAY,uBAAAC,GAAuB,cAAAC,GAAc,cAAAC,GAAc,QAAAC,EAAW,IAAAP,GAE5EQ,IAAgBC,EAAIC,EAAM,UAAU,GACpCC,IAAkBC,EAAS,MAAMP,KAAgB,CAAC,CAACP,EAAM,SAAS,GAElEe,IAAiBD,EAAS,MAAM;;AACpC,UAAIE,MAAQC,IAAAjB,EAAM,YAAN,gBAAAiB,EAAA,KAAAjB,GAAgB,EAAE,cAAAkB,KAAgB,WAAU;AAExD,aAAIV,EAAa,UACNQ,KAAA,IAGPH,EAAgB,SAAS,CAACP,EAAsB,UACzCU,KAAA,IAGJA;AAAA,IAAA,CACR,GACKG,IAAQC,EAAS,YAAY;AAEnC,aAASF,EAAaG,GAAiB;AACjC,UAAA,CAACR,EAAgB;AACb,cAAA,IAAI,MAAM,kFAAkF;AAGpG,YAAMS,IAAa,OAAOD,KAAU,YAAYA,IAAQ,CAACX,EAAc;AAEvE,MAAAA,EAAc,QAAQY,GACtBC,EAAK,qBAAqBD,CAAU;AAAA,IACtC;AAEA,WAAAE;AAAA,MACE,MAAMZ,EAAM;AAAA,MACZ,MAAMM,EAAaN,EAAM,UAAU;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"TableRow.js","sources":["../src/components/TableRow/TableRow.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, inject, ref, useAttrs, useCssModule, useSlots, watch } from 'vue';\n\n import { t } from '../../locale';\n import Checkbox, { CheckboxProps } from '../Checkbox/Checkbox.vue';\n import ChevronToggle from '../ChevronToggle/ChevronToggle.vue';\n import Expand from '../Expand/Expand.vue';\n import { TABLE_INJECTION } from '../Table/Table.vue';\n import TableCell from '../TableCell/TableCell.vue';\n\n defineOptions({ inheritAttrs: false });\n\n export interface TableRowProps {\n hideExpansionDivider?: boolean;\n isExpanded?: boolean;\n isSelected?: boolean;\n isSelectDisabled?: boolean;\n }\n\n const props = withDefaults(defineProps<TableRowProps>(), {\n /**\n * If true, hides the divider between the parent row and expansion row\n */\n hideExpansionDivider: false,\n isExpanded: false,\n isSelected: false,\n isSelectDisabled: false,\n });\n\n const emit =\n defineEmits<{\n 'update:isSelected': [isChecked: CheckboxProps['checked']];\n 'update:isExpanded': [isExpanded: boolean];\n }>();\n\n const attrs = useAttrs();\n const classes = useCssModule();\n const slots = useSlots();\n\n const tableInjection = inject(TABLE_INJECTION.key);\n\n if (!tableInjection) {\n throw new Error('TableRow must be used within a Table component');\n }\n\n const { hasActions, hasCustomExpandToggle, isExpandable, isSelectable, layout } = tableInjection;\n\n const isRowExpanded = ref(props.isExpanded);\n const isRowExpandable = computed(() => isExpandable && !!slots.expansion);\n\n const childCellCount = computed(() => {\n let count = slots.default?.({ toggleExpand }).length ?? 0;\n\n if (isSelectable.value) {\n count += 1;\n }\n\n if (isRowExpandable.value && !hasCustomExpandToggle.value) {\n count += 1;\n }\n\n return count;\n });\n const rowId = uniqueId('table-row-');\n\n function toggleExpand(value?: boolean) {\n if (!isRowExpandable.value) {\n throw new Error('Cannot call `toggleExpand` on a non-expandable row. Provide an `expansion` slot.');\n }\n\n const isExpanded = typeof value === 'boolean' ? value : !isRowExpanded.value;\n\n isRowExpanded.value = isExpanded;\n emit('update:isExpanded', isExpanded);\n }\n\n watch(\n () => props.isExpanded,\n () => toggleExpand(props.isExpanded),\n );\n</script>\n\n<template>\n <tr\n class=\"stash-table-row\"\n :class=\"[\n classes.root,\n classes[`layout--${layout}`],\n {\n [classes['is-expandable']]: isRowExpandable,\n [classes['is-expanded']]: isRowExpanded,\n [classes['root--hidden-divider']]: hideExpansionDivider,\n 'tw-p-gutter': layout === 'stack',\n 'tw-mb-6 tw-shadow lg:tw-mb-0 lg:tw-shadow-none': layout === 'stack' && !isRowExpandable,\n 'tw-pt-[60px]': hasActions && layout === 'stack' && !isSelectable,\n },\n ]\"\n data-test=\"stash-table-row\"\n v-bind=\"attrs\"\n >\n <TableCell\n v-if=\"isSelectable\"\n is-control\n class=\"stash-table-row__selection-cell tw-min-w-[48px]\"\n :class=\"classes['row-control-cell']\"\n data-test=\"stash-table-row|selection-cell\"\n >\n <Checkbox\n :class=\"classes['row-selection-checkbox']\"\n :checked=\"props.isSelected\"\n :disabled=\"props.isSelectDisabled\"\n :title=\"t('ll.select.self')\"\n @update:checked=\"emit('update:isSelected', $event)\"\n />\n </TableCell>\n <TableCell\n v-if=\"isRowExpandable && !hasCustomExpandToggle\"\n class=\"stash-table-row__toggle-expansion-cell tw-px-0\"\n data-test=\"stash-table-row|custom-expansion-cell\"\n is-control\n :class=\"classes['row-control-cell']\"\n >\n <ChevronToggle\n :aria-controls=\"rowId\"\n :aria-label=\"isRowExpanded ? t('ll.table.collapseRow') : t('ll.table.expandRow')\"\n :direction=\"isRowExpanded ? 'up' : 'down'\"\n :is-expanded=\"isRowExpanded\"\n @click=\"toggleExpand\"\n />\n </TableCell>\n <!-- @slot default -->\n <slot :is-row-expanded=\"isRowExpanded\" :toggle-expand=\"toggleExpand\"></slot>\n </tr>\n <tr\n v-if=\"isRowExpandable\"\n class=\"stash-table-row stash-table-row--expandable\"\n :class=\"classes['row-expansion']\"\n data-test=\"stash-table-row\"\n v-bind=\"attrs\"\n >\n <Expand\n is=\"td\"\n :id=\"rowId\"\n class=\"tw-border-none tw-bg-white tw-px-3 tw-py-0\"\n data-test=\"stash-table-row|expansion-cell\"\n :class=\"classes['row-expansion-content']\"\n :colspan=\"childCellCount\"\n :is-expanded=\"isRowExpanded\"\n >\n <!-- @slot expansion, for expandable content -->\n <slot name=\"expansion\"></slot>\n </Expand>\n </tr>\n</template>\n\n<style module>\n .root {\n border: 0;\n }\n\n /**\n * Only takes effect when hideExpansionDivider is true, for a softer collapse transition as the bottom border re-appears\n */\n .is-expandable > td {\n border-bottom-color: var(--color-ice-200);\n transition: border-bottom-color 0.5s;\n }\n\n .root--hidden-divider.is-expanded > td {\n transition: border-bottom-color 0s;\n /**\n * Removes the grey cell background for 'control' cells at lower breakpoints, letting the white of the tr come through.\n */\n border-bottom-color: transparent;\n }\n\n .layout--scroll {\n border-radius: 0;\n box-shadow: none !important;\n margin: 0;\n }\n\n .layout--scroll:last-of-type {\n border: 0;\n }\n\n .layout--scroll:last-of-type td {\n border-bottom: none;\n }\n\n .layout--stack {\n align-items: stretch;\n background-color: var(--color-white);\n column-gap: var(--grid-gutter);\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n position: relative;\n row-gap: var(--grid-gutter);\n }\n\n .layout--stack:not(.is-expanded) {\n border-radius: theme('borderRadius.DEFAULT');\n transition: border-radius 0.5s;\n }\n\n .layout--stack.is-expanded {\n border-top-left-radius: theme('borderRadius.DEFAULT');\n border-top-right-radius: theme('borderRadius.DEFAULT');\n }\n\n .row-selection-checkbox label {\n padding: 0;\n min-height: theme('spacing.6');\n vertical-align: middle;\n }\n\n .layout--stack .row-control-cell {\n display: flex;\n align-items: center;\n min-width: 0;\n }\n\n /* On mobile, display controls on their own row, pushing other cells below */\n .row-control-cell + :not(.row-control-cell) {\n grid-column-start: 1;\n }\n\n .row-expansion-content {\n box-shadow: inset 0 -1px 0 0 var(--color-ice-200);\n }\n\n .layout--stack + .row-expansion,\n .layout--stack + .row-expansion > .row-expansion-content {\n display: block;\n }\n\n .layout--stack + .row-expansion > .row-expansion-content {\n border-top: 1px solid var(--color-ice-200);\n border-bottom-left-radius: theme('borderRadius.DEFAULT');\n border-bottom-right-radius: theme('borderRadius.DEFAULT');\n margin-bottom: theme('spacing.6');\n }\n\n .layout--stack.root--hidden-divider + .row-expansion > .row-expansion-content {\n border-top: none;\n }\n\n /* On large screens, match the styles for layout-SCROLL */\n @media screen('lg') {\n .layout--stack {\n align-items: unset;\n background-color: unset;\n border: 0;\n border-bottom: 1px solid var(--color-ice-200);\n border-radius: 0;\n box-shadow: none;\n column-gap: unset;\n display: table-row;\n grid-template-columns: unset;\n row-gap: unset;\n }\n\n .layout--stack:last-of-type {\n border-bottom: 0;\n }\n\n .layout--stack .row-control-cell {\n display: table-cell;\n }\n\n .layout--stack + .row-expansion {\n display: table-row;\n }\n\n .layout--stack + .row-expansion > .row-expansion-content {\n border-top: unset;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n display: table-cell;\n margin-bottom: unset;\n }\n\n .row-control-cell + :not(.row-control-cell) {\n grid-column-start: unset;\n }\n }\n</style>\n"],"names":["attrs","useAttrs","classes","useCssModule","slots","useSlots","tableInjection","inject","TABLE_INJECTION","hasActions","hasCustomExpandToggle","isExpandable","isSelectable","layout","isRowExpanded","ref","props","isRowExpandable","computed","childCellCount","count","_a","toggleExpand","rowId","uniqueId","value","isExpanded","emit","watch"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoCQA,IAAQC,KACRC,IAAUC,KACVC,IAAQC,KAERC,IAAiBC,EAAOC,EAAgB,GAAG;AAEjD,QAAI,CAACF;AACG,YAAA,IAAI,MAAM,gDAAgD;AAGlE,UAAM,EAAE,YAAAG,GAAY,uBAAAC,GAAuB,cAAAC,GAAc,cAAAC,GAAc,QAAAC,EAAW,IAAAP,GAE5EQ,IAAgBC,EAAIC,EAAM,UAAU,GACpCC,IAAkBC,EAAS,MAAMP,KAAgB,CAAC,CAACP,EAAM,SAAS,GAElEe,IAAiBD,EAAS,MAAM;;AACpC,UAAIE,MAAQC,IAAAjB,EAAM,YAAN,gBAAAiB,EAAA,KAAAjB,GAAgB,EAAE,cAAAkB,KAAgB,WAAU;AAExD,aAAIV,EAAa,UACNQ,KAAA,IAGPH,EAAgB,SAAS,CAACP,EAAsB,UACzCU,KAAA,IAGJA;AAAA,IAAA,CACR,GACKG,IAAQC,EAAS,YAAY;AAEnC,aAASF,EAAaG,GAAiB;AACjC,UAAA,CAACR,EAAgB;AACb,cAAA,IAAI,MAAM,kFAAkF;AAGpG,YAAMS,IAAa,OAAOD,KAAU,YAAYA,IAAQ,CAACX,EAAc;AAEvE,MAAAA,EAAc,QAAQY,GACtBC,EAAK,qBAAqBD,CAAU;AAAA,IACtC;AAEA,WAAAE;AAAA,MACE,MAAMZ,EAAM;AAAA,MACZ,MAAMM,EAAaN,EAAM,UAAU;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/Tabs.js CHANGED
@@ -1,5 +1,5 @@
1
- import { _ as o, s as t } from "./Tabs.vue_used_vue_type_style_index_0_lang.module-0af1e1cf.js";
2
- import { T as C, a as E } from "./Tabs.vue_used_vue_type_style_index_0_lang.module-0af1e1cf.js";
1
+ import { _ as o, s as t } from "./Tabs.vue_used_vue_type_style_index_0_lang.module-2a131332.js";
2
+ import { T as C, a as E } from "./Tabs.vue_used_vue_type_style_index_0_lang.module-2a131332.js";
3
3
  import { _ as r } from "./_plugin-vue_export-helper-dad06003.js";
4
4
  import "vue";
5
5
  import "lodash-es/debounce";
@@ -1,16 +1,16 @@
1
- import { defineComponent as z, useCssModule as U, ref as r, computed as b, provide as V, onMounted as j, onUpdated as J, onDeactivated as R, onBeforeUnmount as q, openBlock as k, createElementBlock as F, createElementVNode as f, normalizeStyle as K, normalizeClass as I, renderSlot as L, createBlock as W, withCtx as A, unref as p, createTextVNode as Y, toDisplayString as G, createVNode as H, createCommentVNode as P } from "vue";
1
+ import { defineComponent as z, useCssModule as U, ref as a, computed as b, provide as V, onMounted as j, onUpdated as J, onDeactivated as R, onBeforeUnmount as q, openBlock as k, createElementBlock as F, createElementVNode as f, normalizeStyle as K, normalizeClass as I, renderSlot as L, createBlock as W, withCtx as A, unref as p, createTextVNode as Y, toDisplayString as G, createVNode as H, createCommentVNode as P } from "vue";
2
2
  import Q from "lodash-es/debounce";
3
3
  import X from "lodash-es/uniqueId";
4
4
  import { DEBOUNCE as Z } from "./constants.js";
5
5
  import { t as ee } from "./locale.js";
6
6
  import te from "./Dropdown.js";
7
7
  import oe from "./Icon.js";
8
- const ae = Object.freeze({
8
+ const re = Object.freeze({
9
9
  key: Symbol("TABS_INJECTION_KEY")
10
10
  });
11
11
  var N = /* @__PURE__ */ ((s) => (s.Line = "line", s.Enclosed = "enclosed", s))(N || {});
12
- const re = {
13
- class: "root stash-tabs tw-relative",
12
+ const ae = {
13
+ class: "stash-tabs tw-relative",
14
14
  role: "tabList",
15
15
  "data-test": "stash-tabs"
16
16
  }, se = ["aria-controls", "aria-expanded", "onClick"], ie = ["id"], be = /* @__PURE__ */ z({
@@ -21,7 +21,7 @@ const re = {
21
21
  },
22
22
  emits: ["update:activeTab"],
23
23
  setup(s, { emit: O }) {
24
- const d = s, D = U(), l = r(), c = r(), i = r(void 0), M = "IntersectionObserver" in window, a = r(/* @__PURE__ */ new Set()), m = r(0), h = r(), _ = X("more-dropdown-menu-"), u = r(!1), E = b({
24
+ const d = s, D = U(), l = a(), c = a(), i = a(void 0), M = "IntersectionObserver" in window, r = a(/* @__PURE__ */ new Set()), m = a(0), h = a(), E = X("more-dropdown-menu-"), u = a(!1), g = b({
25
25
  get() {
26
26
  return d.activeTab;
27
27
  },
@@ -30,18 +30,18 @@ const re = {
30
30
  }
31
31
  });
32
32
  function B(t) {
33
- E.value = t;
33
+ g.value = t;
34
34
  }
35
- V(ae.key, {
36
- activeTab: b(() => E.value),
35
+ V(re.key, {
36
+ activeTab: b(() => g.value),
37
37
  variant: b(() => d.variant),
38
38
  setActiveTab: B
39
39
  });
40
- function g() {
40
+ function y() {
41
41
  var w, C, T;
42
42
  if (!M || !l.value)
43
43
  return;
44
- const t = Array.from((w = l.value) == null ? void 0 : w.children), y = {
44
+ const t = Array.from((w = l.value) == null ? void 0 : w.children), _ = {
45
45
  root: l.value,
46
46
  rootMargin: "0px",
47
47
  threshold: Array.from({ length: 100 }).map((e, o) => (o + 1) / 100)
@@ -49,17 +49,17 @@ const re = {
49
49
  if (i.value = new IntersectionObserver((e) => {
50
50
  e.forEach((o) => {
51
51
  const n = o.target.getAttribute("id");
52
- o.intersectionRatio > 0.94 ? a.value.has(n) && a.value.delete(n) : n && !a.value.has(n) && a.value.add(n);
52
+ o.intersectionRatio > 0.94 ? r.value.has(n) && r.value.delete(n) : n && !r.value.has(n) && r.value.add(n);
53
53
  });
54
- }, y), t.forEach((e) => {
54
+ }, _), t.forEach((e) => {
55
55
  var o;
56
- (o = i.value) == null || o.observe(e), a.value.has(e.getAttribute("id")) ? e.classList.add("tw-invisible") : e.classList.remove("tw-invisible");
56
+ (o = i.value) == null || o.observe(e), r.value.has(e.getAttribute("id")) ? e.classList.add("tw-invisible") : e.classList.remove("tw-invisible");
57
57
  }), m.value = (T = (C = h.value) == null ? void 0 : C.$el) == null ? void 0 : T.getBoundingClientRect().width, !c.value)
58
58
  return;
59
59
  Array.from(c.value.children).forEach((e) => {
60
60
  const o = e.firstElementChild;
61
61
  o.className = "", e.className = "", e.classList.add(
62
- D["tabs__overflowed-tab"],
62
+ D["menu-tab"],
63
63
  "tw-rounded",
64
64
  "tw-text-sm",
65
65
  "tw-p-1.5",
@@ -75,16 +75,16 @@ const re = {
75
75
  "aria-disabled:hover:tw-cursor-default",
76
76
  "aria-selected:tw-text-white",
77
77
  "aria-selected:tw-bg-blue-500"
78
- ), a.value.has(e.getAttribute("id")) ? e.classList.remove("tw-hidden") : e.classList.add("tw-hidden"), e.removeEventListener("click", () => {
78
+ ), r.value.has(e.getAttribute("id")) ? e.classList.remove("tw-hidden") : e.classList.add("tw-hidden"), e.removeEventListener("click", () => {
79
79
  });
80
80
  });
81
81
  }
82
- const S = Q(g, Z.FAST, { leading: !0 });
82
+ const S = Q(y, Z.FAST, { leading: !0 });
83
83
  function v() {
84
84
  i.value && (i.value.disconnect(), i.value = void 0);
85
85
  }
86
86
  j(() => {
87
- g();
87
+ y();
88
88
  }), J(() => {
89
89
  v(), S();
90
90
  }), R(() => {
@@ -95,7 +95,7 @@ const re = {
95
95
  function $(t) {
96
96
  t(), u.value = !u.value;
97
97
  }
98
- return (t, y) => (k(), F("div", re, [
98
+ return (t, _) => (k(), F("div", ae, [
99
99
  f("ul", {
100
100
  ref_key: "tabListEl",
101
101
  ref: l,
@@ -109,7 +109,7 @@ const re = {
109
109
  }])
110
110
  }, [
111
111
  L(t.$slots, "default"),
112
- a.value.size ? (k(), W(te, {
112
+ r.value.size ? (k(), W(te, {
113
113
  key: 0,
114
114
  ref_key: "moreDropdownEl",
115
115
  ref: h,
@@ -118,7 +118,7 @@ const re = {
118
118
  toggle: A(({ toggle: x }) => [
119
119
  f("button", {
120
120
  "aria-haspopup": "menu",
121
- "aria-controls": p(_),
121
+ "aria-controls": p(E),
122
122
  "aria-expanded": u.value,
123
123
  class: I(["tw-flex tw-cursor-pointer tw-items-center tw-justify-center tw-border-solid tw-px-6 tw-py-1.5 tw-text-sm tw-font-medium tw-text-blue-500 hover:tw-text-blue-700", { "tw-border-t-4 tw-border-transparent": d.variant === "enclosed" }]),
124
124
  type: "button",
@@ -130,10 +130,10 @@ const re = {
130
130
  ]),
131
131
  default: A(() => [
132
132
  f("ul", {
133
- id: p(_),
133
+ id: p(E),
134
134
  ref_key: "moreDropdownMenuEl",
135
135
  ref: c,
136
- class: "tabs__dropdown-list tw-space-y-1.5 tw-px-1.5 tw-pb-1.5",
136
+ class: "tw-space-y-1.5 tw-px-1.5 tw-pb-1.5",
137
137
  role: "menu"
138
138
  }, [
139
139
  L(t.$slots, "default")
@@ -145,12 +145,12 @@ const re = {
145
145
  ]));
146
146
  }
147
147
  }), fe = {
148
- "tabs__overflowed-tab": "_tabs__overflowed-tab_luaul_2"
148
+ "menu-tab": "_menu-tab_frbn6_2"
149
149
  };
150
150
  export {
151
- ae as T,
151
+ re as T,
152
152
  be as _,
153
153
  N as a,
154
154
  fe as s
155
155
  };
156
- //# sourceMappingURL=Tabs.vue_used_vue_type_style_index_0_lang.module-0af1e1cf.js.map
156
+ //# sourceMappingURL=Tabs.vue_used_vue_type_style_index_0_lang.module-2a131332.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.vue_used_vue_type_style_index_0_lang.module-2a131332.js","sources":["../src/components/Tabs/keys.ts","../src/components/Tabs/models.ts","../src/components/Tabs/Tabs.vue"],"sourcesContent":["import { Injection } from '../../../types/utils';\nimport { TabsInjection } from './models';\n\nexport const TABS_INJECTION: Injection<TabsInjection> = Object.freeze({\n key: Symbol('TABS_INJECTION_KEY'),\n});\n","import { ComputedRef } from 'vue';\n\nexport enum TabVariant {\n Line = 'line',\n Enclosed = 'enclosed',\n}\n\nexport type TabVariants = `${TabVariant}`;\n\nexport interface TabsInjection {\n activeTab: ComputedRef<string>;\n variant: ComputedRef<TabVariants>;\n setActiveTab: (newTabValue: string) => void;\n}\n","<script lang=\"ts\">\n import { TabVariant, TabVariants } from './models';\n\n export * from './keys';\n export * from './models';\n\n export interface TabsProps {\n /**\n * The currently active tab value\n */\n activeTab: string;\n\n /**\n * Tabs variant\n */\n variant?: TabVariants;\n }\n</script>\n\n<script setup lang=\"ts\">\n import debounce from 'lodash-es/debounce';\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, onBeforeUnmount, onDeactivated, onMounted, onUpdated, provide, Ref, ref, useCssModule } from 'vue';\n\n import { DEBOUNCE } from '../../constants';\n import { t } from '../../locale';\n import Dropdown from '../Dropdown/Dropdown.vue';\n import Icon from '../Icon/Icon.vue';\n import { TABS_INJECTION } from './keys';\n\n const emit =\n defineEmits<{\n (e: 'update:activeTab', newTabValue: TabsProps['activeTab']): void;\n }>();\n\n const props = withDefaults(defineProps<TabsProps>(), {\n variant: TabVariant.Line,\n });\n const classes = useCssModule();\n\n const tabListEl = ref();\n const moreDropdownMenuEl = ref();\n const observer: Ref<IntersectionObserver | undefined> = ref(undefined);\n const hasIntersectionObserver = 'IntersectionObserver' in window;\n const overflowIds = ref<Set<string>>(new Set());\n const moreDropdownWidth = ref(0);\n const moreDropdownEl = ref<InstanceType<typeof Dropdown>>();\n const moreMenuId = uniqueId('more-dropdown-menu-');\n const isMoreMenuOpen = ref(false);\n\n const currentActiveTab = computed({\n get() {\n return props.activeTab;\n },\n set(nv: TabsProps['activeTab']) {\n emit('update:activeTab', nv);\n },\n });\n\n function setActiveTab(newTabValue: TabsProps['activeTab']) {\n currentActiveTab.value = newTabValue;\n }\n\n provide(TABS_INJECTION.key, {\n activeTab: computed(() => currentActiveTab.value),\n variant: computed(() => props.variant),\n setActiveTab,\n });\n\n function initObserve() {\n if (!hasIntersectionObserver) {\n return;\n }\n\n if (!tabListEl.value) {\n return;\n }\n\n const tabs = Array.from(tabListEl.value?.children as HTMLLIElement[]);\n const options = {\n root: tabListEl.value,\n rootMargin: '0px',\n threshold: Array.from({ length: 100 }).map((v, i) => (i + 1) / 100),\n };\n\n observer.value = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n const dataId = entry.target.getAttribute('id') as string;\n /**\n * Check for partial intersection.\n * Zooming out can result in ratio of approx 0.984\n * Anything higher will result in nav items disappearing\n */\n if (entry.intersectionRatio > 0.94) {\n // show tab, hide in dropdown\n if (overflowIds.value.has(dataId)) {\n overflowIds.value.delete(dataId);\n }\n } else {\n // hide tab, show in dropdown\n if (dataId && !overflowIds.value.has(dataId)) {\n overflowIds.value.add(dataId);\n }\n }\n });\n }, options);\n\n tabs.forEach((element) => {\n observer.value?.observe(element);\n if (overflowIds.value.has(element.getAttribute('id') as string)) {\n element.classList.add('tw-invisible');\n } else {\n element.classList.remove('tw-invisible');\n }\n });\n\n moreDropdownWidth.value = moreDropdownEl.value?.$el?.getBoundingClientRect().width;\n\n if (!moreDropdownMenuEl.value) {\n return;\n }\n\n const dropdownList = Array.from(moreDropdownMenuEl.value.children as HTMLLIElement[]);\n dropdownList.forEach((element) => {\n const firstElementChild = element.firstElementChild as Element;\n firstElementChild.className = '';\n element.className = '';\n\n element.classList.add(\n classes['menu-tab'],\n 'tw-rounded',\n 'tw-text-sm',\n 'tw-p-1.5',\n 'tw-text-left',\n 'tw-cursor-pointer',\n 'tw-text-ice-700',\n 'hover:tw-text-white',\n 'hover:tw-bg-blue-500',\n 'aria-disabled:tw-text-ice-500',\n 'aria-disabled:tw-pointer-events-none',\n 'aria-disabled:hover:tw-text-ice-500',\n 'aria-disabled:hover:tw-bg-inherit',\n 'aria-disabled:hover:tw-cursor-default',\n 'aria-selected:tw-text-white',\n 'aria-selected:tw-bg-blue-500',\n );\n\n if (!overflowIds.value.has(element.getAttribute('id') as string)) {\n element.classList.add('tw-hidden');\n } else {\n element.classList.remove('tw-hidden');\n }\n\n element.removeEventListener('click', () => {});\n });\n }\n\n const debouncedInitObserve = debounce(initObserve, DEBOUNCE.FAST, { leading: true });\n\n function destroyObserver() {\n if (observer.value) {\n observer.value.disconnect();\n observer.value = undefined;\n }\n }\n\n onMounted(() => {\n initObserve();\n });\n\n onUpdated(() => {\n destroyObserver();\n debouncedInitObserve();\n });\n\n onDeactivated(() => {\n destroyObserver();\n });\n\n onBeforeUnmount(() => {\n destroyObserver();\n });\n\n function onMoreClick(toggleMoreDropdown) {\n toggleMoreDropdown();\n isMoreMenuOpen.value = !isMoreMenuOpen.value;\n }\n</script>\n\n<template>\n <div class=\"stash-tabs tw-relative\" role=\"tabList\" data-test=\"stash-tabs\">\n <ul\n ref=\"tabListEl\"\n :style=\"{\n width: `calc(100% - ${moreDropdownWidth}px)`,\n }\"\n class=\"stash-tabs-list tw-flex tw-items-end tw-overflow-hidden\"\n :class=\"{\n 'stash-tabs-list--line': variant === 'line',\n 'stash-tabs-list--enclosed': variant === 'enclosed',\n 'tw-gap-6': variant === 'line',\n }\"\n >\n <slot></slot>\n\n <Dropdown v-if=\"overflowIds.size\" ref=\"moreDropdownEl\" class=\"!tw-absolute tw-right-0 tw-top-0\">\n <template #toggle=\"{ toggle }\">\n <button\n aria-haspopup=\"menu\"\n :aria-controls=\"moreMenuId\"\n :aria-expanded=\"isMoreMenuOpen\"\n class=\"\n tw-flex\n tw-cursor-pointer\n tw-items-center\n tw-justify-center\n tw-border-solid\n tw-px-6\n tw-py-1.5\n tw-text-sm\n tw-font-medium\n tw-text-blue-500\n hover:tw-text-blue-700\n \"\n :class=\"{ 'tw-border-t-4 tw-border-transparent': props.variant === 'enclosed' }\"\n type=\"button\"\n @click=\"onMoreClick(toggle)\"\n >\n {{ t('ll.more') }}\n <Icon name=\"caret-down\" />\n </button>\n </template>\n <template #default>\n <ul :id=\"moreMenuId\" ref=\"moreDropdownMenuEl\" class=\"tw-space-y-1.5 tw-px-1.5 tw-pb-1.5\" role=\"menu\">\n <slot></slot>\n </ul>\n </template>\n </Dropdown>\n </ul>\n </div>\n</template>\n\n<style module>\n .menu-tab > a {\n /* prevents the global link styles to overwrite the overflowed tab styles */\n &,\n &:hover,\n &:focus {\n color: inherit;\n }\n }\n</style>\n"],"names":["TABS_INJECTION","TabVariant","classes","useCssModule","tabListEl","ref","moreDropdownMenuEl","observer","hasIntersectionObserver","overflowIds","moreDropdownWidth","moreDropdownEl","moreMenuId","uniqueId","isMoreMenuOpen","currentActiveTab","computed","props","nv","emit","setActiveTab","newTabValue","provide","initObserve","tabs","_a","options","v","i","entries","entry","dataId","element","_c","_b","firstElementChild","debouncedInitObserve","debounce","DEBOUNCE","destroyObserver","onMounted","onUpdated","onDeactivated","onBeforeUnmount","onMoreClick","toggleMoreDropdown"],"mappings":"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"}
package/dist/Textarea.js CHANGED
@@ -1,11 +1,11 @@
1
- import { defineComponent as R, useAttrs as C, useSlots as S, ref as h, computed as k, watch as H, onMounted as I, nextTick as O, onBeforeUnmount as A, openBlock as M, createBlock as P, mergeProps as _, unref as p, createSlots as V, withCtx as x, createElementVNode as q, renderSlot as $ } from "vue";
2
- import j from "lodash-es/uniqueId";
3
- import { _ as D } from "./Field.vue_vue_type_script_setup_true_lang-4483019d.js";
4
- import { _ as F } from "./_plugin-vue_export-helper-dad06003.js";
5
- import "./Label.vue_vue_type_script_setup_true_lang-2de35913.js";
1
+ import { defineComponent as R, useAttrs as M, useSlots as S, useCssModule as k, ref as h, computed as H, watch as O, onMounted as A, nextTick as I, onBeforeUnmount as P, openBlock as V, createBlock as $, mergeProps as x, unref as f, createSlots as q, withCtx as _, createElementVNode as j, renderSlot as D } from "vue";
2
+ import F from "lodash-es/uniqueId";
3
+ import { _ as L } from "./Field.vue_vue_type_script_setup_true_lang-42ba3c5a.js";
4
+ import { _ as N } from "./_plugin-vue_export-helper-dad06003.js";
5
+ import "./Label.vue_vue_type_script_setup_true_lang-4b02087f.js";
6
6
  import "./locale.js";
7
7
  import "lodash-es/get";
8
- const L = ["id", "value"], N = /* @__PURE__ */ R({
8
+ const U = ["id", "value"], W = /* @__PURE__ */ R({
9
9
  name: "ll-textarea",
10
10
  __name: "Textarea",
11
11
  props: {
@@ -19,32 +19,32 @@ const L = ["id", "value"], N = /* @__PURE__ */ R({
19
19
  },
20
20
  emits: ["update:model-value"],
21
21
  setup(g, { emit: w }) {
22
- const n = g, b = j("textarea-"), f = C(), y = S(), c = h(), l = h(), z = k(() => {
23
- const e = { ...f };
22
+ const s = g, b = F("textarea-"), p = M(), y = S(), z = k(), c = h(), l = h(), T = H(() => {
23
+ const e = { ...p };
24
24
  return delete e["data-test"], delete e.class, e;
25
25
  });
26
- H(
27
- () => n.resize,
26
+ O(
27
+ () => s.resize,
28
28
  (e) => {
29
29
  var t;
30
30
  e ? m() : (t = l.value) == null || t.disconnect();
31
31
  }
32
32
  );
33
- const T = (e) => {
33
+ const B = (e) => {
34
34
  w("update:model-value", e.target.value);
35
35
  }, m = () => {
36
36
  l.value || !c.value || (l.value = new ResizeObserver(([e]) => {
37
37
  const { target: t } = e, o = v(c.value) || document.documentElement, { scrollTop: a } = o;
38
- let s = 0;
38
+ let n = 0;
39
39
  if (o === document.documentElement) {
40
- const { top: r, height: i } = B(t), { innerHeight: u } = window;
41
- s = Math.max(r + i - (u + a), 0);
40
+ const { top: r, height: i } = C(t), { innerHeight: u } = window;
41
+ n = Math.max(r + i - (u + a), 0);
42
42
  } else {
43
43
  const { top: r, height: i } = t.getBoundingClientRect(), { top: u } = o.getBoundingClientRect(), { offsetHeight: d } = o, E = r - u;
44
- s = Math.max(E + i - d, 0);
44
+ n = Math.max(E + i - d, 0);
45
45
  }
46
- s && requestAnimationFrame(() => {
47
- o.scrollTop = a + s;
46
+ n && requestAnimationFrame(() => {
47
+ o.scrollTop = a + n;
48
48
  });
49
49
  }), l.value.observe(c.value));
50
50
  }, v = (e) => {
@@ -53,58 +53,66 @@ const L = ["id", "value"], N = /* @__PURE__ */ R({
53
53
  return null;
54
54
  const { overflowY: o } = getComputedStyle(t);
55
55
  return o !== "visible" ? t : t === document.body ? document.documentElement : v(t);
56
- }, B = (e) => {
56
+ }, C = (e) => {
57
57
  const { offsetWidth: t, offsetHeight: o } = e;
58
- let a = 0, s = 0;
58
+ let a = 0, n = 0;
59
59
  const r = function({ offsetLeft: i, offsetTop: u, offsetParent: d }) {
60
- a += i, s += u, d && r(d);
60
+ a += i, n += u, d && r(d);
61
61
  };
62
62
  return r(e), {
63
- top: s,
63
+ top: n,
64
64
  left: a,
65
65
  width: t,
66
66
  height: o
67
67
  };
68
68
  };
69
- return I(async () => {
69
+ return A(async () => {
70
70
  var e;
71
- if (n.value !== null)
71
+ if (s.value !== null)
72
72
  throw new Error("ll-input: use :model-value or v-model instead of :value.");
73
- if (f.onInput)
73
+ if (p.onInput)
74
74
  throw new Error("ll-input: use the @update:model-value event instead of @input");
75
- (typeof n.resize == "boolean" && n.resize || (e = n.resize) != null && e.forceBrowserScroll) && (await O(), m());
76
- }), A(() => {
75
+ (typeof s.resize == "boolean" && s.resize || (e = s.resize) != null && e.forceBrowserScroll) && (await I(), m());
76
+ }), P(() => {
77
77
  var e;
78
78
  (e = l.value) == null || e.disconnect();
79
- }), (e, t) => (M(), P(D, _(n, {
80
- id: p(b),
81
- class: ["stash-textarea", [p(f).class]],
79
+ }), (e, t) => (V(), $(L, x(s, {
80
+ id: f(b),
81
+ class: ["stash-textarea", f(p).root],
82
82
  "data-test": "stash-textarea"
83
- }), V({
84
- default: x(({ fieldId: o, hasError: a }) => [
85
- q("textarea", _({
83
+ }), q({
84
+ default: _(({ fieldId: o, hasError: a }) => [
85
+ j("textarea", x({
86
86
  id: o,
87
87
  ref_key: "textareaRef",
88
88
  ref: c,
89
- class: { "stash-textarea--error": a, "tw-resize-y": n.resize, "tw-resize-none": !n.resize },
90
- value: n.modelValue,
89
+ class: [
90
+ f(z).textarea,
91
+ { "stash-textarea--error": a, "tw-resize-y": s.resize, "tw-resize-none": !s.resize }
92
+ ],
93
+ value: s.modelValue,
91
94
  "data-test": "stash-textarea|textarea"
92
- }, z.value, { onInput: T }), null, 16, L)
95
+ }, T.value, { onInput: B }), null, 16, U)
93
96
  ]),
94
97
  _: 2
95
98
  }, [
96
- p(y).hint ? {
99
+ f(y).hint ? {
97
100
  name: "hint",
98
- fn: x(() => [
99
- $(e.$slots, "hint", {}, void 0, !0)
101
+ fn: _(() => [
102
+ D(e.$slots, "hint")
100
103
  ]),
101
104
  key: "0"
102
105
  } : void 0
103
106
  ]), 1040, ["id", "class"]));
104
107
  }
105
- });
106
- const X = /* @__PURE__ */ F(N, [["__scopeId", "data-v-ffd4d28e"]]);
108
+ }), Y = "_root_1bv4v_2", G = "_textarea_1bv4v_7", J = {
109
+ root: Y,
110
+ textarea: G,
111
+ "stash-textarea--error": "_stash-textarea--error_1bv4v_28"
112
+ }, K = {
113
+ $style: J
114
+ }, ae = /* @__PURE__ */ N(W, [["__cssModules", K]]);
107
115
  export {
108
- X as default
116
+ ae as default
109
117
  };
110
118
  //# sourceMappingURL=Textarea.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.js","sources":["../src/components/Textarea/Textarea.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, nextTick, onBeforeUnmount, onMounted, ref, useAttrs, useSlots, watch } from 'vue';\n\n import Field from '../Field/Field.vue';\n\n export interface TextareaResizeOptions {\n /**\n * It will automatically scroll the page down when it reaches the bottom of the viewport/element\n */\n forceBrowserScroll: boolean;\n }\n\n export interface TextAreaProps {\n /**\n * Label text for the textarea element.\n */\n label?: string;\n /**\n * Value for the textarea element.\n */\n modelValue?: string;\n /**\n * Deprecated. Use :model-value or v-model instead of :value.\n * @deprecated Use :model-value or v-model instead of :value.\n */\n value?: string | number | null;\n /**\n * Error text for the textarea element.\n */\n errorText?: string;\n /**\n * Hint text for the textarea element.\n */\n hintText?: string;\n /**\n * Render \"(optional)\" to the right of the label text\n */\n showOptionalInLabel?: boolean;\n /**\n * Allow textarea to be resizable vertically.\n * Alternatively if you want to disable automatic scroll when resizing, you can set `{ forceBrowserScroll: false }`\n */\n resize?: boolean | TextareaResizeOptions;\n }\n\n defineOptions({\n name: 'll-textarea',\n });\n\n /**\n * Unique ID for the textarea, required for accessibility purposes\n */\n const id = uniqueId('textarea-');\n\n const attrs = useAttrs();\n const slots = useSlots();\n\n const props = withDefaults(defineProps<TextAreaProps>(), {\n label: ' ',\n modelValue: '',\n value: null,\n errorText: '',\n hintText: '',\n showOptionalInLabel: false,\n resize: false,\n });\n\n const emits =\n defineEmits<{\n /**\n * Emitted when the model value changes.\n */\n (e: 'update:model-value', value: string): void;\n }>();\n\n const textareaRef = ref<HTMLTextAreaElement>();\n const observer = ref<ResizeObserver>();\n\n const inputAttrs = computed(() => {\n const allAttrs = { ...attrs };\n\n delete allAttrs['data-test'];\n delete allAttrs.class;\n\n return allAttrs;\n });\n\n watch(\n () => props.resize,\n (v) => {\n v ? setupResizeObserver() : observer.value?.disconnect();\n },\n );\n\n const onInput = (event: Event) => {\n emits('update:model-value', (event.target as HTMLTextAreaElement).value);\n };\n\n const setupResizeObserver = () => {\n if (observer.value || !textareaRef.value) {\n return;\n }\n\n // the ResizeObserver will be in charge to detect if page needs to scroll when resizing the component\n observer.value = new ResizeObserver(([entry]) => {\n const { target } = entry;\n const parent = findParentScrollable(textareaRef.value as HTMLTextAreaElement) || document.documentElement;\n\n const { scrollTop: scrollPosition } = parent;\n let offsetDiff = 0;\n\n // checks if the closest parent element scrollable is the document page\n if (parent === document.documentElement) {\n const { top, height } = getOffsetClipRect(target as HTMLElement);\n const { innerHeight: viewportHeight } = window;\n\n offsetDiff = Math.max(top + height - (viewportHeight + scrollPosition), 0);\n } else {\n const { top, height } = (target as HTMLElement).getBoundingClientRect();\n const { top: parentTop } = parent.getBoundingClientRect();\n const { offsetHeight: parentHeight } = parent;\n const offsetTop = top - parentTop;\n\n offsetDiff = Math.max(offsetTop + height - parentHeight, 0);\n }\n\n if (offsetDiff) {\n requestAnimationFrame(() => {\n parent.scrollTop = scrollPosition + offsetDiff;\n });\n }\n });\n\n observer.value.observe(textareaRef.value);\n };\n\n /**\n * Retrieve the closest parent that has a scroll. Defaults to the document page.\n */\n const findParentScrollable = (el: HTMLElement): HTMLElement | null => {\n const parent = el.parentElement as HTMLElement;\n if (!parent) {\n return null;\n }\n\n const { overflowY } = getComputedStyle(parent);\n if (overflowY !== 'visible') {\n return parent;\n }\n\n if (parent === document.body) {\n return document.documentElement;\n }\n\n return findParentScrollable(parent);\n };\n\n /**\n * Retrieve element absolute positioning relative to the page.\n */\n const getOffsetClipRect = (el: HTMLElement) => {\n const { offsetWidth: width, offsetHeight: height } = el;\n\n let left = 0;\n let top = 0;\n\n const findPos = function ({ offsetLeft, offsetTop, offsetParent }: HTMLElement) {\n left += offsetLeft;\n top += offsetTop;\n\n if (offsetParent) {\n findPos(offsetParent as HTMLElement);\n }\n };\n\n findPos(el);\n\n return {\n top,\n left,\n width,\n height,\n };\n };\n\n onMounted(async () => {\n if (props.value !== null) {\n throw new Error('ll-input: use :model-value or v-model instead of :value.');\n }\n\n if (attrs.onInput) {\n throw new Error('ll-input: use the @update:model-value event instead of @input');\n }\n\n if (\n (typeof props.resize === 'boolean' && props.resize) ||\n (props.resize as TextareaResizeOptions)?.forceBrowserScroll\n ) {\n await nextTick();\n setupResizeObserver();\n }\n });\n\n onBeforeUnmount(() => {\n observer.value?.disconnect();\n });\n</script>\n\n<template>\n <Field v-bind=\"props\" :id=\"id\" class=\"stash-textarea\" :class=\"[attrs.class]\" data-test=\"stash-textarea\">\n <template #default=\"{ fieldId, hasError }\">\n <textarea\n :id=\"fieldId\"\n ref=\"textareaRef\"\n :class=\"{ 'stash-textarea--error': hasError, 'tw-resize-y': props.resize, 'tw-resize-none': !props.resize }\"\n :value=\"props.modelValue\"\n data-test=\"stash-textarea|textarea\"\n v-bind=\"inputAttrs\"\n @input=\"onInput\"\n ></textarea>\n </template>\n <template v-if=\"slots.hint\" #hint>\n <!-- @slot Hint content -->\n <slot name=\"hint\"></slot>\n </template>\n </Field>\n</template>\n\n<style scoped>\n .stash-textarea {\n position: relative;\n width: 100%;\n\n textarea {\n background: var(--color-white);\n border: 1px solid;\n border-color: var(--color-ice-500);\n border-radius: theme('borderRadius.DEFAULT');\n color: var(--color-ice-700);\n display: block;\n min-height: 100px;\n outline: none;\n padding: theme('spacing[1.5]');\n width: 100%;\n\n &:hover {\n border-color: var(--color-ice-500);\n }\n\n &:focus,\n &:active {\n border-color: var(--color-blue-500);\n }\n\n &.stash-textarea--error {\n border-color: var(--color-red-500);\n color: var(--color-red-500);\n }\n\n &::placeholder {\n color: var(--color-ice-500);\n opacity: 1;\n }\n\n &[disabled],\n &[readonly] {\n background-color: var(--color-ice-200);\n border-color: var(--color-ice-500);\n color: var(--color-ice-700);\n pointer-events: none;\n }\n\n &[disabled]:active,\n &[readonly]:active,\n &[disabled]:focus,\n &[readonly]:focus {\n box-shadow: none;\n }\n\n &[disabled]::placeholder,\n &[readonly]::placeholder {\n text-transform: none;\n }\n }\n }\n</style>\n"],"names":["id","uniqueId","attrs","useAttrs","slots","useSlots","textareaRef","ref","observer","inputAttrs","computed","allAttrs","watch","props","v","setupResizeObserver","_a","onInput","event","emits","entry","target","parent","findParentScrollable","scrollPosition","offsetDiff","top","height","getOffsetClipRect","viewportHeight","parentTop","parentHeight","offsetTop","el","overflowY","width","left","findPos","offsetLeft","offsetParent","onMounted","nextTick","onBeforeUnmount"],"mappings":"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"}
1
+ {"version":3,"file":"Textarea.js","sources":["../src/components/Textarea/Textarea.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, nextTick, onBeforeUnmount, onMounted, ref, useAttrs, useCssModule, useSlots, watch } from 'vue';\n\n import Field from '../Field/Field.vue';\n\n export interface TextareaResizeOptions {\n /**\n * It will automatically scroll the page down when it reaches the bottom of the viewport/element\n */\n forceBrowserScroll: boolean;\n }\n\n export interface TextAreaProps {\n /**\n * Label text for the textarea element.\n */\n label?: string;\n\n /**\n * Value for the textarea element.\n */\n modelValue?: string;\n\n /**\n * Deprecated. Use :model-value or v-model instead of :value.\n * @deprecated Use :model-value or v-model instead of :value.\n */\n value?: string | number | null;\n\n /**\n * Error text for the textarea element.\n */\n errorText?: string;\n\n /**\n * Hint text for the textarea element.\n */\n hintText?: string;\n\n /**\n * Render \"(optional)\" to the right of the label text\n */\n showOptionalInLabel?: boolean;\n\n /**\n * Allow textarea to be resizable vertically.\n * Alternatively if you want to disable automatic scroll when resizing, you can set `{ forceBrowserScroll: false }`\n */\n resize?: boolean | TextareaResizeOptions;\n }\n\n defineOptions({\n name: 'll-textarea',\n });\n\n /**\n * Unique ID for the textarea, required for accessibility purposes\n */\n const id = uniqueId('textarea-');\n\n const attrs = useAttrs();\n const slots = useSlots();\n const classes = useCssModule();\n\n const props = withDefaults(defineProps<TextAreaProps>(), {\n label: ' ',\n modelValue: '',\n value: null,\n errorText: '',\n hintText: '',\n showOptionalInLabel: false,\n resize: false,\n });\n\n const emits =\n defineEmits<{\n /**\n * Emitted when the model value changes.\n */\n (e: 'update:model-value', value: string): void;\n }>();\n\n const textareaRef = ref<HTMLTextAreaElement>();\n const observer = ref<ResizeObserver>();\n\n const inputAttrs = computed(() => {\n const allAttrs = { ...attrs };\n\n delete allAttrs['data-test'];\n delete allAttrs.class;\n\n return allAttrs;\n });\n\n watch(\n () => props.resize,\n (v) => {\n v ? setupResizeObserver() : observer.value?.disconnect();\n },\n );\n\n const onInput = (event: Event) => {\n emits('update:model-value', (event.target as HTMLTextAreaElement).value);\n };\n\n const setupResizeObserver = () => {\n if (observer.value || !textareaRef.value) {\n return;\n }\n\n // the ResizeObserver will be in charge to detect if page needs to scroll when resizing the component\n observer.value = new ResizeObserver(([entry]) => {\n const { target } = entry;\n const parent = findParentScrollable(textareaRef.value as HTMLTextAreaElement) || document.documentElement;\n\n const { scrollTop: scrollPosition } = parent;\n let offsetDiff = 0;\n\n // checks if the closest parent element scrollable is the document page\n if (parent === document.documentElement) {\n const { top, height } = getOffsetClipRect(target as HTMLElement);\n const { innerHeight: viewportHeight } = window;\n\n offsetDiff = Math.max(top + height - (viewportHeight + scrollPosition), 0);\n } else {\n const { top, height } = (target as HTMLElement).getBoundingClientRect();\n const { top: parentTop } = parent.getBoundingClientRect();\n const { offsetHeight: parentHeight } = parent;\n const offsetTop = top - parentTop;\n\n offsetDiff = Math.max(offsetTop + height - parentHeight, 0);\n }\n\n if (offsetDiff) {\n requestAnimationFrame(() => {\n parent.scrollTop = scrollPosition + offsetDiff;\n });\n }\n });\n\n observer.value.observe(textareaRef.value);\n };\n\n /**\n * Retrieve the closest parent that has a scroll. Defaults to the document page.\n */\n const findParentScrollable = (el: HTMLElement): HTMLElement | null => {\n const parent = el.parentElement as HTMLElement;\n if (!parent) {\n return null;\n }\n\n const { overflowY } = getComputedStyle(parent);\n if (overflowY !== 'visible') {\n return parent;\n }\n\n if (parent === document.body) {\n return document.documentElement;\n }\n\n return findParentScrollable(parent);\n };\n\n /**\n * Retrieve element absolute positioning relative to the page.\n */\n const getOffsetClipRect = (el: HTMLElement) => {\n const { offsetWidth: width, offsetHeight: height } = el;\n\n let left = 0;\n let top = 0;\n\n const findPos = function ({ offsetLeft, offsetTop, offsetParent }: HTMLElement) {\n left += offsetLeft;\n top += offsetTop;\n\n if (offsetParent) {\n findPos(offsetParent as HTMLElement);\n }\n };\n\n findPos(el);\n\n return {\n top,\n left,\n width,\n height,\n };\n };\n\n onMounted(async () => {\n if (props.value !== null) {\n throw new Error('ll-input: use :model-value or v-model instead of :value.');\n }\n\n if (attrs.onInput) {\n throw new Error('ll-input: use the @update:model-value event instead of @input');\n }\n\n if (\n (typeof props.resize === 'boolean' && props.resize) ||\n (props.resize as TextareaResizeOptions)?.forceBrowserScroll\n ) {\n await nextTick();\n setupResizeObserver();\n }\n });\n\n onBeforeUnmount(() => {\n observer.value?.disconnect();\n });\n</script>\n\n<template>\n <Field v-bind=\"props\" :id=\"id\" class=\"stash-textarea\" :class=\"attrs.root\" data-test=\"stash-textarea\">\n <template #default=\"{ fieldId, hasError }\">\n <textarea\n :id=\"fieldId\"\n ref=\"textareaRef\"\n :class=\"[\n classes.textarea,\n { 'stash-textarea--error': hasError, 'tw-resize-y': props.resize, 'tw-resize-none': !props.resize },\n ]\"\n :value=\"props.modelValue\"\n data-test=\"stash-textarea|textarea\"\n v-bind=\"inputAttrs\"\n @input=\"onInput\"\n ></textarea>\n </template>\n <template v-if=\"slots.hint\" #hint>\n <!-- @slot Hint content -->\n <slot name=\"hint\"></slot>\n </template>\n </Field>\n</template>\n\n<style module>\n .root {\n position: relative;\n width: 100%;\n }\n\n .textarea {\n background: var(--color-white);\n border: 1px solid;\n border-color: var(--color-ice-500);\n border-radius: theme('borderRadius.DEFAULT');\n color: var(--color-ice-700);\n display: block;\n min-height: 100px;\n outline: none;\n padding: theme('spacing[1.5]');\n width: 100%;\n\n &:hover {\n border-color: var(--color-ice-500);\n }\n\n &:focus,\n &:active {\n border-color: var(--color-blue-500);\n }\n\n &.stash-textarea--error {\n border-color: var(--color-red-500);\n color: var(--color-red-500);\n }\n\n &::placeholder {\n color: var(--color-ice-500);\n opacity: 1;\n }\n\n &[disabled],\n &[readonly] {\n background-color: var(--color-ice-200);\n border-color: var(--color-ice-500);\n color: var(--color-ice-700);\n pointer-events: none;\n }\n\n &[disabled]:active,\n &[readonly]:active,\n &[disabled]:focus,\n &[readonly]:focus {\n box-shadow: none;\n }\n\n &[disabled]::placeholder,\n &[readonly]::placeholder {\n text-transform: none;\n }\n }\n</style>\n"],"names":["id","uniqueId","attrs","useAttrs","slots","useSlots","classes","useCssModule","textareaRef","ref","observer","inputAttrs","computed","allAttrs","watch","props","v","setupResizeObserver","_a","onInput","event","emits","entry","target","parent","findParentScrollable","scrollPosition","offsetDiff","top","height","getOffsetClipRect","viewportHeight","parentTop","parentHeight","offsetTop","el","overflowY","width","left","findPos","offsetLeft","offsetParent","onMounted","nextTick","onBeforeUnmount"],"mappings":"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"}