/**
* 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}
)}
);
}