) => {
+ onChange?.(event.target.checked);
+ };
+
+ const rowClassName = [
+ 'flex min-h-12 items-center justify-between gap-3 rounded-[1rem] border border-[var(--platform-subpanel-border)] px-3',
+ PLATFORM_TOGGLE_ROW_SURFACE_CLASS[surface],
+ disabled ? 'opacity-60' : null,
+ className,
+ ]
+ .filter(Boolean)
+ .join(' ');
+ const labelNode = (
+
+ {icon ? {icon} : null}
+ {label}
+
+ );
+
+ if (mode === 'status') {
+ if (onClick) {
+ return (
+
+ );
+ }
+
+ return (
+
+ {labelNode}
+ {renderToggleStatus({ checked, onLabel, offLabel })}
+
+ );
+ }
+
+ return (
+
+ );
+}
diff --git a/packages/shared/src/components/index.ts b/packages/shared/src/components/index.ts
index 14d98e1ff..cac8cfd0b 100644
--- a/packages/shared/src/components/index.ts
+++ b/packages/shared/src/components/index.ts
@@ -122,6 +122,12 @@ export type {
PlatformTextFieldProps,
} from './PlatformTextField';
export { PlatformSelectField, PlatformTextField } from './PlatformTextField';
+export type {
+ PlatformToggleRowMode,
+ PlatformToggleRowProps,
+ PlatformToggleRowSurface,
+} from './PlatformToggleRow';
+export { PlatformToggleRow } from './PlatformToggleRow';
export type {
BadgeProps,
BadgeTone,
diff --git a/src/components/common/PlatformToggleRow.tsx b/src/components/common/PlatformToggleRow.tsx
index 1eab276e1..4a6ab3168 100644
--- a/src/components/common/PlatformToggleRow.tsx
+++ b/src/components/common/PlatformToggleRow.tsx
@@ -1,134 +1,6 @@
-import type { ChangeEvent, ReactNode } from 'react';
-
-import { getPlatformPillBadgeClassName } from './platformPillBadgeModel';
-
-type PlatformToggleRowSurface = 'soft' | 'plain';
-type PlatformToggleRowMode = 'checkbox' | 'status';
-
-type PlatformToggleRowProps = {
- label: ReactNode;
- checked: boolean;
- onChange?: (checked: boolean) => void;
- disabled?: boolean;
- mode?: PlatformToggleRowMode;
- icon?: ReactNode;
- onLabel?: ReactNode;
- offLabel?: ReactNode;
- onClick?: () => void;
- className?: string;
- labelClassName?: string;
- surface?: PlatformToggleRowSurface;
-};
-
-const PLATFORM_TOGGLE_ROW_SURFACE_CLASS: Record<
+export type {
+ PlatformToggleRowMode,
+ PlatformToggleRowProps,
PlatformToggleRowSurface,
- string
-> = {
- soft: 'bg-white/74',
- plain: 'bg-white/78',
-};
-
-function renderToggleStatus({
- checked,
- offLabel,
- onLabel,
-}: {
- checked: boolean;
- offLabel: ReactNode;
- onLabel: ReactNode;
-}) {
- return (
-
- {checked ? onLabel : offLabel}
-
- );
-}
-
-/**
- * 平台整行开关。
- * 统一承接设置面板和结果页配置里的白底 label + checkbox / 状态行。
- */
-export function PlatformToggleRow({
- label,
- checked,
- onChange,
- disabled = false,
- mode = 'checkbox',
- icon,
- onLabel = '开启',
- offLabel = '关闭',
- onClick,
- className,
- labelClassName,
- surface = 'soft',
-}: PlatformToggleRowProps) {
- const handleChange = (event: ChangeEvent) => {
- onChange?.(event.target.checked);
- };
-
- const rowClassName = [
- 'flex min-h-12 items-center justify-between gap-3 rounded-[1rem] border border-[var(--platform-subpanel-border)] px-3',
- PLATFORM_TOGGLE_ROW_SURFACE_CLASS[surface],
- disabled ? 'opacity-60' : null,
- className,
- ]
- .filter(Boolean)
- .join(' ');
- const labelNode = (
-
- {icon ? {icon} : null}
- {label}
-
- );
-
- if (mode === 'status') {
- if (onClick) {
- return (
-
- );
- }
-
- return (
-
- {labelNode}
- {renderToggleStatus({ checked, onLabel, offLabel })}
-
- );
- }
-
- return (
-
- );
-}
+} from '@genarrative/shared/components';
+export { PlatformToggleRow } from '@genarrative/shared/components';