@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.
Files changed (44) hide show
  1. package/docs/pages/component/menu/usage.vue +1 -0
  2. package/docs/pages/component/select/usage.vue +17 -5
  3. package/docs/pages/component/table/index.vue +7 -0
  4. package/docs/pages/component/table/virtual.vue +53 -0
  5. package/lib/components/menu/MenuItem.vue.d.ts +3 -3
  6. package/lib/components/menu/MenuItem.vue.js +1 -1
  7. package/lib/components/menu/MenuItem.vue2.js +16 -16
  8. package/lib/components/menu/theme/MenuItem.base.theme.js +30 -30
  9. package/lib/components/select/Select.vue.d.ts +36 -0
  10. package/lib/components/select/Select.vue.js +224 -201
  11. package/lib/components/select/theme/Select.base.theme.js +1 -1
  12. package/lib/components/table/Table.vue.d.ts +91 -4
  13. package/lib/components/table/Table.vue.js +214 -180
  14. package/lib/components/table/TableHead.vue.d.ts +10 -2
  15. package/lib/components/table/TableHead.vue.js +16 -13
  16. package/lib/components/table/TableHeader.vue.d.ts +0 -4
  17. package/lib/components/table/TableHeader.vue.js +9 -10
  18. package/lib/components/table/theme/TableHead.base.theme.js +7 -4
  19. package/lib/components/table/theme/TableHead.carbon.theme.js +7 -4
  20. package/lib/components/table/theme/TableHeader.base.theme.js +3 -3
  21. package/lib/components/table/theme/TableHeader.carbon.theme.js +1 -1
  22. package/lib/composables/index.d.ts +1 -0
  23. package/lib/composables/useVirtualList.d.ts +48 -0
  24. package/lib/composables/useVirtualList.js +123 -0
  25. package/lib/index.js +35 -33
  26. package/lib/index.umd.js +4 -4
  27. 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
  28. package/lib/version.d.ts +1 -1
  29. package/lib/version.js +1 -1
  30. package/package.json +1 -1
  31. package/src/components/menu/MenuItem.vue +1 -1
  32. package/src/components/menu/theme/MenuItem.base.theme.ts +8 -8
  33. package/src/components/select/Select.vue +56 -26
  34. package/src/components/select/theme/Select.base.theme.ts +1 -1
  35. package/src/components/table/Table.vue +152 -113
  36. package/src/components/table/TableHead.vue +6 -2
  37. package/src/components/table/TableHeader.vue +0 -1
  38. package/src/components/table/theme/TableHead.base.theme.ts +7 -1
  39. package/src/components/table/theme/TableHead.carbon.theme.ts +7 -1
  40. package/src/components/table/theme/TableHeader.base.theme.ts +0 -2
  41. package/src/components/table/theme/TableHeader.carbon.theme.ts +0 -2
  42. package/src/composables/index.ts +1 -0
  43. package/src/composables/useVirtualList.ts +286 -0
  44. package/src/version.ts +1 -1
@@ -14,6 +14,7 @@ const menu1 = [{
14
14
  divider: true,
15
15
  }, {
16
16
  label: 'Sign out',
17
+ color: 'error',
17
18
  active: false,
18
19
  value: 'c',
19
20
  }]
@@ -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
- for (let i = 0; i < 20; i++) {
12
- options.value.push({ value: i.toString(), label: 'Option ' + i })
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="selected"
29
- label="Dropdown select"
38
+ v-model="selected2"
39
+ label="Filterable - virtual list"
30
40
  placeholder="Placeholder"
31
41
  filterable
32
- :options="options"
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-9061982e"]]);
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 P, Fragment as w } from "vue";
2
- import { useMutationObserver as D } 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 F } from "../../composables/useColors.js";
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 O } from "../../composables/useTheme.js";
5
+ import { useTheme as D } from "../../composables/useTheme.js";
6
6
  import g from "../icon/Icon.vue.js";
7
- import T from "../spinner/Spinner.vue.js";
8
- const V = {
7
+ import F from "../spinner/Spinner.vue.js";
8
+ const T = {
9
9
  key: 0,
10
10
  class: "mr-2 shrink-0"
11
- }, j = {
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
- ...F.props("primary"),
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" && D(a.value.$el, f, {
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 } = O("MenuItem", {}, e, { isActive: o });
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", V, [
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", j, [
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
- P("span", E, [
128
- e.value.loading ? (l(), i(T, {
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(w, { key: 1 }, [
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: i, data: s }) => {
4
- const r = ["relative !flex items-center whitespace-nowrap px-3 min-h-[2rem]"];
5
- return i.disabled || r.push("cursor-pointer"), s.isActive && r.push("font-medium"), i.rounded && r.push("rounded"), i.size === "xs" ? r.push("py-1 text-xs") : i.size === "sm" ? r.push("py-1.5 text-sm") : i.size === "lg" ? r.push("py-3") : i.size === "xl" ? r.push("py-4 text-lg") : r.push("py-1.5"), r;
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: i, props: s, css: r, data: a }) => {
9
- const e = i.getPalette(s.color || "gray"), t = i.getPalette("secondary");
10
- return s.disabled ? r.variables({
11
- text: t[300],
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: t[600]
13
+ text: i[600]
14
14
  }
15
- }) : s.filled ? a.isActive ? r.variables({
16
- bg: s.selected ? e[100] : e[200],
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: (s.selected, e[200]),
19
+ bg: (r.selected, e[200]),
20
20
  text: e[800]
21
21
  },
22
22
  dark: {
23
- bg: (s.selected, e[700]),
23
+ bg: (r.selected, e[700]),
24
24
  text: e[100],
25
25
  hover: {
26
- bg: (s.selected, e[700]),
26
+ bg: (r.selected, e[700]),
27
27
  text: e[100]
28
28
  }
29
29
  }
30
- }) : r.variables({
31
- bg: s.selected ? t[100] : "transparent",
32
- text: t[800],
30
+ }) : t.variables({
31
+ bg: r.selected ? e[100] : "transparent",
32
+ text: e[700],
33
33
  hover: {
34
- bg: t[100],
35
- text: t[900]
34
+ bg: e[100],
35
+ text: e[900]
36
36
  },
37
37
  dark: {
38
- bg: s.selected ? t[800] : "transparent",
39
- text: t[200],
38
+ bg: r.selected ? e[800] : "transparent",
39
+ text: e[200],
40
40
  hover: {
41
- bg: t[600],
42
- text: t[100]
41
+ bg: e[600],
42
+ text: e[100]
43
43
  }
44
44
  }
45
- }) : a.isActive ? r.variables({
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
- }) : r.variables({
59
- text: t[800],
58
+ }) : t.variables({
59
+ text: i[800],
60
60
  hover: {
61
- text: t[900],
62
- border: t[300]
61
+ text: i[900],
62
+ border: i[300]
63
63
  },
64
64
  dark: {
65
- text: t[300],
65
+ text: i[300],
66
66
  hover: {
67
- text: t[200],
68
- border: t[800]
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;