@hanzo/ui 8.27.14 → 8.27.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +19 -0
- package/dist/agents/Attachments.cjs +29 -0
- package/dist/agents/Attachments.d.ts +31 -0
- package/dist/agents/Attachments.d.ts.map +1 -0
- package/dist/agents/Attachments.js +27 -0
- package/dist/agents/Attachments.js.map +1 -0
- package/dist/agents/Choice.cjs +47 -0
- package/dist/agents/Choice.d.ts +34 -0
- package/dist/agents/Choice.d.ts.map +1 -0
- package/dist/agents/Choice.js +44 -0
- package/dist/agents/Choice.js.map +1 -0
- package/dist/agents/Console.cjs +106 -0
- package/dist/agents/Console.d.ts +54 -0
- package/dist/agents/Console.d.ts.map +1 -0
- package/dist/agents/Console.js +104 -0
- package/dist/agents/Console.js.map +1 -0
- package/dist/agents/Feedback.cjs +50 -0
- package/dist/agents/Feedback.d.ts +25 -0
- package/dist/agents/Feedback.d.ts.map +1 -0
- package/dist/agents/Feedback.js +48 -0
- package/dist/agents/Feedback.js.map +1 -0
- package/dist/agents/FileTabs.cjs +63 -0
- package/dist/agents/FileTabs.d.ts +45 -0
- package/dist/agents/FileTabs.d.ts.map +1 -0
- package/dist/agents/FileTabs.js +61 -0
- package/dist/agents/FileTabs.js.map +1 -0
- package/dist/agents/FileTree.cjs +160 -0
- package/dist/agents/FileTree.d.ts +41 -0
- package/dist/agents/FileTree.d.ts.map +1 -0
- package/dist/agents/FileTree.js +157 -0
- package/dist/agents/FileTree.js.map +1 -0
- package/dist/agents/PreviewFrame.cjs +108 -0
- package/dist/agents/PreviewFrame.d.ts +78 -0
- package/dist/agents/PreviewFrame.d.ts.map +1 -0
- package/dist/agents/PreviewFrame.js +105 -0
- package/dist/agents/PreviewFrame.js.map +1 -0
- package/dist/agents/Suggestions.cjs +29 -0
- package/dist/agents/Suggestions.d.ts +28 -0
- package/dist/agents/Suggestions.d.ts.map +1 -0
- package/dist/agents/Suggestions.js +26 -0
- package/dist/agents/Suggestions.js.map +1 -0
- package/dist/agents/Workspace.cjs +103 -0
- package/dist/agents/Workspace.d.ts +104 -0
- package/dist/agents/Workspace.d.ts.map +1 -0
- package/dist/agents/Workspace.js +98 -0
- package/dist/agents/Workspace.js.map +1 -0
- package/dist/agents/bridge.cjs +201 -0
- package/dist/agents/bridge.d.ts +102 -0
- package/dist/agents/bridge.d.ts.map +1 -0
- package/dist/agents/bridge.js +197 -0
- package/dist/agents/bridge.js.map +1 -0
- package/dist/agents/index.cjs +64 -1
- package/dist/agents/index.d.ts +23 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +23 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/log.cjs +75 -0
- package/dist/agents/log.d.ts +58 -0
- package/dist/agents/log.d.ts.map +1 -0
- package/dist/agents/log.js +65 -0
- package/dist/agents/log.js.map +1 -0
- package/dist/agents/tree.cjs +238 -0
- package/dist/agents/tree.d.ts +99 -0
- package/dist/agents/tree.d.ts.map +1 -0
- package/dist/agents/tree.js +226 -0
- package/dist/agents/tree.js.map +1 -0
- package/dist/backends/gui/3d-card.d.ts +6 -6
- package/dist/backends/gui/3d-marquee.d.ts +7 -8
- package/dist/backends/gui/3d-marquee.d.ts.map +1 -1
- package/dist/backends/gui/3d-pin.d.ts +1 -1
- package/dist/backends/gui/alert.d.ts +3 -3
- package/dist/backends/gui/android.d.ts +1 -1
- package/dist/backends/gui/animated-testimonials.d.ts +1 -1
- package/dist/backends/gui/animated-tooltip.d.ts +1 -1
- package/dist/backends/gui/announcement.d.ts +1 -1
- package/dist/backends/gui/banner.d.ts +1 -1
- package/dist/backends/gui/button.d.ts +1 -1
- package/dist/backends/gui/card.d.ts +7 -7
- package/dist/backends/gui/code-editor.cjs +2 -2
- package/dist/backends/gui/code-editor.d.ts +7 -1
- package/dist/backends/gui/code-editor.d.ts.map +1 -1
- package/dist/backends/gui/code-editor.js +2 -2
- package/dist/backends/gui/code-editor.js.map +1 -1
- package/dist/backends/gui/command.d.ts +5 -5
- package/dist/backends/gui/command.d.ts.map +1 -1
- package/dist/backends/gui/context-menu.d.ts +14 -14
- package/dist/backends/gui/context-menu.d.ts.map +1 -1
- package/dist/backends/gui/credit-card.d.ts +1 -1
- package/dist/backends/gui/desktop.d.ts +1 -1
- package/dist/backends/gui/dock.d.ts +3 -3
- package/dist/backends/gui/dropdown-menu.d.ts +16 -16
- package/dist/backends/gui/dropdown-menu.d.ts.map +1 -1
- package/dist/backends/gui/empty.d.ts +6 -6
- package/dist/backends/gui/field.d.ts +3 -3
- package/dist/backends/gui/gantt.d.ts +1 -1
- package/dist/backends/gui/grid-pattern.d.ts +1 -2
- package/dist/backends/gui/grid-pattern.d.ts.map +1 -1
- package/dist/backends/gui/image-zoom.d.ts +1 -1
- package/dist/backends/gui/iphone-15-pro.d.ts +1 -1
- package/dist/backends/gui/item.d.ts +9 -9
- package/dist/backends/gui/list.d.ts +2 -2
- package/dist/backends/gui/macos-dock.d.ts +2 -2
- package/dist/backends/gui/magnetic.d.ts +1 -1
- package/dist/backends/gui/marquee.d.ts +1 -15
- package/dist/backends/gui/marquee.d.ts.map +1 -1
- package/dist/backends/gui/menu-dock.d.ts +1 -1
- package/dist/backends/gui/menubar.d.ts +15 -15
- package/dist/backends/gui/menubar.d.ts.map +1 -1
- package/dist/backends/gui/message-dock.d.ts +1 -1
- package/dist/backends/gui/motion-highlight.d.ts +1 -12
- package/dist/backends/gui/motion-highlight.d.ts.map +1 -1
- package/dist/backends/gui/pagination.d.ts +4 -4
- package/dist/backends/gui/qr-code.d.ts +1 -2
- package/dist/backends/gui/qr-code.d.ts.map +1 -1
- package/dist/backends/gui/scroll-area.d.ts +3 -14
- package/dist/backends/gui/scroll-area.d.ts.map +1 -1
- package/dist/backends/gui/sheet.d.ts +3 -3
- package/dist/backends/gui/sheet.d.ts.map +1 -1
- package/dist/backends/gui/status.d.ts +1 -1
- package/dist/backends/gui/table.d.ts +8 -8
- package/dist/backends/gui/toaster.d.ts +1 -15
- package/dist/backends/gui/toaster.d.ts.map +1 -1
- package/dist/backends/gui/toggle.d.ts +1 -1
- package/dist/backends/gui/video-player.d.ts +1 -1
- package/dist/chat/Composer.cjs +60 -9
- package/dist/chat/Composer.d.ts +42 -2
- package/dist/chat/Composer.d.ts.map +1 -1
- package/dist/chat/Composer.js +61 -11
- package/dist/chat/Composer.js.map +1 -1
- package/dist/chat/EmptyPrompt.cjs +27 -0
- package/dist/chat/EmptyPrompt.d.ts +30 -0
- package/dist/chat/EmptyPrompt.d.ts.map +1 -0
- package/dist/chat/EmptyPrompt.js +24 -0
- package/dist/chat/EmptyPrompt.js.map +1 -0
- package/dist/chat/SessionRail.cjs +97 -0
- package/dist/chat/SessionRail.d.ts +97 -0
- package/dist/chat/SessionRail.d.ts.map +1 -0
- package/dist/chat/SessionRail.js +94 -0
- package/dist/chat/SessionRail.js.map +1 -0
- package/dist/chat/Thread.d.ts +2 -8
- package/dist/chat/Thread.d.ts.map +1 -1
- package/dist/chat/index.cjs +8 -1
- package/dist/chat/index.d.ts +3 -1
- package/dist/chat/index.d.ts.map +1 -1
- package/dist/chat/index.js +3 -1
- package/dist/chat/index.js.map +1 -1
- package/dist/gallery.cjs +28 -1
- package/dist/gallery.d.ts.map +1 -1
- package/dist/gallery.html +71 -3
- package/dist/gallery.js +30 -3
- package/dist/gallery.js.map +1 -1
- package/dist/product/BranchSelect.cjs +27 -0
- package/dist/product/BranchSelect.d.ts +27 -0
- package/dist/product/BranchSelect.d.ts.map +1 -0
- package/dist/product/BranchSelect.js +23 -0
- package/dist/product/BranchSelect.js.map +1 -0
- package/dist/product/ChipSelect.cjs +267 -0
- package/dist/product/ChipSelect.d.ts +71 -0
- package/dist/product/ChipSelect.d.ts.map +1 -0
- package/dist/product/ChipSelect.js +265 -0
- package/dist/product/ChipSelect.js.map +1 -0
- package/dist/product/RepoSelect.cjs +75 -0
- package/dist/product/RepoSelect.d.ts +63 -0
- package/dist/product/RepoSelect.d.ts.map +1 -0
- package/dist/product/RepoSelect.js +69 -0
- package/dist/product/RepoSelect.js.map +1 -0
- package/dist/product/chipSelect.logic.cjs +147 -0
- package/dist/product/chipSelect.logic.d.ts +92 -0
- package/dist/product/chipSelect.logic.d.ts.map +1 -0
- package/dist/product/chipSelect.logic.js +138 -0
- package/dist/product/chipSelect.logic.js.map +1 -0
- package/dist/product/index.cjs +23 -1
- package/dist/product/index.d.ts +4 -0
- package/dist/product/index.d.ts.map +1 -1
- package/dist/product/index.js +7 -0
- package/dist/product/index.js.map +1 -1
- package/dist/styles.css +68 -0
- package/package.json +2 -4
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* tree — a repository's files as the rows a tree draws, and the keys that move
|
|
4
|
+
* through them.
|
|
5
|
+
*
|
|
6
|
+
* Ported from build-v2 `components/editor/file-tree/tree.ts` (MIT, derived from
|
|
7
|
+
* OSW Studio and DeepSite — see NOTICE). v2 grouped a flat list of pages; a
|
|
8
|
+
* repository is read one directory at a time (`/tree?path=` answers a level,
|
|
9
|
+
* not the whole checkout), so the shape here is a LISTING — each directory's
|
|
10
|
+
* own children, keyed by the directory's path — and a flat list is just a
|
|
11
|
+
* listing built in one pass. One renderer, two ways in.
|
|
12
|
+
*
|
|
13
|
+
* Pure and importless, so the grouping, the ordering and the keyboard can be
|
|
14
|
+
* asserted without a browser. The shape of a tree is exactly the kind of thing
|
|
15
|
+
* that is easy to get subtly wrong — a folder with one child, a file beside a
|
|
16
|
+
* folder at the root, two paths that agree for three segments — and impossible
|
|
17
|
+
* to see in a screenshot.
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.dir = exports.base = void 0;
|
|
21
|
+
exports.sort = sort;
|
|
22
|
+
exports.group = group;
|
|
23
|
+
exports.put = put;
|
|
24
|
+
exports.ancestors = ancestors;
|
|
25
|
+
exports.rows = rows;
|
|
26
|
+
exports.filter = filter;
|
|
27
|
+
exports.step = step;
|
|
28
|
+
exports.language = language;
|
|
29
|
+
/** The last segment: the name a row shows. */
|
|
30
|
+
const base = (path) => {
|
|
31
|
+
const cut = path.replace(/\/+$/, '');
|
|
32
|
+
return cut.slice(cut.lastIndexOf('/') + 1);
|
|
33
|
+
};
|
|
34
|
+
exports.base = base;
|
|
35
|
+
/** The directory a path sits in; `''` at the root. */
|
|
36
|
+
const dir = (path) => {
|
|
37
|
+
const cut = path.replace(/\/+$/, '');
|
|
38
|
+
const at = cut.lastIndexOf('/');
|
|
39
|
+
return at < 0 ? '' : cut.slice(0, at);
|
|
40
|
+
};
|
|
41
|
+
exports.dir = dir;
|
|
42
|
+
/**
|
|
43
|
+
* Directories first, then files, each by name — the order every file browser
|
|
44
|
+
* uses, because folders are structure and files are content and mixing them
|
|
45
|
+
* makes both harder to scan. `localeCompare` with `numeric`, so `page10` sorts
|
|
46
|
+
* after `page9`.
|
|
47
|
+
*/
|
|
48
|
+
function sort(entries) {
|
|
49
|
+
return [...entries].sort((a, b) => {
|
|
50
|
+
if (a.kind !== b.kind)
|
|
51
|
+
return a.kind === 'dir' ? -1 : 1;
|
|
52
|
+
return (0, exports.base)(a.path).localeCompare((0, exports.base)(b.path), undefined, { numeric: true });
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A flat list of file paths as a listing: every folder a path implies is
|
|
57
|
+
* created on the way down. Duplicates collapse; empty segments are ignored, so
|
|
58
|
+
* `a//b` and `/a/b` are `a/b`.
|
|
59
|
+
*/
|
|
60
|
+
function group(files) {
|
|
61
|
+
const out = new Map([['', []]]);
|
|
62
|
+
const seen = new Set();
|
|
63
|
+
const add = (at, entry) => {
|
|
64
|
+
const key = `${entry.kind}:${entry.path}`;
|
|
65
|
+
if (seen.has(key))
|
|
66
|
+
return;
|
|
67
|
+
seen.add(key);
|
|
68
|
+
const list = out.get(at) ?? [];
|
|
69
|
+
list.push(entry);
|
|
70
|
+
out.set(at, list);
|
|
71
|
+
};
|
|
72
|
+
for (const raw of files) {
|
|
73
|
+
const segments = raw.split('/').filter(Boolean);
|
|
74
|
+
if (segments.length === 0)
|
|
75
|
+
continue;
|
|
76
|
+
let at = '';
|
|
77
|
+
for (let i = 0; i < segments.length - 1; i++) {
|
|
78
|
+
const next = at ? `${at}/${segments[i]}` : segments[i];
|
|
79
|
+
add(at, { path: next, kind: 'dir' });
|
|
80
|
+
if (!out.has(next))
|
|
81
|
+
out.set(next, []);
|
|
82
|
+
at = next;
|
|
83
|
+
}
|
|
84
|
+
add(at, { path: segments.join('/'), kind: 'file' });
|
|
85
|
+
}
|
|
86
|
+
for (const [key, list] of out)
|
|
87
|
+
out.set(key, sort(list));
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
/** A listing with one directory's children set, sorted. Returns a new map. */
|
|
91
|
+
function put(listing, at, entries) {
|
|
92
|
+
const next = new Map(listing);
|
|
93
|
+
next.set(at, sort(entries));
|
|
94
|
+
return next;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Every folder on the way to a path, so selecting a file can reveal it.
|
|
98
|
+
* `src/components/Header.tsx` → `['src', 'src/components']`.
|
|
99
|
+
*/
|
|
100
|
+
function ancestors(path) {
|
|
101
|
+
const segments = path.split('/').filter(Boolean);
|
|
102
|
+
segments.pop();
|
|
103
|
+
const out = [];
|
|
104
|
+
let acc = '';
|
|
105
|
+
for (const s of segments) {
|
|
106
|
+
acc = acc ? `${acc}/${s}` : s;
|
|
107
|
+
out.push(acc);
|
|
108
|
+
}
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The rows a tree draws: a depth-first walk from the root through every OPEN
|
|
113
|
+
* directory the listing has read. An open directory that has not been read
|
|
114
|
+
* draws nothing under it — the host is reading it, and the row says so.
|
|
115
|
+
*/
|
|
116
|
+
function rows(listing, open) {
|
|
117
|
+
const out = [];
|
|
118
|
+
const walk = (at, depth) => {
|
|
119
|
+
for (const entry of listing.get(at) ?? []) {
|
|
120
|
+
const isOpen = entry.kind === 'dir' && open.has(entry.path);
|
|
121
|
+
out.push({
|
|
122
|
+
path: entry.path,
|
|
123
|
+
name: (0, exports.base)(entry.path),
|
|
124
|
+
kind: entry.kind,
|
|
125
|
+
depth,
|
|
126
|
+
open: isOpen,
|
|
127
|
+
parent: at,
|
|
128
|
+
});
|
|
129
|
+
if (isOpen)
|
|
130
|
+
walk(entry.path, depth + 1);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
walk('', 0);
|
|
134
|
+
return out;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* The paths whose names contain `query`, and every folder above them — what a
|
|
138
|
+
* filtered tree shows. Case-insensitive substring, never a compiled pattern: a
|
|
139
|
+
* search box is not a place a regex should be built from typing.
|
|
140
|
+
*/
|
|
141
|
+
function filter(files, query) {
|
|
142
|
+
const q = query.trim().toLowerCase();
|
|
143
|
+
if (!q)
|
|
144
|
+
return files;
|
|
145
|
+
return files.filter((f) => f.toLowerCase().includes(q));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* The WAI-ARIA tree keys, over the visible rows.
|
|
149
|
+
*
|
|
150
|
+
* Up/Down step, Home/End jump, Right opens a closed folder or steps into an
|
|
151
|
+
* open one, Left closes an open folder or steps out to its parent, Enter and
|
|
152
|
+
* Space open a file or toggle a folder. An unknown key is `null`, so the
|
|
153
|
+
* component leaves it to the browser.
|
|
154
|
+
*/
|
|
155
|
+
function step(list, at, key) {
|
|
156
|
+
if (list.length === 0)
|
|
157
|
+
return null;
|
|
158
|
+
const here = list[Math.min(Math.max(at, 0), list.length - 1)];
|
|
159
|
+
const index = list.indexOf(here);
|
|
160
|
+
switch (key) {
|
|
161
|
+
case 'ArrowDown':
|
|
162
|
+
return { focus: Math.min(index + 1, list.length - 1) };
|
|
163
|
+
case 'ArrowUp':
|
|
164
|
+
return { focus: Math.max(index - 1, 0) };
|
|
165
|
+
case 'Home':
|
|
166
|
+
return { focus: 0 };
|
|
167
|
+
case 'End':
|
|
168
|
+
return { focus: list.length - 1 };
|
|
169
|
+
case 'ArrowRight':
|
|
170
|
+
if (here.kind !== 'dir')
|
|
171
|
+
return { focus: index };
|
|
172
|
+
if (!here.open)
|
|
173
|
+
return { focus: index, toggle: here.path };
|
|
174
|
+
return { focus: list[index + 1]?.parent === here.path ? index + 1 : index };
|
|
175
|
+
case 'ArrowLeft': {
|
|
176
|
+
if (here.kind === 'dir' && here.open)
|
|
177
|
+
return { focus: index, toggle: here.path };
|
|
178
|
+
const up = list.findIndex((r) => r.path === here.parent);
|
|
179
|
+
return { focus: up >= 0 ? up : index };
|
|
180
|
+
}
|
|
181
|
+
case 'Enter':
|
|
182
|
+
case ' ':
|
|
183
|
+
return here.kind === 'dir' ? { focus: index, toggle: here.path } : { focus: index, pick: here.path };
|
|
184
|
+
default:
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* The language a path is written in, as the editor names languages. An
|
|
190
|
+
* unknown extension is `plaintext`, never a guess.
|
|
191
|
+
*/
|
|
192
|
+
function language(path) {
|
|
193
|
+
const name = (0, exports.base)(path).toLowerCase();
|
|
194
|
+
if (name === 'dockerfile')
|
|
195
|
+
return 'shell';
|
|
196
|
+
const ext = name.includes('.') ? name.slice(name.lastIndexOf('.') + 1) : '';
|
|
197
|
+
return LANGUAGE[ext] ?? 'plaintext';
|
|
198
|
+
}
|
|
199
|
+
const LANGUAGE = {
|
|
200
|
+
ts: 'typescript',
|
|
201
|
+
tsx: 'typescript',
|
|
202
|
+
mts: 'typescript',
|
|
203
|
+
cts: 'typescript',
|
|
204
|
+
js: 'javascript',
|
|
205
|
+
jsx: 'javascript',
|
|
206
|
+
mjs: 'javascript',
|
|
207
|
+
cjs: 'javascript',
|
|
208
|
+
json: 'json',
|
|
209
|
+
html: 'html',
|
|
210
|
+
htm: 'html',
|
|
211
|
+
css: 'css',
|
|
212
|
+
scss: 'scss',
|
|
213
|
+
md: 'markdown',
|
|
214
|
+
mdx: 'markdown',
|
|
215
|
+
py: 'python',
|
|
216
|
+
go: 'go',
|
|
217
|
+
rs: 'rust',
|
|
218
|
+
rb: 'ruby',
|
|
219
|
+
php: 'php',
|
|
220
|
+
java: 'java',
|
|
221
|
+
kt: 'kotlin',
|
|
222
|
+
swift: 'swift',
|
|
223
|
+
c: 'c',
|
|
224
|
+
h: 'c',
|
|
225
|
+
cc: 'cpp',
|
|
226
|
+
cpp: 'cpp',
|
|
227
|
+
hpp: 'cpp',
|
|
228
|
+
cs: 'csharp',
|
|
229
|
+
dart: 'dart',
|
|
230
|
+
sql: 'sql',
|
|
231
|
+
xml: 'xml',
|
|
232
|
+
svg: 'xml',
|
|
233
|
+
yml: 'yaml',
|
|
234
|
+
yaml: 'yaml',
|
|
235
|
+
sh: 'shell',
|
|
236
|
+
bash: 'shell',
|
|
237
|
+
zsh: 'shell',
|
|
238
|
+
};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tree — a repository's files as the rows a tree draws, and the keys that move
|
|
3
|
+
* through them.
|
|
4
|
+
*
|
|
5
|
+
* Ported from build-v2 `components/editor/file-tree/tree.ts` (MIT, derived from
|
|
6
|
+
* OSW Studio and DeepSite — see NOTICE). v2 grouped a flat list of pages; a
|
|
7
|
+
* repository is read one directory at a time (`/tree?path=` answers a level,
|
|
8
|
+
* not the whole checkout), so the shape here is a LISTING — each directory's
|
|
9
|
+
* own children, keyed by the directory's path — and a flat list is just a
|
|
10
|
+
* listing built in one pass. One renderer, two ways in.
|
|
11
|
+
*
|
|
12
|
+
* Pure and importless, so the grouping, the ordering and the keyboard can be
|
|
13
|
+
* asserted without a browser. The shape of a tree is exactly the kind of thing
|
|
14
|
+
* that is easy to get subtly wrong — a folder with one child, a file beside a
|
|
15
|
+
* folder at the root, two paths that agree for three segments — and impossible
|
|
16
|
+
* to see in a screenshot.
|
|
17
|
+
*/
|
|
18
|
+
/** One child of a directory, as a listing answers it. */
|
|
19
|
+
export interface Entry {
|
|
20
|
+
/** Repo-relative, no leading slash: `src/app.tsx`. */
|
|
21
|
+
path: string;
|
|
22
|
+
kind: 'file' | 'dir';
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Every directory the tree knows about, by path, with its direct children.
|
|
26
|
+
* The root is `''`. A directory with no key has not been read yet.
|
|
27
|
+
*/
|
|
28
|
+
export type Listing = Map<string, Entry[]>;
|
|
29
|
+
/** One drawn line: an entry at a depth, and what state its folder is in. */
|
|
30
|
+
export interface Row {
|
|
31
|
+
path: string;
|
|
32
|
+
name: string;
|
|
33
|
+
kind: 'file' | 'dir';
|
|
34
|
+
depth: number;
|
|
35
|
+
/** A directory that is expanded. */
|
|
36
|
+
open: boolean;
|
|
37
|
+
/** The parent directory's path — what Left moves to. */
|
|
38
|
+
parent: string;
|
|
39
|
+
}
|
|
40
|
+
/** The last segment: the name a row shows. */
|
|
41
|
+
export declare const base: (path: string) => string;
|
|
42
|
+
/** The directory a path sits in; `''` at the root. */
|
|
43
|
+
export declare const dir: (path: string) => string;
|
|
44
|
+
/**
|
|
45
|
+
* Directories first, then files, each by name — the order every file browser
|
|
46
|
+
* uses, because folders are structure and files are content and mixing them
|
|
47
|
+
* makes both harder to scan. `localeCompare` with `numeric`, so `page10` sorts
|
|
48
|
+
* after `page9`.
|
|
49
|
+
*/
|
|
50
|
+
export declare function sort(entries: Entry[]): Entry[];
|
|
51
|
+
/**
|
|
52
|
+
* A flat list of file paths as a listing: every folder a path implies is
|
|
53
|
+
* created on the way down. Duplicates collapse; empty segments are ignored, so
|
|
54
|
+
* `a//b` and `/a/b` are `a/b`.
|
|
55
|
+
*/
|
|
56
|
+
export declare function group(files: string[]): Listing;
|
|
57
|
+
/** A listing with one directory's children set, sorted. Returns a new map. */
|
|
58
|
+
export declare function put(listing: Listing, at: string, entries: Entry[]): Listing;
|
|
59
|
+
/**
|
|
60
|
+
* Every folder on the way to a path, so selecting a file can reveal it.
|
|
61
|
+
* `src/components/Header.tsx` → `['src', 'src/components']`.
|
|
62
|
+
*/
|
|
63
|
+
export declare function ancestors(path: string): string[];
|
|
64
|
+
/**
|
|
65
|
+
* The rows a tree draws: a depth-first walk from the root through every OPEN
|
|
66
|
+
* directory the listing has read. An open directory that has not been read
|
|
67
|
+
* draws nothing under it — the host is reading it, and the row says so.
|
|
68
|
+
*/
|
|
69
|
+
export declare function rows(listing: Listing, open: ReadonlySet<string>): Row[];
|
|
70
|
+
/**
|
|
71
|
+
* The paths whose names contain `query`, and every folder above them — what a
|
|
72
|
+
* filtered tree shows. Case-insensitive substring, never a compiled pattern: a
|
|
73
|
+
* search box is not a place a regex should be built from typing.
|
|
74
|
+
*/
|
|
75
|
+
export declare function filter(files: string[], query: string): string[];
|
|
76
|
+
/** What a key does to the tree, as a value the component applies. */
|
|
77
|
+
export interface Move {
|
|
78
|
+
/** The row index that has focus afterwards. */
|
|
79
|
+
focus: number;
|
|
80
|
+
/** A directory to expand or collapse. */
|
|
81
|
+
toggle?: string;
|
|
82
|
+
/** A file to open. */
|
|
83
|
+
pick?: string;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The WAI-ARIA tree keys, over the visible rows.
|
|
87
|
+
*
|
|
88
|
+
* Up/Down step, Home/End jump, Right opens a closed folder or steps into an
|
|
89
|
+
* open one, Left closes an open folder or steps out to its parent, Enter and
|
|
90
|
+
* Space open a file or toggle a folder. An unknown key is `null`, so the
|
|
91
|
+
* component leaves it to the browser.
|
|
92
|
+
*/
|
|
93
|
+
export declare function step(list: Row[], at: number, key: string): Move | null;
|
|
94
|
+
/**
|
|
95
|
+
* The language a path is written in, as the editor names languages. An
|
|
96
|
+
* unknown extension is `plaintext`, never a guess.
|
|
97
|
+
*/
|
|
98
|
+
export declare function language(path: string): string;
|
|
99
|
+
//# sourceMappingURL=tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/agents/tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,yDAAyD;AACzD,MAAM,WAAW,KAAK;IACpB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,KAAK,CAAA;CACrB;AAED;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;AAE1C,4EAA4E;AAC5E,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,KAAK,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,oCAAoC;IACpC,IAAI,EAAE,OAAO,CAAA;IACb,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAA;CACf;AAED,8CAA8C;AAC9C,eAAO,MAAM,IAAI,SAAU,MAAM,KAAG,MAGnC,CAAA;AAED,sDAAsD;AACtD,eAAO,MAAM,GAAG,SAAU,MAAM,KAAG,MAIlC,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAK9C;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAyB9C;AAED,8EAA8E;AAC9E,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAI3E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAUhD;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,CAkBvE;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAI/D;AAED,qEAAqE;AACrE,MAAM,WAAW,IAAI;IACnB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CA4BtE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK7C"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tree — a repository's files as the rows a tree draws, and the keys that move
|
|
3
|
+
* through them.
|
|
4
|
+
*
|
|
5
|
+
* Ported from build-v2 `components/editor/file-tree/tree.ts` (MIT, derived from
|
|
6
|
+
* OSW Studio and DeepSite — see NOTICE). v2 grouped a flat list of pages; a
|
|
7
|
+
* repository is read one directory at a time (`/tree?path=` answers a level,
|
|
8
|
+
* not the whole checkout), so the shape here is a LISTING — each directory's
|
|
9
|
+
* own children, keyed by the directory's path — and a flat list is just a
|
|
10
|
+
* listing built in one pass. One renderer, two ways in.
|
|
11
|
+
*
|
|
12
|
+
* Pure and importless, so the grouping, the ordering and the keyboard can be
|
|
13
|
+
* asserted without a browser. The shape of a tree is exactly the kind of thing
|
|
14
|
+
* that is easy to get subtly wrong — a folder with one child, a file beside a
|
|
15
|
+
* folder at the root, two paths that agree for three segments — and impossible
|
|
16
|
+
* to see in a screenshot.
|
|
17
|
+
*/
|
|
18
|
+
/** The last segment: the name a row shows. */
|
|
19
|
+
export const base = (path) => {
|
|
20
|
+
const cut = path.replace(/\/+$/, '');
|
|
21
|
+
return cut.slice(cut.lastIndexOf('/') + 1);
|
|
22
|
+
};
|
|
23
|
+
/** The directory a path sits in; `''` at the root. */
|
|
24
|
+
export const dir = (path) => {
|
|
25
|
+
const cut = path.replace(/\/+$/, '');
|
|
26
|
+
const at = cut.lastIndexOf('/');
|
|
27
|
+
return at < 0 ? '' : cut.slice(0, at);
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Directories first, then files, each by name — the order every file browser
|
|
31
|
+
* uses, because folders are structure and files are content and mixing them
|
|
32
|
+
* makes both harder to scan. `localeCompare` with `numeric`, so `page10` sorts
|
|
33
|
+
* after `page9`.
|
|
34
|
+
*/
|
|
35
|
+
export function sort(entries) {
|
|
36
|
+
return [...entries].sort((a, b) => {
|
|
37
|
+
if (a.kind !== b.kind)
|
|
38
|
+
return a.kind === 'dir' ? -1 : 1;
|
|
39
|
+
return base(a.path).localeCompare(base(b.path), undefined, { numeric: true });
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A flat list of file paths as a listing: every folder a path implies is
|
|
44
|
+
* created on the way down. Duplicates collapse; empty segments are ignored, so
|
|
45
|
+
* `a//b` and `/a/b` are `a/b`.
|
|
46
|
+
*/
|
|
47
|
+
export function group(files) {
|
|
48
|
+
const out = new Map([['', []]]);
|
|
49
|
+
const seen = new Set();
|
|
50
|
+
const add = (at, entry) => {
|
|
51
|
+
const key = `${entry.kind}:${entry.path}`;
|
|
52
|
+
if (seen.has(key))
|
|
53
|
+
return;
|
|
54
|
+
seen.add(key);
|
|
55
|
+
const list = out.get(at) ?? [];
|
|
56
|
+
list.push(entry);
|
|
57
|
+
out.set(at, list);
|
|
58
|
+
};
|
|
59
|
+
for (const raw of files) {
|
|
60
|
+
const segments = raw.split('/').filter(Boolean);
|
|
61
|
+
if (segments.length === 0)
|
|
62
|
+
continue;
|
|
63
|
+
let at = '';
|
|
64
|
+
for (let i = 0; i < segments.length - 1; i++) {
|
|
65
|
+
const next = at ? `${at}/${segments[i]}` : segments[i];
|
|
66
|
+
add(at, { path: next, kind: 'dir' });
|
|
67
|
+
if (!out.has(next))
|
|
68
|
+
out.set(next, []);
|
|
69
|
+
at = next;
|
|
70
|
+
}
|
|
71
|
+
add(at, { path: segments.join('/'), kind: 'file' });
|
|
72
|
+
}
|
|
73
|
+
for (const [key, list] of out)
|
|
74
|
+
out.set(key, sort(list));
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
/** A listing with one directory's children set, sorted. Returns a new map. */
|
|
78
|
+
export function put(listing, at, entries) {
|
|
79
|
+
const next = new Map(listing);
|
|
80
|
+
next.set(at, sort(entries));
|
|
81
|
+
return next;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Every folder on the way to a path, so selecting a file can reveal it.
|
|
85
|
+
* `src/components/Header.tsx` → `['src', 'src/components']`.
|
|
86
|
+
*/
|
|
87
|
+
export function ancestors(path) {
|
|
88
|
+
const segments = path.split('/').filter(Boolean);
|
|
89
|
+
segments.pop();
|
|
90
|
+
const out = [];
|
|
91
|
+
let acc = '';
|
|
92
|
+
for (const s of segments) {
|
|
93
|
+
acc = acc ? `${acc}/${s}` : s;
|
|
94
|
+
out.push(acc);
|
|
95
|
+
}
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* The rows a tree draws: a depth-first walk from the root through every OPEN
|
|
100
|
+
* directory the listing has read. An open directory that has not been read
|
|
101
|
+
* draws nothing under it — the host is reading it, and the row says so.
|
|
102
|
+
*/
|
|
103
|
+
export function rows(listing, open) {
|
|
104
|
+
const out = [];
|
|
105
|
+
const walk = (at, depth) => {
|
|
106
|
+
for (const entry of listing.get(at) ?? []) {
|
|
107
|
+
const isOpen = entry.kind === 'dir' && open.has(entry.path);
|
|
108
|
+
out.push({
|
|
109
|
+
path: entry.path,
|
|
110
|
+
name: base(entry.path),
|
|
111
|
+
kind: entry.kind,
|
|
112
|
+
depth,
|
|
113
|
+
open: isOpen,
|
|
114
|
+
parent: at,
|
|
115
|
+
});
|
|
116
|
+
if (isOpen)
|
|
117
|
+
walk(entry.path, depth + 1);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
walk('', 0);
|
|
121
|
+
return out;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* The paths whose names contain `query`, and every folder above them — what a
|
|
125
|
+
* filtered tree shows. Case-insensitive substring, never a compiled pattern: a
|
|
126
|
+
* search box is not a place a regex should be built from typing.
|
|
127
|
+
*/
|
|
128
|
+
export function filter(files, query) {
|
|
129
|
+
const q = query.trim().toLowerCase();
|
|
130
|
+
if (!q)
|
|
131
|
+
return files;
|
|
132
|
+
return files.filter((f) => f.toLowerCase().includes(q));
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The WAI-ARIA tree keys, over the visible rows.
|
|
136
|
+
*
|
|
137
|
+
* Up/Down step, Home/End jump, Right opens a closed folder or steps into an
|
|
138
|
+
* open one, Left closes an open folder or steps out to its parent, Enter and
|
|
139
|
+
* Space open a file or toggle a folder. An unknown key is `null`, so the
|
|
140
|
+
* component leaves it to the browser.
|
|
141
|
+
*/
|
|
142
|
+
export function step(list, at, key) {
|
|
143
|
+
if (list.length === 0)
|
|
144
|
+
return null;
|
|
145
|
+
const here = list[Math.min(Math.max(at, 0), list.length - 1)];
|
|
146
|
+
const index = list.indexOf(here);
|
|
147
|
+
switch (key) {
|
|
148
|
+
case 'ArrowDown':
|
|
149
|
+
return { focus: Math.min(index + 1, list.length - 1) };
|
|
150
|
+
case 'ArrowUp':
|
|
151
|
+
return { focus: Math.max(index - 1, 0) };
|
|
152
|
+
case 'Home':
|
|
153
|
+
return { focus: 0 };
|
|
154
|
+
case 'End':
|
|
155
|
+
return { focus: list.length - 1 };
|
|
156
|
+
case 'ArrowRight':
|
|
157
|
+
if (here.kind !== 'dir')
|
|
158
|
+
return { focus: index };
|
|
159
|
+
if (!here.open)
|
|
160
|
+
return { focus: index, toggle: here.path };
|
|
161
|
+
return { focus: list[index + 1]?.parent === here.path ? index + 1 : index };
|
|
162
|
+
case 'ArrowLeft': {
|
|
163
|
+
if (here.kind === 'dir' && here.open)
|
|
164
|
+
return { focus: index, toggle: here.path };
|
|
165
|
+
const up = list.findIndex((r) => r.path === here.parent);
|
|
166
|
+
return { focus: up >= 0 ? up : index };
|
|
167
|
+
}
|
|
168
|
+
case 'Enter':
|
|
169
|
+
case ' ':
|
|
170
|
+
return here.kind === 'dir' ? { focus: index, toggle: here.path } : { focus: index, pick: here.path };
|
|
171
|
+
default:
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* The language a path is written in, as the editor names languages. An
|
|
177
|
+
* unknown extension is `plaintext`, never a guess.
|
|
178
|
+
*/
|
|
179
|
+
export function language(path) {
|
|
180
|
+
const name = base(path).toLowerCase();
|
|
181
|
+
if (name === 'dockerfile')
|
|
182
|
+
return 'shell';
|
|
183
|
+
const ext = name.includes('.') ? name.slice(name.lastIndexOf('.') + 1) : '';
|
|
184
|
+
return LANGUAGE[ext] ?? 'plaintext';
|
|
185
|
+
}
|
|
186
|
+
const LANGUAGE = {
|
|
187
|
+
ts: 'typescript',
|
|
188
|
+
tsx: 'typescript',
|
|
189
|
+
mts: 'typescript',
|
|
190
|
+
cts: 'typescript',
|
|
191
|
+
js: 'javascript',
|
|
192
|
+
jsx: 'javascript',
|
|
193
|
+
mjs: 'javascript',
|
|
194
|
+
cjs: 'javascript',
|
|
195
|
+
json: 'json',
|
|
196
|
+
html: 'html',
|
|
197
|
+
htm: 'html',
|
|
198
|
+
css: 'css',
|
|
199
|
+
scss: 'scss',
|
|
200
|
+
md: 'markdown',
|
|
201
|
+
mdx: 'markdown',
|
|
202
|
+
py: 'python',
|
|
203
|
+
go: 'go',
|
|
204
|
+
rs: 'rust',
|
|
205
|
+
rb: 'ruby',
|
|
206
|
+
php: 'php',
|
|
207
|
+
java: 'java',
|
|
208
|
+
kt: 'kotlin',
|
|
209
|
+
swift: 'swift',
|
|
210
|
+
c: 'c',
|
|
211
|
+
h: 'c',
|
|
212
|
+
cc: 'cpp',
|
|
213
|
+
cpp: 'cpp',
|
|
214
|
+
hpp: 'cpp',
|
|
215
|
+
cs: 'csharp',
|
|
216
|
+
dart: 'dart',
|
|
217
|
+
sql: 'sql',
|
|
218
|
+
xml: 'xml',
|
|
219
|
+
svg: 'xml',
|
|
220
|
+
yml: 'yaml',
|
|
221
|
+
yaml: 'yaml',
|
|
222
|
+
sh: 'shell',
|
|
223
|
+
bash: 'shell',
|
|
224
|
+
zsh: 'shell',
|
|
225
|
+
};
|
|
226
|
+
//# sourceMappingURL=tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/agents/tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
import { type CSSProperties, type ComponentProps, type ElementType } from 'react';
|
|
2
|
-
declare const Frame: import("@hanzogui/web").GuiComponent<import("@hanzogui/web").TamaDefer,
|
|
2
|
+
declare const Frame: import("@hanzogui/web").GuiComponent<import("@hanzogui/web").TamaDefer, any, import("@hanzogui/core").RNGuiViewNonStyleProps, import("@hanzogui/web").StackStyleBase, {
|
|
3
3
|
elevation?: number | import("@hanzogui/web").SizeTokens | undefined;
|
|
4
4
|
fullscreen?: boolean | undefined;
|
|
5
5
|
}, import("@hanzogui/web").StaticConfigPublic>;
|
|
6
|
-
declare const HeaderFrame: import("@hanzogui/web").GuiComponent<import("@hanzogui/web").TamaDefer,
|
|
6
|
+
declare const HeaderFrame: import("@hanzogui/web").GuiComponent<import("@hanzogui/web").TamaDefer, any, import("@hanzogui/core").RNGuiViewNonStyleProps, import("@hanzogui/web").StackStyleBase, {
|
|
7
7
|
elevation?: number | import("@hanzogui/web").SizeTokens | undefined;
|
|
8
8
|
fullscreen?: boolean | undefined;
|
|
9
9
|
}, import("@hanzogui/web").StaticConfigPublic>;
|
|
10
|
-
declare const TitleFrame: import("@hanzogui/web").GuiComponent<import("@hanzogui/web").TamaDefer,
|
|
10
|
+
declare const TitleFrame: import("@hanzogui/web").GuiComponent<import("@hanzogui/web").TamaDefer, any, import("@hanzogui/web").TextNonStyleProps, import("@hanzogui/web").TextStylePropsBase, {
|
|
11
11
|
size?: import("@hanzogui/web").FontSizeTokens | undefined;
|
|
12
12
|
unstyled?: boolean | undefined;
|
|
13
13
|
}, import("@hanzogui/web").StaticConfigPublic>;
|
|
14
|
-
declare const DescriptionFrame: import("@hanzogui/web").GuiComponent<import("@hanzogui/web").TamaDefer,
|
|
14
|
+
declare const DescriptionFrame: import("@hanzogui/web").GuiComponent<import("@hanzogui/web").TamaDefer, any, import("@hanzogui/web").TextNonStyleProps, import("@hanzogui/web").TextStylePropsBase, {
|
|
15
15
|
size?: import("@hanzogui/web").FontSizeTokens | undefined;
|
|
16
16
|
unstyled?: boolean | undefined;
|
|
17
17
|
}, import("@hanzogui/web").StaticConfigPublic>;
|
|
18
|
-
declare const ContentFrame: import("@hanzogui/web").GuiComponent<import("@hanzogui/web").TamaDefer,
|
|
18
|
+
declare const ContentFrame: import("@hanzogui/web").GuiComponent<import("@hanzogui/web").TamaDefer, any, import("@hanzogui/core").RNGuiViewNonStyleProps, import("@hanzogui/web").StackStyleBase, {
|
|
19
19
|
elevation?: number | import("@hanzogui/web").SizeTokens | undefined;
|
|
20
20
|
fullscreen?: boolean | undefined;
|
|
21
21
|
}, import("@hanzogui/web").StaticConfigPublic>;
|
|
22
|
-
declare const FooterFrame: import("@hanzogui/web").GuiComponent<import("@hanzogui/web").TamaDefer,
|
|
22
|
+
declare const FooterFrame: import("@hanzogui/web").GuiComponent<import("@hanzogui/web").TamaDefer, any, import("@hanzogui/core").RNGuiViewNonStyleProps, import("@hanzogui/web").StackStyleBase, {
|
|
23
23
|
elevation?: number | import("@hanzogui/web").SizeTokens | undefined;
|
|
24
24
|
fullscreen?: boolean | undefined;
|
|
25
25
|
}, import("@hanzogui/web").StaticConfigPublic>;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { type GuiElement } from '@hanzo/gui';
|
|
2
1
|
import * as React from 'react';
|
|
3
2
|
export type Marquee3DVariant = 'default' | 'neon' | 'rainbow' | 'metallic' | 'fire' | 'glass';
|
|
4
3
|
export type Marquee3DSize = 'sm' | 'default' | 'lg' | 'xl' | '2xl' | '3xl';
|
|
@@ -57,15 +56,15 @@ export declare const Marquee3D: React.ForwardRefExoticComponent<Omit<Omit<React.
|
|
|
57
56
|
/** Length of each fade, px. */
|
|
58
57
|
gradientWidth?: number;
|
|
59
58
|
style?: React.CSSProperties;
|
|
60
|
-
} & React.RefAttributes<
|
|
59
|
+
} & React.RefAttributes<any>>;
|
|
61
60
|
type PresetProps = Omit<Marquee3DProps, 'variant' | 'size'>;
|
|
62
61
|
/** The five named looks, each a `Marquee3D` pinned to a variant and size; every other prop stays open. */
|
|
63
62
|
export declare const Marquee3DPreset: {
|
|
64
|
-
Hero: React.ForwardRefExoticComponent<PresetProps & React.RefAttributes<
|
|
65
|
-
Neon: React.ForwardRefExoticComponent<PresetProps & React.RefAttributes<
|
|
66
|
-
Metallic: React.ForwardRefExoticComponent<PresetProps & React.RefAttributes<
|
|
67
|
-
Fire: React.ForwardRefExoticComponent<PresetProps & React.RefAttributes<
|
|
68
|
-
Glass: React.ForwardRefExoticComponent<PresetProps & React.RefAttributes<
|
|
63
|
+
Hero: React.ForwardRefExoticComponent<PresetProps & React.RefAttributes<any>>;
|
|
64
|
+
Neon: React.ForwardRefExoticComponent<PresetProps & React.RefAttributes<any>>;
|
|
65
|
+
Metallic: React.ForwardRefExoticComponent<PresetProps & React.RefAttributes<any>>;
|
|
66
|
+
Fire: React.ForwardRefExoticComponent<PresetProps & React.RefAttributes<any>>;
|
|
67
|
+
Glass: React.ForwardRefExoticComponent<PresetProps & React.RefAttributes<any>>;
|
|
69
68
|
};
|
|
70
69
|
export type Marquee3DFloatingProps = Marquee3DProps & {
|
|
71
70
|
/** Peak lift of each glyph, px. */
|
|
@@ -109,6 +108,6 @@ export declare const Marquee3DFloating: React.ForwardRefExoticComponent<Omit<Omi
|
|
|
109
108
|
floatIntensity?: number;
|
|
110
109
|
/** Seconds per bob. */
|
|
111
110
|
floatSpeed?: number;
|
|
112
|
-
} & React.RefAttributes<
|
|
111
|
+
} & React.RefAttributes<any>>;
|
|
113
112
|
export {};
|
|
114
113
|
//# sourceMappingURL=3d-marquee.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"3d-marquee.d.ts","sourceRoot":"","sources":["../../../src/backends/gui/3d-marquee.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"3d-marquee.d.ts","sourceRoot":"","sources":["../../../src/backends/gui/3d-marquee.tsx"],"names":[],"mappings":"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"}
|