snice 3.10.5 → 4.0.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/bin/templates/CLAUDE.md +7 -7
- package/dist/components/audio-recorder/snice-audio-recorder.js +6 -6
- package/dist/components/audio-recorder/snice-audio-recorder.js.map +1 -1
- package/dist/components/banner/snice-banner.js +3 -3
- package/dist/components/banner/snice-banner.js.map +1 -1
- package/dist/components/button/snice-button.js +1 -1
- package/dist/components/calendar/snice-calendar.js +2 -2
- package/dist/components/calendar/snice-calendar.js.map +1 -1
- package/dist/components/camera/snice-camera.d.ts +2 -0
- package/dist/components/camera/snice-camera.js +26 -7
- package/dist/components/camera/snice-camera.js.map +1 -1
- package/dist/components/carousel/snice-carousel.js +1 -1
- package/dist/components/carousel/snice-carousel.js.map +1 -1
- package/dist/components/checkbox/snice-checkbox.js +3 -3
- package/dist/components/checkbox/snice-checkbox.js.map +1 -1
- package/dist/components/color-picker/snice-color-picker.js +4 -4
- package/dist/components/color-picker/snice-color-picker.js.map +1 -1
- package/dist/components/command-palette/snice-command-palette.js +5 -5
- package/dist/components/command-palette/snice-command-palette.js.map +1 -1
- package/dist/components/date-picker/snice-date-picker.js +8 -8
- package/dist/components/date-picker/snice-date-picker.js.map +1 -1
- package/dist/components/draw/snice-draw.js +5 -5
- package/dist/components/draw/snice-draw.js.map +1 -1
- package/dist/components/drawer/snice-drawer.js +2 -2
- package/dist/components/drawer/snice-drawer.js.map +1 -1
- package/dist/components/empty-state/snice-empty-state.js +1 -1
- package/dist/components/empty-state/snice-empty-state.js.map +1 -1
- package/dist/components/file-gallery/snice-file-gallery.d.ts +1 -1
- package/dist/components/file-gallery/snice-file-gallery.js +20 -20
- package/dist/components/file-gallery/snice-file-gallery.js.map +1 -1
- package/dist/components/file-gallery/snice-file-gallery.types.d.ts +0 -1
- package/dist/components/file-upload/snice-file-upload.js +2 -2
- package/dist/components/file-upload/snice-file-upload.js.map +1 -1
- package/dist/components/input/snice-input.js +5 -5
- package/dist/components/input/snice-input.js.map +1 -1
- package/dist/components/kanban/snice-kanban.js +2 -2
- package/dist/components/kanban/snice-kanban.js.map +1 -1
- package/dist/components/location/snice-location.js +1 -1
- package/dist/components/location/snice-location.js.map +1 -1
- package/dist/components/login/snice-login.js +4 -4
- package/dist/components/login/snice-login.js.map +1 -1
- package/dist/components/menu/snice-menu-item.js +1 -1
- package/dist/components/menu/snice-menu-item.js.map +1 -1
- package/dist/components/menu/snice-menu.js +3 -3
- package/dist/components/menu/snice-menu.js.map +1 -1
- package/dist/components/modal/snice-modal.js +2 -2
- package/dist/components/modal/snice-modal.js.map +1 -1
- package/dist/components/music-player/snice-music-player.js +10 -10
- package/dist/components/music-player/snice-music-player.js.map +1 -1
- package/dist/components/pagination/snice-pagination.js +1 -1
- package/dist/components/pagination/snice-pagination.js.map +1 -1
- package/dist/components/qr-reader/snice-qr-reader.js +3 -3
- package/dist/components/qr-reader/snice-qr-reader.js.map +1 -1
- package/dist/components/radio/snice-radio.js +1 -1
- package/dist/components/radio/snice-radio.js.map +1 -1
- package/dist/components/select/snice-select.js +3 -3
- package/dist/components/select/snice-select.js.map +1 -1
- package/dist/components/slider/snice-slider.js +2 -2
- package/dist/components/slider/snice-slider.js.map +1 -1
- package/dist/components/split-pane/snice-split-pane.js +1 -1
- package/dist/components/split-pane/snice-split-pane.js.map +1 -1
- package/dist/components/switch/snice-switch.js +1 -1
- package/dist/components/switch/snice-switch.js.map +1 -1
- package/dist/components/table/snice-cell-actions.js +1 -1
- package/dist/components/table/snice-cell-actions.js.map +1 -1
- package/dist/components/table/snice-column.js +1 -1
- package/dist/components/table/snice-column.js.map +1 -1
- package/dist/components/table/snice-header.js +3 -3
- package/dist/components/table/snice-header.js.map +1 -1
- package/dist/components/table/snice-row.js +3 -3
- package/dist/components/table/snice-row.js.map +1 -1
- package/dist/components/table/snice-table.js +3 -3
- package/dist/components/table/snice-table.js.map +1 -1
- package/dist/components/tabs/snice-tab.js +2 -2
- package/dist/components/tabs/snice-tab.js.map +1 -1
- package/dist/components/tabs/snice-tabs.js +2 -2
- package/dist/components/tabs/snice-tabs.js.map +1 -1
- package/dist/components/terminal/snice-terminal.js +3 -3
- package/dist/components/terminal/snice-terminal.js.map +1 -1
- package/dist/components/textarea/snice-textarea.js +4 -4
- package/dist/components/textarea/snice-textarea.js.map +1 -1
- package/dist/components/theme/theme.css +3 -0
- package/dist/components/timer/snice-timer.js +4 -4
- package/dist/components/timer/snice-timer.js.map +1 -1
- package/dist/components/tree/snice-tree-item.js +1 -1
- package/dist/components/tree/snice-tree-item.js.map +1 -1
- package/dist/components/tree/snice-tree.js +5 -5
- package/dist/components/tree/snice-tree.js.map +1 -1
- package/dist/index.cjs +7 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +7 -3
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +7 -3
- package/dist/index.iife.js.map +1 -1
- package/dist/symbols.cjs +1 -1
- package/dist/symbols.esm.js +1 -1
- package/dist/transitions.cjs +1 -1
- package/dist/transitions.esm.js +1 -1
- package/docs/ai/components/audio-recorder.md +6 -6
- package/docs/ai/components/calendar.md +2 -2
- package/docs/ai/components/camera.md +13 -6
- package/docs/ai/components/carousel.md +1 -1
- package/docs/ai/components/color-picker.md +1 -1
- package/docs/ai/components/command-palette.md +6 -6
- package/docs/ai/components/draw.md +5 -5
- package/docs/ai/components/drawer.md +2 -2
- package/docs/ai/components/empty-state.md +1 -1
- package/docs/ai/components/file-gallery.md +7 -6
- package/docs/ai/components/file-upload.md +2 -2
- package/docs/ai/components/kanban.md +3 -3
- package/docs/ai/components/menu.md +3 -3
- package/docs/ai/components/modal.md +2 -2
- package/docs/ai/components/music-player.md +9 -9
- package/docs/ai/components/pagination.md +2 -2
- package/docs/ai/components/qr-reader.md +4 -4
- package/docs/ai/components/select.md +4 -4
- package/docs/ai/components/slider.md +1 -1
- package/docs/ai/components/split-pane.md +1 -1
- package/docs/ai/components/switch.md +2 -2
- package/docs/ai/components/tabs.md +4 -4
- package/docs/ai/components/terminal.md +1 -1
- package/docs/ai/components/timer.md +4 -4
- package/docs/ai/components/tree.md +7 -7
- package/docs/components/audio-recorder.md +7 -7
- package/docs/components/banner.md +4 -4
- package/docs/components/calendar.md +11 -11
- package/docs/components/camera.md +33 -10
- package/docs/components/carousel.md +1 -1
- package/docs/components/color-picker.md +1 -1
- package/docs/components/command-palette.md +6 -6
- package/docs/components/draw.md +6 -6
- package/docs/components/drawer.md +6 -6
- package/docs/components/empty-state.md +1 -1
- package/docs/components/file-gallery.md +24 -23
- package/docs/components/file-upload.md +7 -7
- package/docs/components/kanban.md +7 -7
- package/docs/components/menu.md +11 -11
- package/docs/components/modal.md +7 -7
- package/docs/components/music-player.md +16 -16
- package/docs/components/pagination.md +5 -5
- package/docs/components/qr-reader.md +12 -12
- package/docs/components/select.md +9 -9
- package/docs/components/slider.md +6 -6
- package/docs/components/split-pane.md +2 -2
- package/docs/components/switch.md +4 -4
- package/docs/components/tabs.md +10 -10
- package/docs/components/terminal.md +6 -6
- package/docs/components/textarea.md +7 -7
- package/docs/components/timer.md +8 -8
- package/docs/components/tree.md +9 -9
- package/package.json +1 -1
|
@@ -11,7 +11,7 @@ Display and select dates with event support.
|
|
|
11
11
|
```javascript
|
|
12
12
|
const calendar = document.querySelector('snice-calendar');
|
|
13
13
|
|
|
14
|
-
calendar.addEventListener('
|
|
14
|
+
calendar.addEventListener('calendar-change', (e) => {
|
|
15
15
|
console.log('Selected date:', e.detail.value);
|
|
16
16
|
});
|
|
17
17
|
```
|
|
@@ -120,22 +120,22 @@ console.log(`Today has ${events.length} events`);
|
|
|
120
120
|
|
|
121
121
|
## Events
|
|
122
122
|
|
|
123
|
-
###
|
|
123
|
+
### `calendar-change`
|
|
124
124
|
Dispatched when selected date changes.
|
|
125
125
|
|
|
126
126
|
```javascript
|
|
127
|
-
calendar.addEventListener('
|
|
127
|
+
calendar.addEventListener('calendar-change', (e) => {
|
|
128
128
|
console.log('Selected:', e.detail.value);
|
|
129
129
|
});
|
|
130
130
|
```
|
|
131
131
|
|
|
132
132
|
**Detail:** `{ value: Date, calendar: SniceCalendarElement }`
|
|
133
133
|
|
|
134
|
-
###
|
|
134
|
+
### `calendar-event-click`
|
|
135
135
|
Dispatched when event is clicked.
|
|
136
136
|
|
|
137
137
|
```javascript
|
|
138
|
-
calendar.addEventListener('
|
|
138
|
+
calendar.addEventListener('calendar-event-click', (e) => {
|
|
139
139
|
console.log('Event clicked:', e.detail.event);
|
|
140
140
|
});
|
|
141
141
|
```
|
|
@@ -226,13 +226,13 @@ calendar.nextMonth();
|
|
|
226
226
|
|
|
227
227
|
```javascript
|
|
228
228
|
// Date selection
|
|
229
|
-
calendar.addEventListener('
|
|
229
|
+
calendar.addEventListener('calendar-change', (e) => {
|
|
230
230
|
console.log('Date selected:', e.detail.value);
|
|
231
231
|
updateBookingForm(e.detail.value);
|
|
232
232
|
});
|
|
233
233
|
|
|
234
234
|
// Event clicks
|
|
235
|
-
calendar.addEventListener('
|
|
235
|
+
calendar.addEventListener('calendar-event-click', (e) => {
|
|
236
236
|
showEventDetails(e.detail.event);
|
|
237
237
|
});
|
|
238
238
|
```
|
|
@@ -256,7 +256,7 @@ const fullyBooked = await getFullyBookedDates();
|
|
|
256
256
|
calendar.disabledDates = fullyBooked;
|
|
257
257
|
|
|
258
258
|
// Handle new booking
|
|
259
|
-
calendar.addEventListener('
|
|
259
|
+
calendar.addEventListener('calendar-change', (e) => {
|
|
260
260
|
if (hasAvailability(e.detail.value)) {
|
|
261
261
|
showBookingForm(e.detail.value);
|
|
262
262
|
}
|
|
@@ -290,7 +290,7 @@ calendar.events = teamMeetings.map(m => ({
|
|
|
290
290
|
}));
|
|
291
291
|
|
|
292
292
|
// Click to see meeting details
|
|
293
|
-
calendar.addEventListener('
|
|
293
|
+
calendar.addEventListener('calendar-event-click', (e) => {
|
|
294
294
|
const meeting = e.detail.event;
|
|
295
295
|
showModal({
|
|
296
296
|
title: meeting.title,
|
|
@@ -312,7 +312,7 @@ calendar.minDate = today;
|
|
|
312
312
|
calendar.maxDate = new Date(today.getFullYear(), today.getMonth() + 3, 0);
|
|
313
313
|
|
|
314
314
|
// Handle selection
|
|
315
|
-
calendar.addEventListener('
|
|
315
|
+
calendar.addEventListener('calendar-change', (e) => {
|
|
316
316
|
checkAvailability(e.detail.value).then(slots => {
|
|
317
317
|
if (slots.length > 0) {
|
|
318
318
|
showTimeSlots(slots);
|
|
@@ -355,7 +355,7 @@ calendar.events = vacations.map(v => ({
|
|
|
355
355
|
calendar.disabledDates = companyHolidays;
|
|
356
356
|
|
|
357
357
|
// Request new vacation
|
|
358
|
-
calendar.addEventListener('
|
|
358
|
+
calendar.addEventListener('calendar-change', (e) => {
|
|
359
359
|
if (canRequestVacation(e.detail.value)) {
|
|
360
360
|
showVacationRequestForm(e.detail.value);
|
|
361
361
|
}
|
|
@@ -30,7 +30,8 @@ Live camera feed with built-in mobile-style controls and flexible positioning.
|
|
|
30
30
|
| `showControls` | `boolean` | `true` | Show built-in controls |
|
|
31
31
|
| `width` | `number` | `1280` | Video width (resolution) |
|
|
32
32
|
| `height` | `number` | `720` | Video height (resolution) |
|
|
33
|
-
| `aspectRatio` | `string` | `''` | Aspect ratio: `'16:9'`, `'4:3'`, `'1:1'`, `'21:9'` |
|
|
33
|
+
| `aspectRatio` | `string` | `''` | Aspect ratio: `'16:9'`, `'9:16'`, `'4:3'`, `'1:1'`, `'21:9'` |
|
|
34
|
+
| `objectFit` | `'contain' \| 'cover'` | `'contain'` | How video fits container: `contain` (full video) or `cover` (fills frame, may crop) |
|
|
34
35
|
|
|
35
36
|
## Control Positions
|
|
36
37
|
|
|
@@ -118,39 +119,39 @@ camera.toggleFullscreen();
|
|
|
118
119
|
|
|
119
120
|
## Events
|
|
120
121
|
|
|
121
|
-
###
|
|
122
|
+
### `camera-start`
|
|
122
123
|
Camera started successfully.
|
|
123
124
|
|
|
124
125
|
```javascript
|
|
125
|
-
camera.addEventListener('
|
|
126
|
+
camera.addEventListener('camera-start', (e) => {
|
|
126
127
|
console.log('Camera on', e.detail.stream);
|
|
127
128
|
});
|
|
128
129
|
```
|
|
129
130
|
|
|
130
|
-
###
|
|
131
|
+
### `camera-stop`
|
|
131
132
|
Camera stopped.
|
|
132
133
|
|
|
133
134
|
```javascript
|
|
134
|
-
camera.addEventListener('
|
|
135
|
+
camera.addEventListener('camera-stop', () => {
|
|
135
136
|
console.log('Camera off');
|
|
136
137
|
});
|
|
137
138
|
```
|
|
138
139
|
|
|
139
|
-
###
|
|
140
|
+
### `camera-capture`
|
|
140
141
|
Photo captured.
|
|
141
142
|
|
|
142
143
|
```javascript
|
|
143
|
-
camera.addEventListener('
|
|
144
|
+
camera.addEventListener('camera-capture', (e) => {
|
|
144
145
|
const image = e.detail.image;
|
|
145
146
|
console.log(image.dataURL);
|
|
146
147
|
});
|
|
147
148
|
```
|
|
148
149
|
|
|
149
|
-
###
|
|
150
|
+
### `camera-error`
|
|
150
151
|
Camera error occurred.
|
|
151
152
|
|
|
152
153
|
```javascript
|
|
153
|
-
camera.addEventListener('
|
|
154
|
+
camera.addEventListener('camera-error', (e) => {
|
|
154
155
|
console.error(e.detail.error);
|
|
155
156
|
});
|
|
156
157
|
```
|
|
@@ -222,6 +223,9 @@ Auto-starts camera with controls at bottom-right (portrait) or right (landscape)
|
|
|
222
223
|
<!-- 16:9 widescreen -->
|
|
223
224
|
<snice-camera aspect-ratio="16:9"></snice-camera>
|
|
224
225
|
|
|
226
|
+
<!-- 9:16 portrait -->
|
|
227
|
+
<snice-camera aspect-ratio="9:16" width="720" height="1280"></snice-camera>
|
|
228
|
+
|
|
225
229
|
<!-- 4:3 classic -->
|
|
226
230
|
<snice-camera aspect-ratio="4:3"></snice-camera>
|
|
227
231
|
|
|
@@ -232,6 +236,25 @@ Auto-starts camera with controls at bottom-right (portrait) or right (landscape)
|
|
|
232
236
|
<snice-camera aspect-ratio="21:9"></snice-camera>
|
|
233
237
|
```
|
|
234
238
|
|
|
239
|
+
### Object Fit Modes
|
|
240
|
+
|
|
241
|
+
```html
|
|
242
|
+
<!-- Contain (default) - Shows full video with possible letterboxing -->
|
|
243
|
+
<snice-camera object-fit="contain"></snice-camera>
|
|
244
|
+
|
|
245
|
+
<!-- Cover - Fills entire container, may crop video -->
|
|
246
|
+
<snice-camera object-fit="cover"></snice-camera>
|
|
247
|
+
|
|
248
|
+
<!-- Portrait with cover for full-screen mobile -->
|
|
249
|
+
<snice-camera
|
|
250
|
+
aspect-ratio="9:16"
|
|
251
|
+
object-fit="cover"
|
|
252
|
+
width="720"
|
|
253
|
+
height="1280"
|
|
254
|
+
style="height: 100vh;">
|
|
255
|
+
</snice-camera>
|
|
256
|
+
```
|
|
257
|
+
|
|
235
258
|
### Fullscreen
|
|
236
259
|
|
|
237
260
|
```html
|
|
@@ -263,7 +286,7 @@ await fetch('/upload', { method: 'POST', body: formData });
|
|
|
263
286
|
```javascript
|
|
264
287
|
const gallery = [];
|
|
265
288
|
|
|
266
|
-
camera.addEventListener('
|
|
289
|
+
camera.addEventListener('camera-capture', (e) => {
|
|
267
290
|
gallery.push(e.detail.image);
|
|
268
291
|
displayGallery();
|
|
269
292
|
});
|
|
@@ -36,7 +36,7 @@ Image/content carousel with autoplay, loop, and navigation controls.
|
|
|
36
36
|
|
|
37
37
|
## Events
|
|
38
38
|
|
|
39
|
-
-
|
|
39
|
+
- `carousel-slide-change` - Slide changed (detail: { activeIndex, previousIndex, carousel })
|
|
40
40
|
|
|
41
41
|
## Examples
|
|
42
42
|
|
|
@@ -77,11 +77,11 @@ interface CommandItem {
|
|
|
77
77
|
|
|
78
78
|
## Events
|
|
79
79
|
|
|
80
|
-
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
-
|
|
84
|
-
-
|
|
80
|
+
- `command-palette-open` - Fired when palette opens
|
|
81
|
+
- `command-palette-close` - Fired when palette closes
|
|
82
|
+
- `command-select` - Fired when command is selected (detail: { command, palette })
|
|
83
|
+
- `command-execute` - Fired when command is executed (detail: { command, palette })
|
|
84
|
+
- `command-search` - Fired when search changes (detail: { query, results, palette })
|
|
85
85
|
|
|
86
86
|
## Keyboard Shortcuts
|
|
87
87
|
|
|
@@ -141,7 +141,7 @@ palette.commands = [
|
|
|
141
141
|
### Event Handling
|
|
142
142
|
|
|
143
143
|
```javascript
|
|
144
|
-
palette.addEventListener('
|
|
144
|
+
palette.addEventListener('command-execute', (e) => {
|
|
145
145
|
console.log('Executed:', e.detail.command.label);
|
|
146
146
|
analytics.track('command_executed', { command: e.detail.command.id });
|
|
147
147
|
});
|
package/docs/components/draw.md
CHANGED
|
@@ -80,11 +80,11 @@ Set strokes (for loading saved drawings).
|
|
|
80
80
|
|
|
81
81
|
## Events
|
|
82
82
|
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
-
|
|
83
|
+
- `draw-start` - Drawing started
|
|
84
|
+
- `draw-end` - Drawing ended (stroke complete)
|
|
85
|
+
- `draw-clear` - Canvas cleared
|
|
86
|
+
- `draw-undo` - Undo performed
|
|
87
|
+
- `draw-redo` - Redo performed
|
|
88
88
|
|
|
89
89
|
## Examples
|
|
90
90
|
|
|
@@ -190,7 +190,7 @@ await draw.loadImage('background.jpg');
|
|
|
190
190
|
### Event Handling
|
|
191
191
|
|
|
192
192
|
```javascript
|
|
193
|
-
draw.addEventListener('
|
|
193
|
+
draw.addEventListener('draw-end', (e) => {
|
|
194
194
|
const stroke = e.detail.stroke;
|
|
195
195
|
console.log(`Drew ${stroke.points.length} points`);
|
|
196
196
|
|
|
@@ -79,7 +79,7 @@ drawer.toggle();
|
|
|
79
79
|
|
|
80
80
|
## Events
|
|
81
81
|
|
|
82
|
-
###
|
|
82
|
+
### `drawer-open`
|
|
83
83
|
Fired when the drawer opens.
|
|
84
84
|
|
|
85
85
|
**Event Detail:**
|
|
@@ -91,12 +91,12 @@ Fired when the drawer opens.
|
|
|
91
91
|
|
|
92
92
|
**Usage:**
|
|
93
93
|
```typescript
|
|
94
|
-
drawer.addEventListener('
|
|
94
|
+
drawer.addEventListener('drawer-open', (e) => {
|
|
95
95
|
console.log('Drawer opened:', e.detail.drawer);
|
|
96
96
|
});
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
-
###
|
|
99
|
+
### `drawer-close`
|
|
100
100
|
Fired when the drawer closes.
|
|
101
101
|
|
|
102
102
|
**Event Detail:**
|
|
@@ -108,7 +108,7 @@ Fired when the drawer closes.
|
|
|
108
108
|
|
|
109
109
|
**Usage:**
|
|
110
110
|
```typescript
|
|
111
|
-
drawer.addEventListener('
|
|
111
|
+
drawer.addEventListener('drawer-close', (e) => {
|
|
112
112
|
console.log('Drawer closed:', e.detail.drawer);
|
|
113
113
|
});
|
|
114
114
|
```
|
|
@@ -397,12 +397,12 @@ import type { SniceDrawerElement } from 'snice/components/drawer/snice-drawer.ty
|
|
|
397
397
|
|
|
398
398
|
const drawer = document.querySelector<SniceDrawerElement>('snice-drawer');
|
|
399
399
|
|
|
400
|
-
drawer.addEventListener('
|
|
400
|
+
drawer.addEventListener('drawer-open', () => {
|
|
401
401
|
console.log('Drawer opened');
|
|
402
402
|
// Pause video, load content, etc.
|
|
403
403
|
});
|
|
404
404
|
|
|
405
|
-
drawer.addEventListener('
|
|
405
|
+
drawer.addEventListener('drawer-close', () => {
|
|
406
406
|
console.log('Drawer closed');
|
|
407
407
|
// Resume video, save state, etc.
|
|
408
408
|
});
|
|
@@ -54,8 +54,8 @@ controller.attach?.(document.body);
|
|
|
54
54
|
| `allowPause` | `boolean` | `true` | Allow pause/resume of uploads |
|
|
55
55
|
| `allowDelete` | `boolean` | `true` | Allow file deletion |
|
|
56
56
|
| `autoUpload` | `boolean` | `true` | Start upload immediately on file add |
|
|
57
|
-
| `
|
|
58
|
-
| `
|
|
57
|
+
| `showDropzone` | `boolean` | `true` | Show drop zone for drag & drop uploads |
|
|
58
|
+
| `showAddButton` | `boolean` | `false` | Show add button tile in gallery |
|
|
59
59
|
| `files` | `GalleryFile[]` | `[]` | Current files (read-only) |
|
|
60
60
|
|
|
61
61
|
## Methods
|
|
@@ -293,68 +293,68 @@ gallery.removeFileBadge('file-id-123');
|
|
|
293
293
|
|
|
294
294
|
## Events
|
|
295
295
|
|
|
296
|
-
###
|
|
296
|
+
### `files-change`
|
|
297
297
|
Fired when files are added or removed.
|
|
298
298
|
|
|
299
299
|
**Detail**: `{ files: GalleryFile[] }`
|
|
300
300
|
|
|
301
301
|
```typescript
|
|
302
|
-
gallery.addEventListener('
|
|
302
|
+
gallery.addEventListener('files-change', (e) => {
|
|
303
303
|
console.log('Files:', e.detail.files);
|
|
304
304
|
});
|
|
305
305
|
```
|
|
306
306
|
|
|
307
|
-
###
|
|
307
|
+
### `upload-progress`
|
|
308
308
|
Fired during upload progress.
|
|
309
309
|
|
|
310
310
|
**Detail**: `{ file: GalleryFile, progress: number }`
|
|
311
311
|
|
|
312
312
|
```typescript
|
|
313
|
-
gallery.addEventListener('
|
|
313
|
+
gallery.addEventListener('upload-progress', (e) => {
|
|
314
314
|
console.log(`${e.detail.file.file.name}: ${e.detail.progress}%`);
|
|
315
315
|
});
|
|
316
316
|
```
|
|
317
317
|
|
|
318
|
-
###
|
|
318
|
+
### `upload-complete`
|
|
319
319
|
Fired when an upload completes successfully.
|
|
320
320
|
|
|
321
321
|
**Detail**: `{ file: GalleryFile, url?: string }`
|
|
322
322
|
|
|
323
323
|
```typescript
|
|
324
|
-
gallery.addEventListener('
|
|
324
|
+
gallery.addEventListener('upload-complete', (e) => {
|
|
325
325
|
console.log('Upload complete:', e.detail.url);
|
|
326
326
|
});
|
|
327
327
|
```
|
|
328
328
|
|
|
329
|
-
###
|
|
329
|
+
### `upload-error`
|
|
330
330
|
Fired when an upload fails.
|
|
331
331
|
|
|
332
332
|
**Detail**: `{ file: GalleryFile, error: string }`
|
|
333
333
|
|
|
334
334
|
```typescript
|
|
335
|
-
gallery.addEventListener('
|
|
335
|
+
gallery.addEventListener('upload-error', (e) => {
|
|
336
336
|
console.error('Upload error:', e.detail.error);
|
|
337
337
|
});
|
|
338
338
|
```
|
|
339
339
|
|
|
340
|
-
###
|
|
340
|
+
### `custom-action-click`
|
|
341
341
|
Fired when a custom action button is clicked.
|
|
342
342
|
|
|
343
343
|
**Detail**: `{ actionId: string }`
|
|
344
344
|
|
|
345
345
|
```typescript
|
|
346
|
-
gallery.addEventListener('
|
|
346
|
+
gallery.addEventListener('custom-action-click', (e) => {
|
|
347
347
|
console.log('Custom action clicked:', e.detail.actionId);
|
|
348
348
|
});
|
|
349
349
|
```
|
|
350
350
|
|
|
351
|
-
###
|
|
351
|
+
### `gallery-error`
|
|
352
352
|
Fired when a validation or general error occurs.
|
|
353
353
|
|
|
354
354
|
**Detail**: `{ message: string }`
|
|
355
355
|
|
|
356
356
|
```typescript
|
|
357
|
-
gallery.addEventListener('
|
|
357
|
+
gallery.addEventListener('gallery-error', (e) => {
|
|
358
358
|
console.error('Error:', e.detail.message);
|
|
359
359
|
});
|
|
360
360
|
```
|
|
@@ -498,8 +498,9 @@ async function uploadAll() {
|
|
|
498
498
|
### Add Button Mode
|
|
499
499
|
|
|
500
500
|
```html
|
|
501
|
-
<!--
|
|
501
|
+
<!-- Hide drop zone and show plus tile in gallery instead -->
|
|
502
502
|
<snice-file-gallery
|
|
503
|
+
show-dropzone="false"
|
|
503
504
|
show-add-button="true"
|
|
504
505
|
max-files="6"
|
|
505
506
|
></snice-file-gallery>
|
|
@@ -513,19 +514,19 @@ async function uploadAll() {
|
|
|
513
514
|
<script>
|
|
514
515
|
const gallery = document.getElementById('gallery');
|
|
515
516
|
|
|
516
|
-
gallery.addEventListener('
|
|
517
|
+
gallery.addEventListener('files-change', (e) => {
|
|
517
518
|
console.log('Files changed:', e.detail.files);
|
|
518
519
|
});
|
|
519
520
|
|
|
520
|
-
gallery.addEventListener('
|
|
521
|
+
gallery.addEventListener('upload-progress', (e) => {
|
|
521
522
|
console.log(`${e.detail.file.file.name}: ${e.detail.progress}%`);
|
|
522
523
|
});
|
|
523
524
|
|
|
524
|
-
gallery.addEventListener('
|
|
525
|
+
gallery.addEventListener('upload-complete', (e) => {
|
|
525
526
|
console.log('Upload complete:', e.detail.file.file.name);
|
|
526
527
|
});
|
|
527
528
|
|
|
528
|
-
gallery.addEventListener('
|
|
529
|
+
gallery.addEventListener('upload-error', (e) => {
|
|
529
530
|
console.error('Upload failed:', e.detail.error);
|
|
530
531
|
});
|
|
531
532
|
</script>
|
|
@@ -573,7 +574,7 @@ function clearAll() {
|
|
|
573
574
|
Use badges to show user avatars on files in collaborative scenarios:
|
|
574
575
|
|
|
575
576
|
```html
|
|
576
|
-
<snice-file-gallery id="collab-gallery" show-add-button="true"></snice-file-gallery>
|
|
577
|
+
<snice-file-gallery id="collab-gallery" show-dropzone="false" show-add-button="true"></snice-file-gallery>
|
|
577
578
|
|
|
578
579
|
<script>
|
|
579
580
|
const gallery = document.getElementById('collab-gallery');
|
|
@@ -585,7 +586,7 @@ const users = [
|
|
|
585
586
|
{ name: 'Bob Wilson', initials: 'BW', color: '#10b981', position: 'bottom-right' },
|
|
586
587
|
];
|
|
587
588
|
|
|
588
|
-
gallery.addEventListener('
|
|
589
|
+
gallery.addEventListener('files-change', (e) => {
|
|
589
590
|
const newFiles = e.detail.files.filter(f => !f.badge);
|
|
590
591
|
|
|
591
592
|
newFiles.forEach((file, index) => {
|
|
@@ -615,7 +616,7 @@ gallery.addEventListener('@snice/files-change', (e) => {
|
|
|
615
616
|
### Custom Action Buttons
|
|
616
617
|
|
|
617
618
|
```html
|
|
618
|
-
<snice-file-gallery id="gallery" show-add-button="true"></snice-file-gallery>
|
|
619
|
+
<snice-file-gallery id="gallery" show-dropzone="false" show-add-button="true"></snice-file-gallery>
|
|
619
620
|
|
|
620
621
|
<script>
|
|
621
622
|
const gallery = document.getElementById('gallery');
|
|
@@ -629,7 +630,7 @@ const cameraIcon = `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
|
|
|
629
630
|
const cameraActionId = gallery.addCustomAction(cameraIcon, 'Camera');
|
|
630
631
|
|
|
631
632
|
// Handle camera action
|
|
632
|
-
gallery.addEventListener('
|
|
633
|
+
gallery.addEventListener('custom-action-click', (e) => {
|
|
633
634
|
if (e.detail.actionId === cameraActionId) {
|
|
634
635
|
// Open camera interface
|
|
635
636
|
openCamera().then((imageBlob) => {
|
|
@@ -24,7 +24,7 @@ The `<snice-file-upload>` component provides a file upload interface with drag-a
|
|
|
24
24
|
import 'snice/components/file-upload/snice-file-upload';
|
|
25
25
|
|
|
26
26
|
const upload = document.querySelector('snice-file-upload');
|
|
27
|
-
upload.addEventListener('
|
|
27
|
+
upload.addEventListener('file-upload-change', (e) => {
|
|
28
28
|
console.log('Files:', e.detail.files);
|
|
29
29
|
});
|
|
30
30
|
```
|
|
@@ -68,13 +68,13 @@ upload.removeFile(0); // Remove first file
|
|
|
68
68
|
|
|
69
69
|
## Events
|
|
70
70
|
|
|
71
|
-
###
|
|
71
|
+
### `file-upload-change`
|
|
72
72
|
Fired when files are added or removed.
|
|
73
73
|
|
|
74
74
|
**Detail**: `{ files: File[], fileUpload: SniceFileUploadElement }`
|
|
75
75
|
|
|
76
76
|
```typescript
|
|
77
|
-
upload.addEventListener('
|
|
77
|
+
upload.addEventListener('file-upload-change', (e) => {
|
|
78
78
|
console.log('Selected files:', e.detail.files);
|
|
79
79
|
e.detail.files.forEach(file => {
|
|
80
80
|
console.log(`- ${file.name} (${file.size} bytes)`);
|
|
@@ -82,13 +82,13 @@ upload.addEventListener('@snice/file-upload-change', (e) => {
|
|
|
82
82
|
});
|
|
83
83
|
```
|
|
84
84
|
|
|
85
|
-
###
|
|
85
|
+
### `file-upload-error`
|
|
86
86
|
Fired when file validation fails.
|
|
87
87
|
|
|
88
88
|
**Detail**: `{ message: string, fileUpload: SniceFileUploadElement }`
|
|
89
89
|
|
|
90
90
|
```typescript
|
|
91
|
-
upload.addEventListener('
|
|
91
|
+
upload.addEventListener('file-upload-error', (e) => {
|
|
92
92
|
console.error('Upload error:', e.detail.message);
|
|
93
93
|
});
|
|
94
94
|
```
|
|
@@ -197,7 +197,7 @@ upload.addEventListener('@snice/file-upload-error', (e) => {
|
|
|
197
197
|
|
|
198
198
|
<script>
|
|
199
199
|
const upload = document.querySelector('snice-file-upload');
|
|
200
|
-
upload.addEventListener('
|
|
200
|
+
upload.addEventListener('file-upload-error', (e) => {
|
|
201
201
|
alert(e.detail.message);
|
|
202
202
|
});
|
|
203
203
|
</script>
|
|
@@ -256,7 +256,7 @@ function removeFirst() {
|
|
|
256
256
|
upload.removeFile(0);
|
|
257
257
|
}
|
|
258
258
|
|
|
259
|
-
upload.addEventListener('
|
|
259
|
+
upload.addEventListener('file-upload-change', (e) => {
|
|
260
260
|
console.log(`${e.detail.files.length} file(s) selected`);
|
|
261
261
|
});
|
|
262
262
|
</script>
|
|
@@ -158,11 +158,11 @@ console.log(card.title);
|
|
|
158
158
|
|
|
159
159
|
## Events
|
|
160
160
|
|
|
161
|
-
###
|
|
161
|
+
### `kanban-card-move`
|
|
162
162
|
Dispatched when card is moved between columns.
|
|
163
163
|
|
|
164
164
|
```javascript
|
|
165
|
-
kanban.addEventListener('
|
|
165
|
+
kanban.addEventListener('kanban-card-move', (e) => {
|
|
166
166
|
console.log('Card:', e.detail.card);
|
|
167
167
|
console.log('From:', e.detail.fromColumn);
|
|
168
168
|
console.log('To:', e.detail.toColumn);
|
|
@@ -171,11 +171,11 @@ kanban.addEventListener('@snice/kanban-card-move', (e) => {
|
|
|
171
171
|
|
|
172
172
|
**Detail:** `{ card: KanbanCard, fromColumn: string | number, toColumn: string | number, kanban: SniceKanbanElement }`
|
|
173
173
|
|
|
174
|
-
###
|
|
174
|
+
### `kanban-card-click`
|
|
175
175
|
Dispatched when card is clicked.
|
|
176
176
|
|
|
177
177
|
```javascript
|
|
178
|
-
kanban.addEventListener('
|
|
178
|
+
kanban.addEventListener('kanban-card-click', (e) => {
|
|
179
179
|
showCardDetails(e.detail.card);
|
|
180
180
|
});
|
|
181
181
|
```
|
|
@@ -314,7 +314,7 @@ kanban.columns = [
|
|
|
314
314
|
### Event Handling
|
|
315
315
|
|
|
316
316
|
```javascript
|
|
317
|
-
kanban.addEventListener('
|
|
317
|
+
kanban.addEventListener('kanban-card-move', (e) => {
|
|
318
318
|
// Update backend
|
|
319
319
|
updateCardStatus(e.detail.card.id, e.detail.toColumn);
|
|
320
320
|
|
|
@@ -322,7 +322,7 @@ kanban.addEventListener('@snice/kanban-card-move', (e) => {
|
|
|
322
322
|
showNotification(`Moved "${e.detail.card.title}" to ${e.detail.toColumn}`);
|
|
323
323
|
});
|
|
324
324
|
|
|
325
|
-
kanban.addEventListener('
|
|
325
|
+
kanban.addEventListener('kanban-card-click', (e) => {
|
|
326
326
|
// Show modal with card details
|
|
327
327
|
showCardModal(e.detail.card);
|
|
328
328
|
});
|
|
@@ -492,7 +492,7 @@ kanban.addCard('lead', {
|
|
|
492
492
|
### Persist to Backend
|
|
493
493
|
|
|
494
494
|
```javascript
|
|
495
|
-
kanban.addEventListener('
|
|
495
|
+
kanban.addEventListener('kanban-card-move', async (e) => {
|
|
496
496
|
try {
|
|
497
497
|
await fetch('/api/cards/' + e.detail.card.id, {
|
|
498
498
|
method: 'PATCH',
|
package/docs/components/menu.md
CHANGED
|
@@ -89,7 +89,7 @@ menu.toggleMenu();
|
|
|
89
89
|
|
|
90
90
|
### Container Events
|
|
91
91
|
|
|
92
|
-
####
|
|
92
|
+
#### `menu-open`
|
|
93
93
|
Fired when the menu is opened.
|
|
94
94
|
|
|
95
95
|
**Event Detail:**
|
|
@@ -101,12 +101,12 @@ Fired when the menu is opened.
|
|
|
101
101
|
|
|
102
102
|
**Usage:**
|
|
103
103
|
```typescript
|
|
104
|
-
menu.addEventListener('
|
|
104
|
+
menu.addEventListener('menu-open', (e) => {
|
|
105
105
|
console.log('Menu opened');
|
|
106
106
|
});
|
|
107
107
|
```
|
|
108
108
|
|
|
109
|
-
####
|
|
109
|
+
#### `menu-close`
|
|
110
110
|
Fired when the menu is closed.
|
|
111
111
|
|
|
112
112
|
**Event Detail:**
|
|
@@ -118,7 +118,7 @@ Fired when the menu is closed.
|
|
|
118
118
|
|
|
119
119
|
### Item Events
|
|
120
120
|
|
|
121
|
-
####
|
|
121
|
+
#### `menu-item-select`
|
|
122
122
|
Fired when a menu item is selected.
|
|
123
123
|
|
|
124
124
|
**Event Detail:**
|
|
@@ -131,7 +131,7 @@ Fired when a menu item is selected.
|
|
|
131
131
|
|
|
132
132
|
**Usage:**
|
|
133
133
|
```typescript
|
|
134
|
-
menu.addEventListener('
|
|
134
|
+
menu.addEventListener('menu-item-select', (e) => {
|
|
135
135
|
console.log('Selected item:', e.detail.value);
|
|
136
136
|
});
|
|
137
137
|
```
|
|
@@ -337,7 +337,7 @@ Keyboard shortcut hint displayed after the label.
|
|
|
337
337
|
|
|
338
338
|
<script type="module">
|
|
339
339
|
const menu = document.getElementById('multi-menu');
|
|
340
|
-
menu.addEventListener('
|
|
340
|
+
menu.addEventListener('menu-item-select', (e) => {
|
|
341
341
|
if (e.detail.value === 'done') {
|
|
342
342
|
menu.closeMenu();
|
|
343
343
|
}
|
|
@@ -417,7 +417,7 @@ Keyboard shortcut hint displayed after the label.
|
|
|
417
417
|
menu.openMenu();
|
|
418
418
|
});
|
|
419
419
|
|
|
420
|
-
menu.addEventListener('
|
|
420
|
+
menu.addEventListener('menu-item-select', (e) => {
|
|
421
421
|
console.log('Context action:', e.detail.value);
|
|
422
422
|
});
|
|
423
423
|
</script>
|
|
@@ -430,16 +430,16 @@ import type { SniceMenuElement } from 'snice/components/menu/snice-menu.types';
|
|
|
430
430
|
|
|
431
431
|
const menu = document.querySelector<SniceMenuElement>('snice-menu');
|
|
432
432
|
|
|
433
|
-
menu.addEventListener('
|
|
433
|
+
menu.addEventListener('menu-open', () => {
|
|
434
434
|
console.log('Menu opened');
|
|
435
435
|
// Load dynamic content, track analytics, etc.
|
|
436
436
|
});
|
|
437
437
|
|
|
438
|
-
menu.addEventListener('
|
|
438
|
+
menu.addEventListener('menu-close', () => {
|
|
439
439
|
console.log('Menu closed');
|
|
440
440
|
});
|
|
441
441
|
|
|
442
|
-
menu.addEventListener('
|
|
442
|
+
menu.addEventListener('menu-item-select', (e) => {
|
|
443
443
|
console.log('Selected:', e.detail.value);
|
|
444
444
|
|
|
445
445
|
switch (e.detail.value) {
|
|
@@ -486,7 +486,7 @@ menu.addEventListener('@snice/menu-item-select', (e) => {
|
|
|
486
486
|
menu.appendChild(item);
|
|
487
487
|
});
|
|
488
488
|
|
|
489
|
-
menu.addEventListener('
|
|
489
|
+
menu.addEventListener('menu-item-select', (e) => {
|
|
490
490
|
openFile(e.detail.value);
|
|
491
491
|
});
|
|
492
492
|
</script>
|