@deftui/react 0.3.0 → 0.3.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.
Files changed (35) hide show
  1. package/dist/index.d.mts +4 -3
  2. package/dist/index.mjs +2 -3
  3. package/dist/vendor/README.md +4 -2
  4. package/dist/vendor/coss/calendar.mjs +2 -0
  5. package/dist/vendor/coss/card.d.mts +0 -6
  6. package/dist/vendor/coss/card.mjs +1 -68
  7. package/dist/vendor/reui.io/cascader/cascader-async.d.mts +20 -0
  8. package/dist/vendor/reui.io/cascader/cascader-async.mjs +578 -0
  9. package/dist/vendor/reui.io/cascader/cascader-context.d.mts +12 -0
  10. package/dist/vendor/reui.io/cascader/cascader-context.mjs +56 -0
  11. package/dist/vendor/reui.io/cascader/cascader-footer.d.mts +60 -0
  12. package/dist/vendor/reui.io/cascader/cascader-footer.mjs +445 -0
  13. package/dist/vendor/reui.io/cascader/cascader-i18n.mjs +64 -0
  14. package/dist/vendor/reui.io/cascader/cascader-item.d.mts +92 -0
  15. package/dist/vendor/reui.io/cascader/cascader-item.mjs +533 -0
  16. package/dist/vendor/reui.io/cascader/cascader-lib.d.mts +3 -0
  17. package/dist/vendor/reui.io/cascader/cascader-lib.mjs +688 -0
  18. package/dist/vendor/reui.io/cascader/cascader-nav.d.mts +56 -0
  19. package/dist/vendor/reui.io/cascader/cascader-nav.mjs +310 -0
  20. package/dist/vendor/reui.io/cascader/cascader-types.d.mts +140 -0
  21. package/dist/vendor/reui.io/cascader/cascader-virtual.d.mts +18 -0
  22. package/dist/vendor/reui.io/cascader/cascader-virtual.mjs +159 -0
  23. package/dist/vendor/reui.io/cascader/cascader.d.mts +299 -0
  24. package/dist/vendor/reui.io/cascader/cascader.mjs +1470 -0
  25. package/dist/vendor/reui.io/frame.d.mts +22 -0
  26. package/dist/vendor/reui.io/frame.mjs +106 -0
  27. package/dist/vendor/reui.io/timeline.d.mts +21 -0
  28. package/dist/vendor/reui.io/timeline.mjs +127 -0
  29. package/dist/widgets/datetime.mjs +0 -5
  30. package/dist/widgets/export.d.mts +28 -0
  31. package/dist/widgets/index.d.mts +64 -19
  32. package/dist/widgets/index.mjs +54 -10
  33. package/package.json +2 -2
  34. package/dist/vendor/tailored/file-tree.d.mts +0 -21
  35. package/dist/vendor/tailored/file-tree.mjs +0 -146
