@burdenoff/microfe-mybodyshield 2026.821.2 → 2026.830.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mybodyshield/MyBodyShieldRoot.d.ts.map +1 -1
- package/dist/mybodyshield/MyBodyShieldRoot.js +54 -56
- package/dist/mybodyshield/MyBodyShieldRoot.js.map +1 -1
- package/dist/mybodyshield/MyBodyShieldRoutes.d.ts.map +1 -1
- package/dist/mybodyshield/MyBodyShieldRoutes.js +121 -62
- package/dist/mybodyshield/MyBodyShieldRoutes.js.map +1 -1
- package/dist/mybodyshield/components/EvidenceUpload.d.ts.map +1 -1
- package/dist/mybodyshield/components/EvidenceUpload.js +46 -45
- package/dist/mybodyshield/components/EvidenceUpload.js.map +1 -1
- package/dist/mybodyshield/components/FileLink.d.ts.map +1 -1
- package/dist/mybodyshield/components/FileLink.js +27 -18
- package/dist/mybodyshield/components/FileLink.js.map +1 -1
- package/dist/mybodyshield/components/MybDiscussion.d.ts +1 -1
- package/dist/mybodyshield/components/MybDiscussion.d.ts.map +1 -1
- package/dist/mybodyshield/components/MybDiscussion.js +59 -58
- package/dist/mybodyshield/components/MybDiscussion.js.map +1 -1
- package/dist/mybodyshield/components/MybTags.d.ts +1 -1
- package/dist/mybodyshield/components/MybTags.d.ts.map +1 -1
- package/dist/mybodyshield/components/MybTags.js +83 -74
- package/dist/mybodyshield/components/MybTags.js.map +1 -1
- package/dist/mybodyshield/components/PageDisabled.d.ts.map +1 -1
- package/dist/mybodyshield/components/PageDisabled.js +16 -11
- package/dist/mybodyshield/components/PageDisabled.js.map +1 -1
- package/dist/mybodyshield/components/Pagination.d.ts.map +1 -1
- package/dist/mybodyshield/components/Pagination.js +36 -27
- package/dist/mybodyshield/components/Pagination.js.map +1 -1
- package/dist/mybodyshield/components/StateViews.d.ts.map +1 -1
- package/dist/mybodyshield/components/StateViews.js +42 -34
- package/dist/mybodyshield/components/StateViews.js.map +1 -1
- package/dist/mybodyshield/components/UserSearchSelect.d.ts.map +1 -1
- package/dist/mybodyshield/components/UserSearchSelect.js +66 -68
- package/dist/mybodyshield/components/UserSearchSelect.js.map +1 -1
- package/dist/mybodyshield/hooks/index.d.ts +1 -0
- package/dist/mybodyshield/hooks/index.d.ts.map +1 -1
- package/dist/mybodyshield/hooks/index.js +1 -0
- package/dist/mybodyshield/hooks/useTr.d.ts +5 -0
- package/dist/mybodyshield/hooks/useTr.d.ts.map +1 -0
- package/dist/mybodyshield/hooks/useTr.js +12 -0
- package/dist/mybodyshield/hooks/useTr.js.map +1 -0
- package/dist/mybodyshield/pages/DashboardPage.d.ts.map +1 -1
- package/dist/mybodyshield/pages/DashboardPage.js +157 -136
- package/dist/mybodyshield/pages/DashboardPage.js.map +1 -1
- package/dist/mybodyshield/pages/SettingsPage.d.ts.map +1 -1
- package/dist/mybodyshield/pages/SettingsPage.js +50 -59
- package/dist/mybodyshield/pages/SettingsPage.js.map +1 -1
- package/dist/mybodyshield/pages/_shared/visuals.d.ts +2 -1
- package/dist/mybodyshield/pages/_shared/visuals.d.ts.map +1 -1
- package/dist/mybodyshield/pages/_shared/visuals.js +91 -81
- package/dist/mybodyshield/pages/_shared/visuals.js.map +1 -1
- package/dist/mybodyshield/pages/ai/AiControlsPage.d.ts.map +1 -1
- package/dist/mybodyshield/pages/ai/AiControlsPage.js +279 -231
- package/dist/mybodyshield/pages/ai/AiControlsPage.js.map +1 -1
- package/dist/mybodyshield/pages/coaching/CoachingPage.d.ts.map +1 -1
- package/dist/mybodyshield/pages/coaching/CoachingPage.js +349 -258
- package/dist/mybodyshield/pages/coaching/CoachingPage.js.map +1 -1
- package/dist/mybodyshield/pages/goals/GoalsPage.d.ts.map +1 -1
- package/dist/mybodyshield/pages/goals/GoalsPage.js +247 -251
- package/dist/mybodyshield/pages/goals/GoalsPage.js.map +1 -1
- package/dist/mybodyshield/pages/insights/InsightsCharts.d.ts.map +1 -1
- package/dist/mybodyshield/pages/insights/InsightsCharts.js +216 -213
- package/dist/mybodyshield/pages/insights/InsightsCharts.js.map +1 -1
- package/dist/mybodyshield/pages/insights/InsightsPage.d.ts.map +1 -1
- package/dist/mybodyshield/pages/insights/InsightsPage.js +327 -220
- package/dist/mybodyshield/pages/insights/InsightsPage.js.map +1 -1
- package/dist/mybodyshield/pages/nutrition/NutritionPage.d.ts.map +1 -1
- package/dist/mybodyshield/pages/nutrition/NutritionPage.js +575 -529
- package/dist/mybodyshield/pages/nutrition/NutritionPage.js.map +1 -1
- package/dist/mybodyshield/pages/programs/ProgramDetailPage.d.ts.map +1 -1
- package/dist/mybodyshield/pages/programs/ProgramDetailPage.js +333 -275
- package/dist/mybodyshield/pages/programs/ProgramDetailPage.js.map +1 -1
- package/dist/mybodyshield/pages/programs/ProgramsPage.d.ts.map +1 -1
- package/dist/mybodyshield/pages/programs/ProgramsPage.js +258 -253
- package/dist/mybodyshield/pages/programs/ProgramsPage.js.map +1 -1
- package/dist/mybodyshield/pages/progress/ProgressPage.d.ts.map +1 -1
- package/dist/mybodyshield/pages/progress/ProgressPage.js +271 -254
- package/dist/mybodyshield/pages/progress/ProgressPage.js.map +1 -1
- package/dist/mybodyshield/pages/recovery/RecoveryPage.d.ts.map +1 -1
- package/dist/mybodyshield/pages/recovery/RecoveryPage.js +206 -200
- package/dist/mybodyshield/pages/recovery/RecoveryPage.js.map +1 -1
- package/dist/mybodyshield/pages/train/SessionDetailPage.d.ts.map +1 -1
- package/dist/mybodyshield/pages/train/SessionDetailPage.js +327 -294
- package/dist/mybodyshield/pages/train/SessionDetailPage.js.map +1 -1
- package/dist/mybodyshield/pages/train/SessionsPage.d.ts.map +1 -1
- package/dist/mybodyshield/pages/train/SessionsPage.js +180 -163
- package/dist/mybodyshield/pages/train/SessionsPage.js.map +1 -1
- package/dist/mybodyshield/utils/i18n.d.ts +1 -2
- package/dist/mybodyshield/utils/i18n.d.ts.map +1 -1
- package/dist/mybodyshield/utils/i18n.js +15 -0
- package/dist/mybodyshield/utils/i18n.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProgramDetailPage.js","names":[],"sources":["../../../../src/mybodyshield/pages/programs/ProgramDetailPage.tsx"],"sourcesContent":["/**\n * Program detail — a single training block with its workouts & exercises.\n * @module mybodyshield/pages/programs\n *\n * Renders one `mybProgram` (with its nested `workouts[].exercises[]`), lifecycle\n * transition controls (activate / complete / archive) and dialogs to add\n * workouts and exercises. All data & mutations hit the real `myb*` contract.\n */\n\nimport { useMemo, useState, type FC, type ReactNode } from 'react';\nimport { motion, useReducedMotion } from 'framer-motion';\nimport { useParams } from 'react-router';\nimport {\n ArrowLeft,\n Plus,\n CheckCircle2,\n Archive,\n Play,\n Dumbbell,\n Pencil,\n Flame,\n Lock,\n Clock,\n CalendarDays,\n} from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectTrigger,\n SelectContent,\n SelectItem,\n SelectValue,\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n StatusBadge,\n EmptyState,\n LoadingView,\n ErrorView,\n Section,\n EvidenceUpload,\n FileLink,\n MybDiscussion,\n MybTags,\n} from '../../components';\nimport { IconChip, WORKOUT_TYPE_META, MUSCLE_META, GOAL_TYPE_META } from '../_shared/visuals';\nimport { useMyBodyShield } from '../../context';\nimport {\n useMybProgram,\n useMybUpdateProgram,\n useMybAddWorkout,\n useMybAddExercise,\n useMybTransitionProgram,\n useMybArchiveProgram,\n useMyBodyShieldAnalytics,\n type UploadedMybFile,\n} from '../../hooks';\nimport {\n formatEnumLabel,\n formatDate,\n formatNumber,\n formatWeight,\n formatDuration,\n formatMinutes,\n} from '../../utils/formatters';\nimport type {\n MybWorkout,\n MybExercise,\n MybWorkoutType,\n MybMuscleGroup,\n MybProgramStatus,\n MybGoalType,\n MybFitnessLevel,\n MybProgramPhase,\n MybCreateWorkoutInput,\n MybCreateExerciseInput,\n MybUpdateProgramInput,\n} from '../../types';\n\nconst WORKOUT_TYPES: readonly MybWorkoutType[] = [\n 'STRENGTH',\n 'CARDIO',\n 'HIIT',\n 'MOBILITY',\n 'YOGA',\n 'RECOVERY',\n];\nconst MUSCLE_GROUPS: readonly MybMuscleGroup[] = [\n 'CHEST',\n 'BACK',\n 'LEGS',\n 'SHOULDERS',\n 'ARMS',\n 'CORE',\n 'FULL_BODY',\n];\n\n/** Parse a numeric text field → number | null (null when blank / invalid). */\nconst toNum = (raw: string): number | null => {\n const t = raw.trim();\n if (t === '') return null;\n const n = Number(t);\n return Number.isFinite(n) ? n : null;\n};\n\n/** Shared entrance easing — a soft, decelerating cubic-bezier. */\nconst MOTION_EASE: [number, number, number, number] = [0.16, 1, 0.3, 1];\n\nconst STAGGER_CONTAINER = {\n hidden: {},\n show: { transition: { staggerChildren: 0.06 } },\n};\nconst RISE_ITEM = {\n hidden: { opacity: 0, y: 12 },\n show: { opacity: 1, y: 0, transition: { duration: 0.35, ease: MOTION_EASE } },\n};\n\nconst Chip: FC<{ children: ReactNode; icon?: ReactNode; tint?: string }> = ({\n children,\n icon,\n tint,\n}) => (\n <span\n className=\"inline-flex items-center gap-1.5 rounded-full bg-bg-sunken px-2.5 py-1 text-xs font-medium text-text-secondary\"\n style={tint ? { color: tint } : undefined}\n >\n {icon}\n {children}\n </span>\n);\n\nconst MuscleChip: FC<{ group: MybMuscleGroup }> = ({ group }) => {\n const tint = MUSCLE_META[group].tint;\n return (\n <span\n className=\"inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium\"\n style={{ backgroundColor: `color-mix(in srgb, ${tint} 16%, transparent)`, color: tint }}\n >\n {formatEnumLabel(group)}\n </span>\n );\n};\n\n/** Token-safe generic enum <Select>. */\nfunction EnumSelect<T extends string>({\n id,\n value,\n onChange,\n options,\n}: {\n id?: string;\n value: T;\n onChange: (value: T) => void;\n options: readonly T[];\n}) {\n return (\n <Select value={value} onValueChange={(v) => onChange(v as T)}>\n <SelectTrigger id={id}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map((opt) => (\n <SelectItem key={opt} value={opt}>\n {formatEnumLabel(opt)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\ninterface WorkoutForm {\n name: string;\n type: MybWorkoutType;\n weekNumber: string;\n dayOfWeek: string;\n durationMin: string;\n}\n\nconst EMPTY_WORKOUT: WorkoutForm = {\n name: '',\n type: 'STRENGTH',\n weekNumber: '1',\n dayOfWeek: '1',\n durationMin: '',\n};\n\ninterface ExerciseForm {\n name: string;\n muscleGroup: MybMuscleGroup;\n sets: string;\n reps: string;\n targetWeight: string;\n restSeconds: string;\n instructions: string;\n}\n\nconst EMPTY_EXERCISE: ExerciseForm = {\n name: '',\n muscleGroup: 'FULL_BODY',\n sets: '',\n reps: '',\n targetWeight: '',\n restSeconds: '',\n instructions: '',\n};\n\nconst GOAL_TYPES: readonly MybGoalType[] = [\n 'WEIGHT_LOSS',\n 'MUSCLE_GAIN',\n 'STRENGTH',\n 'ENDURANCE',\n 'MOBILITY',\n 'GENERAL_FITNESS',\n];\nconst LEVELS: readonly MybFitnessLevel[] = ['BEGINNER', 'INTERMEDIATE', 'ADVANCED', 'ELITE'];\nconst PHASES: readonly MybProgramPhase[] = ['BUILD', 'PEAK', 'DELOAD', 'MAINTENANCE'];\n\ninterface ProgramEditForm {\n name: string;\n description: string;\n goalType: MybGoalType;\n level: MybFitnessLevel;\n phase: MybProgramPhase;\n weeks: string;\n daysPerWeek: string;\n startDate: string;\n endDate: string;\n}\n\nconst EMPTY_EDIT: ProgramEditForm = {\n name: '',\n description: '',\n goalType: 'GENERAL_FITNESS',\n level: 'BEGINNER',\n phase: 'BUILD',\n weeks: '',\n daysPerWeek: '',\n startDate: '',\n endDate: '',\n};\n\n/** ISO datetime → `YYYY-MM-DD` for a native `<input type=\"date\">`. */\nconst toDateInput = (iso: string | null | undefined): string => {\n if (!iso) return '';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return '';\n return d.toISOString().slice(0, 10);\n};\n\nfunction ExerciseRow({ exercise }: { exercise: MybExercise }) {\n const tint = MUSCLE_META[exercise.muscleGroup].tint;\n return (\n <div\n className=\"flex flex-col gap-2 rounded-lg border-l-2 py-3 pl-3 pr-1 transition-colors hover:bg-bg-sunken/40 sm:flex-row sm:items-start sm:justify-between\"\n style={{ borderColor: `color-mix(in srgb, ${tint} 55%, transparent)` }}\n >\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"font-medium text-text-primary\">{exercise.name}</p>\n <MuscleChip group={exercise.muscleGroup} />\n </div>\n {exercise.instructions && (\n <p className=\"mt-1 text-xs text-text-tertiary\">{exercise.instructions}</p>\n )}\n {exercise.demo?.id && (\n <div className=\"mt-1.5\">\n <FileLink fileId={exercise.demo.id} />\n </div>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-4 text-sm tabular-nums text-text-secondary\">\n <span>\n {formatNumber(exercise.sets)}×{formatNumber(exercise.reps)} @{' '}\n {formatWeight(exercise.targetWeight)}\n </span>\n <span className=\"text-text-tertiary\">Rest {formatDuration(exercise.restSeconds)}</span>\n </div>\n </div>\n );\n}\n\nfunction WorkoutCard({\n workout,\n canEdit,\n onAddExercise,\n}: {\n workout: MybWorkout;\n canEdit: boolean;\n onAddExercise: (workoutId: string) => void;\n}) {\n const meta = WORKOUT_TYPE_META[workout.type];\n const TypeIcon = meta.icon;\n const exercises = useMemo(\n () => [...(workout.exercises ?? [])].sort((a, b) => a.orderIndex - b.orderIndex),\n [workout.exercises]\n );\n\n return (\n <GlassCard treatment=\"glass\" className=\"h-full p-5 transition-shadow hover:shadow-float\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-start gap-3\">\n <IconChip icon={<TypeIcon className=\"h-4 w-4\" />} tint={meta.tint} />\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h3 className=\"font-semibold text-text-primary\">{workout.name}</h3>\n <StatusBadge status={workout.type} />\n </div>\n <div className=\"mt-0.5 flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-text-tertiary\">\n <span>\n Week {formatNumber(workout.weekNumber)} · Day {formatNumber(workout.dayOfWeek)}\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <Clock className=\"h-3.5 w-3.5\" />\n {formatMinutes(workout.durationMin)}\n </span>\n </div>\n </div>\n </div>\n {canEdit && (\n <Button variant=\"outline\" size=\"sm\" onClick={() => onAddExercise(workout.id)}>\n <Plus className=\"mr-1 h-4 w-4\" /> Add exercise\n </Button>\n )}\n </div>\n\n {exercises.length === 0 ? (\n <p className=\"mt-4 rounded-lg border border-dashed border-border-seam px-3 py-4 text-center text-sm text-text-tertiary\">\n No exercises yet — add the first movement to this workout.\n </p>\n ) : (\n <div className=\"mt-4 divide-y divide-border-seam/60\">\n {exercises.map((exercise) => (\n <ExerciseRow key={exercise.id} exercise={exercise} />\n ))}\n </div>\n )}\n </GlassCard>\n );\n}\n\nexport function ProgramDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo, workspaceId } = useMyBodyShield();\n const reduce = useReducedMotion();\n const analytics = useMyBodyShieldAnalytics();\n\n const { data: program, isLoading, isError, refetch } = useMybProgram(id);\n\n const transition = useMybTransitionProgram();\n const archiveM = useMybArchiveProgram();\n const updateProgram = useMybUpdateProgram();\n const addWorkout = useMybAddWorkout();\n const addExercise = useMybAddExercise();\n\n const [actionErr, setActionErr] = useState<string | null>(null);\n\n // Add-workout dialog\n const [workoutOpen, setWorkoutOpen] = useState(false);\n const [workoutForm, setWorkoutForm] = useState<WorkoutForm>(EMPTY_WORKOUT);\n const [workoutErr, setWorkoutErr] = useState<string | null>(null);\n\n // Add-exercise dialog (targets a specific workout)\n const [exerciseTarget, setExerciseTarget] = useState<string | null>(null);\n const [exerciseForm, setExerciseForm] = useState<ExerciseForm>(EMPTY_EXERCISE);\n const [exerciseDemo, setExerciseDemo] = useState<UploadedMybFile | null>(null);\n const [exerciseErr, setExerciseErr] = useState<string | null>(null);\n\n // Edit-program dialog\n const [editOpen, setEditOpen] = useState(false);\n const [editForm, setEditForm] = useState<ProgramEditForm>(EMPTY_EDIT);\n const [editErr, setEditErr] = useState<string | null>(null);\n\n const workouts = useMemo(\n () =>\n [...(program?.workouts ?? [])].sort(\n (a, b) =>\n a.weekNumber - b.weekNumber || a.dayOfWeek - b.dayOfWeek || a.orderIndex - b.orderIndex\n ),\n [program?.workouts]\n );\n\n if (isLoading) {\n return (\n <PageLayout title=\"Program\">\n <LoadingView label=\"Loading program…\" />\n </PageLayout>\n );\n }\n\n if (isError) {\n return (\n <PageLayout title=\"Program\">\n <ErrorView message=\"We couldn't load this program.\" onRetry={() => void refetch()} />\n </PageLayout>\n );\n }\n\n if (!program) {\n return (\n <PageLayout title=\"Program\">\n <EmptyState\n illustration=\"empty-data\"\n icon={<Dumbbell className=\"h-10 w-10\" />}\n title=\"Program not found\"\n description=\"This program may have been deleted or you don't have access to it.\"\n action={\n <Button variant=\"outline\" onClick={() => navigateTo('programs')}>\n <ArrowLeft className=\"mr-1 h-4 w-4\" /> Back to programs\n </Button>\n }\n />\n </PageLayout>\n );\n }\n\n const programId = program.id;\n // You only structure DRAFT/ACTIVE programs — COMPLETED/ARCHIVED are locked.\n const canStructure = program.status === 'DRAFT' || program.status === 'ACTIVE';\n const isActive = program.status === 'ACTIVE';\n const goalMeta = GOAL_TYPE_META[program.goalType];\n const GoalIcon = goalMeta.icon;\n\n const openEdit = () => {\n setEditForm({\n name: program.name,\n description: program.description ?? '',\n goalType: program.goalType,\n level: program.level,\n phase: program.phase,\n weeks: program.weeks ? String(program.weeks) : '',\n daysPerWeek: program.daysPerWeek ? String(program.daysPerWeek) : '',\n startDate: toDateInput(program.startDate),\n endDate: toDateInput(program.endDate),\n });\n setEditErr(null);\n setEditOpen(true);\n analytics.emitIntent('program', 'update', { workspaceId, entityId: programId });\n };\n\n const submitEdit = async () => {\n if (!editForm.name.trim()) {\n setEditErr('Program name is required.');\n return;\n }\n const input: MybUpdateProgramInput = {\n name: editForm.name.trim(),\n description: editForm.description.trim() || null,\n goalType: editForm.goalType,\n level: editForm.level,\n phase: editForm.phase,\n weeks: toNum(editForm.weeks),\n daysPerWeek: toNum(editForm.daysPerWeek),\n startDate: editForm.startDate ? new Date(editForm.startDate).toISOString() : null,\n endDate: editForm.endDate ? new Date(editForm.endDate).toISOString() : null,\n };\n setEditErr(null);\n try {\n await updateProgram.mutateAsync({ id: programId, input });\n analytics.emitFact('program', 'updated', { workspaceId, entityId: programId });\n setEditOpen(false);\n } catch (e) {\n setEditErr(e instanceof Error ? e.message : 'Failed to update program.');\n }\n };\n\n const doTransition = async (status: MybProgramStatus) => {\n setActionErr(null);\n try {\n await transition.mutateAsync({ id: programId, status });\n analytics.emitFact('program', 'status_changed', { workspaceId, entityId: programId });\n } catch (e) {\n setActionErr(e instanceof Error ? e.message : 'Failed to update program status.');\n }\n };\n\n const doArchive = async () => {\n if (!window.confirm('Archive this program? It will be moved out of your active library.')) {\n return;\n }\n setActionErr(null);\n try {\n await archiveM.mutateAsync(programId);\n analytics.emitFact('program', 'archived', { workspaceId, entityId: programId });\n await refetch();\n } catch (e) {\n setActionErr(e instanceof Error ? e.message : 'Failed to archive program.');\n }\n };\n\n const openAddWorkout = () => {\n setWorkoutForm(EMPTY_WORKOUT);\n setWorkoutErr(null);\n setWorkoutOpen(true);\n analytics.emitIntent('workout', 'create', { workspaceId, entityId: programId });\n };\n\n const submitWorkout = async () => {\n if (!workoutForm.name.trim()) {\n setWorkoutErr('Workout name is required.');\n return;\n }\n const input: MybCreateWorkoutInput = {\n programId,\n name: workoutForm.name.trim(),\n type: workoutForm.type,\n weekNumber: toNum(workoutForm.weekNumber),\n dayOfWeek: toNum(workoutForm.dayOfWeek),\n durationMin: toNum(workoutForm.durationMin),\n };\n try {\n const created = await addWorkout.mutateAsync(input);\n analytics.emitFact('workout', 'created', { workspaceId, entityId: created.id });\n setWorkoutOpen(false);\n } catch (e) {\n setWorkoutErr(e instanceof Error ? e.message : 'Failed to add workout.');\n }\n };\n\n const openAddExercise = (workoutId: string) => {\n setExerciseForm(EMPTY_EXERCISE);\n setExerciseDemo(null);\n setExerciseErr(null);\n setExerciseTarget(workoutId);\n analytics.emitIntent('exercise', 'create', { workspaceId, entityId: workoutId });\n };\n\n const submitExercise = async () => {\n if (!exerciseTarget) return;\n if (!exerciseForm.name.trim()) {\n setExerciseErr('Exercise name is required.');\n return;\n }\n const input: MybCreateExerciseInput = {\n workoutId: exerciseTarget,\n name: exerciseForm.name.trim(),\n muscleGroup: exerciseForm.muscleGroup,\n sets: toNum(exerciseForm.sets),\n reps: toNum(exerciseForm.reps),\n targetWeight: toNum(exerciseForm.targetWeight),\n restSeconds: toNum(exerciseForm.restSeconds),\n instructions: exerciseForm.instructions.trim() || null,\n demoFileId: exerciseDemo?.fileId ?? null,\n };\n try {\n const created = await addExercise.mutateAsync(input);\n analytics.emitFact('exercise', 'created', { workspaceId, entityId: created.id });\n setExerciseTarget(null);\n } catch (e) {\n setExerciseErr(e instanceof Error ? e.message : 'Failed to add exercise.');\n }\n };\n\n return (\n <PageLayout\n title={program.name}\n actions={\n <>\n {program.status === 'DRAFT' && (\n <Button onClick={() => void doTransition('ACTIVE')} disabled={transition.isPending}>\n <Play className=\"mr-1 h-4 w-4\" /> Activate\n </Button>\n )}\n {program.status === 'ACTIVE' && (\n <>\n <Button\n onClick={() => void doTransition('COMPLETED')}\n disabled={transition.isPending}\n >\n <CheckCircle2 className=\"mr-1 h-4 w-4\" /> Complete\n </Button>\n <Button variant=\"outline\" onClick={() => navigateTo('train')}>\n <Flame className=\"mr-1 h-4 w-4\" /> Start a session\n </Button>\n </>\n )}\n {program.status !== 'ARCHIVED' && (\n <Button variant=\"outline\" onClick={openEdit} disabled={updateProgram.isPending}>\n <Pencil className=\"mr-1 h-4 w-4\" /> Edit\n </Button>\n )}\n {program.status !== 'ARCHIVED' && (\n <Button\n variant=\"outline\"\n onClick={() => void doArchive()}\n disabled={archiveM.isPending}\n >\n <Archive className=\"mr-1 h-4 w-4\" /> Archive\n </Button>\n )}\n {canStructure && (\n <Button onClick={openAddWorkout}>\n <Plus className=\"mr-1 h-4 w-4\" /> Add workout\n </Button>\n )}\n </>\n }\n >\n <button\n type=\"button\"\n onClick={() => navigateTo('programs')}\n className=\"mb-4 inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> All programs\n </button>\n\n {/* Header card */}\n <motion.div\n initial={reduce ? false : { opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={reduce ? { duration: 0 } : { duration: 0.35, ease: MOTION_EASE }}\n >\n <GlassCard treatment=\"glass\" glow={isActive} className=\"p-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <IconChip\n icon={<GoalIcon className=\"h-5 w-5\" />}\n tint={goalMeta.tint}\n className=\"size-10\"\n />\n <h2 className=\"text-xl font-semibold text-text-primary\">{program.name}</h2>\n <StatusBadge status={program.status} />\n </div>\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n <Chip>Phase · {formatEnumLabel(program.phase)}</Chip>\n <Chip>Level · {formatEnumLabel(program.level)}</Chip>\n <Chip icon={<GoalIcon className=\"h-3.5 w-3.5\" />} tint={goalMeta.tint}>\n {formatEnumLabel(program.goalType)}\n </Chip>\n <Chip icon={<CalendarDays className=\"h-3.5 w-3.5\" />}>\n {formatNumber(program.weeks)} wk × {formatNumber(program.daysPerWeek)} days\n </Chip>\n </div>\n <p className=\"mt-3 inline-flex items-center gap-1.5 text-sm text-text-secondary\">\n <CalendarDays className=\"h-4 w-4 text-text-tertiary\" />\n {formatDate(program.startDate)} – {formatDate(program.endDate)}\n </p>\n {(program.tags ?? []).length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {(program.tags ?? []).map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center rounded-full bg-[var(--color-accent-soft)] px-2 py-0.5 text-xs font-medium text-text-secondary\"\n >\n #{tag}\n </span>\n ))}\n </div>\n )}\n {program.description && (\n <p className=\"mt-3 max-w-2xl text-sm text-text-secondary\">{program.description}</p>\n )}\n </div>\n </div>\n\n {/* Editable platform tags (the inline #tags above are a read-only supplement). */}\n <div className=\"mt-5 border-t border-border-seam pt-4\">\n <MybTags\n entityType=\"mybodyshield-program\"\n entityId={program.id}\n label=\"Platform tags\"\n />\n </div>\n\n {actionErr && (\n <p className=\"mt-4 rounded-lg bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {actionErr}\n </p>\n )}\n </GlassCard>\n </motion.div>\n\n {/* Workouts */}\n <Section\n title=\"Workouts\"\n description=\"Sessions in this block, ordered by week, day & sequence.\"\n >\n {!canStructure && (\n <p className=\"mb-4 inline-flex items-center gap-1.5 rounded-lg border border-border-seam bg-bg-sunken/60 px-3 py-2 text-xs text-text-tertiary\">\n <Lock className=\"h-3.5 w-3.5 shrink-0\" />\n This program is {formatEnumLabel(program.status).toLowerCase()} — its structure is\n locked and can no longer be edited.\n </p>\n )}\n {workouts.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Dumbbell className=\"h-10 w-10\" />}\n title=\"No workouts yet\"\n description={\n canStructure\n ? 'Add workouts to lay out the training week, then attach exercises to each one.'\n : 'This program has no workouts, and its structure is locked in its current status.'\n }\n action={\n canStructure ? (\n <Button onClick={openAddWorkout}>\n <Plus className=\"mr-1 h-4 w-4\" /> Add workout\n </Button>\n ) : undefined\n }\n />\n ) : (\n <motion.div\n className=\"grid grid-cols-1 gap-4 xl:grid-cols-2\"\n variants={reduce ? undefined : STAGGER_CONTAINER}\n initial={reduce ? false : 'hidden'}\n animate=\"show\"\n >\n {workouts.map((workout) => (\n <motion.div\n key={workout.id}\n className=\"h-full\"\n variants={reduce ? undefined : RISE_ITEM}\n >\n <WorkoutCard\n workout={workout}\n canEdit={canStructure}\n onAddExercise={openAddExercise}\n />\n </motion.div>\n ))}\n </motion.div>\n )}\n </Section>\n\n {/* Coach & member notes */}\n <MybDiscussion\n entityType=\"mybodyshield-program\"\n entityId={program.id}\n title=\"Program notes\"\n description=\"Coach and member notes for this training block.\"\n />\n\n {/* Add-workout dialog */}\n <ResponsiveDialog open={workoutOpen} onOpenChange={setWorkoutOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Add workout</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Add a training session to this program. Attach exercises once it's created.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"space-y-4 py-2\">\n {workoutErr && (\n <p className=\"rounded-lg bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {workoutErr}\n </p>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-wk-name\">Name</Label>\n <Input\n id=\"myb-wk-name\"\n value={workoutForm.name}\n onChange={(e) => setWorkoutForm({ ...workoutForm, name: e.target.value })}\n placeholder=\"e.g. Upper Body — Push\"\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-wk-type\">Type</Label>\n <EnumSelect\n id=\"myb-wk-type\"\n value={workoutForm.type}\n onChange={(v) => setWorkoutForm({ ...workoutForm, type: v })}\n options={WORKOUT_TYPES}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-wk-week\">Week</Label>\n <Input\n id=\"myb-wk-week\"\n type=\"number\"\n min={1}\n value={workoutForm.weekNumber}\n onChange={(e) => setWorkoutForm({ ...workoutForm, weekNumber: e.target.value })}\n placeholder=\"1\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-wk-day\">Day</Label>\n <Input\n id=\"myb-wk-day\"\n type=\"number\"\n min={1}\n max={7}\n value={workoutForm.dayOfWeek}\n onChange={(e) => setWorkoutForm({ ...workoutForm, dayOfWeek: e.target.value })}\n placeholder=\"1\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-wk-dur\">Duration (min)</Label>\n <Input\n id=\"myb-wk-dur\"\n type=\"number\"\n min={0}\n value={workoutForm.durationMin}\n onChange={(e) => setWorkoutForm({ ...workoutForm, durationMin: e.target.value })}\n placeholder=\"60\"\n />\n </div>\n </div>\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => setWorkoutOpen(false)}\n disabled={addWorkout.isPending}\n >\n Cancel\n </Button>\n <Button onClick={() => void submitWorkout()} disabled={addWorkout.isPending}>\n {addWorkout.isPending ? 'Adding…' : 'Add workout'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Add-exercise dialog */}\n <ResponsiveDialog\n open={exerciseTarget !== null}\n onOpenChange={(open) => {\n if (!open) setExerciseTarget(null);\n }}\n >\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Add exercise</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Add a movement with its target sets, reps, load & rest.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"space-y-4 py-2\">\n {exerciseErr && (\n <p className=\"rounded-lg bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {exerciseErr}\n </p>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-ex-name\">Name</Label>\n <Input\n id=\"myb-ex-name\"\n value={exerciseForm.name}\n onChange={(e) => setExerciseForm({ ...exerciseForm, name: e.target.value })}\n placeholder=\"e.g. Barbell Bench Press\"\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-ex-muscle\">Muscle group</Label>\n <EnumSelect\n id=\"myb-ex-muscle\"\n value={exerciseForm.muscleGroup}\n onChange={(v) => setExerciseForm({ ...exerciseForm, muscleGroup: v })}\n options={MUSCLE_GROUPS}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-4\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-ex-sets\">Sets</Label>\n <Input\n id=\"myb-ex-sets\"\n type=\"number\"\n min={0}\n value={exerciseForm.sets}\n onChange={(e) => setExerciseForm({ ...exerciseForm, sets: e.target.value })}\n placeholder=\"3\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-ex-reps\">Reps</Label>\n <Input\n id=\"myb-ex-reps\"\n type=\"number\"\n min={0}\n value={exerciseForm.reps}\n onChange={(e) => setExerciseForm({ ...exerciseForm, reps: e.target.value })}\n placeholder=\"10\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-ex-weight\">Weight (kg)</Label>\n <Input\n id=\"myb-ex-weight\"\n type=\"number\"\n min={0}\n step=\"0.5\"\n value={exerciseForm.targetWeight}\n onChange={(e) =>\n setExerciseForm({ ...exerciseForm, targetWeight: e.target.value })\n }\n placeholder=\"60\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-ex-rest\">Rest (sec)</Label>\n <Input\n id=\"myb-ex-rest\"\n type=\"number\"\n min={0}\n value={exerciseForm.restSeconds}\n onChange={(e) =>\n setExerciseForm({ ...exerciseForm, restSeconds: e.target.value })\n }\n placeholder=\"90\"\n />\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-ex-instructions\">Instructions</Label>\n <Textarea\n id=\"myb-ex-instructions\"\n rows={3}\n value={exerciseForm.instructions}\n onChange={(e) => setExerciseForm({ ...exerciseForm, instructions: e.target.value })}\n placeholder=\"Cues, tempo, form notes…\"\n />\n </div>\n\n <EvidenceUpload\n id=\"myb-ex-demo\"\n label=\"Demo media (optional)\"\n value={exerciseDemo}\n onChange={setExerciseDemo}\n accept=\"video/*,image/*\"\n disabled={addExercise.isPending}\n hint=\"Attach a short demo clip or image to show how the movement is performed.\"\n />\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => setExerciseTarget(null)}\n disabled={addExercise.isPending}\n >\n Cancel\n </Button>\n <Button onClick={() => void submitExercise()} disabled={addExercise.isPending}>\n {addExercise.isPending ? 'Adding…' : 'Add exercise'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Edit-program dialog */}\n <ResponsiveDialog open={editOpen} onOpenChange={setEditOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit program</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update this program's plan, goal & schedule. Workouts stay untouched.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"space-y-4 py-2\">\n {editErr && (\n <p className=\"rounded-lg bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {editErr}\n </p>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-name\">Name</Label>\n <Input\n id=\"myb-edit-name\"\n value={editForm.name}\n onChange={(e) => setEditForm({ ...editForm, name: e.target.value })}\n placeholder=\"e.g. Hypertrophy Block A\"\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-desc\">Description</Label>\n <Textarea\n id=\"myb-edit-desc\"\n rows={3}\n value={editForm.description}\n onChange={(e) => setEditForm({ ...editForm, description: e.target.value })}\n placeholder=\"Focus, progression scheme, notes…\"\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-goal\">Goal type</Label>\n <EnumSelect\n id=\"myb-edit-goal\"\n value={editForm.goalType}\n onChange={(v) => setEditForm({ ...editForm, goalType: v })}\n options={GOAL_TYPES}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-level\">Level</Label>\n <EnumSelect\n id=\"myb-edit-level\"\n value={editForm.level}\n onChange={(v) => setEditForm({ ...editForm, level: v })}\n options={LEVELS}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-phase\">Phase</Label>\n <EnumSelect\n id=\"myb-edit-phase\"\n value={editForm.phase}\n onChange={(v) => setEditForm({ ...editForm, phase: v })}\n options={PHASES}\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-weeks\">Weeks</Label>\n <Input\n id=\"myb-edit-weeks\"\n type=\"number\"\n min={1}\n value={editForm.weeks}\n onChange={(e) => setEditForm({ ...editForm, weeks: e.target.value })}\n placeholder=\"8\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-days\">Days / week</Label>\n <Input\n id=\"myb-edit-days\"\n type=\"number\"\n min={1}\n max={7}\n value={editForm.daysPerWeek}\n onChange={(e) => setEditForm({ ...editForm, daysPerWeek: e.target.value })}\n placeholder=\"4\"\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-start\">Start date</Label>\n <Input\n id=\"myb-edit-start\"\n type=\"date\"\n value={editForm.startDate}\n onChange={(e) => setEditForm({ ...editForm, startDate: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-end\">End date</Label>\n <Input\n id=\"myb-edit-end\"\n type=\"date\"\n value={editForm.endDate}\n onChange={(e) => setEditForm({ ...editForm, endDate: e.target.value })}\n />\n </div>\n </div>\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => setEditOpen(false)}\n disabled={updateProgram.isPending}\n >\n Cancel\n </Button>\n <Button onClick={() => void submitEdit()} disabled={updateProgram.isPending}>\n {updateProgram.isPending ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProgramDetailPage.js","names":[],"sources":["../../../../src/mybodyshield/pages/programs/ProgramDetailPage.tsx"],"sourcesContent":["/**\n * Program detail — a single training block with its workouts & exercises.\n * @module mybodyshield/pages/programs\n *\n * Renders one `mybProgram` (with its nested `workouts[].exercises[]`), lifecycle\n * transition controls (activate / complete / archive) and dialogs to add\n * workouts and exercises. All data & mutations hit the real `myb*` contract.\n */\n\nimport { useMemo, useState, type FC, type ReactNode } from 'react';\nimport { motion, useReducedMotion } from 'framer-motion';\nimport { useParams } from 'react-router';\nimport {\n ArrowLeft,\n Plus,\n CheckCircle2,\n Archive,\n Play,\n Dumbbell,\n Pencil,\n Flame,\n Lock,\n Clock,\n CalendarDays,\n} from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectTrigger,\n SelectContent,\n SelectItem,\n SelectValue,\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n StatusBadge,\n EmptyState,\n LoadingView,\n ErrorView,\n Section,\n EvidenceUpload,\n FileLink,\n MybDiscussion,\n MybTags,\n} from '../../components';\nimport { IconChip, WORKOUT_TYPE_META, MUSCLE_META, GOAL_TYPE_META } from '../_shared/visuals';\nimport { useMyBodyShield } from '../../context';\nimport {\n useMybProgram,\n useMybUpdateProgram,\n useMybAddWorkout,\n useMybAddExercise,\n useMybTransitionProgram,\n useMybArchiveProgram,\n useMyBodyShieldAnalytics,\n useTr,\n type UploadedMybFile,\n} from '../../hooks';\nimport {\n formatEnumLabel,\n formatDate,\n formatNumber,\n formatWeight,\n formatDuration,\n formatMinutes,\n} from '../../utils/formatters';\nimport type {\n MybWorkout,\n MybExercise,\n MybWorkoutType,\n MybMuscleGroup,\n MybProgramStatus,\n MybGoalType,\n MybFitnessLevel,\n MybProgramPhase,\n MybCreateWorkoutInput,\n MybCreateExerciseInput,\n MybUpdateProgramInput,\n} from '../../types';\n\nconst WORKOUT_TYPES: readonly MybWorkoutType[] = [\n 'STRENGTH',\n 'CARDIO',\n 'HIIT',\n 'MOBILITY',\n 'YOGA',\n 'RECOVERY',\n];\nconst MUSCLE_GROUPS: readonly MybMuscleGroup[] = [\n 'CHEST',\n 'BACK',\n 'LEGS',\n 'SHOULDERS',\n 'ARMS',\n 'CORE',\n 'FULL_BODY',\n];\n\n/** Parse a numeric text field → number | null (null when blank / invalid). */\nconst toNum = (raw: string): number | null => {\n const t = raw.trim();\n if (t === '') return null;\n const n = Number(t);\n return Number.isFinite(n) ? n : null;\n};\n\n/** Shared entrance easing — a soft, decelerating cubic-bezier. */\nconst MOTION_EASE: [number, number, number, number] = [0.16, 1, 0.3, 1];\n\nconst STAGGER_CONTAINER = {\n hidden: {},\n show: { transition: { staggerChildren: 0.06 } },\n};\nconst RISE_ITEM = {\n hidden: { opacity: 0, y: 12 },\n show: { opacity: 1, y: 0, transition: { duration: 0.35, ease: MOTION_EASE } },\n};\n\nconst Chip: FC<{ children: ReactNode; icon?: ReactNode; tint?: string }> = ({\n children,\n icon,\n tint,\n}) => (\n <span\n className=\"inline-flex items-center gap-1.5 rounded-full bg-bg-sunken px-2.5 py-1 text-xs font-medium text-text-secondary\"\n style={tint ? { color: tint } : undefined}\n >\n {icon}\n {children}\n </span>\n);\n\nconst MuscleChip: FC<{ group: MybMuscleGroup }> = ({ group }) => {\n const tint = MUSCLE_META[group].tint;\n return (\n <span\n className=\"inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium\"\n style={{ backgroundColor: `color-mix(in srgb, ${tint} 16%, transparent)`, color: tint }}\n >\n {formatEnumLabel(group)}\n </span>\n );\n};\n\n/** Token-safe generic enum <Select>. */\nfunction EnumSelect<T extends string>({\n id,\n value,\n onChange,\n options,\n}: {\n id?: string;\n value: T;\n onChange: (value: T) => void;\n options: readonly T[];\n}) {\n return (\n <Select value={value} onValueChange={(v) => onChange(v as T)}>\n <SelectTrigger id={id}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map((opt) => (\n <SelectItem key={opt} value={opt}>\n {formatEnumLabel(opt)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\ninterface WorkoutForm {\n name: string;\n type: MybWorkoutType;\n weekNumber: string;\n dayOfWeek: string;\n durationMin: string;\n}\n\nconst EMPTY_WORKOUT: WorkoutForm = {\n name: '',\n type: 'STRENGTH',\n weekNumber: '1',\n dayOfWeek: '1',\n durationMin: '',\n};\n\ninterface ExerciseForm {\n name: string;\n muscleGroup: MybMuscleGroup;\n sets: string;\n reps: string;\n targetWeight: string;\n restSeconds: string;\n instructions: string;\n}\n\nconst EMPTY_EXERCISE: ExerciseForm = {\n name: '',\n muscleGroup: 'FULL_BODY',\n sets: '',\n reps: '',\n targetWeight: '',\n restSeconds: '',\n instructions: '',\n};\n\nconst GOAL_TYPES: readonly MybGoalType[] = [\n 'WEIGHT_LOSS',\n 'MUSCLE_GAIN',\n 'STRENGTH',\n 'ENDURANCE',\n 'MOBILITY',\n 'GENERAL_FITNESS',\n];\nconst LEVELS: readonly MybFitnessLevel[] = ['BEGINNER', 'INTERMEDIATE', 'ADVANCED', 'ELITE'];\nconst PHASES: readonly MybProgramPhase[] = ['BUILD', 'PEAK', 'DELOAD', 'MAINTENANCE'];\n\ninterface ProgramEditForm {\n name: string;\n description: string;\n goalType: MybGoalType;\n level: MybFitnessLevel;\n phase: MybProgramPhase;\n weeks: string;\n daysPerWeek: string;\n startDate: string;\n endDate: string;\n}\n\nconst EMPTY_EDIT: ProgramEditForm = {\n name: '',\n description: '',\n goalType: 'GENERAL_FITNESS',\n level: 'BEGINNER',\n phase: 'BUILD',\n weeks: '',\n daysPerWeek: '',\n startDate: '',\n endDate: '',\n};\n\n/** ISO datetime → `YYYY-MM-DD` for a native `<input type=\"date\">`. */\nconst toDateInput = (iso: string | null | undefined): string => {\n if (!iso) return '';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return '';\n return d.toISOString().slice(0, 10);\n};\n\nfunction ExerciseRow({ exercise }: { exercise: MybExercise }) {\n const t = useTr();\n const tint = MUSCLE_META[exercise.muscleGroup].tint;\n return (\n <div\n className=\"flex flex-col gap-2 rounded-lg border-l-2 py-3 pl-3 pr-1 transition-colors hover:bg-bg-sunken/40 sm:flex-row sm:items-start sm:justify-between\"\n style={{ borderColor: `color-mix(in srgb, ${tint} 55%, transparent)` }}\n >\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"font-medium text-text-primary\">{exercise.name}</p>\n <MuscleChip group={exercise.muscleGroup} />\n </div>\n {exercise.instructions && (\n <p className=\"mt-1 text-xs text-text-tertiary\">{exercise.instructions}</p>\n )}\n {exercise.demo?.id && (\n <div className=\"mt-1.5\">\n <FileLink fileId={exercise.demo.id} />\n </div>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-4 text-sm tabular-nums text-text-secondary\">\n <span>\n {formatNumber(exercise.sets)}×{formatNumber(exercise.reps)} @{' '}\n {formatWeight(exercise.targetWeight)}\n </span>\n <span className=\"text-text-tertiary\">\n {t('mybodyshield.pages.programDetail.rest', 'Rest')}{' '}\n {formatDuration(exercise.restSeconds)}\n </span>\n </div>\n </div>\n );\n}\n\nfunction WorkoutCard({\n workout,\n canEdit,\n onAddExercise,\n}: {\n workout: MybWorkout;\n canEdit: boolean;\n onAddExercise: (workoutId: string) => void;\n}) {\n const t = useTr();\n const meta = WORKOUT_TYPE_META[workout.type];\n const TypeIcon = meta.icon;\n const exercises = useMemo(\n () => [...(workout.exercises ?? [])].sort((a, b) => a.orderIndex - b.orderIndex),\n [workout.exercises]\n );\n\n return (\n <GlassCard treatment=\"glass\" className=\"h-full p-5 transition-shadow hover:shadow-float\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-start gap-3\">\n <IconChip icon={<TypeIcon className=\"h-4 w-4\" />} tint={meta.tint} />\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h3 className=\"font-semibold text-text-primary\">{workout.name}</h3>\n <StatusBadge status={workout.type} />\n </div>\n <div className=\"mt-0.5 flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-text-tertiary\">\n <span>\n {t('mybodyshield.pages.programDetail.week', 'Week')}{' '}\n {formatNumber(workout.weekNumber)} ·{' '}\n {t('mybodyshield.pages.programDetail.day', 'Day')} {formatNumber(workout.dayOfWeek)}\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <Clock className=\"h-3.5 w-3.5\" />\n {formatMinutes(workout.durationMin)}\n </span>\n </div>\n </div>\n </div>\n {canEdit && (\n <Button variant=\"outline\" size=\"sm\" onClick={() => onAddExercise(workout.id)}>\n <Plus className=\"mr-1 h-4 w-4\" />{' '}\n {t('mybodyshield.pages.programDetail.addExercise', 'Add exercise')}\n </Button>\n )}\n </div>\n\n {exercises.length === 0 ? (\n <p className=\"mt-4 rounded-lg border border-dashed border-border-seam px-3 py-4 text-center text-sm text-text-tertiary\">\n {t(\n 'mybodyshield.pages.programDetail.noExercises',\n 'No exercises yet — add the first movement to this workout.'\n )}\n </p>\n ) : (\n <div className=\"mt-4 divide-y divide-border-seam/60\">\n {exercises.map((exercise) => (\n <ExerciseRow key={exercise.id} exercise={exercise} />\n ))}\n </div>\n )}\n </GlassCard>\n );\n}\n\nexport function ProgramDetailPage() {\n const t = useTr();\n const { id } = useParams<{ id: string }>();\n const { navigateTo, workspaceId } = useMyBodyShield();\n const reduce = useReducedMotion();\n const analytics = useMyBodyShieldAnalytics();\n\n const { data: program, isLoading, isError, refetch } = useMybProgram(id);\n\n const transition = useMybTransitionProgram();\n const archiveM = useMybArchiveProgram();\n const updateProgram = useMybUpdateProgram();\n const addWorkout = useMybAddWorkout();\n const addExercise = useMybAddExercise();\n\n const [actionErr, setActionErr] = useState<string | null>(null);\n\n // Add-workout dialog\n const [workoutOpen, setWorkoutOpen] = useState(false);\n const [workoutForm, setWorkoutForm] = useState<WorkoutForm>(EMPTY_WORKOUT);\n const [workoutErr, setWorkoutErr] = useState<string | null>(null);\n\n // Add-exercise dialog (targets a specific workout)\n const [exerciseTarget, setExerciseTarget] = useState<string | null>(null);\n const [exerciseForm, setExerciseForm] = useState<ExerciseForm>(EMPTY_EXERCISE);\n const [exerciseDemo, setExerciseDemo] = useState<UploadedMybFile | null>(null);\n const [exerciseErr, setExerciseErr] = useState<string | null>(null);\n\n // Edit-program dialog\n const [editOpen, setEditOpen] = useState(false);\n const [editForm, setEditForm] = useState<ProgramEditForm>(EMPTY_EDIT);\n const [editErr, setEditErr] = useState<string | null>(null);\n\n const workouts = useMemo(\n () =>\n [...(program?.workouts ?? [])].sort(\n (a, b) =>\n a.weekNumber - b.weekNumber || a.dayOfWeek - b.dayOfWeek || a.orderIndex - b.orderIndex\n ),\n [program?.workouts]\n );\n\n if (isLoading) {\n return (\n <PageLayout title={t('mybodyshield.pages.programDetail.title', 'Program')}>\n <LoadingView label={t('mybodyshield.pages.programDetail.loading', 'Loading program…')} />\n </PageLayout>\n );\n }\n\n if (isError) {\n return (\n <PageLayout title={t('mybodyshield.pages.programDetail.title', 'Program')}>\n <ErrorView\n message={t('mybodyshield.pages.programDetail.error', \"We couldn't load this program.\")}\n onRetry={() => void refetch()}\n />\n </PageLayout>\n );\n }\n\n if (!program) {\n return (\n <PageLayout title={t('mybodyshield.pages.programDetail.title', 'Program')}>\n <EmptyState\n illustration=\"empty-data\"\n icon={<Dumbbell className=\"h-10 w-10\" />}\n title={t('mybodyshield.pages.programDetail.notFound', 'Program not found')}\n description={t(\n 'mybodyshield.pages.programDetail.notFoundDescription',\n \"This program may have been deleted or you don't have access to it.\"\n )}\n action={\n <Button variant=\"outline\" onClick={() => navigateTo('programs')}>\n <ArrowLeft className=\"mr-1 h-4 w-4\" />{' '}\n {t('mybodyshield.pages.programDetail.backToPrograms', 'Back to programs')}\n </Button>\n }\n />\n </PageLayout>\n );\n }\n\n const programId = program.id;\n // You only structure DRAFT/ACTIVE programs — COMPLETED/ARCHIVED are locked.\n const canStructure = program.status === 'DRAFT' || program.status === 'ACTIVE';\n const isActive = program.status === 'ACTIVE';\n const goalMeta = GOAL_TYPE_META[program.goalType];\n const GoalIcon = goalMeta.icon;\n\n const openEdit = () => {\n setEditForm({\n name: program.name,\n description: program.description ?? '',\n goalType: program.goalType,\n level: program.level,\n phase: program.phase,\n weeks: program.weeks ? String(program.weeks) : '',\n daysPerWeek: program.daysPerWeek ? String(program.daysPerWeek) : '',\n startDate: toDateInput(program.startDate),\n endDate: toDateInput(program.endDate),\n });\n setEditErr(null);\n setEditOpen(true);\n analytics.emitIntent('program', 'update', { workspaceId, entityId: programId });\n };\n\n const submitEdit = async () => {\n if (!editForm.name.trim()) {\n setEditErr(t('mybodyshield.pages.programs.programNameRequired', 'Program name is required.'));\n return;\n }\n const input: MybUpdateProgramInput = {\n name: editForm.name.trim(),\n description: editForm.description.trim() || null,\n goalType: editForm.goalType,\n level: editForm.level,\n phase: editForm.phase,\n weeks: toNum(editForm.weeks),\n daysPerWeek: toNum(editForm.daysPerWeek),\n startDate: editForm.startDate ? new Date(editForm.startDate).toISOString() : null,\n endDate: editForm.endDate ? new Date(editForm.endDate).toISOString() : null,\n };\n setEditErr(null);\n try {\n await updateProgram.mutateAsync({ id: programId, input });\n analytics.emitFact('program', 'updated', { workspaceId, entityId: programId });\n setEditOpen(false);\n } catch (e) {\n setEditErr(\n e instanceof Error\n ? e.message\n : t('mybodyshield.pages.programDetail.failedToUpdate', 'Failed to update program.')\n );\n }\n };\n\n const doTransition = async (status: MybProgramStatus) => {\n setActionErr(null);\n try {\n await transition.mutateAsync({ id: programId, status });\n analytics.emitFact('program', 'status_changed', { workspaceId, entityId: programId });\n } catch (e) {\n setActionErr(\n e instanceof Error\n ? e.message\n : t(\n 'mybodyshield.pages.programDetail.failedToUpdateStatus',\n 'Failed to update program status.'\n )\n );\n }\n };\n\n const doArchive = async () => {\n if (\n !window.confirm(\n t(\n 'mybodyshield.pages.programDetail.archiveConfirm',\n 'Archive this program? It will be moved out of your active library.'\n )\n )\n ) {\n return;\n }\n setActionErr(null);\n try {\n await archiveM.mutateAsync(programId);\n analytics.emitFact('program', 'archived', { workspaceId, entityId: programId });\n await refetch();\n } catch (e) {\n setActionErr(\n e instanceof Error\n ? e.message\n : t('mybodyshield.pages.programDetail.failedToArchive', 'Failed to archive program.')\n );\n }\n };\n\n const openAddWorkout = () => {\n setWorkoutForm(EMPTY_WORKOUT);\n setWorkoutErr(null);\n setWorkoutOpen(true);\n analytics.emitIntent('workout', 'create', { workspaceId, entityId: programId });\n };\n\n const submitWorkout = async () => {\n if (!workoutForm.name.trim()) {\n setWorkoutErr(\n t('mybodyshield.pages.programDetail.workoutNameRequired', 'Workout name is required.')\n );\n return;\n }\n const input: MybCreateWorkoutInput = {\n programId,\n name: workoutForm.name.trim(),\n type: workoutForm.type,\n weekNumber: toNum(workoutForm.weekNumber),\n dayOfWeek: toNum(workoutForm.dayOfWeek),\n durationMin: toNum(workoutForm.durationMin),\n };\n try {\n const created = await addWorkout.mutateAsync(input);\n analytics.emitFact('workout', 'created', { workspaceId, entityId: created.id });\n setWorkoutOpen(false);\n } catch (e) {\n setWorkoutErr(\n e instanceof Error\n ? e.message\n : t('mybodyshield.pages.programDetail.failedToAddWorkout', 'Failed to add workout.')\n );\n }\n };\n\n const openAddExercise = (workoutId: string) => {\n setExerciseForm(EMPTY_EXERCISE);\n setExerciseDemo(null);\n setExerciseErr(null);\n setExerciseTarget(workoutId);\n analytics.emitIntent('exercise', 'create', { workspaceId, entityId: workoutId });\n };\n\n const submitExercise = async () => {\n if (!exerciseTarget) return;\n if (!exerciseForm.name.trim()) {\n setExerciseErr(\n t('mybodyshield.pages.programDetail.exerciseNameRequired', 'Exercise name is required.')\n );\n return;\n }\n const input: MybCreateExerciseInput = {\n workoutId: exerciseTarget,\n name: exerciseForm.name.trim(),\n muscleGroup: exerciseForm.muscleGroup,\n sets: toNum(exerciseForm.sets),\n reps: toNum(exerciseForm.reps),\n targetWeight: toNum(exerciseForm.targetWeight),\n restSeconds: toNum(exerciseForm.restSeconds),\n instructions: exerciseForm.instructions.trim() || null,\n demoFileId: exerciseDemo?.fileId ?? null,\n };\n try {\n const created = await addExercise.mutateAsync(input);\n analytics.emitFact('exercise', 'created', { workspaceId, entityId: created.id });\n setExerciseTarget(null);\n } catch (e) {\n setExerciseErr(\n e instanceof Error\n ? e.message\n : t('mybodyshield.pages.programDetail.failedToAddExercise', 'Failed to add exercise.')\n );\n }\n };\n\n return (\n <PageLayout\n title={program.name}\n actions={\n <>\n {program.status === 'DRAFT' && (\n <Button onClick={() => void doTransition('ACTIVE')} disabled={transition.isPending}>\n <Play className=\"mr-1 h-4 w-4\" />{' '}\n {t('mybodyshield.pages.programDetail.activate', 'Activate')}\n </Button>\n )}\n {program.status === 'ACTIVE' && (\n <>\n <Button\n onClick={() => void doTransition('COMPLETED')}\n disabled={transition.isPending}\n >\n <CheckCircle2 className=\"mr-1 h-4 w-4\" />{' '}\n {t('mybodyshield.pages.programDetail.complete', 'Complete')}\n </Button>\n <Button variant=\"outline\" onClick={() => navigateTo('train')}>\n <Flame className=\"mr-1 h-4 w-4\" />{' '}\n {t('mybodyshield.pages.programDetail.startSession', 'Start a session')}\n </Button>\n </>\n )}\n {program.status !== 'ARCHIVED' && (\n <Button variant=\"outline\" onClick={openEdit} disabled={updateProgram.isPending}>\n <Pencil className=\"mr-1 h-4 w-4\" /> {t('mybodyshield.common.edit', 'Edit')}\n </Button>\n )}\n {program.status !== 'ARCHIVED' && (\n <Button\n variant=\"outline\"\n onClick={() => void doArchive()}\n disabled={archiveM.isPending}\n >\n <Archive className=\"mr-1 h-4 w-4\" />{' '}\n {t('mybodyshield.pages.programDetail.archive', 'Archive')}\n </Button>\n )}\n {canStructure && (\n <Button onClick={openAddWorkout}>\n <Plus className=\"mr-1 h-4 w-4\" />{' '}\n {t('mybodyshield.pages.programDetail.addWorkout', 'Add workout')}\n </Button>\n )}\n </>\n }\n >\n <button\n type=\"button\"\n onClick={() => navigateTo('programs')}\n className=\"mb-4 inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline\"\n >\n <ArrowLeft className=\"h-4 w-4\" />{' '}\n {t('mybodyshield.pages.programDetail.allPrograms', 'All programs')}\n </button>\n\n {/* Header card */}\n <motion.div\n initial={reduce ? false : { opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={reduce ? { duration: 0 } : { duration: 0.35, ease: MOTION_EASE }}\n >\n <GlassCard treatment=\"glass\" glow={isActive} className=\"p-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <IconChip\n icon={<GoalIcon className=\"h-5 w-5\" />}\n tint={goalMeta.tint}\n className=\"size-10\"\n />\n <h2 className=\"text-xl font-semibold text-text-primary\">{program.name}</h2>\n <StatusBadge status={program.status} />\n </div>\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n <Chip>\n {t('mybodyshield.pages.programDetail.phase', 'Phase')} ·{' '}\n {formatEnumLabel(program.phase)}\n </Chip>\n <Chip>\n {t('mybodyshield.pages.programDetail.level', 'Level')} ·{' '}\n {formatEnumLabel(program.level)}\n </Chip>\n <Chip icon={<GoalIcon className=\"h-3.5 w-3.5\" />} tint={goalMeta.tint}>\n {formatEnumLabel(program.goalType)}\n </Chip>\n <Chip icon={<CalendarDays className=\"h-3.5 w-3.5\" />}>\n {formatNumber(program.weeks)}{' '}\n {t(\n program.weeks === 1\n ? 'mybodyshield.pages.programDetail.weekSingular'\n : 'mybodyshield.pages.programDetail.weeks',\n program.weeks === 1 ? 'wk' : 'wks'\n )}{' '}\n × {formatNumber(program.daysPerWeek)}{' '}\n {t(\n program.daysPerWeek === 1\n ? 'mybodyshield.pages.programDetail.daySingular'\n : 'mybodyshield.pages.programDetail.days',\n program.daysPerWeek === 1 ? 'day' : 'days'\n )}\n </Chip>\n </div>\n <p className=\"mt-3 inline-flex items-center gap-1.5 text-sm text-text-secondary\">\n <CalendarDays className=\"h-4 w-4 text-text-tertiary\" />\n {formatDate(program.startDate)} – {formatDate(program.endDate)}\n </p>\n {(program.tags ?? []).length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {(program.tags ?? []).map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center rounded-full bg-[var(--color-accent-soft)] px-2 py-0.5 text-xs font-medium text-text-secondary\"\n >\n {t('mybodyshield.common.tagPrefix', '#{{tag}}', { tag })}\n </span>\n ))}\n </div>\n )}\n {program.description && (\n <p className=\"mt-3 max-w-2xl text-sm text-text-secondary\">{program.description}</p>\n )}\n </div>\n </div>\n\n {/* Editable platform tags (the inline #tags above are a read-only supplement). */}\n <div className=\"mt-5 border-t border-border-seam pt-4\">\n <MybTags\n entityType=\"mybodyshield-program\"\n entityId={program.id}\n label={t('mybodyshield.pages.programDetail.platformTags', 'Platform tags')}\n />\n </div>\n\n {actionErr && (\n <p className=\"mt-4 rounded-lg bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {actionErr}\n </p>\n )}\n </GlassCard>\n </motion.div>\n\n {/* Workouts */}\n <Section\n title={t('mybodyshield.pages.programDetail.workouts', 'Workouts')}\n description={t(\n 'mybodyshield.pages.programDetail.workoutsDescription',\n 'Sessions in this block, ordered by week, day & sequence.'\n )}\n >\n {!canStructure && (\n <p className=\"mb-4 inline-flex items-center gap-1.5 rounded-lg border border-border-seam bg-bg-sunken/60 px-3 py-2 text-xs text-text-tertiary\">\n <Lock className=\"h-3.5 w-3.5 shrink-0\" />\n {t(\n 'mybodyshield.pages.programDetail.lockedDescription',\n 'This program is {{status}} — its structure is locked and can no longer be edited.',\n { status: formatEnumLabel(program.status).toLowerCase() }\n )}\n </p>\n )}\n {workouts.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Dumbbell className=\"h-10 w-10\" />}\n title={t('mybodyshield.pages.programDetail.noWorkouts', 'No workouts yet')}\n description={\n canStructure\n ? t(\n 'mybodyshield.pages.programDetail.noWorkoutsDescription',\n 'Add workouts to lay out the training week, then attach exercises to each one.'\n )\n : t(\n 'mybodyshield.pages.programDetail.noWorkoutsLocked',\n 'This program has no workouts, and its structure is locked in its current status.'\n )\n }\n action={\n canStructure ? (\n <Button onClick={openAddWorkout}>\n <Plus className=\"mr-1 h-4 w-4\" />{' '}\n {t('mybodyshield.pages.programDetail.addWorkout', 'Add workout')}\n </Button>\n ) : undefined\n }\n />\n ) : (\n <motion.div\n className=\"grid grid-cols-1 gap-4 xl:grid-cols-2\"\n variants={reduce ? undefined : STAGGER_CONTAINER}\n initial={reduce ? false : 'hidden'}\n animate=\"show\"\n >\n {workouts.map((workout) => (\n <motion.div\n key={workout.id}\n className=\"h-full\"\n variants={reduce ? undefined : RISE_ITEM}\n >\n <WorkoutCard\n workout={workout}\n canEdit={canStructure}\n onAddExercise={openAddExercise}\n />\n </motion.div>\n ))}\n </motion.div>\n )}\n </Section>\n\n {/* Coach & member notes */}\n <MybDiscussion\n entityType=\"mybodyshield-program\"\n entityId={program.id}\n title={t('mybodyshield.pages.programDetail.programNotes', 'Program notes')}\n description={t(\n 'mybodyshield.pages.programDetail.programNotesDescription',\n 'Coach and member notes for this training block.'\n )}\n />\n\n {/* Add-workout dialog */}\n <ResponsiveDialog open={workoutOpen} onOpenChange={setWorkoutOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>\n {t('mybodyshield.pages.programDetail.addWorkoutDialogTitle', 'Add workout')}\n </ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n {t(\n 'mybodyshield.pages.programDetail.addWorkoutDialogDescription',\n \"Add a training session to this program. Attach exercises once it's created.\"\n )}\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"space-y-4 py-2\">\n {workoutErr && (\n <p className=\"rounded-lg bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {workoutErr}\n </p>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-wk-name\">{t('mybodyshield.common.name', 'Name')}</Label>\n <Input\n id=\"myb-wk-name\"\n value={workoutForm.name}\n onChange={(e) => setWorkoutForm({ ...workoutForm, name: e.target.value })}\n placeholder={t(\n 'mybodyshield.pages.programDetail.workoutNamePlaceholder',\n 'e.g. Upper Body — Push'\n )}\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-wk-type\">{t('mybodyshield.common.type', 'Type')}</Label>\n <EnumSelect\n id=\"myb-wk-type\"\n value={workoutForm.type}\n onChange={(v) => setWorkoutForm({ ...workoutForm, type: v })}\n options={WORKOUT_TYPES}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-wk-week\">\n {t('mybodyshield.pages.programDetail.week', 'Week')}\n </Label>\n <Input\n id=\"myb-wk-week\"\n type=\"number\"\n min={1}\n value={workoutForm.weekNumber}\n onChange={(e) => setWorkoutForm({ ...workoutForm, weekNumber: e.target.value })}\n placeholder=\"1\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-wk-day\">\n {t('mybodyshield.pages.programDetail.day', 'Day')}\n </Label>\n <Input\n id=\"myb-wk-day\"\n type=\"number\"\n min={1}\n max={7}\n value={workoutForm.dayOfWeek}\n onChange={(e) => setWorkoutForm({ ...workoutForm, dayOfWeek: e.target.value })}\n placeholder=\"1\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-wk-dur\">\n {t('mybodyshield.pages.programDetail.durationMin', 'Duration (min)')}\n </Label>\n <Input\n id=\"myb-wk-dur\"\n type=\"number\"\n min={0}\n value={workoutForm.durationMin}\n onChange={(e) => setWorkoutForm({ ...workoutForm, durationMin: e.target.value })}\n placeholder=\"60\"\n />\n </div>\n </div>\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => setWorkoutOpen(false)}\n disabled={addWorkout.isPending}\n >\n {t('mybodyshield.common.cancel', 'Cancel')}\n </Button>\n <Button onClick={() => void submitWorkout()} disabled={addWorkout.isPending}>\n {addWorkout.isPending\n ? t('mybodyshield.common.add', 'Add') + '…'\n : t('mybodyshield.pages.programDetail.addWorkout', 'Add workout')}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Add-exercise dialog */}\n <ResponsiveDialog\n open={exerciseTarget !== null}\n onOpenChange={(open) => {\n if (!open) setExerciseTarget(null);\n }}\n >\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>\n {t('mybodyshield.pages.programDetail.addExerciseDialogTitle', 'Add exercise')}\n </ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n {t(\n 'mybodyshield.pages.programDetail.addExerciseDialogDescription',\n 'Add a movement with its target sets, reps, load & rest.'\n )}\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"space-y-4 py-2\">\n {exerciseErr && (\n <p className=\"rounded-lg bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {exerciseErr}\n </p>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-ex-name\">{t('mybodyshield.common.name', 'Name')}</Label>\n <Input\n id=\"myb-ex-name\"\n value={exerciseForm.name}\n onChange={(e) => setExerciseForm({ ...exerciseForm, name: e.target.value })}\n placeholder={t(\n 'mybodyshield.pages.programDetail.exerciseNamePlaceholder',\n 'e.g. Barbell Bench Press'\n )}\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-ex-muscle\">\n {t('mybodyshield.pages.programDetail.muscleGroup', 'Muscle group')}\n </Label>\n <EnumSelect\n id=\"myb-ex-muscle\"\n value={exerciseForm.muscleGroup}\n onChange={(v) => setExerciseForm({ ...exerciseForm, muscleGroup: v })}\n options={MUSCLE_GROUPS}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-4\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-ex-sets\">\n {t('mybodyshield.pages.programDetail.sets', 'Sets')}\n </Label>\n <Input\n id=\"myb-ex-sets\"\n type=\"number\"\n min={0}\n value={exerciseForm.sets}\n onChange={(e) => setExerciseForm({ ...exerciseForm, sets: e.target.value })}\n placeholder=\"3\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-ex-reps\">\n {t('mybodyshield.pages.programDetail.reps', 'Reps')}\n </Label>\n <Input\n id=\"myb-ex-reps\"\n type=\"number\"\n min={0}\n value={exerciseForm.reps}\n onChange={(e) => setExerciseForm({ ...exerciseForm, reps: e.target.value })}\n placeholder=\"10\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-ex-weight\">\n {t('mybodyshield.pages.programDetail.weightKg', 'Weight (kg)')}\n </Label>\n <Input\n id=\"myb-ex-weight\"\n type=\"number\"\n min={0}\n step=\"0.5\"\n value={exerciseForm.targetWeight}\n onChange={(e) =>\n setExerciseForm({ ...exerciseForm, targetWeight: e.target.value })\n }\n placeholder=\"60\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-ex-rest\">\n {t('mybodyshield.pages.programDetail.restSec', 'Rest (sec)')}\n </Label>\n <Input\n id=\"myb-ex-rest\"\n type=\"number\"\n min={0}\n value={exerciseForm.restSeconds}\n onChange={(e) =>\n setExerciseForm({ ...exerciseForm, restSeconds: e.target.value })\n }\n placeholder=\"90\"\n />\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-ex-instructions\">\n {t('mybodyshield.common.instructions', 'Instructions')}\n </Label>\n <Textarea\n id=\"myb-ex-instructions\"\n rows={3}\n value={exerciseForm.instructions}\n onChange={(e) => setExerciseForm({ ...exerciseForm, instructions: e.target.value })}\n placeholder={t(\n 'mybodyshield.pages.programDetail.instructionsPlaceholder',\n 'Cues, tempo, form notes…'\n )}\n />\n </div>\n\n <EvidenceUpload\n id=\"myb-ex-demo\"\n label={t('mybodyshield.pages.programDetail.demoMedia', 'Demo media (optional)')}\n value={exerciseDemo}\n onChange={setExerciseDemo}\n accept=\"video/*,image/*\"\n disabled={addExercise.isPending}\n hint={t(\n 'mybodyshield.pages.programDetail.demoMediaHint',\n 'Attach a short demo clip or image to show how the movement is performed.'\n )}\n />\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => setExerciseTarget(null)}\n disabled={addExercise.isPending}\n >\n {t('mybodyshield.common.cancel', 'Cancel')}\n </Button>\n <Button onClick={() => void submitExercise()} disabled={addExercise.isPending}>\n {addExercise.isPending\n ? t('mybodyshield.common.add', 'Add') + '…'\n : t('mybodyshield.pages.programDetail.addExercise', 'Add exercise')}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Edit-program dialog */}\n <ResponsiveDialog open={editOpen} onOpenChange={setEditOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>\n {t('mybodyshield.pages.programDetail.editProgram', 'Edit program')}\n </ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n {t(\n 'mybodyshield.pages.programDetail.editProgramDialogDescription',\n \"Update this program's plan, goal & schedule. Workouts stay untouched.\"\n )}\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"space-y-4 py-2\">\n {editErr && (\n <p className=\"rounded-lg bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {editErr}\n </p>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-name\">{t('mybodyshield.common.name', 'Name')}</Label>\n <Input\n id=\"myb-edit-name\"\n value={editForm.name}\n onChange={(e) => setEditForm({ ...editForm, name: e.target.value })}\n placeholder={t(\n 'mybodyshield.pages.programs.programNamePlaceholder',\n 'e.g. Hypertrophy Block A'\n )}\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-desc\">\n {t('mybodyshield.common.description', 'Description')}\n </Label>\n <Textarea\n id=\"myb-edit-desc\"\n rows={3}\n value={editForm.description}\n onChange={(e) => setEditForm({ ...editForm, description: e.target.value })}\n placeholder={t(\n 'mybodyshield.pages.programs.descriptionPlaceholder',\n 'Focus, progression scheme, notes…'\n )}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-goal\">\n {t('mybodyshield.pages.programs.goalType', 'Goal type')}\n </Label>\n <EnumSelect\n id=\"myb-edit-goal\"\n value={editForm.goalType}\n onChange={(v) => setEditForm({ ...editForm, goalType: v })}\n options={GOAL_TYPES}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-level\">{t('mybodyshield.common.level', 'Level')}</Label>\n <EnumSelect\n id=\"myb-edit-level\"\n value={editForm.level}\n onChange={(v) => setEditForm({ ...editForm, level: v })}\n options={LEVELS}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-phase\">{t('mybodyshield.common.phase', 'Phase')}</Label>\n <EnumSelect\n id=\"myb-edit-phase\"\n value={editForm.phase}\n onChange={(v) => setEditForm({ ...editForm, phase: v })}\n options={PHASES}\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-weeks\">\n {t('mybodyshield.pages.programs.weeks', 'Weeks')}\n </Label>\n <Input\n id=\"myb-edit-weeks\"\n type=\"number\"\n min={1}\n value={editForm.weeks}\n onChange={(e) => setEditForm({ ...editForm, weeks: e.target.value })}\n placeholder=\"8\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-days\">\n {t('mybodyshield.pages.programs.daysPerWeek', 'Days / week')}\n </Label>\n <Input\n id=\"myb-edit-days\"\n type=\"number\"\n min={1}\n max={7}\n value={editForm.daysPerWeek}\n onChange={(e) => setEditForm({ ...editForm, daysPerWeek: e.target.value })}\n placeholder=\"4\"\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-start\">\n {t('mybodyshield.pages.programs.startDate', 'Start date')}\n </Label>\n <Input\n id=\"myb-edit-start\"\n type=\"date\"\n value={editForm.startDate}\n onChange={(e) => setEditForm({ ...editForm, startDate: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"myb-edit-end\">\n {t('mybodyshield.pages.programDetail.endDate', 'End date')}\n </Label>\n <Input\n id=\"myb-edit-end\"\n type=\"date\"\n value={editForm.endDate}\n onChange={(e) => setEditForm({ ...editForm, endDate: e.target.value })}\n />\n </div>\n </div>\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => setEditOpen(false)}\n disabled={updateProgram.isPending}\n >\n {t('mybodyshield.common.cancel', 'Cancel')}\n </Button>\n <Button onClick={() => void submitEdit()} disabled={updateProgram.isPending}>\n {updateProgram.isPending\n ? t('mybodyshield.common.saving', 'Saving…')\n : t('mybodyshield.common.save', 'Save')}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProgramsPage.d.ts","sourceRoot":"","sources":["../../../../src/mybodyshield/pages/programs/ProgramsPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"ProgramsPage.d.ts","sourceRoot":"","sources":["../../../../src/mybodyshield/pages/programs/ProgramsPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqPH,wBAAgB,YAAY,gCAkb3B"}
|