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.
Files changed (151) hide show
  1. package/bin/templates/CLAUDE.md +7 -7
  2. package/dist/components/audio-recorder/snice-audio-recorder.js +6 -6
  3. package/dist/components/audio-recorder/snice-audio-recorder.js.map +1 -1
  4. package/dist/components/banner/snice-banner.js +3 -3
  5. package/dist/components/banner/snice-banner.js.map +1 -1
  6. package/dist/components/button/snice-button.js +1 -1
  7. package/dist/components/calendar/snice-calendar.js +2 -2
  8. package/dist/components/calendar/snice-calendar.js.map +1 -1
  9. package/dist/components/camera/snice-camera.d.ts +2 -0
  10. package/dist/components/camera/snice-camera.js +26 -7
  11. package/dist/components/camera/snice-camera.js.map +1 -1
  12. package/dist/components/carousel/snice-carousel.js +1 -1
  13. package/dist/components/carousel/snice-carousel.js.map +1 -1
  14. package/dist/components/checkbox/snice-checkbox.js +3 -3
  15. package/dist/components/checkbox/snice-checkbox.js.map +1 -1
  16. package/dist/components/color-picker/snice-color-picker.js +4 -4
  17. package/dist/components/color-picker/snice-color-picker.js.map +1 -1
  18. package/dist/components/command-palette/snice-command-palette.js +5 -5
  19. package/dist/components/command-palette/snice-command-palette.js.map +1 -1
  20. package/dist/components/date-picker/snice-date-picker.js +8 -8
  21. package/dist/components/date-picker/snice-date-picker.js.map +1 -1
  22. package/dist/components/draw/snice-draw.js +5 -5
  23. package/dist/components/draw/snice-draw.js.map +1 -1
  24. package/dist/components/drawer/snice-drawer.js +2 -2
  25. package/dist/components/drawer/snice-drawer.js.map +1 -1
  26. package/dist/components/empty-state/snice-empty-state.js +1 -1
  27. package/dist/components/empty-state/snice-empty-state.js.map +1 -1
  28. package/dist/components/file-gallery/snice-file-gallery.d.ts +1 -1
  29. package/dist/components/file-gallery/snice-file-gallery.js +20 -20
  30. package/dist/components/file-gallery/snice-file-gallery.js.map +1 -1
  31. package/dist/components/file-gallery/snice-file-gallery.types.d.ts +0 -1
  32. package/dist/components/file-upload/snice-file-upload.js +2 -2
  33. package/dist/components/file-upload/snice-file-upload.js.map +1 -1
  34. package/dist/components/input/snice-input.js +5 -5
  35. package/dist/components/input/snice-input.js.map +1 -1
  36. package/dist/components/kanban/snice-kanban.js +2 -2
  37. package/dist/components/kanban/snice-kanban.js.map +1 -1
  38. package/dist/components/location/snice-location.js +1 -1
  39. package/dist/components/location/snice-location.js.map +1 -1
  40. package/dist/components/login/snice-login.js +4 -4
  41. package/dist/components/login/snice-login.js.map +1 -1
  42. package/dist/components/menu/snice-menu-item.js +1 -1
  43. package/dist/components/menu/snice-menu-item.js.map +1 -1
  44. package/dist/components/menu/snice-menu.js +3 -3
  45. package/dist/components/menu/snice-menu.js.map +1 -1
  46. package/dist/components/modal/snice-modal.js +2 -2
  47. package/dist/components/modal/snice-modal.js.map +1 -1
  48. package/dist/components/music-player/snice-music-player.js +10 -10
  49. package/dist/components/music-player/snice-music-player.js.map +1 -1
  50. package/dist/components/pagination/snice-pagination.js +1 -1
  51. package/dist/components/pagination/snice-pagination.js.map +1 -1
  52. package/dist/components/qr-reader/snice-qr-reader.js +3 -3
  53. package/dist/components/qr-reader/snice-qr-reader.js.map +1 -1
  54. package/dist/components/radio/snice-radio.js +1 -1
  55. package/dist/components/radio/snice-radio.js.map +1 -1
  56. package/dist/components/select/snice-select.js +3 -3
  57. package/dist/components/select/snice-select.js.map +1 -1
  58. package/dist/components/slider/snice-slider.js +2 -2
  59. package/dist/components/slider/snice-slider.js.map +1 -1
  60. package/dist/components/split-pane/snice-split-pane.js +1 -1
  61. package/dist/components/split-pane/snice-split-pane.js.map +1 -1
  62. package/dist/components/switch/snice-switch.js +1 -1
  63. package/dist/components/switch/snice-switch.js.map +1 -1
  64. package/dist/components/table/snice-cell-actions.js +1 -1
  65. package/dist/components/table/snice-cell-actions.js.map +1 -1
  66. package/dist/components/table/snice-column.js +1 -1
  67. package/dist/components/table/snice-column.js.map +1 -1
  68. package/dist/components/table/snice-header.js +3 -3
  69. package/dist/components/table/snice-header.js.map +1 -1
  70. package/dist/components/table/snice-row.js +3 -3
  71. package/dist/components/table/snice-row.js.map +1 -1
  72. package/dist/components/table/snice-table.js +3 -3
  73. package/dist/components/table/snice-table.js.map +1 -1
  74. package/dist/components/tabs/snice-tab.js +2 -2
  75. package/dist/components/tabs/snice-tab.js.map +1 -1
  76. package/dist/components/tabs/snice-tabs.js +2 -2
  77. package/dist/components/tabs/snice-tabs.js.map +1 -1
  78. package/dist/components/terminal/snice-terminal.js +3 -3
  79. package/dist/components/terminal/snice-terminal.js.map +1 -1
  80. package/dist/components/textarea/snice-textarea.js +4 -4
  81. package/dist/components/textarea/snice-textarea.js.map +1 -1
  82. package/dist/components/theme/theme.css +3 -0
  83. package/dist/components/timer/snice-timer.js +4 -4
  84. package/dist/components/timer/snice-timer.js.map +1 -1
  85. package/dist/components/tree/snice-tree-item.js +1 -1
  86. package/dist/components/tree/snice-tree-item.js.map +1 -1
  87. package/dist/components/tree/snice-tree.js +5 -5
  88. package/dist/components/tree/snice-tree.js.map +1 -1
  89. package/dist/index.cjs +7 -3
  90. package/dist/index.cjs.map +1 -1
  91. package/dist/index.esm.js +7 -3
  92. package/dist/index.esm.js.map +1 -1
  93. package/dist/index.iife.js +7 -3
  94. package/dist/index.iife.js.map +1 -1
  95. package/dist/symbols.cjs +1 -1
  96. package/dist/symbols.esm.js +1 -1
  97. package/dist/transitions.cjs +1 -1
  98. package/dist/transitions.esm.js +1 -1
  99. package/docs/ai/components/audio-recorder.md +6 -6
  100. package/docs/ai/components/calendar.md +2 -2
  101. package/docs/ai/components/camera.md +13 -6
  102. package/docs/ai/components/carousel.md +1 -1
  103. package/docs/ai/components/color-picker.md +1 -1
  104. package/docs/ai/components/command-palette.md +6 -6
  105. package/docs/ai/components/draw.md +5 -5
  106. package/docs/ai/components/drawer.md +2 -2
  107. package/docs/ai/components/empty-state.md +1 -1
  108. package/docs/ai/components/file-gallery.md +7 -6
  109. package/docs/ai/components/file-upload.md +2 -2
  110. package/docs/ai/components/kanban.md +3 -3
  111. package/docs/ai/components/menu.md +3 -3
  112. package/docs/ai/components/modal.md +2 -2
  113. package/docs/ai/components/music-player.md +9 -9
  114. package/docs/ai/components/pagination.md +2 -2
  115. package/docs/ai/components/qr-reader.md +4 -4
  116. package/docs/ai/components/select.md +4 -4
  117. package/docs/ai/components/slider.md +1 -1
  118. package/docs/ai/components/split-pane.md +1 -1
  119. package/docs/ai/components/switch.md +2 -2
  120. package/docs/ai/components/tabs.md +4 -4
  121. package/docs/ai/components/terminal.md +1 -1
  122. package/docs/ai/components/timer.md +4 -4
  123. package/docs/ai/components/tree.md +7 -7
  124. package/docs/components/audio-recorder.md +7 -7
  125. package/docs/components/banner.md +4 -4
  126. package/docs/components/calendar.md +11 -11
  127. package/docs/components/camera.md +33 -10
  128. package/docs/components/carousel.md +1 -1
  129. package/docs/components/color-picker.md +1 -1
  130. package/docs/components/command-palette.md +6 -6
  131. package/docs/components/draw.md +6 -6
  132. package/docs/components/drawer.md +6 -6
  133. package/docs/components/empty-state.md +1 -1
  134. package/docs/components/file-gallery.md +24 -23
  135. package/docs/components/file-upload.md +7 -7
  136. package/docs/components/kanban.md +7 -7
  137. package/docs/components/menu.md +11 -11
  138. package/docs/components/modal.md +7 -7
  139. package/docs/components/music-player.md +16 -16
  140. package/docs/components/pagination.md +5 -5
  141. package/docs/components/qr-reader.md +12 -12
  142. package/docs/components/select.md +9 -9
  143. package/docs/components/slider.md +6 -6
  144. package/docs/components/split-pane.md +2 -2
  145. package/docs/components/switch.md +4 -4
  146. package/docs/components/tabs.md +10 -10
  147. package/docs/components/terminal.md +6 -6
  148. package/docs/components/textarea.md +7 -7
  149. package/docs/components/timer.md +8 -8
  150. package/docs/components/tree.md +9 -9
  151. 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('@snice/calendar-change', (e) => {
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
- ### `@snice/calendar-change`
123
+ ### `calendar-change`
124
124
  Dispatched when selected date changes.
125
125
 
126
126
  ```javascript
127
- calendar.addEventListener('@snice/calendar-change', (e) => {
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
- ### `@snice/calendar-event-click`
134
+ ### `calendar-event-click`
135
135
  Dispatched when event is clicked.
136
136
 
137
137
  ```javascript
138
- calendar.addEventListener('@snice/calendar-event-click', (e) => {
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('@snice/calendar-change', (e) => {
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('@snice/calendar-event-click', (e) => {
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('@snice/calendar-change', (e) => {
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('@snice/calendar-event-click', (e) => {
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('@snice/calendar-change', (e) => {
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('@snice/calendar-change', (e) => {
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
- ### `@snice/camera-start`
122
+ ### `camera-start`
122
123
  Camera started successfully.
123
124
 
124
125
  ```javascript
125
- camera.addEventListener('@snice/camera-start', (e) => {
126
+ camera.addEventListener('camera-start', (e) => {
126
127
  console.log('Camera on', e.detail.stream);
127
128
  });
128
129
  ```
129
130
 
130
- ### `@snice/camera-stop`
131
+ ### `camera-stop`
131
132
  Camera stopped.
132
133
 
133
134
  ```javascript
134
- camera.addEventListener('@snice/camera-stop', () => {
135
+ camera.addEventListener('camera-stop', () => {
135
136
  console.log('Camera off');
136
137
  });
137
138
  ```
138
139
 
139
- ### `@snice/camera-capture`
140
+ ### `camera-capture`
140
141
  Photo captured.
141
142
 
142
143
  ```javascript
143
- camera.addEventListener('@snice/camera-capture', (e) => {
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
- ### `@snice/camera-error`
150
+ ### `camera-error`
150
151
  Camera error occurred.
151
152
 
152
153
  ```javascript
153
- camera.addEventListener('@snice/camera-error', (e) => {
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('@snice/camera-capture', (e) => {
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
- - `@snice/carousel-slide-change` - Slide changed (detail: { activeIndex, previousIndex, carousel })
39
+ - `carousel-slide-change` - Slide changed (detail: { activeIndex, previousIndex, carousel })
40
40
 
41
41
  ## Examples
42
42
 
@@ -40,7 +40,7 @@ Blur the color picker.
40
40
 
41
41
  ## Events
42
42
 
43
- ### `@snice/color-picker-change`
43
+ ### `color-picker-change`
44
44
  Fired when color changes.
45
45
 
46
46
  **Detail**: `{ value: string, colorPicker: SniceColorPickerElement }`
@@ -77,11 +77,11 @@ interface CommandItem {
77
77
 
78
78
  ## Events
79
79
 
80
- - `@snice/command-palette-open` - Fired when palette opens
81
- - `@snice/command-palette-close` - Fired when palette closes
82
- - `@snice/command-select` - Fired when command is selected (detail: { command, palette })
83
- - `@snice/command-execute` - Fired when command is executed (detail: { command, palette })
84
- - `@snice/command-search` - Fired when search changes (detail: { query, results, palette })
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('@snice/command-execute', (e) => {
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
  });
@@ -80,11 +80,11 @@ Set strokes (for loading saved drawings).
80
80
 
81
81
  ## Events
82
82
 
83
- - `@snice/draw-start` - Drawing started
84
- - `@snice/draw-end` - Drawing ended (stroke complete)
85
- - `@snice/draw-clear` - Canvas cleared
86
- - `@snice/draw-undo` - Undo performed
87
- - `@snice/draw-redo` - Redo performed
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('@snice/draw-end', (e) => {
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
- ### `@snice/drawer-open`
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('@snice/drawer-open', (e) => {
94
+ drawer.addEventListener('drawer-open', (e) => {
95
95
  console.log('Drawer opened:', e.detail.drawer);
96
96
  });
97
97
  ```
98
98
 
99
- ### `@snice/drawer-close`
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('@snice/drawer-close', (e) => {
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('@snice/drawer-open', () => {
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('@snice/drawer-close', () => {
405
+ drawer.addEventListener('drawer-close', () => {
406
406
  console.log('Drawer closed');
407
407
  // Resume video, save state, etc.
408
408
  });
@@ -25,7 +25,7 @@ The `<snice-empty-state>` component provides a consistent way to display empty o
25
25
 
26
26
  ## Events
27
27
 
28
- ### `@snice/empty-state-action`
28
+ ### `empty-state-action`
29
29
  Fired when action button/link is clicked.
30
30
 
31
31
  ## Examples
@@ -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
- | `showAddButton` | `boolean` | `false` | Show add button tile instead of drop zone |
58
- | `hideAddButton` | `boolean` | `false` | Hide default add button (only show custom actions) |
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
- ### `@snice/files-change`
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('@snice/files-change', (e) => {
302
+ gallery.addEventListener('files-change', (e) => {
303
303
  console.log('Files:', e.detail.files);
304
304
  });
305
305
  ```
306
306
 
307
- ### `@snice/upload-progress`
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('@snice/upload-progress', (e) => {
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
- ### `@snice/upload-complete`
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('@snice/upload-complete', (e) => {
324
+ gallery.addEventListener('upload-complete', (e) => {
325
325
  console.log('Upload complete:', e.detail.url);
326
326
  });
327
327
  ```
328
328
 
329
- ### `@snice/upload-error`
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('@snice/upload-error', (e) => {
335
+ gallery.addEventListener('upload-error', (e) => {
336
336
  console.error('Upload error:', e.detail.error);
337
337
  });
338
338
  ```
339
339
 
340
- ### `@snice/custom-action-click`
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('@snice/custom-action-click', (e) => {
346
+ gallery.addEventListener('custom-action-click', (e) => {
347
347
  console.log('Custom action clicked:', e.detail.actionId);
348
348
  });
349
349
  ```
350
350
 
351
- ### `@snice/error`
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('@snice/error', (e) => {
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
- <!-- Instead of drop zone, shows a plus tile in the gallery -->
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('@snice/files-change', (e) => {
517
+ gallery.addEventListener('files-change', (e) => {
517
518
  console.log('Files changed:', e.detail.files);
518
519
  });
519
520
 
520
- gallery.addEventListener('@snice/upload-progress', (e) => {
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('@snice/upload-complete', (e) => {
525
+ gallery.addEventListener('upload-complete', (e) => {
525
526
  console.log('Upload complete:', e.detail.file.file.name);
526
527
  });
527
528
 
528
- gallery.addEventListener('@snice/upload-error', (e) => {
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('@snice/files-change', (e) => {
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('@snice/custom-action-click', (e) => {
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('@snice/file-upload-change', (e) => {
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
- ### `@snice/file-upload-change`
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('@snice/file-upload-change', (e) => {
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
- ### `@snice/file-upload-error`
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('@snice/file-upload-error', (e) => {
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('@snice/file-upload-error', (e) => {
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('@snice/file-upload-change', (e) => {
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
- ### `@snice/kanban-card-move`
161
+ ### `kanban-card-move`
162
162
  Dispatched when card is moved between columns.
163
163
 
164
164
  ```javascript
165
- kanban.addEventListener('@snice/kanban-card-move', (e) => {
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
- ### `@snice/kanban-card-click`
174
+ ### `kanban-card-click`
175
175
  Dispatched when card is clicked.
176
176
 
177
177
  ```javascript
178
- kanban.addEventListener('@snice/kanban-card-click', (e) => {
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('@snice/kanban-card-move', (e) => {
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('@snice/kanban-card-click', (e) => {
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('@snice/kanban-card-move', async (e) => {
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',
@@ -89,7 +89,7 @@ menu.toggleMenu();
89
89
 
90
90
  ### Container Events
91
91
 
92
- #### `@snice/menu-open`
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('@snice/menu-open', (e) => {
104
+ menu.addEventListener('menu-open', (e) => {
105
105
  console.log('Menu opened');
106
106
  });
107
107
  ```
108
108
 
109
- #### `@snice/menu-close`
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
- #### `@snice/menu-item-select`
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('@snice/menu-item-select', (e) => {
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('@snice/menu-item-select', (e) => {
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('@snice/menu-item-select', (e) => {
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('@snice/menu-open', () => {
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('@snice/menu-close', () => {
438
+ menu.addEventListener('menu-close', () => {
439
439
  console.log('Menu closed');
440
440
  });
441
441
 
442
- menu.addEventListener('@snice/menu-item-select', (e) => {
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('@snice/menu-item-select', (e) => {
489
+ menu.addEventListener('menu-item-select', (e) => {
490
490
  openFile(e.detail.value);
491
491
  });
492
492
  </script>