s3kit 0.1.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 (56) hide show
  1. package/README.md +398 -0
  2. package/dist/adapters/express.cjs +305 -0
  3. package/dist/adapters/express.cjs.map +1 -0
  4. package/dist/adapters/express.d.cts +10 -0
  5. package/dist/adapters/express.d.ts +10 -0
  6. package/dist/adapters/express.js +278 -0
  7. package/dist/adapters/express.js.map +1 -0
  8. package/dist/adapters/fetch.cjs +298 -0
  9. package/dist/adapters/fetch.cjs.map +1 -0
  10. package/dist/adapters/fetch.d.cts +9 -0
  11. package/dist/adapters/fetch.d.ts +9 -0
  12. package/dist/adapters/fetch.js +271 -0
  13. package/dist/adapters/fetch.js.map +1 -0
  14. package/dist/adapters/next.cjs +796 -0
  15. package/dist/adapters/next.cjs.map +1 -0
  16. package/dist/adapters/next.d.cts +28 -0
  17. package/dist/adapters/next.d.ts +28 -0
  18. package/dist/adapters/next.js +775 -0
  19. package/dist/adapters/next.js.map +1 -0
  20. package/dist/client/index.cjs +153 -0
  21. package/dist/client/index.cjs.map +1 -0
  22. package/dist/client/index.d.cts +59 -0
  23. package/dist/client/index.d.ts +59 -0
  24. package/dist/client/index.js +126 -0
  25. package/dist/client/index.js.map +1 -0
  26. package/dist/core/index.cjs +452 -0
  27. package/dist/core/index.cjs.map +1 -0
  28. package/dist/core/index.d.cts +11 -0
  29. package/dist/core/index.d.ts +11 -0
  30. package/dist/core/index.js +430 -0
  31. package/dist/core/index.js.map +1 -0
  32. package/dist/http/index.cjs +270 -0
  33. package/dist/http/index.cjs.map +1 -0
  34. package/dist/http/index.d.cts +49 -0
  35. package/dist/http/index.d.ts +49 -0
  36. package/dist/http/index.js +243 -0
  37. package/dist/http/index.js.map +1 -0
  38. package/dist/index.cjs +808 -0
  39. package/dist/index.cjs.map +1 -0
  40. package/dist/index.d.cts +6 -0
  41. package/dist/index.d.ts +6 -0
  42. package/dist/index.js +784 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/manager-BbmXpgXN.d.ts +29 -0
  45. package/dist/manager-gIjo-t8h.d.cts +29 -0
  46. package/dist/react/index.cjs +4320 -0
  47. package/dist/react/index.cjs.map +1 -0
  48. package/dist/react/index.css +155 -0
  49. package/dist/react/index.css.map +1 -0
  50. package/dist/react/index.d.cts +79 -0
  51. package/dist/react/index.d.ts +79 -0
  52. package/dist/react/index.js +4315 -0
  53. package/dist/react/index.js.map +1 -0
  54. package/dist/types-g2IYvH3O.d.cts +123 -0
  55. package/dist/types-g2IYvH3O.d.ts +123 -0
  56. package/package.json +100 -0
