cursedbelt 5.90.0 → 5.92.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react/activity-bar/activityBar.css +5 -0
- package/dist/react/components/Autocomplete.d.ts +11 -2
- package/dist/react/components/Autocomplete.d.ts.map +1 -1
- package/dist/react/components/Autocomplete.js +7 -6
- package/dist/react/components/Autocomplete.js.map +1 -1
- package/dist/react/components/DataTable/DataTable.d.ts +14 -1
- package/dist/react/components/DataTable/DataTable.d.ts.map +1 -1
- package/dist/react/components/DataTable/DataTable.js +18 -7
- package/dist/react/components/DataTable/DataTable.js.map +1 -1
- package/dist/react/components/Drawer.d.ts +8 -1
- package/dist/react/components/Drawer.d.ts.map +1 -1
- package/dist/react/components/Drawer.js +2 -2
- package/dist/react/components/Drawer.js.map +1 -1
- package/dist/react/components/FileDropZone.d.ts.map +1 -1
- package/dist/react/components/FileDropZone.js +12 -76
- package/dist/react/components/FileDropZone.js.map +1 -1
- package/dist/react/components/Page.d.ts +9 -1
- package/dist/react/components/Page.d.ts.map +1 -1
- package/dist/react/components/Page.js +3 -2
- package/dist/react/components/Page.js.map +1 -1
- package/dist/react/components/TagsInput.d.ts +46 -4
- package/dist/react/components/TagsInput.d.ts.map +1 -1
- package/dist/react/components/TagsInput.js +92 -39
- package/dist/react/components/TagsInput.js.map +1 -1
- package/dist/react/components/TagsInputSuggesting.d.ts +8 -0
- package/dist/react/components/TagsInputSuggesting.d.ts.map +1 -0
- package/dist/react/components/TagsInputSuggesting.js +48 -0
- package/dist/react/components/TagsInputSuggesting.js.map +1 -0
- package/dist/react/components/dropTransfer.d.ts +53 -0
- package/dist/react/components/dropTransfer.d.ts.map +1 -0
- package/dist/react/components/dropTransfer.js +116 -0
- package/dist/react/components/dropTransfer.js.map +1 -0
- package/dist/react/components/suggestionList.d.ts +13 -0
- package/dist/react/components/suggestionList.d.ts.map +1 -0
- package/dist/react/components/suggestionList.js +19 -0
- package/dist/react/components/suggestionList.js.map +1 -0
- package/dist/react/file-tree/FileTree.d.ts.map +1 -1
- package/dist/react/file-tree/FileTree.js +9 -3
- package/dist/react/file-tree/FileTree.js.map +1 -1
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/media-gallery/MediaMetaEditor.d.ts +4 -4
- package/dist/react/nav/RailPlaces.d.ts +6 -2
- package/dist/react/nav/RailPlaces.d.ts.map +1 -1
- package/dist/react/nav/RailPlaces.js +1 -1
- package/dist/react/nav/RailPlaces.js.map +1 -1
- package/dist/react/optimistic/optimistic.d.ts +11 -2
- package/dist/react/optimistic/optimistic.d.ts.map +1 -1
- package/dist/react/optimistic/optimistic.js +4 -2
- package/dist/react/optimistic/optimistic.js.map +1 -1
- package/dist/scripts/guardrailsEnforce.d.ts.map +1 -1
- package/dist/styles-areas/analytics.css +14 -19
- package/dist/styles-areas/auth.css +3 -4
- package/dist/styles-areas/canvas-hud.css +3 -3
- package/dist/styles-areas/chat.css +10 -11
- package/dist/styles-areas/code-editor.css +2 -2
- package/dist/styles-areas/core.css +60 -54
- package/dist/styles-areas/data-table.css +14 -18
- package/dist/styles-areas/disk-usage.css +6 -7
- package/dist/styles-areas/emoji.css +2 -3
- package/dist/styles-areas/fields.css +15 -20
- package/dist/styles-areas/master-detail.css +3 -4
- package/dist/styles-areas/master-lock.css +1 -2
- package/dist/styles-areas/media-gallery.css +8 -10
- package/dist/styles-areas/rich-text.css +3 -3
- package/dist/styles-areas/stats.css +13 -17
- package/dist/styles-areas/wizard.css +6 -11
- package/dist/styles-utilities.css +10 -0
- package/package.json +7 -1
- package/scripts/guardrails-baseline.json +1 -1
- package/scripts/guardrailsEnforce.spec.ts +13 -0
- package/scripts/guardrailsEnforce.ts +5 -3
- package/scripts/styleAreas.ts +3 -0
- package/src/react/activity-bar/activityBar.css +5 -0
- package/src/react/components/Autocomplete.spec.tsx +55 -1
- package/src/react/components/Autocomplete.tsx +18 -43
- package/src/react/components/DataTable/DataTable.tsx +37 -7
- package/src/react/components/DataTable/columnHeaders.spec.tsx +83 -0
- package/src/react/components/Drawer.tsx +13 -0
- package/src/react/components/FileDropZone.tsx +12 -83
- package/src/react/components/Modal.spec.tsx +14 -0
- package/src/react/components/Page.spec.tsx +20 -0
- package/src/react/components/Page.tsx +35 -14
- package/src/react/components/TagsInput.spec.tsx +129 -14
- package/src/react/components/TagsInput.tsx +153 -85
- package/src/react/components/TagsInputSuggesting.tsx +94 -0
- package/src/react/components/dropTransfer.spec.ts +76 -0
- package/src/react/components/dropTransfer.ts +133 -0
- package/src/react/components/suggestionList.tsx +66 -0
- package/src/react/disk-usage/DiskUsage.spec.tsx +3 -0
- package/src/react/file-tree/FileTree.spec.tsx +14 -0
- package/src/react/file-tree/FileTree.tsx +9 -3
- package/src/react/index.ts +1 -0
- package/src/react/lib/floatingStyles.spec.ts +2 -1
- package/src/react/media-gallery/MediaMetaEditor.tsx +4 -4
- package/src/react/nav/RailPlaces.spec.tsx +6 -0
- package/src/react/nav/RailPlaces.tsx +12 -2
- package/src/react/optimistic/optimistic.spec.tsx +41 -0
- package/src/react/optimistic/optimistic.ts +13 -4
- package/src/styles-areas/analytics.css +14 -19
- package/src/styles-areas/auth.css +3 -4
- package/src/styles-areas/canvas-hud.css +3 -3
- package/src/styles-areas/chat.css +10 -11
- package/src/styles-areas/code-editor.css +2 -2
- package/src/styles-areas/core.css +60 -54
- package/src/styles-areas/data-table.css +14 -18
- package/src/styles-areas/disk-usage.css +6 -7
- package/src/styles-areas/emoji.css +2 -3
- package/src/styles-areas/fields.css +15 -20
- package/src/styles-areas/master-detail.css +3 -4
- package/src/styles-areas/master-lock.css +1 -2
- package/src/styles-areas/media-gallery.css +8 -10
- package/src/styles-areas/rich-text.css +3 -3
- package/src/styles-areas/stats.css +13 -17
- package/src/styles-areas/wizard.css +6 -11
- package/src/styles-utilities.css +10 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Autocomplete } from '@base-ui/react/autocomplete';
|
|
3
|
+
import { useLayoutEffect, useRef } from 'react';
|
|
4
|
+
import { SuggestionList } from './suggestionList.js';
|
|
5
|
+
import { TAGS_INPUT_CLASS, TagChips, tagsRowClass, useTagEditing } from './TagsInput.js';
|
|
6
|
+
/**
|
|
7
|
+
* A `TagsInput` that suggests — the chip row as an Autocomplete input group, its list the kit's
|
|
8
|
+
* `SuggestionList`. Loaded by `TagsInput.tsx` with a dynamic `import()` only when a field is given
|
|
9
|
+
* `suggestions`; that file says why.
|
|
10
|
+
*/
|
|
11
|
+
export default function TagsInputSuggesting({ value, onChange, onBlur, placeholder = 'Add a tag…', disabled, maxTags, id, name, suggestions, 'aria-invalid': ariaInvalid, 'aria-label': ariaLabel, 'aria-describedby': ariaDescribedBy, className, size = 'md', draft, setDraft, initialFocus, ...rest }) {
|
|
12
|
+
const { commit, removeAt, onKeyDown, type } = useTagEditing({ value, onChange, draft, setDraft });
|
|
13
|
+
// Which suggestion the keyboard or pointer is on: Enter then picks IT, not the half-typed draft.
|
|
14
|
+
const highlighted = useRef(undefined);
|
|
15
|
+
const input = useRef(null);
|
|
16
|
+
const atMax = maxTags != null && value.length >= maxTags;
|
|
17
|
+
// Case-insensitive: a committed "Bank" must suppress the suggestion "bank" —
|
|
18
|
+
// offering it back commits nothing (mergeTags dedupes case-sensitively, so it
|
|
19
|
+
// WOULD land as a second chip) and reads as the field suggesting a duplicate.
|
|
20
|
+
const committed = new Set(value.map((tag) => tag.toLowerCase()));
|
|
21
|
+
const offered = (suggestions ?? []).filter((tag) => !committed.has(tag.toLowerCase()));
|
|
22
|
+
// Mount-only: the plain field had the focus when this arrived, so the caret stays in the field.
|
|
23
|
+
// 🔴 A LAYOUT effect: it runs inside the commit that swaps the inputs. A passive one ran a task
|
|
24
|
+
// later, and a keystroke in between landed on <body> — the publish gate caught that gap under load.
|
|
25
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: a one-time hand-over, not a sync.
|
|
26
|
+
useLayoutEffect(() => {
|
|
27
|
+
if (initialFocus)
|
|
28
|
+
input.current?.focus();
|
|
29
|
+
}, []);
|
|
30
|
+
return (_jsxs(Autocomplete.Root, { value: draft, onValueChange: (v, details) => {
|
|
31
|
+
// Picking a suggestion (a press, or Enter on the highlighted one) commits it as a tag.
|
|
32
|
+
if (details.reason === 'item-press')
|
|
33
|
+
commit(v);
|
|
34
|
+
else
|
|
35
|
+
type(v);
|
|
36
|
+
}, items: offered, disabled: disabled, mode: 'list', autoHighlight: false, onItemHighlighted: (item) => {
|
|
37
|
+
highlighted.current = item;
|
|
38
|
+
}, children: [_jsxs(Autocomplete.InputGroup, { ...rest, "aria-invalid": ariaInvalid, className: tagsRowClass(size, disabled, className), children: [_jsx(TagChips, { value: value, disabled: disabled, onRemove: removeAt }), !atMax ? (_jsx(Autocomplete.Input, { ref: input, id: id, name: name, placeholder: value.length === 0 ? placeholder : undefined, "aria-invalid": ariaInvalid, "aria-label": ariaLabel, "aria-describedby": ariaDescribedBy, autoComplete: 'off', onKeyDown: (e) => {
|
|
39
|
+
if (e.key === 'Enter' && highlighted.current !== undefined)
|
|
40
|
+
return; // the list commits the pick
|
|
41
|
+
onKeyDown(e);
|
|
42
|
+
}, onBlur: () => {
|
|
43
|
+
if (draft.trim())
|
|
44
|
+
commit(draft);
|
|
45
|
+
onBlur?.();
|
|
46
|
+
}, className: TAGS_INPUT_CLASS })) : null] }), offered.length > 0 ? _jsx(SuggestionList, {}) : null] }));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=TagsInputSuggesting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TagsInputSuggesting.js","sourceRoot":"","sources":["../../../src/react/components/TagsInputSuggesting.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A drop's FILES, with every dropped FOLDER walked for what is inside it — the one walk
|
|
3
|
+
* {@link FileDropZone} and every app's own drop target share (forge task 3579's follow-up).
|
|
4
|
+
*
|
|
5
|
+
* `DataTransfer.files` lists a dropped folder as one zero-byte entry and nothing in it. The File
|
|
6
|
+
* and Directory Entries API (`webkitGetAsEntry`) is the only door every browser ships, and it has
|
|
7
|
+
* three traps each copy of this walk had to rediscover:
|
|
8
|
+
*
|
|
9
|
+
* - 🔴 the entries must be taken SYNCHRONOUSLY, before the first `await` — a browser empties the
|
|
10
|
+
* `DataTransfer` once the drop event returns, and a late walk finds nothing, silently;
|
|
11
|
+
* - a directory's reader answers in batches (Chrome: 100) until it answers EMPTY — one call
|
|
12
|
+
* truncates a folder of 1,000 photos to 100;
|
|
13
|
+
* - a dropped file's `webkitRelativePath` is `''`, so each file here gets its path inside the drop
|
|
14
|
+
* (`Album/CD1/01.mp3`), exactly as a folder PICKER's files carry natively — an app keying a
|
|
15
|
+
* duplicate check or provenance on it gets one answer from both gestures.
|
|
16
|
+
*
|
|
17
|
+
* Hidden entries (`.DS_Store`, `.thumbnails`) are never what somebody meant and are skipped.
|
|
18
|
+
*/
|
|
19
|
+
/** What one drop may yield by default — a drop, not a disk scan. */
|
|
20
|
+
export declare const MAX_DROP_FILES = 5000;
|
|
21
|
+
export declare const isHiddenName: (name: string) => boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Whether `file` passes an `<input accept>` filter — `.mp3`, `image/*`, `application/zip`, comma
|
|
24
|
+
* separated. A drop bypasses the native `accept`, so a drop target re-filters with this.
|
|
25
|
+
*/
|
|
26
|
+
export declare const matchesAccept: (file: File, accept?: string) => boolean;
|
|
27
|
+
/** A drop, read: the loose files as dropped, and each dropped folder with the files found inside it. */
|
|
28
|
+
export interface DropWalk {
|
|
29
|
+
loose: File[];
|
|
30
|
+
folders: {
|
|
31
|
+
name: string;
|
|
32
|
+
files: File[];
|
|
33
|
+
}[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Reads a drop that holds at least one folder — `null` when it holds none, so the ordinary path
|
|
37
|
+
* stays exactly `transfer.files`. Call it from the drop handler itself, before any `await`.
|
|
38
|
+
* Each folder yields up to `limit` files; an unreadable one yields what was read before the error.
|
|
39
|
+
*/
|
|
40
|
+
export declare function walkDrop(transfer: DataTransfer, limit?: number): Promise<DropWalk> | null;
|
|
41
|
+
/**
|
|
42
|
+
* Every file in a drop, folders walked — the loose files, then each folder's — with what `accept`
|
|
43
|
+
* turns away and hidden files skipped, at most `limit` in all. For a drop target that is not a
|
|
44
|
+
* {@link FileDropZone}: a portrait, an open album, a whole page.
|
|
45
|
+
*
|
|
46
|
+
* onDrop={(event) => { event.preventDefault(); void filesFromDataTransfer(event.dataTransfer, 'image/*').then(upload); }}
|
|
47
|
+
*
|
|
48
|
+
* 🔴 Call it from the drop handler itself, before any `await` (see the file header).
|
|
49
|
+
*/
|
|
50
|
+
export declare function filesFromDataTransfer(transfer: DataTransfer, accept?: string, { limit }?: {
|
|
51
|
+
limit?: number;
|
|
52
|
+
}): Promise<File[]>;
|
|
53
|
+
//# sourceMappingURL=dropTransfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropTransfer.d.ts","sourceRoot":"","sources":["../../../src/react/components/dropTransfer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAaH,oEAAoE;AACpE,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,OAA+B,CAAC;AAE5E;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,IAAI,EAAE,SAAS,MAAM,KAAG,OAS3D,CAAC;AAqBF,wGAAwG;AACxG,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,IAAI,EAAE,CAAA;KAAE,EAAE,CAAC;CAC5C;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,SAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CA6BjG;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,YAAY,EACtB,MAAM,CAAC,EAAE,MAAM,EACf,EAAE,KAAsB,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAClD,OAAO,CAAC,IAAI,EAAE,CAAC,CAQjB"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A drop's FILES, with every dropped FOLDER walked for what is inside it — the one walk
|
|
3
|
+
* {@link FileDropZone} and every app's own drop target share (forge task 3579's follow-up).
|
|
4
|
+
*
|
|
5
|
+
* `DataTransfer.files` lists a dropped folder as one zero-byte entry and nothing in it. The File
|
|
6
|
+
* and Directory Entries API (`webkitGetAsEntry`) is the only door every browser ships, and it has
|
|
7
|
+
* three traps each copy of this walk had to rediscover:
|
|
8
|
+
*
|
|
9
|
+
* - 🔴 the entries must be taken SYNCHRONOUSLY, before the first `await` — a browser empties the
|
|
10
|
+
* `DataTransfer` once the drop event returns, and a late walk finds nothing, silently;
|
|
11
|
+
* - a directory's reader answers in batches (Chrome: 100) until it answers EMPTY — one call
|
|
12
|
+
* truncates a folder of 1,000 photos to 100;
|
|
13
|
+
* - a dropped file's `webkitRelativePath` is `''`, so each file here gets its path inside the drop
|
|
14
|
+
* (`Album/CD1/01.mp3`), exactly as a folder PICKER's files carry natively — an app keying a
|
|
15
|
+
* duplicate check or provenance on it gets one answer from both gestures.
|
|
16
|
+
*
|
|
17
|
+
* Hidden entries (`.DS_Store`, `.thumbnails`) are never what somebody meant and are skipped.
|
|
18
|
+
*/
|
|
19
|
+
/** What one drop may yield by default — a drop, not a disk scan. */
|
|
20
|
+
export const MAX_DROP_FILES = 5000;
|
|
21
|
+
export const isHiddenName = (name) => name.startsWith('.');
|
|
22
|
+
/**
|
|
23
|
+
* Whether `file` passes an `<input accept>` filter — `.mp3`, `image/*`, `application/zip`, comma
|
|
24
|
+
* separated. A drop bypasses the native `accept`, so a drop target re-filters with this.
|
|
25
|
+
*/
|
|
26
|
+
export const matchesAccept = (file, accept) => {
|
|
27
|
+
if (!accept)
|
|
28
|
+
return true;
|
|
29
|
+
return accept.split(',').some((raw) => {
|
|
30
|
+
const rule = raw.trim().toLowerCase();
|
|
31
|
+
if (!rule)
|
|
32
|
+
return false;
|
|
33
|
+
if (rule.startsWith('.'))
|
|
34
|
+
return file.name.toLowerCase().endsWith(rule);
|
|
35
|
+
if (rule.endsWith('/*'))
|
|
36
|
+
return file.type.toLowerCase().startsWith(rule.slice(0, -1));
|
|
37
|
+
return file.type.toLowerCase() === rule;
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
/** Every file under `entry`, depth-first, until `out` holds `limit`. */
|
|
41
|
+
async function filesUnder(entry, out, limit, prefix = '') {
|
|
42
|
+
if (out.length >= limit || isHiddenName(entry.name))
|
|
43
|
+
return;
|
|
44
|
+
if (entry.isFile && entry.file) {
|
|
45
|
+
const read = entry.file.bind(entry);
|
|
46
|
+
const file = await new Promise((ok, fail) => read(ok, fail));
|
|
47
|
+
Object.defineProperty(file, 'webkitRelativePath', { value: `${prefix}${file.name}`, configurable: true });
|
|
48
|
+
out.push(file);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (!entry.isDirectory || !entry.createReader)
|
|
52
|
+
return;
|
|
53
|
+
const reader = entry.createReader();
|
|
54
|
+
while (out.length < limit) {
|
|
55
|
+
const batch = await new Promise((ok, fail) => reader.readEntries(ok, fail));
|
|
56
|
+
if (batch.length === 0)
|
|
57
|
+
return;
|
|
58
|
+
for (const child of batch)
|
|
59
|
+
await filesUnder(child, out, limit, `${prefix}${entry.name}/`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Reads a drop that holds at least one folder — `null` when it holds none, so the ordinary path
|
|
64
|
+
* stays exactly `transfer.files`. Call it from the drop handler itself, before any `await`.
|
|
65
|
+
* Each folder yields up to `limit` files; an unreadable one yields what was read before the error.
|
|
66
|
+
*/
|
|
67
|
+
export function walkDrop(transfer, limit = MAX_DROP_FILES) {
|
|
68
|
+
// Synchronous, and first: the item list is tied to the event.
|
|
69
|
+
const items = transfer.items ? [...transfer.items] : [];
|
|
70
|
+
const entries = items.map((item) => item.kind === 'file' && typeof item.webkitGetAsEntry === 'function'
|
|
71
|
+
? item.webkitGetAsEntry()
|
|
72
|
+
: null);
|
|
73
|
+
if (!entries.some((entry) => entry?.isDirectory))
|
|
74
|
+
return null;
|
|
75
|
+
const looseFiles = [...transfer.files];
|
|
76
|
+
return (async () => {
|
|
77
|
+
const walk = { loose: [], folders: [] };
|
|
78
|
+
for (const [i, entry] of entries.entries()) {
|
|
79
|
+
if (!entry?.isDirectory) {
|
|
80
|
+
const file = looseFiles[i] ?? (entry ? await new Promise((ok) => entry.file?.(ok, () => ok(null))) : null);
|
|
81
|
+
if (file)
|
|
82
|
+
walk.loose.push(file);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const files = [];
|
|
86
|
+
try {
|
|
87
|
+
await filesUnder(entry, files, limit);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Keep what was read before the error; the caller decides what an empty folder means.
|
|
91
|
+
}
|
|
92
|
+
walk.folders.push({ name: entry.name, files });
|
|
93
|
+
}
|
|
94
|
+
return walk;
|
|
95
|
+
})();
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Every file in a drop, folders walked — the loose files, then each folder's — with what `accept`
|
|
99
|
+
* turns away and hidden files skipped, at most `limit` in all. For a drop target that is not a
|
|
100
|
+
* {@link FileDropZone}: a portrait, an open album, a whole page.
|
|
101
|
+
*
|
|
102
|
+
* onDrop={(event) => { event.preventDefault(); void filesFromDataTransfer(event.dataTransfer, 'image/*').then(upload); }}
|
|
103
|
+
*
|
|
104
|
+
* 🔴 Call it from the drop handler itself, before any `await` (see the file header).
|
|
105
|
+
*/
|
|
106
|
+
export function filesFromDataTransfer(transfer, accept, { limit = MAX_DROP_FILES } = {}) {
|
|
107
|
+
const keep = (file) => !isHiddenName(file.name) && matchesAccept(file, accept);
|
|
108
|
+
const walking = walkDrop(transfer, limit);
|
|
109
|
+
if (!walking)
|
|
110
|
+
return Promise.resolve([...transfer.files].filter(keep).slice(0, limit));
|
|
111
|
+
return walking.then(({ loose, folders }) => {
|
|
112
|
+
const all = [...loose, ...folders.flatMap((folder) => folder.files)];
|
|
113
|
+
return all.filter(keep).slice(0, limit);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=dropTransfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropTransfer.js","sourceRoot":"","sources":["../../../src/react/components/dropTransfer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The dropdown of an Autocomplete root — every kit field that suggests as you type draws its list
|
|
4
|
+
* with this one, so the list is the kit's in every theme (`TagsInput` as well as
|
|
5
|
+
* `AutocompleteField`). Kept out of every export: it is the inside of those two, not a part an app
|
|
6
|
+
* assembles. Never a `<datalist>`: the browser draws that outside the page, where no
|
|
7
|
+
* stylesheet reaches it — light in dark mode (owner, 2026-10-23; forge task 3602).
|
|
8
|
+
*/
|
|
9
|
+
export declare function SuggestionList<S>({ itemToString, renderSuggestion, }: {
|
|
10
|
+
itemToString?: (item: S) => string;
|
|
11
|
+
renderSuggestion?: ((item: S) => ReactNode) | undefined;
|
|
12
|
+
}): import("react").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=suggestionList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggestionList.d.ts","sourceRoot":"","sources":["../../../src/react/components/suggestionList.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC;;;;;;GAMG;AAEH,wBAAgB,cAAc,CAAC,CAAC,EAAE,EAChC,YAAqC,EACrC,gBAAgB,GACjB,EAAE;IACD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IACnC,gBAAgB,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;CACzD,+BA2CA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { Autocomplete } from '@base-ui/react/autocomplete';
|
|
4
|
+
import { cn } from '../lib/cn.js';
|
|
5
|
+
import { FLOATING_COLLISION_PADDING, FLOATING_CONTENT_BASE, FLOATING_ITEM_BASE } from '../lib/floatingStyles.js';
|
|
6
|
+
/**
|
|
7
|
+
* The dropdown of an Autocomplete root — every kit field that suggests as you type draws its list
|
|
8
|
+
* with this one, so the list is the kit's in every theme (`TagsInput` as well as
|
|
9
|
+
* `AutocompleteField`). Kept out of every export: it is the inside of those two, not a part an app
|
|
10
|
+
* assembles. Never a `<datalist>`: the browser draws that outside the page, where no
|
|
11
|
+
* stylesheet reaches it — light in dark mode (owner, 2026-10-23; forge task 3602).
|
|
12
|
+
*/
|
|
13
|
+
// no-attribute-forward: its root is Base UI's Portal — no element of its own; the popup is the kit's, not the caller's
|
|
14
|
+
export function SuggestionList({ itemToString = (item) => String(item), renderSuggestion, }) {
|
|
15
|
+
return (_jsx(Autocomplete.Portal, { children: _jsx(Autocomplete.Positioner, { sideOffset: 4, collisionPadding: FLOATING_COLLISION_PADDING, className: 'z-[var(--z-popover)]', children: _jsx(Autocomplete.Popup, { className: cn(FLOATING_CONTENT_BASE,
|
|
16
|
+
// guardrails-ignore no-raw-overflow: floating popover panel outside the page's ScrollArea, height-capped by max-h-64 — no keyboard-inset concern.
|
|
17
|
+
'max-h-64 min-w-[var(--anchor-width)] overflow-y-auto p-0 py-1', 'transition-[transform,opacity] duration-100', 'data-[starting-style]:scale-95 data-[starting-style]:opacity-0', 'data-[ending-style]:scale-95 data-[ending-style]:opacity-0'), children: _jsx(Autocomplete.List, { children: (s, index) => (_jsx(Autocomplete.Item, { value: s, index: index, className: cn(FLOATING_ITEM_BASE, 'data-[highlighted]:bg-accent/10 data-[highlighted]:text-accent-strong'), children: renderSuggestion ? renderSuggestion(s) : itemToString(s) }, itemToString(s))) }) }) }) }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=suggestionList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggestionList.js","sourceRoot":"","sources":["../../../src/react/components/suggestionList.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,0BAA0B,EACjC,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9E;;;;;;GAMG;AACH,uHAAuH;AACvH,MAAM,UAAU,cAAc,CAAI,EAChC,YAAY,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EACrC,gBAAgB,GAIjB;IACC,OAAO,CACL,KAAC,YAAY,CAAC,MAAM,cAOlB,KAAC,YAAY,CAAC,UAAU,IACtB,UAAU,EAAE,CAAC,EACb,gBAAgB,EAAE,0BAA0B,EAC5C,SAAS,EAAC,sBAAsB,YAEhC,KAAC,YAAY,CAAC,KAAK,IACjB,SAAS,EAAE,EAAE,CACX,qBAAqB;gBACrB,kJAAkJ;gBAClJ,+DAA+D,EAC/D,6CAA6C,EAC7C,gEAAgE,EAChE,4DAA4D,CAC7D,YAKD,KAAC,YAAY,CAAC,IAAI,cACf,CAAC,CAAI,EAAE,KAAa,EAAE,EAAE,CAAC,CACxB,KAAC,YAAY,CAAC,IAAI,IAEhB,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,EAAE,CAAC,kBAAkB,EAAE,uEAAuE,CAAC,YAEzG,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IALpD,YAAY,CAAC,CAAC,CAAC,CAMF,CACrB,GACiB,GACD,GACG,GACN,CACvB,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileTree.d.ts","sourceRoot":"","sources":["../../../src/react/file-tree/FileTree.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"FileTree.d.ts","sourceRoot":"","sources":["../../../src/react/file-tree/FileTree.tsx"],"names":[],"mappings":"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"}
|
|
@@ -621,9 +621,15 @@ export function FileTree({ nodes, selectedId, onSelect, selectedIds, onSelection
|
|
|
621
621
|
const frame = (scroll === 'host' ? hostScroller(scroller) : scroller).getBoundingClientRect();
|
|
622
622
|
if (box.top >= frame.top && box.bottom <= frame.bottom)
|
|
623
623
|
return;
|
|
624
|
-
// `
|
|
625
|
-
//
|
|
626
|
-
|
|
624
|
+
// 🔴 `center`, as VS Code's explorer lands a revealed file: in the middle of the tree, with its
|
|
625
|
+
// neighbors above and below it, wherever the scroll has room (the browser clamps it at either
|
|
626
|
+
// end). It was `nearest`, the least movement, which parked a row revealed from below on the
|
|
627
|
+
// tree's last line — owner, 2026-10-23, music's "Show in folders": *"have them show the
|
|
628
|
+
// highlighted track in the middle of the screen when there is enough scroll space, instead of
|
|
629
|
+
// letting them be at other places like at the bottom of the side menu. This is how vscode shows
|
|
630
|
+
// files when you click between them in the file tree."* `nearest` sideways: no travel in a list
|
|
631
|
+
// that does not scroll sideways.
|
|
632
|
+
row.scrollIntoView({ block: 'center', inline: 'nearest' });
|
|
627
633
|
}, [selectedId, revealOpened, revealKey]);
|
|
628
634
|
// ── The drag ──────────────────────────────────────────────────────────────────────────
|
|
629
635
|
const stopAutoScroll = useCallback(() => {
|