@mano8/astro-media-m8 0.1.0-alpha.1

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 (188) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +203 -0
  3. package/dist/src/integration.d.ts +57 -0
  4. package/dist/src/integration.d.ts.map +1 -0
  5. package/dist/src/integration.js +87 -0
  6. package/dist/src/integration.js.map +1 -0
  7. package/dist/src/lib/csp.d.ts +27 -0
  8. package/dist/src/lib/csp.d.ts.map +1 -0
  9. package/dist/src/lib/csp.js +54 -0
  10. package/dist/src/lib/csp.js.map +1 -0
  11. package/dist/src/middleware.d.ts +4 -0
  12. package/dist/src/middleware.d.ts.map +1 -0
  13. package/dist/src/middleware.js +24 -0
  14. package/dist/src/middleware.js.map +1 -0
  15. package/dist/src/runtime/api/admin.d.ts +22 -0
  16. package/dist/src/runtime/api/admin.d.ts.map +1 -0
  17. package/dist/src/runtime/api/admin.js +115 -0
  18. package/dist/src/runtime/api/admin.js.map +1 -0
  19. package/dist/src/runtime/api/categories.d.ts +12 -0
  20. package/dist/src/runtime/api/categories.d.ts.map +1 -0
  21. package/dist/src/runtime/api/categories.js +56 -0
  22. package/dist/src/runtime/api/categories.js.map +1 -0
  23. package/dist/src/runtime/api/dashboard.d.ts +5 -0
  24. package/dist/src/runtime/api/dashboard.d.ts.map +1 -0
  25. package/dist/src/runtime/api/dashboard.js +22 -0
  26. package/dist/src/runtime/api/dashboard.js.map +1 -0
  27. package/dist/src/runtime/api/index.d.ts +72 -0
  28. package/dist/src/runtime/api/index.d.ts.map +1 -0
  29. package/dist/src/runtime/api/index.js +74 -0
  30. package/dist/src/runtime/api/index.js.map +1 -0
  31. package/dist/src/runtime/api/internal.server.d.ts +19 -0
  32. package/dist/src/runtime/api/internal.server.d.ts.map +1 -0
  33. package/dist/src/runtime/api/internal.server.js +64 -0
  34. package/dist/src/runtime/api/internal.server.js.map +1 -0
  35. package/dist/src/runtime/api/objects.d.ts +7 -0
  36. package/dist/src/runtime/api/objects.d.ts.map +1 -0
  37. package/dist/src/runtime/api/objects.js +71 -0
  38. package/dist/src/runtime/api/objects.js.map +1 -0
  39. package/dist/src/runtime/api/presets.d.ts +6 -0
  40. package/dist/src/runtime/api/presets.d.ts.map +1 -0
  41. package/dist/src/runtime/api/presets.js +31 -0
  42. package/dist/src/runtime/api/presets.js.map +1 -0
  43. package/dist/src/runtime/api/shares.d.ts +10 -0
  44. package/dist/src/runtime/api/shares.d.ts.map +1 -0
  45. package/dist/src/runtime/api/shares.js +38 -0
  46. package/dist/src/runtime/api/shares.js.map +1 -0
  47. package/dist/src/runtime/api/uploads.d.ts +5 -0
  48. package/dist/src/runtime/api/uploads.d.ts.map +1 -0
  49. package/dist/src/runtime/api/uploads.js +28 -0
  50. package/dist/src/runtime/api/uploads.js.map +1 -0
  51. package/dist/src/runtime/api/variants.d.ts +18 -0
  52. package/dist/src/runtime/api/variants.d.ts.map +1 -0
  53. package/dist/src/runtime/api/variants.js +61 -0
  54. package/dist/src/runtime/api/variants.js.map +1 -0
  55. package/dist/src/runtime/authAdapter.d.ts +48 -0
  56. package/dist/src/runtime/authAdapter.d.ts.map +1 -0
  57. package/dist/src/runtime/authAdapter.js +62 -0
  58. package/dist/src/runtime/authAdapter.js.map +1 -0
  59. package/dist/src/runtime/client.d.ts +24 -0
  60. package/dist/src/runtime/client.d.ts.map +1 -0
  61. package/dist/src/runtime/client.js +87 -0
  62. package/dist/src/runtime/client.js.map +1 -0
  63. package/dist/src/runtime/compatibility.d.ts +32 -0
  64. package/dist/src/runtime/compatibility.d.ts.map +1 -0
  65. package/dist/src/runtime/compatibility.js +101 -0
  66. package/dist/src/runtime/compatibility.js.map +1 -0
  67. package/dist/src/runtime/config.d.ts +27 -0
  68. package/dist/src/runtime/config.d.ts.map +1 -0
  69. package/dist/src/runtime/config.js +32 -0
  70. package/dist/src/runtime/config.js.map +1 -0
  71. package/dist/src/runtime/errors.d.ts +23 -0
  72. package/dist/src/runtime/errors.d.ts.map +1 -0
  73. package/dist/src/runtime/errors.js +50 -0
  74. package/dist/src/runtime/errors.js.map +1 -0
  75. package/dist/src/runtime/hooks/index.d.ts +8 -0
  76. package/dist/src/runtime/hooks/index.d.ts.map +1 -0
  77. package/dist/src/runtime/hooks/index.js +8 -0
  78. package/dist/src/runtime/hooks/index.js.map +1 -0
  79. package/dist/src/runtime/hooks/useDownloadUrl.d.ts +12 -0
  80. package/dist/src/runtime/hooks/useDownloadUrl.d.ts.map +1 -0
  81. package/dist/src/runtime/hooks/useDownloadUrl.js +40 -0
  82. package/dist/src/runtime/hooks/useDownloadUrl.js.map +1 -0
  83. package/dist/src/runtime/hooks/useMediaAdmin.d.ts +30 -0
  84. package/dist/src/runtime/hooks/useMediaAdmin.d.ts.map +1 -0
  85. package/dist/src/runtime/hooks/useMediaAdmin.js +145 -0
  86. package/dist/src/runtime/hooks/useMediaAdmin.js.map +1 -0
  87. package/dist/src/runtime/hooks/useMediaObject.d.ts +17 -0
  88. package/dist/src/runtime/hooks/useMediaObject.d.ts.map +1 -0
  89. package/dist/src/runtime/hooks/useMediaObject.js +62 -0
  90. package/dist/src/runtime/hooks/useMediaObject.js.map +1 -0
  91. package/dist/src/runtime/hooks/useMediaObjects.d.ts +12 -0
  92. package/dist/src/runtime/hooks/useMediaObjects.d.ts.map +1 -0
  93. package/dist/src/runtime/hooks/useMediaObjects.js +76 -0
  94. package/dist/src/runtime/hooks/useMediaObjects.js.map +1 -0
  95. package/dist/src/runtime/hooks/useMediaPresets.d.ts +24 -0
  96. package/dist/src/runtime/hooks/useMediaPresets.d.ts.map +1 -0
  97. package/dist/src/runtime/hooks/useMediaPresets.js +55 -0
  98. package/dist/src/runtime/hooks/useMediaPresets.js.map +1 -0
  99. package/dist/src/runtime/hooks/useMediaUpload.d.ts +11 -0
  100. package/dist/src/runtime/hooks/useMediaUpload.d.ts.map +1 -0
  101. package/dist/src/runtime/hooks/useMediaUpload.js +34 -0
  102. package/dist/src/runtime/hooks/useMediaUpload.js.map +1 -0
  103. package/dist/src/runtime/hooks/useMediaVariants.d.ts +18 -0
  104. package/dist/src/runtime/hooks/useMediaVariants.d.ts.map +1 -0
  105. package/dist/src/runtime/hooks/useMediaVariants.js +78 -0
  106. package/dist/src/runtime/hooks/useMediaVariants.js.map +1 -0
  107. package/dist/src/runtime/listParams.d.ts +27 -0
  108. package/dist/src/runtime/listParams.d.ts.map +1 -0
  109. package/dist/src/runtime/listParams.js +66 -0
  110. package/dist/src/runtime/listParams.js.map +1 -0
  111. package/dist/src/runtime/queryKeys.d.ts +18 -0
  112. package/dist/src/runtime/queryKeys.d.ts.map +1 -0
  113. package/dist/src/runtime/queryKeys.js +23 -0
  114. package/dist/src/runtime/queryKeys.js.map +1 -0
  115. package/dist/src/runtime/react/AdminMediaPanel.d.ts +2 -0
  116. package/dist/src/runtime/react/AdminMediaPanel.d.ts.map +1 -0
  117. package/dist/src/runtime/react/AdminMediaPanel.js +14 -0
  118. package/dist/src/runtime/react/AdminMediaPanel.js.map +1 -0
  119. package/dist/src/runtime/react/MediaLibrary.d.ts +6 -0
  120. package/dist/src/runtime/react/MediaLibrary.d.ts.map +1 -0
  121. package/dist/src/runtime/react/MediaLibrary.js +138 -0
  122. package/dist/src/runtime/react/MediaLibrary.js.map +1 -0
  123. package/dist/src/runtime/react/MediaProvider.d.ts +18 -0
  124. package/dist/src/runtime/react/MediaProvider.d.ts.map +1 -0
  125. package/dist/src/runtime/react/MediaProvider.js +79 -0
  126. package/dist/src/runtime/react/MediaProvider.js.map +1 -0
  127. package/dist/src/runtime/react/MediaQueryProvider.d.ts +8 -0
  128. package/dist/src/runtime/react/MediaQueryProvider.d.ts.map +1 -0
  129. package/dist/src/runtime/react/MediaQueryProvider.js +11 -0
  130. package/dist/src/runtime/react/MediaQueryProvider.js.map +1 -0
  131. package/dist/src/runtime/react/MediaUploadDropzone.d.ts +8 -0
  132. package/dist/src/runtime/react/MediaUploadDropzone.d.ts.map +1 -0
  133. package/dist/src/runtime/react/MediaUploadDropzone.js +34 -0
  134. package/dist/src/runtime/react/MediaUploadDropzone.js.map +1 -0
  135. package/dist/src/runtime/react/ObjectDetail.d.ts +5 -0
  136. package/dist/src/runtime/react/ObjectDetail.d.ts.map +1 -0
  137. package/dist/src/runtime/react/ObjectDetail.js +34 -0
  138. package/dist/src/runtime/react/ObjectDetail.js.map +1 -0
  139. package/dist/src/runtime/react/PresetEditor.d.ts +3 -0
  140. package/dist/src/runtime/react/PresetEditor.d.ts.map +1 -0
  141. package/dist/src/runtime/react/PresetEditor.js +36 -0
  142. package/dist/src/runtime/react/PresetEditor.js.map +1 -0
  143. package/dist/src/runtime/react/RequireSuperuser.d.ts +7 -0
  144. package/dist/src/runtime/react/RequireSuperuser.d.ts.map +1 -0
  145. package/dist/src/runtime/react/RequireSuperuser.js +10 -0
  146. package/dist/src/runtime/react/RequireSuperuser.js.map +1 -0
  147. package/dist/src/runtime/react/VariantPicker.d.ts +5 -0
  148. package/dist/src/runtime/react/VariantPicker.d.ts.map +1 -0
  149. package/dist/src/runtime/react/VariantPicker.js +28 -0
  150. package/dist/src/runtime/react/VariantPicker.js.map +1 -0
  151. package/dist/src/runtime/react/default-ui/index.d.ts +25 -0
  152. package/dist/src/runtime/react/default-ui/index.d.ts.map +1 -0
  153. package/dist/src/runtime/react/default-ui/index.js +33 -0
  154. package/dist/src/runtime/react/default-ui/index.js.map +1 -0
  155. package/dist/src/runtime/react/index.d.ts +10 -0
  156. package/dist/src/runtime/react/index.d.ts.map +1 -0
  157. package/dist/src/runtime/react/index.js +10 -0
  158. package/dist/src/runtime/react/index.js.map +1 -0
  159. package/dist/src/runtime/routes.d.ts +19 -0
  160. package/dist/src/runtime/routes.d.ts.map +1 -0
  161. package/dist/src/runtime/routes.js +35 -0
  162. package/dist/src/runtime/routes.js.map +1 -0
  163. package/dist/src/runtime/schemas.d.ts +812 -0
  164. package/dist/src/runtime/schemas.d.ts.map +1 -0
  165. package/dist/src/runtime/schemas.js +427 -0
  166. package/dist/src/runtime/schemas.js.map +1 -0
  167. package/dist/src/runtime/upload/index.d.ts +2 -0
  168. package/dist/src/runtime/upload/index.d.ts.map +1 -0
  169. package/dist/src/runtime/upload/index.js +2 -0
  170. package/dist/src/runtime/upload/index.js.map +1 -0
  171. package/dist/src/runtime/upload/uploadController.d.ts +71 -0
  172. package/dist/src/runtime/upload/uploadController.d.ts.map +1 -0
  173. package/dist/src/runtime/upload/uploadController.js +217 -0
  174. package/dist/src/runtime/upload/uploadController.js.map +1 -0
  175. package/package.json +97 -0
  176. package/registry/r/admin-media-dashboard.json +23 -0
  177. package/registry/r/data-table.json +23 -0
  178. package/registry/r/media-dashboard-overview.json +26 -0
  179. package/registry/r/media-maintenance-panel.json +23 -0
  180. package/registry/r/media-storage-chart.json +21 -0
  181. package/registry/r/registry.json +37 -0
  182. package/registry.json +92 -0
  183. package/src/routes/admin/media.astro +12 -0
  184. package/src/routes/library.astro +12 -0
  185. package/src/routes/object/[id].astro +14 -0
  186. package/src/routes/presets.astro +12 -0
  187. package/src/routes/upload.astro +12 -0
  188. package/src/scaffold/styles/media.css +208 -0
