vlite3 0.9.1 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,18 @@
1
+ import { ChatMessage } from './ChatInterface.vue';
2
+ type __VLS_Props = {
3
+ message: ChatMessage;
4
+ isSender: boolean;
5
+ showAvatar: boolean;
6
+ showUserInfo: boolean;
7
+ showTimestamp: boolean;
8
+ allowDeleteAll?: boolean;
9
+ allowEditAll?: boolean;
10
+ };
11
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
12
+ delete: (id: string | number) => any;
13
+ edit: (message: ChatMessage) => any;
14
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
15
+ onDelete?: (id: string | number) => any;
16
+ onEdit?: (message: ChatMessage) => any;
17
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
18
+ export default _default;
@@ -0,0 +1,45 @@
1
+ export interface ChatMessage {
2
+ id: string | number;
3
+ text: string;
4
+ senderId: string | number;
5
+ senderName?: string;
6
+ avatar?: string;
7
+ timestamp?: string | Date;
8
+ isEdited?: boolean;
9
+ [key: string]: any;
10
+ }
11
+ type __VLS_Props = {
12
+ data: ChatMessage[];
13
+ currentUserId: string | number;
14
+ showAvatar?: boolean;
15
+ showUserInfo?: boolean;
16
+ showTimestamp?: boolean;
17
+ placeholder?: string;
18
+ isLoadingMore?: boolean;
19
+ allowDeleteAll?: boolean;
20
+ allowEditAll?: boolean;
21
+ };
22
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
23
+ delete: (id: string | number) => any;
24
+ add: (text: string) => any;
25
+ refetch: () => any;
26
+ edit: (message: ChatMessage) => any;
27
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
28
+ onDelete?: (id: string | number) => any;
29
+ onAdd?: (text: string) => any;
30
+ onRefetch?: () => any;
31
+ onEdit?: (message: ChatMessage) => any;
32
+ }>, {
33
+ placeholder: string;
34
+ isLoadingMore: boolean;
35
+ showAvatar: boolean;
36
+ showUserInfo: boolean;
37
+ showTimestamp: boolean;
38
+ allowDeleteAll: boolean;
39
+ allowEditAll: boolean;
40
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
41
+ messageListRef: HTMLDivElement;
42
+ observerTargetRef: HTMLDivElement;
43
+ textareaRef: HTMLTextAreaElement;
44
+ }, HTMLDivElement>;
45
+ export default _default;
@@ -0,0 +1,2 @@
1
+ export { default as ChatInterface } from './ChatInterface.vue';
2
+ export type { ChatMessage } from './ChatInterface.vue';
@@ -4,7 +4,7 @@ import k from "../Icon.vue.js";
4
4
  import { $t as E } from "../../utils/i18n.js";
5
5
  import { useCommandPaletteItems as Y } from "./useCommandPaletteItems.js";
6
6
  import { useCommandPaletteNav as Z } from "./useCommandPaletteNav.js";
