/** * General Tab Component * Layout, sizing, and display options for swatches. */ import React from "react"; import { BaseTabProps } from "../types"; import { SlidingTabs } from "../../components/SlidingTabs"; import { RangeSlider } from "../../components/RangeSlider"; import { Toggle } from "../../components/Toggle"; import { HighlightableField } from "../../components/HighlightableField"; import { coerceInt } from "../../constants"; export interface GeneralTabProps extends BaseTabProps { activeGeneralSubTab: "layout" | "size" | "options"; setActiveGeneralSubTab: React.Dispatch< React.SetStateAction<"layout" | "size" | "options"> >; contentOverride?: React.ReactNode | null; contentOverrideMode?: Partial< Record<"layout" | "size" | "options", "append" | "replace"> >; } export function GeneralTab({ settings, setSettings, activeGeneralSubTab, setActiveGeneralSubTab, contentOverride, contentOverrideMode, adminColor: _adminColor, }: GeneralTabProps) { // Server-side settings normalization keeps the base layout contract stable. const layout = settings.layout === "wrap" ? "wrap" : "wrap"; const shape = settings.shape === "square" ? "square" : "square"; const selectorStyle = settings.swatch_style === "underline" ? "underline" : "underline"; const swatchWidth = coerceInt(settings.swatch_width, 32); const swatchHeight = coerceInt(settings.swatch_height, 32); const swatchGap = coerceInt(settings.swatch_gap, 12); const layoutPaddingTop = coerceInt(settings.layout_padding_top, 5); const layoutPaddingRight = coerceInt(settings.layout_padding_right, 5); const layoutPaddingBottom = coerceInt(settings.layout_padding_bottom, 5); const layoutPaddingLeft = coerceInt(settings.layout_padding_left, 5); const externalPaddingTop = coerceInt(settings.external_padding_top ?? 5, 5); const externalPaddingRight = coerceInt( settings.external_padding_right ?? 5, 5, ); const externalPaddingBottom = coerceInt( settings.external_padding_bottom ?? 5, 5, ); const externalPaddingLeft = coerceInt(settings.external_padding_left ?? 5, 5); const layoutOverrideMode = contentOverrideMode?.layout ?? "append"; const sizeOverrideMode = contentOverrideMode?.size ?? "append"; const optionsOverrideMode = contentOverrideMode?.options ?? "append"; return (

General

{/* Sub-tab Navigation */}
setActiveGeneralSubTab(id as "layout" | "size" | "options") } tabs={[ { id: "layout", label: "Layout & Display" }, { id: "size", label: "Size & Dimensions" }, { id: "options", label: "Labels & Options" }, ]} />
{/* Tab Content */}
{/* Layout & Display Tab */} {activeGeneralSubTab === "layout" && (
{layoutOverrideMode !== "replace" ? ( <> {/* Layout Selection */}
{( [ { value: "wrap", label: "Wrap", desc: "Wraps to new lines", icon: ( ), }, ] as const ).map((layoutOption) => { return ( ); })}
setSettings({ ...settings, swatch_gap: val }) } />
) : null} {contentOverride}
)} {/* Size & Dimensions Tab */} {activeGeneralSubTab === "size" && (
{sizeOverrideMode !== "replace" ? ( <>
setSettings({ ...settings, swatch_width: val }) } /> setSettings({ ...settings, swatch_height: val }) } />

Padding inside the swatch layout container

setSettings({ ...settings, layout_padding_top: val }) } /> setSettings({ ...settings, layout_padding_right: val, }) } /> setSettings({ ...settings, layout_padding_bottom: val, }) } /> setSettings({ ...settings, layout_padding_left: val }) } />

Padding outside the swatch layout container (spacing from other elements)

setSettings({ ...settings, external_padding_top: val, }) } /> setSettings({ ...settings, external_padding_right: val, }) } /> setSettings({ ...settings, external_padding_bottom: val, }) } /> setSettings({ ...settings, external_padding_left: val, }) } />
) : null} {contentOverride}
)} {/* Labels & Options Tab */} {activeGeneralSubTab === "options" && (
{optionsOverrideMode !== "replace" ? ( <> setSettings({ ...settings, show_labels_colors: checked }) } /> setSettings({ ...settings, auto_convert_dropdowns: checked, }) } /> ) : null} {contentOverride}
)}
); }