@leaflink/stash 43.5.1 → 44.0.0-beta.2
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.
- package/dist/ActionsDropdown.js +9 -9
- package/dist/ActionsDropdown.js.map +1 -1
- package/dist/AddressSelect.js +12 -11
- package/dist/AddressSelect.js.map +1 -1
- package/dist/Alert.js +2 -2
- package/dist/Alert.js.map +1 -1
- package/dist/AppNavigationItem.js +15 -15
- package/dist/AppNavigationItem.js.map +1 -1
- package/dist/AppSidebar.js +17 -17
- package/dist/AppSidebar.js.map +1 -1
- package/dist/AppTopbar.js +12 -12
- package/dist/Avatar.js +12 -12
- package/dist/Avatar.js.map +1 -1
- package/dist/Backdrop.js +1 -1
- package/dist/Backdrop.js.map +1 -1
- package/dist/Badge.js +12 -12
- package/dist/Badge.js.map +1 -1
- package/dist/Button.js +1 -1
- package/dist/Button.js.map +1 -1
- package/dist/Button.vue_used_vue_type_style_index_0_lang.module-b2ee90e6.js +17 -0
- package/dist/Button.vue_used_vue_type_style_index_0_lang.module-b2ee90e6.js.map +1 -0
- package/dist/ButtonGroup.js +26 -26
- package/dist/ButtonGroup.js.map +1 -1
- package/dist/Card.js +3 -3
- package/dist/Card.js.map +1 -1
- package/dist/CardHeader.js +3 -3
- package/dist/CardMedia.js +1 -1
- package/dist/CardMedia.js.map +1 -1
- package/dist/Carousel.js +24 -24
- package/dist/Carousel.js.map +1 -1
- package/dist/Checkbox.js +27 -26
- package/dist/Checkbox.js.map +1 -1
- package/dist/{Checkbox.vue_vue_type_style_index_0_scoped_0d7e7fd0_lang-4ed993c7.js → Checkbox.vue_vue_type_style_index_0_scoped_dbd26d7f_lang-4ed993c7.js} +1 -1
- package/dist/Checkbox.vue_vue_type_style_index_0_scoped_dbd26d7f_lang-4ed993c7.js.map +1 -0
- package/dist/ChevronToggle.js +1 -1
- package/dist/Chip.js +1 -1
- package/dist/Chip.js.map +1 -1
- package/dist/ConfirmationCodeInput.js +21 -21
- package/dist/ConfirmationCodeInput.js.map +1 -1
- package/dist/ContextSwitcher.js +6 -5
- package/dist/ContextSwitcher.js.map +1 -1
- package/dist/Copy.js +1 -1
- package/dist/CurrencyInput.js +2 -2
- package/dist/DataView.js +1 -1
- package/dist/DataViewFilters.js +7 -7
- package/dist/DataViewFilters.js.map +1 -1
- package/dist/DataViewSortButton.js +5 -5
- package/dist/DataViewSortButton.js.map +1 -1
- package/dist/DataViewToolbar.js +4 -4
- package/dist/DataViewToolbar.js.map +1 -1
- package/dist/DatePicker.js +8 -8
- package/dist/DatePicker.js.map +1 -1
- package/dist/DescriptionListTerm.js +1 -1
- package/dist/DescriptionListTerm.js.map +1 -1
- package/dist/Dialog.js +34 -34
- package/dist/Dialog.js.map +1 -1
- package/dist/Dropdown.js +3 -3
- package/dist/Dropdown.js.map +1 -1
- package/dist/EmptyState.js +1 -1
- package/dist/EmptyState.js.map +1 -1
- package/dist/Field.js +2 -2
- package/dist/{Field.vue_vue_type_script_setup_true_lang-475832fe.js → Field.vue_vue_type_script_setup_true_lang-42cf79d4.js} +5 -5
- package/dist/{Field.vue_vue_type_script_setup_true_lang-475832fe.js.map → Field.vue_vue_type_script_setup_true_lang-42cf79d4.js.map} +1 -1
- package/dist/FileUpload.js +25 -25
- package/dist/FileUpload.js.map +1 -1
- package/dist/FilterChip.js +32 -32
- package/dist/FilterChip.js.map +1 -1
- package/dist/FilterDrawerItem.js +4 -4
- package/dist/FilterDrawerItem.js.map +1 -1
- package/dist/FilterDropdown.js +19 -19
- package/dist/FilterDropdown.js.map +1 -1
- package/dist/FilterSelect.js +2 -2
- package/dist/Filters.js +7 -6
- package/dist/Filters.js.map +1 -1
- package/dist/HttpError.js +30 -30
- package/dist/HttpError.js.map +1 -1
- package/dist/IconLabel.js +1 -1
- package/dist/IconLabel.js.map +1 -1
- package/dist/InlineEdit.js +3 -3
- package/dist/InlineEdit.js.map +1 -1
- package/dist/Input.js +37 -37
- package/dist/Input.js.map +1 -1
- package/dist/InputOptions.js +37 -36
- package/dist/InputOptions.js.map +1 -1
- package/dist/Label.js +1 -1
- package/dist/{Label.vue_vue_type_script_setup_true_lang-1d29d98a.js → Label.vue_vue_type_script_setup_true_lang-c5589919.js} +2 -2
- package/dist/{Label.vue_vue_type_script_setup_true_lang-1d29d98a.js.map → Label.vue_vue_type_script_setup_true_lang-c5589919.js.map} +1 -1
- package/dist/ListItem.js +6 -5
- package/dist/ListItem.js.map +1 -1
- package/dist/ListView.js +55 -54
- package/dist/ListView.js.map +1 -1
- package/dist/Menu.js +1 -1
- package/dist/Menu.js.map +1 -1
- package/dist/Metric.js +4 -4
- package/dist/Metric.js.map +1 -1
- package/dist/Modal.js +21 -21
- package/dist/Modal.js.map +1 -1
- package/dist/Module.js +2 -2
- package/dist/Module.js.map +1 -1
- package/dist/ModuleContent.js +2 -2
- package/dist/ModuleContent.js.map +1 -1
- package/dist/ModuleFooter.js +11 -11
- package/dist/ModuleFooter.js.map +1 -1
- package/dist/ModuleHeader.js +6 -6
- package/dist/ModuleHeader.js.map +1 -1
- package/dist/ObfuscateText.js +1 -1
- package/dist/PageHeader.js +3 -3
- package/dist/PageHeader.js.map +1 -1
- package/dist/PageNavigation.js +2 -2
- package/dist/Paginate.js +1 -1
- package/dist/Paginate.js.map +1 -1
- package/dist/Paginate.vue_used_vue_type_style_index_0_lang.module-1a2084f9.js +11 -0
- package/dist/Paginate.vue_used_vue_type_style_index_0_lang.module-1a2084f9.js.map +1 -0
- package/dist/QuickAction.js +11 -11
- package/dist/QuickAction.js.map +1 -1
- package/dist/Radio.js +2 -2
- package/dist/Radio.js.map +1 -1
- package/dist/RadioGroup.js +44 -44
- package/dist/RadioGroup.js.map +1 -1
- package/dist/RadioNew.js +14 -14
- package/dist/SearchBar.js +21 -21
- package/dist/SearchBar.js.map +1 -1
- package/dist/Select.js +187 -186
- package/dist/Select.js.map +1 -1
- package/dist/SelectStatus.js +22 -21
- package/dist/SelectStatus.js.map +1 -1
- package/dist/Step.js +37 -37
- package/dist/Step.js.map +1 -1
- package/dist/Switch.js +26 -25
- package/dist/Switch.js.map +1 -1
- package/dist/Tab.js +3 -2
- package/dist/Tab.js.map +1 -1
- package/dist/{Tab.vue_vue_type_script_setup_true_lang-b810bee8.js → Tab.vue_vue_type_script_setup_true_lang-4a40f015.js} +23 -22
- package/dist/Tab.vue_vue_type_script_setup_true_lang-4a40f015.js.map +1 -0
- package/dist/Table.js +20 -19
- package/dist/Table.js.map +1 -1
- package/dist/TableCell.js +22 -21
- package/dist/TableCell.js.map +1 -1
- package/dist/TableHeaderCell.js +7 -6
- package/dist/TableHeaderCell.js.map +1 -1
- package/dist/TableHeaderRow.js +6 -5
- package/dist/TableHeaderRow.js.map +1 -1
- package/dist/TableRow.js +24 -23
- package/dist/TableRow.js.map +1 -1
- package/dist/Tabs.js +2 -2
- package/dist/{Tabs.vue_used_vue_type_style_index_0_lang.module-4f247ed7.js → Tabs.vue_used_vue_type_style_index_0_lang.module-0af1e1cf.js} +3 -3
- package/dist/{Tabs.vue_used_vue_type_style_index_0_lang.module-4f247ed7.js.map → Tabs.vue_used_vue_type_style_index_0_lang.module-0af1e1cf.js.map} +1 -1
- package/dist/Textarea.js +3 -3
- package/dist/Textarea.js.map +1 -1
- package/dist/components.css +1 -1
- package/dist/index.js +21 -20
- package/dist/index.js.map +1 -1
- package/dist/storage.js +3 -2
- package/dist/storage.js.map +1 -1
- package/dist/useGoogleMaps.js.map +1 -1
- package/dist/utils/storage.js +30 -29
- package/dist/utils/storage.js.map +1 -1
- package/package.json +2 -2
- package/styles/_base.scss +1 -1
- package/styles/_core.scss +49 -1
- package/styles/backwards-compat.css +1407 -2
- package/styles/base.css +388 -19
- package/styles/elements/_links.scss +1 -1
- package/dist/Button.vue_used_vue_type_style_index_0_lang.module-b77978d6.js +0 -17
- package/dist/Button.vue_used_vue_type_style_index_0_lang.module-b77978d6.js.map +0 -1
- package/dist/Checkbox.vue_vue_type_style_index_0_scoped_0d7e7fd0_lang-4ed993c7.js.map +0 -1
- package/dist/Paginate.vue_used_vue_type_style_index_0_lang.module-bfccf992.js +0 -11
- package/dist/Paginate.vue_used_vue_type_style_index_0_lang.module-bfccf992.js.map +0 -1
- package/dist/Tab.vue_vue_type_script_setup_true_lang-b810bee8.js.map +0 -1
- package/styles/components/_all.scss +0 -14
- package/styles/components/_box.scss +0 -13
- package/styles/components/_item-list.scss +0 -78
- package/styles/components/_sidebar.scss +0 -404
- package/styles/components/_top-header.scss +0 -219
- package/styles/elements/_all.scss +0 -15
- package/styles/elements/_buttons.scss +0 -235
- package/styles/elements/_forms.scss +0 -300
- package/styles/elements/_tables.scss +0 -80
- package/styles/elements/_tooltips.scss +0 -110
- package/styles/utility/_all.scss +0 -12
- package/styles/utility/_animations.scss +0 -103
- package/styles/utility/_display.scss +0 -167
- package/styles/utility/_grid.scss +0 -200
- package/styles/utility/_icons.scss +0 -31
- package/styles/utility/_transitions.scss +0 -110
package/dist/ActionsDropdown.js
CHANGED
|
@@ -5,7 +5,7 @@ import x from "./Dropdown.js";
|
|
|
5
5
|
import B from "./Icon.js";
|
|
6
6
|
import { _ as D } from "./_plugin-vue_export-helper-dad06003.js";
|
|
7
7
|
import "lodash-es/get";
|
|
8
|
-
import "./Button.vue_used_vue_type_style_index_0_lang.module-
|
|
8
|
+
import "./Button.vue_used_vue_type_style_index_0_lang.module-b2ee90e6.js";
|
|
9
9
|
import "./constants.js";
|
|
10
10
|
import "./clickoutside.js";
|
|
11
11
|
import "./utils/calculateElementOverflow.js";
|
|
@@ -27,7 +27,7 @@ const y = /* @__PURE__ */ c({
|
|
|
27
27
|
},
|
|
28
28
|
setup(l) {
|
|
29
29
|
const o = l, t = p();
|
|
30
|
-
return (d,
|
|
30
|
+
return (d, N) => (m(), u(x, {
|
|
31
31
|
align: o.align,
|
|
32
32
|
"content-class": [n(t).dropdownContent, o.contentClass],
|
|
33
33
|
class: s(n(t).actionsDropdown)
|
|
@@ -61,14 +61,14 @@ const y = /* @__PURE__ */ c({
|
|
|
61
61
|
}
|
|
62
62
|
]), 1032, ["align", "content-class", "class"]));
|
|
63
63
|
}
|
|
64
|
-
}), k = "
|
|
64
|
+
}), k = "_actionButton_184sp_2", S = "_disabled_184sp_12", M = "_dropdownContent_184sp_18", T = "_actionsDropdown_184sp_33", h = {
|
|
65
65
|
actionButton: k,
|
|
66
|
-
disabled:
|
|
67
|
-
dropdownContent:
|
|
68
|
-
actionsDropdown:
|
|
69
|
-
},
|
|
70
|
-
$style:
|
|
71
|
-
}, U = /* @__PURE__ */ D(y, [["__cssModules",
|
|
66
|
+
disabled: S,
|
|
67
|
+
dropdownContent: M,
|
|
68
|
+
actionsDropdown: T
|
|
69
|
+
}, A = {
|
|
70
|
+
$style: h
|
|
71
|
+
}, U = /* @__PURE__ */ D(y, [["__cssModules", A]]);
|
|
72
72
|
export {
|
|
73
73
|
U as default
|
|
74
74
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsDropdown.js","sources":["../src/components/ActionsDropdown/ActionsDropdown.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n import { useCssModule } from 'vue';\n\n import { t } from '../../locale';\n import Button from '../Button/Button.vue';\n import Dropdown from '../Dropdown/Dropdown.vue';\n import Icon from '../Icon/Icon.vue';\n\n defineOptions({\n name: 'll-actions-dropdown',\n });\n\n export interface ActionsDropdownProps {\n /**\n * Used to position the dropdown relative to target\n * Options: left, right\n */\n align?: 'left' | 'right';\n /**\n * Indicates whether the trigger button is disabled or not\n */\n disabled?: boolean;\n /**\n * Class to be applied to the dropdown content\n */\n contentClass?: string;\n /**\n * Text to be displayed on the trigger button\n */\n buttonText?: string;\n }\n\n const props = withDefaults(defineProps<ActionsDropdownProps>(), {\n align: 'left',\n disabled: false,\n contentClass: '',\n buttonText: () => t('ll.actions'),\n });\n\n const classes = useCssModule();\n</script>\n\n<template>\n <Dropdown\n :align=\"props.align\"\n :content-class=\"[classes.dropdownContent, props.contentClass]\"\n :class=\"classes.actionsDropdown\"\n >\n <template #toggle=\"{ isActive, toggle }\">\n <Button\n class=\"button flex align-middle align-justify w-full border border-blue text-blue\"\n secondary\n :aria-expanded=\"isActive.toString()\"\n :class=\"[classes.actionButton, { [classes.disabled]: props.disabled }]\"\n :disabled=\"props.disabled\"\n @click=\"toggle\"\n >\n {{ props.buttonText }} <Icon class=\"tw-ml-1.5\" name=\"caret-down\" />\n </Button>\n </template>\n\n <template v-if=\"!props.disabled\" #default>\n <!-- @slot Dropdown content -->\n <slot></slot>\n </template>\n </Dropdown>\n</template>\n\n<style module>\n .actionButton {\n min-width: 156px;\n white-space: normal;\n }\n\n .actionButton:hover {\n background-color: var(--color-blue-100);\n border-color: var(--color-blue) !important;\n }\n\n .disabled {\n background-color: var(--color-ice-100) !important;\n border-color: var(--color-ice-500) !important;\n color: var(--color-ice-500) !important;\n }\n\n .dropdownContent {\n margin-top: 4px;\n }\n\n .dropdownContent:global(.dropdown__content) {\n margin-left: 0;\n margin-right: 0;\n max-width: 90vw;\n }\n\n .dropdownContent:global(.dropdown__content)::after {\n display: none;\n }\n\n @media screen(md) {\n .actionsDropdown {\n min-width: 156px;\n }\n\n .dropdownContent:global(.dropdown__content) {\n min-width: 156px;\n }\n }\n</style>\n"],"names":["classes","useCssModule"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuCQA,IAAUC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"ActionsDropdown.js","sources":["../src/components/ActionsDropdown/ActionsDropdown.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n import { useCssModule } from 'vue';\n\n import { t } from '../../locale';\n import Button from '../Button/Button.vue';\n import Dropdown from '../Dropdown/Dropdown.vue';\n import Icon from '../Icon/Icon.vue';\n\n defineOptions({\n name: 'll-actions-dropdown',\n });\n\n export interface ActionsDropdownProps {\n /**\n * Used to position the dropdown relative to target\n * Options: left, right\n */\n align?: 'left' | 'right';\n /**\n * Indicates whether the trigger button is disabled or not\n */\n disabled?: boolean;\n /**\n * Class to be applied to the dropdown content\n */\n contentClass?: string;\n /**\n * Text to be displayed on the trigger button\n */\n buttonText?: string;\n }\n\n const props = withDefaults(defineProps<ActionsDropdownProps>(), {\n align: 'left',\n disabled: false,\n contentClass: '',\n buttonText: () => t('ll.actions'),\n });\n\n const classes = useCssModule();\n</script>\n\n<template>\n <Dropdown\n :align=\"props.align\"\n :content-class=\"[classes.dropdownContent, props.contentClass]\"\n :class=\"classes.actionsDropdown\"\n >\n <template #toggle=\"{ isActive, toggle }\">\n <Button\n class=\"button flex align-middle align-justify w-full border border-blue text-blue\"\n secondary\n :aria-expanded=\"isActive.toString()\"\n :class=\"[classes.actionButton, { [classes.disabled]: props.disabled }]\"\n :disabled=\"props.disabled\"\n @click=\"toggle\"\n >\n {{ props.buttonText }} <Icon class=\"tw-ml-1.5\" name=\"caret-down\" />\n </Button>\n </template>\n\n <template v-if=\"!props.disabled\" #default>\n <!-- @slot Dropdown content -->\n <slot></slot>\n </template>\n </Dropdown>\n</template>\n\n<style module>\n .actionButton {\n min-width: 156px;\n white-space: normal;\n }\n\n .actionButton:hover {\n background-color: var(--color-blue-100);\n border-color: var(--color-blue-500) !important;\n }\n\n .disabled {\n background-color: var(--color-ice-100) !important;\n border-color: var(--color-ice-500) !important;\n color: var(--color-ice-500) !important;\n }\n\n .dropdownContent {\n margin-top: 4px;\n }\n\n .dropdownContent:global(.dropdown__content) {\n margin-left: 0;\n margin-right: 0;\n max-width: 90vw;\n }\n\n .dropdownContent:global(.dropdown__content)::after {\n display: none;\n }\n\n @media screen(md) {\n .actionsDropdown {\n min-width: 156px;\n }\n\n .dropdownContent:global(.dropdown__content) {\n min-width: 156px;\n }\n }\n</style>\n"],"names":["classes","useCssModule"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuCQA,IAAUC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/AddressSelect.js
CHANGED
|
@@ -5,6 +5,7 @@ import C from "./useGoogleMaps.js";
|
|
|
5
5
|
import { DEBOUNCE as U } from "./constants.js";
|
|
6
6
|
import q from "./Select.js";
|
|
7
7
|
import "lodash-es/keyBy";
|
|
8
|
+
import "@leaflink/snitch";
|
|
8
9
|
import "lodash-es/isEmpty";
|
|
9
10
|
import "lodash-es/isEqual";
|
|
10
11
|
import "lodash-es/isPlainObject";
|
|
@@ -23,10 +24,10 @@ import "./Icon.js";
|
|
|
23
24
|
import "./index-79ce320f.js";
|
|
24
25
|
import "./Icon.vue_used_vue_type_style_index_0_lang.module-eb359559.js";
|
|
25
26
|
import "./_plugin-vue_export-helper-dad06003.js";
|
|
26
|
-
import "./Field.vue_vue_type_script_setup_true_lang-
|
|
27
|
-
import "./Label.vue_vue_type_script_setup_true_lang-
|
|
27
|
+
import "./Field.vue_vue_type_script_setup_true_lang-42cf79d4.js";
|
|
28
|
+
import "./Label.vue_vue_type_script_setup_true_lang-c5589919.js";
|
|
28
29
|
import "./locale.js";
|
|
29
|
-
const _ = "address-select-",
|
|
30
|
+
const _ = "address-select-", ve = /* @__PURE__ */ M({
|
|
30
31
|
__name: "AddressSelect",
|
|
31
32
|
props: {
|
|
32
33
|
apiKey: { default: void 0 },
|
|
@@ -51,7 +52,7 @@ const _ = "address-select-", fe = /* @__PURE__ */ M({
|
|
|
51
52
|
const t = g, V = S(), d = A("stashOptions"), u = h(() => t.apiKey || (d == null ? void 0 : d.googleMapsApiKey));
|
|
52
53
|
if (!u.value)
|
|
53
54
|
throw new Error("Google Maps API key is required");
|
|
54
|
-
const { getPlaceDetails: b, getPlacePredictions: x } = C(u.value),
|
|
55
|
+
const { getPlaceDetails: b, getPlacePredictions: x } = C(u.value), i = n(!1), a = n(), r = n(), E = G(w, t.debounceTime), s = h(() => {
|
|
55
56
|
var e, p, m, c, f, v;
|
|
56
57
|
return [
|
|
57
58
|
[(e = t.modelValue) == null ? void 0 : e.street_address, (p = t.modelValue) == null ? void 0 : p.extended_address].filter(Boolean).join(" "),
|
|
@@ -62,18 +63,18 @@ const _ = "address-select-", fe = /* @__PURE__ */ M({
|
|
|
62
63
|
});
|
|
63
64
|
T(() => t.modelValue, () => {
|
|
64
65
|
var o;
|
|
65
|
-
if (
|
|
66
|
+
if (s.value && !((o = a.value) != null && o.length)) {
|
|
66
67
|
const e = {
|
|
67
68
|
id: t.modelValue.place_id || K(_),
|
|
68
|
-
name:
|
|
69
|
+
name: s.value,
|
|
69
70
|
address: t.modelValue
|
|
70
71
|
};
|
|
71
72
|
a.value = [e], r.value = e;
|
|
72
73
|
} else
|
|
73
|
-
|
|
74
|
+
s.value || (r.value = void 0, a.value = []);
|
|
74
75
|
}, { immediate: !0 });
|
|
75
76
|
async function w(o) {
|
|
76
|
-
|
|
77
|
+
i.value = !0;
|
|
77
78
|
try {
|
|
78
79
|
a.value = await x(o);
|
|
79
80
|
} catch (e) {
|
|
@@ -82,7 +83,7 @@ const _ = "address-select-", fe = /* @__PURE__ */ M({
|
|
|
82
83
|
else
|
|
83
84
|
throw e;
|
|
84
85
|
} finally {
|
|
85
|
-
|
|
86
|
+
i.value = !1;
|
|
86
87
|
}
|
|
87
88
|
}
|
|
88
89
|
async function B(o) {
|
|
@@ -115,7 +116,7 @@ const _ = "address-select-", fe = /* @__PURE__ */ M({
|
|
|
115
116
|
single: "",
|
|
116
117
|
"data-test": "select|address",
|
|
117
118
|
disabled: t.disabled,
|
|
118
|
-
loading:
|
|
119
|
+
loading: i.value,
|
|
119
120
|
options: a.value,
|
|
120
121
|
placeholder: t.placeholder,
|
|
121
122
|
label: t.label,
|
|
@@ -138,6 +139,6 @@ const _ = "address-select-", fe = /* @__PURE__ */ M({
|
|
|
138
139
|
}
|
|
139
140
|
});
|
|
140
141
|
export {
|
|
141
|
-
|
|
142
|
+
ve as default
|
|
142
143
|
};
|
|
143
144
|
//# sourceMappingURL=AddressSelect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddressSelect.js","sources":["../src/components/AddressSelect/AddressSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import debounce from 'lodash-es/debounce';\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, inject, ref, useSlots, watch } from 'vue';\n\n import { StashProvideState } from '../../../types/misc';\n import useGoogleMaps, { type Address, type AddressOption } from '../../composables/useGoogleMaps/useGoogleMaps';\n import { DEBOUNCE } from '../../constants';\n import Select from '../Select/Select.vue';\n\n export interface AddressSelectProps {\n /**\n * Google Maps API Key. This takes precedence over the key defined in stashOptions\n */\n apiKey?: string;\n /**\n * Wether the Select is disabled or not\n */\n disabled?: boolean;\n /**\n * Select placeholder\n */\n placeholder?: string;\n /**\n * Debounce time in milliseconds to perform API requests on search\n */\n debounceTime?: number;\n /**\n * Model value address\n */\n modelValue: Address;\n /**\n * Hint text to be passed down to Select component\n */\n hintText?: string;\n /**\n * Error text to be passed down to Select component\n */\n errorText?: string;\n /**\n * Label text to be passed down to Select component\n */\n label?: string;\n /**\n * Disallows values from being de-selected\n */\n preventEmpty?: boolean;\n }\n\n const props = withDefaults(defineProps<AddressSelectProps>(), {\n disabled: false,\n placeholder: 'Type an address',\n debounceTime: DEBOUNCE.MEDIUM,\n modelValue: () => ({\n street_address: undefined,\n extended_address: undefined,\n city: undefined,\n state: undefined,\n postal_code: undefined,\n country: undefined,\n }),\n hintText: undefined,\n errorText: undefined,\n label: undefined,\n preventEmpty: false,\n apiKey: undefined,\n });\n\n const emit = defineEmits<{\n /**\n * Emitted when the model value changes\n */\n (e: 'update:modelValue', value: Address): void,\n /**\n * Emitted when an error occurs while reaching out to Google's API\n */\n (e: 'error', value: unknown): void\n }>();\n\n const slots = useSlots();\n const stashOptions = inject<StashProvideState>('stashOptions');\n\n const googleMapsApiKey = computed(() => props.apiKey || stashOptions?.googleMapsApiKey);\n\n if (!googleMapsApiKey.value) {\n throw new Error('Google Maps API key is required');\n }\n\n const { getPlaceDetails, getPlacePredictions } = useGoogleMaps(googleMapsApiKey.value);\n\n const ID_PREFIX = 'address-select-';\n\n const isLoading = ref(false);\n const options = ref<Array<AddressOption>>();\n const internalValue = ref<AddressOption>();\n\n const debouncedSearch = debounce(search, props.debounceTime);\n\n const formattedAddress = computed(() => {\n const formattedAddress = [\n [props.modelValue?.street_address, props.modelValue?.extended_address].filter(Boolean).join(' '),\n props.modelValue?.city,\n [props.modelValue?.state, props.modelValue?.postal_code].filter(Boolean).join(' '),\n props.modelValue?.country\n ].filter(Boolean).join(', ');\n\n return formattedAddress;\n });\n\n // When we don't have options just yet, we need to create them on our own\n watch(() => props.modelValue, () => {\n if (formattedAddress.value && !options.value?.length) {\n const option = {\n id: props.modelValue.place_id || uniqueId(ID_PREFIX),\n name: formattedAddress.value,\n address: props.modelValue,\n };\n\n options.value = [option];\n internalValue.value = option;\n } else if (!formattedAddress.value) {\n internalValue.value = undefined;\n options.value = [];\n }\n }, { immediate: true });\n\n async function search(query: string) {\n isLoading.value = true;\n\n try {\n options.value = await getPlacePredictions(query);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n options.value = [];\n if (error?.isGoogleMapsError) {\n emit('error', error);\n } else {\n throw error;\n }\n } finally {\n isLoading.value = false;\n }\n }\n\n async function select(option: AddressOption) {\n internalValue.value = option;\n\n // When an option is de-selected, the option will be undefined\n if (!option) {\n emit('update:modelValue', {\n street_address: undefined,\n extended_address: undefined,\n city: undefined,\n state: undefined,\n postal_code: undefined,\n country: undefined,\n });\n return;\n }\n\n // When an option does not have a google place id, we don't want to fetch it's details\n if (option.id.startsWith(ID_PREFIX) && option.address) {\n emit('update:modelValue', option.address);\n return;\n }\n\n try {\n const address = await getPlaceDetails(option.id);\n emit('update:modelValue', address);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (error?.isGoogleMapsError) {\n emit('error', error);\n } else {\n throw error;\n }\n }\n }\n</script>\n\n<template>\n <Select\n single\n data-test=\"select|address\"\n :disabled=\"props.disabled\"\n :loading=\"isLoading\"\n :options=\"options\"\n :placeholder=\"props.placeholder\"\n :label=\"props.label\"\n :hint-text=\"props.hintText\"\n :error=\"props.errorText\"\n :model-value=\"internalValue\"\n :prevent-empty=\"props.preventEmpty\"\n disable-filtering\n @search=\"debouncedSearch\"\n @update:model-value=\"select\"\n >\n <template v-if=\"slots.hint\" #hint>\n <slot name=\"hint\"></slot>\n </template>\n </Select>\n</template>\n"],"names":["ID_PREFIX","slots","useSlots","stashOptions","inject","googleMapsApiKey","computed","props","getPlaceDetails","getPlacePredictions","useGoogleMaps","isLoading","ref","options","internalValue","debouncedSearch","debounce","search","formattedAddress","_a","_b","_c","_d","_e","_f","watch","option","uniqueId","query","error","emit","select","address"],"mappings":"
|
|
1
|
+
{"version":3,"file":"AddressSelect.js","sources":["../src/components/AddressSelect/AddressSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import debounce from 'lodash-es/debounce';\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, inject, ref, useSlots, watch } from 'vue';\n\n import { StashProvideState } from '../../../types/misc';\n import useGoogleMaps, { type Address, type AddressOption } from '../../composables/useGoogleMaps/useGoogleMaps';\n import { DEBOUNCE } from '../../constants';\n import Select from '../Select/Select.vue';\n\n export interface AddressSelectProps {\n /**\n * Google Maps API Key. This takes precedence over the key defined in stashOptions\n */\n apiKey?: string;\n /**\n * Wether the Select is disabled or not\n */\n disabled?: boolean;\n /**\n * Select placeholder\n */\n placeholder?: string;\n /**\n * Debounce time in milliseconds to perform API requests on search\n */\n debounceTime?: number;\n /**\n * Model value address\n */\n modelValue: Address;\n /**\n * Hint text to be passed down to Select component\n */\n hintText?: string;\n /**\n * Error text to be passed down to Select component\n */\n errorText?: string;\n /**\n * Label text to be passed down to Select component\n */\n label?: string;\n /**\n * Disallows values from being de-selected\n */\n preventEmpty?: boolean;\n }\n\n const props = withDefaults(defineProps<AddressSelectProps>(), {\n disabled: false,\n placeholder: 'Type an address',\n debounceTime: DEBOUNCE.MEDIUM,\n modelValue: () => ({\n street_address: undefined,\n extended_address: undefined,\n city: undefined,\n state: undefined,\n postal_code: undefined,\n country: undefined,\n }),\n hintText: undefined,\n errorText: undefined,\n label: undefined,\n preventEmpty: false,\n apiKey: undefined,\n });\n\n const emit = defineEmits<{\n /**\n * Emitted when the model value changes\n */\n (e: 'update:modelValue', value: Address): void,\n /**\n * Emitted when an error occurs while reaching out to Google's API\n */\n (e: 'error', value: unknown): void\n }>();\n\n const slots = useSlots();\n const stashOptions = inject<StashProvideState>('stashOptions');\n\n const googleMapsApiKey = computed(() => props.apiKey || stashOptions?.googleMapsApiKey);\n\n if (!googleMapsApiKey.value) {\n throw new Error('Google Maps API key is required');\n }\n\n const { getPlaceDetails, getPlacePredictions } = useGoogleMaps(googleMapsApiKey.value);\n\n const ID_PREFIX = 'address-select-';\n\n const isLoading = ref(false);\n const options = ref<Array<AddressOption>>();\n const internalValue = ref<AddressOption>();\n\n const debouncedSearch = debounce(search, props.debounceTime);\n\n const formattedAddress = computed(() => {\n const formattedAddress = [\n [props.modelValue?.street_address, props.modelValue?.extended_address].filter(Boolean).join(' '),\n props.modelValue?.city,\n [props.modelValue?.state, props.modelValue?.postal_code].filter(Boolean).join(' '),\n props.modelValue?.country\n ].filter(Boolean).join(', ');\n\n return formattedAddress;\n });\n\n // When we don't have options just yet, we need to create them on our own\n watch(() => props.modelValue, () => {\n if (formattedAddress.value && !options.value?.length) {\n const option = {\n id: props.modelValue.place_id || uniqueId(ID_PREFIX),\n name: formattedAddress.value,\n address: props.modelValue,\n };\n\n options.value = [option];\n internalValue.value = option;\n } else if (!formattedAddress.value) {\n internalValue.value = undefined;\n options.value = [];\n }\n }, { immediate: true });\n\n async function search(query: string) {\n isLoading.value = true;\n\n try {\n options.value = await getPlacePredictions(query);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n options.value = [];\n if (error?.isGoogleMapsError) {\n emit('error', error);\n } else {\n throw error;\n }\n } finally {\n isLoading.value = false;\n }\n }\n\n async function select(option: AddressOption) {\n internalValue.value = option;\n\n // When an option is de-selected, the option will be undefined\n if (!option) {\n emit('update:modelValue', {\n street_address: undefined,\n extended_address: undefined,\n city: undefined,\n state: undefined,\n postal_code: undefined,\n country: undefined,\n });\n return;\n }\n\n // When an option does not have a google place id, we don't want to fetch it's details\n if (option.id.startsWith(ID_PREFIX) && option.address) {\n emit('update:modelValue', option.address);\n return;\n }\n\n try {\n const address = await getPlaceDetails(option.id);\n emit('update:modelValue', address);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (error?.isGoogleMapsError) {\n emit('error', error);\n } else {\n throw error;\n }\n }\n }\n</script>\n\n<template>\n <Select\n single\n data-test=\"select|address\"\n :disabled=\"props.disabled\"\n :loading=\"isLoading\"\n :options=\"options\"\n :placeholder=\"props.placeholder\"\n :label=\"props.label\"\n :hint-text=\"props.hintText\"\n :error=\"props.errorText\"\n :model-value=\"internalValue\"\n :prevent-empty=\"props.preventEmpty\"\n disable-filtering\n @search=\"debouncedSearch\"\n @update:model-value=\"select\"\n >\n <template v-if=\"slots.hint\" #hint>\n <slot name=\"hint\"></slot>\n </template>\n </Select>\n</template>\n"],"names":["ID_PREFIX","slots","useSlots","stashOptions","inject","googleMapsApiKey","computed","props","getPlaceDetails","getPlacePredictions","useGoogleMaps","isLoading","ref","options","internalValue","debouncedSearch","debounce","search","formattedAddress","_a","_b","_c","_d","_e","_f","watch","option","uniqueId","query","error","emit","select","address"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0FE,MAAMA,IAAY;;;;;;;;;;;;;;;;;;;;;;iBAXZC,IAAQC,KACRC,IAAeC,EAA0B,cAAc,GAEvDC,IAAmBC,EAAS,MAAMC,EAAM,WAAUJ,KAAA,gBAAAA,EAAc,iBAAgB;AAElF,QAAA,CAACE,EAAiB;AACd,YAAA,IAAI,MAAM,iCAAiC;AAGnD,UAAM,EAAE,iBAAAG,GAAiB,qBAAAC,EAAA,IAAwBC,EAAcL,EAAiB,KAAK,GAI/EM,IAAYC,EAAI,EAAK,GACrBC,IAAUD,KACVE,IAAgBF,KAEhBG,IAAkBC,EAASC,GAAQV,EAAM,YAAY,GAErDW,IAAmBZ,EAAS,MAAM;;AAQ/BY,aAPkB;AAAA,QACvB,EAACC,IAAAZ,EAAM,eAAN,gBAAAY,EAAkB,iBAAgBC,IAAAb,EAAM,eAAN,gBAAAa,EAAkB,gBAAgB,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,SAC/FC,IAAAd,EAAM,eAAN,gBAAAc,EAAkB;AAAA,QAClB,EAACC,IAAAf,EAAM,eAAN,gBAAAe,EAAkB,QAAOC,IAAAhB,EAAM,eAAN,gBAAAgB,EAAkB,WAAW,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,SACjFC,IAAAjB,EAAM,eAAN,gBAAAiB,EAAkB;AAAA,MAClB,EAAA,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,IAEpB,CACR;AAGK,IAAAC,EAAA,MAAMlB,EAAM,YAAY,MAAM;;AAClC,UAAIW,EAAiB,SAAS,GAACC,IAAAN,EAAQ,UAAR,QAAAM,EAAe,SAAQ;AACpD,cAAMO,IAAS;AAAA,UACb,IAAInB,EAAM,WAAW,YAAYoB,EAAS3B,CAAS;AAAA,UACnD,MAAMkB,EAAiB;AAAA,UACvB,SAASX,EAAM;AAAA,QAAA;AAGT,QAAAM,EAAA,QAAQ,CAACa,CAAM,GACvBZ,EAAc,QAAQY;AAAA,MAAA;AACxB,QAAYR,EAAiB,UAC3BJ,EAAc,QAAQ,QACtBD,EAAQ,QAAQ;IAClB,GACC,EAAE,WAAW,GAAA,CAAM;AAEtB,mBAAeI,EAAOW,GAAe;AACnC,MAAAjB,EAAU,QAAQ;AAEd,UAAA;AACM,QAAAE,EAAA,QAAQ,MAAMJ,EAAoBmB,CAAK;AAAA,eAExCC,GAAY;AAEnB,YADAhB,EAAQ,QAAQ,IACZgB,KAAA,QAAAA,EAAO;AACT,UAAAC,EAAK,SAASD,CAAK;AAAA;AAEb,gBAAAA;AAAA,MACR,UACA;AACA,QAAAlB,EAAU,QAAQ;AAAA,MACpB;AAAA,IACF;AAEA,mBAAeoB,EAAOL,GAAuB;AAI3C,UAHAZ,EAAc,QAAQY,GAGlB,CAACA,GAAQ;AACX,QAAAI,EAAK,qBAAqB;AAAA,UACxB,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,UACb,SAAS;AAAA,QAAA,CACV;AACD;AAAA,MACF;AAGA,UAAIJ,EAAO,GAAG,WAAW1B,CAAS,KAAK0B,EAAO,SAAS;AAChD,QAAAI,EAAA,qBAAqBJ,EAAO,OAAO;AACxC;AAAA,MACF;AAEI,UAAA;AACF,cAAMM,IAAU,MAAMxB,EAAgBkB,EAAO,EAAE;AAC/C,QAAAI,EAAK,qBAAqBE,CAAO;AAAA,eAE1BH,GAAY;AACnB,YAAIA,KAAA,QAAAA,EAAO;AACT,UAAAC,EAAK,SAASD,CAAK;AAAA;AAEb,gBAAAA;AAAA,MAEV;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/Alert.js
CHANGED
|
@@ -22,7 +22,7 @@ const z = { class: "tw-m-0" }, A = /* @__PURE__ */ x({
|
|
|
22
22
|
const e = b, g = B("close-icon"), _ = $(), a = C(), c = I(!0), d = s(() => M[y(e.severity)]), h = s(() => N[y(e.severity)]), k = s(() => e.variant === "filled" && ["warning", "success"].includes(e.severity) ? "tw-text-ice-900" : e.variant === "filled" && ["info", "error"].includes(e.severity) ? "tw-text-white" : `tw-text-${h.value}`), n = s(() => e.variant === "filled" && ["info", "error"].includes(e.severity) ? "tw-text-white" : "tw-text-ice-900");
|
|
23
23
|
return (u, v) => c.value ? S((i(), l("div", {
|
|
24
24
|
key: 0,
|
|
25
|
-
class: r(["stash-alert tw-
|
|
25
|
+
class: r(["stash-alert tw-relative tw-flex tw-items-center tw-border tw-border-solid tw-p-3 tw-leading-6", [
|
|
26
26
|
`stash-alert--${e.severity}`,
|
|
27
27
|
`stash-alert--${e.variant}`,
|
|
28
28
|
n.value,
|
|
@@ -53,7 +53,7 @@ const z = { class: "tw-m-0" }, A = /* @__PURE__ */ x({
|
|
|
53
53
|
"data-test": "stash-alert|status-icon"
|
|
54
54
|
}, null, 8, ["class", "name", "title"]),
|
|
55
55
|
f("div", {
|
|
56
|
-
class: r(["tw-flex tw-flex-1 tw-
|
|
56
|
+
class: r(["tw-flex tw-flex-1 tw-flex-wrap tw-px-2", {
|
|
57
57
|
"tw-justify-center": e.centered,
|
|
58
58
|
"tw-justify-between": !e.centered
|
|
59
59
|
}])
|
package/dist/Alert.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Alert.js","sources":["../src/components/Alert/Alert.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import capitalize from 'lodash-es/capitalize';\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, ref, useCssModule, useSlots } from 'vue';\n\n import { StatusColor, StatusColors, StatusIcon, StatusIcons, StatusSeverity } from '../../../types/statusLevels';\n import vSticky from '../../directives/sticky/sticky';\n import Icon from '../Icon/Icon.vue';\n\n defineOptions({\n name: 'll-alert',\n });\n\n export interface AlertProps {\n /**\n * Determines if the alert is centered\n */\n centered?: boolean;\n\n /**\n * Determines if the alert is permanent (doesn't have a close button).\n */\n permanent?: boolean;\n\n /**\n * The type of border radius to use. Available types:\n *\n * - `none` - no border radius\n * - `standard` - 4px border radius\n */\n radius?: 'none' | 'standard';\n\n /**\n * The type of alert. Available types:\n *\n * - `info`\n * - `success`\n * - `warning`\n * - `error`\n */\n severity?: StatusSeverity;\n\n /**\n * Determines if the alert is sticky. By default, it's not sticky. The provided `number` value is a top offset of alert.\n */\n sticky?: number | null;\n\n /**\n * The variant of alert. Available variants:\n *\n * - `filled` - previously alert component\n * - `outlined` - previously banner component\n */\n variant?: 'outlined' | 'filled';\n }\n\n const props = withDefaults(defineProps<AlertProps>(), {\n centered: false,\n permanent: false,\n radius: 'standard',\n severity: 'info',\n sticky: null,\n variant: 'outlined',\n });\n\n const iconId = uniqueId('close-icon');\n const slots = useSlots();\n const classes = useCssModule();\n const show = ref(true);\n const icon = computed<StatusIcon>(() => StatusIcons[capitalize(props.severity)]);\n const color = computed<StatusColor>(() => StatusColors[capitalize(props.severity)]);\n\n const iconColor = computed<string>(() => {\n if (props.variant === 'filled' && ['warning', 'success'].includes(props.severity)) {\n return 'tw-text-ice-900';\n }\n\n if (props.variant === 'filled' && ['info', 'error'].includes(props.severity)) {\n return 'tw-text-white';\n }\n\n return `tw-text-${color.value}`;\n });\n\n const computedTextColor = computed<string>(() => {\n if (props.variant === 'filled' && ['info', 'error'].includes(props.severity)) {\n return 'tw-text-white';\n }\n\n return 'tw-text-ice-900';\n });\n</script>\n\n<template>\n <div\n v-if=\"show\"\n v-sticky=\"props.sticky\"\n class=\"stash-alert tw-
|
|
1
|
+
{"version":3,"file":"Alert.js","sources":["../src/components/Alert/Alert.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import capitalize from 'lodash-es/capitalize';\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, ref, useCssModule, useSlots } from 'vue';\n\n import { StatusColor, StatusColors, StatusIcon, StatusIcons, StatusSeverity } from '../../../types/statusLevels';\n import vSticky from '../../directives/sticky/sticky';\n import Icon from '../Icon/Icon.vue';\n\n defineOptions({\n name: 'll-alert',\n });\n\n export interface AlertProps {\n /**\n * Determines if the alert is centered\n */\n centered?: boolean;\n\n /**\n * Determines if the alert is permanent (doesn't have a close button).\n */\n permanent?: boolean;\n\n /**\n * The type of border radius to use. Available types:\n *\n * - `none` - no border radius\n * - `standard` - 4px border radius\n */\n radius?: 'none' | 'standard';\n\n /**\n * The type of alert. Available types:\n *\n * - `info`\n * - `success`\n * - `warning`\n * - `error`\n */\n severity?: StatusSeverity;\n\n /**\n * Determines if the alert is sticky. By default, it's not sticky. The provided `number` value is a top offset of alert.\n */\n sticky?: number | null;\n\n /**\n * The variant of alert. Available variants:\n *\n * - `filled` - previously alert component\n * - `outlined` - previously banner component\n */\n variant?: 'outlined' | 'filled';\n }\n\n const props = withDefaults(defineProps<AlertProps>(), {\n centered: false,\n permanent: false,\n radius: 'standard',\n severity: 'info',\n sticky: null,\n variant: 'outlined',\n });\n\n const iconId = uniqueId('close-icon');\n const slots = useSlots();\n const classes = useCssModule();\n const show = ref(true);\n const icon = computed<StatusIcon>(() => StatusIcons[capitalize(props.severity)]);\n const color = computed<StatusColor>(() => StatusColors[capitalize(props.severity)]);\n\n const iconColor = computed<string>(() => {\n if (props.variant === 'filled' && ['warning', 'success'].includes(props.severity)) {\n return 'tw-text-ice-900';\n }\n\n if (props.variant === 'filled' && ['info', 'error'].includes(props.severity)) {\n return 'tw-text-white';\n }\n\n return `tw-text-${color.value}`;\n });\n\n const computedTextColor = computed<string>(() => {\n if (props.variant === 'filled' && ['info', 'error'].includes(props.severity)) {\n return 'tw-text-white';\n }\n\n return 'tw-text-ice-900';\n });\n</script>\n\n<template>\n <div\n v-if=\"show\"\n v-sticky=\"props.sticky\"\n class=\"stash-alert tw-relative tw-flex tw-items-center tw-border tw-border-solid tw-p-3 tw-leading-6\"\n :class=\"[\n `stash-alert--${props.severity}`,\n `stash-alert--${props.variant}`,\n computedTextColor,\n {\n 'tw-my-6': props.variant === 'outlined', // Todo - this makes ZERO sense. We should remove this altogether and let the consumer handle the margin.\n 'tw-rounded': props.radius === 'standard',\n 'tw-border-red-500': props.severity === 'error',\n 'tw-border-orange-500': props.severity === 'warning',\n 'tw-border-blue-500': props.severity === 'info',\n 'tw-border-green-500': props.severity === 'success',\n 'tw-bg-red-500': props.severity === 'error' && props.variant === 'filled',\n 'tw-bg-orange-500': props.severity === 'warning' && props.variant === 'filled',\n 'tw-bg-blue-500': props.severity === 'info' && props.variant === 'filled',\n 'tw-bg-green-500': props.severity === 'success' && props.variant === 'filled',\n 'tw-bg-red-100': props.severity === 'error' && props.variant === 'outlined',\n 'tw-bg-orange-100': props.severity === 'warning' && props.variant === 'outlined',\n 'tw-bg-blue-100': props.severity === 'info' && props.variant === 'outlined',\n 'tw-bg-green-100': props.severity === 'success' && props.variant === 'outlined',\n },\n ]\"\n data-test=\"stash-alert\"\n >\n <Icon\n class=\"stash-alert__icon\"\n :class=\"[classes.iconInfo, iconColor, `stash-alert__icon--${icon}`]\"\n :name=\"icon\"\n :title=\"`${props.severity} icon`\"\n data-test=\"stash-alert|status-icon\"\n />\n\n <!-- Alert text elements -->\n <div\n class=\"tw-flex tw-flex-1 tw-flex-wrap tw-px-2\"\n :class=\"{\n 'tw-justify-center': props.centered,\n 'tw-justify-between': !props.centered,\n }\"\n >\n <p class=\"tw-m-0\">\n <slot></slot>\n </p>\n\n <div\n v-if=\"slots.link\"\n class=\"stash-alert__link tw-pointer tw-underline hover:tw-no-underline\"\n :class=\"[classes.link, computedTextColor, { 'tw-ml-2': props.centered }]\"\n data-test=\"stash-alert|link\"\n >\n <slot name=\"link\"></slot>\n </div>\n </div>\n\n <button\n v-if=\"!props.permanent\"\n class=\"stash-alert__close\"\n :class=\"[classes.button, computedTextColor]\"\n type=\"button\"\n data-test=\"stash-alert|close\"\n @click=\"show = false\"\n >\n <Icon :id=\"iconId\" name=\"close\" title=\"Dismiss alert\" />\n </button>\n </div>\n</template>\n\n<style module>\n :global(.stash-alert__link) {\n a,\n button {\n color: var(--color-ice-900);\n cursor: pointer;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n }\n\n :global(.stash-alert--filled.stash-alert--error),\n :global(.stash-alert--filled.stash-alert--info) {\n :global(.stash-alert__link) a,\n :global(.stash-alert__link) button {\n color: theme('colors.white');\n }\n }\n</style>\n"],"names":["iconId","uniqueId","slots","useSlots","classes","useCssModule","show","ref","icon","computed","StatusIcons","capitalize","props","color","StatusColors","iconColor","computedTextColor"],"mappings":";;;;;;;;;;;;;;;;;;;;;iBAiEQA,IAASC,EAAS,YAAY,GAC9BC,IAAQC,KACRC,IAAUC,KACVC,IAAOC,EAAI,EAAI,GACfC,IAAOC,EAAqB,MAAMC,EAAYC,EAAWC,EAAM,QAAQ,CAAC,CAAC,GACzEC,IAAQJ,EAAsB,MAAMK,EAAaH,EAAWC,EAAM,QAAQ,CAAC,CAAC,GAE5EG,IAAYN,EAAiB,MAC7BG,EAAM,YAAY,YAAY,CAAC,WAAW,SAAS,EAAE,SAASA,EAAM,QAAQ,IACvE,oBAGLA,EAAM,YAAY,YAAY,CAAC,QAAQ,OAAO,EAAE,SAASA,EAAM,QAAQ,IAClE,kBAGF,WAAWC,EAAM,KAAK,EAC9B,GAEKG,IAAoBP,EAAiB,MACrCG,EAAM,YAAY,YAAY,CAAC,QAAQ,OAAO,EAAE,SAASA,EAAM,QAAQ,IAClE,kBAGF,iBACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent as v, ref as y, useSlots as $, resolveComponent as x, openBlock as
|
|
1
|
+
import { defineComponent as v, ref as y, useSlots as $, resolveComponent as x, openBlock as a, createElementBlock as r, unref as b, createBlock as w, normalizeClass as n, withCtx as m, createElementVNode as s, createVNode as o, toDisplayString as d, renderSlot as p } from "vue";
|
|
2
2
|
import { _ as h } from "./Expand.vue_vue_type_script_setup_true_lang-5fe03d51.js";
|
|
3
3
|
import i from "./Icon.js";
|
|
4
4
|
import { _ as k } from "./_plugin-vue_export-helper-dad06003.js";
|
|
@@ -17,10 +17,10 @@ const C = { class: "flex-1 flex items-center overflow-hidden" }, A = { class: "t
|
|
|
17
17
|
const t = u, l = y(!1), f = $();
|
|
18
18
|
return (e, c) => {
|
|
19
19
|
const _ = x("router-link");
|
|
20
|
-
return
|
|
21
|
-
b(f)["sub-items"] ? (
|
|
20
|
+
return a(), r("li", null, [
|
|
21
|
+
b(f)["sub-items"] ? (a(), r("div", B, [
|
|
22
22
|
s("button", {
|
|
23
|
-
class:
|
|
23
|
+
class: n([[e.$style.item, { [e.$style.expanded]: l.value }], "flex items-center justify-between text-capitalize font-normal w-full"]),
|
|
24
24
|
onClick: c[0] || (c[0] = () => l.value = !l.value)
|
|
25
25
|
}, [
|
|
26
26
|
s("div", I, [
|
|
@@ -28,30 +28,30 @@ const C = { class: "flex-1 flex items-center overflow-hidden" }, A = { class: "t
|
|
|
28
28
|
name: t.icon,
|
|
29
29
|
class: "tw-mr-3"
|
|
30
30
|
}, null, 8, ["name"]),
|
|
31
|
-
s("span", N,
|
|
31
|
+
s("span", N, d(t.label), 1)
|
|
32
32
|
]),
|
|
33
33
|
o(i, {
|
|
34
|
-
class:
|
|
34
|
+
class: n([e.$style.caret, { [e.$style.expandedIcon]: l.value }]),
|
|
35
35
|
name: "chevron-left"
|
|
36
36
|
}, null, 8, ["class"])
|
|
37
37
|
], 2),
|
|
38
38
|
o(h, {
|
|
39
39
|
"is-expanded": l.value,
|
|
40
|
-
class:
|
|
40
|
+
class: n(e.$style.expand)
|
|
41
41
|
}, {
|
|
42
42
|
default: m(() => [
|
|
43
43
|
s("ul", {
|
|
44
|
-
class:
|
|
44
|
+
class: n(e.$style["sub-items"])
|
|
45
45
|
}, [
|
|
46
|
-
|
|
46
|
+
p(e.$slots, "sub-items")
|
|
47
47
|
], 2)
|
|
48
48
|
]),
|
|
49
49
|
_: 3
|
|
50
50
|
}, 8, ["is-expanded", "class"])
|
|
51
|
-
])) : (
|
|
51
|
+
])) : (a(), w(_, {
|
|
52
52
|
key: 0,
|
|
53
53
|
to: t.to,
|
|
54
|
-
class:
|
|
54
|
+
class: n([[e.$style.item, { [e.$style.active]: t.isActive }], "flex items-center justify-between text-capitalize font-normal w-full"]),
|
|
55
55
|
"active-class": e.$style.active
|
|
56
56
|
}, {
|
|
57
57
|
default: m(() => [
|
|
@@ -60,18 +60,18 @@ const C = { class: "flex-1 flex items-center overflow-hidden" }, A = { class: "t
|
|
|
60
60
|
name: t.icon,
|
|
61
61
|
class: "tw-mr-3"
|
|
62
62
|
}, null, 8, ["name"]),
|
|
63
|
-
s("span", A,
|
|
63
|
+
s("span", A, d(t.label), 1)
|
|
64
64
|
]),
|
|
65
|
-
|
|
65
|
+
p(e.$slots, "default")
|
|
66
66
|
]),
|
|
67
67
|
_: 3
|
|
68
68
|
}, 8, ["to", "class", "active-class"]))
|
|
69
69
|
]);
|
|
70
70
|
};
|
|
71
71
|
}
|
|
72
|
-
}), z = "
|
|
72
|
+
}), z = "_item_n8mr7_2", E = "_expanded_n8mr7_19", S = "_active_n8mr7_23", j = "_caret_n8mr7_29", M = {
|
|
73
73
|
item: z,
|
|
74
|
-
"sub-items": "_sub-
|
|
74
|
+
"sub-items": "_sub-items_n8mr7_15",
|
|
75
75
|
expanded: E,
|
|
76
76
|
active: S,
|
|
77
77
|
caret: j
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppNavigationItem.js","sources":["../src/components/AppNavigationItem/AppNavigationItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { ref, useSlots } from 'vue';\n import { type RouteLocationRaw } from 'vue-router';\n\n import Expand from '../Expand/Expand.vue';\n import { IconName } from '../Icon/Icon.types';\n import Icon from '../Icon/Icon.vue';\n\n export interface AppNavigationItemProps {\n /**\n * Location to navigate to\n */\n to: RouteLocationRaw,\n /**\n * Icon to render on the left side\n */\n icon: IconName;\n /**\n * Text label to render\n */\n label: string;\n /**\n * Indicates whether the route is active or not\n */\n isActive?: boolean;\n }\n\n const isExpanded = ref(false);\n\n const props = withDefaults(defineProps<AppNavigationItemProps>(), {\n isActive: false,\n });\n\n const slots = useSlots();\n</script>\n\n<template>\n <li>\n <router-link\n v-if=\"!slots['sub-items']\"\n :to=\"props.to\"\n :class=\"[$style.item, { [$style.active]: props.isActive }]\"\n :active-class=\"$style.active\"\n class=\"flex items-center justify-between text-capitalize font-normal w-full\"\n >\n <div class=\"flex-1 flex items-center overflow-hidden\">\n <Icon :name=\"props.icon\" class=\"tw-mr-3\" />\n <span class=\"text-truncate\">{{ props.label }}</span>\n </div>\n <!-- @slot Default component slot, for content to the right side of item -->\n <slot></slot>\n </router-link>\n <div v-else>\n <button\n :class=\"[$style.item, { [$style.expanded]: isExpanded }]\"\n class=\"flex items-center justify-between text-capitalize font-normal w-full\"\n @click=\"() => (isExpanded = !isExpanded)\"\n >\n <div class=\"flex-1 flex items-center overflow-hidden\">\n <Icon :name=\"props.icon\" class=\"tw-mr-3\" />\n <span class=\"text-truncate\">{{ props.label }}</span>\n </div>\n <Icon :class=\"[$style.caret, { [$style.expandedIcon]: isExpanded }]\" name=\"chevron-left\" />\n </button>\n <Expand :is-expanded=\"isExpanded\" :class=\"$style.expand\">\n <ul :class=\"$style['sub-items']\">\n <!-- @slot Sub items component slot, for rendering nested navigation items -->\n <slot name=\"sub-items\"></slot>\n </ul>\n </Expand>\n </div>\n </li>\n</template>\n\n<style module>\n .item {\n border-left: 6px solid transparent;\n color: var(--color-ice);\n padding: 10px 12px;\n transition: background-color 150ms;\n }\n\n .item:hover,\n .item:focus {\n text-decoration: none;\n background: #140e35;\n }\n\n .sub-items .item {\n padding-left: 40px;\n }\n\n .expanded {\n background-color: #263256;\n }\n\n .active {\n color: var(--color-seafoam);\n border-color: var(--color-seafoam);\n background: #140e35;\n }\n\n .caret {\n transition: transform 300ms ease-in-out;\n }\n\n .expanded .caret {\n transform: rotate(-90deg);\n }\n</style>\n"],"names":["isExpanded","ref","slots","useSlots"],"mappings":";;;;;;;;;;;;;;;;iBA2BQA,IAAaC,EAAI,EAAK,GAMtBC,IAAQC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"AppNavigationItem.js","sources":["../src/components/AppNavigationItem/AppNavigationItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { ref, useSlots } from 'vue';\n import { type RouteLocationRaw } from 'vue-router';\n\n import Expand from '../Expand/Expand.vue';\n import { IconName } from '../Icon/Icon.types';\n import Icon from '../Icon/Icon.vue';\n\n export interface AppNavigationItemProps {\n /**\n * Location to navigate to\n */\n to: RouteLocationRaw,\n /**\n * Icon to render on the left side\n */\n icon: IconName;\n /**\n * Text label to render\n */\n label: string;\n /**\n * Indicates whether the route is active or not\n */\n isActive?: boolean;\n }\n\n const isExpanded = ref(false);\n\n const props = withDefaults(defineProps<AppNavigationItemProps>(), {\n isActive: false,\n });\n\n const slots = useSlots();\n</script>\n\n<template>\n <li>\n <router-link\n v-if=\"!slots['sub-items']\"\n :to=\"props.to\"\n :class=\"[$style.item, { [$style.active]: props.isActive }]\"\n :active-class=\"$style.active\"\n class=\"flex items-center justify-between text-capitalize font-normal w-full\"\n >\n <div class=\"flex-1 flex items-center overflow-hidden\">\n <Icon :name=\"props.icon\" class=\"tw-mr-3\" />\n <span class=\"text-truncate\">{{ props.label }}</span>\n </div>\n <!-- @slot Default component slot, for content to the right side of item -->\n <slot></slot>\n </router-link>\n <div v-else>\n <button\n :class=\"[$style.item, { [$style.expanded]: isExpanded }]\"\n class=\"flex items-center justify-between text-capitalize font-normal w-full\"\n @click=\"() => (isExpanded = !isExpanded)\"\n >\n <div class=\"flex-1 flex items-center overflow-hidden\">\n <Icon :name=\"props.icon\" class=\"tw-mr-3\" />\n <span class=\"text-truncate\">{{ props.label }}</span>\n </div>\n <Icon :class=\"[$style.caret, { [$style.expandedIcon]: isExpanded }]\" name=\"chevron-left\" />\n </button>\n <Expand :is-expanded=\"isExpanded\" :class=\"$style.expand\">\n <ul :class=\"$style['sub-items']\">\n <!-- @slot Sub items component slot, for rendering nested navigation items -->\n <slot name=\"sub-items\"></slot>\n </ul>\n </Expand>\n </div>\n </li>\n</template>\n\n<style module>\n .item {\n border-left: 6px solid transparent;\n color: var(--color-ice-500);\n padding: 10px 12px;\n transition: background-color 150ms;\n }\n\n .item:hover,\n .item:focus {\n text-decoration: none;\n background: #140e35;\n }\n\n .sub-items .item {\n padding-left: 40px;\n }\n\n .expanded {\n background-color: #263256;\n }\n\n .active {\n color: var(--color-seafoam-500);\n border-color: var(--color-seafoam-500);\n background: #140e35;\n }\n\n .caret {\n transition: transform 300ms ease-in-out;\n }\n\n .expanded .caret {\n transform: rotate(-90deg);\n }\n</style>\n"],"names":["isExpanded","ref","slots","useSlots"],"mappings":";;;;;;;;;;;;;;;;iBA2BQA,IAAaC,EAAI,EAAK,GAMtBC,IAAQC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/AppSidebar.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { defineComponent as k, useSlots as x, computed as m, ref as C, watchEffect as E, openBlock as a, createElementBlock as o, normalizeClass as B, createVNode as i, Transition as w, withCtx as b, withDirectives as g, withModifiers as O, vShow as y, createElementVNode as v, unref as
|
|
1
|
+
import { defineComponent as k, useSlots as x, computed as m, ref as C, watchEffect as E, openBlock as a, createElementBlock as o, normalizeClass as B, createVNode as i, Transition as w, withCtx as b, withDirectives as g, withModifiers as O, vShow as y, createElementVNode as v, unref as d, renderSlot as n, createCommentVNode as u, pushScopeId as I, popScopeId as V } from "vue";
|
|
2
2
|
import $ from "./useMediaQuery.js";
|
|
3
3
|
import z from "./Backdrop.js";
|
|
4
4
|
import A from "./Divider.js";
|
|
5
5
|
import { _ as N } from "./_plugin-vue_export-helper-dad06003.js";
|
|
6
|
-
const j = (t) => (I("data-v-
|
|
7
|
-
class: "stash-app-sidebar__aside tw-fixed tw-
|
|
6
|
+
const j = (t) => (I("data-v-7ac3c3ee"), t = t(), V(), t), D = {
|
|
7
|
+
class: "stash-app-sidebar__aside tw-fixed tw-flex tw-h-screen tw-flex-col tw-bg-purple-500",
|
|
8
8
|
"data-test": "stash-app-sidebar__aside"
|
|
9
9
|
}, M = {
|
|
10
10
|
key: 0,
|
|
@@ -25,27 +25,27 @@ const j = (t) => (I("data-v-7962d89f"), t = t(), V(), t), D = {
|
|
|
25
25
|
},
|
|
26
26
|
emits: ["dismiss", "update:is-open"],
|
|
27
27
|
setup(t, { emit: _ }) {
|
|
28
|
-
const
|
|
28
|
+
const h = t, r = x(), l = $("screen and (min-width: 1321px)"), e = m(() => h.isOpen && !l.value), p = C({ height: "", overflow: "" }), f = m(() => h.isOpen || l.value);
|
|
29
29
|
function S() {
|
|
30
30
|
_("dismiss"), _("update:is-open", !1);
|
|
31
31
|
}
|
|
32
|
-
function
|
|
32
|
+
function c() {
|
|
33
33
|
return document.scrollingElement || document.body;
|
|
34
34
|
}
|
|
35
35
|
return E(() => {
|
|
36
|
-
l.value || (e.value && Object.assign(
|
|
37
|
-
overflow:
|
|
38
|
-
height:
|
|
39
|
-
}), Object.assign(
|
|
40
|
-
overflow: e.value ? "hidden" :
|
|
36
|
+
l.value || (e.value && Object.assign(p.value, {
|
|
37
|
+
overflow: c().style.overflow,
|
|
38
|
+
height: c().style.height
|
|
39
|
+
}), Object.assign(c().style, {
|
|
40
|
+
overflow: e.value ? "hidden" : p.value.overflow,
|
|
41
41
|
// Prevents page from scrolling when AppSidebar is open
|
|
42
|
-
height: e.value ? "100%" :
|
|
42
|
+
height: e.value ? "100%" : p.value.height
|
|
43
43
|
// Ensures the backdrop covers the entire page when AppSidebar is open
|
|
44
44
|
}));
|
|
45
45
|
}), (s, F) => (a(), o("div", {
|
|
46
46
|
id: "stash-app-sidebar",
|
|
47
47
|
class: B(["stash-app-sidebar tw-relative", {
|
|
48
|
-
"stash-app-sidebar--is-open":
|
|
48
|
+
"stash-app-sidebar--is-open": f.value,
|
|
49
49
|
"tw-z-modal": e.value,
|
|
50
50
|
"tw-z-[301]": !e.value
|
|
51
51
|
}]),
|
|
@@ -66,13 +66,13 @@ const j = (t) => (I("data-v-7962d89f"), t = t(), V(), t), D = {
|
|
|
66
66
|
default: b(() => [
|
|
67
67
|
g(v("aside", D, [
|
|
68
68
|
i(A, { class: "stash-app-sidebar__divider" }),
|
|
69
|
-
|
|
69
|
+
d(r)["app-context"] ? (a(), o("div", M, [
|
|
70
70
|
n(s.$slots, "app-context", {}, void 0, !0)
|
|
71
71
|
])) : u("", !0),
|
|
72
|
-
|
|
72
|
+
d(r)["company-context"] ? (a(), o("div", P, [
|
|
73
73
|
n(s.$slots, "company-context", {}, void 0, !0)
|
|
74
74
|
])) : u("", !0),
|
|
75
|
-
|
|
75
|
+
d(r).navigation ? (a(), o("nav", L, [
|
|
76
76
|
v("ul", Q, [
|
|
77
77
|
n(s.$slots, "navigation", {}, void 0, !0)
|
|
78
78
|
])
|
|
@@ -80,7 +80,7 @@ const j = (t) => (I("data-v-7962d89f"), t = t(), V(), t), D = {
|
|
|
80
80
|
T,
|
|
81
81
|
n(s.$slots, "footer", {}, void 0, !0)
|
|
82
82
|
], 512), [
|
|
83
|
-
[y,
|
|
83
|
+
[y, f.value]
|
|
84
84
|
])
|
|
85
85
|
]),
|
|
86
86
|
_: 3
|
|
@@ -88,7 +88,7 @@ const j = (t) => (I("data-v-7962d89f"), t = t(), V(), t), D = {
|
|
|
88
88
|
], 2));
|
|
89
89
|
}
|
|
90
90
|
});
|
|
91
|
-
const U = /* @__PURE__ */ N(q, [["__scopeId", "data-v-
|
|
91
|
+
const U = /* @__PURE__ */ N(q, [["__scopeId", "data-v-7ac3c3ee"]]);
|
|
92
92
|
export {
|
|
93
93
|
U as default
|
|
94
94
|
};
|
package/dist/AppSidebar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppSidebar.js","sources":["../src/components/AppSidebar/AppSidebar.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, ref, useSlots, watchEffect } from 'vue';\n\n import useMediaQuery from '../../composables/useMediaQuery/useMediaQuery';\n import Backdrop from '../Backdrop/Backdrop.vue';\n import Divider from '../Divider/Divider.vue';\n\n export interface AppSidebarProps {\n /**\n * Controls wether the sidebar is opened or not\n */\n isOpen?: boolean;\n }\n\n const props = withDefaults(defineProps<AppSidebarProps>(), {\n isOpen: false,\n });\n\n const slots = useSlots();\n\n const emit =\n defineEmits<{\n /**\n * @deprecated Use the `update:is-open` event instead\n */\n (e: 'dismiss'): void;\n (e: 'update:is-open', isOpen: boolean): void;\n }>();\n\n const isExtraLargeScreen = useMediaQuery('screen and (min-width: 1321px)');\n const isBackdropVisible = computed(() => props.isOpen && !isExtraLargeScreen.value);\n const initialPageScrollingElementStyle = ref({ height: '', overflow: '' });\n const isSidebarOpen = computed(() => props.isOpen || isExtraLargeScreen.value);\n\n function onBackdropClick() {\n emit('dismiss');\n emit('update:is-open', false);\n }\n\n function getPageScrollingElement() {\n return (document.scrollingElement || document.body) as HTMLElement;\n }\n\n watchEffect(() => {\n if (isExtraLargeScreen.value) {\n return;\n }\n\n if (isBackdropVisible.value) {\n Object.assign(initialPageScrollingElementStyle.value, {\n overflow: getPageScrollingElement().style.overflow,\n height: getPageScrollingElement().style.height,\n });\n }\n\n Object.assign(getPageScrollingElement().style, {\n overflow: isBackdropVisible.value ? 'hidden' : initialPageScrollingElementStyle.value.overflow, // Prevents page from scrolling when AppSidebar is open\n height: isBackdropVisible.value ? '100%' : initialPageScrollingElementStyle.value.height, // Ensures the backdrop covers the entire page when AppSidebar is open\n });\n });\n</script>\n\n<template>\n <div\n id=\"stash-app-sidebar\"\n class=\"stash-app-sidebar tw-relative\"\n :class=\"{\n 'stash-app-sidebar--is-open': isSidebarOpen,\n 'tw-z-modal': isBackdropVisible,\n 'tw-z-[301]': !isBackdropVisible,\n }\"\n data-test=\"stash-app-sidebar\"\n >\n <Transition name=\"backdrop\">\n <Backdrop v-show=\"isBackdropVisible\" class=\"stash-app-sidebar__backdrop\" @click.stop=\"onBackdropClick\" />\n </Transition>\n <Transition name=\"aside\">\n <aside\n v-show=\"isSidebarOpen\"\n class=\"stash-app-sidebar__aside tw-fixed tw-
|
|
1
|
+
{"version":3,"file":"AppSidebar.js","sources":["../src/components/AppSidebar/AppSidebar.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, ref, useSlots, watchEffect } from 'vue';\n\n import useMediaQuery from '../../composables/useMediaQuery/useMediaQuery';\n import Backdrop from '../Backdrop/Backdrop.vue';\n import Divider from '../Divider/Divider.vue';\n\n export interface AppSidebarProps {\n /**\n * Controls wether the sidebar is opened or not\n */\n isOpen?: boolean;\n }\n\n const props = withDefaults(defineProps<AppSidebarProps>(), {\n isOpen: false,\n });\n\n const slots = useSlots();\n\n const emit =\n defineEmits<{\n /**\n * @deprecated Use the `update:is-open` event instead\n */\n (e: 'dismiss'): void;\n (e: 'update:is-open', isOpen: boolean): void;\n }>();\n\n const isExtraLargeScreen = useMediaQuery('screen and (min-width: 1321px)');\n const isBackdropVisible = computed(() => props.isOpen && !isExtraLargeScreen.value);\n const initialPageScrollingElementStyle = ref({ height: '', overflow: '' });\n const isSidebarOpen = computed(() => props.isOpen || isExtraLargeScreen.value);\n\n function onBackdropClick() {\n emit('dismiss');\n emit('update:is-open', false);\n }\n\n function getPageScrollingElement() {\n return (document.scrollingElement || document.body) as HTMLElement;\n }\n\n watchEffect(() => {\n if (isExtraLargeScreen.value) {\n return;\n }\n\n if (isBackdropVisible.value) {\n Object.assign(initialPageScrollingElementStyle.value, {\n overflow: getPageScrollingElement().style.overflow,\n height: getPageScrollingElement().style.height,\n });\n }\n\n Object.assign(getPageScrollingElement().style, {\n overflow: isBackdropVisible.value ? 'hidden' : initialPageScrollingElementStyle.value.overflow, // Prevents page from scrolling when AppSidebar is open\n height: isBackdropVisible.value ? '100%' : initialPageScrollingElementStyle.value.height, // Ensures the backdrop covers the entire page when AppSidebar is open\n });\n });\n</script>\n\n<template>\n <div\n id=\"stash-app-sidebar\"\n class=\"stash-app-sidebar tw-relative\"\n :class=\"{\n 'stash-app-sidebar--is-open': isSidebarOpen,\n 'tw-z-modal': isBackdropVisible,\n 'tw-z-[301]': !isBackdropVisible,\n }\"\n data-test=\"stash-app-sidebar\"\n >\n <Transition name=\"backdrop\">\n <Backdrop v-show=\"isBackdropVisible\" class=\"stash-app-sidebar__backdrop\" @click.stop=\"onBackdropClick\" />\n </Transition>\n <Transition name=\"aside\">\n <aside\n v-show=\"isSidebarOpen\"\n class=\"stash-app-sidebar__aside tw-fixed tw-flex tw-h-screen tw-flex-col tw-bg-purple-500\"\n data-test=\"stash-app-sidebar__aside\"\n >\n <Divider class=\"stash-app-sidebar__divider\" />\n <div v-if=\"slots['app-context']\" class=\"tw-px-3 tw-pt-6\">\n <!-- @slot App Context component slot, ideally for rendering the context switcher -->\n <slot name=\"app-context\"></slot>\n </div>\n <div v-if=\"slots['company-context']\" class=\"tw-px-3 tw-pt-6\">\n <!-- @slot Company Context component slot, ideally for rendering the company picker -->\n <slot name=\"company-context\"></slot>\n </div>\n <nav v-if=\"slots['navigation']\" class=\"tw-pt-6\">\n <ul role=\"menubar\" aria-orientation=\"vertical\">\n <!-- @slot Navigation component slot, for rendering navigation items -->\n <slot name=\"navigation\"></slot>\n </ul>\n </nav>\n <div class=\"tw-flex-1\"></div>\n <!-- @slot Footer component slot, for rendering version/environment notes -->\n <slot name=\"footer\"></slot>\n </aside>\n </Transition>\n </div>\n</template>\n\n<style scoped>\n .stash-app-sidebar__aside {\n padding-top: calc(var(--top-header-height) - 1px); /* -1px to compensate for the border height */\n width: var(--sidebar-width);\n }\n\n .stash-app-sidebar__divider::before,\n .stash-app-sidebar__divider::after {\n border-bottom: 1px solid rgb(255 255 255 / 12%);\n }\n\n .backdrop-enter-active,\n .backdrop-leave-active {\n transition: opacity 200ms ease-in-out;\n }\n\n .backdrop-enter-from,\n .backdrop-leave-to {\n opacity: 0;\n }\n\n .aside-enter-active,\n .aside-leave-active {\n transition: opacity 200ms ease-in-out, transform 200ms ease-in-out;\n }\n\n .aside-enter-from,\n .aside-leave-to {\n opacity: 0;\n transform: translateX(-20%);\n }\n</style>\n"],"names":["slots","useSlots","isExtraLargeScreen","useMediaQuery","isBackdropVisible","computed","props","initialPageScrollingElementStyle","ref","isSidebarOpen","onBackdropClick","emit","getPageScrollingElement","watchEffect"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkBQA,IAAQC,KAWRC,IAAqBC,EAAc,gCAAgC,GACnEC,IAAoBC,EAAS,MAAMC,EAAM,UAAU,CAACJ,EAAmB,KAAK,GAC5EK,IAAmCC,EAAI,EAAE,QAAQ,IAAI,UAAU,IAAI,GACnEC,IAAgBJ,EAAS,MAAMC,EAAM,UAAUJ,EAAmB,KAAK;AAE7E,aAASQ,IAAkB;AACzB,MAAAC,EAAK,SAAS,GACdA,EAAK,kBAAkB,EAAK;AAAA,IAC9B;AAEA,aAASC,IAA0B;AACzB,aAAA,SAAS,oBAAoB,SAAS;AAAA,IAChD;AAEA,WAAAC,EAAY,MAAM;AAChB,MAAIX,EAAmB,UAInBE,EAAkB,SACb,OAAA,OAAOG,EAAiC,OAAO;AAAA,QACpD,UAAUK,IAA0B,MAAM;AAAA,QAC1C,QAAQA,IAA0B,MAAM;AAAA,MAAA,CACzC,GAGI,OAAA,OAAOA,EAAwB,EAAE,OAAO;AAAA,QAC7C,UAAUR,EAAkB,QAAQ,WAAWG,EAAiC,MAAM;AAAA;AAAA,QACtF,QAAQH,EAAkB,QAAQ,SAASG,EAAiC,MAAM;AAAA;AAAA,MAAA,CACnF;AAAA,IAAA,CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/AppTopbar.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { openBlock as n, createElementBlock as p, createStaticVNode as h, defineComponent as c, createElementVNode as t, normalizeClass as i, createVNode as
|
|
1
|
+
import { openBlock as n, createElementBlock as p, createStaticVNode as h, defineComponent as c, createElementVNode as t, normalizeClass as i, createVNode as s, unref as m, renderSlot as o } from "vue";
|
|
2
2
|
import d from "./Icon.js";
|
|
3
3
|
import "lodash-es/uniqueId";
|
|
4
4
|
import "./index-79ce320f.js";
|
|
@@ -16,8 +16,8 @@ function b(r, w) {
|
|
|
16
16
|
}
|
|
17
17
|
const H = { render: b }, u = {
|
|
18
18
|
"data-test": "stash-app-topbar",
|
|
19
|
-
class: "stash-app-topbar tw-absolute tw-
|
|
20
|
-
}, x = ["href"], _ = { class: "tw-flex tw-items-center" }, g = { class: "tw-ml-6" }, v = { class: "tw-hidden xl:tw-block
|
|
19
|
+
class: "stash-app-topbar tw-absolute tw-left-0 tw-top-0"
|
|
20
|
+
}, x = ["href"], _ = { class: "tw-flex tw-items-center" }, g = { class: "tw-ml-6" }, v = { class: "tw-hidden tw-pl-3 xl:tw-block" }, y = /* @__PURE__ */ c({
|
|
21
21
|
__name: "AppTopbar",
|
|
22
22
|
props: {
|
|
23
23
|
sidebarOpened: { type: Boolean, default: !1 },
|
|
@@ -25,38 +25,38 @@ const H = { render: b }, u = {
|
|
|
25
25
|
},
|
|
26
26
|
emits: ["toggle-sidebar"],
|
|
27
27
|
setup(r, { emit: w }) {
|
|
28
|
-
const
|
|
28
|
+
const a = r;
|
|
29
29
|
return (e, l) => (n(), p("header", u, [
|
|
30
30
|
t("div", {
|
|
31
|
-
class: i(["tw-fixed tw-top-0 tw-
|
|
32
|
-
"tw-
|
|
33
|
-
"tw-text-purple-500
|
|
31
|
+
class: i(["tw-fixed tw-top-0 tw-flex tw-h-topbar tw-w-sidebar tw-items-center tw-pl-3 tw-transition-colors tw-duration-500 xl:tw-text-white", {
|
|
32
|
+
"tw-z-dialog tw-text-white": a.sidebarOpened,
|
|
33
|
+
"tw-z-[401] tw-text-purple-500": !a.sidebarOpened
|
|
34
34
|
}])
|
|
35
35
|
}, [
|
|
36
36
|
t("button", {
|
|
37
37
|
class: "xl:tw-hidden",
|
|
38
38
|
onClick: l[0] || (l[0] = (M) => w("toggle-sidebar"))
|
|
39
39
|
}, [
|
|
40
|
-
|
|
40
|
+
s(d, {
|
|
41
41
|
name: "menu",
|
|
42
42
|
class: "tw-mr-3",
|
|
43
43
|
"aria-label": "open sidebar navigation"
|
|
44
44
|
})
|
|
45
45
|
]),
|
|
46
46
|
t("a", {
|
|
47
|
-
href:
|
|
47
|
+
href: a.href,
|
|
48
48
|
class: "tw-flex tw-items-center tw-text-inherit"
|
|
49
49
|
}, [
|
|
50
|
-
|
|
50
|
+
s(d, {
|
|
51
51
|
name: "logo-ll",
|
|
52
52
|
class: "tw-mr-1.5",
|
|
53
53
|
size: "large"
|
|
54
54
|
}),
|
|
55
|
-
|
|
55
|
+
s(m(H), { class: "tw-hidden tw-h-6 tw-w-full tw-max-w-[104px] md:tw-block" })
|
|
56
56
|
], 8, x)
|
|
57
57
|
], 2),
|
|
58
58
|
t("div", {
|
|
59
|
-
class: i([[e.$attrs.class], "tw-fixed tw-top-0 tw-
|
|
59
|
+
class: i([[e.$attrs.class], "tw-fixed tw-top-0 tw-z-page tw-flex tw-h-topbar tw-w-full tw-flex-row-reverse tw-items-center tw-justify-between tw-bg-white tw-py-3 tw-pl-sidebar tw-pr-3 tw-shadow-md"])
|
|
60
60
|
}, [
|
|
61
61
|
t("div", _, [
|
|
62
62
|
o(e.$slots, "actions"),
|
package/dist/Avatar.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { defineComponent as p, useAttrs as
|
|
1
|
+
import { defineComponent as p, useAttrs as v, useCssModule as _, computed as c, openBlock as i, createElementBlock as d, mergeProps as u, unref as a, toDisplayString as h } from "vue";
|
|
2
2
|
import b from "./utils/colorScheme.js";
|
|
3
3
|
import { _ as k } from "./_plugin-vue_export-helper-dad06003.js";
|
|
4
|
-
const
|
|
4
|
+
const g = ["alt", "src", "tabindex"], x = ["tabindex"], C = /* @__PURE__ */ p({
|
|
5
5
|
name: "ll-avatar",
|
|
6
6
|
__name: "Avatar",
|
|
7
7
|
props: {
|
|
@@ -14,12 +14,12 @@ const x = ["alt", "src", "tabindex"], C = ["tabindex"], w = /* @__PURE__ */ p({
|
|
|
14
14
|
textColor: { default: void 0 }
|
|
15
15
|
},
|
|
16
16
|
setup(m) {
|
|
17
|
-
const t = m, s =
|
|
17
|
+
const t = m, s = v(), e = _(), n = c(
|
|
18
18
|
() => b({
|
|
19
19
|
shade: t.shade,
|
|
20
20
|
color: t.colorScheme
|
|
21
21
|
})
|
|
22
|
-
),
|
|
22
|
+
), f = c(() => {
|
|
23
23
|
const [l, r] = String(t.name).toUpperCase().split(" ");
|
|
24
24
|
return r ? l.charAt(0) + r.charAt(0) : l.charAt(0);
|
|
25
25
|
}), o = c(() => !!s.onClick);
|
|
@@ -30,9 +30,9 @@ const x = ["alt", "src", "tabindex"], C = ["tabindex"], w = /* @__PURE__ */ p({
|
|
|
30
30
|
src: t.src,
|
|
31
31
|
tabindex: o.value ? 0 : -1,
|
|
32
32
|
"data-test": "stash-avatar"
|
|
33
|
-
}, a(s)), null, 16,
|
|
33
|
+
}, a(s)), null, 16, g)) : (i(), d("div", u({
|
|
34
34
|
key: 1,
|
|
35
|
-
class: ["stash-avatar stash-avatar--initials tw-inline-block tw-rounded-full tw-text-center tw-font-semibold
|
|
35
|
+
class: ["stash-avatar stash-avatar--initials tw-inline-block tw-cursor-default tw-rounded-full tw-text-center tw-font-semibold", [
|
|
36
36
|
a(e).root,
|
|
37
37
|
`tw-text-${t.textColor || n.value.computedTextColor}`,
|
|
38
38
|
`tw-bg-${t.bgColor || n.value.computedBgColor}`,
|
|
@@ -40,14 +40,14 @@ const x = ["alt", "src", "tabindex"], C = ["tabindex"], w = /* @__PURE__ */ p({
|
|
|
40
40
|
]],
|
|
41
41
|
tabindex: o.value ? 0 : -1,
|
|
42
42
|
"data-test": "stash-avatar"
|
|
43
|
-
}, a(s)), h(
|
|
43
|
+
}, a(s)), h(f.value), 17, x));
|
|
44
44
|
}
|
|
45
|
-
}),
|
|
46
|
-
root:
|
|
47
|
-
clickable:
|
|
45
|
+
}), w = "_root_g79af_2", A = "_clickable_g79af_9", y = {
|
|
46
|
+
root: w,
|
|
47
|
+
clickable: A
|
|
48
48
|
}, S = {
|
|
49
|
-
$style:
|
|
50
|
-
}, D = /* @__PURE__ */ k(
|
|
49
|
+
$style: y
|
|
50
|
+
}, D = /* @__PURE__ */ k(C, [["__cssModules", S]]);
|
|
51
51
|
export {
|
|
52
52
|
D as default
|
|
53
53
|
};
|
package/dist/Avatar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.js","sources":["../src/components/Avatar/Avatar.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, useAttrs, useCssModule } from 'vue';\n\n import { StashCommonColor, StashPrimaryColorGroup } from '../../../types/colors';\n import colorSchemeUtil from '../../utils/colorScheme';\n\n defineOptions({\n name: 'll-avatar',\n });\n\n export interface AvatarProps {\n /**\n * The name of the user will be parsed and have its initial displayed in case the src prop is empty\n */\n name?: string;\n\n /**\n * The color for the chip that determines both the text and bg color. Needs to\n * be one of the brand colors in our design system (not a shade).\n */\n colorScheme?: StashPrimaryColorGroup;\n\n /**\n * The shade of the provided color to use for the background color. This effects the inferred\n * text color unless a specific text color is provided. Currently only `light` and `main`\n * shades are supported. `dark` may be added in the future.\n */\n shade?: 'light' | 'main';\n\n /**\n * The image that will be displayed within the avatar\n */\n src?: string;\n\n /**\n * The alternative text to be displayed in case the image is unavailable\n */\n alt?: string;\n\n /**\n * The background color of the chip. Needs to be one of our design system colors.\n */\n bgColor?: StashCommonColor;\n\n /**\n * The color of the chip text. Needs to be one of our design system colors.\n */\n textColor?: StashCommonColor;\n }\n\n const props = withDefaults(defineProps<AvatarProps>(), {\n src: undefined,\n name: '',\n alt: undefined,\n colorScheme: 'ice',\n shade: 'light',\n bgColor: undefined,\n textColor: undefined,\n });\n\n const attrs = useAttrs();\n const classes = useCssModule();\n\n const computedColors = computed(() =>\n colorSchemeUtil({\n shade: props.shade,\n color: props.colorScheme,\n }),\n );\n\n const initials = computed(() => {\n const [firstName, lastName] = String(props.name).toUpperCase().split(' ');\n const initials = lastName ? firstName.charAt(0) + lastName.charAt(0) : firstName.charAt(0);\n\n return initials;\n });\n\n const isClickable = computed(() => {\n return !!attrs.onClick;\n });\n</script>\n\n<template>\n <img\n v-if=\"props.src\"\n class=\"stash-avatar stash-avatar--image tw-inline-block tw-rounded-full\"\n :class=\"[classes.root, { [classes.clickable]: isClickable }]\"\n :alt=\"props.alt\"\n :src=\"props.src\"\n :tabindex=\"isClickable ? 0 : -1\"\n data-test=\"stash-avatar\"\n v-bind=\"attrs\"\n />\n <div\n v-else\n class=\"\n stash-avatar stash-avatar--initials\n tw-inline-block tw-rounded-full tw-text-center tw-font-semibold
|
|
1
|
+
{"version":3,"file":"Avatar.js","sources":["../src/components/Avatar/Avatar.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, useAttrs, useCssModule } from 'vue';\n\n import { StashCommonColor, StashPrimaryColorGroup } from '../../../types/colors';\n import colorSchemeUtil from '../../utils/colorScheme';\n\n defineOptions({\n name: 'll-avatar',\n });\n\n export interface AvatarProps {\n /**\n * The name of the user will be parsed and have its initial displayed in case the src prop is empty\n */\n name?: string;\n\n /**\n * The color for the chip that determines both the text and bg color. Needs to\n * be one of the brand colors in our design system (not a shade).\n */\n colorScheme?: StashPrimaryColorGroup;\n\n /**\n * The shade of the provided color to use for the background color. This effects the inferred\n * text color unless a specific text color is provided. Currently only `light` and `main`\n * shades are supported. `dark` may be added in the future.\n */\n shade?: 'light' | 'main';\n\n /**\n * The image that will be displayed within the avatar\n */\n src?: string;\n\n /**\n * The alternative text to be displayed in case the image is unavailable\n */\n alt?: string;\n\n /**\n * The background color of the chip. Needs to be one of our design system colors.\n */\n bgColor?: StashCommonColor;\n\n /**\n * The color of the chip text. Needs to be one of our design system colors.\n */\n textColor?: StashCommonColor;\n }\n\n const props = withDefaults(defineProps<AvatarProps>(), {\n src: undefined,\n name: '',\n alt: undefined,\n colorScheme: 'ice',\n shade: 'light',\n bgColor: undefined,\n textColor: undefined,\n });\n\n const attrs = useAttrs();\n const classes = useCssModule();\n\n const computedColors = computed(() =>\n colorSchemeUtil({\n shade: props.shade,\n color: props.colorScheme,\n }),\n );\n\n const initials = computed(() => {\n const [firstName, lastName] = String(props.name).toUpperCase().split(' ');\n const initials = lastName ? firstName.charAt(0) + lastName.charAt(0) : firstName.charAt(0);\n\n return initials;\n });\n\n const isClickable = computed(() => {\n return !!attrs.onClick;\n });\n</script>\n\n<template>\n <img\n v-if=\"props.src\"\n class=\"stash-avatar stash-avatar--image tw-inline-block tw-rounded-full\"\n :class=\"[classes.root, { [classes.clickable]: isClickable }]\"\n :alt=\"props.alt\"\n :src=\"props.src\"\n :tabindex=\"isClickable ? 0 : -1\"\n data-test=\"stash-avatar\"\n v-bind=\"attrs\"\n />\n <div\n v-else\n class=\"\n stash-avatar stash-avatar--initials\n tw-inline-block tw-cursor-default tw-rounded-full tw-text-center tw-font-semibold\n \"\n :class=\"[\n classes.root,\n `tw-text-${props.textColor || computedColors.computedTextColor}`,\n `tw-bg-${props.bgColor || computedColors.computedBgColor}`,\n { [classes.clickable]: isClickable },\n ]\"\n :tabindex=\"isClickable ? 0 : -1\"\n data-test=\"stash-avatar\"\n v-bind=\"attrs\"\n >\n {{ initials }}\n </div>\n</template>\n\n<style module>\n .root {\n font-size: theme('fontSize.sm');\n height: theme('spacing.9');\n line-height: calc(theme('spacing.9') + 2px);\n width: theme('spacing.9');\n }\n\n .clickable:hover,\n .clickable:focus,\n .clickable:active {\n outline: 1px solid var(--color-blue-500);\n outline-offset: -1px;\n }\n\n .clickable:focus,\n .clickable:active {\n box-shadow: 0 0 0 4px rgb(0 114 240 / 15%);\n }\n</style>\n"],"names":["attrs","useAttrs","classes","useCssModule","computedColors","computed","colorSchemeUtil","props","initials","firstName","lastName","isClickable"],"mappings":";;;;;;;;;;;;;;;;iBA4DQA,IAAQC,KACRC,IAAUC,KAEVC,IAAiBC;AAAA,MAAS,MAC9BC,EAAgB;AAAA,QACd,OAAOC,EAAM;AAAA,QACb,OAAOA,EAAM;AAAA,MAAA,CACd;AAAA,IAAA,GAGGC,IAAWH,EAAS,MAAM;AACxB,YAAA,CAACI,GAAWC,CAAQ,IAAI,OAAOH,EAAM,IAAI,EAAE,YAAA,EAAc,MAAM,GAAG;AAGjEC,aAFUE,IAAWD,EAAU,OAAO,CAAC,IAAIC,EAAS,OAAO,CAAC,IAAID,EAAU,OAAO,CAAC;AAAA,IAElF,CACR,GAEKE,IAAcN,EAAS,MACpB,CAAC,CAACL,EAAM,OAChB;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|