@llui/components 0.4.10 → 0.5.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/components/accordion.d.ts +13 -13
- package/dist/components/accordion.d.ts.map +1 -1
- package/dist/components/accordion.js +9 -9
- package/dist/components/accordion.js.map +1 -1
- package/dist/components/alert-dialog.d.ts +8 -8
- package/dist/components/alert-dialog.d.ts.map +1 -1
- package/dist/components/alert-dialog.js +2 -2
- package/dist/components/alert-dialog.js.map +1 -1
- package/dist/components/angle-slider.d.ts +13 -13
- package/dist/components/angle-slider.d.ts.map +1 -1
- package/dist/components/angle-slider.js +11 -11
- package/dist/components/angle-slider.js.map +1 -1
- package/dist/components/async-list.d.ts +7 -7
- package/dist/components/async-list.d.ts.map +1 -1
- package/dist/components/async-list.js +5 -8
- package/dist/components/async-list.js.map +1 -1
- package/dist/components/avatar.d.ts +9 -9
- package/dist/components/avatar.d.ts.map +1 -1
- package/dist/components/avatar.js +7 -7
- package/dist/components/avatar.js.map +1 -1
- package/dist/components/carousel.d.ts +18 -18
- package/dist/components/carousel.d.ts.map +1 -1
- package/dist/components/carousel.js +12 -12
- package/dist/components/carousel.js.map +1 -1
- package/dist/components/cascade-select.d.ts +12 -12
- package/dist/components/cascade-select.d.ts.map +1 -1
- package/dist/components/cascade-select.js +8 -8
- package/dist/components/cascade-select.js.map +1 -1
- package/dist/components/checkbox.d.ts +14 -14
- package/dist/components/checkbox.d.ts.map +1 -1
- package/dist/components/checkbox.js +12 -12
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/clipboard.d.ts +8 -8
- package/dist/components/clipboard.d.ts.map +1 -1
- package/dist/components/clipboard.js +6 -6
- package/dist/components/clipboard.js.map +1 -1
- package/dist/components/collapsible.d.ts +11 -11
- package/dist/components/collapsible.d.ts.map +1 -1
- package/dist/components/collapsible.js +9 -9
- package/dist/components/collapsible.js.map +1 -1
- package/dist/components/color-picker.d.ts +19 -19
- package/dist/components/color-picker.d.ts.map +1 -1
- package/dist/components/color-picker.js +21 -21
- package/dist/components/color-picker.js.map +1 -1
- package/dist/components/combobox.d.ts +25 -25
- package/dist/components/combobox.d.ts.map +1 -1
- package/dist/components/combobox.js +54 -59
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/context-menu.d.ts +14 -14
- package/dist/components/context-menu.d.ts.map +1 -1
- package/dist/components/context-menu.js +15 -19
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/date-input.d.ts +13 -13
- package/dist/components/date-input.d.ts.map +1 -1
- package/dist/components/date-input.js +11 -11
- package/dist/components/date-input.js.map +1 -1
- package/dist/components/date-picker.d.ts +11 -11
- package/dist/components/date-picker.d.ts.map +1 -1
- package/dist/components/date-picker.js +7 -7
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/dialog.d.ts +15 -15
- package/dist/components/dialog.d.ts.map +1 -1
- package/dist/components/dialog.js +45 -50
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/drawer.d.ts +13 -13
- package/dist/components/drawer.d.ts.map +1 -1
- package/dist/components/drawer.js +44 -49
- package/dist/components/drawer.js.map +1 -1
- package/dist/components/editable.d.ts +11 -11
- package/dist/components/editable.d.ts.map +1 -1
- package/dist/components/editable.js +9 -9
- package/dist/components/editable.js.map +1 -1
- package/dist/components/file-upload.d.ts +19 -19
- package/dist/components/file-upload.d.ts.map +1 -1
- package/dist/components/file-upload.js +14 -14
- package/dist/components/file-upload.js.map +1 -1
- package/dist/components/floating-panel.d.ts +14 -14
- package/dist/components/floating-panel.d.ts.map +1 -1
- package/dist/components/floating-panel.js +13 -14
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/form.d.ts +9 -9
- package/dist/components/form.d.ts.map +1 -1
- package/dist/components/form.js +7 -7
- package/dist/components/form.js.map +1 -1
- package/dist/components/hover-card.d.ts +9 -9
- package/dist/components/hover-card.d.ts.map +1 -1
- package/dist/components/hover-card.js +12 -13
- package/dist/components/hover-card.js.map +1 -1
- package/dist/components/image-cropper.d.ts +8 -8
- package/dist/components/image-cropper.d.ts.map +1 -1
- package/dist/components/image-cropper.js +7 -8
- package/dist/components/image-cropper.js.map +1 -1
- package/dist/components/in-view.d.ts +6 -6
- package/dist/components/in-view.d.ts.map +1 -1
- package/dist/components/in-view.js +2 -2
- package/dist/components/in-view.js.map +1 -1
- package/dist/components/listbox.d.ts +16 -16
- package/dist/components/listbox.d.ts.map +1 -1
- package/dist/components/listbox.js +16 -16
- package/dist/components/listbox.js.map +1 -1
- package/dist/components/marquee.d.ts +8 -8
- package/dist/components/marquee.d.ts.map +1 -1
- package/dist/components/marquee.js +8 -11
- package/dist/components/marquee.js.map +1 -1
- package/dist/components/menu.d.ts +15 -15
- package/dist/components/menu.d.ts.map +1 -1
- package/dist/components/menu.js +16 -17
- package/dist/components/menu.js.map +1 -1
- package/dist/components/navigation-menu.d.ts +12 -12
- package/dist/components/navigation-menu.d.ts.map +1 -1
- package/dist/components/navigation-menu.js +8 -8
- package/dist/components/navigation-menu.js.map +1 -1
- package/dist/components/number-input.d.ts +18 -18
- package/dist/components/number-input.d.ts.map +1 -1
- package/dist/components/number-input.js +16 -20
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/pagination.d.ts +13 -13
- package/dist/components/pagination.d.ts.map +1 -1
- package/dist/components/pagination.js +11 -17
- package/dist/components/pagination.js.map +1 -1
- package/dist/components/password-input.d.ts +11 -11
- package/dist/components/password-input.d.ts.map +1 -1
- package/dist/components/password-input.js +11 -11
- package/dist/components/password-input.js.map +1 -1
- package/dist/components/pin-input.d.ts +9 -9
- package/dist/components/pin-input.d.ts.map +1 -1
- package/dist/components/pin-input.js +9 -9
- package/dist/components/pin-input.js.map +1 -1
- package/dist/components/popover.d.ts +11 -11
- package/dist/components/popover.d.ts.map +1 -1
- package/dist/components/popover.js +61 -60
- package/dist/components/popover.js.map +1 -1
- package/dist/components/presence.d.ts +7 -5
- package/dist/components/presence.d.ts.map +1 -1
- package/dist/components/presence.js +5 -3
- package/dist/components/presence.js.map +1 -1
- package/dist/components/progress.d.ts +14 -14
- package/dist/components/progress.d.ts.map +1 -1
- package/dist/components/progress.js +12 -12
- package/dist/components/progress.js.map +1 -1
- package/dist/components/qr-code.d.ts +7 -7
- package/dist/components/qr-code.d.ts.map +1 -1
- package/dist/components/qr-code.js +7 -7
- package/dist/components/qr-code.js.map +1 -1
- package/dist/components/radio-group.d.ts +15 -15
- package/dist/components/radio-group.d.ts.map +1 -1
- package/dist/components/radio-group.js +12 -13
- package/dist/components/radio-group.js.map +1 -1
- package/dist/components/rating-group.d.ts +13 -13
- package/dist/components/rating-group.d.ts.map +1 -1
- package/dist/components/rating-group.js +10 -11
- package/dist/components/rating-group.js.map +1 -1
- package/dist/components/scroll-area.d.ts +10 -10
- package/dist/components/scroll-area.d.ts.map +1 -1
- package/dist/components/scroll-area.js +10 -15
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/select.d.ts +26 -26
- package/dist/components/select.d.ts.map +1 -1
- package/dist/components/select.js +29 -33
- package/dist/components/select.js.map +1 -1
- package/dist/components/signature-pad.d.ts +12 -12
- package/dist/components/signature-pad.d.ts.map +1 -1
- package/dist/components/signature-pad.js +10 -10
- package/dist/components/signature-pad.js.map +1 -1
- package/dist/components/slider.d.ts +22 -22
- package/dist/components/slider.d.ts.map +1 -1
- package/dist/components/slider.js +17 -17
- package/dist/components/slider.js.map +1 -1
- package/dist/components/sortable.d.ts +11 -11
- package/dist/components/sortable.d.ts.map +1 -1
- package/dist/components/sortable.js +20 -20
- package/dist/components/sortable.js.map +1 -1
- package/dist/components/splitter.d.ts +15 -15
- package/dist/components/splitter.d.ts.map +1 -1
- package/dist/components/splitter.js +15 -15
- package/dist/components/splitter.js.map +1 -1
- package/dist/components/steps.d.ts +14 -14
- package/dist/components/steps.d.ts.map +1 -1
- package/dist/components/steps.js +10 -16
- package/dist/components/steps.js.map +1 -1
- package/dist/components/switch.d.ts +12 -12
- package/dist/components/switch.d.ts.map +1 -1
- package/dist/components/switch.js +10 -10
- package/dist/components/switch.js.map +1 -1
- package/dist/components/tabs.d.ts +15 -15
- package/dist/components/tabs.d.ts.map +1 -1
- package/dist/components/tabs.js +11 -11
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/tags-input.d.ts +14 -14
- package/dist/components/tags-input.d.ts.map +1 -1
- package/dist/components/tags-input.js +10 -10
- package/dist/components/tags-input.js.map +1 -1
- package/dist/components/theme-switch.d.ts +5 -5
- package/dist/components/theme-switch.d.ts.map +1 -1
- package/dist/components/theme-switch.js +3 -3
- package/dist/components/theme-switch.js.map +1 -1
- package/dist/components/time-picker.d.ts +19 -19
- package/dist/components/time-picker.d.ts.map +1 -1
- package/dist/components/time-picker.js +17 -17
- package/dist/components/time-picker.js.map +1 -1
- package/dist/components/timer.d.ts +10 -10
- package/dist/components/timer.d.ts.map +1 -1
- package/dist/components/timer.js +8 -8
- package/dist/components/timer.js.map +1 -1
- package/dist/components/toast.d.ts +8 -8
- package/dist/components/toast.d.ts.map +1 -1
- package/dist/components/toast.js +4 -4
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toc.d.ts +12 -12
- package/dist/components/toc.d.ts.map +1 -1
- package/dist/components/toc.js +8 -8
- package/dist/components/toc.js.map +1 -1
- package/dist/components/toggle-group.d.ts +13 -13
- package/dist/components/toggle-group.d.ts.map +1 -1
- package/dist/components/toggle-group.js +9 -9
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/toggle.d.ts +8 -8
- package/dist/components/toggle.d.ts.map +1 -1
- package/dist/components/toggle.js +6 -6
- package/dist/components/toggle.js.map +1 -1
- package/dist/components/tooltip.d.ts +10 -10
- package/dist/components/tooltip.d.ts.map +1 -1
- package/dist/components/tooltip.js +13 -14
- package/dist/components/tooltip.js.map +1 -1
- package/dist/components/tour.d.ts +7 -7
- package/dist/components/tour.d.ts.map +1 -1
- package/dist/components/tour.js +5 -5
- package/dist/components/tour.js.map +1 -1
- package/dist/components/tree-view.d.ts +19 -19
- package/dist/components/tree-view.d.ts.map +1 -1
- package/dist/components/tree-view.js +23 -23
- package/dist/components/tree-view.js.map +1 -1
- package/dist/patterns/confirm-dialog.d.ts +4 -4
- package/dist/patterns/confirm-dialog.d.ts.map +1 -1
- package/dist/patterns/confirm-dialog.js +7 -9
- package/dist/patterns/confirm-dialog.js.map +1 -1
- package/package.json +3 -3
- package/dist/components/enter-view.d.ts +0 -73
- package/dist/components/enter-view.d.ts.map +0 -1
- package/dist/components/enter-view.js +0 -51
- package/dist/utils/validators.d.ts +0 -34
- package/dist/utils/validators.d.ts.map +0 -1
- package/dist/utils/validators.js +0 -83
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Send } from '@llui/dom';
|
|
1
|
+
import type { Send, Signal } from '@llui/dom';
|
|
2
2
|
/**
|
|
3
3
|
* File upload — input element + drag-and-drop zone. Tracks selected files,
|
|
4
4
|
* drag state, accept filters, validation errors. Multiple or single selection.
|
|
@@ -137,7 +137,7 @@ export declare function totalSize(state: FileUploadState): number;
|
|
|
137
137
|
* page. Call from onMount and invoke the returned disposer on unmount.
|
|
138
138
|
*/
|
|
139
139
|
export declare function preventDocumentDrop(): () => void;
|
|
140
|
-
export interface FileUploadItemParts
|
|
140
|
+
export interface FileUploadItemParts {
|
|
141
141
|
item: {
|
|
142
142
|
'data-scope': 'file-upload';
|
|
143
143
|
'data-part': 'item';
|
|
@@ -157,7 +157,7 @@ export interface FileUploadItemParts<S> {
|
|
|
157
157
|
};
|
|
158
158
|
removeTrigger: {
|
|
159
159
|
type: 'button';
|
|
160
|
-
'aria-label': string
|
|
160
|
+
'aria-label': string;
|
|
161
161
|
'data-scope': 'file-upload';
|
|
162
162
|
'data-part': 'item-remove';
|
|
163
163
|
onClick: (e: MouseEvent) => void;
|
|
@@ -165,25 +165,25 @@ export interface FileUploadItemParts<S> {
|
|
|
165
165
|
/** Zag-aligned alias for removeTrigger. Same wiring. */
|
|
166
166
|
itemDeleteTrigger: {
|
|
167
167
|
type: 'button';
|
|
168
|
-
'aria-label': string
|
|
168
|
+
'aria-label': string;
|
|
169
169
|
'data-scope': 'file-upload';
|
|
170
170
|
'data-part': 'item-delete-trigger';
|
|
171
171
|
onClick: (e: MouseEvent) => void;
|
|
172
172
|
};
|
|
173
173
|
}
|
|
174
|
-
export interface FileUploadParts
|
|
174
|
+
export interface FileUploadParts {
|
|
175
175
|
root: {
|
|
176
176
|
'data-scope': 'file-upload';
|
|
177
177
|
'data-part': 'root';
|
|
178
|
-
'data-disabled':
|
|
179
|
-
'data-dragging':
|
|
180
|
-
'data-invalid':
|
|
181
|
-
'data-readonly':
|
|
178
|
+
'data-disabled': Signal<'' | undefined>;
|
|
179
|
+
'data-dragging': Signal<'' | undefined>;
|
|
180
|
+
'data-invalid': Signal<'' | undefined>;
|
|
181
|
+
'data-readonly': Signal<'' | undefined>;
|
|
182
182
|
};
|
|
183
183
|
dropzone: {
|
|
184
184
|
'data-scope': 'file-upload';
|
|
185
185
|
'data-part': 'dropzone';
|
|
186
|
-
'data-dragging':
|
|
186
|
+
'data-dragging': Signal<'' | undefined>;
|
|
187
187
|
onClick: (e: MouseEvent) => void;
|
|
188
188
|
onDragEnter: (e: DragEvent) => void;
|
|
189
189
|
onDragOver: (e: DragEvent) => void;
|
|
@@ -194,7 +194,7 @@ export interface FileUploadParts<S> {
|
|
|
194
194
|
type: 'button';
|
|
195
195
|
'data-scope': 'file-upload';
|
|
196
196
|
'data-part': 'trigger';
|
|
197
|
-
disabled:
|
|
197
|
+
disabled: Signal<boolean>;
|
|
198
198
|
onClick: (e: MouseEvent) => void;
|
|
199
199
|
};
|
|
200
200
|
hiddenInput: {
|
|
@@ -202,11 +202,11 @@ export interface FileUploadParts<S> {
|
|
|
202
202
|
tabIndex: -1;
|
|
203
203
|
'aria-hidden': 'true';
|
|
204
204
|
style: string;
|
|
205
|
-
disabled:
|
|
206
|
-
multiple:
|
|
207
|
-
accept:
|
|
208
|
-
required:
|
|
209
|
-
'aria-invalid':
|
|
205
|
+
disabled: Signal<boolean>;
|
|
206
|
+
multiple: Signal<boolean>;
|
|
207
|
+
accept: Signal<string>;
|
|
208
|
+
required: Signal<boolean>;
|
|
209
|
+
'aria-invalid': Signal<'true' | undefined>;
|
|
210
210
|
capture?: string | boolean;
|
|
211
211
|
webkitdirectory?: '' | undefined;
|
|
212
212
|
'data-scope': 'file-upload';
|
|
@@ -221,7 +221,7 @@ export interface FileUploadParts<S> {
|
|
|
221
221
|
};
|
|
222
222
|
clearTrigger: {
|
|
223
223
|
type: 'button';
|
|
224
|
-
'aria-label': string
|
|
224
|
+
'aria-label': string;
|
|
225
225
|
'data-scope': 'file-upload';
|
|
226
226
|
'data-part': 'clear-trigger';
|
|
227
227
|
onClick: (e: MouseEvent) => void;
|
|
@@ -230,7 +230,7 @@ export interface FileUploadParts<S> {
|
|
|
230
230
|
'data-scope': 'file-upload';
|
|
231
231
|
'data-part': 'item-group';
|
|
232
232
|
};
|
|
233
|
-
item: (index: number) => FileUploadItemParts
|
|
233
|
+
item: (index: number) => FileUploadItemParts;
|
|
234
234
|
}
|
|
235
235
|
export interface ConnectOptions {
|
|
236
236
|
id: string;
|
|
@@ -258,7 +258,7 @@ export interface ConnectOptions {
|
|
|
258
258
|
*/
|
|
259
259
|
transformFiles?: (files: File[]) => File[] | Promise<File[]>;
|
|
260
260
|
}
|
|
261
|
-
export declare function connect
|
|
261
|
+
export declare function connect(state: Signal<FileUploadState>, send: Send<FileUploadMsg>, opts: ConnectOptions): FileUploadParts;
|
|
262
262
|
export declare const fileUpload: {
|
|
263
263
|
init: typeof init;
|
|
264
264
|
update: typeof update;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-upload.d.ts","sourceRoot":"","sources":["../../src/components/file-upload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"file-upload.d.ts","sourceRoot":"","sources":["../../src/components/file-upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -165,11 +165,11 @@ export function preventDocumentDrop() {
|
|
|
165
165
|
};
|
|
166
166
|
}
|
|
167
167
|
const HIDDEN_STYLE = 'position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;';
|
|
168
|
-
export function connect(
|
|
168
|
+
export function connect(state, send, opts) {
|
|
169
169
|
const locale = useContext(LocaleContext);
|
|
170
170
|
const inputId = `${opts.id}:input`;
|
|
171
|
-
const removeLabel = opts.removeLabel ??
|
|
172
|
-
const clearLabel = opts.clearLabel ??
|
|
171
|
+
const removeLabel = opts.removeLabel ?? locale.fileUpload.remove;
|
|
172
|
+
const clearLabel = opts.clearLabel ?? locale.fileUpload.clear;
|
|
173
173
|
const runPipeline = async (raw) => {
|
|
174
174
|
let files = raw;
|
|
175
175
|
if (opts.transformFiles)
|
|
@@ -210,15 +210,15 @@ export function connect(get, send, opts) {
|
|
|
210
210
|
root: {
|
|
211
211
|
'data-scope': 'file-upload',
|
|
212
212
|
'data-part': 'root',
|
|
213
|
-
'data-disabled': (
|
|
214
|
-
'data-dragging': (
|
|
215
|
-
'data-invalid': (
|
|
216
|
-
'data-readonly': (
|
|
213
|
+
'data-disabled': state.map((st) => (st.disabled ? '' : undefined)),
|
|
214
|
+
'data-dragging': state.map((st) => (st.dragging ? '' : undefined)),
|
|
215
|
+
'data-invalid': state.map((st) => (st.invalid ? '' : undefined)),
|
|
216
|
+
'data-readonly': state.map((st) => (st.readOnly ? '' : undefined)),
|
|
217
217
|
},
|
|
218
218
|
dropzone: {
|
|
219
219
|
'data-scope': 'file-upload',
|
|
220
220
|
'data-part': 'dropzone',
|
|
221
|
-
'data-dragging': (
|
|
221
|
+
'data-dragging': state.map((st) => (st.dragging ? '' : undefined)),
|
|
222
222
|
onClick: openPicker,
|
|
223
223
|
onDragEnter: tagSend(send, ['dragEnter'], (e) => {
|
|
224
224
|
e.preventDefault();
|
|
@@ -240,7 +240,7 @@ export function connect(get, send, opts) {
|
|
|
240
240
|
type: 'button',
|
|
241
241
|
'data-scope': 'file-upload',
|
|
242
242
|
'data-part': 'trigger',
|
|
243
|
-
disabled: (
|
|
243
|
+
disabled: state.map((st) => st.disabled),
|
|
244
244
|
onClick: openPicker,
|
|
245
245
|
},
|
|
246
246
|
hiddenInput: {
|
|
@@ -248,11 +248,11 @@ export function connect(get, send, opts) {
|
|
|
248
248
|
tabIndex: -1,
|
|
249
249
|
'aria-hidden': 'true',
|
|
250
250
|
style: HIDDEN_STYLE,
|
|
251
|
-
disabled: (
|
|
252
|
-
multiple: (
|
|
253
|
-
accept: (
|
|
254
|
-
required: (
|
|
255
|
-
'aria-invalid': (
|
|
251
|
+
disabled: state.map((st) => st.disabled),
|
|
252
|
+
multiple: state.map((st) => st.multiple),
|
|
253
|
+
accept: state.map((st) => acceptToString(st.accept)),
|
|
254
|
+
required: state.map((st) => st.required),
|
|
255
|
+
'aria-invalid': state.map((st) => (st.invalid ? 'true' : undefined)),
|
|
256
256
|
...(opts.capture !== undefined ? { capture: opts.capture } : {}),
|
|
257
257
|
...(opts.directory === true ? { webkitdirectory: '' } : {}),
|
|
258
258
|
'data-scope': 'file-upload',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-upload.js","sourceRoot":"","sources":["../../src/components/file-upload.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext, tagSend } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * File upload — input element + drag-and-drop zone. Tracks selected files,\n * drag state, accept filters, validation errors. Multiple or single selection.\n *\n * `accept` can be either a raw HTML-accept string (`\"image/*,.pdf\"`) or a\n * MIME-object (`{ 'image/*': ['.png', '.jpg'], 'application/pdf': [] }`).\n * The object form is validated client-side per file; the raw string form\n * only drives the browser's native picker filter.\n *\n * Files that fail validation (too large, too small, wrong type, over the\n * count limit) flow into `rejectedFiles` with a list of `FileError` codes\n * attached. The view can render them alongside accepted files.\n */\n\nexport type AcceptValue = string | Record<string, string[]>\n\nexport type FileError =\n | { code: 'TOO_LARGE'; max: number }\n | { code: 'TOO_SMALL'; min: number }\n | { code: 'INVALID_TYPE' }\n | { code: 'TOO_MANY'; max: number }\n | { code: 'CUSTOM'; message: string }\n\nexport interface RejectedFile {\n file: File\n errors: FileError[]\n}\n\nexport interface FileUploadState {\n files: File[]\n rejectedFiles: RejectedFile[]\n disabled: boolean\n multiple: boolean\n accept: AcceptValue\n maxFiles: number\n maxSize: number\n minFileSize: number\n required: boolean\n readOnly: boolean\n invalid: boolean\n dragging: boolean\n}\n\nexport type FileUploadMsg =\n /** @humanOnly */\n | { type: 'setFiles'; files: File[]; customRejected?: RejectedFile[] }\n /** @humanOnly */\n | { type: 'addFiles'; files: File[]; customRejected?: RejectedFile[] }\n /** @intent(\"Remove the accepted file at the given index\") */\n | { type: 'removeFile'; index: number }\n /** @intent(\"Remove the rejected file at the given index\") */\n | { type: 'removeRejected'; index: number }\n /** @intent(\"Clear all accepted files\") */\n | { type: 'clear' }\n /** @intent(\"Clear the rejected-files list\") */\n | { type: 'clearRejected' }\n /** @humanOnly */\n | { type: 'dragEnter' }\n /** @humanOnly */\n | { type: 'dragLeave' }\n /** @humanOnly */\n | { type: 'drop' }\n /** @humanOnly */\n | { type: 'setInvalid'; invalid: boolean }\n\nexport interface FileUploadInit {\n files?: File[]\n disabled?: boolean\n multiple?: boolean\n accept?: AcceptValue\n maxFiles?: number\n maxSize?: number\n minFileSize?: number\n required?: boolean\n readOnly?: boolean\n invalid?: boolean\n}\n\nexport function init(opts: FileUploadInit = {}): FileUploadState {\n return {\n files: opts.files ?? [],\n rejectedFiles: [],\n disabled: opts.disabled ?? false,\n multiple: opts.multiple ?? false,\n accept: opts.accept ?? '',\n maxFiles: opts.maxFiles ?? 0,\n maxSize: opts.maxSize ?? 0,\n minFileSize: opts.minFileSize ?? 0,\n required: opts.required ?? false,\n readOnly: opts.readOnly ?? false,\n invalid: opts.invalid ?? false,\n dragging: false,\n }\n}\n\n/**\n * Serialize an AcceptValue into a comma-joined string suitable for the\n * HTML `accept` attribute. Both MIME types and extensions are emitted.\n */\nexport function acceptToString(accept: AcceptValue): string {\n if (typeof accept === 'string') return accept\n const parts: string[] = []\n for (const [mime, exts] of Object.entries(accept)) {\n parts.push(mime)\n for (const ext of exts) parts.push(ext)\n }\n return parts.join(',')\n}\n\n/**\n * Check whether a file matches the accept configuration. Raw-string accept\n * is passed through to the browser picker so we always return true here;\n * MIME-object accept is validated by checking MIME type (with wildcards)\n * and extension membership.\n */\nexport function fileMatchesAccept(file: File, accept: AcceptValue): boolean {\n if (typeof accept === 'string' || Object.keys(accept).length === 0) return true\n const name = file.name.toLowerCase()\n for (const [mime, exts] of Object.entries(accept)) {\n if (matchMime(file.type, mime)) return true\n for (const ext of exts) {\n if (name.endsWith(ext.toLowerCase())) return true\n }\n }\n return false\n}\n\nfunction matchMime(fileType: string, pattern: string): boolean {\n if (!fileType) return false\n if (pattern === fileType) return true\n // Wildcard support: \"image/*\" matches \"image/png\"\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -1) // \"image/\"\n return fileType.startsWith(prefix)\n }\n return false\n}\n\n/**\n * Partition incoming files into accepted and rejected based on state's\n * accept/size/count constraints. The current accepted-file count is used\n * to enforce `maxFiles` — the caller is responsible for passing the\n * post-combine accepted total when appending.\n */\nexport function validateFiles(\n incoming: File[],\n state: FileUploadState,\n existingAcceptedCount: number,\n): { accepted: File[]; rejected: RejectedFile[] } {\n const accepted: File[] = []\n const rejected: RejectedFile[] = []\n let count = existingAcceptedCount\n for (const f of incoming) {\n const errors: FileError[] = []\n if (state.maxSize > 0 && f.size > state.maxSize) {\n errors.push({ code: 'TOO_LARGE', max: state.maxSize })\n }\n if (state.minFileSize > 0 && f.size < state.minFileSize) {\n errors.push({ code: 'TOO_SMALL', min: state.minFileSize })\n }\n if (!fileMatchesAccept(f, state.accept)) {\n errors.push({ code: 'INVALID_TYPE' })\n }\n if (state.maxFiles > 0 && count >= state.maxFiles) {\n errors.push({ code: 'TOO_MANY', max: state.maxFiles })\n }\n if (errors.length > 0) {\n rejected.push({ file: f, errors })\n } else {\n accepted.push(f)\n count++\n }\n }\n return { accepted, rejected }\n}\n\nexport function update(state: FileUploadState, msg: FileUploadMsg): [FileUploadState, never[]] {\n if (state.disabled && msg.type !== 'clear' && msg.type !== 'clearRejected') {\n return [state, []]\n }\n if (state.readOnly && (msg.type === 'setFiles' || msg.type === 'addFiles')) {\n return [state, []]\n }\n switch (msg.type) {\n case 'setFiles': {\n const { accepted, rejected } = validateFiles(msg.files, state, 0)\n const merged = msg.customRejected ? [...rejected, ...msg.customRejected] : rejected\n return [{ ...state, files: accepted, rejectedFiles: merged }, []]\n }\n case 'addFiles': {\n const base = state.multiple ? state.files : []\n const { accepted, rejected } = validateFiles(msg.files, state, base.length)\n const combined = state.multiple ? [...base, ...accepted] : accepted\n const merged = msg.customRejected ? [...rejected, ...msg.customRejected] : rejected\n return [{ ...state, files: combined, rejectedFiles: merged }, []]\n }\n case 'removeFile':\n return [{ ...state, files: state.files.filter((_, i) => i !== msg.index) }, []]\n case 'removeRejected':\n return [\n { ...state, rejectedFiles: state.rejectedFiles.filter((_, i) => i !== msg.index) },\n [],\n ]\n case 'clear':\n return [{ ...state, files: [], rejectedFiles: [] }, []]\n case 'clearRejected':\n return [{ ...state, rejectedFiles: [] }, []]\n case 'setInvalid':\n return [{ ...state, invalid: msg.invalid }, []]\n case 'dragEnter':\n return [{ ...state, dragging: true }, []]\n case 'dragLeave':\n case 'drop':\n return [{ ...state, dragging: false }, []]\n }\n}\n\nexport function totalSize(state: FileUploadState): number {\n let total = 0\n for (const f of state.files) total += f.size\n return total\n}\n\n/**\n * Install a document-level dragover/drop blocker. Without this, dragging a\n * file outside the dropzone causes the browser to navigate away from the\n * page. Call from onMount and invoke the returned disposer on unmount.\n */\nexport function preventDocumentDrop(): () => void {\n const prevent = (e: DragEvent): void => {\n // Only prevent default if the drop is NOT on an element inside a\n // file-upload dropzone — let those handle their own drops.\n const target = e.target as Element | null\n if (target?.closest('[data-scope=\"file-upload\"][data-part=\"dropzone\"]')) return\n e.preventDefault()\n }\n document.addEventListener('dragover', prevent)\n document.addEventListener('drop', prevent)\n return () => {\n document.removeEventListener('dragover', prevent)\n document.removeEventListener('drop', prevent)\n }\n}\n\nexport interface FileUploadItemParts<S> {\n item: {\n 'data-scope': 'file-upload'\n 'data-part': 'item'\n 'data-index': string\n }\n itemName: {\n 'data-scope': 'file-upload'\n 'data-part': 'item-name'\n }\n itemSizeText: {\n 'data-scope': 'file-upload'\n 'data-part': 'item-size-text'\n }\n itemPreview: {\n 'data-scope': 'file-upload'\n 'data-part': 'item-preview'\n }\n removeTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'file-upload'\n 'data-part': 'item-remove'\n onClick: (e: MouseEvent) => void\n }\n /** Zag-aligned alias for removeTrigger. Same wiring. */\n itemDeleteTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'file-upload'\n 'data-part': 'item-delete-trigger'\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface FileUploadParts<S> {\n root: {\n 'data-scope': 'file-upload'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n 'data-dragging': (s: S) => '' | undefined\n 'data-invalid': (s: S) => '' | undefined\n 'data-readonly': (s: S) => '' | undefined\n }\n dropzone: {\n 'data-scope': 'file-upload'\n 'data-part': 'dropzone'\n 'data-dragging': (s: S) => '' | undefined\n onClick: (e: MouseEvent) => void\n onDragEnter: (e: DragEvent) => void\n onDragOver: (e: DragEvent) => void\n onDragLeave: (e: DragEvent) => void\n onDrop: (e: DragEvent) => void\n }\n trigger: {\n type: 'button'\n 'data-scope': 'file-upload'\n 'data-part': 'trigger'\n disabled: (s: S) => boolean\n onClick: (e: MouseEvent) => void\n }\n hiddenInput: {\n type: 'file'\n tabIndex: -1\n 'aria-hidden': 'true'\n style: string\n disabled: (s: S) => boolean\n multiple: (s: S) => boolean\n accept: (s: S) => string\n required: (s: S) => boolean\n 'aria-invalid': (s: S) => 'true' | undefined\n capture?: string | boolean\n webkitdirectory?: '' | undefined\n 'data-scope': 'file-upload'\n 'data-part': 'hidden-input'\n id: string\n onChange: (e: Event) => void\n }\n label: {\n for: string\n 'data-scope': 'file-upload'\n 'data-part': 'label'\n }\n clearTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'file-upload'\n 'data-part': 'clear-trigger'\n onClick: (e: MouseEvent) => void\n }\n itemGroup: {\n 'data-scope': 'file-upload'\n 'data-part': 'item-group'\n }\n item: (index: number) => FileUploadItemParts<S>\n}\n\nexport interface ConnectOptions {\n id: string\n removeLabel?: string\n clearLabel?: string\n /**\n * Hints the browser to use the device camera/microphone for capture. Only\n * applies to mobile. Pass `'user'` for the front camera, `'environment'`\n * for the back, or `true` to accept either.\n */\n capture?: 'user' | 'environment' | boolean\n /** Show a directory-picker instead of a file-picker (webkit only). */\n directory?: boolean\n /**\n * Per-file synchronous validator. Return a non-empty array of `FileError`\n * codes to reject the file, or null/empty to accept. Runs in addition to\n * the state-driven accept/size/count checks — its errors accumulate into\n * `rejectedFiles` alongside the built-in errors.\n */\n validate?: (file: File) => FileError[] | null\n /**\n * Optional transform pipeline. Runs before validation. Can return a\n * Promise; onChange awaits it before dispatching. Use for image resizing,\n * format conversion, etc.\n */\n transformFiles?: (files: File[]) => File[] | Promise<File[]>\n}\n\nconst HIDDEN_STYLE =\n 'position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;'\n\nexport function connect<S>(\n get: (s: S) => FileUploadState,\n send: Send<FileUploadMsg>,\n opts: ConnectOptions,\n): FileUploadParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const inputId = `${opts.id}:input`\n const removeLabel: string | ((s: S) => string) =\n opts.removeLabel ?? ((s: S) => locale(s).fileUpload.remove)\n const clearLabel: string | ((s: S) => string) =\n opts.clearLabel ?? ((s: S) => locale(s).fileUpload.clear)\n\n const runPipeline = async (\n raw: File[],\n ): Promise<{ files: File[]; customRejected: RejectedFile[] }> => {\n let files = raw\n if (opts.transformFiles) files = await opts.transformFiles(files)\n const customRejected: RejectedFile[] = []\n if (opts.validate) {\n const passed: File[] = []\n for (const f of files) {\n const errors = opts.validate(f)\n if (errors && errors.length > 0) customRejected.push({ file: f, errors })\n else passed.push(f)\n }\n files = passed\n }\n return { files, customRejected }\n }\n\n const dispatchAdd = (raw: File[]): void => {\n if (!opts.transformFiles && !opts.validate) {\n send({ type: 'addFiles', files: raw })\n return\n }\n // Fire-and-forget — transforms may be async.\n void runPipeline(raw).then(({ files, customRejected }) => {\n send({ type: 'addFiles', files, customRejected })\n })\n }\n\n const openPicker = (e: MouseEvent): void => {\n const target = e.target as HTMLElement\n if (target.getAttribute('data-part') === 'hidden-input') return\n const root = (e.currentTarget as HTMLElement).closest(\n '[data-scope=\"file-upload\"][data-part=\"root\"]',\n )\n const input = root?.querySelector<HTMLInputElement>(\n '[data-scope=\"file-upload\"][data-part=\"hidden-input\"]',\n )\n input?.click()\n }\n\n return {\n root: {\n 'data-scope': 'file-upload',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n 'data-dragging': (s) => (get(s).dragging ? '' : undefined),\n 'data-invalid': (s) => (get(s).invalid ? '' : undefined),\n 'data-readonly': (s) => (get(s).readOnly ? '' : undefined),\n },\n dropzone: {\n 'data-scope': 'file-upload',\n 'data-part': 'dropzone',\n 'data-dragging': (s) => (get(s).dragging ? '' : undefined),\n onClick: openPicker,\n onDragEnter: tagSend(send, ['dragEnter'], (e) => {\n e.preventDefault()\n send({ type: 'dragEnter' })\n }),\n onDragOver: (e) => e.preventDefault(),\n onDragLeave: tagSend(send, ['dragLeave'], (e) => {\n e.preventDefault()\n send({ type: 'dragLeave' })\n }),\n onDrop: tagSend(send, ['drop'], (e) => {\n e.preventDefault()\n const files = Array.from(e.dataTransfer?.files ?? [])\n send({ type: 'drop' })\n dispatchAdd(files)\n }),\n },\n trigger: {\n type: 'button',\n 'data-scope': 'file-upload',\n 'data-part': 'trigger',\n disabled: (s) => get(s).disabled,\n onClick: openPicker,\n },\n hiddenInput: {\n type: 'file',\n tabIndex: -1,\n 'aria-hidden': 'true',\n style: HIDDEN_STYLE,\n disabled: (s) => get(s).disabled,\n multiple: (s) => get(s).multiple,\n accept: (s) => acceptToString(get(s).accept),\n required: (s) => get(s).required,\n 'aria-invalid': (s) => (get(s).invalid ? 'true' : undefined),\n ...(opts.capture !== undefined ? { capture: opts.capture } : {}),\n ...(opts.directory === true ? { webkitdirectory: '' as const } : {}),\n 'data-scope': 'file-upload',\n 'data-part': 'hidden-input',\n id: inputId,\n onChange: (e) => {\n const input = e.target as HTMLInputElement\n const files = input.files ? Array.from(input.files) : []\n dispatchAdd(files)\n input.value = ''\n },\n },\n label: {\n for: inputId,\n 'data-scope': 'file-upload',\n 'data-part': 'label',\n },\n clearTrigger: {\n type: 'button',\n 'aria-label': clearLabel,\n 'data-scope': 'file-upload',\n 'data-part': 'clear-trigger',\n onClick: tagSend(send, ['clear'], () => send({ type: 'clear' })),\n },\n itemGroup: {\n 'data-scope': 'file-upload',\n 'data-part': 'item-group',\n },\n item: (index: number): FileUploadItemParts<S> => ({\n item: {\n 'data-scope': 'file-upload',\n 'data-part': 'item',\n 'data-index': String(index),\n },\n itemName: {\n 'data-scope': 'file-upload',\n 'data-part': 'item-name',\n },\n itemSizeText: {\n 'data-scope': 'file-upload',\n 'data-part': 'item-size-text',\n },\n itemPreview: {\n 'data-scope': 'file-upload',\n 'data-part': 'item-preview',\n },\n removeTrigger: {\n type: 'button',\n 'aria-label': removeLabel,\n 'data-scope': 'file-upload',\n 'data-part': 'item-remove',\n onClick: tagSend(send, ['removeFile'], () => send({ type: 'removeFile', index })),\n },\n itemDeleteTrigger: {\n type: 'button',\n 'aria-label': removeLabel,\n 'data-scope': 'file-upload',\n 'data-part': 'item-delete-trigger',\n onClick: tagSend(send, ['removeFile'], () => send({ type: 'removeFile', index })),\n },\n }),\n }\n}\n\nexport const fileUpload = {\n init,\n update,\n connect,\n totalSize,\n acceptToString,\n fileMatchesAccept,\n validateFiles,\n preventDocumentDrop,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"file-upload.js","sourceRoot":"","sources":["../../src/components/file-upload.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send, Signal } from '@llui/dom'\nimport { useContext, tagSend } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\n\n/**\n * File upload — input element + drag-and-drop zone. Tracks selected files,\n * drag state, accept filters, validation errors. Multiple or single selection.\n *\n * `accept` can be either a raw HTML-accept string (`\"image/*,.pdf\"`) or a\n * MIME-object (`{ 'image/*': ['.png', '.jpg'], 'application/pdf': [] }`).\n * The object form is validated client-side per file; the raw string form\n * only drives the browser's native picker filter.\n *\n * Files that fail validation (too large, too small, wrong type, over the\n * count limit) flow into `rejectedFiles` with a list of `FileError` codes\n * attached. The view can render them alongside accepted files.\n */\n\nexport type AcceptValue = string | Record<string, string[]>\n\nexport type FileError =\n | { code: 'TOO_LARGE'; max: number }\n | { code: 'TOO_SMALL'; min: number }\n | { code: 'INVALID_TYPE' }\n | { code: 'TOO_MANY'; max: number }\n | { code: 'CUSTOM'; message: string }\n\nexport interface RejectedFile {\n file: File\n errors: FileError[]\n}\n\nexport interface FileUploadState {\n files: File[]\n rejectedFiles: RejectedFile[]\n disabled: boolean\n multiple: boolean\n accept: AcceptValue\n maxFiles: number\n maxSize: number\n minFileSize: number\n required: boolean\n readOnly: boolean\n invalid: boolean\n dragging: boolean\n}\n\nexport type FileUploadMsg =\n /** @humanOnly */\n | { type: 'setFiles'; files: File[]; customRejected?: RejectedFile[] }\n /** @humanOnly */\n | { type: 'addFiles'; files: File[]; customRejected?: RejectedFile[] }\n /** @intent(\"Remove the accepted file at the given index\") */\n | { type: 'removeFile'; index: number }\n /** @intent(\"Remove the rejected file at the given index\") */\n | { type: 'removeRejected'; index: number }\n /** @intent(\"Clear all accepted files\") */\n | { type: 'clear' }\n /** @intent(\"Clear the rejected-files list\") */\n | { type: 'clearRejected' }\n /** @humanOnly */\n | { type: 'dragEnter' }\n /** @humanOnly */\n | { type: 'dragLeave' }\n /** @humanOnly */\n | { type: 'drop' }\n /** @humanOnly */\n | { type: 'setInvalid'; invalid: boolean }\n\nexport interface FileUploadInit {\n files?: File[]\n disabled?: boolean\n multiple?: boolean\n accept?: AcceptValue\n maxFiles?: number\n maxSize?: number\n minFileSize?: number\n required?: boolean\n readOnly?: boolean\n invalid?: boolean\n}\n\nexport function init(opts: FileUploadInit = {}): FileUploadState {\n return {\n files: opts.files ?? [],\n rejectedFiles: [],\n disabled: opts.disabled ?? false,\n multiple: opts.multiple ?? false,\n accept: opts.accept ?? '',\n maxFiles: opts.maxFiles ?? 0,\n maxSize: opts.maxSize ?? 0,\n minFileSize: opts.minFileSize ?? 0,\n required: opts.required ?? false,\n readOnly: opts.readOnly ?? false,\n invalid: opts.invalid ?? false,\n dragging: false,\n }\n}\n\n/**\n * Serialize an AcceptValue into a comma-joined string suitable for the\n * HTML `accept` attribute. Both MIME types and extensions are emitted.\n */\nexport function acceptToString(accept: AcceptValue): string {\n if (typeof accept === 'string') return accept\n const parts: string[] = []\n for (const [mime, exts] of Object.entries(accept)) {\n parts.push(mime)\n for (const ext of exts) parts.push(ext)\n }\n return parts.join(',')\n}\n\n/**\n * Check whether a file matches the accept configuration. Raw-string accept\n * is passed through to the browser picker so we always return true here;\n * MIME-object accept is validated by checking MIME type (with wildcards)\n * and extension membership.\n */\nexport function fileMatchesAccept(file: File, accept: AcceptValue): boolean {\n if (typeof accept === 'string' || Object.keys(accept).length === 0) return true\n const name = file.name.toLowerCase()\n for (const [mime, exts] of Object.entries(accept)) {\n if (matchMime(file.type, mime)) return true\n for (const ext of exts) {\n if (name.endsWith(ext.toLowerCase())) return true\n }\n }\n return false\n}\n\nfunction matchMime(fileType: string, pattern: string): boolean {\n if (!fileType) return false\n if (pattern === fileType) return true\n // Wildcard support: \"image/*\" matches \"image/png\"\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -1) // \"image/\"\n return fileType.startsWith(prefix)\n }\n return false\n}\n\n/**\n * Partition incoming files into accepted and rejected based on state's\n * accept/size/count constraints. The current accepted-file count is used\n * to enforce `maxFiles` — the caller is responsible for passing the\n * post-combine accepted total when appending.\n */\nexport function validateFiles(\n incoming: File[],\n state: FileUploadState,\n existingAcceptedCount: number,\n): { accepted: File[]; rejected: RejectedFile[] } {\n const accepted: File[] = []\n const rejected: RejectedFile[] = []\n let count = existingAcceptedCount\n for (const f of incoming) {\n const errors: FileError[] = []\n if (state.maxSize > 0 && f.size > state.maxSize) {\n errors.push({ code: 'TOO_LARGE', max: state.maxSize })\n }\n if (state.minFileSize > 0 && f.size < state.minFileSize) {\n errors.push({ code: 'TOO_SMALL', min: state.minFileSize })\n }\n if (!fileMatchesAccept(f, state.accept)) {\n errors.push({ code: 'INVALID_TYPE' })\n }\n if (state.maxFiles > 0 && count >= state.maxFiles) {\n errors.push({ code: 'TOO_MANY', max: state.maxFiles })\n }\n if (errors.length > 0) {\n rejected.push({ file: f, errors })\n } else {\n accepted.push(f)\n count++\n }\n }\n return { accepted, rejected }\n}\n\nexport function update(state: FileUploadState, msg: FileUploadMsg): [FileUploadState, never[]] {\n if (state.disabled && msg.type !== 'clear' && msg.type !== 'clearRejected') {\n return [state, []]\n }\n if (state.readOnly && (msg.type === 'setFiles' || msg.type === 'addFiles')) {\n return [state, []]\n }\n switch (msg.type) {\n case 'setFiles': {\n const { accepted, rejected } = validateFiles(msg.files, state, 0)\n const merged = msg.customRejected ? [...rejected, ...msg.customRejected] : rejected\n return [{ ...state, files: accepted, rejectedFiles: merged }, []]\n }\n case 'addFiles': {\n const base = state.multiple ? state.files : []\n const { accepted, rejected } = validateFiles(msg.files, state, base.length)\n const combined = state.multiple ? [...base, ...accepted] : accepted\n const merged = msg.customRejected ? [...rejected, ...msg.customRejected] : rejected\n return [{ ...state, files: combined, rejectedFiles: merged }, []]\n }\n case 'removeFile':\n return [{ ...state, files: state.files.filter((_, i) => i !== msg.index) }, []]\n case 'removeRejected':\n return [\n { ...state, rejectedFiles: state.rejectedFiles.filter((_, i) => i !== msg.index) },\n [],\n ]\n case 'clear':\n return [{ ...state, files: [], rejectedFiles: [] }, []]\n case 'clearRejected':\n return [{ ...state, rejectedFiles: [] }, []]\n case 'setInvalid':\n return [{ ...state, invalid: msg.invalid }, []]\n case 'dragEnter':\n return [{ ...state, dragging: true }, []]\n case 'dragLeave':\n case 'drop':\n return [{ ...state, dragging: false }, []]\n }\n}\n\nexport function totalSize(state: FileUploadState): number {\n let total = 0\n for (const f of state.files) total += f.size\n return total\n}\n\n/**\n * Install a document-level dragover/drop blocker. Without this, dragging a\n * file outside the dropzone causes the browser to navigate away from the\n * page. Call from onMount and invoke the returned disposer on unmount.\n */\nexport function preventDocumentDrop(): () => void {\n const prevent = (e: DragEvent): void => {\n // Only prevent default if the drop is NOT on an element inside a\n // file-upload dropzone — let those handle their own drops.\n const target = e.target as Element | null\n if (target?.closest('[data-scope=\"file-upload\"][data-part=\"dropzone\"]')) return\n e.preventDefault()\n }\n document.addEventListener('dragover', prevent)\n document.addEventListener('drop', prevent)\n return () => {\n document.removeEventListener('dragover', prevent)\n document.removeEventListener('drop', prevent)\n }\n}\n\nexport interface FileUploadItemParts {\n item: {\n 'data-scope': 'file-upload'\n 'data-part': 'item'\n 'data-index': string\n }\n itemName: {\n 'data-scope': 'file-upload'\n 'data-part': 'item-name'\n }\n itemSizeText: {\n 'data-scope': 'file-upload'\n 'data-part': 'item-size-text'\n }\n itemPreview: {\n 'data-scope': 'file-upload'\n 'data-part': 'item-preview'\n }\n removeTrigger: {\n type: 'button'\n 'aria-label': string\n 'data-scope': 'file-upload'\n 'data-part': 'item-remove'\n onClick: (e: MouseEvent) => void\n }\n /** Zag-aligned alias for removeTrigger. Same wiring. */\n itemDeleteTrigger: {\n type: 'button'\n 'aria-label': string\n 'data-scope': 'file-upload'\n 'data-part': 'item-delete-trigger'\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface FileUploadParts {\n root: {\n 'data-scope': 'file-upload'\n 'data-part': 'root'\n 'data-disabled': Signal<'' | undefined>\n 'data-dragging': Signal<'' | undefined>\n 'data-invalid': Signal<'' | undefined>\n 'data-readonly': Signal<'' | undefined>\n }\n dropzone: {\n 'data-scope': 'file-upload'\n 'data-part': 'dropzone'\n 'data-dragging': Signal<'' | undefined>\n onClick: (e: MouseEvent) => void\n onDragEnter: (e: DragEvent) => void\n onDragOver: (e: DragEvent) => void\n onDragLeave: (e: DragEvent) => void\n onDrop: (e: DragEvent) => void\n }\n trigger: {\n type: 'button'\n 'data-scope': 'file-upload'\n 'data-part': 'trigger'\n disabled: Signal<boolean>\n onClick: (e: MouseEvent) => void\n }\n hiddenInput: {\n type: 'file'\n tabIndex: -1\n 'aria-hidden': 'true'\n style: string\n disabled: Signal<boolean>\n multiple: Signal<boolean>\n accept: Signal<string>\n required: Signal<boolean>\n 'aria-invalid': Signal<'true' | undefined>\n capture?: string | boolean\n webkitdirectory?: '' | undefined\n 'data-scope': 'file-upload'\n 'data-part': 'hidden-input'\n id: string\n onChange: (e: Event) => void\n }\n label: {\n for: string\n 'data-scope': 'file-upload'\n 'data-part': 'label'\n }\n clearTrigger: {\n type: 'button'\n 'aria-label': string\n 'data-scope': 'file-upload'\n 'data-part': 'clear-trigger'\n onClick: (e: MouseEvent) => void\n }\n itemGroup: {\n 'data-scope': 'file-upload'\n 'data-part': 'item-group'\n }\n item: (index: number) => FileUploadItemParts\n}\n\nexport interface ConnectOptions {\n id: string\n removeLabel?: string\n clearLabel?: string\n /**\n * Hints the browser to use the device camera/microphone for capture. Only\n * applies to mobile. Pass `'user'` for the front camera, `'environment'`\n * for the back, or `true` to accept either.\n */\n capture?: 'user' | 'environment' | boolean\n /** Show a directory-picker instead of a file-picker (webkit only). */\n directory?: boolean\n /**\n * Per-file synchronous validator. Return a non-empty array of `FileError`\n * codes to reject the file, or null/empty to accept. Runs in addition to\n * the state-driven accept/size/count checks — its errors accumulate into\n * `rejectedFiles` alongside the built-in errors.\n */\n validate?: (file: File) => FileError[] | null\n /**\n * Optional transform pipeline. Runs before validation. Can return a\n * Promise; onChange awaits it before dispatching. Use for image resizing,\n * format conversion, etc.\n */\n transformFiles?: (files: File[]) => File[] | Promise<File[]>\n}\n\nconst HIDDEN_STYLE =\n 'position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;'\n\nexport function connect(\n state: Signal<FileUploadState>,\n send: Send<FileUploadMsg>,\n opts: ConnectOptions,\n): FileUploadParts {\n const locale = useContext(LocaleContext)\n const inputId = `${opts.id}:input`\n const removeLabel = opts.removeLabel ?? locale.fileUpload.remove\n const clearLabel = opts.clearLabel ?? locale.fileUpload.clear\n\n const runPipeline = async (\n raw: File[],\n ): Promise<{ files: File[]; customRejected: RejectedFile[] }> => {\n let files = raw\n if (opts.transformFiles) files = await opts.transformFiles(files)\n const customRejected: RejectedFile[] = []\n if (opts.validate) {\n const passed: File[] = []\n for (const f of files) {\n const errors = opts.validate(f)\n if (errors && errors.length > 0) customRejected.push({ file: f, errors })\n else passed.push(f)\n }\n files = passed\n }\n return { files, customRejected }\n }\n\n const dispatchAdd = (raw: File[]): void => {\n if (!opts.transformFiles && !opts.validate) {\n send({ type: 'addFiles', files: raw })\n return\n }\n // Fire-and-forget — transforms may be async.\n void runPipeline(raw).then(({ files, customRejected }) => {\n send({ type: 'addFiles', files, customRejected })\n })\n }\n\n const openPicker = (e: MouseEvent): void => {\n const target = e.target as HTMLElement\n if (target.getAttribute('data-part') === 'hidden-input') return\n const root = (e.currentTarget as HTMLElement).closest(\n '[data-scope=\"file-upload\"][data-part=\"root\"]',\n )\n const input = root?.querySelector<HTMLInputElement>(\n '[data-scope=\"file-upload\"][data-part=\"hidden-input\"]',\n )\n input?.click()\n }\n\n return {\n root: {\n 'data-scope': 'file-upload',\n 'data-part': 'root',\n 'data-disabled': state.map((st) => (st.disabled ? '' : undefined)),\n 'data-dragging': state.map((st) => (st.dragging ? '' : undefined)),\n 'data-invalid': state.map((st) => (st.invalid ? '' : undefined)),\n 'data-readonly': state.map((st) => (st.readOnly ? '' : undefined)),\n },\n dropzone: {\n 'data-scope': 'file-upload',\n 'data-part': 'dropzone',\n 'data-dragging': state.map((st) => (st.dragging ? '' : undefined)),\n onClick: openPicker,\n onDragEnter: tagSend(send, ['dragEnter'], (e) => {\n e.preventDefault()\n send({ type: 'dragEnter' })\n }),\n onDragOver: (e) => e.preventDefault(),\n onDragLeave: tagSend(send, ['dragLeave'], (e) => {\n e.preventDefault()\n send({ type: 'dragLeave' })\n }),\n onDrop: tagSend(send, ['drop'], (e) => {\n e.preventDefault()\n const files = Array.from(e.dataTransfer?.files ?? [])\n send({ type: 'drop' })\n dispatchAdd(files)\n }),\n },\n trigger: {\n type: 'button',\n 'data-scope': 'file-upload',\n 'data-part': 'trigger',\n disabled: state.map((st) => st.disabled),\n onClick: openPicker,\n },\n hiddenInput: {\n type: 'file',\n tabIndex: -1,\n 'aria-hidden': 'true',\n style: HIDDEN_STYLE,\n disabled: state.map((st) => st.disabled),\n multiple: state.map((st) => st.multiple),\n accept: state.map((st) => acceptToString(st.accept)),\n required: state.map((st) => st.required),\n 'aria-invalid': state.map((st) => (st.invalid ? 'true' : undefined)),\n ...(opts.capture !== undefined ? { capture: opts.capture } : {}),\n ...(opts.directory === true ? { webkitdirectory: '' as const } : {}),\n 'data-scope': 'file-upload',\n 'data-part': 'hidden-input',\n id: inputId,\n onChange: (e) => {\n const input = e.target as HTMLInputElement\n const files = input.files ? Array.from(input.files) : []\n dispatchAdd(files)\n input.value = ''\n },\n },\n label: {\n for: inputId,\n 'data-scope': 'file-upload',\n 'data-part': 'label',\n },\n clearTrigger: {\n type: 'button',\n 'aria-label': clearLabel,\n 'data-scope': 'file-upload',\n 'data-part': 'clear-trigger',\n onClick: tagSend(send, ['clear'], () => send({ type: 'clear' })),\n },\n itemGroup: {\n 'data-scope': 'file-upload',\n 'data-part': 'item-group',\n },\n item: (index: number): FileUploadItemParts => ({\n item: {\n 'data-scope': 'file-upload',\n 'data-part': 'item',\n 'data-index': String(index),\n },\n itemName: {\n 'data-scope': 'file-upload',\n 'data-part': 'item-name',\n },\n itemSizeText: {\n 'data-scope': 'file-upload',\n 'data-part': 'item-size-text',\n },\n itemPreview: {\n 'data-scope': 'file-upload',\n 'data-part': 'item-preview',\n },\n removeTrigger: {\n type: 'button',\n 'aria-label': removeLabel,\n 'data-scope': 'file-upload',\n 'data-part': 'item-remove',\n onClick: tagSend(send, ['removeFile'], () => send({ type: 'removeFile', index })),\n },\n itemDeleteTrigger: {\n type: 'button',\n 'aria-label': removeLabel,\n 'data-scope': 'file-upload',\n 'data-part': 'item-delete-trigger',\n onClick: tagSend(send, ['removeFile'], () => send({ type: 'removeFile', index })),\n },\n }),\n }\n}\n\nexport const fileUpload = {\n init,\n update,\n connect,\n totalSize,\n acceptToString,\n fileMatchesAccept,\n validateFiles,\n preventDocumentDrop,\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Send } from '@llui/dom';
|
|
1
|
+
import type { Send, Signal } from '@llui/dom';
|
|
2
2
|
/**
|
|
3
3
|
* Floating panel — a draggable + resizable window-like surface, useful
|
|
4
4
|
* for dev tools overlays, pop-out inspectors, preview panels, etc. The
|
|
@@ -137,18 +137,18 @@ export interface FloatingPanelInit {
|
|
|
137
137
|
}
|
|
138
138
|
export declare function init(opts?: FloatingPanelInit): FloatingPanelState;
|
|
139
139
|
export declare function update(state: FloatingPanelState, msg: FloatingPanelMsg): [FloatingPanelState, never[]];
|
|
140
|
-
export interface FloatingPanelParts
|
|
140
|
+
export interface FloatingPanelParts {
|
|
141
141
|
root: {
|
|
142
142
|
role: 'dialog';
|
|
143
|
-
'aria-label': string
|
|
143
|
+
'aria-label': string;
|
|
144
144
|
'data-scope': 'floating-panel';
|
|
145
145
|
'data-part': 'root';
|
|
146
|
-
'data-dragging':
|
|
147
|
-
'data-resizing':
|
|
148
|
-
'data-minimized':
|
|
149
|
-
'data-maximized':
|
|
150
|
-
hidden:
|
|
151
|
-
style:
|
|
146
|
+
'data-dragging': Signal<'' | undefined>;
|
|
147
|
+
'data-resizing': Signal<'' | undefined>;
|
|
148
|
+
'data-minimized': Signal<'' | undefined>;
|
|
149
|
+
'data-maximized': Signal<'' | undefined>;
|
|
150
|
+
hidden: Signal<boolean>;
|
|
151
|
+
style: Signal<string>;
|
|
152
152
|
};
|
|
153
153
|
dragHandle: {
|
|
154
154
|
'data-scope': 'floating-panel';
|
|
@@ -158,25 +158,25 @@ export interface FloatingPanelParts<S> {
|
|
|
158
158
|
content: {
|
|
159
159
|
'data-scope': 'floating-panel';
|
|
160
160
|
'data-part': 'content';
|
|
161
|
-
hidden:
|
|
161
|
+
hidden: Signal<boolean>;
|
|
162
162
|
};
|
|
163
163
|
minimizeTrigger: {
|
|
164
164
|
type: 'button';
|
|
165
|
-
'aria-label': string
|
|
165
|
+
'aria-label': string;
|
|
166
166
|
'data-scope': 'floating-panel';
|
|
167
167
|
'data-part': 'minimize-trigger';
|
|
168
168
|
onClick: (e: MouseEvent) => void;
|
|
169
169
|
};
|
|
170
170
|
maximizeTrigger: {
|
|
171
171
|
type: 'button';
|
|
172
|
-
'aria-label': string
|
|
172
|
+
'aria-label': string;
|
|
173
173
|
'data-scope': 'floating-panel';
|
|
174
174
|
'data-part': 'maximize-trigger';
|
|
175
175
|
onClick: (e: MouseEvent) => void;
|
|
176
176
|
};
|
|
177
177
|
closeTrigger: {
|
|
178
178
|
type: 'button';
|
|
179
|
-
'aria-label': string
|
|
179
|
+
'aria-label': string;
|
|
180
180
|
'data-scope': 'floating-panel';
|
|
181
181
|
'data-part': 'close-trigger';
|
|
182
182
|
onClick: (e: MouseEvent) => void;
|
|
@@ -194,7 +194,7 @@ export interface ConnectOptions {
|
|
|
194
194
|
maximizeLabel?: string;
|
|
195
195
|
closeLabel?: string;
|
|
196
196
|
}
|
|
197
|
-
export declare function connect
|
|
197
|
+
export declare function connect(state: Signal<FloatingPanelState>, send: Send<FloatingPanelMsg>, opts?: ConnectOptions): FloatingPanelParts;
|
|
198
198
|
export declare const floatingPanel: {
|
|
199
199
|
init: typeof init;
|
|
200
200
|
update: typeof update;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floating-panel.d.ts","sourceRoot":"","sources":["../../src/components/floating-panel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"floating-panel.d.ts","sourceRoot":"","sources":["../../src/components/floating-panel.ts"],"names":[],"mappings":"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"}
|
|
@@ -137,27 +137,26 @@ export function update(state, msg) {
|
|
|
137
137
|
}
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
|
-
export function connect(
|
|
140
|
+
export function connect(state, send, opts = {}) {
|
|
141
141
|
const locale = useContext(LocaleContext);
|
|
142
142
|
return {
|
|
143
143
|
root: {
|
|
144
144
|
role: 'dialog',
|
|
145
|
-
'aria-label': opts.label ??
|
|
145
|
+
'aria-label': opts.label ?? locale.floatingPanel.label,
|
|
146
146
|
'data-scope': 'floating-panel',
|
|
147
147
|
'data-part': 'root',
|
|
148
|
-
'data-dragging': (
|
|
149
|
-
'data-resizing': (
|
|
150
|
-
'data-minimized': (
|
|
151
|
-
'data-maximized': (
|
|
152
|
-
hidden: (
|
|
153
|
-
style: (
|
|
154
|
-
const st = get(s);
|
|
148
|
+
'data-dragging': state.map((st) => (st.dragging ? '' : undefined)),
|
|
149
|
+
'data-resizing': state.map((st) => (st.resizing !== null ? '' : undefined)),
|
|
150
|
+
'data-minimized': state.map((st) => (st.minimized ? '' : undefined)),
|
|
151
|
+
'data-maximized': state.map((st) => (st.maximized ? '' : undefined)),
|
|
152
|
+
hidden: state.map((st) => !st.open),
|
|
153
|
+
style: state.map((st) => {
|
|
155
154
|
if (st.maximized)
|
|
156
155
|
return 'position:fixed;inset:0;width:auto;height:auto;';
|
|
157
156
|
return (`position:fixed;` +
|
|
158
157
|
`left:${st.position.x}px;top:${st.position.y}px;` +
|
|
159
158
|
`width:${st.size.width}px;height:${st.size.height}px;`);
|
|
160
|
-
},
|
|
159
|
+
}),
|
|
161
160
|
},
|
|
162
161
|
dragHandle: {
|
|
163
162
|
'data-scope': 'floating-panel',
|
|
@@ -167,25 +166,25 @@ export function connect(get, send, opts = {}) {
|
|
|
167
166
|
content: {
|
|
168
167
|
'data-scope': 'floating-panel',
|
|
169
168
|
'data-part': 'content',
|
|
170
|
-
hidden: (
|
|
169
|
+
hidden: state.map((st) => st.minimized),
|
|
171
170
|
},
|
|
172
171
|
minimizeTrigger: {
|
|
173
172
|
type: 'button',
|
|
174
|
-
'aria-label': opts.minimizeLabel ??
|
|
173
|
+
'aria-label': opts.minimizeLabel ?? locale.floatingPanel.minimize,
|
|
175
174
|
'data-scope': 'floating-panel',
|
|
176
175
|
'data-part': 'minimize-trigger',
|
|
177
176
|
onClick: tagSend(send, ['toggleMinimize'], () => send({ type: 'toggleMinimize' })),
|
|
178
177
|
},
|
|
179
178
|
maximizeTrigger: {
|
|
180
179
|
type: 'button',
|
|
181
|
-
'aria-label': opts.maximizeLabel ??
|
|
180
|
+
'aria-label': opts.maximizeLabel ?? locale.floatingPanel.maximize,
|
|
182
181
|
'data-scope': 'floating-panel',
|
|
183
182
|
'data-part': 'maximize-trigger',
|
|
184
183
|
onClick: tagSend(send, ['toggleMaximize'], () => send({ type: 'toggleMaximize' })),
|
|
185
184
|
},
|
|
186
185
|
closeTrigger: {
|
|
187
186
|
type: 'button',
|
|
188
|
-
'aria-label': opts.closeLabel ??
|
|
187
|
+
'aria-label': opts.closeLabel ?? locale.floatingPanel.close,
|
|
189
188
|
'data-scope': 'floating-panel',
|
|
190
189
|
'data-part': 'close-trigger',
|
|
191
190
|
onClick: tagSend(send, ['close'], () => send({ type: 'close' })),
|