@@ -0,0 +1,155 @@
1
+ /* src/react/FileManager.module.css */
2
+ .root {
3
+ display: grid;
4
+ grid-template-columns: 1fr;
5
+ grid-template-rows: minmax(0, 1fr);
6
+ height: 100%;
7
+ font-family:
8
+ "Geist",
9
+ "Inter",
10
+ -apple-system,
11
+ sans-serif;
12
+ font-size: 13px;
13
+ color: var(--s3kit-text);
14
+ background-color: var(--s3kit-bg);
15
+ border: 1px solid var(--s3kit-border);
16
+ overflow: hidden;
17
+ position: relative;
18
+ }
19
+ .main {
20
+ display: flex;
21
+ flex-direction: column;
22
+ min-width: 0;
23
+ min-height: 0;
24
+ height: 100%;
25
+ background-color: var(--s3kit-bg);
26
+ transition: all 0.2s ease;
27
+ }
28
+ .header {
29
+ display: flex;
30
+ align-items: center;
31
+ justify-content: space-between;
32
+ border-bottom: 1px solid var(--s3kit-border);
33
+ flex-direction: row;
34
+ flex-wrap: nowrap;
35
+ }
36
+ .navTabs {
37
+ display: flex;
38
+ align-items: center;
39
+ gap: 4px;
40
+ margin-right: 16px;
41
+ }
42
+ .navTab {
43
+ display: flex;
44
+ align-items: center;
45
+ gap: 8px;
46
+ padding: 6px 12px;
47
+ cursor: pointer;
48
+ font-size: 13px;
49
+ font-weight: 500;
50
+ transition: all 0.15s;
51
+ border: none;
52
+ background: none;
53
+ }
54
+ .tableHeader {
55
+ display: grid;
56
+ border-bottom: 1px solid var(--s3kit-border);
57
+ background-color: var(--s3kit-bg);
58
+ font-size: 12px;
59
+ font-weight: 600;
60
+ color: var(--s3kit-text-secondary);
61
+ text-transform: uppercase;
62
+ letter-spacing: 0.05em;
63
+ position: sticky;
64
+ top: 0;
65
+ z-index: 5;
66
+ }
67
+ .row {
68
+ display: grid;
69
+ align-items: center;
70
+ border-bottom: 1px solid var(--s3kit-border);
71
+ cursor: pointer;
72
+ }
73
+ .sidebarRight {
74
+ background-color: var(--s3kit-bg);
75
+ padding: 0;
76
+ display: flex;
77
+ flex-direction: column;
78
+ will-change: transform, opacity;
79
+ overflow: hidden;
80
+ overflow-y: auto;
81
+ position: absolute;
82
+ right: 0;
83
+ top: 0;
84
+ bottom: 0;
85
+ z-index: 10;
86
+ }
87
+ .previewPortal {
88
+ position: absolute;
89
+ inset: 0;
90
+ z-index: 9;
91
+ pointer-events: none;
92
+ }
93
+ .previewBox {
94
+ width: 100%;
95
+ aspect-ratio: 1 / 1;
96
+ display: flex;
97
+ align-items: center;
98
+ justify-content: center;
99
+ background-color: var(--s3kit-bg-secondary);
100
+ border-bottom: 1px solid var(--s3kit-border);
101
+ padding: 20px;
102
+ }
103
+ .metadata {
104
+ padding: 24px;
105
+ }
106
+ .metaItem {
107
+ margin-bottom: 16px;
108
+ }
109
+ .metaLabel {
110
+ font-size: 11px;
111
+ color: var(--s3kit-text-secondary);
112
+ text-transform: uppercase;
113
+ letter-spacing: 0.05em;
114
+ margin-bottom: 4px;
115
+ }
116
+ .metaValue {
117
+ font-size: 13px;
118
+ color: var(--s3kit-text);
119
+ word-break: break-all;
120
+ }
121
+ @keyframes tokoPreviewSlideIn {
122
+ from {
123
+ opacity: 0;
124
+ transform: translateX(12px);
125
+ }
126
+ to {
127
+ opacity: 1;
128
+ transform: translateX(0);
129
+ }
130
+ }
131
+ @keyframes tokoPreviewSlideOut {
132
+ from {
133
+ opacity: 1;
134
+ transform: translateX(0);
135
+ }
136
+ to {
137
+ opacity: 0;
138
+ transform: translateX(12px);
139
+ }
140
+ }
141
+ .spinner {
142
+ width: 12px;
143
+ height: 12px;
144
+ border: 2px solid var(--s3kit-text-secondary);
145
+ border-top-color: var(--s3kit-accent, var(--s3kit-text));
146
+ border-radius: 50%;
147
+ animation: tokoSpin 0.8s linear infinite;
148
+ display: inline-block;
149
+ }
150
+ @keyframes tokoSpin {
151
+ to {
152
+ transform: rotate(360deg);
153
+ }
154
+ }
155
+ /*# sourceMappingURL=index.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/FileManager.module.css"],"sourcesContent":[".root {\n display: grid;\n grid-template-columns: 1fr;\n grid-template-rows: minmax(0, 1fr);\n height: 100%;\n font-family:\n 'Geist',\n 'Inter',\n -apple-system,\n sans-serif;\n font-size: 13px;\n color: var(--s3kit-text);\n background-color: var(--s3kit-bg);\n border: 1px solid var(--s3kit-border);\n overflow: hidden;\n position: relative;\n}\n\n.main {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n height: 100%;\n background-color: var(--s3kit-bg);\n transition: all 0.2s ease;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n border-bottom: 1px solid var(--s3kit-border);\n flex-direction: row;\n flex-wrap: nowrap;\n}\n\n.navTabs {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-right: 16px;\n}\n\n.navTab {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.15s;\n border: none;\n background: none;\n}\n\n.tableHeader {\n display: grid;\n border-bottom: 1px solid var(--s3kit-border);\n background-color: var(--s3kit-bg);\n font-size: 12px;\n font-weight: 600;\n color: var(--s3kit-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n position: sticky;\n top: 0;\n z-index: 5;\n}\n\n.row {\n display: grid;\n align-items: center;\n border-bottom: 1px solid var(--s3kit-border);\n cursor: pointer;\n}\n\n.sidebarRight {\n background-color: var(--s3kit-bg);\n padding: 0;\n display: flex;\n flex-direction: column;\n will-change: transform, opacity;\n overflow: hidden;\n overflow-y: auto;\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: 10;\n}\n\n.previewPortal {\n position: absolute;\n inset: 0;\n z-index: 9;\n pointer-events: none;\n}\n\n.previewBox {\n width: 100%;\n aspect-ratio: 1 / 1;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--s3kit-bg-secondary);\n border-bottom: 1px solid var(--s3kit-border);\n padding: 20px;\n}\n\n.metadata {\n padding: 24px;\n}\n\n.metaItem {\n margin-bottom: 16px;\n}\n\n.metaLabel {\n font-size: 11px;\n color: var(--s3kit-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin-bottom: 4px;\n}\n\n.metaValue {\n font-size: 13px;\n color: var(--s3kit-text);\n word-break: break-all;\n}\n\n@keyframes tokoPreviewSlideIn {\n from {\n opacity: 0;\n transform: translateX(12px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n@keyframes tokoPreviewSlideOut {\n from {\n opacity: 1;\n transform: translateX(0);\n }\n to {\n opacity: 0;\n transform: translateX(12px);\n }\n}\n\n.spinner {\n width: 12px;\n height: 12px;\n border: 2px solid var(--s3kit-text-secondary);\n border-top-color: var(--s3kit-accent, var(--s3kit-text));\n border-radius: 50%;\n animation: tokoSpin 0.8s linear infinite;\n display: inline-block;\n}\n\n@keyframes tokoSpin {\n to {\n transform: rotate(360deg);\n }\n}\n"],"mappings":";AAAA,CAAC;AACC,WAAS;AACT,yBAAuB;AACvB,sBAAoB,OAAO,CAAC,EAAE;AAC9B,UAAQ;AACR;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb;AACF,aAAW;AACX,SAAO,IAAI;AACX,oBAAkB,IAAI;AACtB,UAAQ,IAAI,MAAM,IAAI;AACtB,YAAU;AACV,YAAU;AACZ;AAEA,CAAC;AACC,WAAS;AACT,kBAAgB;AAChB,aAAW;AACX,cAAY;AACZ,UAAQ;AACR,oBAAkB,IAAI;AACtB,cAAY,IAAI,KAAK;AACvB;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,mBAAiB;AACjB,iBAAe,IAAI,MAAM,IAAI;AAC7B,kBAAgB;AAChB,aAAW;AACb;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,OAAK;AACL,gBAAc;AAChB;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,OAAK;AACL,WAAS,IAAI;AACb,UAAQ;AACR,aAAW;AACX,eAAa;AACb,cAAY,IAAI;AAChB,UAAQ;AACR,cAAY;AACd;AAEA,CAAC;AACC,WAAS;AACT,iBAAe,IAAI,MAAM,IAAI;AAC7B,oBAAkB,IAAI;AACtB,aAAW;AACX,eAAa;AACb,SAAO,IAAI;AACX,kBAAgB;AAChB,kBAAgB;AAChB,YAAU;AACV,OAAK;AACL,WAAS;AACX;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,iBAAe,IAAI,MAAM,IAAI;AAC7B,UAAQ;AACV;AAEA,CAAC;AACC,oBAAkB,IAAI;AACtB,WAAS;AACT,WAAS;AACT,kBAAgB;AAChB,eAAa,SAAS,EAAE;AACxB,YAAU;AACV,cAAY;AACZ,YAAU;AACV,SAAO;AACP,OAAK;AACL,UAAQ;AACR,WAAS;AACX;AAEA,CAAC;AACC,YAAU;AACV,SAAO;AACP,WAAS;AACT,kBAAgB;AAClB;AAEA,CAAC;AACC,SAAO;AACP,gBAAc,EAAE,EAAE;AAClB,WAAS;AACT,eAAa;AACb,mBAAiB;AACjB,oBAAkB,IAAI;AACtB,iBAAe,IAAI,MAAM,IAAI;AAC7B,WAAS;AACX;AAEA,CAAC;AACC,WAAS;AACX;AAEA,CAAC;AACC,iBAAe;AACjB;AAEA,CAAC;AACC,aAAW;AACX,SAAO,IAAI;AACX,kBAAgB;AAChB,kBAAgB;AAChB,iBAAe;AACjB;AAEA,CAAC;AACC,aAAW;AACX,SAAO,IAAI;AACX,cAAY;AACd;AAEA,WAAW;AACT;AACE,aAAS;AACT,eAAW,WAAW;AACxB;AACA;AACE,aAAS;AACT,eAAW,WAAW;AACxB;AACF;AAEA,WAAW;AACT;AACE,aAAS;AACT,eAAW,WAAW;AACxB;AACA;AACE,aAAS;AACT,eAAW,WAAW;AACxB;AACF;AAEA,CAAC;AACC,SAAO;AACP,UAAQ;AACR,UAAQ,IAAI,MAAM,IAAI;AACtB,oBAAkB,IAAI,cAAc,EAAE,IAAI;AAC1C,iBAAe;AACf,aAAW,SAAS,KAAK,OAAO;AAChC,WAAS;AACX;AAEA,WAJa;AAKX;AACE,eAAW,OAAO;AACpB;AACF;","names":[]}
@@ -0,0 +1,79 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { CSSProperties } from 'react';
3
+ import { i as S3Entry } from '../types-g2IYvH3O.cjs';
4
+
5
+ interface FileManagerProps {
6
+ /** API endpoint URL, e.g., "/api/s3" */
7
+ apiUrl: string;
8
+ /** Custom fetch function for auth headers */
9
+ fetch?: typeof fetch;
10
+ /** Called when a file is selected */
11
+ onFileSelect?: (file: S3Entry) => void;
12
+ /** Called when selection changes */
13
+ onSelectionChange?: (entries: S3Entry[]) => void;
14
+ /** Called when confirming selection (picker mode) */
15
+ onConfirm?: (entries: S3Entry[]) => void;
16
+ /** Called when navigating to a path */
17
+ onNavigate?: (path: string) => void;
18
+ /** Custom className for the root element */
19
+ className?: string;
20
+ /** Custom styles for the root element */
21
+ style?: CSSProperties;
22
+ /** Theme mode: 'light', 'dark', or 'system' */
23
+ theme?: 'light' | 'dark' | 'system';
24
+ /** UI mode */
25
+ mode?: 'viewer' | 'picker' | 'manager';
26
+ /** Selection type */
27
+ selection?: 'single' | 'multiple';
28
+ /** Action gates */
29
+ allowActions?: Partial<{
30
+ upload: boolean;
31
+ createFolder: boolean;
32
+ delete: boolean;
33
+ rename: boolean;
34
+ move: boolean;
35
+ copy: boolean;
36
+ restore: boolean;
37
+ }>;
38
+ /** Picker confirm button label */
39
+ confirmLabel?: string;
40
+ /** Hide Trash folder and trash view */
41
+ hideTrash?: boolean;
42
+ /** Optional extension filter (e.g. ['jpg','png']) */
43
+ filterExtensions?: string[];
44
+ /** Optional mime type filter (e.g. ['image/jpeg','application/pdf']) */
45
+ filterMimeTypes?: string[];
46
+ /** Toolbar controls */
47
+ toolbar?: Partial<{
48
+ search: boolean;
49
+ viewSwitcher: boolean;
50
+ sort: boolean;
51
+ breadcrumbs: boolean;
52
+ }>;
53
+ /** Controlled view mode */
54
+ viewMode?: 'list' | 'grid';
55
+ /** Default view mode (uncontrolled) */
56
+ defaultViewMode?: 'list' | 'grid';
57
+ /** Called when view mode changes */
58
+ onViewModeChange?: (mode: 'list' | 'grid') => void;
59
+ /** Label overrides */
60
+ labels?: Partial<{
61
+ upload: string;
62
+ newFolder: string;
63
+ delete: string;
64
+ deleteForever: string;
65
+ restore: string;
66
+ emptyTrash: string;
67
+ confirm: string;
68
+ searchPlaceholder: string;
69
+ }>;
70
+ }
71
+
72
+ declare function FileManager({ apiUrl, fetch: customFetch, onFileSelect, onSelectionChange, onConfirm, onNavigate, className, style, theme: themeMode, mode, selection, allowActions, confirmLabel, hideTrash, filterExtensions, filterMimeTypes, toolbar, viewMode: viewModeProp, defaultViewMode, onViewModeChange, labels, }: FileManagerProps): react_jsx_runtime.JSX.Element;
73
+
74
+ interface FilePickerProps extends Omit<FileManagerProps, 'mode' | 'selection'> {
75
+ selection?: 'single' | 'multiple';
76
+ }
77
+ declare function FilePicker({ selection, allowActions, confirmLabel, ...props }: FilePickerProps): react_jsx_runtime.JSX.Element;
78
+
79
+ export { FileManager, type FileManagerProps, FilePicker, type FilePickerProps };
@@ -0,0 +1,79 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { CSSProperties } from 'react';
3
+ import { i as S3Entry } from '../types-g2IYvH3O.js';
4
+
5
+ interface FileManagerProps {
6
+ /** API endpoint URL, e.g., "/api/s3" */
7
+ apiUrl: string;
8
+ /** Custom fetch function for auth headers */
9
+ fetch?: typeof fetch;
10
+ /** Called when a file is selected */
11
+ onFileSelect?: (file: S3Entry) => void;
12
+ /** Called when selection changes */
13
+ onSelectionChange?: (entries: S3Entry[]) => void;
14
+ /** Called when confirming selection (picker mode) */
15
+ onConfirm?: (entries: S3Entry[]) => void;
16
+ /** Called when navigating to a path */
17
+ onNavigate?: (path: string) => void;
18
+ /** Custom className for the root element */
19
+ className?: string;
20
+ /** Custom styles for the root element */
21
+ style?: CSSProperties;
22
+ /** Theme mode: 'light', 'dark', or 'system' */
23
+ theme?: 'light' | 'dark' | 'system';
24
+ /** UI mode */
25
+ mode?: 'viewer' | 'picker' | 'manager';
26
+ /** Selection type */
27
+ selection?: 'single' | 'multiple';
28
+ /** Action gates */
29
+ allowActions?: Partial<{
30
+ upload: boolean;
31
+ createFolder: boolean;
32
+ delete: boolean;
33
+ rename: boolean;
34
+ move: boolean;
35
+ copy: boolean;
36
+ restore: boolean;
37
+ }>;
38
+ /** Picker confirm button label */
39
+ confirmLabel?: string;
40
+ /** Hide Trash folder and trash view */
41
+ hideTrash?: boolean;
42
+ /** Optional extension filter (e.g. ['jpg','png']) */
43
+ filterExtensions?: string[];
44
+ /** Optional mime type filter (e.g. ['image/jpeg','application/pdf']) */
45
+ filterMimeTypes?: string[];
46
+ /** Toolbar controls */
47
+ toolbar?: Partial<{
48
+ search: boolean;
49
+ viewSwitcher: boolean;
50
+ sort: boolean;
51
+ breadcrumbs: boolean;
52
+ }>;
53
+ /** Controlled view mode */
54
+ viewMode?: 'list' | 'grid';
55
+ /** Default view mode (uncontrolled) */
56
+ defaultViewMode?: 'list' | 'grid';
57
+ /** Called when view mode changes */
58
+ onViewModeChange?: (mode: 'list' | 'grid') => void;
59
+ /** Label overrides */
60
+ labels?: Partial<{
61
+ upload: string;
62
+ newFolder: string;
63
+ delete: string;
64
+ deleteForever: string;
65
+ restore: string;
66
+ emptyTrash: string;
67
+ confirm: string;
68
+ searchPlaceholder: string;
69
+ }>;
70
+ }
71
+
72
+ declare function FileManager({ apiUrl, fetch: customFetch, onFileSelect, onSelectionChange, onConfirm, onNavigate, className, style, theme: themeMode, mode, selection, allowActions, confirmLabel, hideTrash, filterExtensions, filterMimeTypes, toolbar, viewMode: viewModeProp, defaultViewMode, onViewModeChange, labels, }: FileManagerProps): react_jsx_runtime.JSX.Element;
73
+
74
+ interface FilePickerProps extends Omit<FileManagerProps, 'mode' | 'selection'> {
75
+ selection?: 'single' | 'multiple';
76
+ }
77
+ declare function FilePicker({ selection, allowActions, confirmLabel, ...props }: FilePickerProps): react_jsx_runtime.JSX.Element;
78
+
79
+ export { FileManager, type FileManagerProps, FilePicker, type FilePickerProps };