+ {tabButton('photos', 'Photos')}{tabButton('settings', 'Settings')}{tabButton('frame', 'Frame')}{tabButton('links', 'Links')}
+
+
+ {error ?
{error}
: null}
+ {loading ?
Loading…
: null}
+ {!loading && tab === 'photos' ? (
+ photos.length ?
+ {photos.map((photo) =>
{SOURCE_LABELS[photo.source]})}
+
:
No published photos from the selected sources yet.
+ ) : null}
+ {!loading && tab === 'settings' ? <>
+
+
+
+ {(Object.keys(SOURCE_LABELS) as SpotlightSource[]).map((source) => )}
+
+
+
+ setDraft((d) => ({ ...d, photosPerRow: Number(e.target.value) || 4 }))} style={IS} />
+ setDraft((d) => ({ ...d, totalRows: Number(e.target.value) || 3 }))} style={IS} />
+
+
+ setDraft((d) => ({ ...d, maxPhotoWidth: Number(e.target.value) || 320 }))} style={IS} />
+ setDraft((d) => ({ ...d, maxPhotoHeight: Number(e.target.value) || 320 }))} style={IS} />
+ setDraft((d) => ({ ...d, gapPx: Number(e.target.value) || 0 }))} style={IS} />
+ setDraft((d) => ({ ...d, presentMarginTopPx: Number(e.target.value) || 0 }))} style={IS} />
+
+
+ > : null}
+ {!loading && tab === 'frame' ? <>
+
+
+
+
+
+
+
+
+
+
setDraft((d) => ({ ...d, frameLayout }))} onFrameImageLayoutChange={(frameImageLayout) => setDraft((d) => ({ ...d, frameImageLayout }))} />
+ element.id === selectedId) || null} onChange={patchSelected} disabled={!canWrite} canvasWidth={draft.frameCanvasWidth} canvasHeight={draft.frameCanvasHeight} />
+
+ > : null}
+ {!loading && tab === 'links' ? <>
+
+ {canWrite ?
: null}
+ > : null}
+
+