@actuate-media/cms-admin 0.42.4 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/__tests__/views/appearance-settings.render.test.js +47 -0
- package/dist/__tests__/views/appearance-settings.render.test.js.map +1 -1
- package/dist/views/settings/BrandingCard.d.ts +1 -1
- package/dist/views/settings/BrandingCard.d.ts.map +1 -1
- package/dist/views/settings/BrandingCard.js +6 -2
- package/dist/views/settings/BrandingCard.js.map +1 -1
- package/dist/views/settings/useAppearanceSettings.d.ts +10 -0
- package/dist/views/settings/useAppearanceSettings.d.ts.map +1 -1
- package/dist/views/settings/useAppearanceSettings.js +54 -21
- package/dist/views/settings/useAppearanceSettings.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/views/appearance-settings.render.test.tsx +67 -0
- package/src/views/settings/BrandingCard.tsx +13 -7
- package/src/views/settings/useAppearanceSettings.ts +57 -21
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @actuate-media/cms-admin
|
|
2
2
|
|
|
3
|
+
## 0.43.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 6027f23: Branding uploads now accept WebP, JPEG, GIF, and AVIF in addition to SVG and PNG. Favicons accept SVG, PNG, and WebP (lossy photographic formats stay excluded for crisp small-size rendering). The file-picker accept strings are derived from the validation allow-lists so they can't drift, validation errors show readable format names (e.g. "SVG, PNG, WebP"), and logo shape detection can no longer block an upload if image decoding fails.
|
|
8
|
+
|
|
3
9
|
## 0.42.4
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -40,6 +40,7 @@ const cmsApi = vi.fn(async (endpoint, options) => {
|
|
|
40
40
|
});
|
|
41
41
|
vi.mock('../../lib/api.js', () => ({ cmsApi: (e, o) => cmsApi(e, o) }));
|
|
42
42
|
const { AppearanceTab } = await import('../../views/settings/AppearanceTab.js');
|
|
43
|
+
const { LOGO_MIME, FAVICON_MIME } = await import('../../views/settings/useAppearanceSettings.js');
|
|
43
44
|
function baseData(overrides = {}) {
|
|
44
45
|
return {
|
|
45
46
|
appearance: {
|
|
@@ -119,6 +120,52 @@ describe('AppearanceTab', () => {
|
|
|
119
120
|
body: expect.stringContaining('"publicPrimaryLogoAssetId":"existing-logo"'),
|
|
120
121
|
})));
|
|
121
122
|
});
|
|
123
|
+
it('accepts modern image formats for logos (and a crisp subset for favicons)', () => {
|
|
124
|
+
// WebP is a first-class brand format — general media uploads are converted
|
|
125
|
+
// to WebP anyway, so re-selecting them from the library must work.
|
|
126
|
+
expect(LOGO_MIME).toEqual(expect.arrayContaining([
|
|
127
|
+
'image/svg+xml',
|
|
128
|
+
'image/png',
|
|
129
|
+
'image/webp',
|
|
130
|
+
'image/jpeg',
|
|
131
|
+
'image/gif',
|
|
132
|
+
'image/avif',
|
|
133
|
+
]));
|
|
134
|
+
expect(FAVICON_MIME).toEqual(expect.arrayContaining(['image/svg+xml', 'image/png', 'image/webp']));
|
|
135
|
+
// Favicons need crisp small-size rendering — lossy photographic formats stay out.
|
|
136
|
+
expect(FAVICON_MIME).not.toContain('image/jpeg');
|
|
137
|
+
});
|
|
138
|
+
it('uploads a WebP logo through the Media Center', async () => {
|
|
139
|
+
// happy-dom's Image never decodes blobs — fire onload so shape detection
|
|
140
|
+
// (raster path, used for all non-SVG formats) completes.
|
|
141
|
+
vi.stubGlobal('Image', class {
|
|
142
|
+
naturalWidth = 400;
|
|
143
|
+
naturalHeight = 100;
|
|
144
|
+
onload = null;
|
|
145
|
+
onerror = null;
|
|
146
|
+
set src(_v) {
|
|
147
|
+
queueMicrotask(() => this.onload?.());
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
render(_jsx(AppearanceTab, { role: "ADMIN" }));
|
|
151
|
+
await screen.findByText('Branding');
|
|
152
|
+
const input = screen.getByLabelText('Primary logo');
|
|
153
|
+
const file = new File([new Uint8Array([0x52, 0x49, 0x46, 0x46])], 'logo.webp', {
|
|
154
|
+
type: 'image/webp',
|
|
155
|
+
});
|
|
156
|
+
fireEvent.change(input, { target: { files: [file] } });
|
|
157
|
+
await waitFor(() => expect(cmsApi).toHaveBeenCalledWith('/media/upload', expect.objectContaining({ method: 'POST' })));
|
|
158
|
+
vi.unstubAllGlobals();
|
|
159
|
+
});
|
|
160
|
+
it('rejects an unsupported upload type client-side with a readable error', async () => {
|
|
161
|
+
render(_jsx(AppearanceTab, { role: "ADMIN" }));
|
|
162
|
+
await screen.findByText('Branding');
|
|
163
|
+
const input = screen.getByLabelText('Primary logo');
|
|
164
|
+
const file = new File(['%PDF-1.4'], 'brochure.pdf', { type: 'application/pdf' });
|
|
165
|
+
fireEvent.change(input, { target: { files: [file] } });
|
|
166
|
+
expect(await screen.findByText(/unsupported file type/i)).toBeTruthy();
|
|
167
|
+
expect(cmsApi.mock.calls.some(([endpoint]) => endpoint === '/media/upload')).toBe(false);
|
|
168
|
+
});
|
|
122
169
|
it('is read-only for non-admins', async () => {
|
|
123
170
|
render(_jsx(AppearanceTab, { role: "EDITOR" }));
|
|
124
171
|
expect(await screen.findByText(/read-only access to appearance/i)).toBeTruthy();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appearance-settings.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/appearance-settings.render.test.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAE3E,8EAA8E;AAC9E,6EAA6E;AAC7E,IAAI,cAAmB,CAAA;AAEvB,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,QAAgB,EAAE,OAA6C,EAAE,EAAE;IAC7F,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,KAAK,CAAA;IACvC,IAAI,QAAQ,KAAK,aAAa,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IAChG,IAAI,QAAQ,KAAK,mBAAmB,IAAI,MAAM,KAAK,KAAK;QACtD,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IAC9D,IAAI,QAAQ,KAAK,mBAAmB,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IAC1F,IAAI,QAAQ,KAAK,eAAe,IAAI,MAAM,KAAK,MAAM;QACnD,OAAO;YACL,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,+BAA+B,EAAE,QAAQ,EAAE,eAAe,EAAE;YACzF,MAAM,EAAE,GAAG;SACZ,CAAA;IACH,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,MAAM,KAAK,KAAK;QACpD,OAAO;YACL,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL;wBACE,EAAE,EAAE,eAAe;wBACnB,QAAQ,EAAE,cAAc;wBACxB,UAAU,EAAE,sCAAsC;wBAClD,GAAG,EAAE,sCAAsC;wBAC3C,QAAQ,EAAE,WAAW;wBACrB,QAAQ,EAAE,IAAI;wBACd,KAAK,EAAE,GAAG;wBACV,MAAM,EAAE,GAAG;qBACZ;iBACF;aACF;YACD,MAAM,EAAE,GAAG;SACZ,CAAA;IACH,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;AAClC,CAAC,CAAC,CAAA;AAEF,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAS,EAAE,CAAW,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;AAEhG,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,uCAAuC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"appearance-settings.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/appearance-settings.render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrandingCard.d.ts","sourceRoot":"","sources":["../../../src/views/settings/BrandingCard.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"BrandingCard.d.ts","sourceRoot":"","sources":["../../../src/views/settings/BrandingCard.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,4BAA4B,CAAA;AA2MnC,wBAAgB,YAAY,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,CAAC,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,2CAkJ1F"}
|
|
@@ -4,7 +4,11 @@ import { AlertTriangle, ChevronDown, ChevronRight, ImageIcon, Library, Loader2,
|
|
|
4
4
|
import { useRef, useState } from 'react';
|
|
5
5
|
import { MediaPickerModal } from '../../components/MediaPickerModal.js';
|
|
6
6
|
import { SettingsCard, SettingsControlRow, SettingsSubsection } from './components.js';
|
|
7
|
-
|
|
7
|
+
import { FAVICON_MIME, LOGO_MIME, } from './useAppearanceSettings.js';
|
|
8
|
+
// Derive the file-input accept strings from the validation allow-lists so the
|
|
9
|
+
// picker and the validator can never drift apart.
|
|
10
|
+
const LOGO_ACCEPT = LOGO_MIME.join(',');
|
|
11
|
+
const FAVICON_ACCEPT = FAVICON_MIME.join(',');
|
|
8
12
|
function previewSurface(dark) {
|
|
9
13
|
return dark ? 'bg-foreground border-border' : 'bg-muted border-border';
|
|
10
14
|
}
|
|
@@ -59,6 +63,6 @@ export function BrandingCard({ s, canEdit }) {
|
|
|
59
63
|
onSelectFromLibrary: s.selectAsset,
|
|
60
64
|
onRemove: s.removeAsset,
|
|
61
65
|
};
|
|
62
|
-
return (_jsxs(SettingsCard, { title: "Branding", description: "Logos shown in the admin sidebar and on the public site.", children: [_jsxs("div", { className: "space-y-5", children: [_jsx(LogoField, { label: "Primary logo", helper: "SVG or
|
|
66
|
+
return (_jsxs(SettingsCard, { title: "Branding", description: "Logos shown in the admin sidebar and on the public site.", children: [_jsxs("div", { className: "space-y-5", children: [_jsx(LogoField, { label: "Primary logo", helper: "SVG, PNG, WebP, JPEG, GIF, or AVIF, up to 1MB. Best for the public header and full admin sidebar.", field: "publicPrimaryLogoAssetId", warning: warningFor('publicPrimaryLogoAssetId'), ...logoFieldProps }), _jsx(LogoField, { label: "Favicon / app icon source", helper: "32\u00D732 SVG, PNG, or WebP. A larger square image is fine \u2014 it scales down cleanly.", field: "faviconSourceAssetId", square: true, warning: warningFor('faviconSourceAssetId'), ...logoFieldProps, accept: FAVICON_ACCEPT }), _jsxs("div", { className: "border-border border-t pt-4", children: [_jsxs("button", { type: "button", onClick: () => s.setShowAdvanced(!s.showAdvanced), "aria-expanded": s.showAdvanced, className: "text-foreground hover:text-brand inline-flex items-center gap-1.5 text-sm font-medium transition-colors", children: [s.showAdvanced ? (_jsx(ChevronDown, { size: 16, "aria-hidden": "true" })) : (_jsx(ChevronRight, { size: 16, "aria-hidden": "true" })), "Advanced logo variants"] }), s.showAdvanced && (_jsxs("div", { className: "mt-4 space-y-5", children: [_jsx(LogoField, { label: "Logo mark", helper: "Square icon or mark. Used for the collapsed sidebar, compact UI, and app icons.", field: "publicLogoMarkAssetId", square: true, warning: warningFor('publicLogoMarkAssetId'), ...logoFieldProps }), _jsx(LogoField, { label: "Dark mode logo", helper: "Optional. Used on dark backgrounds or the dark admin theme.", field: "publicDarkLogoAssetId", darkSurface: true, warning: warningFor('publicDarkLogoAssetId'), ...logoFieldProps })] }))] }), _jsx(SettingsSubsection, { title: "Admin branding", description: "By default the admin reuses your public brand. Override it for a distinct internal look.", children: _jsxs("div", { className: "mt-4 space-y-5", children: [_jsx(SettingsControlRow, { label: "Brand source", description: "Choose whether the admin inherits the public brand or uses a custom logo.", control: _jsx(AdminBrandSourceToggle, { mode: s.brand.mode, canEdit: canEdit, onChange: s.setBrandingMode }) }), custom && (_jsxs("div", { className: "space-y-5", children: [_jsx(LogoField, { label: "Admin primary logo", helper: "Shown in the admin sidebar instead of the public logo.", field: "adminPrimaryLogoAssetId", warning: warningFor('adminPrimaryLogoAssetId'), ...logoFieldProps }), _jsx(LogoField, { label: "Admin logo mark", helper: "Square mark for the collapsed admin sidebar.", field: "adminLogoMarkAssetId", square: true, warning: warningFor('adminLogoMarkAssetId'), ...logoFieldProps })] }))] }) }), _jsxs("div", { className: "border-border border-t pt-4", children: [_jsx("label", { htmlFor: "brand-alt", className: "text-foreground block text-base font-medium", children: "Logo alt text" }), _jsx("p", { className: "text-muted-foreground mt-0.5 mb-2 text-sm", children: "Used by screen readers on the public site. Defaults to the Site Title when empty." }), _jsx("input", { id: "brand-alt", type: "text", value: s.brand.defaultLogoAltText ?? '', disabled: !canEdit, onChange: (e) => s.setAltText(e.target.value), placeholder: "Site Title", className: "border-border bg-input-background text-foreground focus-visible:ring-ring w-full max-w-md rounded-md border px-3 py-2 text-base focus-visible:ring-2 focus-visible:outline-none disabled:opacity-50" })] })] }), s.saveError && (_jsx("p", { className: "text-destructive mt-4 text-sm", role: "alert", children: s.saveError }))] }));
|
|
63
67
|
}
|
|
64
68
|
//# sourceMappingURL=BrandingCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrandingCard.js","sourceRoot":"","sources":["../../../src/views/settings/BrandingCard.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACZ,SAAS,EACT,OAAO,EACP,OAAO,EACP,MAAM,EACN,MAAM,GACP,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAA;AACvE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"BrandingCard.js","sourceRoot":"","sources":["../../../src/views/settings/BrandingCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -40,6 +40,16 @@ export interface SelectedBrandAsset {
|
|
|
40
40
|
width?: number;
|
|
41
41
|
height?: number;
|
|
42
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Formats accepted for brand logos. Everything here is also validated
|
|
45
|
+
* server-side (allowlist + magic bytes) in cms-core's upload security.
|
|
46
|
+
* Brand uploads are stored as-is (`skipOptimize`), so each format keeps
|
|
47
|
+
* its native fidelity — including WebP, which general media uploads are
|
|
48
|
+
* converted to anyway.
|
|
49
|
+
*/
|
|
50
|
+
export declare const LOGO_MIME: string[];
|
|
51
|
+
/** Favicons need crisp edges at small sizes — vector or lossless/modern raster only. */
|
|
52
|
+
export declare const FAVICON_MIME: string[];
|
|
43
53
|
export interface UseAppearanceSettings {
|
|
44
54
|
loading: boolean;
|
|
45
55
|
loadError: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAppearanceSettings.d.ts","sourceRoot":"","sources":["../../../src/views/settings/useAppearanceSettings.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EAEnB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,oCAAoC,CAAA;AAK3C,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAEtF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAA;AAE/D,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,OAAO,CAAA;CACtB;AAED,gFAAgF;AAChF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,iBAAiB,CAAA;IACvB,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,4EAA4E;AAC5E,MAAM,MAAM,eAAe,GACvB,0BAA0B,GAC1B,uBAAuB,GACvB,uBAAuB,GACvB,yBAAyB,GACzB,sBAAsB,GACtB,sBAAsB,GACtB,sBAAsB,CAAA;AAE1B,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,eAAe,EAAE,cAAc,CAQ9D,CAAA;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,SAAS,CAAA;CACjB;AAED,+EAA+E;AAC/E,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;
|
|
1
|
+
{"version":3,"file":"useAppearanceSettings.d.ts","sourceRoot":"","sources":["../../../src/views/settings/useAppearanceSettings.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EAEnB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,oCAAoC,CAAA;AAK3C,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAEtF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAA;AAE/D,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,OAAO,CAAA;CACtB;AAED,gFAAgF;AAChF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,iBAAiB,CAAA;IACvB,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,4EAA4E;AAC5E,MAAM,MAAM,eAAe,GACvB,0BAA0B,GAC1B,uBAAuB,GACvB,uBAAuB,GACvB,yBAAyB,GACzB,sBAAsB,GACtB,sBAAsB,GACtB,sBAAsB,CAAA;AAE1B,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,eAAe,EAAE,cAAc,CAQ9D,CAAA;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,SAAS,CAAA;CACjB;AAED,+EAA+E;AAC/E,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,UAOrB,CAAA;AACD,wFAAwF;AACxF,eAAO,MAAM,YAAY,UAA+C,CAAA;AAgBxE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,UAAU,EAAE,cAAc,CAAA;IAC1B,KAAK,EAAE,SAAS,CAAA;IAChB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;IAC/C,MAAM,EAAE,eAAe,EAAE,CAAA;IACzB,OAAO,EAAE;QAAE,KAAK,EAAE,kBAAkB,CAAC;QAAC,MAAM,EAAE,mBAAmB,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;IAC9F,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,cAAc,EAAE,eAAe,GAAG,IAAI,CAAA;IACtC,YAAY,EAAE,OAAO,CAAA;IACrB,eAAe,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,YAAY,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAA;IACpC,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,UAAU,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAA;IACvC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,eAAe,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,eAAe,EAAE,CAAC,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAA;IAC/C,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,WAAW,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAClE,mFAAmF;IACnF,WAAW,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAA;IACvE,WAAW,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;IAC7C,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAsFD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,qBAAqB,CA8VvB"}
|
|
@@ -12,9 +12,35 @@ export const FIELD_ROLE = {
|
|
|
12
12
|
adminDarkLogoAssetId: 'adminDarkLogo',
|
|
13
13
|
faviconSourceAssetId: 'faviconSource',
|
|
14
14
|
};
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Formats accepted for brand logos. Everything here is also validated
|
|
17
|
+
* server-side (allowlist + magic bytes) in cms-core's upload security.
|
|
18
|
+
* Brand uploads are stored as-is (`skipOptimize`), so each format keeps
|
|
19
|
+
* its native fidelity — including WebP, which general media uploads are
|
|
20
|
+
* converted to anyway.
|
|
21
|
+
*/
|
|
22
|
+
export const LOGO_MIME = [
|
|
23
|
+
'image/svg+xml',
|
|
24
|
+
'image/png',
|
|
25
|
+
'image/webp',
|
|
26
|
+
'image/jpeg',
|
|
27
|
+
'image/gif',
|
|
28
|
+
'image/avif',
|
|
29
|
+
];
|
|
30
|
+
/** Favicons need crisp edges at small sizes — vector or lossless/modern raster only. */
|
|
31
|
+
export const FAVICON_MIME = ['image/svg+xml', 'image/png', 'image/webp'];
|
|
17
32
|
const MAX_BYTES = 1024 * 1024; // 1 MB
|
|
33
|
+
const MIME_LABEL = {
|
|
34
|
+
'image/svg+xml': 'SVG',
|
|
35
|
+
'image/png': 'PNG',
|
|
36
|
+
'image/webp': 'WebP',
|
|
37
|
+
'image/jpeg': 'JPEG',
|
|
38
|
+
'image/gif': 'GIF',
|
|
39
|
+
'image/avif': 'AVIF',
|
|
40
|
+
};
|
|
41
|
+
function formatAllowed(mimes) {
|
|
42
|
+
return mimes.map((m) => MIME_LABEL[m] ?? m).join(', ');
|
|
43
|
+
}
|
|
18
44
|
const DEFAULT_FORM = {
|
|
19
45
|
colorMode: 'system',
|
|
20
46
|
accent: 'purple',
|
|
@@ -44,19 +70,26 @@ async function detectShape(file) {
|
|
|
44
70
|
}
|
|
45
71
|
return 'unknown';
|
|
46
72
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
URL.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
73
|
+
// Shape detection only powers advisory warnings — it must never block or
|
|
74
|
+
// fail an upload, so any decode problem resolves to 'unknown'.
|
|
75
|
+
try {
|
|
76
|
+
return await new Promise((resolve) => {
|
|
77
|
+
const url = URL.createObjectURL(file);
|
|
78
|
+
const img = new Image();
|
|
79
|
+
img.onload = () => {
|
|
80
|
+
URL.revokeObjectURL(url);
|
|
81
|
+
resolve(classifyLogoShape(img.naturalWidth, img.naturalHeight));
|
|
82
|
+
};
|
|
83
|
+
img.onerror = () => {
|
|
84
|
+
URL.revokeObjectURL(url);
|
|
85
|
+
resolve('unknown');
|
|
86
|
+
};
|
|
87
|
+
img.src = url;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return 'unknown';
|
|
92
|
+
}
|
|
60
93
|
}
|
|
61
94
|
function assetToCache(brand, assets, siteTitle) {
|
|
62
95
|
const map = new Map(Object.values(assets).map((a) => [
|
|
@@ -176,7 +209,7 @@ export function useAppearanceSettings(canEdit, config) {
|
|
|
176
209
|
const isFavicon = field === 'faviconSourceAssetId';
|
|
177
210
|
const allowed = isFavicon ? FAVICON_MIME : LOGO_MIME;
|
|
178
211
|
if (!allowed.includes(file.type)) {
|
|
179
|
-
setSaveError(`Unsupported file type. Allowed: ${allowed
|
|
212
|
+
setSaveError(`Unsupported file type. Allowed: ${formatAllowed(allowed)}.`);
|
|
180
213
|
return;
|
|
181
214
|
}
|
|
182
215
|
if (file.size > MAX_BYTES) {
|
|
@@ -189,8 +222,8 @@ export function useAppearanceSettings(canEdit, config) {
|
|
|
189
222
|
const shape = await detectShape(file);
|
|
190
223
|
const form = new FormData();
|
|
191
224
|
form.append('file', file);
|
|
192
|
-
// Preserve original format
|
|
193
|
-
//
|
|
225
|
+
// Preserve the original format — brand assets must not be transcoded
|
|
226
|
+
// (SVG stays vector, PNG keeps transparency, WebP/AVIF stay as-is).
|
|
194
227
|
form.append('skipOptimize', 'true');
|
|
195
228
|
const res = await cmsApi('/media/upload', {
|
|
196
229
|
method: 'POST',
|
|
@@ -217,12 +250,12 @@ export function useAppearanceSettings(canEdit, config) {
|
|
|
217
250
|
}
|
|
218
251
|
}, [appearance, brand, assets, update]);
|
|
219
252
|
const selectAsset = useCallback((field, item) => {
|
|
220
|
-
// Same allow-list as upload
|
|
221
|
-
//
|
|
253
|
+
// Same allow-list as upload, regardless of what else lives in the
|
|
254
|
+
// media library (which also holds documents, video, etc.).
|
|
222
255
|
const isFavicon = field === 'faviconSourceAssetId';
|
|
223
256
|
const allowed = isFavicon ? FAVICON_MIME : LOGO_MIME;
|
|
224
257
|
if (!allowed.includes(item.mimeType)) {
|
|
225
|
-
setSaveError(`Unsupported file type. Brand assets must be ${allowed
|
|
258
|
+
setSaveError(`Unsupported file type. ${isFavicon ? 'Favicons' : 'Brand assets'} must be ${formatAllowed(allowed)}.`);
|
|
226
259
|
return;
|
|
227
260
|
}
|
|
228
261
|
setSaveError(null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAppearanceSettings.js","sourceRoot":"","sources":["../../../src/views/settings/useAppearanceSettings.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useAppearanceSettings.js","sourceRoot":"","sources":["../../../src/views/settings/useAppearanceSettings.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -41,6 +41,7 @@ const cmsApi = vi.fn(async (endpoint: string, options?: { method?: string; body?
|
|
|
41
41
|
vi.mock('../../lib/api.js', () => ({ cmsApi: (e: string, o?: unknown) => cmsApi(e, o as any) }))
|
|
42
42
|
|
|
43
43
|
const { AppearanceTab } = await import('../../views/settings/AppearanceTab.js')
|
|
44
|
+
const { LOGO_MIME, FAVICON_MIME } = await import('../../views/settings/useAppearanceSettings.js')
|
|
44
45
|
|
|
45
46
|
function baseData(overrides: Record<string, unknown> = {}) {
|
|
46
47
|
return {
|
|
@@ -165,6 +166,72 @@ describe('AppearanceTab', () => {
|
|
|
165
166
|
)
|
|
166
167
|
})
|
|
167
168
|
|
|
169
|
+
it('accepts modern image formats for logos (and a crisp subset for favicons)', () => {
|
|
170
|
+
// WebP is a first-class brand format — general media uploads are converted
|
|
171
|
+
// to WebP anyway, so re-selecting them from the library must work.
|
|
172
|
+
expect(LOGO_MIME).toEqual(
|
|
173
|
+
expect.arrayContaining([
|
|
174
|
+
'image/svg+xml',
|
|
175
|
+
'image/png',
|
|
176
|
+
'image/webp',
|
|
177
|
+
'image/jpeg',
|
|
178
|
+
'image/gif',
|
|
179
|
+
'image/avif',
|
|
180
|
+
]),
|
|
181
|
+
)
|
|
182
|
+
expect(FAVICON_MIME).toEqual(
|
|
183
|
+
expect.arrayContaining(['image/svg+xml', 'image/png', 'image/webp']),
|
|
184
|
+
)
|
|
185
|
+
// Favicons need crisp small-size rendering — lossy photographic formats stay out.
|
|
186
|
+
expect(FAVICON_MIME).not.toContain('image/jpeg')
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
it('uploads a WebP logo through the Media Center', async () => {
|
|
190
|
+
// happy-dom's Image never decodes blobs — fire onload so shape detection
|
|
191
|
+
// (raster path, used for all non-SVG formats) completes.
|
|
192
|
+
vi.stubGlobal(
|
|
193
|
+
'Image',
|
|
194
|
+
class {
|
|
195
|
+
naturalWidth = 400
|
|
196
|
+
naturalHeight = 100
|
|
197
|
+
onload: (() => void) | null = null
|
|
198
|
+
onerror: (() => void) | null = null
|
|
199
|
+
set src(_v: string) {
|
|
200
|
+
queueMicrotask(() => this.onload?.())
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
render(<AppearanceTab role="ADMIN" />)
|
|
206
|
+
await screen.findByText('Branding')
|
|
207
|
+
|
|
208
|
+
const input = screen.getByLabelText('Primary logo') as HTMLInputElement
|
|
209
|
+
const file = new File([new Uint8Array([0x52, 0x49, 0x46, 0x46])], 'logo.webp', {
|
|
210
|
+
type: 'image/webp',
|
|
211
|
+
})
|
|
212
|
+
fireEvent.change(input, { target: { files: [file] } })
|
|
213
|
+
|
|
214
|
+
await waitFor(() =>
|
|
215
|
+
expect(cmsApi).toHaveBeenCalledWith(
|
|
216
|
+
'/media/upload',
|
|
217
|
+
expect.objectContaining({ method: 'POST' }),
|
|
218
|
+
),
|
|
219
|
+
)
|
|
220
|
+
vi.unstubAllGlobals()
|
|
221
|
+
})
|
|
222
|
+
|
|
223
|
+
it('rejects an unsupported upload type client-side with a readable error', async () => {
|
|
224
|
+
render(<AppearanceTab role="ADMIN" />)
|
|
225
|
+
await screen.findByText('Branding')
|
|
226
|
+
|
|
227
|
+
const input = screen.getByLabelText('Primary logo') as HTMLInputElement
|
|
228
|
+
const file = new File(['%PDF-1.4'], 'brochure.pdf', { type: 'application/pdf' })
|
|
229
|
+
fireEvent.change(input, { target: { files: [file] } })
|
|
230
|
+
|
|
231
|
+
expect(await screen.findByText(/unsupported file type/i)).toBeTruthy()
|
|
232
|
+
expect(cmsApi.mock.calls.some(([endpoint]) => endpoint === '/media/upload')).toBe(false)
|
|
233
|
+
})
|
|
234
|
+
|
|
168
235
|
it('is read-only for non-admins', async () => {
|
|
169
236
|
render(<AppearanceTab role="EDITOR" />)
|
|
170
237
|
|
|
@@ -14,13 +14,18 @@ import { useRef, useState } from 'react'
|
|
|
14
14
|
|
|
15
15
|
import { MediaPickerModal } from '../../components/MediaPickerModal.js'
|
|
16
16
|
import { SettingsCard, SettingsControlRow, SettingsSubsection } from './components.js'
|
|
17
|
-
import
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
import {
|
|
18
|
+
FAVICON_MIME,
|
|
19
|
+
LOGO_MIME,
|
|
20
|
+
type BrandAssetField,
|
|
21
|
+
type SelectedBrandAsset,
|
|
22
|
+
type UseAppearanceSettings,
|
|
21
23
|
} from './useAppearanceSettings.js'
|
|
22
24
|
|
|
23
|
-
|
|
25
|
+
// Derive the file-input accept strings from the validation allow-lists so the
|
|
26
|
+
// picker and the validator can never drift apart.
|
|
27
|
+
const LOGO_ACCEPT = LOGO_MIME.join(',')
|
|
28
|
+
const FAVICON_ACCEPT = FAVICON_MIME.join(',')
|
|
24
29
|
|
|
25
30
|
function previewSurface(dark: boolean): string {
|
|
26
31
|
return dark ? 'bg-foreground border-border' : 'bg-muted border-border'
|
|
@@ -243,7 +248,7 @@ export function BrandingCard({ s, canEdit }: { s: UseAppearanceSettings; canEdit
|
|
|
243
248
|
<div className="space-y-5">
|
|
244
249
|
<LogoField
|
|
245
250
|
label="Primary logo"
|
|
246
|
-
helper="SVG or
|
|
251
|
+
helper="SVG, PNG, WebP, JPEG, GIF, or AVIF, up to 1MB. Best for the public header and full admin sidebar."
|
|
247
252
|
field="publicPrimaryLogoAssetId"
|
|
248
253
|
warning={warningFor('publicPrimaryLogoAssetId')}
|
|
249
254
|
{...logoFieldProps}
|
|
@@ -251,11 +256,12 @@ export function BrandingCard({ s, canEdit }: { s: UseAppearanceSettings; canEdit
|
|
|
251
256
|
|
|
252
257
|
<LogoField
|
|
253
258
|
label="Favicon / app icon source"
|
|
254
|
-
helper="32×32 PNG or
|
|
259
|
+
helper="32×32 SVG, PNG, or WebP. A larger square image is fine — it scales down cleanly."
|
|
255
260
|
field="faviconSourceAssetId"
|
|
256
261
|
square
|
|
257
262
|
warning={warningFor('faviconSourceAssetId')}
|
|
258
263
|
{...logoFieldProps}
|
|
264
|
+
accept={FAVICON_ACCEPT}
|
|
259
265
|
/>
|
|
260
266
|
|
|
261
267
|
{/* Advanced logo variants disclosure (Logo mark + Dark mode logo). */}
|
|
@@ -84,10 +84,38 @@ export interface SelectedBrandAsset {
|
|
|
84
84
|
height?: number
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Formats accepted for brand logos. Everything here is also validated
|
|
89
|
+
* server-side (allowlist + magic bytes) in cms-core's upload security.
|
|
90
|
+
* Brand uploads are stored as-is (`skipOptimize`), so each format keeps
|
|
91
|
+
* its native fidelity — including WebP, which general media uploads are
|
|
92
|
+
* converted to anyway.
|
|
93
|
+
*/
|
|
94
|
+
export const LOGO_MIME = [
|
|
95
|
+
'image/svg+xml',
|
|
96
|
+
'image/png',
|
|
97
|
+
'image/webp',
|
|
98
|
+
'image/jpeg',
|
|
99
|
+
'image/gif',
|
|
100
|
+
'image/avif',
|
|
101
|
+
]
|
|
102
|
+
/** Favicons need crisp edges at small sizes — vector or lossless/modern raster only. */
|
|
103
|
+
export const FAVICON_MIME = ['image/svg+xml', 'image/png', 'image/webp']
|
|
89
104
|
const MAX_BYTES = 1024 * 1024 // 1 MB
|
|
90
105
|
|
|
106
|
+
const MIME_LABEL: Record<string, string> = {
|
|
107
|
+
'image/svg+xml': 'SVG',
|
|
108
|
+
'image/png': 'PNG',
|
|
109
|
+
'image/webp': 'WebP',
|
|
110
|
+
'image/jpeg': 'JPEG',
|
|
111
|
+
'image/gif': 'GIF',
|
|
112
|
+
'image/avif': 'AVIF',
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function formatAllowed(mimes: string[]): string {
|
|
116
|
+
return mimes.map((m) => MIME_LABEL[m] ?? m).join(', ')
|
|
117
|
+
}
|
|
118
|
+
|
|
91
119
|
export interface UseAppearanceSettings {
|
|
92
120
|
loading: boolean
|
|
93
121
|
loadError: string | null
|
|
@@ -163,19 +191,25 @@ async function detectShape(file: File): Promise<LogoShape> {
|
|
|
163
191
|
}
|
|
164
192
|
return 'unknown'
|
|
165
193
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
URL.
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
194
|
+
// Shape detection only powers advisory warnings — it must never block or
|
|
195
|
+
// fail an upload, so any decode problem resolves to 'unknown'.
|
|
196
|
+
try {
|
|
197
|
+
return await new Promise<LogoShape>((resolve) => {
|
|
198
|
+
const url = URL.createObjectURL(file)
|
|
199
|
+
const img = new Image()
|
|
200
|
+
img.onload = () => {
|
|
201
|
+
URL.revokeObjectURL(url)
|
|
202
|
+
resolve(classifyLogoShape(img.naturalWidth, img.naturalHeight))
|
|
203
|
+
}
|
|
204
|
+
img.onerror = () => {
|
|
205
|
+
URL.revokeObjectURL(url)
|
|
206
|
+
resolve('unknown')
|
|
207
|
+
}
|
|
208
|
+
img.src = url
|
|
209
|
+
})
|
|
210
|
+
} catch {
|
|
211
|
+
return 'unknown'
|
|
212
|
+
}
|
|
179
213
|
}
|
|
180
214
|
|
|
181
215
|
function assetToCache(
|
|
@@ -344,7 +378,7 @@ export function useAppearanceSettings(
|
|
|
344
378
|
const isFavicon = field === 'faviconSourceAssetId'
|
|
345
379
|
const allowed = isFavicon ? FAVICON_MIME : LOGO_MIME
|
|
346
380
|
if (!allowed.includes(file.type)) {
|
|
347
|
-
setSaveError(`Unsupported file type. Allowed: ${allowed
|
|
381
|
+
setSaveError(`Unsupported file type. Allowed: ${formatAllowed(allowed)}.`)
|
|
348
382
|
return
|
|
349
383
|
}
|
|
350
384
|
if (file.size > MAX_BYTES) {
|
|
@@ -357,8 +391,8 @@ export function useAppearanceSettings(
|
|
|
357
391
|
const shape = await detectShape(file)
|
|
358
392
|
const form = new FormData()
|
|
359
393
|
form.append('file', file)
|
|
360
|
-
// Preserve original format
|
|
361
|
-
//
|
|
394
|
+
// Preserve the original format — brand assets must not be transcoded
|
|
395
|
+
// (SVG stays vector, PNG keeps transparency, WebP/AVIF stay as-is).
|
|
362
396
|
form.append('skipOptimize', 'true')
|
|
363
397
|
const res = await cmsApi<{ id: string; url?: string; mimeType?: string }>('/media/upload', {
|
|
364
398
|
method: 'POST',
|
|
@@ -388,12 +422,14 @@ export function useAppearanceSettings(
|
|
|
388
422
|
|
|
389
423
|
const selectAsset = useCallback(
|
|
390
424
|
(field: BrandAssetField, item: SelectedBrandAsset) => {
|
|
391
|
-
// Same allow-list as upload
|
|
392
|
-
//
|
|
425
|
+
// Same allow-list as upload, regardless of what else lives in the
|
|
426
|
+
// media library (which also holds documents, video, etc.).
|
|
393
427
|
const isFavicon = field === 'faviconSourceAssetId'
|
|
394
428
|
const allowed = isFavicon ? FAVICON_MIME : LOGO_MIME
|
|
395
429
|
if (!allowed.includes(item.mimeType)) {
|
|
396
|
-
setSaveError(
|
|
430
|
+
setSaveError(
|
|
431
|
+
`Unsupported file type. ${isFavicon ? 'Favicons' : 'Brand assets'} must be ${formatAllowed(allowed)}.`,
|
|
432
|
+
)
|
|
397
433
|
return
|
|
398
434
|
}
|
|
399
435
|
setSaveError(null)
|