@indielayer/ui 1.8.3 → 1.9.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/docs/pages/component/menu/usage.vue +1 -0
- package/docs/pages/component/select/usage.vue +17 -5
- package/docs/pages/component/table/index.vue +7 -0
- package/docs/pages/component/table/virtual.vue +53 -0
- package/lib/components/menu/MenuItem.vue.d.ts +3 -3
- package/lib/components/menu/MenuItem.vue.js +1 -1
- package/lib/components/menu/MenuItem.vue2.js +16 -16
- package/lib/components/menu/theme/MenuItem.base.theme.js +30 -30
- package/lib/components/select/Select.vue.d.ts +36 -0
- package/lib/components/select/Select.vue.js +224 -201
- package/lib/components/select/theme/Select.base.theme.js +1 -1
- package/lib/components/table/Table.vue.d.ts +91 -4
- package/lib/components/table/Table.vue.js +214 -180
- package/lib/components/table/TableHead.vue.d.ts +10 -2
- package/lib/components/table/TableHead.vue.js +16 -13
- package/lib/components/table/TableHeader.vue.d.ts +0 -4
- package/lib/components/table/TableHeader.vue.js +9 -10
- package/lib/components/table/theme/TableHead.base.theme.js +7 -4
- package/lib/components/table/theme/TableHead.carbon.theme.js +7 -4
- package/lib/components/table/theme/TableHeader.base.theme.js +3 -3
- package/lib/components/table/theme/TableHeader.carbon.theme.js +1 -1
- package/lib/composables/index.d.ts +1 -0
- package/lib/composables/useVirtualList.d.ts +48 -0
- package/lib/composables/useVirtualList.js +123 -0
- package/lib/index.js +35 -33
- package/lib/index.umd.js +4 -4
- package/lib/node_modules/.pnpm/@vueuse_core@10.2.0_vue@3.3.9_typescript@5.2.2_/node_modules/@vueuse/core/index.js +254 -221
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +1 -1
- package/src/components/menu/MenuItem.vue +1 -1
- package/src/components/menu/theme/MenuItem.base.theme.ts +8 -8
- package/src/components/select/Select.vue +56 -26
- package/src/components/select/theme/Select.base.theme.ts +1 -1
- package/src/components/table/Table.vue +152 -113
- package/src/components/table/TableHead.vue +6 -2
- package/src/components/table/TableHeader.vue +0 -1
- package/src/components/table/theme/TableHead.base.theme.ts +7 -1
- package/src/components/table/theme/TableHead.carbon.theme.ts +7 -1
- package/src/components/table/theme/TableHeader.base.theme.ts +0 -2
- package/src/components/table/theme/TableHeader.carbon.theme.ts +0 -2
- package/src/composables/index.ts +1 -0
- package/src/composables/useVirtualList.ts +286 -0
- package/src/version.ts +1 -1
|
@@ -2,15 +2,25 @@
|
|
|
2
2
|
import { ref } from 'vue'
|
|
3
3
|
|
|
4
4
|
const selected = ref<undefined | string>()
|
|
5
|
+
const selected2 = ref<undefined | string>()
|
|
5
6
|
const selectedMultiple = ref<string[]>(['A', 'B'])
|
|
6
7
|
const options = ref([
|
|
7
8
|
{ value: 'A', label: 'Option A', disabled: true },
|
|
8
9
|
{ value: 'B', label: 'Option B' },
|
|
9
10
|
])
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
// function to generate
|
|
13
|
+
function genOptions(x: number) {
|
|
14
|
+
const options = []
|
|
15
|
+
|
|
16
|
+
for (let i = 0; i < x; i++) {
|
|
17
|
+
options.push({ value: i.toString(), label: 'Option ' + i })
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return options
|
|
13
21
|
}
|
|
22
|
+
|
|
23
|
+
const options2 = ref(genOptions(1000))
|
|
14
24
|
</script>
|
|
15
25
|
|
|
16
26
|
<template>
|
|
@@ -25,11 +35,13 @@ for (let i = 0; i < 20; i++) {
|
|
|
25
35
|
native
|
|
26
36
|
/>
|
|
27
37
|
<x-select
|
|
28
|
-
v-model="
|
|
29
|
-
label="
|
|
38
|
+
v-model="selected2"
|
|
39
|
+
label="Filterable - virtual list"
|
|
30
40
|
placeholder="Placeholder"
|
|
31
41
|
filterable
|
|
32
|
-
|
|
42
|
+
virtual-list
|
|
43
|
+
:virtual-list-item-height="33"
|
|
44
|
+
:options="options2"
|
|
33
45
|
/>
|
|
34
46
|
<x-select
|
|
35
47
|
v-model="selectedMultiple"
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { XTable, XTableBody, XTableCell, XTableHead, XTableHeader, XTableRow } from '@indielayer/ui'
|
|
3
3
|
import UsageDemoCode from './usage.vue?raw'
|
|
4
4
|
import UsageDemo from './usage.vue'
|
|
5
|
+
import VirtualDemoCode from './virtual.vue?raw'
|
|
6
|
+
import VirtualDemo from './virtual.vue'
|
|
5
7
|
import StatesDemoCode from './states.vue?raw'
|
|
6
8
|
import StatesDemo from './states.vue'
|
|
7
9
|
|
|
@@ -13,6 +15,11 @@ const demos = [{
|
|
|
13
15
|
description: '',
|
|
14
16
|
code: UsageDemoCode,
|
|
15
17
|
component: UsageDemo,
|
|
18
|
+
}, {
|
|
19
|
+
name: 'Virtual List',
|
|
20
|
+
description: '',
|
|
21
|
+
code: VirtualDemoCode,
|
|
22
|
+
component: VirtualDemo,
|
|
16
23
|
}, {
|
|
17
24
|
name: 'States',
|
|
18
25
|
description: '',
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { type TableHeader } from '@indielayer/ui'
|
|
3
|
+
import { computed, ref } from 'vue'
|
|
4
|
+
|
|
5
|
+
const headers: TableHeader[] = [
|
|
6
|
+
{ text: '#', value: 'id', sortable: true, align: 'center' },
|
|
7
|
+
{ text: 'Title', value: 'title' },
|
|
8
|
+
{ text: 'Description', value: 'description' },
|
|
9
|
+
{ text: 'Published', value: 'published' },
|
|
10
|
+
{ text: 'Status', value: 'status' },
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
const sort = ref([])
|
|
14
|
+
const itemsSorted = computed<any[]>(() => {
|
|
15
|
+
const ite = items.value.slice(0)
|
|
16
|
+
|
|
17
|
+
return ite.sort((a: any, b: any) => {
|
|
18
|
+
for (const s of sort.value) {
|
|
19
|
+
const [key, asc] = (s as string).split(',')
|
|
20
|
+
|
|
21
|
+
if (a[key] > b[key]) return asc === '-1' ? -1 : 1
|
|
22
|
+
if (a[key] < b[key]) return asc === '-1' ? 1 : -1
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return 0
|
|
26
|
+
})
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
function generateItems(x: number) {
|
|
30
|
+
return Array.from({ length: x }, (_, i) => ({
|
|
31
|
+
id: i + 1,
|
|
32
|
+
title: `Book ${i + 1}`,
|
|
33
|
+
description: 'Lorem ipsum dolor sit, amet consectetur adipisicing elit. Saepe, velit.',
|
|
34
|
+
published: Date.now() - x * i,
|
|
35
|
+
status: 'Tag label',
|
|
36
|
+
}))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const items = ref(generateItems(1000))
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<template>
|
|
43
|
+
<x-card>
|
|
44
|
+
<x-table
|
|
45
|
+
v-model:sort="sort"
|
|
46
|
+
class="h-[300px]"
|
|
47
|
+
:headers="headers"
|
|
48
|
+
:items="itemsSorted"
|
|
49
|
+
virtual-list
|
|
50
|
+
:virtual-list-item-height="54"
|
|
51
|
+
/>
|
|
52
|
+
</x-card>
|
|
53
|
+
</template>
|
|
@@ -13,7 +13,7 @@ declare const menuItemProps: {
|
|
|
13
13
|
};
|
|
14
14
|
onClick: FunctionConstructor;
|
|
15
15
|
value: (StringConstructor | NumberConstructor)[];
|
|
16
|
-
to: StringConstructor;
|
|
16
|
+
to: (ObjectConstructor | StringConstructor)[];
|
|
17
17
|
exact: BooleanConstructor;
|
|
18
18
|
href: StringConstructor;
|
|
19
19
|
target: StringConstructor;
|
|
@@ -61,7 +61,7 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
|
|
|
61
61
|
};
|
|
62
62
|
onClick: FunctionConstructor;
|
|
63
63
|
value: (StringConstructor | NumberConstructor)[];
|
|
64
|
-
to: StringConstructor;
|
|
64
|
+
to: (ObjectConstructor | StringConstructor)[];
|
|
65
65
|
exact: BooleanConstructor;
|
|
66
66
|
href: StringConstructor;
|
|
67
67
|
target: StringConstructor;
|
|
@@ -101,7 +101,7 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
|
|
|
101
101
|
};
|
|
102
102
|
onClick: FunctionConstructor;
|
|
103
103
|
value: (StringConstructor | NumberConstructor)[];
|
|
104
|
-
to: StringConstructor;
|
|
104
|
+
to: (ObjectConstructor | StringConstructor)[];
|
|
105
105
|
exact: BooleanConstructor;
|
|
106
106
|
href: StringConstructor;
|
|
107
107
|
target: StringConstructor;
|
|
@@ -3,7 +3,7 @@ import o from "./MenuItem.vue3.js";
|
|
|
3
3
|
import t from "../../_virtual/_plugin-vue_export-helper.js";
|
|
4
4
|
const e = {
|
|
5
5
|
$style: o
|
|
6
|
-
}, c = /* @__PURE__ */ t(s, [["__cssModules", e], ["__scopeId", "data-v-
|
|
6
|
+
}, c = /* @__PURE__ */ t(s, [["__cssModules", e], ["__scopeId", "data-v-95a80ef5"]]);
|
|
7
7
|
export {
|
|
8
8
|
c as default
|
|
9
9
|
};
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { defineComponent as z, ref as p, computed as d, onMounted as S, watch as k, openBlock as l, createBlock as i, resolveDynamicComponent as x, mergeProps as N, unref as s, withCtx as R, createElementBlock as r, renderSlot as n, createCommentVNode as u, createTextVNode as I, toDisplayString as M, createElementVNode as
|
|
2
|
-
import { useMutationObserver as
|
|
3
|
-
import { useColors as
|
|
1
|
+
import { defineComponent as z, ref as p, computed as d, onMounted as S, watch as k, openBlock as l, createBlock as i, resolveDynamicComponent as x, mergeProps as N, unref as s, withCtx as R, createElementBlock as r, renderSlot as n, createCommentVNode as u, createTextVNode as I, toDisplayString as M, createElementVNode as O, Fragment as P } from "vue";
|
|
2
|
+
import { useMutationObserver as j } from "../../node_modules/.pnpm/@vueuse_core@10.2.0_vue@3.3.9_typescript@5.2.2_/node_modules/@vueuse/core/index.js";
|
|
3
|
+
import { useColors as w } from "../../composables/useColors.js";
|
|
4
4
|
import { useCommon as h } from "../../composables/useCommon.js";
|
|
5
|
-
import { useTheme as
|
|
5
|
+
import { useTheme as D } from "../../composables/useTheme.js";
|
|
6
6
|
import g from "../icon/Icon.vue.js";
|
|
7
|
-
import
|
|
8
|
-
const
|
|
7
|
+
import F from "../spinner/Spinner.vue.js";
|
|
8
|
+
const T = {
|
|
9
9
|
key: 0,
|
|
10
10
|
class: "mr-2 shrink-0"
|
|
11
|
-
},
|
|
11
|
+
}, V = {
|
|
12
12
|
key: 2,
|
|
13
13
|
class: "flex-1 truncate"
|
|
14
14
|
}, E = { class: "ml-1 shrink-0" }, A = { key: 0 }, L = {
|
|
15
15
|
...h.props(),
|
|
16
|
-
...
|
|
16
|
+
...w.props("primary"),
|
|
17
17
|
item: {
|
|
18
18
|
type: Object,
|
|
19
19
|
default: () => {
|
|
@@ -27,7 +27,7 @@ const V = {
|
|
|
27
27
|
},
|
|
28
28
|
onClick: Function,
|
|
29
29
|
value: [Number, String],
|
|
30
|
-
to: String,
|
|
30
|
+
to: [String, Object],
|
|
31
31
|
exact: Boolean,
|
|
32
32
|
href: String,
|
|
33
33
|
target: String,
|
|
@@ -61,7 +61,7 @@ const V = {
|
|
|
61
61
|
...c.item
|
|
62
62
|
})), v = d(() => e.value.to ? "router-link" : e.value.href ? "a" : "div");
|
|
63
63
|
S(() => {
|
|
64
|
-
a.value && (f(), v.value === "router-link" &&
|
|
64
|
+
a.value && (f(), v.value === "router-link" && j(a.value.$el, f, {
|
|
65
65
|
attributes: !0,
|
|
66
66
|
attributeFilter: ["class"]
|
|
67
67
|
}));
|
|
@@ -85,7 +85,7 @@ const V = {
|
|
|
85
85
|
}), k(() => e.value.active, (t) => {
|
|
86
86
|
o.value = !!t;
|
|
87
87
|
});
|
|
88
|
-
const { styles: _, classes: B, className: C } =
|
|
88
|
+
const { styles: _, classes: B, className: C } = D("MenuItem", {}, e, { isActive: o });
|
|
89
89
|
return (t, q) => (l(), i(x(v.value), N({
|
|
90
90
|
ref_key: "elRef",
|
|
91
91
|
ref: a
|
|
@@ -111,7 +111,7 @@ const V = {
|
|
|
111
111
|
onClick: b
|
|
112
112
|
}), {
|
|
113
113
|
default: R(() => [
|
|
114
|
-
t.$slots.prefix ? (l(), r("span",
|
|
114
|
+
t.$slots.prefix ? (l(), r("span", T, [
|
|
115
115
|
n(t.$slots, "prefix", {}, void 0, !0)
|
|
116
116
|
])) : e.value.icon ? (l(), i(g, {
|
|
117
117
|
key: 1,
|
|
@@ -119,16 +119,16 @@ const V = {
|
|
|
119
119
|
icon: e.value.icon,
|
|
120
120
|
class: "mr-2"
|
|
121
121
|
}, null, 8, ["size", "icon"])) : u("", !0),
|
|
122
|
-
t.minimal ? u("", !0) : (l(), r("span",
|
|
122
|
+
t.minimal ? u("", !0) : (l(), r("span", V, [
|
|
123
123
|
n(t.$slots, "default", {}, () => [
|
|
124
124
|
I(M(e.value.label), 1)
|
|
125
125
|
], !0)
|
|
126
126
|
])),
|
|
127
|
-
|
|
128
|
-
e.value.loading ? (l(), i(
|
|
127
|
+
O("span", E, [
|
|
128
|
+
e.value.loading ? (l(), i(F, {
|
|
129
129
|
key: 0,
|
|
130
130
|
size: e.value.size
|
|
131
|
-
}, null, 8, ["size"])) : (l(), r(
|
|
131
|
+
}, null, 8, ["size"])) : (l(), r(P, { key: 1 }, [
|
|
132
132
|
t.$slots.suffix ? (l(), r("span", A, [
|
|
133
133
|
n(t.$slots, "suffix", {}, void 0, !0)
|
|
134
134
|
])) : e.value.iconRight ? (l(), i(g, {
|
|
@@ -1,48 +1,48 @@
|
|
|
1
1
|
const l = {
|
|
2
2
|
classes: {
|
|
3
|
-
wrapper: ({ props:
|
|
4
|
-
const
|
|
5
|
-
return
|
|
3
|
+
wrapper: ({ props: s, data: r }) => {
|
|
4
|
+
const t = ["relative !flex items-center whitespace-nowrap px-3 min-h-[2rem]"];
|
|
5
|
+
return s.disabled || t.push("cursor-pointer"), r.isActive && t.push("font-medium"), s.rounded && t.push("rounded"), s.size === "xs" ? t.push("py-1 text-xs") : s.size === "sm" ? t.push("py-1.5 text-sm") : s.size === "lg" ? t.push("py-3") : s.size === "xl" ? t.push("py-4 text-lg") : t.push("py-1.5"), t;
|
|
6
6
|
}
|
|
7
7
|
},
|
|
8
|
-
styles: ({ colors:
|
|
9
|
-
const e =
|
|
10
|
-
return
|
|
11
|
-
text:
|
|
8
|
+
styles: ({ colors: s, props: r, css: t, data: a }) => {
|
|
9
|
+
const e = s.getPalette(r.color || "gray"), i = s.getPalette("secondary");
|
|
10
|
+
return r.disabled ? t.variables({
|
|
11
|
+
text: i[300],
|
|
12
12
|
dark: {
|
|
13
|
-
text:
|
|
13
|
+
text: i[600]
|
|
14
14
|
}
|
|
15
|
-
}) :
|
|
16
|
-
bg:
|
|
15
|
+
}) : r.filled ? a.isActive ? t.variables({
|
|
16
|
+
bg: r.selected ? e[100] : e[200],
|
|
17
17
|
text: e[800],
|
|
18
18
|
hover: {
|
|
19
|
-
bg: (
|
|
19
|
+
bg: (r.selected, e[200]),
|
|
20
20
|
text: e[800]
|
|
21
21
|
},
|
|
22
22
|
dark: {
|
|
23
|
-
bg: (
|
|
23
|
+
bg: (r.selected, e[700]),
|
|
24
24
|
text: e[100],
|
|
25
25
|
hover: {
|
|
26
|
-
bg: (
|
|
26
|
+
bg: (r.selected, e[700]),
|
|
27
27
|
text: e[100]
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
}) :
|
|
31
|
-
bg:
|
|
32
|
-
text:
|
|
30
|
+
}) : t.variables({
|
|
31
|
+
bg: r.selected ? e[100] : "transparent",
|
|
32
|
+
text: e[700],
|
|
33
33
|
hover: {
|
|
34
|
-
bg:
|
|
35
|
-
text:
|
|
34
|
+
bg: e[100],
|
|
35
|
+
text: e[900]
|
|
36
36
|
},
|
|
37
37
|
dark: {
|
|
38
|
-
bg:
|
|
39
|
-
text:
|
|
38
|
+
bg: r.selected ? e[800] : "transparent",
|
|
39
|
+
text: e[200],
|
|
40
40
|
hover: {
|
|
41
|
-
bg:
|
|
42
|
-
text:
|
|
41
|
+
bg: e[600],
|
|
42
|
+
text: e[100]
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
|
-
}) : a.isActive ?
|
|
45
|
+
}) : a.isActive ? t.variables({
|
|
46
46
|
text: e[500],
|
|
47
47
|
hover: {
|
|
48
48
|
text: e[500],
|
|
@@ -55,17 +55,17 @@ const l = {
|
|
|
55
55
|
border: e[500]
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
|
-
}) :
|
|
59
|
-
text:
|
|
58
|
+
}) : t.variables({
|
|
59
|
+
text: i[800],
|
|
60
60
|
hover: {
|
|
61
|
-
text:
|
|
62
|
-
border:
|
|
61
|
+
text: i[900],
|
|
62
|
+
border: i[300]
|
|
63
63
|
},
|
|
64
64
|
dark: {
|
|
65
|
-
text:
|
|
65
|
+
text: i[300],
|
|
66
66
|
hover: {
|
|
67
|
-
text:
|
|
68
|
-
border:
|
|
67
|
+
text: i[200],
|
|
68
|
+
border: i[800]
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
});
|
|
@@ -11,6 +11,17 @@ declare const selectProps: {
|
|
|
11
11
|
type: StringConstructor;
|
|
12
12
|
default: string;
|
|
13
13
|
};
|
|
14
|
+
virtualList: BooleanConstructor;
|
|
15
|
+
virtualListOffsetTop: NumberConstructor;
|
|
16
|
+
virtualListOffsetBottom: NumberConstructor;
|
|
17
|
+
virtualListItemHeight: {
|
|
18
|
+
type: NumberConstructor;
|
|
19
|
+
default: number;
|
|
20
|
+
};
|
|
21
|
+
virtualListOverscan: {
|
|
22
|
+
type: NumberConstructor;
|
|
23
|
+
default: number;
|
|
24
|
+
};
|
|
14
25
|
modelValue: {
|
|
15
26
|
readonly type: PropType<string | number | boolean | object | any[] | undefined>;
|
|
16
27
|
readonly default: undefined;
|
|
@@ -73,6 +84,17 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
|
|
|
73
84
|
type: StringConstructor;
|
|
74
85
|
default: string;
|
|
75
86
|
};
|
|
87
|
+
virtualList: BooleanConstructor;
|
|
88
|
+
virtualListOffsetTop: NumberConstructor;
|
|
89
|
+
virtualListOffsetBottom: NumberConstructor;
|
|
90
|
+
virtualListItemHeight: {
|
|
91
|
+
type: NumberConstructor;
|
|
92
|
+
default: number;
|
|
93
|
+
};
|
|
94
|
+
virtualListOverscan: {
|
|
95
|
+
type: NumberConstructor;
|
|
96
|
+
default: number;
|
|
97
|
+
};
|
|
76
98
|
modelValue: {
|
|
77
99
|
readonly type: PropType<string | number | boolean | object | any[] | undefined>;
|
|
78
100
|
readonly default: undefined;
|
|
@@ -128,6 +150,17 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
|
|
|
128
150
|
type: StringConstructor;
|
|
129
151
|
default: string;
|
|
130
152
|
};
|
|
153
|
+
virtualList: BooleanConstructor;
|
|
154
|
+
virtualListOffsetTop: NumberConstructor;
|
|
155
|
+
virtualListOffsetBottom: NumberConstructor;
|
|
156
|
+
virtualListItemHeight: {
|
|
157
|
+
type: NumberConstructor;
|
|
158
|
+
default: number;
|
|
159
|
+
};
|
|
160
|
+
virtualListOverscan: {
|
|
161
|
+
type: NumberConstructor;
|
|
162
|
+
default: number;
|
|
163
|
+
};
|
|
131
164
|
modelValue: {
|
|
132
165
|
readonly type: PropType<string | number | boolean | object | any[] | undefined>;
|
|
133
166
|
readonly default: undefined;
|
|
@@ -186,6 +219,9 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
|
|
|
186
219
|
native: boolean;
|
|
187
220
|
filterable: boolean;
|
|
188
221
|
filterPlaceholder: string;
|
|
222
|
+
virtualList: boolean;
|
|
223
|
+
virtualListItemHeight: number;
|
|
224
|
+
virtualListOverscan: number;
|
|
189
225
|
}, {}>, {
|
|
190
226
|
"content-header"?(_: {}): any;
|
|
191
227
|
"content-footer"?(_: {}): any;
|