@leavepulse/ui 0.14.8 → 0.14.10

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,106 @@
1
+ import { FileNode } from './fileTree';
2
+ export type { FileNode } from './fileTree';
3
+ /** Rolled-up stats for the ticked entries — what a backup picker summarises. */
4
+ export interface FileTreeSummary {
5
+ /** Ticked files (directories excluded — they're containers, not payload). */
6
+ files: number;
7
+ /** Ticked directories. */
8
+ dirs: number;
9
+ /** Total bytes across ticked files, or undefined when no size is known. */
10
+ bytes?: number;
11
+ /** `bytes` pre-formatted ("2.4 GB"), or "—". */
12
+ sizeLabel: string;
13
+ }
14
+ type __VLS_Props = {
15
+ nodes: FileNode[];
16
+ /** Selected node id (v-model:selected). */
17
+ selected?: string;
18
+ /** Expanded directory ids (v-model:expanded). Omit to let the tree own it. */
19
+ expanded?: string[];
20
+ /** Directory ids currently fetching children — shows a spinner on the row. */
21
+ loadingIds?: string[];
22
+ /**
23
+ * Multi-select mode: every row gets a tri-state checkbox and ticking a
24
+ * directory cascades to its loaded subtree. This is the mode for "pick what
25
+ * to back up" — `selected` stays independent (it's the highlighted row).
26
+ */
27
+ checkable?: boolean;
28
+ /** Ticked node ids (v-model:checked). */
29
+ checked?: string[];
30
+ /** Right-aligned size column (directories roll up their subtree). */
31
+ showSize?: boolean;
32
+ /** Right-aligned last-modified column. */
33
+ showModified?: boolean;
34
+ /** Directories first, then by name. Turn off to keep the caller's order. */
35
+ sort?: boolean;
36
+ /** Row icon size in px. */
37
+ iconSize?: number;
38
+ /** Skeleton rows while the initial listing loads. */
39
+ loading?: boolean;
40
+ skeletonRows?: number;
41
+ /** Empty-state copy when `nodes` is empty. */
42
+ emptyLabel?: string;
43
+ emptyDescription?: string;
44
+ };
45
+ type __VLS_Slots = {
46
+ /** Replace the row's label (icons, chevron and indent stay). */
47
+ row(props: {
48
+ node: FileNode;
49
+ depth: number;
50
+ expanded: boolean;
51
+ selected: boolean;
52
+ }): unknown;
53
+ /** Footer under the tree, handed the live selection stats. */
54
+ summary(props: FileTreeSummary): unknown;
55
+ };
56
+ /** Tick every node in the tree (skipping disabled ones). */
57
+ declare function checkAll(): void;
58
+ declare function clearChecked(): void;
59
+ /** Expand every ancestor of `id`, focus it and make it the selection. */
60
+ declare function reveal(id: string): void;
61
+ declare function expandAll(): void;
62
+ declare function collapseAll(): void;
63
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
64
+ reveal: typeof reveal;
65
+ expandAll: typeof expandAll;
66
+ collapseAll: typeof collapseAll;
67
+ checkAll: typeof checkAll;
68
+ clearChecked: typeof clearChecked;
69
+ summary: import('vue').ComputedRef<FileTreeSummary>;
70
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
71
+ expand: (node: FileNode) => any;
72
+ select: (node: FileNode) => any;
73
+ summary: (summary: FileTreeSummary) => any;
74
+ open: (node: FileNode) => any;
75
+ "update:selected": (id: string) => any;
76
+ "update:expanded": (ids: string[]) => any;
77
+ collapse: (node: FileNode) => any;
78
+ "update:checked": (ids: string[]) => any;
79
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
80
+ onExpand?: ((node: FileNode) => any) | undefined;
81
+ onSelect?: ((node: FileNode) => any) | undefined;
82
+ onSummary?: ((summary: FileTreeSummary) => any) | undefined;
83
+ onOpen?: ((node: FileNode) => any) | undefined;
84
+ "onUpdate:selected"?: ((id: string) => any) | undefined;
85
+ "onUpdate:expanded"?: ((ids: string[]) => any) | undefined;
86
+ onCollapse?: ((node: FileNode) => any) | undefined;
87
+ "onUpdate:checked"?: ((ids: string[]) => any) | undefined;
88
+ }>, {
89
+ sort: boolean;
90
+ loading: boolean;
91
+ skeletonRows: number;
92
+ iconSize: number;
93
+ checkable: boolean;
94
+ showSize: boolean;
95
+ showModified: boolean;
96
+ emptyLabel: string;
97
+ emptyDescription: string;
98
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
99
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
100
+ declare const _default: typeof __VLS_export;
101
+ export default _default;
102
+ type __VLS_WithSlots<T, S> = T & {
103
+ new (): {
104
+ $slots: S;
105
+ };
106
+ };
@@ -0,0 +1,4 @@
1
+ import { _ as _sfc_main } from "../chunks/LpFileTree-0Ko_uj8q.js";
2
+ export {
3
+ _sfc_main as default
4
+ };
@@ -0,0 +1,45 @@
1
+ import { FileNode } from './fileTree';
2
+ type __VLS_Props = {
3
+ node: FileNode;
4
+ /** Nesting depth, 0 at the root — drives the indent guide and aria-level. */
5
+ depth: number;
6
+ expanded: Set<string>;
7
+ loading: Set<string>;
8
+ selectedId?: string;
9
+ focusedId?: string;
10
+ sort: boolean;
11
+ /** Rendered size of the row's icon, in px. */
12
+ iconSize: number;
13
+ /** Render a tri-state checkbox per row (multi-select mode). */
14
+ checkable: boolean;
15
+ checked: Set<string>;
16
+ showSize: boolean;
17
+ showModified: boolean;
18
+ };
19
+ type __VLS_Slots = {
20
+ row(props: {
21
+ node: FileNode;
22
+ depth: number;
23
+ expanded: boolean;
24
+ selected: boolean;
25
+ }): unknown;
26
+ };
27
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
28
+ check: (node: FileNode, value: boolean) => any;
29
+ focus: (node: FileNode) => any;
30
+ select: (node: FileNode) => any;
31
+ toggle: (node: FileNode) => any;
32
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
33
+ onCheck?: ((node: FileNode, value: boolean) => any) | undefined;
34
+ onFocus?: ((node: FileNode) => any) | undefined;
35
+ onSelect?: ((node: FileNode) => any) | undefined;
36
+ onToggle?: ((node: FileNode) => any) | undefined;
37
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
38
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
39
+ declare const _default: typeof __VLS_export;
40
+ export default _default;
41
+ type __VLS_WithSlots<T, S> = T & {
42
+ new (): {
43
+ $slots: S;
44
+ };
45
+ };
@@ -0,0 +1,4 @@
1
+ import { _ as _sfc_main } from "../chunks/LpFileTreeNode-D3lNEP-1.js";
2
+ export {
3
+ _sfc_main as default
4
+ };
@@ -81,10 +81,10 @@ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {
81
81
  height: string;
82
82
  wrap: boolean;
83
83
  lineNumbers: boolean;
84
+ emptyLabel: string;
84
85
  showTime: boolean;
85
86
  showLevel: boolean;
86
87
  tail: boolean;
87
- emptyLabel: string;
88
88
  rowMenu: boolean;
89
89
  parse: boolean;
90
90
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
@@ -0,0 +1,54 @@
1
+ import { ContextMenuItemDef } from './LpContextMenu.vue';
2
+ export interface FileNode {
3
+ /** Stable identity — use the full path when you have one. */
4
+ id: string;
5
+ name: string;
6
+ /** Directories can hold `children`; files are leaves. */
7
+ kind: "file" | "dir";
8
+ /** Size in bytes. Shown right-aligned when `showSize` is on. */
9
+ size?: number;
10
+ /** Last-modified time — Date, epoch ms, or a pre-formatted string. */
11
+ modified?: Date | number | string;
12
+ /** Extra right-aligned text (badge-ish), e.g. "read-only". */
13
+ meta?: string;
14
+ /**
15
+ * Omit on a directory to mark its children as not-yet-loaded: the row shows a
16
+ * chevron and emits `expand` on first open so the caller can fetch them.
17
+ * An empty array means "loaded, and genuinely empty".
18
+ */
19
+ children?: FileNode[];
20
+ /** Override the type-derived icon. */
21
+ icon?: string;
22
+ /** Dimmed row (e.g. a git-ignored or unreadable entry). Still expandable. */
23
+ disabled?: boolean;
24
+ /** Right-click menu for this entry. */
25
+ menu?: ContextMenuItemDef[];
26
+ }
27
+ /** Icon for a node: explicit override → dir state → name → extension → generic. */
28
+ export declare function fileIcon(node: FileNode, expanded?: boolean): string;
29
+ /** Directories first, then case-insensitive by name — the file-manager order. */
30
+ export declare function sortNodes(nodes: FileNode[]): FileNode[];
31
+ /** Human-readable byte size — binary units, matching what file managers show. */
32
+ export declare function formatSize(bytes: number): string;
33
+ /** Short local date-time for the modified column; passes strings through. */
34
+ export declare function formatModified(value: Date | number | string): string;
35
+ /**
36
+ * Total size of a subtree: a directory's own `size` when the caller computed one
37
+ * (the common case for a server-side listing), otherwise the sum of its loaded
38
+ * descendants. Returns undefined when nothing along the way carries a size.
39
+ */
40
+ export declare function subtreeSize(node: FileNode): number | undefined;
41
+ /** Every id in a subtree including the root — the unit a checkbox toggles. */
42
+ export declare function subtreeIds(node: FileNode): string[];
43
+ export type CheckState = "checked" | "unchecked" | "indeterminate";
44
+ /**
45
+ * A node's checkbox state derived from the checked-id set.
46
+ *
47
+ * A directory reflects its loaded children: all checked → checked, some →
48
+ * indeterminate. A directory whose children aren't loaded yet (or which has
49
+ * none) falls back to its own membership, so an unexpanded folder can still be
50
+ * ticked as a whole — which is exactly what a backup picker needs.
51
+ */
52
+ export declare function checkStateOf(node: FileNode, checked: ReadonlySet<string>): CheckState;
53
+ /** Ids of every ancestor directory of `id`, so callers can reveal a deep node. */
54
+ export declare function ancestorIds(nodes: FileNode[], id: string): string[];
@@ -0,0 +1,155 @@
1
+ const EXT_ICONS = {
2
+ json: "lucide:file-json",
3
+ jsonc: "lucide:file-json",
4
+ yaml: "lucide:file-cog",
5
+ yml: "lucide:file-cog",
6
+ toml: "lucide:file-cog",
7
+ ini: "lucide:file-cog",
8
+ conf: "lucide:file-cog",
9
+ env: "lucide:file-key",
10
+ ts: "lucide:file-code",
11
+ tsx: "lucide:file-code",
12
+ js: "lucide:file-code",
13
+ mjs: "lucide:file-code",
14
+ cjs: "lucide:file-code",
15
+ vue: "lucide:file-code",
16
+ py: "lucide:file-code",
17
+ rs: "lucide:file-code",
18
+ go: "lucide:file-code",
19
+ sh: "lucide:file-terminal",
20
+ zsh: "lucide:file-terminal",
21
+ bash: "lucide:file-terminal",
22
+ md: "lucide:file-text",
23
+ mdx: "lucide:file-text",
24
+ txt: "lucide:file-text",
25
+ log: "lucide:scroll-text",
26
+ csv: "lucide:file-spreadsheet",
27
+ sql: "lucide:database",
28
+ png: "lucide:file-image",
29
+ jpg: "lucide:file-image",
30
+ jpeg: "lucide:file-image",
31
+ gif: "lucide:file-image",
32
+ svg: "lucide:file-image",
33
+ webp: "lucide:file-image",
34
+ ico: "lucide:file-image",
35
+ zip: "lucide:file-archive",
36
+ gz: "lucide:file-archive",
37
+ tar: "lucide:file-archive",
38
+ tgz: "lucide:file-archive",
39
+ xz: "lucide:file-archive",
40
+ pdf: "lucide:file-type",
41
+ lock: "lucide:file-lock",
42
+ pem: "lucide:file-key",
43
+ key: "lucide:file-key",
44
+ crt: "lucide:file-key"
45
+ };
46
+ const NAME_ICONS = {
47
+ ".env": "lucide:file-key",
48
+ ".gitignore": "lucide:git-branch",
49
+ ".dockerignore": "lucide:container",
50
+ dockerfile: "lucide:container",
51
+ "docker-compose.yml": "lucide:container",
52
+ "docker-compose.yaml": "lucide:container",
53
+ makefile: "lucide:file-cog",
54
+ "package.json": "lucide:package"
55
+ };
56
+ function fileIcon(node, expanded = false) {
57
+ if (node.icon) return node.icon;
58
+ if (node.kind === "dir") return expanded ? "lucide:folder-open" : "lucide:folder";
59
+ const lower = node.name.toLowerCase();
60
+ if (NAME_ICONS[lower]) return NAME_ICONS[lower];
61
+ const dot = lower.lastIndexOf(".");
62
+ const ext = dot > 0 ? lower.slice(dot + 1) : "";
63
+ return EXT_ICONS[ext] ?? "lucide:file";
64
+ }
65
+ function sortNodes(nodes) {
66
+ return [...nodes].sort((a, b) => {
67
+ if (a.kind !== b.kind) return a.kind === "dir" ? -1 : 1;
68
+ return a.name.localeCompare(b.name, void 0, { numeric: true, sensitivity: "base" });
69
+ });
70
+ }
71
+ function formatSize(bytes) {
72
+ if (!Number.isFinite(bytes) || bytes < 0) return "—";
73
+ if (bytes < 1024) return `${bytes} B`;
74
+ const units = ["KB", "MB", "GB", "TB", "PB"];
75
+ let value = bytes / 1024;
76
+ let i = 0;
77
+ while (value >= 1024 && i < units.length - 1) {
78
+ value /= 1024;
79
+ i++;
80
+ }
81
+ return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[i]}`;
82
+ }
83
+ function formatModified(value) {
84
+ if (typeof value === "string") return value;
85
+ const date = value instanceof Date ? value : new Date(value);
86
+ if (Number.isNaN(date.getTime())) return "—";
87
+ return date.toLocaleString(void 0, {
88
+ day: "2-digit",
89
+ month: "short",
90
+ hour: "2-digit",
91
+ minute: "2-digit"
92
+ });
93
+ }
94
+ function subtreeSize(node) {
95
+ if (node.kind === "file") return node.size;
96
+ if (node.size !== void 0) return node.size;
97
+ if (!node.children?.length) return void 0;
98
+ let total = 0;
99
+ let seen = false;
100
+ for (const child of node.children) {
101
+ const size = subtreeSize(child);
102
+ if (size !== void 0) {
103
+ total += size;
104
+ seen = true;
105
+ }
106
+ }
107
+ return seen ? total : void 0;
108
+ }
109
+ function subtreeIds(node) {
110
+ const out = [node.id];
111
+ for (const child of node.children ?? []) out.push(...subtreeIds(child));
112
+ return out;
113
+ }
114
+ function checkStateOf(node, checked) {
115
+ if (node.kind === "file" || !node.children?.length) {
116
+ return checked.has(node.id) ? "checked" : "unchecked";
117
+ }
118
+ let all = true;
119
+ let any = false;
120
+ for (const child of node.children) {
121
+ const state = checkStateOf(child, checked);
122
+ if (state === "checked") any = true;
123
+ else if (state === "indeterminate") {
124
+ any = true;
125
+ all = false;
126
+ } else all = false;
127
+ }
128
+ if (all) return "checked";
129
+ return any ? "indeterminate" : "unchecked";
130
+ }
131
+ function ancestorIds(nodes, id) {
132
+ const path = [];
133
+ function walk(list, trail) {
134
+ for (const node of list) {
135
+ if (node.id === id) {
136
+ path.push(...trail);
137
+ return true;
138
+ }
139
+ if (node.children && walk(node.children, [...trail, node.id])) return true;
140
+ }
141
+ return false;
142
+ }
143
+ walk(nodes, []);
144
+ return path;
145
+ }
146
+ export {
147
+ ancestorIds,
148
+ checkStateOf,
149
+ fileIcon,
150
+ formatModified,
151
+ formatSize,
152
+ sortNodes,
153
+ subtreeIds,
154
+ subtreeSize
155
+ };
package/dist/index.d.ts CHANGED
@@ -25,6 +25,10 @@ export { default as LpDrawer } from './components/LpDrawer.vue';
25
25
  export { default as LpDropdownMenu } from './components/LpDropdownMenu.vue';
26
26
  export type { MenuItem } from './components/LpDropdownMenu.vue';
27
27
  export { default as LpEmptyState } from './components/LpEmptyState.vue';
28
+ export { default as LpFileTree } from './components/LpFileTree.vue';
29
+ export type { FileTreeSummary } from './components/LpFileTree.vue';
30
+ export type { CheckState, FileNode } from './components/fileTree';
31
+ export { ancestorIds, checkStateOf, fileIcon, formatModified, formatSize, sortNodes, subtreeIds, subtreeSize, } from './components/fileTree';
28
32
  export { default as LpFormField } from './components/LpFormField.vue';
29
33
  export { default as LpIcon } from './components/LpIcon.vue';
30
34
  export { default as LpInfraNode } from './components/LpInfraNode.vue';
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import { _ as _6 } from "./chunks/LpBadge-CXzBPnwO.js";
7
7
  import { _ as _7 } from "./chunks/LpBreadcrumbs-B7Aqatzw.js";
8
8
  import { _ as _8 } from "./chunks/LpButton-5VXXCjwF.js";
9
9
  import { _ as _9 } from "./chunks/LpCalendar-B7ZL0ty3.js";
10
- import { _ as _10 } from "./chunks/LpCard-1yvWT9fx.js";
10
+ import { _ as _10 } from "./chunks/LpCard-BmrTvWOe.js";
11
11
  import { _ as _11 } from "./chunks/LpCheckbox-BO0zuuPh.js";
12
12
  import { _ as _12 } from "./chunks/LpCodeBlock-CSiOSPs8.js";
13
13
  import { default as default2 } from "./components/LpCommandPalette.vue.js";
@@ -19,45 +19,47 @@ import { _ as _17 } from "./chunks/LpDivider-CUX46KR0.js";
19
19
  import { _ as _18 } from "./chunks/LpDrawer-6n5Hd-iF.js";
20
20
  import { _ as _19 } from "./chunks/LpDropdownMenu-DJpoqRCb.js";
21
21
  import { _ as _20 } from "./chunks/LpEmptyState-CrfyRJUG.js";
22
- import { _ as _21 } from "./chunks/LpFormField-Bn-ZwC6z.js";
23
- import { _ as _22 } from "./chunks/LpIcon-CCnX5_2j.js";
24
- import { _ as _23 } from "./chunks/LpInfraNode-C_PHcthC.js";
25
- import { _ as _24 } from "./chunks/LpInput-BauZRyzm.js";
26
- import { _ as _25 } from "./chunks/LpLink-DHwOEp4e.js";
27
- import { _ as _26 } from "./chunks/LpLogViewer-BBgaY38i.js";
28
- import { _ as _27 } from "./chunks/LpModal-B9CVVC5U.js";
29
- import { _ as _28 } from "./chunks/LpNotificationBell-B9VHks_D.js";
30
- import { _ as _29 } from "./chunks/LpNumberField-C5ar-OwE.js";
31
- import { _ as _30 } from "./chunks/LpOtpInput-DqaT0Z75.js";
32
- import { _ as _31 } from "./chunks/LpPagination-CeGuNe_q.js";
33
- import { _ as _32 } from "./chunks/LpPasswordInput-DIHFw4u0.js";
34
- import { _ as _33 } from "./chunks/LpPhoneInput-LQvVFGMw.js";
22
+ import { _ as _21 } from "./chunks/LpFileTree-0Ko_uj8q.js";
23
+ import { ancestorIds, checkStateOf, fileIcon, formatModified, formatSize, sortNodes, subtreeIds, subtreeSize } from "./components/fileTree.js";
24
+ import { _ as _22 } from "./chunks/LpFormField-Bn-ZwC6z.js";
25
+ import { _ as _23 } from "./chunks/LpIcon-CCnX5_2j.js";
26
+ import { _ as _24 } from "./chunks/LpInfraNode-C_PHcthC.js";
27
+ import { _ as _25 } from "./chunks/LpInput-BauZRyzm.js";
28
+ import { _ as _26 } from "./chunks/LpLink-DHwOEp4e.js";
29
+ import { _ as _27 } from "./chunks/LpLogViewer-BBgaY38i.js";
30
+ import { _ as _28 } from "./chunks/LpModal-B9CVVC5U.js";
31
+ import { _ as _29 } from "./chunks/LpNotificationBell-B9VHks_D.js";
32
+ import { _ as _30 } from "./chunks/LpNumberField-C5ar-OwE.js";
33
+ import { _ as _31 } from "./chunks/LpOtpInput-DqaT0Z75.js";
34
+ import { _ as _32 } from "./chunks/LpPagination-CeGuNe_q.js";
35
+ import { _ as _33 } from "./chunks/LpPasswordInput-DIHFw4u0.js";
36
+ import { _ as _34 } from "./chunks/LpPhoneInput-LQvVFGMw.js";
35
37
  import { flagEmoji, loadCountries, matchCountryByValue } from "./components/countries.js";
36
- import { _ as _34 } from "./chunks/LpPopover-8268UmlC.js";
37
- import { _ as _35 } from "./chunks/LpProgress-BhI0IbjC.js";
38
- import { _ as _36 } from "./chunks/LpRadio-CL-pI0_O.js";
39
- import { _ as _37 } from "./chunks/LpRadioGroup-B4yDTmi6.js";
40
- import { _ as _38 } from "./chunks/LpScrollArea-BtnZCCBT.js";
41
- import { _ as _39 } from "./chunks/LpSegmented-BmpanyAo.js";
42
- import { _ as _40 } from "./chunks/LpSelect-DznhPEWX.js";
43
- import { _ as _41 } from "./chunks/LpServiceNode-Dc-Ut5RS.js";
44
- import { _ as _42 } from "./chunks/LpSidebar-tZ2z-PnM.js";
45
- import { _ as _43 } from "./chunks/LpSkeleton-eSFIo4kD.js";
46
- import { _ as _44 } from "./chunks/LpSlider-B1SF3pRV.js";
47
- import { _ as _45 } from "./chunks/LpStat-CdbEFOvn.js";
48
- import { _ as _46 } from "./chunks/LpStepper-5dFTrW21.js";
49
- import { _ as _47 } from "./chunks/LpSwitch-v6fnccSM.js";
50
- import { _ as _48 } from "./chunks/LpTable-CzHVcr3v.js";
51
- import { _ as _49 } from "./chunks/LpTableOfContents-CjvxPMpU.js";
52
- import { _ as _50 } from "./chunks/LpTabs-D7aTVPOb.js";
53
- import { _ as _51 } from "./chunks/LpTextarea-CRAkhemZ.js";
38
+ import { _ as _35 } from "./chunks/LpPopover-8268UmlC.js";
39
+ import { _ as _36 } from "./chunks/LpProgress-BhI0IbjC.js";
40
+ import { _ as _37 } from "./chunks/LpRadio-CL-pI0_O.js";
41
+ import { _ as _38 } from "./chunks/LpRadioGroup-B4yDTmi6.js";
42
+ import { _ as _39 } from "./chunks/LpScrollArea-BtnZCCBT.js";
43
+ import { _ as _40 } from "./chunks/LpSegmented-BmpanyAo.js";
44
+ import { _ as _41 } from "./chunks/LpSelect-DznhPEWX.js";
45
+ import { _ as _42 } from "./chunks/LpServiceNode-Dc-Ut5RS.js";
46
+ import { _ as _43 } from "./chunks/LpSidebar-tZ2z-PnM.js";
47
+ import { _ as _44 } from "./chunks/LpSkeleton-eSFIo4kD.js";
48
+ import { _ as _45 } from "./chunks/LpSlider-B1SF3pRV.js";
49
+ import { _ as _46 } from "./chunks/LpStat-CdbEFOvn.js";
50
+ import { _ as _47 } from "./chunks/LpStepper-5dFTrW21.js";
51
+ import { _ as _48 } from "./chunks/LpSwitch-v6fnccSM.js";
52
+ import { _ as _49 } from "./chunks/LpTable-CzHVcr3v.js";
53
+ import { _ as _50 } from "./chunks/LpTableOfContents-CjvxPMpU.js";
54
+ import { _ as _51 } from "./chunks/LpTabs-D7aTVPOb.js";
55
+ import { _ as _52 } from "./chunks/LpTextarea-CRAkhemZ.js";
54
56
  import { p as presets, a as parseTheme, s as serializeTheme } from "./chunks/LpThemeSwitcher-BgWwfkxs.js";
55
- import { D, _ as _52, b, c, d, e, f, l, g, h, n, r, t, i, u, v } from "./chunks/LpThemeSwitcher-BgWwfkxs.js";
56
- import { _ as _53 } from "./chunks/LpTilt-DuyKbpkA.js";
57
- import { _ as _54 } from "./chunks/LpToaster-gDB1EaU3.js";
58
- import { _ as _55 } from "./chunks/LpTooltip-CIwoRCag.js";
59
- import { _ as _56 } from "./chunks/LpTopologyCanvas-DVwyQfKa.js";
60
- import { _ as _57 } from "./chunks/LpUptimeBar-CB366k0O.js";
57
+ import { D, _ as _53, b, c, d, e, f, l, g, h, n, r, t, i, u, v } from "./chunks/LpThemeSwitcher-BgWwfkxs.js";
58
+ import { _ as _54 } from "./chunks/LpTilt-DuyKbpkA.js";
59
+ import { _ as _55 } from "./chunks/LpToaster-gDB1EaU3.js";
60
+ import { _ as _56 } from "./chunks/LpTooltip-CIwoRCag.js";
61
+ import { _ as _57 } from "./chunks/LpTopologyCanvas-DVwyQfKa.js";
62
+ import { _ as _58 } from "./chunks/LpUptimeBar-CB366k0O.js";
61
63
  import { deserializeLayout, serializeLayout } from "./layout/tree.js";
62
64
  import { addLeaf, addTab, countBlocks, countLeaves, makeLayout, moveLeaf, removeBlock, removeLeaf, reorderTab, resizeAt, setActiveTab } from "./layout/tree.js";
63
65
  import { blockTitle, defineBlocks } from "./layout/registry.js";
@@ -118,58 +120,64 @@ export {
118
120
  _18 as LpDrawer,
119
121
  _19 as LpDropdownMenu,
120
122
  _20 as LpEmptyState,
121
- _21 as LpFormField,
122
- _22 as LpIcon,
123
- _23 as LpInfraNode,
124
- _24 as LpInput,
125
- _25 as LpLink,
126
- _26 as LpLogViewer,
127
- _27 as LpModal,
128
- _28 as LpNotificationBell,
129
- _29 as LpNumberField,
130
- _30 as LpOtpInput,
131
- _31 as LpPagination,
132
- _32 as LpPasswordInput,
133
- _33 as LpPhoneInput,
134
- _34 as LpPopover,
135
- _35 as LpProgress,
136
- _36 as LpRadio,
137
- _37 as LpRadioGroup,
138
- _38 as LpScrollArea,
139
- _39 as LpSegmented,
140
- _40 as LpSelect,
141
- _41 as LpServiceNode,
142
- _42 as LpSidebar,
143
- _43 as LpSkeleton,
144
- _44 as LpSlider,
145
- _45 as LpStat,
146
- _46 as LpStepper,
147
- _47 as LpSwitch,
148
- _48 as LpTable,
149
- _49 as LpTableOfContents,
150
- _50 as LpTabs,
151
- _51 as LpTextarea,
152
- _52 as LpThemeSwitcher,
153
- _53 as LpTilt,
154
- _54 as LpToaster,
155
- _55 as LpTooltip,
156
- _56 as LpTopologyCanvas,
157
- _57 as LpUptimeBar,
123
+ _21 as LpFileTree,
124
+ _22 as LpFormField,
125
+ _23 as LpIcon,
126
+ _24 as LpInfraNode,
127
+ _25 as LpInput,
128
+ _26 as LpLink,
129
+ _27 as LpLogViewer,
130
+ _28 as LpModal,
131
+ _29 as LpNotificationBell,
132
+ _30 as LpNumberField,
133
+ _31 as LpOtpInput,
134
+ _32 as LpPagination,
135
+ _33 as LpPasswordInput,
136
+ _34 as LpPhoneInput,
137
+ _35 as LpPopover,
138
+ _36 as LpProgress,
139
+ _37 as LpRadio,
140
+ _38 as LpRadioGroup,
141
+ _39 as LpScrollArea,
142
+ _40 as LpSegmented,
143
+ _41 as LpSelect,
144
+ _42 as LpServiceNode,
145
+ _43 as LpSidebar,
146
+ _44 as LpSkeleton,
147
+ _45 as LpSlider,
148
+ _46 as LpStat,
149
+ _47 as LpStepper,
150
+ _48 as LpSwitch,
151
+ _49 as LpTable,
152
+ _50 as LpTableOfContents,
153
+ _51 as LpTabs,
154
+ _52 as LpTextarea,
155
+ _53 as LpThemeSwitcher,
156
+ _54 as LpTilt,
157
+ _55 as LpToaster,
158
+ _56 as LpTooltip,
159
+ _57 as LpTopologyCanvas,
160
+ _58 as LpUptimeBar,
158
161
  UI_CONFIG_VERSION,
159
162
  addLeaf,
160
163
  addTab,
161
164
  b as amber,
165
+ ancestorIds,
162
166
  c as applyTheme,
163
167
  d as applyThemeWithTransition,
164
168
  blockTitle,
165
169
  e as bootstrapTheme,
170
+ checkStateOf,
166
171
  countBlocks,
167
172
  countLeaves,
168
173
  f as dark,
169
174
  defineBlocks,
170
175
  defineTheme,
171
176
  deserializeLayout,
177
+ fileIcon,
172
178
  flagEmoji,
179
+ formatModified,
180
+ formatSize,
173
181
  l as leavepulse,
174
182
  g as light,
175
183
  h as lime,
@@ -190,6 +198,9 @@ export {
190
198
  serializeLayout,
191
199
  serializeTheme,
192
200
  setActiveTab,
201
+ sortNodes,
202
+ subtreeIds,
203
+ subtreeSize,
193
204
  t as themeToCssRule,
194
205
  i as themeToCssVars,
195
206
  useInputFilter,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leavepulse/ui",
3
- "version": "0.14.8",
3
+ "version": "0.14.10",
4
4
  "type": "module",
5
5
  "description": "LeavePulse token-driven Vue component kit.",
6
6
  "repository": {
@@ -31,7 +31,7 @@
31
31
  "./dist/*": "./dist/*"
32
32
  },
33
33
  "publishConfig": {
34
- "registry": "https://npm.pkg.github.com"
34
+ "registry": "https://registry.npmjs.org"
35
35
  },
36
36
  "sideEffects": [
37
37
  "**/*.css",
@@ -24,6 +24,8 @@ export const COMPONENT_NAMES = [
24
24
  "LpDrawer",
25
25
  "LpDropdownMenu",
26
26
  "LpEmptyState",
27
+ "LpFileTree",
28
+ "LpFileTreeNode",
27
29
  "LpFormField",
28
30
  "LpIcon",
29
31
  "LpInfraNode",