@igorvaryvoda/sirv-upload-widget 0.1.2 → 0.1.4

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/README.md CHANGED
@@ -10,6 +10,7 @@ A React file upload widget for [Sirv CDN](https://sirv.com) with batch uploads,
10
10
  - **Sirv file picker** to browse existing files
11
11
  - **HEIC/HEIF conversion** for iPhone photos
12
12
  - **Presigned URL support** for secure direct uploads
13
+ - **Dark mode** with automatic system preference detection
13
14
  - **Customizable styling** via CSS variables
14
15
  - **TypeScript** support with full type definitions
15
16
 
@@ -98,6 +99,7 @@ export default function UploadPage() {
98
99
  | `onConflict` | `'overwrite' \| 'rename' \| 'skip' \| 'ask'` | `'rename'` | Filename conflict handling |
99
100
  | `disabled` | `boolean` | `false` | Disable the widget |
100
101
  | `compact` | `boolean` | `false` | Compact mode for smaller spaces |
102
+ | `theme` | `'auto' \| 'light' \| 'dark'` | `'auto'` | Color theme (auto follows system preference) |
101
103
  | `labels` | `object` | - | Custom labels for i18n |
102
104
  | `className` | `string` | - | Custom CSS class |
103
105
 
@@ -112,6 +114,25 @@ features?: {
112
114
  }
113
115
  ```
114
116
 
117
+ ## Dark Mode
118
+
119
+ The widget supports dark mode out of the box with three options:
120
+
121
+ ```tsx
122
+ // Auto (default) - follows system preference
123
+ <SirvUploader theme="auto" ... />
124
+
125
+ // Force light mode
126
+ <SirvUploader theme="light" ... />
127
+
128
+ // Force dark mode
129
+ <SirvUploader theme="dark" ... />
130
+ ```
131
+
132
+ Dark mode automatically activates when:
133
+ - `theme="auto"` (default) and the user's system prefers dark mode
134
+ - `theme="dark"` is explicitly set
135
+
115
136
  ## Styling
116
137
 
117
138
  Customize the widget using CSS variables:
@@ -128,6 +149,19 @@ Customize the widget using CSS variables:
128
149
  }
129
150
  ```
130
151
 
152
+ For dark mode customization, override the dark theme variables:
153
+
154
+ ```css
155
+ @media (prefers-color-scheme: dark) {
156
+ .sirv-uploader {
157
+ --sirv-primary: #3b82f6;
158
+ --sirv-bg: #1e1e1e;
159
+ --sirv-text: #e5e5e5;
160
+ /* ... */
161
+ }
162
+ }
163
+ ```
164
+
131
165
  ## Individual Components
132
166
 
133
167
  For custom layouts, you can use the components individually:
package/dist/index.d.mts CHANGED
@@ -264,6 +264,14 @@ interface SirvUploaderProps {
264
264
  * Compact mode for smaller spaces.
265
265
  */
266
266
  compact?: boolean;
267
+ /**
268
+ * Color theme.
269
+ * - 'auto': Follow system preference (default)
270
+ * - 'light': Force light mode
271
+ * - 'dark': Force dark mode
272
+ * @default 'auto'
273
+ */
274
+ theme?: 'auto' | 'light' | 'dark';
267
275
  /**
268
276
  * Custom labels for i18n.
269
277
  */
@@ -383,7 +391,7 @@ interface CsvParseResult {
383
391
  invalidCount: number;
384
392
  }
385
393
 
386
- declare function SirvUploader({ presignEndpoint, proxyEndpoint, sirvAccount, folder, onUpload, onError, onSelect, onRemove, features, maxFiles, maxFileSize, accept, onConflict, autoUpload, concurrency, className, disabled, compact, labels: customLabels, children, }: SirvUploaderProps): react_jsx_runtime.JSX.Element;
394
+ declare function SirvUploader({ presignEndpoint, proxyEndpoint, sirvAccount, folder, onUpload, onError, onSelect, onRemove, features, maxFiles, maxFileSize, accept, onConflict, autoUpload, concurrency, className, disabled, compact, theme, labels: customLabels, children, }: SirvUploaderProps): react_jsx_runtime.JSX.Element;
387
395
 
388
396
  interface DropZoneProps {
389
397
  onFiles: (files: SirvFile[]) => void;
package/dist/index.d.ts CHANGED
@@ -264,6 +264,14 @@ interface SirvUploaderProps {
264
264
  * Compact mode for smaller spaces.
265
265
  */
266
266
  compact?: boolean;
267
+ /**
268
+ * Color theme.
269
+ * - 'auto': Follow system preference (default)
270
+ * - 'light': Force light mode
271
+ * - 'dark': Force dark mode
272
+ * @default 'auto'
273
+ */
274
+ theme?: 'auto' | 'light' | 'dark';
267
275
  /**
268
276
  * Custom labels for i18n.
269
277
  */
@@ -383,7 +391,7 @@ interface CsvParseResult {
383
391
  invalidCount: number;
384
392
  }
385
393
 
386
- declare function SirvUploader({ presignEndpoint, proxyEndpoint, sirvAccount, folder, onUpload, onError, onSelect, onRemove, features, maxFiles, maxFileSize, accept, onConflict, autoUpload, concurrency, className, disabled, compact, labels: customLabels, children, }: SirvUploaderProps): react_jsx_runtime.JSX.Element;
394
+ declare function SirvUploader({ presignEndpoint, proxyEndpoint, sirvAccount, folder, onUpload, onError, onSelect, onRemove, features, maxFiles, maxFileSize, accept, onConflict, autoUpload, concurrency, className, disabled, compact, theme, labels: customLabels, children, }: SirvUploaderProps): react_jsx_runtime.JSX.Element;
387
395
 
388
396
  interface DropZoneProps {
389
397
  onFiles: (files: SirvFile[]) => void;
package/dist/index.js CHANGED
@@ -1570,6 +1570,7 @@ function SirvUploader({
1570
1570
  className,
1571
1571
  disabled = false,
1572
1572
  compact = false,
1573
+ theme = "auto",
1573
1574
  labels: customLabels = {},
1574
1575
  children
1575
1576
  }) {
@@ -1646,7 +1647,8 @@ function SirvUploader({
1646
1647
  const hasPendingFiles = upload.files.some((f) => f.status === "pending" || f.status === "error");
1647
1648
  const showTabs = csvImport && batch;
1648
1649
  const browseEndpoint = proxyEndpoint || (presignEndpoint ? presignEndpoint.replace(/\/presign$/, "") : "");
1649
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: clsx2__default.default("sirv-uploader", className), children: [
1650
+ const themeClass = theme === "dark" ? "sirv-uploader--dark" : theme === "light" ? "sirv-uploader--light" : void 0;
1651
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: clsx2__default.default("sirv-uploader", themeClass, className), children: [
1650
1652
  showTabs && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sirv-tabs", children: [
1651
1653
  /* @__PURE__ */ jsxRuntime.jsx(
1652
1654
  "button",