@leaflink/stash 52.0.2 → 53.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -49
- package/dist/Accordion.js +16 -16
- package/dist/Accordion.js.map +1 -1
- package/dist/AccordionGroup.js +7 -7
- package/dist/AccordionGroup.js.map +1 -1
- package/dist/ActionsDropdown.js +16 -16
- package/dist/ActionsDropdown.js.map +1 -1
- package/dist/AddressSelect.js.map +1 -1
- package/dist/AddressSelect.vue.d.ts +1 -1
- package/dist/Alert.js +34 -34
- package/dist/Alert.js.map +1 -1
- package/dist/AppNavigationItem.js +31 -31
- package/dist/AppNavigationItem.js.map +1 -1
- package/dist/AppSidebar.js +19 -19
- package/dist/AppSidebar.js.map +1 -1
- package/dist/AppTopbar.js +32 -32
- package/dist/AppTopbar.js.map +1 -1
- package/dist/Avatar.js +18 -18
- package/dist/Avatar.js.map +1 -1
- package/dist/Backdrop.js +5 -5
- package/dist/Backdrop.js.map +1 -1
- package/dist/Badge.js +38 -38
- package/dist/Badge.js.map +1 -1
- package/dist/Box.js +1 -1
- package/dist/{Box.vue_vue_type_script_setup_true_lang-rFnvwLVY.js → Box.vue_vue_type_script_setup_true_lang-dFFZN40_.js} +6 -6
- package/dist/{Box.vue_vue_type_script_setup_true_lang-rFnvwLVY.js.map → Box.vue_vue_type_script_setup_true_lang-dFFZN40_.js.map} +1 -1
- package/dist/Button.js +21 -21
- package/dist/Button.js.map +1 -1
- package/dist/ButtonGroup.js +26 -26
- package/dist/ButtonGroup.js.map +1 -1
- package/dist/Card.js +14 -14
- package/dist/Card.js.map +1 -1
- package/dist/CardContent.js +1 -1
- package/dist/CardContent.js.map +1 -1
- package/dist/CardFooter.js +1 -1
- package/dist/CardFooter.js.map +1 -1
- package/dist/CardHeader.js +4 -4
- package/dist/CardHeader.js.map +1 -1
- package/dist/CardMedia.js +20 -20
- package/dist/CardMedia.js.map +1 -1
- package/dist/Carousel.js +88 -93
- package/dist/Carousel.js.map +1 -1
- package/dist/Checkbox.js +30 -30
- package/dist/Checkbox.js.map +1 -1
- package/dist/Checkbox.vue.d.ts +0 -3
- package/dist/Chip.js +33 -33
- package/dist/Chip.js.map +1 -1
- package/dist/ConfirmationCodeInput.js +72 -72
- package/dist/ConfirmationCodeInput.js.map +1 -1
- package/dist/ContextSwitcher.js +27 -27
- package/dist/ContextSwitcher.js.map +1 -1
- package/dist/Copy.js +47 -48
- package/dist/Copy.js.map +1 -1
- package/dist/CurrencyInput.js +1 -1
- package/dist/CurrencyInput.js.map +1 -1
- package/dist/CurrencyInput.vue.d.ts +5 -5
- package/dist/DataView.js +23 -23
- package/dist/DataView.js.map +1 -1
- package/dist/DataViewFilters.js +26 -26
- package/dist/DataViewFilters.js.map +1 -1
- package/dist/DataViewSortButton.js +22 -22
- package/dist/DataViewSortButton.js.map +1 -1
- package/dist/DataViewToolbar.js +52 -52
- package/dist/DataViewToolbar.js.map +1 -1
- package/dist/DatePicker.js +10 -10
- package/dist/DatePicker.js.map +1 -1
- package/dist/DescriptionList.js +2 -2
- package/dist/DescriptionList.js.map +1 -1
- package/dist/DescriptionListDetail.js +2 -2
- package/dist/DescriptionListDetail.js.map +1 -1
- package/dist/DescriptionListGroup.js +9 -9
- package/dist/DescriptionListGroup.js.map +1 -1
- package/dist/DescriptionListTerm.js +8 -8
- package/dist/DescriptionListTerm.js.map +1 -1
- package/dist/Dialog.js +47 -47
- package/dist/Dialog.js.map +1 -1
- package/dist/Divider.js +6 -6
- package/dist/Divider.js.map +1 -1
- package/dist/Dropdown.js +20 -20
- package/dist/Dropdown.js.map +1 -1
- package/dist/EmptyState.js +26 -26
- package/dist/EmptyState.js.map +1 -1
- package/dist/Field.js +1 -1
- package/dist/{Field.vue_vue_type_script_setup_true_lang-DI6z3AE9.js → Field.vue_vue_type_script_setup_true_lang-dAGKfjf5.js} +17 -17
- package/dist/Field.vue_vue_type_script_setup_true_lang-dAGKfjf5.js.map +1 -0
- package/dist/FileUpload.js +47 -49
- package/dist/FileUpload.js.map +1 -1
- package/dist/FilterChip.js +20 -20
- package/dist/FilterChip.js.map +1 -1
- package/dist/FilterDrawerItem.js +13 -13
- package/dist/FilterDrawerItem.js.map +1 -1
- package/dist/FilterDropdown.js +27 -27
- package/dist/FilterDropdown.js.map +1 -1
- package/dist/FilterSelect.js +33 -33
- package/dist/FilterSelect.js.map +1 -1
- package/dist/Filters.js +29 -29
- package/dist/Filters.js.map +1 -1
- package/dist/Filters.vue.d.ts +2 -8
- package/dist/HttpError.js +29 -29
- package/dist/HttpError.js.map +1 -1
- package/dist/HttpError.vue.d.ts +0 -3
- package/dist/Icon.js +12 -12
- package/dist/Icon.js.map +1 -1
- package/dist/IconLabel.js +19 -19
- package/dist/IconLabel.js.map +1 -1
- package/dist/IconLabel.vue.d.ts +1 -1
- package/dist/Illustration.js +2 -2
- package/dist/{Illustration.vue_vue_type_script_setup_true_lang-BrqEF8xe.js → Illustration.vue_vue_type_script_setup_true_lang-C1bPkWZZ.js} +4 -4
- package/dist/{Illustration.vue_vue_type_script_setup_true_lang-BrqEF8xe.js.map → Illustration.vue_vue_type_script_setup_true_lang-C1bPkWZZ.js.map} +1 -1
- package/dist/Image.js +2 -2
- package/dist/Image.vue.d.ts +0 -3
- package/dist/{Image.vue_vue_type_script_setup_true_lang-D5u4av0_.js → Image.vue_vue_type_script_setup_true_lang-CAj0FH9h.js} +11 -11
- package/dist/Image.vue_vue_type_script_setup_true_lang-CAj0FH9h.js.map +1 -0
- package/dist/InlineEdit.js +8 -8
- package/dist/InlineEdit.js.map +1 -1
- package/dist/Input.js +29 -29
- package/dist/Input.js.map +1 -1
- package/dist/InputOptions.js +87 -84
- package/dist/InputOptions.js.map +1 -1
- package/dist/InputOptions.vue.d.ts +2 -2
- package/dist/IntegrationIcon.js +11 -11
- package/dist/IntegrationIcon.js.map +1 -1
- package/dist/Label.js +1 -1
- package/dist/{Label.vue_vue_type_script_setup_true_lang-CNquF3AP.js → Label.vue_vue_type_script_setup_true_lang-xwY3X-iV.js} +16 -16
- package/dist/{Label.vue_vue_type_script_setup_true_lang-CNquF3AP.js.map → Label.vue_vue_type_script_setup_true_lang-xwY3X-iV.js.map} +1 -1
- package/dist/ListItem.js +14 -14
- package/dist/ListItem.js.map +1 -1
- package/dist/ListItem.vue.d.ts +0 -6
- package/dist/ListItemCell.js +9 -9
- package/dist/ListItemCell.js.map +1 -1
- package/dist/ListView.js +138 -141
- package/dist/ListView.js.map +1 -1
- package/dist/ListView.vue.d.ts +2 -26
- package/dist/Loading.js +8 -8
- package/dist/Loading.js.map +1 -1
- package/dist/Logo.js +1 -1
- package/dist/{Logo.vue_vue_type_script_setup_true_lang-Dz8c98sc.js → Logo.vue_vue_type_script_setup_true_lang-DghNC_k6.js} +3 -3
- package/dist/{Logo.vue_vue_type_script_setup_true_lang-Dz8c98sc.js.map → Logo.vue_vue_type_script_setup_true_lang-DghNC_k6.js.map} +1 -1
- package/dist/Menu.js +5 -5
- package/dist/Menu.js.map +1 -1
- package/dist/MenuItem.js +12 -12
- package/dist/MenuItem.js.map +1 -1
- package/dist/Metric.js +24 -24
- package/dist/Metric.js.map +1 -1
- package/dist/Modal.js +60 -60
- package/dist/Modal.js.map +1 -1
- package/dist/Modals.js +1 -1
- package/dist/Modals.js.map +1 -1
- package/dist/Module.js +6 -6
- package/dist/Module.js.map +1 -1
- package/dist/ModuleContent.js +16 -16
- package/dist/ModuleContent.js.map +1 -1
- package/dist/ModuleFooter.js +13 -13
- package/dist/ModuleFooter.js.map +1 -1
- package/dist/ModuleHeader.js +29 -29
- package/dist/ModuleHeader.js.map +1 -1
- package/dist/MoreActions.js +81 -84
- package/dist/MoreActions.js.map +1 -1
- package/dist/ObfuscateText.js +4 -4
- package/dist/ObfuscateText.js.map +1 -1
- package/dist/PageContent.js +13 -13
- package/dist/PageContent.js.map +1 -1
- package/dist/PageHeader.js +28 -28
- package/dist/PageHeader.js.map +1 -1
- package/dist/PageNavigation.js +1 -1
- package/dist/Paginate.js +45 -45
- package/dist/Paginate.js.map +1 -1
- package/dist/QuickAction.js +18 -18
- package/dist/QuickAction.js.map +1 -1
- package/dist/Radio.js +17 -17
- package/dist/Radio.js.map +1 -1
- package/dist/RadioGroup.js +158 -154
- package/dist/RadioGroup.js.map +1 -1
- package/dist/RadioNew.js +80 -80
- package/dist/RadioNew.js.map +1 -1
- package/dist/RadioNew.vue.d.ts +0 -3
- package/dist/RangeInput.js +2 -2
- package/dist/RangeInput.js.map +1 -1
- package/dist/SearchBar.js +9 -9
- package/dist/SearchBar.js.map +1 -1
- package/dist/SectionHeader.js +14 -14
- package/dist/SectionHeader.js.map +1 -1
- package/dist/Select.js +369 -366
- package/dist/Select.js.map +1 -1
- package/dist/SelectStatus.js +26 -27
- package/dist/SelectStatus.js.map +1 -1
- package/dist/Skeleton.js +20 -20
- package/dist/Skeleton.js.map +1 -1
- package/dist/Step.js +37 -40
- package/dist/Step.js.map +1 -1
- package/dist/Stepper.js +17 -17
- package/dist/Stepper.js.map +1 -1
- package/dist/Switch.js +57 -57
- package/dist/Switch.js.map +1 -1
- package/dist/Tab.js +17 -19
- package/dist/Tab.js.map +1 -1
- package/dist/TabPanel.js +1 -1
- package/dist/TabPanel.js.map +1 -1
- package/dist/Table.js +22 -22
- package/dist/Table.js.map +1 -1
- package/dist/TableCell.js +32 -32
- package/dist/TableCell.js.map +1 -1
- package/dist/TableHeaderCell.js +35 -35
- package/dist/TableHeaderCell.js.map +1 -1
- package/dist/TableHeaderRow.js +10 -10
- package/dist/TableHeaderRow.js.map +1 -1
- package/dist/TableRow.js +51 -51
- package/dist/TableRow.js.map +1 -1
- package/dist/Tabs.js +2 -2
- package/dist/{Tabs.vue_vue_type_script_setup_true_lang-B3Irnlcd.js → Tabs.vue_vue_type_script_setup_true_lang-BVTCcK6M.js} +33 -33
- package/dist/Tabs.vue_vue_type_script_setup_true_lang-BVTCcK6M.js.map +1 -0
- package/dist/TextEditor.js +8 -8
- package/dist/TextEditor.js.map +1 -1
- package/dist/Textarea.js +15 -15
- package/dist/Textarea.js.map +1 -1
- package/dist/Thumbnail.js +41 -41
- package/dist/Thumbnail.js.map +1 -1
- package/dist/ThumbnailEmpty.js +3 -3
- package/dist/ThumbnailEmpty.js.map +1 -1
- package/dist/ThumbnailGroup.js +22 -22
- package/dist/ThumbnailGroup.js.map +1 -1
- package/dist/Timeline.js +3 -3
- package/dist/Timeline.js.map +1 -1
- package/dist/TimelineItem.js +22 -22
- package/dist/TimelineItem.js.map +1 -1
- package/dist/Toast.js +29 -29
- package/dist/Toast.js.map +1 -1
- package/dist/Toast.vue.d.ts +3 -0
- package/dist/Toasts.js +11 -11
- package/dist/Toasts.js.map +1 -1
- package/dist/Tooltip.js +2 -81
- package/dist/Tooltip.js.map +1 -1
- package/dist/Tooltip.vue.d.ts +1 -1
- package/dist/Tooltip.vue_vue_type_script_setup_true_lang-mzBLSXy3.js +84 -0
- package/dist/Tooltip.vue_vue_type_script_setup_true_lang-mzBLSXy3.js.map +1 -0
- package/dist/components.css +2 -2
- package/dist/constants.d.ts +9 -9
- package/dist/constants.js +17 -17
- package/dist/constants.js.map +1 -1
- package/dist/directives/tooltip.js +2 -2
- package/dist/directives/tooltip.js.map +1 -1
- package/dist/{index-C14LhAwV.js → index-DBV9Uz0C.js} +3 -3
- package/dist/{index-C14LhAwV.js.map → index-DBV9Uz0C.js.map} +1 -1
- package/dist/tailwind-base.js.d.ts +12 -0
- package/dist/tailwind-base.js.map +1 -1
- package/dist/useSortable.js +1 -1
- package/dist/utils/helpers.js +15 -15
- package/dist/utils/helpers.js.map +1 -1
- package/package.json +15 -15
- package/styles/backwards-compat.css +373 -2851
- package/styles/main.css +8 -0
- package/styles/sofia-font.css +23 -27
- package/styles/theme.css +1033 -0
- package/dist/Field.vue_vue_type_script_setup_true_lang-DI6z3AE9.js.map +0 -1
- package/dist/Image.vue_vue_type_script_setup_true_lang-D5u4av0_.js.map +0 -1
- package/dist/Tabs.vue_vue_type_script_setup_true_lang-B3Irnlcd.js.map +0 -1
- package/dist/tailwind-base.d.ts +0 -333
- package/styles/base.css +0 -902
- package/tailwind-base.ts +0 -455
package/dist/Textarea.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineComponent as k, useAttrs as E, useSlots as H, useCssModule as A, ref as x, computed as
|
|
2
|
-
import { _ as N } from "./Field.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
import { defineComponent as k, useAttrs as E, useSlots as H, useCssModule as A, ref as x, computed as y, watch as I, onMounted as P, nextTick as V, onBeforeUnmount as $, createBlock as q, openBlock as D, mergeProps as b, unref as p, createSlots as L, withCtx as g, createElementVNode as j, renderSlot as F } from "vue";
|
|
2
|
+
import { _ as N } from "./Field.vue_vue_type_script_setup_true_lang-dAGKfjf5.js";
|
|
3
3
|
import { _ as U } from "./_plugin-vue_export-helper-CHgC5LLL.js";
|
|
4
4
|
const W = ["id", "aria-errormessage", "aria-invalid", "maxlength", "value", "placeholder", "disabled", "readonly", "rows"], Y = /* @__PURE__ */ k({
|
|
5
5
|
name: "ll-textarea",
|
|
@@ -26,8 +26,8 @@ const W = ["id", "aria-errormessage", "aria-invalid", "maxlength", "value", "pla
|
|
|
26
26
|
disabled: { type: Boolean }
|
|
27
27
|
},
|
|
28
28
|
emits: ["update:model-value"],
|
|
29
|
-
setup(
|
|
30
|
-
const u = E(), B = H(), m = A(), t =
|
|
29
|
+
setup(_, { emit: w }) {
|
|
30
|
+
const u = E(), B = H(), m = A(), t = _, z = w, f = x(), i = x(), R = y(() => t.isReadOnly || "readonly" in u && u.readonly !== !1), O = y(() => {
|
|
31
31
|
const e = { ...u };
|
|
32
32
|
return delete e["data-test"], delete e.class, e;
|
|
33
33
|
});
|
|
@@ -87,12 +87,12 @@ const W = ["id", "aria-errormessage", "aria-invalid", "maxlength", "value", "pla
|
|
|
87
87
|
}), $(() => {
|
|
88
88
|
var e;
|
|
89
89
|
(e = i.value) == null || e.disconnect();
|
|
90
|
-
}), (e, o) => (D(), q(N,
|
|
90
|
+
}), (e, o) => (D(), q(N, b(t, {
|
|
91
91
|
class: ["stash-textarea", [p(m).root]],
|
|
92
92
|
"data-test": "stash-textarea"
|
|
93
93
|
}), L({
|
|
94
|
-
default:
|
|
95
|
-
j("textarea",
|
|
94
|
+
default: g(({ fieldId: n, fieldErrorId: a, hasError: s }) => [
|
|
95
|
+
j("textarea", b({
|
|
96
96
|
id: n,
|
|
97
97
|
ref_key: "textareaRef",
|
|
98
98
|
ref: f,
|
|
@@ -100,13 +100,13 @@ const W = ["id", "aria-errormessage", "aria-invalid", "maxlength", "value", "pla
|
|
|
100
100
|
"aria-invalid": s,
|
|
101
101
|
class: [
|
|
102
102
|
p(m).textarea,
|
|
103
|
-
"
|
|
103
|
+
"border border-ice-500",
|
|
104
104
|
{
|
|
105
|
-
"stash-textarea--error
|
|
106
|
-
"
|
|
107
|
-
"
|
|
108
|
-
"
|
|
109
|
-
"
|
|
105
|
+
"stash-textarea--error border-red-500 text-red-500": s,
|
|
106
|
+
"text-ice-700 hover:border-ice-500 focus:border-blue-500 active:border-blue-500": !s && !t.disabled,
|
|
107
|
+
"resize-y": t.resize,
|
|
108
|
+
"min-h-[100px]": !t.rows,
|
|
109
|
+
"resize-none": !t.resize
|
|
110
110
|
}
|
|
111
111
|
],
|
|
112
112
|
maxlength: t.maxlength,
|
|
@@ -124,14 +124,14 @@ const W = ["id", "aria-errormessage", "aria-invalid", "maxlength", "value", "pla
|
|
|
124
124
|
}, [
|
|
125
125
|
p(B).hint ? {
|
|
126
126
|
name: "hint",
|
|
127
|
-
fn:
|
|
127
|
+
fn: g(() => [
|
|
128
128
|
F(e.$slots, "hint")
|
|
129
129
|
]),
|
|
130
130
|
key: "0"
|
|
131
131
|
} : void 0
|
|
132
132
|
]), 1040, ["class"]));
|
|
133
133
|
}
|
|
134
|
-
}), G = "
|
|
134
|
+
}), G = "_root_1mwme_5", J = "_textarea_1mwme_10", K = {
|
|
135
135
|
root: G,
|
|
136
136
|
textarea: J
|
|
137
137
|
}, Q = {
|
package/dist/Textarea.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.js","sources":["../src/components/Textarea/Textarea.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n import { computed, nextTick, onBeforeUnmount, onMounted, ref, useAttrs, useCssModule, useSlots, watch } from 'vue';\n\n import { FieldProps } from '../Field/Field.types';\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 extends FieldProps {\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 * 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 * Placeholder text for the textarea element.\n * **Note:** placeholders should be used to display examples; they should not be used as labels because they are not accessible as labels. If a real label cannot be used, use the `aria-label` attribute.\n */\n placeholder?: string;\n\n /**\n * Number of rows to display in the textarea.\n */\n rows?: number;\n\n /**\n * Maximum number of characters allowed in the textarea.\n */\n maxlength?: number;\n }\n\n defineOptions({\n name: 'll-textarea',\n });\n\n const attrs = useAttrs();\n const slots = useSlots();\n const classes = useCssModule();\n\n const props = withDefaults(defineProps<TextAreaProps>(), {\n modelValue: '',\n value: null,\n resize: false,\n maxlength: undefined,\n rows: undefined,\n placeholder: undefined,\n });\n\n const emits = 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 const isReadOnly = computed(() => props.isReadOnly || ('readonly' in attrs && attrs.readonly !== false));\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 if (v) {\n setupResizeObserver();\n } else {\n observer.value?.disconnect();\n }\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((entries) => {\n const entry = entries[0];\n\n if (!entry) {\n return;\n }\n\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\" class=\"stash-textarea\" :class=\"[classes.root]\" data-test=\"stash-textarea\">\n <template #default=\"{ fieldId, fieldErrorId, hasError }\">\n <textarea\n :id=\"fieldId\"\n ref=\"textareaRef\"\n :aria-errormessage=\"fieldErrorId\"\n :aria-invalid=\"hasError\"\n :class=\"[\n classes.textarea,\n 'tw-border tw-border-ice-500',\n {\n 'stash-textarea--error tw-border-red-500 tw-text-red-500': hasError,\n 'tw-text-ice-700 hover:tw-border-ice-500 focus:tw-border-blue-500 active:tw-border-blue-500':\n !hasError && !props.disabled,\n 'tw-resize-y': props.resize,\n 'tw-min-h-[100px]': !props.rows,\n 'tw-resize-none': !props.resize,\n },\n ]\"\n :maxlength=\"props.maxlength\"\n :value=\"props.modelValue\"\n data-test=\"stash-textarea|textarea\"\n :placeholder=\"props.placeholder\"\n v-bind=\"inputAttrs\"\n :disabled=\"props.disabled\"\n :readonly=\"isReadOnly\"\n :rows=\"props.rows\"\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-radius: theme('borderRadius.DEFAULT');\n display: block;\n outline: none;\n padding: theme('spacing[1.5]');\n width: 100%;\n\n &::placeholder {\n color: var(--color-ice-500);\n opacity: 1;\n }\n\n &[disabled] {\n background-color: var(--color-ice-100);\n border-color: var(--color-ice-500);\n color: var(--color-ice-500);\n pointer-events: none;\n }\n\n &[disabled]:active,\n &[disabled]:focus {\n box-shadow: none;\n }\n\n &[disabled]::placeholder {\n text-transform: none;\n color: var(--color-ice-500);\n }\n\n &[readonly] {\n border-color: transparent;\n background-color: transparent;\n padding-left: 0;\n padding-right: 0;\n min-height: unset;\n }\n }\n</style>\n"],"names":["attrs","useAttrs","slots","useSlots","classes","useCssModule","props","__props","emits","__emit","textareaRef","ref","observer","isReadOnly","computed","inputAttrs","allAttrs","watch","v","setupResizeObserver","_a","onInput","event","entries","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 { computed, nextTick, onBeforeUnmount, onMounted, ref, useAttrs, useCssModule, useSlots, watch } from 'vue';\n\n import { FieldProps } from '../Field/Field.types';\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 extends FieldProps {\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 * 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 * Placeholder text for the textarea element.\n * **Note:** placeholders should be used to display examples; they should not be used as labels because they are not accessible as labels. If a real label cannot be used, use the `aria-label` attribute.\n */\n placeholder?: string;\n\n /**\n * Number of rows to display in the textarea.\n */\n rows?: number;\n\n /**\n * Maximum number of characters allowed in the textarea.\n */\n maxlength?: number;\n }\n\n defineOptions({\n name: 'll-textarea',\n });\n\n const attrs = useAttrs();\n const slots = useSlots();\n const classes = useCssModule();\n\n const props = withDefaults(defineProps<TextAreaProps>(), {\n modelValue: '',\n value: null,\n resize: false,\n maxlength: undefined,\n rows: undefined,\n placeholder: undefined,\n });\n\n const emits = 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 const isReadOnly = computed(() => props.isReadOnly || ('readonly' in attrs && attrs.readonly !== false));\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 if (v) {\n setupResizeObserver();\n } else {\n observer.value?.disconnect();\n }\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((entries) => {\n const entry = entries[0];\n\n if (!entry) {\n return;\n }\n\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\" class=\"stash-textarea\" :class=\"[classes.root]\" data-test=\"stash-textarea\">\n <template #default=\"{ fieldId, fieldErrorId, hasError }\">\n <textarea\n :id=\"fieldId\"\n ref=\"textareaRef\"\n :aria-errormessage=\"fieldErrorId\"\n :aria-invalid=\"hasError\"\n :class=\"[\n classes.textarea,\n 'border border-ice-500',\n {\n 'stash-textarea--error border-red-500 text-red-500': hasError,\n 'text-ice-700 hover:border-ice-500 focus:border-blue-500 active:border-blue-500':\n !hasError && !props.disabled,\n 'resize-y': props.resize,\n 'min-h-[100px]': !props.rows,\n 'resize-none': !props.resize,\n },\n ]\"\n :maxlength=\"props.maxlength\"\n :value=\"props.modelValue\"\n data-test=\"stash-textarea|textarea\"\n :placeholder=\"props.placeholder\"\n v-bind=\"inputAttrs\"\n :disabled=\"props.disabled\"\n :readonly=\"isReadOnly\"\n :rows=\"props.rows\"\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 @reference \"../../../styles/main.css\";\n\n @layer utilities {\n .root {\n position: relative;\n width: 100%;\n }\n\n .textarea {\n background: var(--color-white);\n border-radius: var(--radius-sm);\n display: block;\n outline: none;\n padding: --spacing(1.5);\n width: 100%;\n\n &::placeholder {\n color: var(--color-ice-500);\n opacity: 1;\n }\n\n &[disabled] {\n background-color: var(--color-ice-100);\n border-color: var(--color-ice-500);\n color: var(--color-ice-500);\n pointer-events: none;\n }\n\n &[disabled]:active,\n &[disabled]:focus {\n box-shadow: none;\n }\n\n &[disabled]::placeholder {\n text-transform: none;\n color: var(--color-ice-500);\n }\n\n &[readonly] {\n border-color: transparent;\n background-color: transparent;\n padding-left: 0;\n padding-right: 0;\n min-height: unset;\n }\n }\n }\n</style>\n"],"names":["attrs","useAttrs","slots","useSlots","classes","useCssModule","props","__props","emits","__emit","textareaRef","ref","observer","isReadOnly","computed","inputAttrs","allAttrs","watch","v","setupResizeObserver","_a","onInput","event","entries","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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"}
|
package/dist/Thumbnail.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { t as
|
|
1
|
+
import { defineComponent as C, useCssModule as T, inject as x, computed as B, toValue as I, createElementBlock as y, openBlock as b, unref as e, normalizeClass as s, createVNode as h, createBlock as M, createCommentVNode as N, renderSlot as $, withModifiers as q, withCtx as V } from "vue";
|
|
2
|
+
import { t as w } from "./locale.js";
|
|
3
3
|
import z from "./Button.js";
|
|
4
4
|
import E from "./Icon.js";
|
|
5
|
-
import { _ as U } from "./Image.vue_vue_type_script_setup_true_lang-
|
|
5
|
+
import { _ as U } from "./Image.vue_vue_type_script_setup_true_lang-CAj0FH9h.js";
|
|
6
6
|
import { T as d } from "./ThumbnailGroup.keys-EJ4qFNhx.js";
|
|
7
7
|
import { _ as j } from "./_plugin-vue_export-helper-CHgC5LLL.js";
|
|
8
|
-
const A = ["aria-current", "draggable"], D = /* @__PURE__ */
|
|
8
|
+
const A = ["aria-current", "draggable"], D = /* @__PURE__ */ C({
|
|
9
9
|
__name: "Thumbnail",
|
|
10
10
|
props: {
|
|
11
11
|
thumbnail: {},
|
|
@@ -13,75 +13,75 @@ const A = ["aria-current", "draggable"], D = /* @__PURE__ */ w({
|
|
|
13
13
|
variant: { default: "opaque" }
|
|
14
14
|
},
|
|
15
15
|
emits: ["remove", "click"],
|
|
16
|
-
setup(_, { emit:
|
|
17
|
-
const u = _, r =
|
|
16
|
+
setup(_, { emit: p }) {
|
|
17
|
+
const u = _, r = p, t = T(), { thumbnails: v, activeThumbnail: i, draggable: f, isDragging: m, radius: n, removable: o } = x(
|
|
18
18
|
d.key,
|
|
19
19
|
d.defaults
|
|
20
|
-
),
|
|
21
|
-
function g() {
|
|
22
|
-
n.value = e.value, r("click", e.value);
|
|
23
|
-
}
|
|
20
|
+
), a = B(() => I(v).findIndex((l) => l === u.thumbnail));
|
|
24
21
|
function k() {
|
|
25
|
-
r("
|
|
22
|
+
i.value = a.value, r("click", a.value);
|
|
23
|
+
}
|
|
24
|
+
function g() {
|
|
25
|
+
r("remove", a.value), i.value = -1;
|
|
26
26
|
}
|
|
27
|
-
return (l, c) => (b(),
|
|
28
|
-
class: s(["stash-thumbnail
|
|
27
|
+
return (l, c) => (b(), y("li", {
|
|
28
|
+
class: s(["stash-thumbnail focus-visible:outline-hidden group relative cursor-pointer", [
|
|
29
29
|
{
|
|
30
|
-
[t
|
|
31
|
-
[t
|
|
32
|
-
[t
|
|
33
|
-
[t
|
|
34
|
-
[t
|
|
30
|
+
[e(t)["thumbnail-translucent"]]: u.variant === "translucent",
|
|
31
|
+
[e(t)["thumbnail-opaque"]]: u.variant === "opaque",
|
|
32
|
+
[e(t)["thumbnail-removable"]]: e(o),
|
|
33
|
+
[e(t)["thumbnail-circle"]]: e(n) === "circle",
|
|
34
|
+
[e(t)["thumbnail-rounded"]]: e(n) === "rounded"
|
|
35
35
|
}
|
|
36
36
|
]]),
|
|
37
|
-
"aria-current":
|
|
38
|
-
draggable:
|
|
37
|
+
"aria-current": e(i) === a.value,
|
|
38
|
+
draggable: e(f),
|
|
39
39
|
"data-test": "stash-thumbnail",
|
|
40
40
|
tabindex: "0",
|
|
41
|
-
onClick: c[0] || (c[0] = (L) =>
|
|
41
|
+
onClick: c[0] || (c[0] = (L) => k())
|
|
42
42
|
}, [
|
|
43
43
|
h(U, {
|
|
44
|
-
class: s(["stash-thumbnail__img
|
|
45
|
-
t
|
|
44
|
+
class: s(["stash-thumbnail__img border-ice-200 outline-blue-500/15 transition-colors", [
|
|
45
|
+
e(t)["thumbnail-img"],
|
|
46
46
|
{
|
|
47
|
-
[t
|
|
48
|
-
[t
|
|
49
|
-
"group-hover:
|
|
47
|
+
[e(t)["thumbnail-mask"]]: e(o) && e(n) !== "circle",
|
|
48
|
+
[e(t)["thumbnail-active"]]: e(i) === a.value && !e(m),
|
|
49
|
+
"group-hover:border-blue-500 group-focus-visible:border-blue-500 group-focus-visible:outline": !e(m)
|
|
50
50
|
}
|
|
51
51
|
]]),
|
|
52
52
|
"data-test": "stash-thumbnail|img",
|
|
53
|
-
radius:
|
|
53
|
+
radius: e(n),
|
|
54
54
|
src: l.thumbnail.imageUrl,
|
|
55
55
|
alt: l.altText
|
|
56
56
|
}, null, 8, ["class", "radius", "src", "alt"]),
|
|
57
|
-
|
|
57
|
+
e(o) ? (b(), M(z, {
|
|
58
58
|
key: 0,
|
|
59
|
-
class: s(["stash-thumbnail__remove", [t
|
|
59
|
+
class: s(["stash-thumbnail__remove", [e(t)["thumbnail-remove"]]]),
|
|
60
60
|
"data-test": "stash-thumbnail|remove",
|
|
61
|
-
"aria-label":
|
|
61
|
+
"aria-label": e(w)("ll.thumbnail.removeButton", { index: a.value + 1 }),
|
|
62
62
|
type: "button",
|
|
63
63
|
icon: "",
|
|
64
|
-
onClick:
|
|
64
|
+
onClick: q(g, ["stop", "prevent"])
|
|
65
65
|
}, {
|
|
66
|
-
default:
|
|
66
|
+
default: V(() => [
|
|
67
67
|
h(E, {
|
|
68
68
|
name: "close",
|
|
69
69
|
size: "small"
|
|
70
70
|
})
|
|
71
71
|
]),
|
|
72
72
|
_: 1
|
|
73
|
-
}, 8, ["class", "aria-label"])) :
|
|
74
|
-
|
|
73
|
+
}, 8, ["class", "aria-label"])) : N("", !0),
|
|
74
|
+
$(l.$slots, "hint")
|
|
75
75
|
], 10, A));
|
|
76
76
|
}
|
|
77
77
|
}), H = {
|
|
78
|
-
"thumbnail-remove": "_thumbnail-
|
|
79
|
-
"thumbnail-img": "_thumbnail-
|
|
80
|
-
"thumbnail-translucent": "_thumbnail-
|
|
81
|
-
"thumbnail-active": "_thumbnail-
|
|
82
|
-
"thumbnail-mask": "_thumbnail-
|
|
83
|
-
"thumbnail-full": "_thumbnail-
|
|
84
|
-
"thumbnail-rounded": "_thumbnail-
|
|
78
|
+
"thumbnail-remove": "_thumbnail-remove_4dpck_5",
|
|
79
|
+
"thumbnail-img": "_thumbnail-img_4dpck_27",
|
|
80
|
+
"thumbnail-translucent": "_thumbnail-translucent_4dpck_35",
|
|
81
|
+
"thumbnail-active": "_thumbnail-active_4dpck_39",
|
|
82
|
+
"thumbnail-mask": "_thumbnail-mask_4dpck_49",
|
|
83
|
+
"thumbnail-full": "_thumbnail-full_4dpck_53",
|
|
84
|
+
"thumbnail-rounded": "_thumbnail-rounded_4dpck_57"
|
|
85
85
|
}, J = {
|
|
86
86
|
$style: H
|
|
87
87
|
}, Q = /* @__PURE__ */ j(D, [["__cssModules", J]]);
|
package/dist/Thumbnail.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Thumbnail.js","sources":["../src/components/Thumbnail/Thumbnail.vue"],"sourcesContent":["<script lang=\"ts\">\n import { ThumbnailDefinition, ThumbnailVariant } from './Thumbnail.types';\n\n export * from './Thumbnail.types';\n</script>\n\n<script setup lang=\"ts\" generic=\"ThumbnailItem extends ThumbnailDefinition\">\n import { computed, inject, toValue, useCssModule } from 'vue';\n\n import { t } from '../../locale';\n import Button from '../Button/Button.vue';\n import Icon from '../Icon/Icon.vue';\n import Image from '../Image/Image.vue';\n import { THUMBNAIL_INJECTION } from '../ThumbnailGroup/ThumbnailGroup.keys';\n\n const props = withDefaults(\n defineProps<{\n /**\n * Thumbnail data containing and id and the image url\n */\n thumbnail: ThumbnailItem;\n\n /**\n * Thumbnail alt text for the image\n * @default ''\n */\n altText?: string;\n\n /**\n * Whether the thumbnail has some transparency or is fully opaque\n * @default 'opaque'\n */\n variant?: ThumbnailVariant;\n }>(),\n {\n variant: 'opaque',\n altText: '',\n },\n );\n\n const emit = defineEmits<{\n /**\n * Emits when a thumbnail is removed\n */\n remove: [index: number];\n\n /**\n * Emits when a thumbnail is clicked\n */\n click: [index: number];\n }>();\n\n const classes = useCssModule();\n\n const { thumbnails, activeThumbnail, draggable, isDragging, radius, removable } = inject(\n THUMBNAIL_INJECTION.key,\n THUMBNAIL_INJECTION.defaults,\n );\n\n const thumbnailIndex = computed(() => toValue(thumbnails).findIndex((t) => t === props.thumbnail));\n\n function handleThumbnailClick() {\n activeThumbnail.value = thumbnailIndex.value;\n emit('click', thumbnailIndex.value);\n }\n\n function handleRemove() {\n emit('remove', thumbnailIndex.value);\n activeThumbnail.value = -1;\n }\n</script>\n\n<template>\n <li\n class=\"stash-thumbnail
|
|
1
|
+
{"version":3,"file":"Thumbnail.js","sources":["../src/components/Thumbnail/Thumbnail.vue"],"sourcesContent":["<script lang=\"ts\">\n import { ThumbnailDefinition, ThumbnailVariant } from './Thumbnail.types';\n\n export * from './Thumbnail.types';\n</script>\n\n<script setup lang=\"ts\" generic=\"ThumbnailItem extends ThumbnailDefinition\">\n import { computed, inject, toValue, useCssModule } from 'vue';\n\n import { t } from '../../locale';\n import Button from '../Button/Button.vue';\n import Icon from '../Icon/Icon.vue';\n import Image from '../Image/Image.vue';\n import { THUMBNAIL_INJECTION } from '../ThumbnailGroup/ThumbnailGroup.keys';\n\n const props = withDefaults(\n defineProps<{\n /**\n * Thumbnail data containing and id and the image url\n */\n thumbnail: ThumbnailItem;\n\n /**\n * Thumbnail alt text for the image\n * @default ''\n */\n altText?: string;\n\n /**\n * Whether the thumbnail has some transparency or is fully opaque\n * @default 'opaque'\n */\n variant?: ThumbnailVariant;\n }>(),\n {\n variant: 'opaque',\n altText: '',\n },\n );\n\n const emit = defineEmits<{\n /**\n * Emits when a thumbnail is removed\n */\n remove: [index: number];\n\n /**\n * Emits when a thumbnail is clicked\n */\n click: [index: number];\n }>();\n\n const classes = useCssModule();\n\n const { thumbnails, activeThumbnail, draggable, isDragging, radius, removable } = inject(\n THUMBNAIL_INJECTION.key,\n THUMBNAIL_INJECTION.defaults,\n );\n\n const thumbnailIndex = computed(() => toValue(thumbnails).findIndex((t) => t === props.thumbnail));\n\n function handleThumbnailClick() {\n activeThumbnail.value = thumbnailIndex.value;\n emit('click', thumbnailIndex.value);\n }\n\n function handleRemove() {\n emit('remove', thumbnailIndex.value);\n activeThumbnail.value = -1;\n }\n</script>\n\n<template>\n <li\n class=\"stash-thumbnail focus-visible:outline-hidden group relative cursor-pointer\"\n :class=\"[\n {\n [classes['thumbnail-translucent']]: props.variant === 'translucent',\n [classes['thumbnail-opaque']]: props.variant === 'opaque',\n [classes['thumbnail-removable']]: removable,\n [classes['thumbnail-circle']]: radius === 'circle',\n [classes['thumbnail-rounded']]: radius === 'rounded',\n },\n ]\"\n :aria-current=\"activeThumbnail === thumbnailIndex\"\n :draggable=\"draggable\"\n data-test=\"stash-thumbnail\"\n tabindex=\"0\"\n @click=\"handleThumbnailClick()\"\n >\n <Image\n class=\"stash-thumbnail__img border-ice-200 outline-blue-500/15 transition-colors\"\n :class=\"[\n classes['thumbnail-img'],\n {\n [classes['thumbnail-mask']]: removable && radius !== 'circle',\n [classes['thumbnail-active']]: activeThumbnail === thumbnailIndex && !isDragging,\n 'group-hover:border-blue-500 group-focus-visible:border-blue-500 group-focus-visible:outline': !isDragging,\n },\n ]\"\n data-test=\"stash-thumbnail|img\"\n :radius=\"radius\"\n :src=\"thumbnail.imageUrl\"\n :alt=\"altText\"\n />\n\n <Button\n v-if=\"removable\"\n class=\"stash-thumbnail__remove\"\n :class=\"[classes['thumbnail-remove']]\"\n data-test=\"stash-thumbnail|remove\"\n :aria-label=\"t('ll.thumbnail.removeButton', { index: thumbnailIndex + 1 })\"\n type=\"button\"\n icon\n @click.stop.prevent=\"handleRemove\"\n >\n <Icon name=\"close\" size=\"small\" />\n </Button>\n\n <!-- @slot: Slot to add a hint below the image -->\n <slot name=\"hint\" />\n </li>\n</template>\n\n<style module>\n @reference \"../../../styles/main.css\";\n\n @layer utilities {\n .thumbnail-remove {\n position: absolute;\n top: calc(--spacing(1.5) * -1);\n right: calc(--spacing(1.5) * -1);\n padding: 1px;\n height: auto;\n width: auto !important;\n min-width: auto;\n border-radius: calc(infinity * 1px);\n background: var(--color-blue-500);\n color: white;\n\n &:hover,\n &:focus {\n background: var(--color-blue-600);\n }\n\n &:focus {\n outline: none;\n }\n }\n\n .thumbnail-img {\n border-style: solid;\n object-fit: cover;\n height: --spacing(12);\n width: --spacing(12);\n border-width: 1px;\n outline-width: var(--border-spacing-1);\n\n .thumbnail-translucent & {\n opacity: var(--opacity-40);\n\n &:hover,\n &.thumbnail-active {\n opacity: var(--opacity-100);\n }\n }\n }\n\n .thumbnail-active {\n border: 1px solid var(--color-ice-500);\n }\n\n .thumbnail-mask {\n mask-image: radial-gradient(circle at top right, transparent 20%, white 20.5%);\n }\n\n .thumbnail-full {\n border-radius: calc(infinity * 1px);\n }\n\n .thumbnail-rounded {\n border-radius: var(--radius-sm);\n }\n }\n</style>\n"],"names":["props","__props","emit","__emit","classes","useCssModule","thumbnails","activeThumbnail","draggable","isDragging","radius","removable","inject","THUMBNAIL_INJECTION","thumbnailIndex","computed","toValue","t","handleThumbnailClick","handleRemove"],"mappings":";;;;;;;;;;;;;;;;AAeE,UAAMA,IAAQC,GAyBRC,IAAOC,GAYPC,IAAUC,EAAA,GAEV,EAAE,YAAAC,GAAY,iBAAAC,GAAiB,WAAAC,GAAW,YAAAC,GAAY,QAAAC,GAAQ,WAAAC,MAAcC;AAAA,MAChFC,EAAoB;AAAA,MACpBA,EAAoB;AAAA,IAAA,GAGhBC,IAAiBC,EAAS,MAAMC,EAAQV,CAAU,EAAE,UAAU,CAACW,MAAMA,MAAMjB,EAAM,SAAS,CAAC;AAEjG,aAASkB,IAAuB;AAC9B,MAAAX,EAAgB,QAAQO,EAAe,OACvCZ,EAAK,SAASY,EAAe,KAAK;AAAA,IACpC;AAEA,aAASK,IAAe;AACtB,MAAAjB,EAAK,UAAUY,EAAe,KAAK,GACnCP,EAAgB,QAAQ;AAAA,IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/ThumbnailEmpty.js
CHANGED
|
@@ -10,8 +10,8 @@ const _ = /* @__PURE__ */ n({
|
|
|
10
10
|
class: r(["stash-thumbnail-empty", [
|
|
11
11
|
t(a)["thumbnail-empty"],
|
|
12
12
|
{
|
|
13
|
-
"
|
|
14
|
-
|
|
13
|
+
"rounded-full": t(e) === "circle",
|
|
14
|
+
rounded: t(e) === "rounded"
|
|
15
15
|
}
|
|
16
16
|
]]),
|
|
17
17
|
"data-test": "stash-thumbnail-empty"
|
|
@@ -23,7 +23,7 @@ const _ = /* @__PURE__ */ n({
|
|
|
23
23
|
], 2));
|
|
24
24
|
}
|
|
25
25
|
}), d = {
|
|
26
|
-
"thumbnail-empty": "_thumbnail-
|
|
26
|
+
"thumbnail-empty": "_thumbnail-empty_3wg9s_5"
|
|
27
27
|
}, h = {
|
|
28
28
|
$style: d
|
|
29
29
|
}, M = /* @__PURE__ */ p(_, [["__cssModules", h]]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThumbnailEmpty.js","sources":["../src/components/ThumbnailEmpty/ThumbnailEmpty.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { inject, useCssModule } from 'vue';\n\n import Icon from '../Icon/Icon.vue';\n import { THUMBNAIL_INJECTION } from '../ThumbnailGroup/ThumbnailGroup.keys';\n\n const classes = useCssModule();\n\n const { radius } = inject(THUMBNAIL_INJECTION.key, THUMBNAIL_INJECTION.defaults);\n</script>\n\n<template>\n <li\n class=\"stash-thumbnail-empty\"\n :class=\"[\n classes['thumbnail-empty'],\n {\n '
|
|
1
|
+
{"version":3,"file":"ThumbnailEmpty.js","sources":["../src/components/ThumbnailEmpty/ThumbnailEmpty.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { inject, useCssModule } from 'vue';\n\n import Icon from '../Icon/Icon.vue';\n import { THUMBNAIL_INJECTION } from '../ThumbnailGroup/ThumbnailGroup.keys';\n\n const classes = useCssModule();\n\n const { radius } = inject(THUMBNAIL_INJECTION.key, THUMBNAIL_INJECTION.defaults);\n</script>\n\n<template>\n <li\n class=\"stash-thumbnail-empty\"\n :class=\"[\n classes['thumbnail-empty'],\n {\n 'rounded-full': radius === 'circle',\n rounded: radius === 'rounded',\n },\n ]\"\n data-test=\"stash-thumbnail-empty\"\n >\n <Icon name=\"image\" data-test=\"stash-thumbnail-empty|icon\" />\n </li>\n</template>\n\n<style module>\n @reference \"../../../styles/main.css\";\n\n @layer utilities {\n .thumbnail-empty {\n height: --spacing(12);\n width: --spacing(12);\n border-width: 1px;\n outline-width: var(--border-spacing-1);\n border-style: dashed;\n border-color: var(--colors-ice-500);\n background-color: var(--colors-ice-100);\n color: var(--colors-ice-700);\n display: flex;\n justify-content: center;\n align-items: center;\n }\n }\n</style>\n"],"names":["classes","useCssModule","radius","inject","THUMBNAIL_INJECTION"],"mappings":";;;;;;;AAME,UAAMA,IAAUC,EAAA,GAEV,EAAE,QAAAC,EAAA,IAAWC,EAAOC,EAAoB,KAAKA,EAAoB,QAAQ;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/ThumbnailGroup.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { defineComponent as h, mergeModels as m, useModel as c, computed as l, ref as g, provide as v, createElementBlock as d, openBlock as o, renderSlot as T, normalizeProps as y, guardReactiveProps as _, unref as E, Fragment as x, renderList as
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import { defineComponent as h, mergeModels as m, useModel as c, computed as l, ref as g, provide as v, createElementBlock as d, openBlock as o, renderSlot as T, normalizeProps as y, guardReactiveProps as _, unref as E, Fragment as x, renderList as I, createBlock as B } from "vue";
|
|
2
|
+
import k, { moveSortableElements as S } from "./useSortable.js";
|
|
3
|
+
import w from "./ThumbnailEmpty.js";
|
|
4
4
|
import { T as C } from "./ThumbnailGroup.keys-EJ4qFNhx.js";
|
|
5
5
|
import { _ as D } from "./_plugin-vue_export-helper-CHgC5LLL.js";
|
|
6
6
|
const M = /* @__PURE__ */ h({
|
|
@@ -20,54 +20,54 @@ const M = /* @__PURE__ */ h({
|
|
|
20
20
|
}),
|
|
21
21
|
emits: /* @__PURE__ */ m(["dragStart", "dragEnd", "update:thumbnails"], ["update:activeThumbnail"]),
|
|
22
22
|
setup(s, { emit: p }) {
|
|
23
|
-
const n = p,
|
|
23
|
+
const n = p, a = s, r = c(s, "activeThumbnail"), t = l({
|
|
24
24
|
get() {
|
|
25
|
-
return
|
|
25
|
+
return a.thumbnails;
|
|
26
26
|
},
|
|
27
27
|
set(e) {
|
|
28
28
|
n("update:thumbnails", e);
|
|
29
29
|
}
|
|
30
|
-
}), u = g(null), { isDragging: i } =
|
|
30
|
+
}), u = g(null), { isDragging: i } = k({
|
|
31
31
|
ref: u,
|
|
32
|
-
list:
|
|
33
|
-
isEnabled:
|
|
32
|
+
list: t,
|
|
33
|
+
isEnabled: a.draggable,
|
|
34
34
|
ghostClass: "thumbnail-ghost",
|
|
35
35
|
chosenClass: "thumbnail-chosen",
|
|
36
36
|
sortInPlace: !1,
|
|
37
37
|
onDragStart: (e) => n("dragStart", e),
|
|
38
38
|
onDragEnd: (e) => {
|
|
39
|
-
r.value = e.newIndex,
|
|
39
|
+
r.value = e.newIndex, S({ list: t, from: e.oldIndex, to: e.newIndex }), n("dragEnd", e);
|
|
40
40
|
}
|
|
41
|
-
}),
|
|
42
|
-
if (!
|
|
43
|
-
const { max: e } =
|
|
44
|
-
return
|
|
41
|
+
}), f = l(() => {
|
|
42
|
+
if (!a.showEmpty) return 0;
|
|
43
|
+
const { max: e } = a.emptyOptions || {};
|
|
44
|
+
return t.value.length < e ? e - t.value.length : 0;
|
|
45
45
|
});
|
|
46
46
|
return v(
|
|
47
47
|
C.key,
|
|
48
48
|
Object.freeze({
|
|
49
|
-
draggable: l(() =>
|
|
50
|
-
removable: l(() =>
|
|
51
|
-
thumbnails:
|
|
52
|
-
radius:
|
|
49
|
+
draggable: l(() => a.draggable),
|
|
50
|
+
removable: l(() => a.removable),
|
|
51
|
+
thumbnails: t,
|
|
52
|
+
radius: a.radius,
|
|
53
53
|
activeThumbnail: r,
|
|
54
54
|
isDragging: i
|
|
55
55
|
})
|
|
56
56
|
), (e, O) => (o(), d("ul", {
|
|
57
57
|
ref_key: "thumbnailRef",
|
|
58
58
|
ref: u,
|
|
59
|
-
class: "stash-thumbnail-group
|
|
59
|
+
class: "stash-thumbnail-group flex flex-wrap gap-3",
|
|
60
60
|
"data-test": "stash-thumbnail-group"
|
|
61
61
|
}, [
|
|
62
62
|
T(e.$slots, "default", y(_({ activeThumbnail: r.value, isDragging: E(i) })), void 0, !0),
|
|
63
|
-
(o(!0), d(x, null,
|
|
64
|
-
key: `empty_thumb_${
|
|
63
|
+
(o(!0), d(x, null, I(f.value, (N, b) => (o(), B(w, {
|
|
64
|
+
key: `empty_thumb_${b}`
|
|
65
65
|
}))), 128))
|
|
66
66
|
], 512));
|
|
67
67
|
}
|
|
68
|
-
}), $ = /* @__PURE__ */ D(M, [["__scopeId", "data-v-
|
|
68
|
+
}), $ = /* @__PURE__ */ D(M, [["__scopeId", "data-v-5df36afa"]]);
|
|
69
69
|
export {
|
|
70
70
|
$ as default,
|
|
71
|
-
|
|
71
|
+
S as moveSortableElements
|
|
72
72
|
};
|
|
73
73
|
//# sourceMappingURL=ThumbnailGroup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThumbnailGroup.js","sources":["../src/components/ThumbnailGroup/ThumbnailGroup.vue"],"sourcesContent":["<script lang=\"ts\">\n import type { ThumbnailEmptyOptions, ThumbnailRadius } from './ThumbnailGroup.types';\n\n export * from '../../composables/useSortable/useSortable';\n export * from './ThumbnailGroup.types';\n</script>\n\n<script setup lang=\"ts\" generic=\"Thumbnail extends ThumbnailDefinition\">\n import { computed, provide, ref } from 'vue';\n\n import useSortable, {\n moveSortableElements,\n type SortableOnDragEndEvent,\n type SortableOnDragStartEvent,\n } from '../../composables/useSortable/useSortable';\n import { ThumbnailDefinition } from '../Thumbnail/Thumbnail.types';\n import ThumbnailEmpty from '../ThumbnailEmpty/ThumbnailEmpty.vue';\n import { THUMBNAIL_INJECTION } from './ThumbnailGroup.keys';\n\n const emit = defineEmits<{\n /**\n * Emits when a thumbnail starts dragging\n */\n dragStart: [event: SortableOnDragStartEvent];\n\n /**\n * Emits when a thumbnail stops dragging\n */\n dragEnd: [event: SortableOnDragEndEvent];\n\n /**\n * Emits when the thumbnails are updated\n */\n 'update:thumbnails': [thumbnails: Thumbnail[]];\n }>();\n\n const props = withDefaults(\n defineProps<{\n /**\n * Enable drag and drop functionality\n * @default false\n */\n draggable?: boolean;\n\n /**\n * Thumbnail radius. Can be 'rounded' or 'circle'\n * @default 'rounded'\n */\n radius?: ThumbnailRadius;\n\n /**\n * Shows a close button on the thumbnail when set to true\n * @default false\n */\n removable?: boolean;\n\n /**\n * Shows empty thumbnails when set to true\n */\n showEmpty?: boolean;\n\n /**\n * Empty thumbnail options. Only applicable when `showEmpty` is true\n * @default { max: 6 }\n */\n emptyOptions?: ThumbnailEmptyOptions;\n\n /**\n * List of thumbnails to display\n * @default []\n */\n thumbnails?: Thumbnail[];\n }>(),\n {\n thumbnails: () => [],\n draggable: false,\n radius: 'rounded',\n variant: 'opaque',\n removable: false,\n showEmpty: false,\n emptyOptions: () => ({ max: 6 }),\n },\n );\n\n /**\n * The active thumbnail index\n */\n const activeThumbnail = defineModel<number>('activeThumbnail', {\n default: -1,\n });\n\n const internalThumbnails = computed({\n get() {\n return props.thumbnails;\n },\n set(value) {\n emit('update:thumbnails', value);\n },\n });\n\n const thumbnailRef = ref<HTMLElement | null>(null);\n const { isDragging } = useSortable({\n ref: thumbnailRef,\n list: internalThumbnails,\n isEnabled: props.draggable,\n ghostClass: 'thumbnail-ghost',\n chosenClass: 'thumbnail-chosen',\n sortInPlace: false,\n onDragStart: (e) => emit('dragStart', e),\n onDragEnd: (e) => {\n activeThumbnail.value = e.newIndex;\n moveSortableElements({ list: internalThumbnails, from: e.oldIndex, to: e.newIndex });\n emit('dragEnd', e);\n },\n });\n\n const emptyThumbnailsCount = computed(() => {\n if (!props.showEmpty) return 0;\n\n const { max } = props.emptyOptions || {};\n\n return internalThumbnails.value.length < max ? max - internalThumbnails.value.length : 0;\n });\n\n provide(\n THUMBNAIL_INJECTION.key,\n Object.freeze({\n draggable: computed(() => props.draggable),\n removable: computed(() => props.removable),\n thumbnails: internalThumbnails,\n radius: props.radius,\n activeThumbnail,\n isDragging,\n }),\n );\n</script>\n\n<template>\n <ul ref=\"thumbnailRef\" class=\"stash-thumbnail-group
|
|
1
|
+
{"version":3,"file":"ThumbnailGroup.js","sources":["../src/components/ThumbnailGroup/ThumbnailGroup.vue"],"sourcesContent":["<script lang=\"ts\">\n import type { ThumbnailEmptyOptions, ThumbnailRadius } from './ThumbnailGroup.types';\n\n export * from '../../composables/useSortable/useSortable';\n export * from './ThumbnailGroup.types';\n</script>\n\n<script setup lang=\"ts\" generic=\"Thumbnail extends ThumbnailDefinition\">\n import { computed, provide, ref } from 'vue';\n\n import useSortable, {\n moveSortableElements,\n type SortableOnDragEndEvent,\n type SortableOnDragStartEvent,\n } from '../../composables/useSortable/useSortable';\n import { ThumbnailDefinition } from '../Thumbnail/Thumbnail.types';\n import ThumbnailEmpty from '../ThumbnailEmpty/ThumbnailEmpty.vue';\n import { THUMBNAIL_INJECTION } from './ThumbnailGroup.keys';\n\n const emit = defineEmits<{\n /**\n * Emits when a thumbnail starts dragging\n */\n dragStart: [event: SortableOnDragStartEvent];\n\n /**\n * Emits when a thumbnail stops dragging\n */\n dragEnd: [event: SortableOnDragEndEvent];\n\n /**\n * Emits when the thumbnails are updated\n */\n 'update:thumbnails': [thumbnails: Thumbnail[]];\n }>();\n\n const props = withDefaults(\n defineProps<{\n /**\n * Enable drag and drop functionality\n * @default false\n */\n draggable?: boolean;\n\n /**\n * Thumbnail radius. Can be 'rounded' or 'circle'\n * @default 'rounded'\n */\n radius?: ThumbnailRadius;\n\n /**\n * Shows a close button on the thumbnail when set to true\n * @default false\n */\n removable?: boolean;\n\n /**\n * Shows empty thumbnails when set to true\n */\n showEmpty?: boolean;\n\n /**\n * Empty thumbnail options. Only applicable when `showEmpty` is true\n * @default { max: 6 }\n */\n emptyOptions?: ThumbnailEmptyOptions;\n\n /**\n * List of thumbnails to display\n * @default []\n */\n thumbnails?: Thumbnail[];\n }>(),\n {\n thumbnails: () => [],\n draggable: false,\n radius: 'rounded',\n variant: 'opaque',\n removable: false,\n showEmpty: false,\n emptyOptions: () => ({ max: 6 }),\n },\n );\n\n /**\n * The active thumbnail index\n */\n const activeThumbnail = defineModel<number>('activeThumbnail', {\n default: -1,\n });\n\n const internalThumbnails = computed({\n get() {\n return props.thumbnails;\n },\n set(value) {\n emit('update:thumbnails', value);\n },\n });\n\n const thumbnailRef = ref<HTMLElement | null>(null);\n const { isDragging } = useSortable({\n ref: thumbnailRef,\n list: internalThumbnails,\n isEnabled: props.draggable,\n ghostClass: 'thumbnail-ghost',\n chosenClass: 'thumbnail-chosen',\n sortInPlace: false,\n onDragStart: (e) => emit('dragStart', e),\n onDragEnd: (e) => {\n activeThumbnail.value = e.newIndex;\n moveSortableElements({ list: internalThumbnails, from: e.oldIndex, to: e.newIndex });\n emit('dragEnd', e);\n },\n });\n\n const emptyThumbnailsCount = computed(() => {\n if (!props.showEmpty) return 0;\n\n const { max } = props.emptyOptions || {};\n\n return internalThumbnails.value.length < max ? max - internalThumbnails.value.length : 0;\n });\n\n provide(\n THUMBNAIL_INJECTION.key,\n Object.freeze({\n draggable: computed(() => props.draggable),\n removable: computed(() => props.removable),\n thumbnails: internalThumbnails,\n radius: props.radius,\n activeThumbnail,\n isDragging,\n }),\n );\n</script>\n\n<template>\n <ul ref=\"thumbnailRef\" class=\"stash-thumbnail-group flex flex-wrap gap-3\" data-test=\"stash-thumbnail-group\">\n <slot v-bind=\"{ activeThumbnail, isDragging }\"></slot>\n\n <ThumbnailEmpty v-for=\"(_, index) in emptyThumbnailsCount\" :key=\"`empty_thumb_${index}`\" />\n </ul>\n</template>\n\n<style>\n @layer utilities {\n .thumbnail-ghost {\n .stash-thumbnail-item__img {\n border: 1px solid var(--color-blue-500);\n mask-image: none !important;\n box-shadow: var(--shadow);\n }\n\n .stash-thumbnail-item__remove {\n opacity: 0;\n }\n }\n }\n</style>\n\n<style scoped>\n @layer utilities {\n :deep(.thumbnail-chosen) {\n opacity: 0 !important;\n }\n }\n</style>\n"],"names":["emit","__emit","props","__props","activeThumbnail","_useModel","internalThumbnails","computed","value","thumbnailRef","ref","isDragging","useSortable","moveSortableElements","emptyThumbnailsCount","max","provide","THUMBNAIL_INJECTION"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAmBE,UAAMA,IAAOC,GAiBPC,IAAQC,GAmDRC,IAAkBC,EAAmBF,GAAC,iBAE3C,GAEKG,IAAqBC,EAAS;AAAA,MAClC,MAAM;AACJ,eAAOL,EAAM;AAAA,MACf;AAAA,MACA,IAAIM,GAAO;AACT,QAAAR,EAAK,qBAAqBQ,CAAK;AAAA,MACjC;AAAA,IAAA,CACD,GAEKC,IAAeC,EAAwB,IAAI,GAC3C,EAAE,YAAAC,EAAA,IAAeC,EAAY;AAAA,MACjC,KAAKH;AAAA,MACL,MAAMH;AAAA,MACN,WAAWJ,EAAM;AAAA,MACjB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa,CAAC,MAAMF,EAAK,aAAa,CAAC;AAAA,MACvC,WAAW,CAAC,MAAM;AAChB,QAAAI,EAAgB,QAAQ,EAAE,UAC1BS,EAAqB,EAAE,MAAMP,GAAoB,MAAM,EAAE,UAAU,IAAI,EAAE,UAAU,GACnFN,EAAK,WAAW,CAAC;AAAA,MACnB;AAAA,IAAA,CACD,GAEKc,IAAuBP,EAAS,MAAM;AAC1C,UAAI,CAACL,EAAM,UAAW,QAAO;AAE7B,YAAM,EAAE,KAAAa,EAAA,IAAQb,EAAM,gBAAgB,CAAA;AAEtC,aAAOI,EAAmB,MAAM,SAASS,IAAMA,IAAMT,EAAmB,MAAM,SAAS;AAAA,IACzF,CAAC;AAED,WAAAU;AAAA,MACEC,EAAoB;AAAA,MACpB,OAAO,OAAO;AAAA,QACZ,WAAWV,EAAS,MAAML,EAAM,SAAS;AAAA,QACzC,WAAWK,EAAS,MAAML,EAAM,SAAS;AAAA,QACzC,YAAYI;AAAA,QACZ,QAAQJ,EAAM;AAAA,QACd,iBAAAE;AAAA,QACA,YAAAO;AAAA,MAAA,CACD;AAAA,IAAA;;;;;;;;;;;;;"}
|
package/dist/Timeline.js
CHANGED
|
@@ -13,14 +13,14 @@ const c = /* @__PURE__ */ o({
|
|
|
13
13
|
side: t(() => e.side),
|
|
14
14
|
density: t(() => e.density)
|
|
15
15
|
}), (i, f) => (r(), a("ol", {
|
|
16
|
-
class: d(["stash-timeline
|
|
16
|
+
class: d(["stash-timeline grid grid-flow-dense items-start justify-center gap-x-3 gap-y-1.5", [`stash-timeline--${e.side}`, `stash-timeline--${e.density}`]]),
|
|
17
17
|
"data-test": "stash-timeline"
|
|
18
18
|
}, [
|
|
19
19
|
l(i.$slots, "default", {}, void 0, !0)
|
|
20
20
|
], 2));
|
|
21
21
|
}
|
|
22
|
-
}),
|
|
22
|
+
}), h = /* @__PURE__ */ p(c, [["__scopeId", "data-v-94bbf334"]]);
|
|
23
23
|
export {
|
|
24
|
-
|
|
24
|
+
h as default
|
|
25
25
|
};
|
|
26
26
|
//# sourceMappingURL=Timeline.js.map
|
package/dist/Timeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Timeline.js","sources":["../src/components/Timeline/Timeline.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { SpacingDensities } from 'types';\n import { computed, provide } from 'vue';\n\n import { TIMELINE_INJECTION } from './keys';\n\n export interface TimelineProps {\n /**\n * Sets which side of the timeline the main and opposed content is going to be displayed.\n */\n side?: 'start' | 'end';\n\n /**\n * Sets the size of each timeline item.\n */\n density?: SpacingDensities;\n }\n\n const props = withDefaults(defineProps<TimelineProps>(), {\n side: 'end',\n density: 'comfortable',\n });\n\n provide(TIMELINE_INJECTION.key, {\n side: computed(() => props.side),\n density: computed(() => props.density),\n });\n</script>\n\n<template>\n <ol\n class=\"stash-timeline
|
|
1
|
+
{"version":3,"file":"Timeline.js","sources":["../src/components/Timeline/Timeline.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { SpacingDensities } from 'types';\n import { computed, provide } from 'vue';\n\n import { TIMELINE_INJECTION } from './keys';\n\n export interface TimelineProps {\n /**\n * Sets which side of the timeline the main and opposed content is going to be displayed.\n */\n side?: 'start' | 'end';\n\n /**\n * Sets the size of each timeline item.\n */\n density?: SpacingDensities;\n }\n\n const props = withDefaults(defineProps<TimelineProps>(), {\n side: 'end',\n density: 'comfortable',\n });\n\n provide(TIMELINE_INJECTION.key, {\n side: computed(() => props.side),\n density: computed(() => props.density),\n });\n</script>\n\n<template>\n <ol\n class=\"stash-timeline grid grid-flow-dense items-start justify-center gap-x-3 gap-y-1.5\"\n :class=\"[`stash-timeline--${props.side}`, `stash-timeline--${props.density}`]\"\n data-test=\"stash-timeline\"\n >\n <slot></slot>\n </ol>\n</template>\n\n<style scoped>\n @layer utilities {\n .stash-timeline {\n grid-template-columns: auto min-content auto;\n }\n }\n</style>\n"],"names":["props","__props","provide","TIMELINE_INJECTION","computed"],"mappings":";;;;;;;;;;AAkBE,UAAMA,IAAQC;AAKd,WAAAC,EAAQC,EAAmB,KAAK;AAAA,MAC9B,MAAMC,EAAS,MAAMJ,EAAM,IAAI;AAAA,MAC/B,SAASI,EAAS,MAAMJ,EAAM,OAAO;AAAA,IAAA,CACtC;;;;;;;;"}
|
package/dist/TimelineItem.js
CHANGED
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { T as
|
|
3
|
-
const
|
|
4
|
-
class: "stash-timeline-item group
|
|
1
|
+
import { defineComponent as v, useSlots as f, inject as h, computed as m, createElementBlock as c, openBlock as r, createElementVNode as t, createCommentVNode as _, normalizeClass as p, renderSlot as d } from "vue";
|
|
2
|
+
import { T as I } from "./keys-BEdEsanp.js";
|
|
3
|
+
const T = {
|
|
4
|
+
class: "stash-timeline-item group contents list-none",
|
|
5
5
|
"data-test": "stash-timeline-item"
|
|
6
|
-
},
|
|
6
|
+
}, C = /* @__PURE__ */ v({
|
|
7
7
|
__name: "TimelineItem",
|
|
8
|
-
setup(
|
|
9
|
-
const u =
|
|
8
|
+
setup(b) {
|
|
9
|
+
const u = f(), s = h(I.key);
|
|
10
10
|
if (!s)
|
|
11
11
|
throw Error("The TimelineItem component must be a child of the Timeline component.");
|
|
12
|
-
const { density: o, side:
|
|
12
|
+
const { density: o, side: e } = s, n = m(() => ({
|
|
13
13
|
main: {
|
|
14
|
-
"
|
|
15
|
-
"
|
|
14
|
+
"col-start-3": e.value === "end",
|
|
15
|
+
"col-end-2": e.value === "start"
|
|
16
16
|
},
|
|
17
17
|
opposite: {
|
|
18
|
-
"
|
|
19
|
-
"
|
|
18
|
+
"col-end-2": e.value === "end",
|
|
19
|
+
"col-start-3": e.value === "start"
|
|
20
20
|
}
|
|
21
21
|
})), i = m(() => ({
|
|
22
|
-
"
|
|
23
|
-
"
|
|
22
|
+
"mb-3": o.value === "compact",
|
|
23
|
+
"mb-6": o.value === "comfortable"
|
|
24
24
|
}));
|
|
25
|
-
return (l, a) => (r(), c("li",
|
|
26
|
-
|
|
25
|
+
return (l, a) => (r(), c("li", T, [
|
|
26
|
+
t("div", {
|
|
27
27
|
class: p(["stash-timeline-item__main-content", [n.value.main, i.value]]),
|
|
28
28
|
"data-test": "stash-timeline-item|content"
|
|
29
29
|
}, [
|
|
30
30
|
d(l.$slots, "default")
|
|
31
31
|
], 2),
|
|
32
|
-
a[0] || (a[0] =
|
|
33
|
-
class: "stash-timeline-separator
|
|
32
|
+
a[0] || (a[0] = t("div", {
|
|
33
|
+
class: "stash-timeline-separator col-start-2 col-end-3 flex h-full flex-col items-center",
|
|
34
34
|
"data-test": "stash-timeline-separator"
|
|
35
35
|
}, [
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
t("div", { class: "mt-[5px] rounded-full bg-ice-500 p-1.5" }),
|
|
37
|
+
t("div", { class: "w-[2px] flex-1 bg-ice-500" })
|
|
38
38
|
], -1)),
|
|
39
39
|
u.opposite ? (r(), c("div", {
|
|
40
40
|
key: 0,
|
|
@@ -42,11 +42,11 @@ const I = {
|
|
|
42
42
|
"data-test": "stash-timeline-item|opposite-content"
|
|
43
43
|
}, [
|
|
44
44
|
d(l.$slots, "opposite")
|
|
45
|
-
], 2)) :
|
|
45
|
+
], 2)) : _("", !0)
|
|
46
46
|
]));
|
|
47
47
|
}
|
|
48
48
|
});
|
|
49
49
|
export {
|
|
50
|
-
|
|
50
|
+
C as default
|
|
51
51
|
};
|
|
52
52
|
//# sourceMappingURL=TimelineItem.js.map
|
package/dist/TimelineItem.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimelineItem.js","sources":["../src/components/TimelineItem/TimelineItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, inject } from 'vue';\n\n import { TIMELINE_INJECTION } from '../Timeline/keys';\n\n const slots = defineSlots<{\n /**\n * The opposite content of the timeline item.\n */\n opposite?: () => Record<string, never>;\n\n /**\n * The default content of the timeline item.\n */\n default: () => Record<string, never>;\n }>();\n\n const timelineInjection = inject(TIMELINE_INJECTION.key);\n\n if (!timelineInjection) {\n throw Error('The TimelineItem component must be a child of the Timeline component.');\n }\n\n const { density, side } = timelineInjection;\n\n const sideClasses = computed(() => {\n return {\n main: {\n '
|
|
1
|
+
{"version":3,"file":"TimelineItem.js","sources":["../src/components/TimelineItem/TimelineItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, inject } from 'vue';\n\n import { TIMELINE_INJECTION } from '../Timeline/keys';\n\n const slots = defineSlots<{\n /**\n * The opposite content of the timeline item.\n */\n opposite?: () => Record<string, never>;\n\n /**\n * The default content of the timeline item.\n */\n default: () => Record<string, never>;\n }>();\n\n const timelineInjection = inject(TIMELINE_INJECTION.key);\n\n if (!timelineInjection) {\n throw Error('The TimelineItem component must be a child of the Timeline component.');\n }\n\n const { density, side } = timelineInjection;\n\n const sideClasses = computed(() => {\n return {\n main: {\n 'col-start-3': side.value === 'end',\n 'col-end-2': side.value === 'start',\n },\n opposite: {\n 'col-end-2': side.value === 'end',\n 'col-start-3': side.value === 'start',\n },\n };\n });\n\n const contentDensity = computed(() => ({\n 'mb-3': density.value === 'compact',\n 'mb-6': density.value === 'comfortable',\n }));\n</script>\n\n<template>\n <li class=\"stash-timeline-item group contents list-none\" data-test=\"stash-timeline-item\">\n <div\n class=\"stash-timeline-item__main-content\"\n :class=\"[sideClasses.main, contentDensity]\"\n data-test=\"stash-timeline-item|content\"\n >\n <slot></slot>\n </div>\n\n <div\n class=\"stash-timeline-separator col-start-2 col-end-3 flex h-full flex-col items-center\"\n data-test=\"stash-timeline-separator\"\n >\n <div class=\"mt-[5px] rounded-full bg-ice-500 p-1.5\"></div>\n <div class=\"w-[2px] flex-1 bg-ice-500\"></div>\n </div>\n\n <div\n v-if=\"slots.opposite\"\n class=\"stash-timeline-item__opposite-content\"\n :class=\"[sideClasses.opposite, contentDensity]\"\n data-test=\"stash-timeline-item|opposite-content\"\n >\n <slot name=\"opposite\"></slot>\n </div>\n </li>\n</template>\n"],"names":["slots","_useSlots","timelineInjection","inject","TIMELINE_INJECTION","density","side","sideClasses","computed","contentDensity"],"mappings":";;;;;;;;AAKE,UAAMA,IAAQC,EAAA,GAYRC,IAAoBC,EAAOC,EAAmB,GAAG;AAEvD,QAAI,CAACF;AACH,YAAM,MAAM,uEAAuE;AAGrF,UAAM,EAAE,SAAAG,GAAS,MAAAC,EAAA,IAASJ,GAEpBK,IAAcC,EAAS,OACpB;AAAA,MACL,MAAM;AAAA,QACJ,eAAeF,EAAK,UAAU;AAAA,QAC9B,aAAaA,EAAK,UAAU;AAAA,MAAA;AAAA,MAE9B,UAAU;AAAA,QACR,aAAaA,EAAK,UAAU;AAAA,QAC5B,eAAeA,EAAK,UAAU;AAAA,MAAA;AAAA,IAChC,EAEH,GAEKG,IAAiBD,EAAS,OAAO;AAAA,MACrC,QAAQH,EAAQ,UAAU;AAAA,MAC1B,QAAQA,EAAQ,UAAU;AAAA,IAAA,EAC1B;;;;;;;;;;;;;;;;;;;;;;;;;"}
|