cursedbelt 5.16.1 โ 5.18.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/components/CardDisplayControls.d.ts +37 -0
- package/dist/react/components/CardDisplayControls.d.ts.map +1 -0
- package/dist/react/components/CardDisplayControls.js +33 -0
- package/dist/react/components/CardDisplayControls.js.map +1 -0
- package/dist/react/components/FileDropZone.d.ts +19 -0
- package/dist/react/components/FileDropZone.d.ts.map +1 -1
- package/dist/react/components/FileDropZone.js +96 -5
- package/dist/react/components/FileDropZone.js.map +1 -1
- package/dist/react/hooks/useCardDisplay.d.ts +51 -0
- package/dist/react/hooks/useCardDisplay.d.ts.map +1 -0
- package/dist/react/hooks/useCardDisplay.js +106 -0
- package/dist/react/hooks/useCardDisplay.js.map +1 -0
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +3 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/lib/cardDisplay.d.ts +25 -0
- package/dist/react/lib/cardDisplay.d.ts.map +1 -0
- package/dist/react/lib/cardDisplay.js +6 -0
- package/dist/react/lib/cardDisplay.js.map +1 -0
- package/package.json +1 -1
- package/scripts/styleAreas.ts +1 -0
- package/src/react/components/CardDisplayControls.spec.tsx +71 -0
- package/src/react/components/CardDisplayControls.tsx +120 -0
- package/src/react/components/FileDropZone.spec.tsx +79 -0
- package/src/react/components/FileDropZone.tsx +107 -5
- package/src/react/hooks/useCardDisplay.spec.tsx +131 -0
- package/src/react/hooks/useCardDisplay.ts +142 -0
- package/src/react/index.ts +9 -0
- package/src/react/lib/cardDisplay.ts +29 -0
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a card grid is drawn: how big each card is, and whether the words under the image show.
|
|
3
|
+
*
|
|
4
|
+
* Owner, roms, 2026-09-27: *"Smaller cards could be half that size and maybe a quarter โฆ so the
|
|
5
|
+
* user can scroll faster and see more cards at once"*, and *"a toggle to hide the game info so
|
|
6
|
+
* only the game image is visible"*. Then flix asked for the same pair (2026-09-28), which is why
|
|
7
|
+
* it lives here: two grids with their own copy of an S/M/L switch and a titles toggle drift the
|
|
8
|
+
* first time one of them changes a label or a hit target.
|
|
9
|
+
*
|
|
10
|
+
* ๐ด The SIZE is a word, not a width. What `small` means in pixels is the app's โ roms draws box
|
|
11
|
+
* art at 10/7/5 rem, flix draws 2:3 posters โ so this names the choice and each grid maps it onto
|
|
12
|
+
* its own column width. A number here would be one app's layout leaking into the other's.
|
|
13
|
+
*/
|
|
14
|
+
export type CardSize = 'large' | 'medium' | 'small';
|
|
15
|
+
/** Largest first โ the order the switch reads left to right. */
|
|
16
|
+
export declare const CARD_SIZES: readonly CardSize[];
|
|
17
|
+
export declare const isCardSize: (value: unknown) => value is CardSize;
|
|
18
|
+
/** The whole choice. `captions` is whether the words under each image are drawn. */
|
|
19
|
+
export interface CardDisplay {
|
|
20
|
+
size: CardSize;
|
|
21
|
+
captions: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** Large cards with their words โ what a grid looks like before anyone has chosen. */
|
|
24
|
+
export declare const DEFAULT_CARD_DISPLAY: CardDisplay;
|
|
25
|
+
//# sourceMappingURL=cardDisplay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cardDisplay.d.ts","sourceRoot":"","sources":["../../../src/react/lib/cardDisplay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEpD,gEAAgE;AAChE,eAAO,MAAM,UAAU,EAAE,SAAS,QAAQ,EAAiC,CAAC;AAE5E,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,QACS,CAAC;AAE/D,oFAAoF;AACpF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,sFAAsF;AACtF,eAAO,MAAM,oBAAoB,EAAE,WAA+C,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Largest first โ the order the switch reads left to right. */
|
|
2
|
+
export const CARD_SIZES = ['large', 'medium', 'small'];
|
|
3
|
+
export const isCardSize = (value) => value === 'large' || value === 'medium' || value === 'small';
|
|
4
|
+
/** Large cards with their words โ what a grid looks like before anyone has chosen. */
|
|
5
|
+
export const DEFAULT_CARD_DISPLAY = { size: 'large', captions: true };
|
|
6
|
+
//# sourceMappingURL=cardDisplay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cardDisplay.js","sourceRoot":"","sources":["../../../src/react/lib/cardDisplay.ts"],"names":[],"mappings":"AAeA,gEAAgE;AAChE,MAAM,CAAC,MAAM,UAAU,GAAwB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAc,EAAqB,EAAE,CAC9D,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,OAAO,CAAC;AAQ/D,sFAAsF;AACtF,MAAM,CAAC,MAAM,oBAAoB,GAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cursedbelt",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.18.0",
|
|
4
4
|
"license": "ISC",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "The React design system of the cursedbelt split โ components, styles, theme. cursedbelt-core below it; server tier in cursedbelt-server.",
|
package/scripts/styleAreas.ts
CHANGED
|
@@ -150,6 +150,7 @@ export const AREAS: readonly Area[] = [
|
|
|
150
150
|
'components/Button.tsx',
|
|
151
151
|
'components/ButtonGroup.tsx',
|
|
152
152
|
'components/ButtonLink.tsx',
|
|
153
|
+
'components/CardDisplayControls.tsx',
|
|
153
154
|
'components/CardTapTarget.tsx',
|
|
154
155
|
'components/Checkbox.tsx',
|
|
155
156
|
'components/ChoiceGroup.tsx',
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { afterEach, describe, expect, mock, test } from 'bun:test';
|
|
2
|
+
import { cleanup, fireEvent, render } from '@testing-library/react';
|
|
3
|
+
import type { CardDisplay } from '../lib/cardDisplay.js';
|
|
4
|
+
import { CardDisplayControls } from './CardDisplayControls.js';
|
|
5
|
+
|
|
6
|
+
afterEach(cleanup);
|
|
7
|
+
|
|
8
|
+
const LARGE_WITH_WORDS: CardDisplay = { size: 'large', captions: true };
|
|
9
|
+
|
|
10
|
+
describe('CardDisplayControls', () => {
|
|
11
|
+
test('a size segment reports the size, keeping the captions choice', () => {
|
|
12
|
+
const onChange = mock((_: CardDisplay) => {});
|
|
13
|
+
const { getByTestId } = render(
|
|
14
|
+
<CardDisplayControls value={{ size: 'large', captions: false }} onChange={onChange} />,
|
|
15
|
+
);
|
|
16
|
+
// Radix Tabs activates on mousedown, not click.
|
|
17
|
+
fireEvent.mouseDown(getByTestId('card-size-small'), { button: 0 });
|
|
18
|
+
expect(onChange).toHaveBeenLastCalledWith({ size: 'small', captions: false });
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test('the captions toggle flips the words and keeps the size, pressed when they are hidden', () => {
|
|
22
|
+
const onChange = mock((_: CardDisplay) => {});
|
|
23
|
+
const { getByTestId, rerender } = render(
|
|
24
|
+
<CardDisplayControls value={{ size: 'medium', captions: true }} onChange={onChange} captionsNoun='film titles' imageNoun='posters' />,
|
|
25
|
+
);
|
|
26
|
+
const toggle = getByTestId('card-captions');
|
|
27
|
+
expect(toggle.getAttribute('aria-pressed')).toBe('false');
|
|
28
|
+
expect(toggle.getAttribute('aria-label')).toBe('Hide film titles โ show the posters only');
|
|
29
|
+
fireEvent.click(toggle);
|
|
30
|
+
expect(onChange).toHaveBeenLastCalledWith({ size: 'medium', captions: false });
|
|
31
|
+
|
|
32
|
+
rerender(
|
|
33
|
+
<CardDisplayControls value={{ size: 'medium', captions: false }} onChange={onChange} captionsNoun='film titles' imageNoun='posters' />,
|
|
34
|
+
);
|
|
35
|
+
expect(getByTestId('card-captions').getAttribute('aria-pressed')).toBe('true');
|
|
36
|
+
expect(getByTestId('card-captions').getAttribute('aria-label')).toBe('Show film titles under the posters');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('offers only the sizes asked for, with the labels asked for', () => {
|
|
40
|
+
const { queryByTestId, getByTestId } = render(
|
|
41
|
+
<CardDisplayControls
|
|
42
|
+
value={LARGE_WITH_WORDS}
|
|
43
|
+
onChange={() => {}}
|
|
44
|
+
sizes={['large', 'small']}
|
|
45
|
+
sizeLabels={{ small: 'Tiny' }}
|
|
46
|
+
/>,
|
|
47
|
+
);
|
|
48
|
+
expect(queryByTestId('card-size-medium')).toBeNull();
|
|
49
|
+
expect(getByTestId('card-size-large').textContent).toBe('L');
|
|
50
|
+
expect(getByTestId('card-size-small').textContent).toBe('Tiny');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('a disabled reason leaves both controls visible and inert', () => {
|
|
54
|
+
const onChange = mock((_: CardDisplay) => {});
|
|
55
|
+
const { getByTestId } = render(
|
|
56
|
+
<CardDisplayControls
|
|
57
|
+
value={LARGE_WITH_WORDS}
|
|
58
|
+
onChange={onChange}
|
|
59
|
+
sizeDisabledReason='Card size applies to the grid view'
|
|
60
|
+
captionsDisabledReason='Titles are always shown in the list view'
|
|
61
|
+
/>,
|
|
62
|
+
);
|
|
63
|
+
const small = getByTestId('card-size-small') as HTMLButtonElement;
|
|
64
|
+
const toggle = getByTestId('card-captions') as HTMLButtonElement;
|
|
65
|
+
expect(small.disabled).toBe(true);
|
|
66
|
+
expect(toggle.disabled).toBe(true);
|
|
67
|
+
fireEvent.mouseDown(small, { button: 0 });
|
|
68
|
+
fireEvent.click(toggle);
|
|
69
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { cn } from '../lib/cn.js';
|
|
3
|
+
import type { ControlSize } from '../lib/field.js';
|
|
4
|
+
import { IconButton } from './IconButton.js';
|
|
5
|
+
import { SegmentedControl } from './SegmentedControl.js';
|
|
6
|
+
import { Tooltip } from './Tooltip.js';
|
|
7
|
+
import { CARD_SIZES, type CardDisplay, type CardSize } from '../lib/cardDisplay.js';
|
|
8
|
+
|
|
9
|
+
const DEFAULT_SIZE_LABELS: Readonly<Record<CardSize, ReactNode>> = { large: 'L', medium: 'M', small: 'S' };
|
|
10
|
+
|
|
11
|
+
const capitalized = (word: string): string => `${word[0]?.toUpperCase() ?? ''}${word.slice(1)}`;
|
|
12
|
+
|
|
13
|
+
export interface CardDisplayControlsProps {
|
|
14
|
+
value: CardDisplay;
|
|
15
|
+
onChange: (next: CardDisplay) => void;
|
|
16
|
+
/** Which sizes to offer, in order. Default {@link CARD_SIZES}. */
|
|
17
|
+
sizes?: readonly CardSize[];
|
|
18
|
+
/** What each segment says. Default `L` / `M` / `S`. */
|
|
19
|
+
sizeLabels?: Partial<Record<CardSize, ReactNode>>;
|
|
20
|
+
/** What the words under a card are called, lower-case โ `"game titles"`. Default `"titles"`. */
|
|
21
|
+
captionsNoun?: string;
|
|
22
|
+
/** What the image is called, lower-case โ `"art"`, `"posters"`. Default `"images"`. */
|
|
23
|
+
imageNoun?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Set when the size does not apply (a list view). The segments stay VISIBLE and inert with
|
|
26
|
+
* this on hover โ one UI, never a hidden control.
|
|
27
|
+
*/
|
|
28
|
+
sizeDisabledReason?: string | null;
|
|
29
|
+
/** The same, for the captions toggle โ `"Titles are always shown in the list view"`. */
|
|
30
|
+
captionsDisabledReason?: string | null;
|
|
31
|
+
/** Height on the shared control scale. Default `sm` โ this sits in a toolbar. */
|
|
32
|
+
controlSize?: Extract<ControlSize, 'sm' | 'md'>;
|
|
33
|
+
className?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The S / M / L switch and the captions toggle, side by side. The why, and the model it draws,
|
|
38
|
+
* are in `../lib/cardDisplay.ts`.
|
|
39
|
+
*
|
|
40
|
+
* Controlled: the app owns the state and where it is kept (`useCardDisplay` is the hook for
|
|
41
|
+
* that). The captions toggle is `aria-pressed` when the words are HIDDEN โ pressing it is the act
|
|
42
|
+
* of hiding them, and its icon shows the card with or without its lines.
|
|
43
|
+
*
|
|
44
|
+
* Test hooks: `card-size-<size>` on each segment and `card-captions` on the toggle.
|
|
45
|
+
*/
|
|
46
|
+
export function CardDisplayControls({
|
|
47
|
+
value,
|
|
48
|
+
onChange,
|
|
49
|
+
sizes = CARD_SIZES,
|
|
50
|
+
sizeLabels,
|
|
51
|
+
captionsNoun = 'titles',
|
|
52
|
+
imageNoun = 'images',
|
|
53
|
+
sizeDisabledReason = null,
|
|
54
|
+
captionsDisabledReason = null,
|
|
55
|
+
controlSize = 'sm',
|
|
56
|
+
className,
|
|
57
|
+
}: CardDisplayControlsProps) {
|
|
58
|
+
const labels = { ...DEFAULT_SIZE_LABELS, ...sizeLabels };
|
|
59
|
+
const { captions } = value;
|
|
60
|
+
const toggle = (
|
|
61
|
+
<IconButton
|
|
62
|
+
size={controlSize}
|
|
63
|
+
variant='ghost'
|
|
64
|
+
disabled={captionsDisabledReason !== null}
|
|
65
|
+
onClick={() => onChange({ ...value, captions: !captions })}
|
|
66
|
+
aria-pressed={!captions}
|
|
67
|
+
data-testid='card-captions'
|
|
68
|
+
label={
|
|
69
|
+
captions
|
|
70
|
+
? `Hide ${captionsNoun} โ show the ${imageNoun} only`
|
|
71
|
+
: `Show ${captionsNoun} under the ${imageNoun}`
|
|
72
|
+
}
|
|
73
|
+
tooltip={captions ? `${capitalized(imageNoun)} only โ hide the ${captionsNoun}` : `Show the ${captionsNoun}`}
|
|
74
|
+
>
|
|
75
|
+
<svg
|
|
76
|
+
viewBox='0 0 24 24'
|
|
77
|
+
fill='none'
|
|
78
|
+
stroke='currentColor'
|
|
79
|
+
strokeWidth={2}
|
|
80
|
+
strokeLinecap='round'
|
|
81
|
+
strokeLinejoin='round'
|
|
82
|
+
aria-hidden='true'
|
|
83
|
+
>
|
|
84
|
+
<rect x='4' y='3' width='16' height='12' rx='1.5' />
|
|
85
|
+
{captions ? (
|
|
86
|
+
<>
|
|
87
|
+
<line x1='4' y1='18.5' x2='20' y2='18.5' />
|
|
88
|
+
<line x1='4' y1='21.5' x2='14' y2='21.5' />
|
|
89
|
+
</>
|
|
90
|
+
) : null}
|
|
91
|
+
</svg>
|
|
92
|
+
</IconButton>
|
|
93
|
+
);
|
|
94
|
+
return (
|
|
95
|
+
<div className={cn('inline-flex items-center gap-1', className)} data-cb-card-display=''>
|
|
96
|
+
<SegmentedControl<CardSize>
|
|
97
|
+
size={controlSize}
|
|
98
|
+
aria-label='Card size'
|
|
99
|
+
value={value.size}
|
|
100
|
+
onChange={(size) => onChange({ ...value, size })}
|
|
101
|
+
options={sizes.map((size) => ({
|
|
102
|
+
value: size,
|
|
103
|
+
label: labels[size],
|
|
104
|
+
disabled: sizeDisabledReason !== null,
|
|
105
|
+
tooltip: sizeDisabledReason ?? `${capitalized(size)} cards`,
|
|
106
|
+
'data-testid': `card-size-${size}`,
|
|
107
|
+
}))}
|
|
108
|
+
/>
|
|
109
|
+
{captionsDisabledReason === null ? (
|
|
110
|
+
toggle
|
|
111
|
+
) : (
|
|
112
|
+
// A disabled button takes no pointer events, so its own tooltip can never open โ
|
|
113
|
+
// the span carries the reason instead (SegmentedControl does the same per segment).
|
|
114
|
+
<Tooltip content={captionsDisabledReason}>
|
|
115
|
+
<span className='inline-flex'>{toggle}</span>
|
|
116
|
+
</Tooltip>
|
|
117
|
+
)}
|
|
118
|
+
</div>
|
|
119
|
+
);
|
|
120
|
+
}
|
|
@@ -162,6 +162,85 @@ describe('FileDropZone', () => {
|
|
|
162
162
|
expect(input.className).toContain('peer');
|
|
163
163
|
});
|
|
164
164
|
|
|
165
|
+
/**
|
|
166
|
+
* ๐ด The 2026-09-28 roms report: the owner unpacked a `.7z` in Finder and dropped
|
|
167
|
+
* the FOLDER โ `Loaded (USA) (En,Fr)/` holding a readme and, one level down, a
|
|
168
|
+
* `.cue` and thirty `.bin`s. `dataTransfer.files` lists a folder as one nameless
|
|
169
|
+
* File, so every one of those files was refused as "not a file this accepts".
|
|
170
|
+
*/
|
|
171
|
+
describe('a dropped folder', () => {
|
|
172
|
+
type Entry = {
|
|
173
|
+
isFile: boolean;
|
|
174
|
+
isDirectory: boolean;
|
|
175
|
+
name: string;
|
|
176
|
+
file?: (ok: (f: File) => void) => void;
|
|
177
|
+
createReader?: () => { readEntries: (ok: (e: Entry[]) => void) => void };
|
|
178
|
+
};
|
|
179
|
+
const fileEntry = (f: File): Entry => ({ isFile: true, isDirectory: false, name: f.name, file: (ok) => ok(f) });
|
|
180
|
+
/** A directory whose reader answers in batches of two, then empty โ as browsers batch. */
|
|
181
|
+
const dirEntry = (name: string, children: Entry[]): Entry => ({
|
|
182
|
+
isFile: false,
|
|
183
|
+
isDirectory: true,
|
|
184
|
+
name,
|
|
185
|
+
createReader: () => {
|
|
186
|
+
let at = 0;
|
|
187
|
+
return {
|
|
188
|
+
readEntries: (ok) => {
|
|
189
|
+
const batch = children.slice(at, at + 2);
|
|
190
|
+
at += 2;
|
|
191
|
+
ok(batch);
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
const dropEntries = (zone: HTMLElement, entries: Entry[], files: File[]) =>
|
|
197
|
+
fireEvent.drop(zone, {
|
|
198
|
+
dataTransfer: {
|
|
199
|
+
files,
|
|
200
|
+
items: entries.map((entry) => ({ kind: 'file', webkitGetAsEntry: () => entry })),
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
const settle = () => new Promise((resolve) => setTimeout(resolve, 0));
|
|
204
|
+
|
|
205
|
+
test("is its files โ nested ones included, the ones `accept` turns away and hidden ones skipped", async () => {
|
|
206
|
+
let result: { accepted: File[]; rejected: File[] } | null = null;
|
|
207
|
+
const { container } = render(
|
|
208
|
+
<FileDropZone accept='.cue,.bin' onFiles={() => {}} onDrop={(r) => (result = r)} />,
|
|
209
|
+
);
|
|
210
|
+
const folder = dirEntry('Loaded (USA) (En,Fr)', [
|
|
211
|
+
fileEntry(file("Vimm's Lair.txt", 'text/plain')),
|
|
212
|
+
fileEntry(file('.DS_Store', '')),
|
|
213
|
+
dirEntry('Loaded (USA) (En,Fr)', [
|
|
214
|
+
fileEntry(file('Loaded.cue', '')),
|
|
215
|
+
fileEntry(file('Loaded (Track 01).bin', '')),
|
|
216
|
+
fileEntry(file('Loaded (Track 02).bin', '')),
|
|
217
|
+
]),
|
|
218
|
+
]);
|
|
219
|
+
dropEntries(container.firstElementChild as HTMLElement, [folder], [file('Loaded (USA) (En,Fr)', '')]);
|
|
220
|
+
for (let i = 0; i < 10 && !result; i++) await settle();
|
|
221
|
+
const got = result as { accepted: File[]; rejected: File[] } | null;
|
|
222
|
+
expect(got?.accepted.map((f) => f.name)).toEqual(['Loaded.cue', 'Loaded (Track 01).bin', 'Loaded (Track 02).bin']);
|
|
223
|
+
expect(got?.rejected).toEqual([]);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
test('a folder with nothing acceptable in it is still a refusal, under its own name โ never silence', async () => {
|
|
227
|
+
let result: { accepted: File[]; rejected: File[] } | null = null;
|
|
228
|
+
const { container } = render(
|
|
229
|
+
<FileDropZone accept='.zip' onFiles={() => {}} onDrop={(r) => (result = r)} />,
|
|
230
|
+
);
|
|
231
|
+
const loose = file('game.zip', 'application/zip');
|
|
232
|
+
dropEntries(
|
|
233
|
+
container.firstElementChild as HTMLElement,
|
|
234
|
+
[fileEntry(loose), dirEntry('Screenshots', [fileEntry(file('a.png', 'image/png'))])],
|
|
235
|
+
[loose, file('Screenshots', '')],
|
|
236
|
+
);
|
|
237
|
+
for (let i = 0; i < 10 && !result; i++) await settle();
|
|
238
|
+
const got = result as { accepted: File[]; rejected: File[] } | null;
|
|
239
|
+
expect(got?.accepted.map((f) => f.name)).toEqual(['game.zip']);
|
|
240
|
+
expect(got?.rejected.map((f) => f.name)).toEqual(['Screenshots']);
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
|
|
165
244
|
test('renders custom children and the default hint otherwise', () => {
|
|
166
245
|
const { getByText, rerender } = render(
|
|
167
246
|
<FileDropZone onFiles={() => {}}>
|
|
@@ -42,6 +42,83 @@ export interface FileDropZoneProps {
|
|
|
42
42
|
className?: string;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
/** The slice of the File and Directory Entries API a drop needs โ every browser ships it. */
|
|
46
|
+
interface DropEntry {
|
|
47
|
+
isFile: boolean;
|
|
48
|
+
isDirectory: boolean;
|
|
49
|
+
name: string;
|
|
50
|
+
file?: (ok: (file: File) => void, fail: (error: unknown) => void) => void;
|
|
51
|
+
createReader?: () => {
|
|
52
|
+
readEntries: (ok: (entries: DropEntry[]) => void, fail: (error: unknown) => void) => void;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** What a folder can hold before walking it stops โ a drop, not a disk scan. */
|
|
57
|
+
const MAX_FOLDER_FILES = 5000;
|
|
58
|
+
|
|
59
|
+
const isHidden = (name: string) => name.startsWith('.');
|
|
60
|
+
|
|
61
|
+
/** Every file under `entry`, depth-first. A directory's reader answers in batches until empty. */
|
|
62
|
+
async function filesUnder(entry: DropEntry, out: File[]): Promise<void> {
|
|
63
|
+
if (out.length >= MAX_FOLDER_FILES || isHidden(entry.name)) return;
|
|
64
|
+
if (entry.isFile && entry.file) {
|
|
65
|
+
const read = entry.file.bind(entry);
|
|
66
|
+
out.push(await new Promise<File>((ok, fail) => read(ok, fail)));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (!entry.isDirectory || !entry.createReader) return;
|
|
70
|
+
const reader = entry.createReader();
|
|
71
|
+
while (out.length < MAX_FOLDER_FILES) {
|
|
72
|
+
const batch = await new Promise<DropEntry[]>((ok, fail) => reader.readEntries(ok, fail));
|
|
73
|
+
if (batch.length === 0) return;
|
|
74
|
+
for (const child of batch) await filesUnder(child, out);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* A drop's files, with every dropped FOLDER replaced by the accepted files inside it โ see the
|
|
80
|
+
* FOLDER section above. `null` when nothing in the drop is a folder, so the ordinary path stays
|
|
81
|
+
* exactly `dataTransfer.files`.
|
|
82
|
+
*
|
|
83
|
+
* ๐ด The entries are taken SYNCHRONOUSLY, before the first `await`: a browser empties the
|
|
84
|
+
* `DataTransfer` once the drop event returns.
|
|
85
|
+
*/
|
|
86
|
+
function folderAwareDrop(
|
|
87
|
+
transfer: DataTransfer,
|
|
88
|
+
accept: string | undefined,
|
|
89
|
+
): Promise<{ loose: File[]; fromFolders: File[]; emptyFolders: File[] }> | null {
|
|
90
|
+
const items = transfer.items ? [...transfer.items] : [];
|
|
91
|
+
const entries = items.map((item) =>
|
|
92
|
+
item.kind === 'file' && typeof item.webkitGetAsEntry === 'function'
|
|
93
|
+
? (item.webkitGetAsEntry() as DropEntry | null)
|
|
94
|
+
: null,
|
|
95
|
+
);
|
|
96
|
+
if (!entries.some((entry) => entry?.isDirectory)) return null;
|
|
97
|
+
const looseFiles = [...transfer.files];
|
|
98
|
+
return (async () => {
|
|
99
|
+
const loose: File[] = [];
|
|
100
|
+
const fromFolders: File[] = [];
|
|
101
|
+
const emptyFolders: File[] = [];
|
|
102
|
+
for (const [i, entry] of entries.entries()) {
|
|
103
|
+
if (!entry?.isDirectory) {
|
|
104
|
+
const file = looseFiles[i] ?? (entry ? await new Promise<File | null>((ok) => entry.file?.(ok, () => ok(null))) : null);
|
|
105
|
+
if (file) loose.push(file);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const inside: File[] = [];
|
|
109
|
+
try {
|
|
110
|
+
await filesUnder(entry, inside);
|
|
111
|
+
} catch {
|
|
112
|
+
// An unreadable folder yields what was read before the error โ and, if that is nothing, a refusal below.
|
|
113
|
+
}
|
|
114
|
+
const kept = inside.filter((f) => matchesAccept(f, accept));
|
|
115
|
+
if (kept.length > 0) fromFolders.push(...kept);
|
|
116
|
+
else emptyFolders.push(new File([], entry.name));
|
|
117
|
+
}
|
|
118
|
+
return { loose, fromFolders, emptyFolders };
|
|
119
|
+
})();
|
|
120
|
+
}
|
|
121
|
+
|
|
45
122
|
const matchesAccept = (file: File, accept?: string): boolean => {
|
|
46
123
|
if (!accept) return true;
|
|
47
124
|
return accept.split(',').some((raw) => {
|
|
@@ -116,6 +193,25 @@ const matchesAccept = (file: File, accept?: string): boolean => {
|
|
|
116
193
|
* The notice is inline and dismissible, never a modal or a toast: it belongs
|
|
117
194
|
* beside the zone the files were aimed at, and it must not auto-dismiss, because
|
|
118
195
|
* a message the user did not get to read is the same as no message.
|
|
196
|
+
*
|
|
197
|
+
* โโ ๐ด A DROPPED FOLDER IS ITS FILES (2026-09-28) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
198
|
+
* `dataTransfer.files` lists a dropped folder as ONE `File` โ the folder's own
|
|
199
|
+
* name, no extension, no bytes โ so it failed every `accept` and reached the app
|
|
200
|
+
* as a single refusal. Found in roms: the owner double-clicked a `.7z` in Finder
|
|
201
|
+
* and dropped the folder it unpacked to (a PlayStation disc's `.cue` and thirty
|
|
202
|
+
* `.bin`s, one level down) and got "not a file this accepts" for the lot, when
|
|
203
|
+
* what he dropped was exactly the files the zone takes. Finder's "unpack, then
|
|
204
|
+
* drag the result" is the ordinary way a person hands over a set of files.
|
|
205
|
+
*
|
|
206
|
+
* So a folder is walked (`webkitGetAsEntry`, the only door every browser ships)
|
|
207
|
+
* and its files are judged one by one, as if they had been dropped loose. Two
|
|
208
|
+
* rules keep that honest rather than noisy:
|
|
209
|
+
*
|
|
210
|
+
* ยท inside a folder, a file `accept` turns away is SKIPPED, as an archive's
|
|
211
|
+
* readme is โ the person dropped the folder, not its `.txt` โ and hidden files
|
|
212
|
+
* (`.DS_Store`, AppleDouble `._x`) are never files anyone meant;
|
|
213
|
+
* ยท but a folder that yields NOTHING acceptable is itself reported as rejected,
|
|
214
|
+
* under its own name โ the 2026-08-14 rule, one level up: a drop never vanishes.
|
|
119
215
|
*/
|
|
120
216
|
export function FileDropZone({
|
|
121
217
|
onFiles,
|
|
@@ -133,13 +229,13 @@ export function FileDropZone({
|
|
|
133
229
|
const [dragOver, setDragOver] = useState(false);
|
|
134
230
|
const [rejected, setRejected] = useState<string[]>([]);
|
|
135
231
|
|
|
136
|
-
const emit = (list: FileList | File[] | null) => {
|
|
232
|
+
const emit = (list: FileList | File[] | null, fromFolders: File[] = [], emptyFolders: File[] = []) => {
|
|
137
233
|
if (!list) return;
|
|
138
234
|
const all = [...list];
|
|
139
|
-
if (all.length === 0) return;
|
|
140
|
-
const matched = all.filter((f) => matchesAccept(f, accept));
|
|
235
|
+
if (all.length === 0 && fromFolders.length === 0 && emptyFolders.length === 0) return;
|
|
236
|
+
const matched = [...all.filter((f) => matchesAccept(f, accept)), ...fromFolders];
|
|
141
237
|
const accepted = multiple ? matched : matched.slice(0, 1);
|
|
142
|
-
const turnedAway = all.filter((f) => !matchesAccept(f, accept));
|
|
238
|
+
const turnedAway = [...all.filter((f) => !matchesAccept(f, accept)), ...emptyFolders];
|
|
143
239
|
|
|
144
240
|
// One gesture, one call โ the whole reason this overload exists.
|
|
145
241
|
if (onDropResult) {
|
|
@@ -161,7 +257,13 @@ export function FileDropZone({
|
|
|
161
257
|
const onDrop = (e: DragEvent) => {
|
|
162
258
|
e.preventDefault();
|
|
163
259
|
setDragOver(false);
|
|
164
|
-
if (
|
|
260
|
+
if (disabled) return;
|
|
261
|
+
const walking = folderAwareDrop(e.dataTransfer, accept);
|
|
262
|
+
if (!walking) {
|
|
263
|
+
emit(e.dataTransfer.files);
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
void walking.then(({ loose, fromFolders, emptyFolders }) => emit(loose, fromFolders, emptyFolders));
|
|
165
267
|
};
|
|
166
268
|
|
|
167
269
|
return (
|