@@ -1,21 +0,0 @@
1
- import * as React$1 from "react";
2
- export type FileTreeNode = {
3
- id: string;
4
- name: string;
5
- kind?: "file" | "folder";
6
- children?: FileTreeNode[];
7
- meta?: React$1.ReactNode;
8
- icon?: React$1.ReactNode;
9
- };
10
- export type FileTreeProps = Omit<React$1.HTMLAttributes<HTMLDivElement>, "children" | "onSelect"> & {
11
- nodes: FileTreeNode[];
12
- expandedIds?: string[];
13
- defaultExpandedIds?: string[];
14
- onExpandedChange?: (ids: string[]) => void;
15
- selectedId?: string | null;
16
- defaultSelectedId?: string | null;
17
- onSelect?: (node: FileTreeNode) => void;
18
- label?: string;
19
- };
20
- /** https://ui.tinkererslabs.com/docs/components/file-tree/ */
21
- export declare function FileTree({ nodes, expandedIds, defaultExpandedIds, onExpandedChange, selectedId, defaultSelectedId, onSelect, label, className, ...rootProps }: FileTreeProps): React$1.JSX.Element;
@@ -1,146 +0,0 @@
1
- "use client";
2
- import { cn } from "../shadcn/lib/utils.mjs";
3
- import * as React$1 from "react";
4
- import { jsx, jsxs } from "react/jsx-runtime";
5
- import { ChevronRight, File, Folder, FolderOpen } from "lucide-react";
6
- // src/vendor/tailored/file-tree.tsx
7
- function isFolder(node) {
8
- return node.kind === "folder" || Array.isArray(node.children);
9
- }
10
- function flatten(nodes, expanded, level = 1) {
11
- return nodes.flatMap((node) => {
12
- const folder = isFolder(node);
13
- const open = folder && expanded.has(node.id);
14
- const self = {
15
- node,
16
- level,
17
- isFolder: folder,
18
- isExpanded: open
19
- };
20
- if (!open || !node.children) return [self];
21
- return [self, ...flatten(node.children, expanded, level + 1)];
22
- });
23
- }
24
- /** https://ui.tinkererslabs.com/docs/components/file-tree/ */
25
- function FileTree({ nodes, expandedIds, defaultExpandedIds = [], onExpandedChange, selectedId, defaultSelectedId = null, onSelect, label = "Files", className, ...rootProps }) {
26
- const [uncontrolledExpanded, setUncontrolledExpanded] = React$1.useState(defaultExpandedIds);
27
- const [uncontrolledSelected, setUncontrolledSelected] = React$1.useState(defaultSelectedId);
28
- const expandedList = expandedIds ?? uncontrolledExpanded;
29
- const expanded = React$1.useMemo(() => new Set(expandedList), [expandedList]);
30
- const selected = selectedId === void 0 ? uncontrolledSelected : selectedId;
31
- const rows = React$1.useMemo(() => flatten(nodes, expanded), [nodes, expanded]);
32
- const containerRef = React$1.useRef(null);
33
- const setExpanded = (ids) => {
34
- if (expandedIds === void 0) setUncontrolledExpanded(ids);
35
- onExpandedChange?.(ids);
36
- };
37
- const toggle = (id, open) => {
38
- const shouldOpen = open ?? !expanded.has(id);
39
- if (shouldOpen === expanded.has(id)) return;
40
- setExpanded(shouldOpen ? [...expandedList, id] : expandedList.filter((entry) => entry !== id));
41
- };
42
- const select = (node) => {
43
- if (selectedId === void 0) setUncontrolledSelected(node.id);
44
- onSelect?.(node);
45
- };
46
- const focusRow = (index) => {
47
- const target = rows[index];
48
- if (!target) return;
49
- containerRef.current?.querySelector(`[data-node="${CSS.escape(target.node.id)}"]`)?.focus();
50
- };
51
- const onKeyDown = (event, row, index) => {
52
- switch (event.key) {
53
- case "ArrowDown":
54
- event.preventDefault();
55
- focusRow(Math.min(index + 1, rows.length - 1));
56
- break;
57
- case "ArrowUp":
58
- event.preventDefault();
59
- focusRow(Math.max(index - 1, 0));
60
- break;
61
- case "ArrowRight":
62
- event.preventDefault();
63
- if (row.isFolder && !row.isExpanded) toggle(row.node.id, true);
64
- else if (row.isFolder) focusRow(index + 1);
65
- break;
66
- case "ArrowLeft": {
67
- event.preventDefault();
68
- if (row.isFolder && row.isExpanded) {
69
- toggle(row.node.id, false);
70
- break;
71
- }
72
- const parent = rows.slice(0, index).reverse().findIndex((entry) => entry.level < row.level);
73
- if (parent >= 0) focusRow(index - 1 - parent);
74
- break;
75
- }
76
- case "Home":
77
- event.preventDefault();
78
- focusRow(0);
79
- break;
80
- case "End":
81
- event.preventDefault();
82
- focusRow(rows.length - 1);
83
- break;
84
- case "Enter":
85
- case " ":
86
- event.preventDefault();
87
- if (row.isFolder) toggle(row.node.id);
88
- select(row.node);
89
- }
90
- };
91
- const activeIndex = Math.max(rows.findIndex((row) => row.node.id === selected), 0);
92
- return /* @__PURE__ */ jsx("div", {
93
- ref: containerRef,
94
- "data-slot": "file-tree",
95
- className: cn("border-border bg-card text-card-foreground rounded-[var(--radius)] border p-1.5", className),
96
- ...rootProps,
97
- children: /* @__PURE__ */ jsx("div", {
98
- role: "tree",
99
- "aria-label": label,
100
- children: rows.map((row, index) => {
101
- const isSelected = row.node.id === selected;
102
- const Icon = row.isFolder ? row.isExpanded ? FolderOpen : Folder : File;
103
- return /* @__PURE__ */ jsxs("div", {
104
- role: "treeitem",
105
- "data-node": row.node.id,
106
- "data-slot": "file-tree-item",
107
- "aria-level": row.level,
108
- "aria-selected": isSelected,
109
- "aria-expanded": row.isFolder ? row.isExpanded : void 0,
110
- tabIndex: index === activeIndex ? 0 : -1,
111
- className: cn("focus-visible:ring-ring flex min-h-9 cursor-default items-center gap-1.5 rounded-[calc(var(--radius)-0.35rem)] pr-2 text-sm focus-visible:ring-2 focus-visible:outline-none", isSelected ? "bg-muted font-semibold" : "hover:bg-muted/60 transition-colors duration-150 motion-reduce:transition-none"),
112
- style: { paddingLeft: `${(row.level - 1) * .85 + .35}rem` },
113
- onClick: () => {
114
- if (row.isFolder) toggle(row.node.id);
115
- select(row.node);
116
- },
117
- onKeyDown: (event) => onKeyDown(event, row, index),
118
- children: [
119
- /* @__PURE__ */ jsx("span", {
120
- className: "flex size-4 shrink-0 items-center justify-center",
121
- children: row.isFolder ? /* @__PURE__ */ jsx(ChevronRight, {
122
- "aria-hidden": "true",
123
- size: 13,
124
- className: cn("text-muted-foreground transition-transform duration-150 motion-reduce:transition-none", row.isExpanded && "rotate-90")
125
- }) : null
126
- }),
127
- /* @__PURE__ */ jsx("span", {
128
- "aria-hidden": "true",
129
- className: "text-muted-foreground shrink-0",
130
- children: row.node.icon ?? /* @__PURE__ */ jsx(Icon, { size: 15 })
131
- }),
132
- /* @__PURE__ */ jsx("span", {
133
- className: "min-w-0 flex-1 truncate",
134
- children: row.node.name
135
- }),
136
- row.node.meta ? /* @__PURE__ */ jsx("span", {
137
- className: "text-muted-foreground shrink-0 text-xs",
138
- children: row.node.meta
139
- }) : null
140
- ]
141
- }, row.node.id);
142
- })
143
- })
144
- });
145
- }
146
- export { FileTree };