diff --git a/.changeset/better-cameras-smoke.md b/.changeset/better-cameras-smoke.md
new file mode 100644
index 000000000..ecf4e6ccf
--- /dev/null
+++ b/.changeset/better-cameras-smoke.md
@@ -0,0 +1,5 @@
+---
+"@emdash-cms/admin": patch
+---
+
+Replaces 20 raw `` elements across the admin UI with Kumo's `Switch` and `Checkbox` components. Single-boolean toggles (SEO, Enable comments, Required, etc.) become `Switch`; multi-select / list-context checkboxes (collection multi-select, term tree nodes) become `Checkbox`. Drops manual styling and label markup that duplicated what the Kumo components provide built-in.
diff --git a/packages/admin/src/components/ContentTypeEditor.tsx b/packages/admin/src/components/ContentTypeEditor.tsx
index db176e442..36ddaa3e9 100644
--- a/packages/admin/src/components/ContentTypeEditor.tsx
+++ b/packages/admin/src/components/ContentTypeEditor.tsx
@@ -1,4 +1,4 @@
-import { Badge, Button, Input, InputArea, Label, Select } from "@cloudflare/kumo";
+import { Badge, Button, Checkbox, Input, InputArea, Label, Select, Switch } from "@cloudflare/kumo";
import {
DndContext,
closestCenter,
@@ -441,50 +441,43 @@ export function ContentTypeEditor({
{SUPPORT_OPTIONS.map((option) => (
-
+
))}
{/* SEO toggle */}
-
+
setHasSeo(checked)}
+ disabled={isFromCode}
+ label={
+
+
{t`SEO`}
+
+ {t`Add SEO metadata fields (title, description, image) and include in sitemap`}
+
+
+ }
+ />
@@ -493,26 +486,19 @@ export function ContentTypeEditor({
{t`Comments`}
-
+
setCommentsEnabled(checked)}
+ disabled={isFromCode}
+ label={
+
+
{t`Enable comments`}
+
+ {t`Allow visitors to leave comments on this collection's content`}
+
+
+ }
+ />
{commentsEnabled && (
<>
@@ -545,28 +531,21 @@ export function ContentTypeEditor({
{t`Set to 0 to never close comments automatically.`}
-
+ setCommentsAutoApproveUsers(checked)}
+ disabled={isFromCode}
+ label={
+
+
+ {t`Auto-approve authenticated users`}
+
+
+ {t`Comments from logged-in CMS users are approved automatically`}
+
+
+ }
+ />
>
)}
diff --git a/packages/admin/src/components/FieldEditor.tsx b/packages/admin/src/components/FieldEditor.tsx
index 8babe0eb3..abd319fd3 100644
--- a/packages/admin/src/components/FieldEditor.tsx
+++ b/packages/admin/src/components/FieldEditor.tsx
@@ -1,4 +1,4 @@
-import { Button, Dialog, Input, InputArea, Select } from "@cloudflare/kumo";
+import { Button, Dialog, Input, InputArea, Select, Switch } from "@cloudflare/kumo";
import { useLingui } from "@lingui/react/macro";
import {
TextT,
@@ -431,38 +431,26 @@ export function FieldEditor({ open, onOpenChange, field, onSave, isSaving }: Fie
{/* Toggles */}
-
-
+ setField("required", checked)}
+ label={{t`Required`}}
+ />
+ setField("unique", checked)}
+ label={{t`Unique`}}
+ />
{(selectedType === "string" ||
selectedType === "text" ||
selectedType === "portableText" ||
selectedType === "slug" ||
selectedType === "url") && (
-
+ setField("searchable", checked)}
+ label={{t`Searchable`}}
+ />
)}
@@ -600,18 +588,15 @@ export function FieldEditor({ open, onOpenChange, field, onSave, isSaving }: Fie
/>
-
+ {
+ const updated = [...formState.subFields];
+ updated[i] = { ...sf, required: checked };
+ setFormState((prev) => ({ ...prev, subFields: updated }));
+ }}
+ />