@@ -0,0 +1,138 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { deleteObject } from "../api/objects.js";
4
+ import { useDownloadUrl } from "../hooks/useDownloadUrl.js";
5
+ import { useMediaObjects } from "../hooks/useMediaObjects.js";
6
+ const STATUS_BADGE = {
7
+ pending_upload: "Pending",
8
+ uploaded: "Uploaded",
9
+ processing: "Processing",
10
+ ready: "Ready",
11
+ failed: "Failed",
12
+ deleted: "Deleted",
13
+ rejected: "Rejected"
14
+ };
15
+ const inputClassName = "fa-media-control h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40";
16
+ const VIEW_LABELS = {
17
+ list: "List",
18
+ grid: "Grid",
19
+ masonry: "Masonry"
20
+ };
21
+ const titleRowClassName = "fa-media-title-row flex w-full flex-wrap items-center justify-between gap-3";
22
+ const filterRowClassName = "fa-media-filter-row flex w-full flex-col gap-3 md:flex-row md:items-center";
23
+ const viewSwitcherClassName = "fa-media-view-switcher inline-flex shrink-0 rounded-lg border border-input bg-transparent p-0.5";
24
+ const viewButtonClassName = "fa-media-view-button min-h-7 rounded-md border-0 bg-transparent px-2.5 py-1 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground aria-pressed:bg-foreground aria-pressed:text-background";
25
+ const previewClassName = "fa-media-preview block aspect-square h-14 w-14 rounded-md border border-border bg-muted object-cover text-xs font-medium text-muted-foreground";
26
+ const previewPlaceholderClassName = `${previewClassName} grid place-items-center px-1 text-center`;
27
+ const gridClassName = "fa-media-cards fa-media-cards--grid grid gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4";
28
+ const masonryClassName = "fa-media-cards fa-media-cards--masonry columns-1 gap-4 sm:columns-2 lg:columns-3 xl:columns-4";
29
+ const cardClassName = "fa-media-card mb-4 break-inside-avoid overflow-hidden rounded-lg border border-border bg-card text-card-foreground";
30
+ const cardPreviewClassName = "h-auto w-full rounded-none border-0";
31
+ const cardBodyClassName = "fa-media-card-body grid gap-2 p-3";
32
+ const cardTitleClassName = "m-0 truncate text-sm font-medium leading-5";
33
+ const cardMetaClassName = "fa-media-card-meta flex flex-wrap items-center gap-2 text-xs text-muted-foreground";
34
+ const itemActionsClassName = "fa-media-item-actions flex flex-wrap items-center gap-2";
35
+ const actionLinkClassName = "fa-media-action-link inline-flex min-h-8 items-center rounded-lg border px-3 py-1 text-sm font-medium";
36
+ const listPreviewStyle = {
37
+ aspectRatio: "1 / 1",
38
+ borderRadius: "0.375rem",
39
+ height: "clamp(4rem, 12vw, 8rem)",
40
+ maxHeight: "8rem",
41
+ maxWidth: "8rem",
42
+ objectFit: "cover",
43
+ width: "clamp(4rem, 12vw, 8rem)"
44
+ };
45
+ const activeViewButtonStyle = {
46
+ background: "var(--fa-media-active-bg, var(--foreground, CanvasText))",
47
+ borderColor: "var(--fa-media-active-bg, var(--foreground, CanvasText))",
48
+ color: "var(--fa-media-active-fg, var(--background, Canvas))"
49
+ };
50
+ function isImage(object) {
51
+ return object.mime_type.toLowerCase().startsWith("image/");
52
+ }
53
+ function previewLoadingFor(view, index) {
54
+ if (view === "list")
55
+ return { loading: "lazy", fetchPriority: "low" };
56
+ if (view === "grid" && index < 6)
57
+ return { loading: "eager", fetchPriority: "high" };
58
+ if (view === "masonry" && index < 4)
59
+ return { loading: "eager", fetchPriority: "high" };
60
+ return { loading: "lazy", fetchPriority: "low" };
61
+ }
62
+ function objectLabel(object) {
63
+ return object.original_filename ?? object.id;
64
+ }
65
+ function humanizeBytes(bytes) {
66
+ if (!Number.isFinite(bytes) || bytes < 0)
67
+ return "0 B";
68
+ if (bytes < 1024)
69
+ return `${bytes} B`;
70
+ const units = ["KB", "MB", "GB", "TB"];
71
+ let value = bytes / 1024;
72
+ let unitIndex = 0;
73
+ while (value >= 1024 && unitIndex < units.length - 1) {
74
+ value /= 1024;
75
+ unitIndex += 1;
76
+ }
77
+ return `${value.toFixed(value >= 10 ? 0 : 1)} ${units[unitIndex]}`;
78
+ }
79
+ function MediaObjectPreview({ object, view, index }) {
80
+ const { data, loading, error, request } = useDownloadUrl(isImage(object) ? object.id : null);
81
+ const loadingMode = previewLoadingFor(view, index);
82
+ useEffect(() => {
83
+ if (!isImage(object) || data || loading || error)
84
+ return;
85
+ void request();
86
+ }, [data, error, loading, object, request]);
87
+ if (!isImage(object)) {
88
+ return (_jsx("span", { className: `${previewPlaceholderClassName} fa-media-preview--file`, style: view === "list" ? listPreviewStyle : undefined, "aria-hidden": "true", children: object.extension ?? "file" }));
89
+ }
90
+ if (!data) {
91
+ return (_jsx("span", { className: `${previewPlaceholderClassName} fa-media-preview--loading`, style: view === "list" ? listPreviewStyle : undefined, "aria-label": `${objectLabel(object)} preview loading`, children: loading ? "Loading" : "Preview" }));
92
+ }
93
+ return (_jsx("img", { className: view === "list" ? previewClassName : `${previewClassName} ${cardPreviewClassName}`, src: data.url, alt: objectLabel(object), style: view === "list" ? listPreviewStyle : undefined, width: view === "list" ? 128 : undefined, height: view === "list" ? 128 : undefined, loading: loadingMode.loading, decoding: "async", fetchPriority: loadingMode.fetchPriority }));
94
+ }
95
+ function MediaObjectName({ object, objectHref }) {
96
+ const label = objectLabel(object);
97
+ return objectHref ? _jsx("a", { href: objectHref(object.id), children: label }) : label;
98
+ }
99
+ function MediaObjectMeta({ object }) {
100
+ return (_jsxs(_Fragment, { children: [_jsx("span", { children: object.category }), _jsx("span", { className: `fa-media-badge fa-media-badge--${object.status}`, children: STATUS_BADGE[object.status] }), _jsx("span", { children: humanizeBytes(object.size_bytes) })] }));
101
+ }
102
+ function MediaObjectActions({ object, objectHref, deletingId, onDelete }) {
103
+ const label = objectLabel(object);
104
+ const href = objectHref?.(object.id);
105
+ return (_jsxs("div", { className: itemActionsClassName, children: [href ? (_jsx("a", { className: actionLinkClassName, href: href, "aria-label": `View ${label}`, children: "View" })) : null, _jsx("button", { type: "button", className: "fa-media-danger", disabled: deletingId === object.id, onClick: () => void onDelete(object), children: "Delete" })] }));
106
+ }
107
+ export function MediaLibrary({ objectHref, initial = {} }) {
108
+ const [query, setQuery] = useState(initial);
109
+ const [view, setView] = useState("list");
110
+ const [deletingId, setDeletingId] = useState(null);
111
+ const [actionError, setActionError] = useState(null);
112
+ const { items, count, loading, error, hasMore, refresh, loadMore } = useMediaObjects(query);
113
+ async function handleDelete(object) {
114
+ setActionError(null);
115
+ setDeletingId(object.id);
116
+ try {
117
+ await deleteObject(object.id);
118
+ await refresh();
119
+ }
120
+ catch {
121
+ setActionError("Failed to delete media");
122
+ }
123
+ finally {
124
+ setDeletingId(null);
125
+ }
126
+ }
127
+ return (_jsxs("section", { className: "not-content fa-media-panel", children: [_jsxs("header", { className: "fa-media-toolbar", children: [_jsxs("div", { className: titleRowClassName, children: [_jsxs("h2", { children: ["Media library (", count, ")"] }), _jsx("div", { className: viewSwitcherClassName, "aria-label": "Media library view", children: Object.keys(VIEW_LABELS).map((value) => (_jsx("button", { type: "button", "aria-pressed": view === value, className: viewButtonClassName, style: view === value ? activeViewButtonStyle : undefined, onClick: () => setView(value), children: VIEW_LABELS[value] }, value))) })] }), _jsxs("div", { className: filterRowClassName, children: [_jsx("input", { className: inputClassName, type: "search", placeholder: "Search filename", onChange: (event) => {
128
+ const q = event.currentTarget.value || undefined;
129
+ setQuery((prev) => ({ ...prev, q }));
130
+ } }), _jsxs("select", { className: inputClassName, onChange: (event) => {
131
+ const category = (event.currentTarget.value || undefined);
132
+ setQuery((prev) => ({ ...prev, category }));
133
+ }, children: [_jsx("option", { value: "", children: "All categories" }), ["avatar", "document", "asset", "chat_attachment", "export", "receipt"].map((value) => (_jsx("option", { value: value, children: value }, value)))] }), _jsxs("select", { className: inputClassName, onChange: (event) => {
134
+ const status = (event.currentTarget.value || undefined);
135
+ setQuery((prev) => ({ ...prev, status }));
136
+ }, children: [_jsx("option", { value: "", children: "All statuses" }), Object.keys(STATUS_BADGE).map((value) => (_jsx("option", { value: value, children: STATUS_BADGE[value] }, value)))] })] })] }), error ? _jsx("p", { role: "alert", children: "Failed to load media" }) : null, actionError ? _jsx("p", { role: "alert", children: actionError }) : null, view === "list" ? (_jsxs("table", { className: "fa-media-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Preview" }), _jsx("th", { children: "Filename" }), _jsx("th", { children: "Actions" }), _jsx("th", { children: "Category" }), _jsx("th", { children: "Status" }), _jsx("th", { children: "Size" })] }) }), _jsx("tbody", { children: items.map((object, index) => (_jsxs("tr", { children: [_jsx("td", { children: _jsx(MediaObjectPreview, { object: object, view: view, index: index }) }), _jsx("td", { children: _jsx(MediaObjectName, { object: object, objectHref: objectHref }) }), _jsx("td", { children: _jsx(MediaObjectActions, { object: object, objectHref: objectHref, deletingId: deletingId, onDelete: handleDelete }) }), _jsx("td", { children: object.category }), _jsx("td", { children: _jsx("span", { className: `fa-media-badge fa-media-badge--${object.status}`, children: STATUS_BADGE[object.status] }) }), _jsx("td", { children: humanizeBytes(object.size_bytes) })] }, object.id))) })] })) : (_jsx("div", { className: view === "grid" ? gridClassName : masonryClassName, children: items.map((object, index) => (_jsxs("article", { className: cardClassName, children: [_jsx(MediaObjectPreview, { object: object, view: view, index: index }), _jsxs("div", { className: cardBodyClassName, children: [_jsx("h3", { className: cardTitleClassName, children: _jsx(MediaObjectName, { object: object, objectHref: objectHref }) }), _jsx("div", { className: cardMetaClassName, children: _jsx(MediaObjectMeta, { object: object }) }), _jsx(MediaObjectActions, { object: object, objectHref: objectHref, deletingId: deletingId, onDelete: handleDelete })] })] }, object.id))) })), loading ? _jsx("p", { children: "Loading..." }) : null, hasMore ? (_jsx("button", { type: "button", disabled: loading, onClick: () => void loadMore(), children: "Load more" })) : null] }));
137
+ }
138
+ //# sourceMappingURL=MediaLibrary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaLibrary.js","sourceRoot":"","sources":["../../../../src/runtime/react/MediaLibrary.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type ReactNode } from "react";
2
+ import { type MediaRuntimeConfig } from "../config.js";
3
+ import { type MediaAuthAdapter } from "../authAdapter.js";
4
+ export type MediaContextValue = {
5
+ adapter: MediaAuthAdapter;
6
+ user: unknown;
7
+ isSuperuser: boolean;
8
+ loading: boolean;
9
+ };
10
+ export declare function MediaProvider({ children, config, adapter }: {
11
+ children: ReactNode;
12
+ config?: Partial<Omit<MediaRuntimeConfig, "polling">> & {
13
+ polling?: Partial<MediaRuntimeConfig["polling"]>;
14
+ };
15
+ adapter?: MediaAuthAdapter;
16
+ }): import("react").JSX.Element;
17
+ export declare function useMediaContext(): MediaContextValue;
18
+ //# sourceMappingURL=MediaProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaProvider.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/MediaProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE/E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAwBF,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,MAAM,EACN,OAAO,EACR,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,GAAG;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAA;KAAE,CAAC;IAC7G,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B,+BAsDA;AAED,wBAAgB,eAAe,IAAI,iBAAiB,CAInD"}
@@ -0,0 +1,79 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useEffect, useMemo, useState } from "react";
3
+ import { configureMedia } from "../config.js";
4
+ import { getMediaAuthAdapter } from "../authAdapter.js";
5
+ const MediaContext = createContext(null);
6
+ function isPromiseLike(value) {
7
+ return Boolean(value &&
8
+ (typeof value === "object" || typeof value === "function") &&
9
+ "then" in value &&
10
+ typeof value.then === "function");
11
+ }
12
+ function readAdapterUser(adapter) {
13
+ if (!adapter.getUser)
14
+ return { user: null, loading: false };
15
+ try {
16
+ const value = adapter.getUser();
17
+ if (isPromiseLike(value))
18
+ return { user: null, loading: true };
19
+ return { user: value, loading: false };
20
+ }
21
+ catch {
22
+ return { user: null, loading: false };
23
+ }
24
+ }
25
+ export function MediaProvider({ children, config, adapter }) {
26
+ const resolved = adapter ?? getMediaAuthAdapter();
27
+ const [authState, setAuthState] = useState(() => readAdapterUser(resolved));
28
+ useEffect(() => {
29
+ if (config)
30
+ configureMedia(config);
31
+ }, [config]);
32
+ useEffect(() => {
33
+ if (!resolved.getUser) {
34
+ setAuthState({ user: null, loading: false });
35
+ return undefined;
36
+ }
37
+ let cancelled = false;
38
+ try {
39
+ const value = resolved.getUser();
40
+ if (!isPromiseLike(value)) {
41
+ setAuthState({ user: value, loading: false });
42
+ return undefined;
43
+ }
44
+ setAuthState((current) => ({ ...current, loading: true }));
45
+ Promise.resolve(value)
46
+ .then((nextUser) => {
47
+ if (!cancelled)
48
+ setAuthState({ user: nextUser, loading: false });
49
+ })
50
+ .catch(() => {
51
+ if (!cancelled)
52
+ setAuthState({ user: null, loading: false });
53
+ });
54
+ }
55
+ catch {
56
+ setAuthState({ user: null, loading: false });
57
+ }
58
+ return () => {
59
+ cancelled = true;
60
+ };
61
+ }, [resolved]);
62
+ const currentUserState = readAdapterUser(resolved);
63
+ const user = currentUserState.loading ? authState.user : currentUserState.user;
64
+ const loading = currentUserState.loading ? authState.loading : false;
65
+ const value = useMemo(() => ({
66
+ adapter: resolved,
67
+ user,
68
+ isSuperuser: Boolean(resolved.isSuperuser?.(user)),
69
+ loading
70
+ }), [loading, resolved, user]);
71
+ return _jsx(MediaContext.Provider, { value: value, children: children });
72
+ }
73
+ export function useMediaContext() {
74
+ const context = useContext(MediaContext);
75
+ if (!context)
76
+ throw new Error("useMediaContext must be used inside MediaProvider");
77
+ return context;
78
+ }
79
+ //# sourceMappingURL=MediaProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaProvider.js","sourceRoot":"","sources":["../../../../src/runtime/react/MediaProvider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { QueryClient } from "@tanstack/react-query";
2
+ import { type ReactNode } from "react";
3
+ export type MediaQueryProviderProps = {
4
+ children: ReactNode;
5
+ client?: QueryClient;
6
+ };
7
+ export declare function MediaQueryProvider({ children, client }: MediaQueryProviderProps): import("react").JSX.Element;
8
+ //# sourceMappingURL=MediaQueryProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaQueryProvider.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/MediaQueryProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA2C,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7D,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,uBAAuB,+BAO/E"}
@@ -0,0 +1,11 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { QueryClient, QueryClientContext, QueryClientProvider } from "@tanstack/react-query";
3
+ import { useContext, useState } from "react";
4
+ export function MediaQueryProvider({ children, client }) {
5
+ const parentClient = useContext(QueryClientContext);
6
+ const [ownedClient] = useState(() => client ?? new QueryClient());
7
+ if (parentClient)
8
+ return _jsx(_Fragment, { children: children });
9
+ return _jsx(QueryClientProvider, { client: ownedClient, children: children });
10
+ }
11
+ //# sourceMappingURL=MediaQueryProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaQueryProvider.js","sourceRoot":"","sources":["../../../../src/runtime/react/MediaQueryProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAO7D,MAAM,UAAU,kBAAkB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAA2B;IAC9E,MAAM,YAAY,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACpD,MAAM,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;IAElE,IAAI,YAAY;QAAE,OAAO,4BAAG,QAAQ,GAAI,CAAC;IAEzC,OAAO,KAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW,YAAG,QAAQ,GAAuB,CAAC;AACpF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { MediaCategory, MediaObjectPublic, MediaVisibility } from "../schemas.js";
2
+ export declare function MediaUploadDropzone({ defaultCategory, defaultVisibility, checksum, onUploaded }: {
3
+ defaultCategory?: MediaCategory;
4
+ defaultVisibility?: MediaVisibility;
5
+ checksum?: "none" | "sha256";
6
+ onUploaded?: (object: MediaObjectPublic) => void;
7
+ }): import("react").JSX.Element;
8
+ //# sourceMappingURL=MediaUploadDropzone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaUploadDropzone.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/MediaUploadDropzone.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAgBvF,wBAAgB,mBAAmB,CAAC,EAClC,eAAyB,EACzB,iBAA6B,EAC7B,QAAmB,EACnB,UAAU,EACX,EAAE;IACD,eAAe,CAAC,EAAE,aAAa,CAAC;IAChC,iBAAiB,CAAC,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC7B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAClD,+BA0DA"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { useMediaUpload } from "../hooks/useMediaUpload.js";
4
+ const CATEGORIES = [
5
+ "avatar",
6
+ "document",
7
+ "asset",
8
+ "chat_attachment",
9
+ "export",
10
+ "receipt"
11
+ ];
12
+ const VISIBILITIES = ["private", "public", "tenant", "sensitive"];
13
+ const inputClassName = "fa-media-control h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40";
14
+ const labelClassName = "fa-media-label flex items-center gap-2 pb-2 text-sm leading-none font-medium select-none";
15
+ export function MediaUploadDropzone({ defaultCategory = "asset", defaultVisibility = "private", checksum = "sha256", onUploaded }) {
16
+ const { upload, abort, progress, error, busy } = useMediaUpload();
17
+ const [category, setCategory] = useState(defaultCategory);
18
+ const [visibility, setVisibility] = useState(defaultVisibility);
19
+ async function onPick(event) {
20
+ const file = event.currentTarget.files?.[0];
21
+ if (!file)
22
+ return;
23
+ try {
24
+ const object = await upload({ file, category, visibility, checksum, waitForScan: true });
25
+ onUploaded?.(object);
26
+ }
27
+ catch {
28
+ // surfaced via `error`
29
+ }
30
+ }
31
+ const pct = progress?.fraction != null ? Math.round(progress.fraction * 100) : null;
32
+ return (_jsxs("section", { className: "not-content fa-media-panel", children: [_jsx("h2", { children: "Upload media" }), _jsxs("div", { className: "fa-media-field", children: [_jsxs("div", { className: "fa-media-field-control", children: [_jsx("label", { className: labelClassName, htmlFor: "fa-media-upload-category", children: "Category" }), _jsx("select", { id: "fa-media-upload-category", className: inputClassName, value: category, onChange: (event) => setCategory(event.currentTarget.value), children: CATEGORIES.map((value) => (_jsx("option", { value: value, children: value }, value))) })] }), _jsxs("div", { className: "fa-media-field-control", children: [_jsx("label", { className: labelClassName, htmlFor: "fa-media-upload-visibility", children: "Visibility" }), _jsx("select", { id: "fa-media-upload-visibility", className: inputClassName, value: visibility, onChange: (event) => setVisibility(event.currentTarget.value), children: VISIBILITIES.map((value) => (_jsx("option", { value: value, children: value }, value))) })] })] }), _jsx("input", { className: inputClassName, type: "file", disabled: busy, onChange: onPick }), progress ? (_jsxs("div", { className: "fa-media-progress", role: "status", children: [_jsx("span", { children: progress.state }), pct != null ? _jsx("progress", { max: 100, value: pct }) : null] })) : null, busy ? (_jsx("button", { type: "button", onClick: abort, children: "Cancel" })) : null, error ? _jsx("p", { role: "alert", children: error instanceof Error ? error.message : "Upload failed" }) : null] }));
33
+ }
34
+ //# sourceMappingURL=MediaUploadDropzone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaUploadDropzone.js","sourceRoot":"","sources":["../../../../src/runtime/react/MediaUploadDropzone.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function ObjectDetail({ objectId, onDeleted }: {
2
+ objectId: string;
3
+ onDeleted?: () => void;
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=ObjectDetail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObjectDetail.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/ObjectDetail.tsx"],"names":[],"mappings":"AAWA,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,+BAuEjG"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { useDownloadUrl } from "../hooks/useDownloadUrl.js";
4
+ import { useMediaObject } from "../hooks/useMediaObject.js";
5
+ import { VariantPicker } from "./VariantPicker.js";
6
+ const inputClassName = "fa-media-control h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40";
7
+ const labelClassName = "fa-media-label flex items-center gap-2 pb-2 text-sm leading-none font-medium select-none";
8
+ export function ObjectDetail({ objectId, onDeleted }) {
9
+ const { object, loading, error, update, remove } = useMediaObject(objectId);
10
+ const { data: download, request: requestDownload } = useDownloadUrl(objectId);
11
+ const [saving, setSaving] = useState(false);
12
+ if (loading && !object)
13
+ return _jsx("p", { children: "Loading\u2026" });
14
+ if (error)
15
+ return _jsx("p", { role: "alert", children: "Failed to load object" });
16
+ if (!object)
17
+ return _jsx("p", { children: "Not found" });
18
+ async function patch(field, value) {
19
+ setSaving(true);
20
+ try {
21
+ await update(field === "visibility"
22
+ ? { visibility: value }
23
+ : { category: value });
24
+ }
25
+ finally {
26
+ setSaving(false);
27
+ }
28
+ }
29
+ return (_jsxs("section", { className: "not-content fa-media-panel", children: [_jsx("h2", { children: object.original_filename ?? object.id }), _jsxs("dl", { className: "fa-media-meta", children: [_jsx("dt", { children: "Status" }), _jsx("dd", { children: object.status }), _jsx("dt", { children: "Scan" }), _jsx("dd", { children: object.scan_status }), _jsx("dt", { children: "MIME" }), _jsx("dd", { children: object.mime_type }), _jsx("dt", { children: "Size" }), _jsxs("dd", { children: [object.size_bytes, " bytes"] })] }), _jsxs("div", { className: "fa-media-field-control", children: [_jsx("label", { className: labelClassName, htmlFor: "fa-media-object-visibility", children: "Visibility" }), _jsx("select", { id: "fa-media-object-visibility", className: inputClassName, disabled: saving, value: object.visibility, onChange: (event) => void patch("visibility", event.currentTarget.value), children: ["private", "public", "tenant", "sensitive"].map((value) => (_jsx("option", { value: value, children: value }, value))) })] }), _jsxs("div", { className: "fa-media-actions", children: [_jsx("button", { type: "button", onClick: () => void requestDownload(), children: "Get download URL" }), download ? (_jsxs("a", { href: download.url, rel: "noreferrer", children: ["Download (expires ", download.expires_at, ")"] })) : null, _jsx("button", { type: "button", className: "fa-media-danger", onClick: async () => {
30
+ await remove();
31
+ onDeleted?.();
32
+ }, children: "Delete" })] }), _jsx(VariantPicker, { objectId: object.id })] }));
33
+ }
34
+ //# sourceMappingURL=ObjectDetail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObjectDetail.js","sourceRoot":"","sources":["../../../../src/runtime/react/ObjectDetail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Built-in presets render read-only; user-owned presets are editable. */
2
+ export declare function PresetEditor(): import("react").JSX.Element;
3
+ //# sourceMappingURL=PresetEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PresetEditor.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/PresetEditor.tsx"],"names":[],"mappings":"AAUA,0EAA0E;AAC1E,wBAAgB,YAAY,gCAsE3B"}
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { useMediaPresets } from "../hooks/useMediaPresets.js";
4
+ const FORMATS = ["WEBP", "JPEG", "PNG", "GIF", "AVIF"];
5
+ const inputClassName = "fa-media-control h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40";
6
+ const labelClassName = "fa-media-label flex items-center gap-2 pb-2 text-sm leading-none font-medium select-none";
7
+ /** Built-in presets render read-only; user-owned presets are editable. */
8
+ export function PresetEditor() {
9
+ const { presets, create, remove, error } = useMediaPresets();
10
+ const [name, setName] = useState("");
11
+ const [width, setWidth] = useState(512);
12
+ const [format, setFormat] = useState("WEBP");
13
+ const [busy, setBusy] = useState(false);
14
+ async function add() {
15
+ if (!name.trim())
16
+ return;
17
+ setBusy(true);
18
+ try {
19
+ await create({
20
+ name: name.trim(),
21
+ spec: {
22
+ image_size: { fixed_width: width, fixed_height: null, fixed_size: null },
23
+ formats: [{ ext: format, quality: 82 }],
24
+ allow_upscale: false,
25
+ max_byte_size: null
26
+ }
27
+ });
28
+ setName("");
29
+ }
30
+ finally {
31
+ setBusy(false);
32
+ }
33
+ }
34
+ return (_jsxs("section", { className: "not-content fa-media-panel", children: [_jsx("h2", { children: "Presets" }), error ? _jsx("p", { role: "alert", children: "Failed to load presets" }) : null, _jsx("ul", { className: "fa-media-presets", children: presets.map((preset) => (_jsxs("li", { children: [_jsx("strong", { children: preset.name }), preset.builtin ? (_jsx("em", { children: " built-in (read-only)" })) : (_jsx("button", { type: "button", onClick: () => preset.id && void remove(preset.id), children: "Delete" }))] }, preset.id ?? preset.name))) }), _jsxs("fieldset", { children: [_jsx("legend", { children: "New preset" }), _jsxs("div", { className: "fa-media-field-control", children: [_jsx("label", { className: labelClassName, htmlFor: "fa-media-preset-name", children: "Name" }), _jsx("input", { id: "fa-media-preset-name", className: inputClassName, value: name, onChange: (event) => setName(event.currentTarget.value) })] }), _jsxs("div", { className: "fa-media-field-control", children: [_jsx("label", { className: labelClassName, htmlFor: "fa-media-preset-width", children: "Width" }), _jsx("input", { id: "fa-media-preset-width", className: inputClassName, type: "number", min: 1, value: width, onChange: (event) => setWidth(Number(event.currentTarget.value)) })] }), _jsxs("div", { className: "fa-media-field-control", children: [_jsx("label", { className: labelClassName, htmlFor: "fa-media-preset-format", children: "Format" }), _jsx("select", { id: "fa-media-preset-format", className: inputClassName, value: format, onChange: (event) => setFormat(event.currentTarget.value), children: FORMATS.map((value) => (_jsx("option", { value: value, children: value }, value))) })] }), _jsx("button", { type: "button", disabled: busy, onClick: () => void add(), children: "Add preset" })] })] }));
35
+ }
36
+ //# sourceMappingURL=PresetEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PresetEditor.js","sourceRoot":"","sources":["../../../../src/runtime/react/PresetEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ReactNode } from "react";
2
+ /** Render children only when the auth adapter reports a superuser. */
3
+ export declare function RequireSuperuser({ children, fallback }: {
4
+ children: ReactNode;
5
+ fallback?: ReactNode;
6
+ }): import("react").JSX.Element | null;
7
+ //# sourceMappingURL=RequireSuperuser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequireSuperuser.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/RequireSuperuser.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAe,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,sCAI5G"}
@@ -0,0 +1,10 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMediaContext } from "./MediaProvider.js";
3
+ /** Render children only when the auth adapter reports a superuser. */
4
+ export function RequireSuperuser({ children, fallback = null }) {
5
+ const { isSuperuser, loading } = useMediaContext();
6
+ if (loading)
7
+ return null;
8
+ return _jsx(_Fragment, { children: isSuperuser ? children : fallback });
9
+ }
10
+ //# sourceMappingURL=RequireSuperuser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequireSuperuser.js","sourceRoot":"","sources":["../../../../src/runtime/react/RequireSuperuser.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,sEAAsE;AACtE,MAAM,UAAU,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,EAAiD;IAC3G,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;IACnD,IAAI,OAAO;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,4BAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAI,CAAC;AAClD,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** List variants for an object and generate new ones from named presets. */
2
+ export declare function VariantPicker({ objectId }: {
3
+ objectId: string;
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=VariantPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VariantPicker.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/VariantPicker.tsx"],"names":[],"mappings":"AAOA,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,+BAkD/D"}
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { useMediaPresets } from "../hooks/useMediaPresets.js";
4
+ import { useMediaVariants } from "../hooks/useMediaVariants.js";
5
+ const checkboxLabelClassName = "fa-media-label flex items-center gap-2 pb-2 text-sm leading-none font-medium select-none";
6
+ /** List variants for an object and generate new ones from named presets. */
7
+ export function VariantPicker({ objectId }) {
8
+ const { presets } = useMediaPresets();
9
+ const { items, job, generate, remove, error } = useMediaVariants(objectId);
10
+ const [selected, setSelected] = useState([]);
11
+ const [busy, setBusy] = useState(false);
12
+ function toggle(name) {
13
+ setSelected((prev) => (prev.includes(name) ? prev.filter((value) => value !== name) : [...prev, name]));
14
+ }
15
+ async function run() {
16
+ if (!selected.length)
17
+ return;
18
+ setBusy(true);
19
+ try {
20
+ await generate(selected);
21
+ }
22
+ finally {
23
+ setBusy(false);
24
+ }
25
+ }
26
+ return (_jsxs("section", { className: "not-content fa-media-panel", children: [_jsx("h3", { children: "Variants" }), error ? _jsx("p", { role: "alert", children: "Failed to load variants" }) : null, _jsx("ul", { className: "fa-media-variants", children: items.map((variant) => (_jsxs("li", { children: [variant.variant_name, " \u00B7 ", variant.format, " \u00B7 ", variant.width ?? "?", "\u00D7", variant.height ?? "?", _jsx("button", { type: "button", onClick: () => void remove(variant.id), children: "Delete" })] }, variant.id))) }), _jsxs("fieldset", { children: [_jsx("legend", { children: "Generate from presets" }), presets.map((preset) => (_jsxs("label", { className: checkboxLabelClassName, children: [_jsx("input", { type: "checkbox", checked: selected.includes(preset.name), onChange: () => toggle(preset.name) }), preset.name, preset.builtin ? " (built-in)" : ""] }, preset.name))), _jsx("button", { type: "button", disabled: busy || !selected.length, onClick: () => void run(), children: busy ? "Generating…" : "Generate" }), job ? _jsxs("p", { children: ["Job ", job.status, ": ", job.variants_created, "/", job.variants_expected] }) : null] })] }));
27
+ }
28
+ //# sourceMappingURL=VariantPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VariantPicker.js","sourceRoot":"","sources":["../../../../src/runtime/react/VariantPicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { MediaRuntimeConfig } from "../../config.js";
2
+ type ViewConfig = Partial<Omit<MediaRuntimeConfig, "polling">> & {
3
+ polling?: Partial<MediaRuntimeConfig["polling"]>;
4
+ };
5
+ export declare function UploadView({ config, libraryHref }: {
6
+ config?: ViewConfig;
7
+ libraryHref?: string;
8
+ }): import("react").JSX.Element;
9
+ export declare function LibraryView({ config, objectHref }: {
10
+ config?: ViewConfig;
11
+ objectHref?: (id: string) => string;
12
+ }): import("react").JSX.Element;
13
+ export declare function ObjectDetailView({ config, objectId, libraryHref }: {
14
+ config?: ViewConfig;
15
+ objectId: string;
16
+ libraryHref?: string;
17
+ }): import("react").JSX.Element;
18
+ export declare function PresetsView({ config }: {
19
+ config?: ViewConfig;
20
+ }): import("react").JSX.Element;
21
+ export declare function AdminMediaView({ config }: {
22
+ config?: ViewConfig;
23
+ }): import("react").JSX.Element;
24
+ export {};
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/react/default-ui/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,KAAK,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,GAAG;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;CAClD,CAAC;AAUF,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,UAAU,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,+BAUhG;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,UAAU,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,+BAM/G;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,QAAQ,EACR,WAAW,EACZ,EAAE;IACD,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,+BAWA;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,UAAU,CAAA;CAAE,+BAM9D;AAED,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,UAAU,CAAA;CAAE,+BAMjE"}