7
- import ee from "./CommandPaletteItem.vue2.js";
7
+ import ee from "./CommandPaletteItem.vue.js";
8
8
  const te = { class: "command-palette-content flex flex-col w-full h-full max-h-[70vh]" }, oe = { class: "flex items-center gap-3 px-4 py-3 border-b border-border/60 shrink-0" }, se = ["placeholder"], ne = ["aria-label"], re = {
9
9
  key: 0,
10
10
  class: "flex flex-col items-center justify-center py-14 px-6 text-center select-none",
@@ -1,5 +1,5 @@
1
1
  import t from "./CommandPaletteItem.vue3.js";
2
- /* empty css */
2
+ /* empty css */
3
3
  import o from "../../_virtual/_plugin-vue_export-helper.js";
4
4
  const r = /* @__PURE__ */ o(t, [["__scopeId", "data-v-66b1ae06"]]);
5
5
  export {
@@ -3,8 +3,9 @@ export interface FilePickerValue {
3
3
  fileName: string;
4
4
  fileType: string;
5
5
  fileSize: number;
6
- file: File;
6
+ file: File | null;
7
7
  base64: string;
8
+ isUrl?: boolean;
8
9
  }
9
10
  interface Props {
10
11
  modelValue?: FilePickerValue | FilePickerValue[] | null;
@@ -21,6 +22,7 @@ interface Props {
21
22
  textI18n?: string;
22
23
  size?: InputSize;
23
24
  rounded?: InputRounded;
25
+ allowRename?: boolean;
24
26
  }
25
27
  declare function __VLS_template(): {
26
28
  attrs: Partial<{}>;
@@ -56,6 +58,7 @@ declare const __VLS_component: import('vue').DefineComponent<Props, {}, {}, {},
56
58
  modelValue: FilePickerValue | FilePickerValue[] | null;
57
59
  fileTypes: string[];
58
60
  returnFormat: "file" | "base64";
61
+ allowRename: boolean;
59
62
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {
60
63
  fileInput: HTMLInputElement;
61
64
  }, HTMLDivElement>;
@@ -1,20 +1,26 @@
1
- import { defineComponent as Y, computed as f, ref as S, useSlots as Z, openBlock as r, createElementBlock as c, createElementVNode as n, renderSlot as _, normalizeClass as C, createBlock as x, withModifiers as M, createVNode as w, toDisplayString as b, createTextVNode as ee, createCommentVNode as F, Fragment as le, renderList as te } from "vue";
1
+ import { defineComponent as Z, computed as m, ref as C, useSlots as _, openBlock as a, createElementBlock as u, createElementVNode as s, renderSlot as ee, normalizeClass as T, createBlock as b, withModifiers as F, createVNode as k, toDisplayString as h, createTextVNode as le, createCommentVNode as S, Fragment as te, renderList as ie } from "vue";
2
2
  import p from "../Icon.vue.js";
3
- import P from "../Button.vue.js";
4
- import { $t as k } from "../../utils/i18n.js";
5
- const ie = { class: "w-full" }, oe = ["multiple", "accept"], ae = ["value", "placeholder", "disabled"], re = { class: "absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center gap-2 bg-background" }, se = { class: "p-3 bg-muted rounded-full text-muted-foreground" }, ne = { class: "space-y-1" }, de = { class: "text-sm font-medium text-foreground" }, ue = { class: "text-primary hover:underline" }, ce = {
3
+ import N from "../Button.vue.js";
4
+ import { $t as w } from "../../utils/i18n.js";
5
+ const oe = { class: "w-full" }, re = ["multiple", "accept"], ae = ["value", "placeholder", "disabled"], se = { class: "absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center gap-2 bg-background" }, ne = { class: "p-3 bg-muted rounded-full text-muted-foreground" }, de = { class: "space-y-1" }, ue = { class: "text-sm font-medium text-foreground" }, ce = { class: "text-primary hover:underline" }, fe = {
6
6
  key: 0,
7
7
  class: "text-xs text-muted-foreground"
8
- }, fe = {
8
+ }, me = {
9
9
  key: 1,
10
10
  class: "space-y-2"
11
- }, me = { class: "shrink-0 mr-3" }, ge = { class: "p-2 bg-primary-light rounded text-primary-fg-light" }, pe = { class: "flex-1 min-w-0" }, he = { class: "text-sm font-medium text-foreground truncate" }, ve = { class: "text-xs text-muted-foreground" }, ye = { class: "flex-shrink-0 ml-3 flex gap-2" }, xe = {
11
+ }, ge = { class: "shrink-0 mr-3" }, pe = { class: "p-2 bg-primary-light rounded text-primary-fg-light" }, he = { class: "flex-1 min-w-0 flex flex-col items-start overflow-hidden" }, ve = {
12
+ key: 0,
13
+ class: "inline-flex items-center group/rename w-fit max-w-full mb-0.5"
14
+ }, ye = { class: "grid relative w-fit max-w-full items-center -ml-1" }, xe = { class: "invisible whitespace-pre col-start-1 row-start-1 text-sm font-medium px-1 py-0.5 max-w-full overflow-hidden text-ellipsis" }, be = ["value", "onInput"], ke = {
15
+ key: 1,
16
+ class: "text-sm font-medium text-foreground truncate w-full"
17
+ }, we = { class: "text-xs text-muted-foreground" }, Ve = { class: "flex-shrink-0 ml-3 flex gap-2" }, Fe = {
12
18
  key: 0,
13
19
  class: "flex gap-2"
14
- }, be = {
20
+ }, Se = {
15
21
  key: 2,
16
22
  class: "absolute inset-0 bg-white/80 flex items-center justify-center rounded-lg z-10"
17
- }, ke = { class: "bg-white p-2 rounded-full" }, Se = /* @__PURE__ */ Y({
23
+ }, Ae = { class: "bg-white p-2 rounded-full" }, Be = /* @__PURE__ */ Z({
18
24
  name: "FilePicker",
19
25
  __name: "FilePicker",
20
26
  props: {
@@ -31,31 +37,32 @@ const ie = { class: "w-full" }, oe = ["multiple", "accept"], ae = ["value", "pla
31
37
  placeholderI18n: {},
32
38
  textI18n: {},
33
39
  size: { default: "md" },
34
- rounded: { default: "md" }
40
+ rounded: { default: "md" },
41
+ allowRename: { type: Boolean, default: !1 }
35
42
  },
36
43
  emits: ["update:modelValue", "change", "error"],
37
- setup(i, { emit: $ }) {
38
- const e = i, d = $, I = f(
39
- () => e.placeholderI18n ? k(e.placeholderI18n) : e.placeholder !== void 0 ? e.placeholder : "Select file..."
40
- ), N = f(() => {
41
- if (e.textI18n) return k(e.textI18n);
42
- const l = k("vlite.filePicker.clickToUpload");
44
+ setup(o, { emit: M }) {
45
+ const e = o, d = M, P = m(
46
+ () => e.placeholderI18n ? w(e.placeholderI18n) : e.placeholder !== void 0 ? e.placeholder : "Select file..."
47
+ ), $ = m(() => {
48
+ if (e.textI18n) return w(e.textI18n);
49
+ const l = w("vlite.filePicker.clickToUpload");
43
50
  return l !== "vlite.filePicker.clickToUpload" ? l : "Click to upload";
44
- }), j = f(() => {
45
- const l = k("vlite.filePicker.dragAndDrop");
51
+ }), j = m(() => {
52
+ const l = w("vlite.filePicker.dragAndDrop");
46
53
  return l !== "vlite.filePicker.dragAndDrop" ? l : "or drag and drop";
47
- }), L = f(() => {
48
- const l = k("vlite.filePicker.addMore");
54
+ }), U = m(() => {
55
+ const l = w("vlite.filePicker.addMore");
49
56
  return l !== "vlite.filePicker.addMore" ? l : "Add more";
50
- }), z = S(null), h = S(!1), u = S(!1);
51
- Z();
52
- const U = f(() => e.fileTypes.join(",")), A = f(() => Array.isArray(e.modelValue) ? e.modelValue.length > 0 : e.modelValue !== null), V = f(() => {
57
+ }), z = C(null), v = C(!1), c = C(!1);
58
+ _();
59
+ const E = m(() => e.fileTypes.join(",")), A = m(() => Array.isArray(e.modelValue) ? e.modelValue.length > 0 : e.modelValue !== null), V = m(() => {
53
60
  let l = [];
54
61
  return Array.isArray(e.modelValue) ? l = e.modelValue : e.modelValue && (l = [e.modelValue]), l.map((t) => {
55
62
  if (typeof t == "string") {
56
- const a = t.split("/").pop() || "Unknown File";
63
+ const i = t.split("/").pop() || "Unknown File";
57
64
  return {
58
- fileName: decodeURIComponent(a),
65
+ fileName: decodeURIComponent(i),
59
66
  fileType: "unknown",
60
67
  fileSize: 0,
61
68
  file: null,
@@ -65,86 +72,86 @@ const ie = { class: "w-full" }, oe = ["multiple", "accept"], ae = ["value", "pla
65
72
  }
66
73
  return t;
67
74
  });
68
- }), v = () => {
69
- if (!(e.disabled || e.loading || u.value)) {
75
+ }), y = () => {
76
+ if (!(e.disabled || e.loading || c.value)) {
70
77
  if (e.multiSelect && e.maxFiles && (Array.isArray(e.modelValue) ? e.modelValue.length : e.modelValue ? 1 : 0) >= e.maxFiles) {
71
78
  d("error", `Maximum ${e.maxFiles} files allowed`);
72
79
  return;
73
80
  }
74
81
  z.value?.click();
75
82
  }
76
- }, E = (l) => {
77
- l.preventDefault(), !(e.disabled || e.loading) && (h.value = !0);
78
- }, W = (l) => {
79
- l.preventDefault(), h.value = !1;
83
+ }, L = (l) => {
84
+ l.preventDefault(), !(e.disabled || e.loading) && (v.value = !0);
80
85
  }, R = (l) => {
81
- l.preventDefault(), h.value = !1, !(e.disabled || e.loading || u.value) && l.dataTransfer?.files && D(l.dataTransfer.files);
86
+ l.preventDefault(), v.value = !1;
87
+ }, W = (l) => {
88
+ l.preventDefault(), v.value = !1, !(e.disabled || e.loading || c.value) && l.dataTransfer?.files && D(l.dataTransfer.files);
82
89
  }, O = (l) => {
83
90
  const t = l.target;
84
91
  t.files && D(t.files), t.value = "";
85
- }, G = (l) => {
92
+ }, q = (l) => {
86
93
  if (l === 0 || !l) return "";
87
- const t = 1024, a = ["Bytes", "KB", "MB", "GB", "TB"], s = Math.floor(Math.log(l) / Math.log(t));
88
- return parseFloat((l / Math.pow(t, s)).toFixed(2)) + " " + a[s];
89
- }, K = (l) => new Promise((t, a) => {
90
- const s = new FileReader();
91
- s.readAsDataURL(l), s.onload = () => {
92
- typeof s.result == "string" ? t(s.result) : a(new Error("Failed to read file as base64"));
93
- }, s.onerror = (m) => a(m);
94
+ const t = 1024, i = ["Bytes", "KB", "MB", "GB", "TB"], n = Math.floor(Math.log(l) / Math.log(t));
95
+ return parseFloat((l / Math.pow(t, n)).toFixed(2)) + " " + i[n];
96
+ }, G = (l) => new Promise((t, i) => {
97
+ const n = new FileReader();
98
+ n.readAsDataURL(l), n.onload = () => {
99
+ typeof n.result == "string" ? t(n.result) : i(new Error("Failed to read file as base64"));
100
+ }, n.onerror = (f) => i(f);
94
101
  }), D = async (l) => {
95
102
  if (l.length === 0) return;
96
- u.value = !0;
97
- const t = [], a = [], s = Array.from(l);
98
- let m = e.multiSelect ? s : [s[0]];
103
+ c.value = !0;
104
+ const t = [], i = [], n = Array.from(l);
105
+ let f = e.multiSelect ? n : [n[0]];
99
106
  if (e.multiSelect && e.maxFiles) {
100
- const o = Array.isArray(e.modelValue) ? e.modelValue.length : e.modelValue ? 1 : 0, g = e.maxFiles - o;
107
+ const r = Array.isArray(e.modelValue) ? e.modelValue.length : e.modelValue ? 1 : 0, g = e.maxFiles - r;
101
108
  if (g <= 0) {
102
- d("error", `Maximum ${e.maxFiles} files allowed`), u.value = !1;
109
+ d("error", `Maximum ${e.maxFiles} files allowed`), c.value = !1;
103
110
  return;
104
111
  }
105
- m.length > g && (a.push(`Only ${g} more file(s) allowed. Maximum ${e.maxFiles} files.`), m = m.slice(0, g));
112
+ f.length > g && (i.push(`Only ${g} more file(s) allowed. Maximum ${e.maxFiles} files.`), f = f.slice(0, g));
106
113
  }
107
114
  try {
108
- for (const o of m) {
109
- if (e.fileTypes.length > 0 && !e.fileTypes.some((y) => {
110
- if (y.startsWith("."))
111
- return o.name.toLowerCase().endsWith(y.toLowerCase());
112
- if (y.endsWith("/*")) {
113
- const X = y.split("/")[0];
114
- return o.type.startsWith(X);
115
+ for (const r of f) {
116
+ if (e.fileTypes.length > 0 && !e.fileTypes.some((x) => {
117
+ if (x.startsWith("."))
118
+ return r.name.toLowerCase().endsWith(x.toLowerCase());
119
+ if (x.endsWith("/*")) {
120
+ const Y = x.split("/")[0];
121
+ return r.type.startsWith(Y);
115
122
  }
116
- return o.type === y;
123
+ return r.type === x;
117
124
  })) {
118
- a.push(`File type not allowed: ${o.name}`);
125
+ i.push(`File type not allowed: ${r.name}`);
119
126
  continue;
120
127
  }
121
128
  let g = !1;
122
- e.maxSize && o.size > e.maxSize && (a.push(`File too large: ${o.name}`), g = !0);
123
- let T = "";
129
+ e.maxSize && r.size > e.maxSize && (i.push(`File too large: ${r.name}`), g = !0);
130
+ let B = "";
124
131
  if (e.returnFormat === "base64" && !g)
125
132
  try {
126
- T = await K(o);
127
- } catch (B) {
128
- console.error("Base64 read failed", B);
133
+ B = await G(r);
134
+ } catch (I) {
135
+ console.error("Base64 read failed", I);
129
136
  }
130
137
  t.push({
131
- fileName: o.name,
132
- fileType: o.type,
133
- fileSize: o.size,
134
- file: o,
135
- base64: T
138
+ fileName: r.name,
139
+ fileType: r.type,
140
+ fileSize: r.size,
141
+ file: r,
142
+ base64: B
136
143
  });
137
144
  }
138
- if (a.length > 0 && d("error", a.join("; ")), t.length > 0) {
139
- let o;
140
- e.multiSelect ? o = [...Array.isArray(e.modelValue) ? e.modelValue : e.modelValue ? [e.modelValue] : [], ...t] : o = t[0], d("update:modelValue", o), d("change", o);
145
+ if (i.length > 0 && d("error", i.join("; ")), t.length > 0) {
146
+ let r;
147
+ e.multiSelect ? r = [...Array.isArray(e.modelValue) ? e.modelValue : e.modelValue ? [e.modelValue] : [], ...t] : r = t[0], d("update:modelValue", r), d("change", r);
141
148
  }
142
- } catch (o) {
143
- console.error("Error processing files:", o), d("error", "Failed to process files");
149
+ } catch (r) {
150
+ console.error("Error processing files:", r), d("error", "Failed to process files");
144
151
  } finally {
145
- u.value = !1;
152
+ c.value = !1;
146
153
  }
147
- }, q = (l) => {
154
+ }, K = (l) => {
148
155
  if (!(e.disabled || e.loading))
149
156
  if (e.multiSelect && Array.isArray(e.modelValue)) {
150
157
  const t = [...e.modelValue];
@@ -153,12 +160,30 @@ const ie = { class: "w-full" }, oe = ["multiple", "accept"], ae = ["value", "pla
153
160
  d("update:modelValue", null), d("change", null);
154
161
  }, H = () => {
155
162
  e.disabled || e.loading || (d("update:modelValue", null), d("change", null));
156
- }, J = f(() => A.value ? V.value.map((t) => t.fileName).join(", ") : ""), Q = f(() => {
163
+ }, J = (l, t) => {
164
+ if (e.disabled || e.loading) return;
165
+ let i;
166
+ e.multiSelect && Array.isArray(e.modelValue) ? (i = [...e.modelValue], typeof i[l] == "object" && i[l] !== null ? i[l] = { ...i[l], fileName: t } : typeof i[l] == "string" && (i[l] = {
167
+ fileName: t,
168
+ fileType: "unknown",
169
+ fileSize: 0,
170
+ file: null,
171
+ base64: i[l],
172
+ isUrl: !0
173
+ })) : e.modelValue && typeof e.modelValue == "object" && !Array.isArray(e.modelValue) ? i = { ...e.modelValue, fileName: t } : typeof e.modelValue == "string" && (i = {
174
+ fileName: t,
175
+ fileType: "unknown",
176
+ fileSize: 0,
177
+ file: null,
178
+ base64: e.modelValue,
179
+ isUrl: !0
180
+ }), i !== void 0 && (d("update:modelValue", i), d("change", i));
181
+ }, Q = m(() => A.value ? V.value.map((t) => t.fileName).join(", ") : ""), X = m(() => {
157
182
  const l = "block w-full bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50 transition-all focus-visible:outline-none cursor-pointer", t = {
158
183
  sm: "h-8 text-xs",
159
184
  md: "h-10 text-sm",
160
185
  lg: "h-12 text-base"
161
- }, a = {
186
+ }, i = {
162
187
  none: "rounded-none",
163
188
  sm: "rounded-sm",
164
189
  md: "rounded-md",
@@ -172,149 +197,174 @@ const ie = { class: "w-full" }, oe = ["multiple", "accept"], ae = ["value", "pla
172
197
  "border border-input focus-visible:border-primary",
173
198
  // Default outline style
174
199
  t[e.size],
175
- a[e.rounded],
200
+ i[e.rounded],
176
201
  "pr-10",
177
202
  // Space for icon
178
203
  e.disabled ? "cursor-not-allowed opacity-50" : ""
179
204
  ].join(" ");
180
205
  });
181
- return (l, t) => (r(), c("div", ie, [
182
- n("input", {
206
+ return (l, t) => (a(), u("div", oe, [
207
+ s("input", {
183
208
  ref_key: "fileInput",
184
209
  ref: z,
185
210
  type: "file",
186
- multiple: i.multiSelect,
187
- accept: U.value,
211
+ multiple: o.multiSelect,
212
+ accept: E.value,
188
213
  class: "hidden",
189
214
  onChange: O
190
- }, null, 40, oe),
191
- _(l.$slots, "trigger", {
192
- trigger: v,
193
- isDragging: h.value,
194
- isLoading: i.loading || u.value,
215
+ }, null, 40, re),
216
+ ee(l.$slots, "trigger", {
217
+ trigger: y,
218
+ isDragging: v.value,
219
+ isLoading: o.loading || c.value,
195
220
  files: V.value
196
221
  }, () => [
197
- i.variant === "input" ? (r(), c("div", {
222
+ o.variant === "input" ? (a(), u("div", {
198
223
  key: 0,
199
224
  class: "relative",
200
- onClick: v
225
+ onClick: y
201
226
  }, [
202
- n("input", {
227
+ s("input", {
203
228
  type: "text",
204
- value: J.value,
205
- placeholder: I.value,
229
+ value: Q.value,
230
+ placeholder: P.value,
206
231
  readonly: "",
207
- class: C(Q.value),
208
- disabled: i.disabled || i.loading || u.value
232
+ class: T(X.value),
233
+ disabled: o.disabled || o.loading || c.value
209
234
  }, null, 10, ae),
210
- n("div", re, [
211
- i.loading || u.value ? (r(), x(p, {
235
+ s("div", se, [
236
+ o.loading || c.value ? (a(), b(p, {
212
237
  key: 0,
213
238
  icon: "lucide:loader-2",
214
239
  class: "h-4 w-4 animate-spin text-muted-foreground"
215
- })) : A.value && !i.disabled ? (r(), c("button", {
240
+ })) : A.value && !o.disabled ? (a(), u("button", {
216
241
  key: 1,
217
242
  type: "button",
218
243
  class: "text-muted-foreground hover:text-foreground focus:outline-none",
219
- onClick: M(H, ["stop"])
244
+ onClick: F(H, ["stop"])
220
245
  }, [
221
- w(p, {
246
+ k(p, {
222
247
  icon: "lucide:x-circle",
223
248
  class: "h-4 w-4"
224
249
  })
225
- ])) : (r(), x(p, {
250
+ ])) : (a(), b(p, {
226
251
  key: 2,
227
252
  icon: "lucide:upload",
228
253
  class: "h-4 w-4 text-muted-foreground"
229
254
  }))
230
255
  ])
231
- ])) : (r(), c("div", {
256
+ ])) : (a(), u("div", {
232
257
  key: 1,
233
258
  class: "relative",
234
- onDragover: E,
235
- onDragleave: W,
236
- onDrop: R
259
+ onDragover: L,
260
+ onDragleave: R,
261
+ onDrop: W
237
262
  }, [
238
- A.value ? (r(), c("div", fe, [
239
- (r(!0), c(le, null, te(V.value, (a, s) => (r(), c("div", {
240
- key: s,
241
- class: C(["relative flex items-center p-3 border border-border rounded-lg bg-body transition-colors group", [!i.multiSelect && !i.disabled ? "cursor-pointer hover:border-primary/50" : ""]]),
242
- onClick: t[0] || (t[0] = (m) => !i.multiSelect && !i.disabled ? v() : null)
263
+ A.value ? (a(), u("div", me, [
264
+ (a(!0), u(te, null, ie(V.value, (i, n) => (a(), u("div", {
265
+ key: n,
266
+ class: T(["relative flex items-center p-3 border border-border rounded-lg bg-body transition-colors group", [!o.multiSelect && !o.disabled ? "cursor-pointer hover:border-primary/50" : ""]]),
267
+ onClick: t[2] || (t[2] = (f) => !o.multiSelect && !o.disabled ? y() : null)
243
268
  }, [
244
- n("div", me, [
245
- n("div", ge, [
246
- w(p, {
269
+ s("div", ge, [
270
+ s("div", pe, [
271
+ k(p, {
247
272
  icon: "lucide:file-text",
248
273
  class: "w-5 h-5"
249
274
  })
250
275
  ])
251
276
  ]),
252
- n("div", pe, [
253
- n("p", he, b(a.fileName), 1),
254
- n("p", ve, b(G(a.fileSize)), 1)
277
+ s("div", he, [
278
+ o.allowRename && !o.disabled ? (a(), u("div", ve, [
279
+ s("div", ye, [
280
+ s("span", xe, h(i.fileName || "Enter file name"), 1),
281
+ s("input", {
282
+ value: i.fileName,
283
+ onClick: t[0] || (t[0] = F(() => {
284
+ }, ["stop"])),
285
+ onInput: (f) => J(n, f.target.value),
286
+ class: "col-start-1 row-start-1 w-auto min-w-[2ch] text-sm font-medium text-foreground bg-transparent border-b border-transparent hover:border-border focus:border-primary outline-none transition-colors py-0.5 px-1",
287
+ placeholder: "Enter file name"
288
+ }, null, 40, be)
289
+ ]),
290
+ s("div", {
291
+ class: "flex-shrink-0 ml-1 text-muted-foreground/50 group-hover/rename:text-foreground transition-colors cursor-text",
292
+ onClick: t[1] || (t[1] = F(
293
+ (f) => f.currentTarget.previousElementSibling?.querySelector("input")?.focus(),
294
+ ["stop"]
295
+ )),
296
+ title: "Rename file"
297
+ }, [
298
+ k(p, {
299
+ icon: "lucide:pencil",
300
+ class: "w-3.5 h-3.5"
301
+ })
302
+ ])
303
+ ])) : (a(), u("p", ke, h(i.fileName), 1)),
304
+ s("p", we, h(q(i.fileSize)), 1)
255
305
  ]),
256
- n("div", ye, [
257
- !i.disabled && !i.loading ? (r(), x(P, {
306
+ s("div", Ve, [
307
+ !o.disabled && !o.loading ? (a(), b(N, {
258
308
  key: 0,
259
309
  size: "xs",
260
310
  variant: "ghost",
261
311
  icon: "lucide:x",
262
312
  rounded: "full",
263
313
  class: "text-muted-foreground hover:text-destructive hover:bg-destructive/10",
264
- onClick: M((m) => q(s), ["stop"])
265
- }, null, 8, ["onClick"])) : F("", !0)
314
+ onClick: F((f) => K(n), ["stop"])
315
+ }, null, 8, ["onClick"])) : S("", !0)
266
316
  ])
267
317
  ], 2))), 128)),
268
- i.multiSelect && (!i.maxFiles || V.value.length < i.maxFiles) ? (r(), c("div", xe, [
269
- w(P, {
318
+ o.multiSelect && (!o.maxFiles || V.value.length < o.maxFiles) ? (a(), u("div", Fe, [
319
+ k(N, {
270
320
  size: "sm",
271
321
  variant: "outline",
272
322
  icon: "lucide:plus",
273
- text: L.value,
274
- disabled: i.disabled || i.loading || u.value,
275
- onClick: v
323
+ text: U.value,
324
+ disabled: o.disabled || o.loading || c.value,
325
+ onClick: y
276
326
  }, null, 8, ["text", "disabled"])
277
- ])) : F("", !0)
278
- ])) : (r(), c("div", {
327
+ ])) : S("", !0)
328
+ ])) : (a(), u("div", {
279
329
  key: 0,
280
- class: C(["border-2 bg-body border-dashed border-border rounded-lg p-6 transition-all duration-200 ease-in-out cursor-pointer flex flex-col items-center justify-center text-center gap-2", [
281
- h.value ? "border-primary bg-primary/5" : "hover:border-primary/50 ",
282
- i.disabled || i.loading || u.value ? "opacity-50 cursor-not-allowed" : ""
330
+ class: T(["border-2 bg-body border-dashed border-border rounded-lg p-6 transition-all duration-200 ease-in-out cursor-pointer flex flex-col items-center justify-center text-center gap-2", [
331
+ v.value ? "border-primary bg-primary/5" : "hover:border-primary/50 ",
332
+ o.disabled || o.loading || c.value ? "opacity-50 cursor-not-allowed" : ""
283
333
  ]]),
284
- onClick: v
334
+ onClick: y
285
335
  }, [
286
- n("div", se, [
287
- i.loading || u.value ? (r(), x(p, {
336
+ s("div", ne, [
337
+ o.loading || c.value ? (a(), b(p, {
288
338
  key: 0,
289
339
  icon: "lucide:loader-2",
290
340
  class: "w-6 h-6 animate-spin"
291
- })) : (r(), x(p, {
341
+ })) : (a(), b(p, {
292
342
  key: 1,
293
343
  icon: "lucide:upload-cloud",
294
344
  class: "w-6 h-6"
295
345
  }))
296
346
  ]),
297
- n("div", ne, [
298
- n("p", de, [
299
- n("span", ue, b(N.value), 1),
300
- ee(" " + b(j.value), 1)
347
+ s("div", de, [
348
+ s("p", ue, [
349
+ s("span", ce, h($.value), 1),
350
+ le(" " + h(j.value), 1)
301
351
  ]),
302
- i.fileTypes.length ? (r(), c("p", ce, b(i.fileTypes.join(", ")), 1)) : F("", !0)
352
+ o.fileTypes.length ? (a(), u("p", fe, h(o.fileTypes.join(", ")), 1)) : S("", !0)
303
353
  ])
304
354
  ], 2)),
305
- i.loading || u.value ? (r(), c("div", be, [
306
- n("div", ke, [
307
- w(p, {
355
+ o.loading || c.value ? (a(), u("div", Se, [
356
+ s("div", Ae, [
357
+ k(p, {
308
358
  icon: "lucide:loader-2",
309
359
  class: "w-6 h-6 animate-spin text-primary"
310
360
  })
311
361
  ])
312
- ])) : F("", !0)
362
+ ])) : S("", !0)
313
363
  ], 32))
314
364
  ])
315
365
  ]));
316
366
  }
317
367
  });
318
368
  export {
319
- Se as default
369
+ Be as default
320
370
  };
@@ -189,7 +189,8 @@ const pe = /* @__PURE__ */ I({
189
189
  size: e.size,
190
190
  rounded: e.rounded,
191
191
  maxSize: e.field.maxFileSize ? e.field.maxFileSize * 1024 * 1024 : void 0,
192
- loading: e.loading
192
+ loading: e.loading,
193
+ allowRename: e.field.props?.allowRename ?? !0
193
194
  } : a === "avatarUpload" ? {
194
195
  size: "2xl",
195
196
  ...l,
@@ -3,7 +3,7 @@ import L from "./Icon.vue.js";
3
3
  import v from "./Modal.vue.js";
4
4
  import N from "./CommandPalette/CommandPaletteContent.vue.js";
5
5
  import { $t as R } from "../utils/i18n.js";
6
- /* empty css */
6
+ /* empty css */
7
7
  const U = { class: "block truncate -text-fs-1.5" }, V = { class: "ml-auto inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-[10px] font-mono font-medium border border-border/80 bg-background text-muted-foreground ml-1" }, q = /* @__PURE__ */ x({
8
8
  __name: "NavbarCommandPalette",
9
9
  props: {
@@ -139,6 +139,7 @@ declare const __VLS_component: import('vue').DefineComponent<ScreenProps, {}, {}
139
139
  showRefresh: boolean;
140
140
  viewProps: Record<string, any>;
141
141
  hideSelectable: boolean;
142
+ hideDeleteBtn: boolean;
142
143
  quickFilters: import('./types').ScreenQuickFilter[];
143
144
  quickFilterKey: string;
144
145
  quickFilterVariant: import('../Tabes').TabesVariant;
@@ -1,4 +1,4 @@
1
- import { defineComponent as ge, useSlots as ye, computed as i, ref as s, markRaw as we, provide as F, watch as R, openBlock as n, createElementBlock as m, normalizeClass as q, createVNode as w, createSlots as ke, withCtx as Q, renderSlot as d, createElementVNode as I, createBlock as p, createCommentVNode as c, isRef as be, unref as D, Fragment as M, resolveDynamicComponent as xe, mergeProps as A, toDisplayString as Ce } from "vue";
1
+ import { defineComponent as ge, useSlots as ye, computed as n, ref as s, markRaw as we, provide as F, watch as R, openBlock as o, createElementBlock as m, normalizeClass as q, createVNode as w, createSlots as ke, withCtx as Q, renderSlot as d, createElementVNode as I, createBlock as p, createCommentVNode as c, isRef as be, unref as D, Fragment as M, resolveDynamicComponent as xe, mergeProps as A, toDisplayString as Ce } from "vue";
2
2
  import De from "../Input.vue.js";
3
3
  /* empty css */
4
4
  import O from "../Button.vue.js";
@@ -6,10 +6,10 @@ import Pe from "../ConfirmationModal.vue.js";
6
6
  import Se from "../Pagination/Pagination.vue.js";
7
7
  import $e from "./ScreenFilter.vue.js";
8
8
  import Ie from "../ImportData/ImportData.vue.js";
9
- import { usePersistentState as Ve } from "../../utils/usePersistentState.js";
10
- import { useVLiteConfig as Te } from "../../core/config.js";
9
+ import { usePersistentState as Be } from "../../utils/usePersistentState.js";
10
+ import { useVLiteConfig as Ve } from "../../core/config.js";
11
11
  import { $t as f } from "../../utils/i18n.js";
12
- import { SCREEN_CONTEXT_KEY as Be } from "../DataTable/types.js";
12
+ import { SCREEN_CONTEXT_KEY as Te } from "../DataTable/types.js";
13
13
  import Fe from "./components/ScreenHeaderTitle.vue.js";
14
14
  import Re from "./components/ScreenViewToggle.vue.js";
15
15
  import qe from "./components/ScreenOptionsDropdown.vue.js";
@@ -71,8 +71,11 @@ const Ne = { class: "flex flex-col w-full space-y-8" }, Qe = { class: "flex flex
71
71
  showRefresh: { type: Boolean, default: !1 },
72
72
  containerClass: {},
73
73
  headerClass: {},
74
+ titleClass: {},
75
+ descriptionClass: {},
74
76
  viewProps: { default: () => ({}) },
75
77
  hideSelectable: { type: Boolean, default: !1 },
78
+ hideDeleteBtn: { type: Boolean, default: !1 },
76
79
  quickFilters: { default: () => [] },
77
80
  quickFilterKey: { default: "status" },
78
81
  defaultQuickFilter: {},
@@ -80,17 +83,17 @@ const Ne = { class: "flex flex-col w-full space-y-8" }, Qe = { class: "flex flex
80
83
  },
81
84
  emits: ["add", "delete"],
82
85
  setup(t, { emit: K }) {
83
- const l = t, x = Te(), E = K, P = ye(), L = i(() => l.name || l.title || "default-screen"), h = Ve(
86
+ const l = t, x = Ve(), E = K, P = ye(), L = n(() => l.name || l.title || "default-screen"), h = Be(
84
87
  `view-mode-${L.value}`,
85
88
  l.table || P.table ? "table" : "list"
86
- ), g = s(""), u = s({}), j = s({ field: "", order: "" }), k = s(l.pageInfo?.currentPage || 1), V = s(l.pageInfo?.itemsPerPage || l.paginationProps?.itemsPerPage || 10), r = s([]), S = s([]), C = s(!1), y = s(
89
+ ), g = s(""), u = s({}), j = s({ field: "", order: "" }), k = s(l.pageInfo?.currentPage || 1), B = s(l.pageInfo?.itemsPerPage || l.paginationProps?.itemsPerPage || 10), r = s([]), S = s([]), C = s(!1), y = s(
87
90
  l.defaultQuickFilter !== void 0 ? l.defaultQuickFilter : l.quickFilters && l.quickFilters.length > 0 ? l.quickFilters[0].value : ""
88
- ), z = i(() => l.quickFilters && l.quickFilters.length > 0), H = (e) => {
91
+ ), z = n(() => l.quickFilters && l.quickFilters.length > 0), H = (e) => {
89
92
  y.value = e, k.value = 1, v();
90
- }, U = i(() => {
93
+ }, U = n(() => {
91
94
  let e;
92
95
  return h.value === "table" ? e = l.table || !!P.table : e = l.list || !!P.list || !!P.grid, typeof e == "object" && e !== null ? we(e) : e;
93
- }), X = i(() => g.value && g.value.trim() !== "" ? !0 : u.value ? Object.keys(u.value).some(
96
+ }), X = n(() => g.value && g.value.trim() !== "" ? !0 : u.value ? Object.keys(u.value).some(
94
97
  (e) => u.value[e] !== "" && u.value[e] !== null && u.value[e] !== void 0
95
98
  ) : !1), Y = {
96
99
  disableSearch: !0,
@@ -99,7 +102,7 @@ const Ne = { class: "flex flex-col w-full space-y-8" }, Qe = { class: "flex flex
99
102
  j.value = { field: e.sort.field, order: e.sort.order }, v();
100
103
  }
101
104
  };
102
- F(Be, Y), F("screen-selected-rows", r), F("screen-request-delete", (e) => b(e));
105
+ F(Te, Y), F("screen-selected-rows", r), F("screen-request-delete", (e) => b(e));
103
106
  const b = (e) => {
104
107
  S.value = e, C.value = !0;
105
108
  }, G = () => {
@@ -115,65 +118,65 @@ const Ne = { class: "flex flex-col w-full space-y-8" }, Qe = { class: "flex flex
115
118
  ), R(
116
119
  () => l.pageInfo?.itemsPerPage,
117
120
  (e) => {
118
- e && (V.value = e);
121
+ e && (B.value = e);
119
122
  }
120
123
  );
121
- let T = null;
124
+ let V = null;
122
125
  R(g, () => {
123
- T && clearTimeout(T), T = setTimeout(() => {
126
+ V && clearTimeout(V), V = setTimeout(() => {
124
127
  k.value = 1, v();
125
128
  }, 300);
126
129
  });
127
130
  const W = (e) => {
128
131
  k.value = e, v();
129
132
  }, Z = (e) => {
130
- V.value = e, k.value = 1, v();
133
+ B.value = e, k.value = 1, v();
131
134
  }, v = () => {
132
135
  if (!l.refetch) return;
133
136
  const e = { ...u.value };
134
137
  y.value !== "" && y.value !== null && y.value !== void 0 && (e[l.quickFilterKey] = y.value), l.refetch({
135
- pagination: { page: k.value, limit: V.value },
138
+ pagination: { page: k.value, limit: B.value },
136
139
  search: g.value,
137
140
  sort: { ...j.value },
138
141
  filter: e
139
142
  });
140
- }, _ = i(() => l.data && l.data.length > 0), ee = i(() => {
143
+ }, _ = n(() => l.data && l.data.length > 0), ee = n(() => {
141
144
  const e = f("vlite.screen.deleteSelected");
142
145
  return e !== "vlite.screen.deleteSelected" ? e : "Delete Selected";
143
- }), te = i(() => {
146
+ }), te = n(() => {
144
147
  const e = f("vlite.screen.refresh");
145
148
  return e !== "vlite.screen.refresh" ? e : "Refresh";
146
- }), le = i(() => {
149
+ }), le = n(() => {
147
150
  const e = f("vlite.screen.searchPlaceholder");
148
151
  return e !== "vlite.screen.searchPlaceholder" ? e : "Search...";
149
- }), ae = i(() => {
152
+ }), ae = n(() => {
150
153
  const e = f("vlite.screen.confirmDeleteTitle");
151
154
  return e !== "vlite.screen.confirmDeleteTitle" ? e : "Confirm Deletion";
152
- }), oe = i(() => {
155
+ }), ie = n(() => {
153
156
  const e = f("vlite.screen.confirmDeleteDesc", { count: S.value.length });
154
157
  return e !== "vlite.screen.confirmDeleteDesc" ? e : `Are you sure you want to delete the selected ${S.value.length > 1 ? "items" : "item"}?`;
155
- }), ie = i(() => {
158
+ }), ne = n(() => {
156
159
  const e = f("vlite.screen.confirmDeleteBtn");
157
160
  return e !== "vlite.screen.confirmDeleteBtn" ? e : "Delete";
158
- }), ne = i(() => {
161
+ }), oe = n(() => {
159
162
  const e = f("vlite.screen.cancelBtn");
160
163
  return e !== "vlite.screen.cancelBtn" ? e : "Cancel";
161
- }), re = i(() => {
164
+ }), re = n(() => {
162
165
  const e = f("vlite.screen.missingView");
163
166
  return e !== "vlite.screen.missingView" ? e : "Please provide a `:list` or `:table` component or slot.";
164
- }), N = i(
167
+ }), N = n(
165
168
  () => l.exportSchema && l.exportSchema.length > 0 && l.exportProps !== !1 || l.importSchema && l.importSchema.length > 0 && l.importProps !== !1
166
- ), se = i(() => {
169
+ ), se = n(() => {
167
170
  const e = f("vlite.screen.importData");
168
171
  return e !== "vlite.screen.importData" ? e : "Import Data";
169
- }), de = s(null), $ = s(!1), B = s(!1), ce = (e) => {
170
- e.value === "export" ? $.value = !0 : e.value === "import" && (B.value = !0);
171
- }, ue = i(
172
+ }), de = s(null), $ = s(!1), T = s(!1), ce = (e) => {
173
+ e.value === "export" ? $.value = !0 : e.value === "import" && (T.value = !0);
174
+ }, ue = n(
172
175
  () => (l.exportSchema || []).map((e) => ({
173
176
  field: e.name || e.field,
174
177
  title: e.label || e.title || e.name || e.field
175
178
  }))
176
- ), me = i(
179
+ ), me = n(
177
180
  () => (l.importSchema || []).map((e) => ({
178
181
  field: e.name || e.field,
179
182
  title: e.label || e.title || e.name || e.field,
@@ -188,7 +191,7 @@ const Ne = { class: "flex flex-col w-full space-y-8" }, Qe = { class: "flex flex
188
191
  skipped: 0,
189
192
  failed: 0,
190
193
  errors: []
191
- }), ve = () => v(), pe = i(
194
+ }), ve = () => v(), pe = n(
192
195
  () => l.exportMode || x?.exportData?.mode || "frontend"
193
196
  ), he = async (e) => {
194
197
  x?.services?.exportApi && l.exportType ? await x.services.exportApi(l.exportType, {
@@ -199,16 +202,18 @@ const Ne = { class: "flex flex-col w-full space-y-8" }, Qe = { class: "flex flex
199
202
  "VLite Screen: No exportApi configured or no exportType provided for generic backend export."
200
203
  );
201
204
  };
202
- return (e, o) => (n(), m("div", Ne, [
203
- t.customHeader ? d(e.$slots, "custom-header", { key: 1 }) : (n(), m("div", {
205
+ return (e, i) => (o(), m("div", Ne, [
206
+ t.customHeader ? d(e.$slots, "custom-header", { key: 1 }) : (o(), m("div", {
204
207
  key: 0,
205
208
  class: q([t.headerClass, "flex flex-col md:flex-row sm:items-start md:items-center justify-between gap-4"])
206
209
  }, [
207
210
  w(Fe, {
208
211
  title: t.title,
209
212
  "title-i18n": t.titleI18n,
213
+ "title-class": t.titleClass,
210
214
  description: t.description,
211
215
  "description-i18n": t.descriptionI18n,
216
+ "description-class": t.descriptionClass,
212
217
  info: t.info,
213
218
  "info-i18n": t.infoI18n
214
219
  }, ke({ _: 2 }, [
@@ -226,24 +231,24 @@ const Ne = { class: "flex flex-col w-full space-y-8" }, Qe = { class: "flex flex
226
231
  ]),
227
232
  key: "1"
228
233
  } : void 0
229
- ]), 1032, ["title", "title-i18n", "description", "description-i18n", "info", "info-i18n"]),
234
+ ]), 1032, ["title", "title-i18n", "title-class", "description", "description-i18n", "description-class", "info", "info-i18n"]),
230
235
  I("div", Qe, [
231
236
  I("div", Me, [
232
- r.value.length > 0 && !t.hideSelectable ? (n(), p(O, {
237
+ r.value.length > 0 && !t.hideSelectable && !t.hideDeleteBtn ? (o(), p(O, {
233
238
  key: 0,
234
239
  variant: "outline",
235
240
  class: "hover:bg-destructive/10 shrink-0 h-9! w-9!",
236
241
  icon: "lucide:trash-2",
237
242
  title: ee.value,
238
- onClick: o[0] || (o[0] = (a) => b(r.value))
243
+ onClick: i[0] || (i[0] = (a) => b(r.value))
239
244
  }, null, 8, ["title"])) : c("", !0),
240
- (t.table || e.$slots.table) && (t.list || e.$slots.list || e.$slots.grid) ? (n(), p(Re, {
245
+ (t.table || e.$slots.table) && (t.list || e.$slots.list || e.$slots.grid) ? (o(), p(Re, {
241
246
  key: 1,
242
247
  modelValue: D(h),
243
- "onUpdate:modelValue": o[1] || (o[1] = (a) => be(h) ? h.value = a : null)
248
+ "onUpdate:modelValue": i[1] || (i[1] = (a) => be(h) ? h.value = a : null)
244
249
  }, null, 8, ["modelValue"])) : c("", !0),
245
250
  d(e.$slots, "before-search"),
246
- t.showRefresh ? (n(), p(O, {
251
+ t.showRefresh ? (o(), p(O, {
247
252
  key: 2,
248
253
  variant: "outline",
249
254
  icon: "lucide:refresh-cw",
@@ -253,19 +258,19 @@ const Ne = { class: "flex flex-col w-full space-y-8" }, Qe = { class: "flex flex
253
258
  disabled: t.loading,
254
259
  onClick: v
255
260
  }, null, 8, ["title", "disabled"])) : c("", !0),
256
- t.filterSchema && t.filterSchema.length > 0 ? (n(), p($e, {
261
+ t.filterSchema && t.filterSchema.length > 0 ? (o(), p($e, {
257
262
  key: 3,
258
263
  schema: t.filterSchema,
259
264
  type: t.filterType,
260
265
  modelValue: u.value,
261
- "onUpdate:modelValue": o[2] || (o[2] = (a) => u.value = a),
266
+ "onUpdate:modelValue": i[2] || (i[2] = (a) => u.value = a),
262
267
  onChange: v
263
268
  }, null, 8, ["schema", "type", "modelValue"])) : c("", !0),
264
- t.canSearch ? (n(), m("div", Oe, [
269
+ t.canSearch ? (o(), m("div", Oe, [
265
270
  w(De, {
266
271
  lazy: "",
267
272
  modelValue: g.value,
268
- "onUpdate:modelValue": o[3] || (o[3] = (a) => g.value = a),
273
+ "onUpdate:modelValue": i[3] || (i[3] = (a) => g.value = a),
269
274
  icon: "lucide:search",
270
275
  placeholder: le.value,
271
276
  variant: "outline",
@@ -283,10 +288,10 @@ const Ne = { class: "flex flex-col w-full space-y-8" }, Qe = { class: "flex flex
283
288
  loading: t.loading,
284
289
  data: t.data,
285
290
  refetch: t.refetch,
286
- onAdd: o[4] || (o[4] = (a) => e.$emit("add"))
291
+ onAdd: i[4] || (i[4] = (a) => e.$emit("add"))
287
292
  }, null, 8, ["can-add", "add-component", "add-btn", "loading", "data", "refetch"])
288
293
  ]),
289
- N.value ? (n(), p(qe, {
294
+ N.value ? (o(), p(qe, {
290
295
  key: 0,
291
296
  "export-props": t.exportProps,
292
297
  "import-props": t.importProps,
@@ -296,24 +301,24 @@ const Ne = { class: "flex flex-col w-full space-y-8" }, Qe = { class: "flex flex
296
301
  ])
297
302
  ])
298
303
  ], 2)),
299
- z.value ? (n(), m("div", {
304
+ d(e.$slots, "sub-header"),
305
+ z.value ? (o(), m("div", {
300
306
  key: 2,
301
- class: q(["max-sm:-mt-1", t.quickFilterVariant == "line" ? "mb-1.5 sm:mb-0" : "mb-2"])
307
+ class: q(["-mt-1", t.quickFilterVariant == "line" ? "mb-1.5 sm:mb-1" : "mb-2"])
302
308
  }, [
303
309
  w(Ue, {
304
310
  modelValue: y.value,
305
- "onUpdate:modelValue": o[5] || (o[5] = (a) => y.value = a),
311
+ "onUpdate:modelValue": i[5] || (i[5] = (a) => y.value = a),
306
312
  options: t.quickFilters,
307
313
  variant: t.quickFilterVariant,
308
314
  onChange: H
309
315
  }, null, 8, ["modelValue", "options", "variant"])
310
316
  ], 2)) : c("", !0),
311
- d(e.$slots, "sub-header"),
312
317
  I("div", {
313
318
  class: q(["flex-1 w-full relative", t.containerClass])
314
319
  }, [
315
- !_.value && !t.loading ? (n(), m(M, { key: 0 }, [
316
- e.$slots.empty ? d(e.$slots, "empty", { key: 0 }) : (n(), p(Ee, {
320
+ !_.value && !t.loading ? (o(), m(M, { key: 0 }, [
321
+ e.$slots.empty ? d(e.$slots, "empty", { key: 0 }) : (o(), p(Ee, {
317
322
  key: 1,
318
323
  "empty-title": t.emptyTitle,
319
324
  "empty-title-i18n": t.emptyTitleI18n,
@@ -325,7 +330,7 @@ const Ne = { class: "flex flex-col w-full space-y-8" }, Qe = { class: "flex flex
325
330
  "add-component": t.addComponent,
326
331
  "add-btn": t.addBtn
327
332
  }, null, 8, ["empty-title", "empty-title-i18n", "empty-description", "empty-description-i18n", "empty-icon", "is-filtered", "can-add", "add-component", "add-btn"]))
328
- ], 64)) : (n(), m(M, { key: 1 }, [
333
+ ], 64)) : (o(), m(M, { key: 1 }, [
329
334
  D(h) === "table" && e.$slots.table ? d(e.$slots, "table", {
330
335
  key: 0,
331
336
  data: t.data,
@@ -347,19 +352,19 @@ const Ne = { class: "flex flex-col w-full space-y-8" }, Qe = { class: "flex flex
347
352
  selectedRows: r.value,
348
353
  delete: b,
349
354
  updateSelectedRows: (a) => r.value = a
350
- }) : U.value ? (n(), p(xe(U.value), A({
355
+ }) : U.value ? (o(), p(xe(U.value), A({
351
356
  key: 3,
352
357
  data: t.data,
353
358
  loading: t.loading,
354
359
  refetch: t.refetch,
355
360
  selectedRows: r.value,
356
- "onUpdate:selectedRows": o[6] || (o[6] = (a) => r.value = a),
361
+ "onUpdate:selectedRows": i[6] || (i[6] = (a) => r.value = a),
357
362
  delete: b,
358
363
  onDelete: J
359
- }, t.viewProps), null, 16, ["data", "loading", "refetch", "selectedRows"])) : (n(), m("div", Le, Ce(re.value), 1))
364
+ }, t.viewProps), null, 16, ["data", "loading", "refetch", "selectedRows"])) : (o(), m("div", Le, Ce(re.value), 1))
360
365
  ], 64))
361
366
  ], 2),
362
- t.pagination && t.pageInfo && t.pageInfo.totalPages > 1 ? (n(), m("div", ze, [
367
+ t.pagination && t.pageInfo && t.pageInfo.totalPages > 1 ? (o(), m("div", ze, [
363
368
  w(D(Se), A({
364
369
  "current-page": t.pageInfo.currentPage,
365
370
  "total-pages": t.pageInfo.totalPages,
@@ -371,29 +376,29 @@ const Ne = { class: "flex flex-col w-full space-y-8" }, Qe = { class: "flex flex
371
376
  ])) : c("", !0),
372
377
  w(Pe, {
373
378
  show: C.value,
374
- "onUpdate:show": o[7] || (o[7] = (a) => C.value = a),
379
+ "onUpdate:show": i[7] || (i[7] = (a) => C.value = a),
375
380
  title: ae.value,
376
- description: oe.value,
377
- "confirm-text": ie.value,
378
- "cancel-text": ne.value,
381
+ description: ie.value,
382
+ "confirm-text": ne.value,
383
+ "cancel-text": oe.value,
379
384
  variant: "danger",
380
385
  onConfirm: G,
381
- onCancel: o[8] || (o[8] = (a) => C.value = !1)
386
+ onCancel: i[8] || (i[8] = (a) => C.value = !1)
382
387
  }, null, 8, ["show", "title", "description", "confirm-text", "cancel-text"]),
383
- $.value ? (n(), p(je, {
388
+ $.value ? (o(), p(je, {
384
389
  key: 4,
385
390
  show: $.value,
386
- "onUpdate:show": o[9] || (o[9] = (a) => $.value = a),
391
+ "onUpdate:show": i[9] || (i[9] = (a) => $.value = a),
387
392
  data: t.data || [],
388
393
  fields: ue.value,
389
394
  mode: pe.value,
390
395
  "export-props": t.exportProps,
391
396
  "on-export": he
392
397
  }, null, 8, ["show", "data", "fields", "mode", "export-props"])) : c("", !0),
393
- N.value ? (n(), m("div", He, [
398
+ N.value ? (o(), m("div", He, [
394
399
  w(Ie, A({
395
- show: B.value,
396
- "onUpdate:show": o[10] || (o[10] = (a) => B.value = a),
400
+ show: T.value,
401
+ "onUpdate:show": i[10] || (i[10] = (a) => T.value = a),
397
402
  ref_key: "importDataRef",
398
403
  ref: de,
399
404
  fields: me.value,
@@ -5,6 +5,8 @@ type __VLS_Props = {
5
5
  descriptionI18n?: string;
6
6
  info?: string;
7
7
  infoI18n?: string;
8
+ titleClass?: string;
9
+ descriptionClass?: string;
8
10
  };
9
11
  declare function __VLS_template(): {
10
12
  attrs: Partial<{}>;
@@ -1,14 +1,11 @@
1
- import { defineComponent as f, computed as l, openBlock as n, createElementBlock as o, renderSlot as a, createElementVNode as p, toDisplayString as d, createBlock as u, withCtx as x, createVNode as h, createCommentVNode as i } from "vue";
2
- import I from "../../Icon.vue.js";
3
- import _ from "../../Tooltip.vue.js";
4
- import { $t as m } from "../../../utils/i18n.js";
5
- const g = { class: "flex flex-col shrink-0" }, k = {
1
+ import { defineComponent as p, computed as c, openBlock as n, createElementBlock as o, renderSlot as a, createElementVNode as u, normalizeClass as d, toDisplayString as m, createBlock as x, withCtx as h, createVNode as I, createCommentVNode as i } from "vue";
2
+ import C from "../../Icon.vue.js";
3
+ import g from "../../Tooltip.vue.js";
4
+ import { $t as f } from "../../../utils/i18n.js";
5
+ const k = { class: "flex flex-col shrink-0" }, v = {
6
6
  key: 0,
7
7
  class: "flex items-center! gap-2"
8
- }, v = { class: "text-fs-7.5 font-bold text-foreground" }, y = {
9
- key: 0,
10
- class: "text-sm text-gray-700 mt-1 md:max-w-[450px]"
11
- }, S = /* @__PURE__ */ f({
8
+ }, S = /* @__PURE__ */ p({
12
9
  __name: "ScreenHeaderTitle",
13
10
  props: {
14
11
  title: {},
@@ -16,24 +13,28 @@ const g = { class: "flex flex-col shrink-0" }, k = {
16
13
  description: {},
17
14
  descriptionI18n: {},
18
15
  info: {},
19
- infoI18n: {}
16
+ infoI18n: {},
17
+ titleClass: {},
18
+ descriptionClass: {}
20
19
  },
21
- setup(e) {
22
- const t = e, r = l(() => t.titleI18n ? m(t.titleI18n) : t.title), s = l(
23
- () => t.descriptionI18n ? m(t.descriptionI18n) : t.description
20
+ setup(t) {
21
+ const e = t, s = c(() => e.titleI18n ? f(e.titleI18n) : e.title), r = c(
22
+ () => e.descriptionI18n ? f(e.descriptionI18n) : e.description
24
23
  );
25
- return (c, $) => (n(), o("div", g, [
26
- a(c.$slots, "title", {}, () => [
27
- r.value ? (n(), o("div", k, [
28
- p("h1", v, d(r.value), 1),
29
- e.info || e.infoI18n ? (n(), u(_, {
24
+ return (l, y) => (n(), o("div", k, [
25
+ a(l.$slots, "title", {}, () => [
26
+ s.value ? (n(), o("div", v, [
27
+ u("h1", {
28
+ class: d(["text-fs-7.5 font-bold text-foreground", t.titleClass])
29
+ }, m(s.value), 3),
30
+ t.info || t.infoI18n ? (n(), x(g, {
30
31
  key: 0,
31
- content: e.info,
32
- "content-i18n": e.infoI18n,
32
+ content: t.info,
33
+ "content-i18n": t.infoI18n,
33
34
  placement: "right"
34
35
  }, {
35
- default: x(() => [
36
- h(I, {
36
+ default: h(() => [
37
+ I(C, {
37
38
  icon: "lucide:info",
38
39
  class: "w-[18px] h-[18px] mt-3! text-muted-foreground hover:text-foreground cursor-pointer transition-colors outline-none"
39
40
  })
@@ -42,8 +43,11 @@ const g = { class: "flex flex-col shrink-0" }, k = {
42
43
  }, 8, ["content", "content-i18n"])) : i("", !0)
43
44
  ])) : i("", !0)
44
45
  ]),
45
- a(c.$slots, "description", {}, () => [
46
- s.value ? (n(), o("p", y, d(s.value), 1)) : i("", !0)
46
+ a(l.$slots, "description", {}, () => [
47
+ r.value ? (n(), o("p", {
48
+ key: 0,
49
+ class: d(["text-sm text-gray-700 mt-1 md:max-w-[450px]", t.descriptionClass])
50
+ }, m(r.value), 3)) : i("", !0)
47
51
  ])
48
52
  ]));
49
53
  }
@@ -22,7 +22,7 @@ const p = { class: "w-max" }, V = /* @__PURE__ */ i({
22
22
  };
23
23
  return (e, v) => (r(), u("div", p, [
24
24
  m(d(b), {
25
- class: "border-b-0! border-0! pb-0.5",
25
+ class: "border-b-0! border-0! pb-0",
26
26
  "model-value": a.modelValue,
27
27
  options: t.value,
28
28
  variant: a.variant || "line",
@@ -84,8 +84,11 @@ export interface ScreenProps {
84
84
  showRefresh?: boolean;
85
85
  containerClass?: string;
86
86
  headerClass?: string;
87
+ titleClass?: string;
88
+ descriptionClass?: string;
87
89
  viewProps?: Record<string, any>;
88
90
  hideSelectable?: boolean;
91
+ hideDeleteBtn?: boolean;
89
92
  /**
90
93
  * Quick-filter tabs rendered below the header (above the content).
91
94
  * Inspired by modern dashboards (Shopify, Linear, Vercel).
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "private": false,
4
4
  "description": "A Vue 3 UI component library built with Tailwind CSS.",
5
5
  "license": "MIT",
6
- "version": "0.9.1",
6
+ "version": "0.9.2",
7
7
  "type": "module",
8
8
  "main": "index.js",
9
9
  "module": "index.js",
@@ -47,7 +47,7 @@
47
47
  "qrcode": "^1.5.4",
48
48
  "scrollreveal": "^4.0.9",
49
49
  "tailwindcss": "^4.1.18",
50
- "v-datepicker-lite": "^0.1.6",
50
+ "v-datepicker-lite": "^0.1.8",
51
51
  "v-file-preview": "^0.1.3",
52
52
  "v-tooltip-lite": "^0.2.8",
53
53
  "vue-carousel-lite": "^0.2.7",
package/style.css CHANGED
@@ -967,7 +967,6 @@ textarea::-webkit-scrollbar-thumb:hover {
967
967
  background-color: var(--color-scrollbar-hover) !important;
968
968
  }
969
969
 
970
-
971
970
  /* --- Vite Generated CSS --- */
972
971
  input[data-v-a8237529]::-webkit-outer-spin-button,input[data-v-a8237529]::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none;margin:0}input[type=number][data-v-a8237529]{-moz-appearance:textfield;appearance:textfield}@keyframes onAutoFillStart{0%{opacity:1}to{opacity:1}}@keyframes onAutoFillCancel{0%{opacity:1}to{opacity:1}}input.autofill-detect:-webkit-autofill{animation-name:onAutoFillStart;animation-duration:1ms;animation-fill-mode:both}input.autofill-detect:not(:-webkit-autofill){animation-name:onAutoFillCancel;animation-duration:1ms;animation-fill-mode:both}.dropdown-menu[data-v-adc57063]{will-change:transform;contain:layout style}.v-modal-overlay[data-v-7c958115]{background-color:#00000052}.v-modal-backdrop[data-v-7c958115]{transform:translateZ(0);will-change:opacity}.modal-body[data-v-7c958115]{will-change:transform;contain:layout style}.blink-bg[data-v-7c958115]{animation:blink-animation-7c958115 1s infinite}@keyframes blink-animation-7c958115{0%{background-color:inherit}15%{background-color:var(--color-gray-250)}35%{background-color:inherit}75%{background-color:var(--color-gray-250)}to{background-color:inherit}}.IroBox{border-radius:8px!important}.custom-fields-table[data-v-0cced8cd]{will-change:transform;contain:layout style}.custom-fields-table[data-v-0cced8cd] .form-field-item{margin-bottom:0!important;height:100%}.custom-fields-table[data-v-0cced8cd] input,.custom-fields-table[data-v-0cced8cd] textarea{padding-left:1em;padding-right:.5em}.custom-fields-table[data-v-0cced8cd] input,.custom-fields-table[data-v-0cced8cd] textarea,.custom-fields-table[data-v-0cced8cd] select,.custom-fields-table[data-v-0cced8cd] .input-wrapper,.custom-fields-table[data-v-0cced8cd] .tooltip-trigger button{border:none!important;background:transparent!important;box-shadow:none!important;border-radius:0!important;height:100%!important;min-height:40px}.custom-fields-table[data-v-0cced8cd] .tooltip-trigger button{justify-content:space-between!important}.custom-fields-table[data-v-0cced8cd] input:focus,.custom-fields-table[data-v-0cced8cd] textarea:focus,.custom-fields-table[data-v-0cced8cd] select:focus,.custom-fields-table[data-v-0cced8cd] .input-wrapper:focus-within{background-color:hsla(var(--primary) / .03)!important;box-shadow:inset 0 0 0 2px hsla(var(--primary) / .1)!important}.custom-fields-table[data-v-0cced8cd] .w-full{width:100%;height:100%}.list-enter-active[data-v-0cced8cd]{transition:all .15s cubic-bezier(.16,1,.3,1)}.list-enter-from[data-v-0cced8cd]{opacity:0;transform:translateY(-5px)}.form-field-item[data-v-1139135c]{display:flex;flex-direction:column}.form-field-item[data-v-1139135c]:has([role=switch]),.form-field-item[data-v-1139135c]:has([role=checkbox]){flex-direction:row;align-items:center;justify-content:flex-start}.form-container[data-v-d7b4ffda]{width:100%}[data-tabes][data-v-262d5698]:not(.inline-flex):not([class*=gap-6])>:where(button,a,[role=tab]){flex:1 1 0%;min-width:0}[data-tabes].inline-flex[data-v-262d5698]{overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}[data-tabes].inline-flex[data-v-262d5698]::-webkit-scrollbar{display:none}@media(max-width:480px){[data-tabes][data-v-262d5698]:not([class*=flex-wrap]){overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}[data-tabes][data-v-262d5698]:not([class*=flex-wrap])::-webkit-scrollbar{display:none}}.custom-scrollbar[data-v-3a733454]::-webkit-scrollbar{width:0px}.custom-scrollbar[data-v-3a733454]::-webkit-scrollbar-track{background:transparent}.custom-scrollbar[data-v-3a733454]::-webkit-scrollbar-thumb{background-color:var(--color-border);border-radius:10px}.scrollable-container[data-v-3a733454]{will-change:transform;contain:layout style}.custom-scrollbar-x[data-v-1285df4f]::-webkit-scrollbar{height:8px}.custom-scrollbar-x[data-v-1285df4f]::-webkit-scrollbar-track{background:transparent}.custom-scrollbar-x[data-v-1285df4f]::-webkit-scrollbar-thumb{background-color:var(--color-border);border-radius:10px}.scrollable-container[data-v-1285df4f]{will-change:transform;contain:layout style}.v-sidepanel-overlay[data-v-ff2923de]{background-color:#0003}.sidepanel-body[data-v-ff2923de]{will-change:transform;contain:layout style}.navbar-tabs-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.navbar-tabs-no-scrollbar::-webkit-scrollbar{display:none}.fade-x-enter-active,.fade-x-leave-active{transition:opacity .15s ease}.fade-x-enter-from,.fade-x-leave-to{opacity:0}.breadcrumb-item[data-v-ecb5df7c]{display:inline-flex;align-items:center;cursor:pointer}.breadcrumb-link[data-v-ecb5df7c]{display:inline-flex;align-items:center;gap:.35em;color:var(--color-muted-foreground);text-decoration:none;transition:color .15s ease,background-color .15s ease;border-radius:var(--radius-sm)}.breadcrumb-link[data-v-ecb5df7c]:not(.current):not(.disabled):hover{color:var(--color-foreground)}.breadcrumb-link.current[data-v-ecb5df7c]{color:var(--color-foreground);font-weight:600;cursor:default}.breadcrumb-link.disabled[data-v-ecb5df7c]{opacity:.45;cursor:not-allowed;pointer-events:none}.breadcrumb-icon[data-v-ecb5df7c]{flex-shrink:0}.breadcrumb-list[data-v-d1e90135]{display:flex;flex-wrap:wrap;align-items:center;list-style:none;margin:0;padding:0;gap:.38em}.breadcrumb--sm[data-v-d1e90135]{font-size:var(--text--fs-2)}.breadcrumb--md[data-v-d1e90135]{font-size:var(--text-fs-0.5, 1em)}.breadcrumb--lg[data-v-d1e90135]{font-size:var(--text-fs-2)}.breadcrumb-separator[data-v-d1e90135]{display:inline-flex;align-items:center;color:var(--color-gray-500);-webkit-user-select:none;user-select:none;font-size:.9em;line-height:1;padding:0 .1em}.breadcrumb-ellipsis[data-v-d1e90135]{display:inline-flex;align-items:center}.breadcrumb-ellipsis-btn[data-v-d1e90135]{display:inline-flex;align-items:center;justify-content:center;width:1.6em;height:1.6em;border-radius:var(--radius-sm);border:1px solid var(--color-border);background:transparent;color:var(--color-muted-foreground);cursor:pointer;font-size:.9em;line-height:1;letter-spacing:.05em;transition:all .15s ease}.breadcrumb-ellipsis-btn[data-v-d1e90135]:hover{background:var(--color-accent);color:var(--color-foreground);border-color:var(--color-gray-350)}.breadcrumb--contained[data-v-d1e90135]{background:var(--color-secondary);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:.45em 1em}.breadcrumb--pills[data-v-d1e90135] .breadcrumb-link{padding:.2em .7em;border-radius:9999px;background:var(--color-secondary);border:1px solid var(--color-border)}.breadcrumb--pills[data-v-d1e90135] .breadcrumb-link:not(.current):not(.disabled):hover{background:var(--color-accent);border-color:var(--color-gray-350)}.breadcrumb--pills[data-v-d1e90135] .breadcrumb-link.current{background:var(--color-primary);color:var(--color-primary-foreground);border-color:var(--color-primary)}.breadcrumb--arrow .breadcrumb-list[data-v-d1e90135]{gap:0}.breadcrumb--arrow[data-v-d1e90135] .breadcrumb-link{padding:.35em .9em .35em 1.4em;background:var(--color-secondary);clip-path:polygon(0 0,calc(100% - .6em) 0,100% 50%,calc(100% - .6em) 100%,0 100%,.6em 50%);border:none;margin-left:-.3em}.breadcrumb--arrow[data-v-d1e90135] .breadcrumb-item:first-child .breadcrumb-link{padding-left:.9em;clip-path:polygon(0 0,calc(100% - .6em) 0,100% 50%,calc(100% - .6em) 100%,0 100%);border-radius:var(--radius-sm) 0 0 var(--radius-sm);margin-left:0}.breadcrumb--arrow[data-v-d1e90135] .breadcrumb-link:not(.current):not(.disabled):hover{background:var(--color-accent)}.breadcrumb--arrow[data-v-d1e90135] .breadcrumb-link.current{background:var(--color-primary);color:var(--color-primary-foreground)}.breadcrumb--arrow .breadcrumb-separator[data-v-d1e90135]{display:none}.import-table[data-v-cfd99cc9]{width:100%;font-size:.875rem;text-align:left;border-collapse:collapse}.import-thead[data-v-cfd99cc9]{font-size:.75rem;color:var(--color-muted-foreground, #6b7280);text-transform:uppercase;background-color:var(--color-muted, #f3f4f6);position:sticky;top:0;z-index:10}.import-th[data-v-cfd99cc9]{padding:.75rem 1rem;font-weight:500}.import-th-center[data-v-cfd99cc9]{text-align:center;width:4rem}.import-tbody .import-tr[data-v-cfd99cc9]{border-bottom:1px solid var(--color-border, #e5e7eb)}.import-tbody .import-tr[data-v-cfd99cc9]:last-child{border-bottom:none}.import-tr-active[data-v-cfd99cc9]{transition:background-color .2s ease-in-out}.import-tr-active[data-v-cfd99cc9]:hover{background-color:var(--color-muted, #f3f4f6);opacity:.85}.import-tr-ignored[data-v-cfd99cc9]{background-color:var(--color-muted, #f3f4f6);opacity:.6}.import-td-header[data-v-cfd99cc9]{padding:.75rem 1rem;font-weight:500;color:var(--color-foreground, #111827);white-space:nowrap}.import-td-dropdown[data-v-cfd99cc9]{padding:.5rem 1rem;min-width:200px}.import-td-preview[data-v-cfd99cc9]{padding:.75rem 1rem;color:var(--color-muted-foreground, #6b7280);min-width:200px;max-width:300px}.import-td-action[data-v-cfd99cc9]{padding:.75rem 1rem;text-align:center;vertical-align:middle}.heatmap-container[data-v-00476f00]{width:100%;height:100%;display:flex;flex-direction:column;min-height:0}.heatmap-wrapper[data-v-00476f00]{width:100%;height:100%;overflow:auto;flex:1;min-height:0;display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box;position:relative}.heatmap-grid[data-v-00476f00]{width:fit-content;height:fit-content;transition:all .2s ease-in-out}.heatmap-cell[data-v-00476f00]{aspect-ratio:1 / 1;border-radius:2px;transition:all .15s ease-in-out;border:1px solid transparent;box-sizing:border-box}.heatmap-cell-interactive[data-v-00476f00]{cursor:pointer}.heatmap-cell-interactive[data-v-00476f00]:hover{transform:scale(1.1);border-color:var(--border);box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;z-index:10;position:relative}.heatmap-cell-empty[data-v-00476f00]{opacity:.6}.heatmap-cell-hovered[data-v-00476f00]{outline:2px solid var(--primary);outline-offset:1px}.heatmap-cell-label[data-v-00476f00]{font-size:8px;font-weight:500;color:var(--foreground);opacity:.8;display:flex;align-items:center;justify-content:center;height:100%;width:100%;pointer-events:none}.heatmap-legend[data-v-00476f00]{display:flex;align-items:center;gap:.5rem;margin-top:1rem;font-size:.75rem;color:var(--muted-foreground);flex-shrink:0}.heatmap-legend-label[data-v-00476f00]{font-weight:500}.heatmap-legend-colors[data-v-00476f00]{display:flex;gap:.125rem}.heatmap-legend-item[data-v-00476f00]{width:.75rem;height:.75rem;border-radius:.375rem;border:1px solid var(--border)}@media(max-width:640px){.heatmap-wrapper[data-v-00476f00]{padding:12px}.heatmap-cell[data-v-00476f00]{border-radius:2px}.heatmap-cell-label[data-v-00476f00]{font-size:7px}}@media(min-width:641px)and (max-width:1023px){.heatmap-wrapper[data-v-00476f00]{padding:14px}.heatmap-cell[data-v-00476f00]{border-radius:2px}}@media(min-width:1024px){.heatmap-wrapper[data-v-00476f00]{padding:16px}.heatmap-cell[data-v-00476f00]{border-radius:3px}}.masonry-item[data-v-c29d0159]{content-visibility:auto;contain-intrinsic-size:1px 200px}.carousel-wrapper[data-v-4034dab4]{width:100%;position:relative;will-change:transform;contain:layout style}.file-tree-container[data-v-91337be9],.sheet-container[data-v-a5e9ca6f]{will-change:transform;contain:layout style}.accordion-enter-active[data-v-0075dffb],.accordion-leave-active[data-v-0075dffb]{transition:height .3s ease-in-out;will-change:height}.content-wrapper[data-v-0075dffb]{contain:paint}.sidebar-manu-item .tooltip-trigger{width:100%!important}.sidebar-menu-tooltip{margin-left:4px!important}[dir=rtl] .sidebar-menu-tooltip{margin-right:4px!important}.bg-stripe[data-v-454a1505]{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.animate-progress-stripe[data-v-454a1505]{animation:progress-stripe-454a1505 1s linear infinite}@keyframes progress-stripe-454a1505{0%{background-position:1rem 0}to{background-position:0 0}}.animate-progress-indeterminate[data-v-454a1505]{animation:progress-indeterminate-454a1505 1.5s infinite cubic-bezier(.65,.815,.735,.395)}@keyframes progress-indeterminate-454a1505{0%{transform:translate(-100%) scaleX(.2)}50%{transform:translate(0) scaleX(.5)}to{transform:translate(100%) scaleX(.2)}}.permission-matrix-wrapper[data-v-ba68e64a]{max-height:70vh;will-change:transform;contain:layout style}.permission-matrix-wrapper[data-v-ba68e64a]::-webkit-scrollbar{width:6px;height:6px}.permission-matrix-wrapper[data-v-ba68e64a]::-webkit-scrollbar-track{background:transparent}.permission-matrix-wrapper[data-v-ba68e64a]::-webkit-scrollbar-thumb{background:var(--color-gray-350);border-radius:3px}.permission-matrix-wrapper[data-v-ba68e64a]::-webkit-scrollbar-thumb:hover{background:var(--color-gray-400)}.permission-list-wrapper[data-v-a42b2fb0]{border:1px solid var(--color-border);border-radius:.5rem;overflow:hidden;background-color:var(--color-background);will-change:transform;contain:layout style}.custom-list-header[data-v-a42b2fb0]{background-color:var(--color-muted);border-bottom:1px solid var(--color-border);padding:var(--cell-py) var(--cell-px)}.custom-list-group-content .custom-list-item[data-v-a42b2fb0]{border-bottom:1px solid var(--color-border);padding:var(--cell-py) var(--cell-px);background-color:var(--color-background)}.custom-list-group-content .custom-list-item[data-v-a42b2fb0]:hover{background-color:var(--color-accent)}.custom-list-group-content .custom-list-item[data-v-a42b2fb0]:last-child{border-bottom:none}.custom-list-group-content+.custom-list-header[data-v-a42b2fb0],.custom-list-header+.custom-list-header[data-v-a42b2fb0]{border-top:1px solid var(--color-border)}.permission-list-wrapper>.custom-list-header[data-v-a42b2fb0]:last-child{border-bottom:none}.permission-matrix-wrapper[data-v-0b1ab970]{border:1px solid var(--color-border);background-color:var(--color-gray-100);border-radius:.5rem;overflow:auto;max-height:65vh;position:relative;will-change:transform;contain:layout style}.permission-matrix-wrapper[data-v-0b1ab970]::-webkit-scrollbar{width:6px;height:6px}.permission-matrix-wrapper[data-v-0b1ab970]::-webkit-scrollbar-track{background:transparent}.permission-matrix-wrapper[data-v-0b1ab970]::-webkit-scrollbar-thumb{background:var(--color-gray-350);border-radius:3px}.permission-matrix-wrapper[data-v-0b1ab970]::-webkit-scrollbar-thumb:hover{background:var(--color-gray-400)}.custom-table[data-v-0b1ab970]{width:100%;border-collapse:collapse}.custom-sticky-header th[data-v-0b1ab970]{position:sticky;top:0;z-index:20;box-shadow:0 1px 0 var(--color-border)}.custom-th[data-v-0b1ab970]{background-color:var(--color-gray-150);color:var(--color-foreground);background-clip:padding-box;border-bottom:none;border-left:1px solid var(--color-border);padding:var(--cell-py) var(--cell-px);text-align:left;font-weight:600;min-width:200px}thead:not(.custom-sticky-header) .custom-th[data-v-0b1ab970]{border-bottom:1px solid var(--color-border)}.custom-th.text-center[data-v-0b1ab970]{text-align:center;min-width:100px}.custom-th[data-v-0b1ab970]:first-child{border-left:none}.custom-td[data-v-0b1ab970]{border-bottom:1px solid var(--color-border);border-left:1px solid var(--color-border);padding:var(--cell-py) var(--cell-px)}.custom-td.text-center[data-v-0b1ab970]{text-align:center}.custom-td[data-v-0b1ab970]:first-child{border-left:none}.custom-group-row td[data-v-0b1ab970]{background-color:var(--color-gray-100);border-top:1px solid var(--color-border);border-bottom:1px solid var(--color-border)}.custom-entity-row[data-v-0b1ab970]{background-color:var(--color-background);transition:background-color .1s ease}.custom-entity-row[data-v-0b1ab970]:hover{background-color:var(--color-gray-50)}.custom-entity-row:last-child td[data-v-0b1ab970]{border-bottom:none}.custom-active-cell[data-v-0b1ab970]{cursor:pointer}.custom-active-cell[data-v-0b1ab970]:hover{background-color:var(--color-accent)}.button-group[data-v-ba735fac] button{align-self:stretch;height:auto!important;min-height:unset!important;min-width:unset!important;width:auto!important}.button-group[data-v-ba735fac]:not(.vertical-group) button{aspect-ratio:unset}.attached-group[data-v-ba735fac] button{position:relative;--radius: .375rem}.attached-group[data-v-ba735fac] button:focus-visible,.attached-group[data-v-ba735fac] button:hover{z-index:10}.attached-group[data-v-ba735fac]:not(.vertical-group) button:not(:first-child){margin-left:-1px}.attached-group[data-v-ba735fac]:not(.vertical-group) button:first-child{border-top-left-radius:var(--radius);border-bottom-left-radius:var(--radius);border-top-right-radius:0;border-bottom-right-radius:0}.attached-group[data-v-ba735fac]:not(.vertical-group) button:not(:first-child):not(:last-child){border-radius:0}.attached-group[data-v-ba735fac]:not(.vertical-group) button:last-child{border-top-right-radius:var(--radius);border-bottom-right-radius:var(--radius);border-top-left-radius:0;border-bottom-left-radius:0}.vertical-group[data-v-ba735fac] button:not(:first-child){margin-top:-1px}.vertical-group[data-v-ba735fac] button:first-child{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius);border-bottom-left-radius:0;border-bottom-right-radius:0}.vertical-group[data-v-ba735fac] button:not(:first-child):not(:last-child){border-radius:0}.vertical-group[data-v-ba735fac] button:last-child{border-bottom-left-radius:var(--radius);border-bottom-right-radius:var(--radius);border-top-left-radius:0;border-top-right-radius:0}.attached-group[data-v-ba735fac]:not(.vertical-group) button:not(:first-child):not(.border):before{content:"";position:absolute;left:0;top:0;bottom:0;width:1px;background-color:currentColor;opacity:.15;z-index:5;pointer-events:none;height:100%}.vertical-group[data-v-ba735fac] button:not(:first-child):not(.border):before{content:"";position:absolute;top:0;left:0;right:0;height:1px;width:100%;background-color:currentColor;opacity:.15;z-index:5;pointer-events:none}.toast-item[data-v-9c775c23]{will-change:transform,opacity;contain:layout style}.first-toast-enter-active[data-v-9c775c23]{animation:first-toast-in-9c775c23 .45s cubic-bezier(.23,1,.32,1) forwards}.first-toast-leave-active[data-v-9c775c23]{transition:all .25s ease-in}.first-toast-leave-to[data-v-9c775c23]{opacity:0;transform:scale(.98)}@keyframes first-toast-in-9c775c23{0%{opacity:var(--entrance-opacity, .6);transform:translateY(var(--entrance-offset, 25px)) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.stack-toast-enter-active[data-v-9c775c23],.stack-toast-leave-active[data-v-9c775c23]{transition:all .3s cubic-bezier(.16,1,.3,1)}.stack-toast-enter-from[data-v-9c775c23]{opacity:0;transform:scale(.95) translateY(10px)}.stack-toast-leave-to[data-v-9c775c23]{opacity:0;transform:scale(.95)}.stack-toast-move[data-v-9c775c23]{transition:transform .4s cubic-bezier(.16,1,.3,1)}.cp-item-transition[data-v-66b1ae06]{transition:background-color 80ms ease,color 80ms ease}.command-palette-content[data-v-1bae4c0f] ::-webkit-scrollbar{width:4px}.command-palette-content[data-v-1bae4c0f] ::-webkit-scrollbar-track{background:transparent}.command-palette-content[data-v-1bae4c0f] ::-webkit-scrollbar-thumb{background:var(--border);border-radius:9999px}.cp-scroll-container[data-v-1bae4c0f]{transform:translateZ(0);will-change:transform;touch-action:pan-y;backface-visibility:hidden}
973
972