Browse Source

feat/add muscle illustration (#2)

* feat(workout-builder): add muscle selection component and integrate it into the workout stepper for enhanced user experience in workout planning
chore(env): update .env.example to include NEXT_PUBLIC_FACEBOOK_PIXEL_ID for better configuration options
style(globals.css): add styles for muscle illustration states to improve visual feedback during muscle selection interactions

* feat: body svg

* feat: body svg 2

* refactor(muscle-selection.tsx): replace hardcoded muscle names with enum values for better maintainability and consistency
style(muscles.module.css): update muscle fill color to use a consistent blue shade for active muscles

* feat(workout-builder): refactor muscle selection logic and add ChestGroup component for better modularity and maintainability

* feat(muscle-selection): add TricepsGroup component and integrate it into MuscleIllustration for better muscle selection UI
chore(muscle-selection): remove unused triceps paths to clean up the code and improve maintainability
feat(abdominals-group): create new AbdominalsGroup component for future muscle selection features

* feat(muscle-selection): add AbdominalsGroup component to enhance muscle selection UI and improve user experience

* feat(workout-builder): add Obliques muscle group component and integrate it into muscle selection UI; update primary color in Tailwind config for better branding consistency

* feat(chest-group.tsx): add SVG path for chest muscle representation to enhance visual feedback in workout builder

* feat(muscle-selection): add QuadricepsGroup component to enhance muscle selection functionality and improve user experience in workout builder

* feat(muscle-selection): add ForearmsGroup component to enhance muscle selection UI and improve user experience in workout builder

* feat(muscle-selection): add BicepsGroup and ShouldersGroup components to enhance muscle selection functionality and improve user experience

* feat(muscle-selection): add CalvesGroup component to enhance muscle selection functionality and improve user experience in workout builder

* feat(muscle-selection): add TrapsGroup component for muscle selection and remove unused trap paths to streamline code and improve maintainability

* feat(workout-builder): add muscle selection groups for back, hamstrings, and glutes; update localization for muscle selection stats

- Introduced new muscle selection components for back, hamstrings, and glutes to enhance the workout builder's functionality.
- Updated localization files to include pluralization for muscle selection stats, improving user experience by providing accurate feedback based on the number of selected muscles.

* feat(locales): update equipment selection translations to support pluralization for better user experience
refactor(workout-builder): simplify equipment and muscle selection display logic in NavigationFooter for improved readability and maintainability
Mat B. 1 month ago
parent
commit
117fff738a

+ 3 - 0
.env.example

@@ -20,6 +20,9 @@ RESEND_API_KEY="re_123456789"
 # Optional: Create an audience in Resend dashboard
 RESEND_AUDIENCE_ID="aud_123456789"
 
+BETTER_AUTH_SECRET=
+BETTER_AUTH_URL=http://localhost:3000
+
 # OpenPanel Integration
 # Get these from your OpenPanel dashboard
 OPENPANEL_SECRET_KEY="op_sk_123456789"

+ 7 - 3
locales/en.ts

@@ -86,8 +86,12 @@ export default {
       complete_workout: "Complete Workout",
     },
     stats: {
-      equipment_selected: "equipment selected",
-      equipment_selected_plural: "equipment selected",
+      "muscle_selected#zero": "0 muscle selected",
+      "muscle_selected#one": "1 muscle selected",
+      "muscle_selected#other": "{count} muscles selected",
+      "equipment_selected#zero": "0 equipment selected",
+      "equipment_selected#one": "1 equipment selected",
+      "equipment_selected#other": "{count} equipments selected",
       selected: "Selected",
       total: "Total",
       equipment_ready: "equipment ready",
@@ -98,7 +102,7 @@ export default {
       select_equipment_description: "Select equipment to unlock personalized workouts",
       clear_all: "Clear all",
       muscle_selection_coming_soon: "Muscle Selection (Coming Soon)",
-      muscle_selection_description: "This step will allow you to select target muscles for your workout.",
+      muscle_selection_description: "Select the muscle(s) you want to train by clicking on them.",
       exercise_selection_coming_soon: "Exercise Selection (Coming Soon)",
       exercise_selection_description: "This step will show you personalized exercise recommendations.",
     },

+ 6 - 2
locales/fr.ts

@@ -86,8 +86,12 @@ export default {
       complete_workout: "Terminer la séance",
     },
     stats: {
-      equipment_selected: "équipement sélectionné",
-      equipment_selected_plural: "équipements sélectionnés",
+      "muscle_selected#zero": "0 muscle sélectionné",
+      "muscle_selected#one": "1 muscle sélectionné",
+      "muscle_selected#other": "{count} muscles sélectionnés",
+      "equipment_selected#zero": "0 équipement sélectionné",
+      "equipment_selected#one": "1 équipement sélectionné",
+      "equipment_selected#other": "{count} équipements sélectionnés",
       selected: "Sélectionné",
       total: "Total",
       equipment_ready: "équipement prêt",

+ 1 - 0
src/features/workout-builder/model/use-workout-stepper.ts

@@ -55,6 +55,7 @@ export function useWorkoutStepper() {
   // Gestion des muscles
   const toggleMuscle = useCallback(
     (muscle: ExerciseAttributeValueEnum) => {
+      console.log("muscle:", muscle);
       setSelectedMuscles((prev) => {
         if (prev.includes(muscle)) {
           return prev.filter((m) => m !== muscle);

+ 1227 - 0
src/features/workout-builder/ui/muscle-selection.tsx

@@ -0,0 +1,1227 @@
+"use client";
+
+import React from "react";
+import { ExerciseAttributeValueEnum } from "@prisma/client";
+
+import { useI18n } from "locales/client";
+import { cn } from "@/shared/lib/utils";
+import { TricepsGroup } from "@/features/workout-builder/ui/muscles/triceps-group";
+import { TrapsGroup } from "@/features/workout-builder/ui/muscles/traps-group";
+import { ShouldersGroup } from "@/features/workout-builder/ui/muscles/shoulders-group";
+import { QuadricepsGroup } from "@/features/workout-builder/ui/muscles/quadriceps-group";
+import { ObliquesGroup } from "@/features/workout-builder/ui/muscles/obliques-group";
+import { HamstringsGroup } from "@/features/workout-builder/ui/muscles/hamstrings-group";
+import { GlutesGroup } from "@/features/workout-builder/ui/muscles/glutes-group";
+import { ForearmsGroup } from "@/features/workout-builder/ui/muscles/forearms-group";
+import { ChestGroup } from "@/features/workout-builder/ui/muscles/chest-group";
+import { CalvesGroup } from "@/features/workout-builder/ui/muscles/calves-group";
+import { BicepsGroup } from "@/features/workout-builder/ui/muscles/biceps-group";
+import { BackGroup } from "@/features/workout-builder/ui/muscles/back-group";
+import { AbdominalsGroup } from "@/features/workout-builder/ui/muscles/abdominals-group";
+
+import styles from "./muscles.module.css";
+
+interface MuscleSelectionProps {
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  selectedMuscles: ExerciseAttributeValueEnum[];
+  selectedEquipment: ExerciseAttributeValueEnum[];
+}
+
+const MuscleIllustration = ({
+  selectedMuscles,
+  onToggleMuscle,
+}: {
+  selectedMuscles: ExerciseAttributeValueEnum[];
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  isLoading?: boolean;
+}) => {
+  const getMuscleClasses = (muscle: ExerciseAttributeValueEnum) => {
+    const isSelected = selectedMuscles.includes(muscle);
+    return cn("cursor-pointer group-hover:fill-primary/80", isSelected ? "fill-primary" : "fill-[#757575]");
+  };
+
+  return (
+    <svg
+      className={styles.illustration}
+      height="5.13333in"
+      id="muscle-illustration"
+      viewBox="0 0 535 462"
+      width="5.94444in"
+      xmlns="http://www.w3.org/2000/svg"
+    >
+      <path
+        d="M 440.43,458.85
+           C 437.78,458.84 435.54,458.42 433.79,457.57
+             433.79,457.57 432.77,457.08 432.77,457.08
+             432.77,457.08 432.29,456.06 432.29,456.06
+             429.18,449.45 429.63,444.89 430.30,439.24
+             429.97,436.78 429.59,433.93 429.27,431.10
+             429.27,431.10 429.25,430.98 429.25,430.98
+             428.99,428.69 428.70,426.16 428.97,423.54
+             428.97,423.54 430.15,416.10 430.15,416.10
+             430.20,415.87 430.23,415.67 430.27,415.49
+             430.34,415.04 430.43,414.58 430.58,414.08
+             430.76,413.50 430.96,412.92 431.15,412.34
+             431.38,411.68 431.61,411.02 431.80,410.35
+             432.46,408.08 432.58,404.08 432.05,401.63
+             431.46,398.91 431.03,396.56 430.61,394.29
+             430.13,391.71 429.68,389.26 429.02,386.31
+             429.02,386.31 427.59,379.94 427.59,379.94
+             427.24,379.48 426.97,379.08 426.82,378.82
+             424.91,375.48 423.82,372.30 423.47,369.10
+             422.88,363.54 423.44,358.04 425.21,352.31
+             425.63,350.94 426.02,349.76 426.38,348.67
+             427.27,345.99 427.90,344.08 428.23,341.57
+             428.23,341.57 424.73,337.14 424.73,337.14
+             421.29,329.16 420.04,324.01 418.59,318.04
+             418.18,316.36 417.75,314.60 417.25,312.68
+             415.13,304.55 413.57,295.76 413.26,290.28
+             412.99,285.26 412.82,279.27 412.65,273.48
+             412.49,267.48 412.31,261.26 412.02,256.13
+             411.96,255.21 412.21,251.29 412.83,242.29
+             413.03,239.31 413.26,235.94 413.27,235.46
+             413.27,235.46 413.26,232.25 413.26,232.25
+             413.24,231.90 413.24,231.59 413.27,231.28
+             413.37,230.35 413.75,229.52 414.31,228.86
+             413.21,227.71 412.25,226.53 411.42,225.28
+             410.59,226.53 409.63,227.71 408.53,228.86
+             409.09,229.51 409.47,230.34 409.56,231.27
+             409.60,231.65 409.59,231.99 409.58,232.24
+             409.58,232.24 409.57,235.54 409.57,235.54
+             409.58,235.94 409.81,239.31 410.01,242.29
+             410.63,251.30 410.88,255.21 410.82,256.13
+             410.53,261.26 410.35,267.48 410.19,273.49
+             410.02,279.28 409.85,285.26 409.58,290.28
+             409.27,295.76 407.71,304.55 405.59,312.68
+             405.09,314.60 404.66,316.36 404.25,318.04
+             402.80,324.01 401.55,329.16 398.11,337.14
+             398.11,337.14 394.61,341.57 394.61,341.57
+             394.94,344.08 395.57,345.99 396.46,348.67
+             396.82,349.76 397.21,350.94 397.63,352.31
+             399.40,358.05 399.96,363.54 399.37,369.10
+             399.02,372.30 397.93,375.47 396.02,378.82
+             395.87,379.08 395.60,379.48 395.25,379.94
+             395.25,379.94 393.82,386.31 393.82,386.31
+             393.16,389.26 392.71,391.71 392.23,394.29
+             391.81,396.56 391.38,398.91 390.79,401.63
+             390.26,404.08 390.38,408.08 391.04,410.35
+             391.24,411.03 391.46,411.69 391.69,412.36
+             391.89,412.93 392.08,413.51 392.26,414.08
+             392.41,414.58 392.50,415.04 392.57,415.49
+             392.60,415.67 392.64,415.87 392.69,416.10
+             392.69,416.10 393.87,423.54 393.87,423.54
+             394.14,426.16 393.85,428.69 393.58,430.98
+             393.58,430.98 393.57,431.10 393.57,431.10
+             393.25,433.93 392.87,436.78 392.54,439.24
+             393.21,444.89 393.66,449.45 390.55,456.06
+             390.55,456.06 390.07,457.08 390.07,457.08
+             390.07,457.08 389.05,457.57 389.05,457.57
+             387.29,458.42 385.06,458.85 382.41,458.85
+             378.89,458.85 372.81,457.91 370.46,455.35
+             369.83,454.66 369.30,453.95 368.80,453.27
+             368.33,452.63 367.89,452.04 367.45,451.58
+             366.24,450.33 364.39,449.83 362.25,449.25
+             359.42,448.48 356.20,447.61 353.69,444.74
+             351.08,441.77 350.35,438.06 351.70,434.56
+             353.12,430.87 356.77,427.74 360.79,426.76
+             361.75,426.53 363.03,426.42 364.82,426.42
+             367.03,426.42 369.59,426.60 371.42,426.74
+             371.42,426.74 371.35,425.99 371.35,425.99
+             371.35,425.92 371.34,425.84 371.32,425.76
+             371.27,425.37 371.19,424.78 371.27,424.10
+             371.33,423.55 371.39,423.01 371.45,422.47
+             371.64,420.71 371.84,418.89 372.19,417.07
+             372.82,413.78 372.65,410.28 371.66,406.05
+             369.54,396.98 367.35,387.61 364.43,378.60
+             364.28,378.13 364.12,377.66 363.96,377.18
+             362.95,374.19 361.81,370.81 361.83,367.13
+             361.83,367.13 361.84,365.60 361.84,365.60
+             361.46,364.54 361.29,363.55 361.22,362.73
+             361.05,360.72 360.98,355.97 361.25,353.51
+             361.58,350.53 362.49,347.56 363.37,344.68
+             363.66,343.75 363.95,342.81 364.22,341.85
+             365.91,335.96 367.31,333.12 369.24,329.19
+             369.38,328.90 369.53,328.60 369.68,328.30
+             369.68,328.30 369.55,327.91 369.55,327.91
+             369.46,327.66 369.36,327.42 369.27,327.17
+             368.97,326.43 368.60,325.50 368.47,324.44
+             368.47,324.44 368.40,323.94 368.40,323.94
+             368.11,321.74 367.81,319.46 367.88,317.11
+             367.94,314.90 368.09,312.70 368.24,310.57
+             368.41,308.11 368.57,305.79 368.60,303.45
+             368.60,303.45 368.60,303.12 368.60,303.12
+             368.60,303.12 366.65,292.27 366.65,292.27
+             366.65,292.27 366.52,291.72 366.52,291.72
+             366.36,290.97 366.19,290.19 366.07,289.37
+             365.69,286.78 365.29,284.19 364.89,281.60
+             363.91,275.26 362.90,268.71 362.23,262.20
+             361.47,254.97 361.31,247.65 361.15,240.57
+             361.15,240.57 361.12,239.63 361.12,239.63
+             361.03,235.34 361.16,230.64 361.54,224.82
+             361.82,220.62 362.42,216.44 362.98,212.89
+             363.33,210.59 364.59,208.94 366.42,208.24
+             366.35,207.37 365.99,201.68 365.99,201.68
+             365.99,201.68 365.94,201.52 365.94,201.52
+             365.76,201.00 365.42,200.05 365.65,198.91
+             365.65,198.91 365.90,197.61 365.90,197.61
+             366.52,194.48 367.17,191.24 367.95,188.06
+             368.59,185.51 369.36,182.87 370.67,180.40
+             369.83,179.41 369.40,178.03 369.65,176.77
+             370.45,172.93 371.22,169.45 372.02,166.13
+             372.37,164.66 373.41,163.58 374.74,163.22
+             373.81,161.21 373.08,159.25 372.44,157.42
+             370.79,152.66 370.06,147.80 369.34,143.11
+             369.17,141.97 368.89,137.01 368.89,137.01
+             368.89,137.01 366.80,141.65 366.18,142.79
+             364.50,145.87 362.77,149.06 360.86,152.17
+             360.20,153.25 359.32,154.18 358.41,155.02
+             358.66,155.60 358.79,156.22 358.77,156.80
+             358.76,157.15 358.76,157.51 358.76,157.87
+             358.77,159.20 358.78,160.70 358.28,162.23
+             357.71,163.99 356.91,165.56 356.12,167.08
+             355.87,167.57 355.62,168.06 355.38,168.55
+             355.11,169.09 354.81,169.63 354.51,170.16
+             354.09,170.90 353.70,171.59 353.50,172.20
+             351.03,179.67 347.88,187.22 344.13,194.63
+             341.73,199.36 339.22,204.13 336.79,208.73
+             335.29,211.59 333.79,214.44 332.30,217.30
+             331.59,218.67 330.61,219.30 329.78,219.59
+             329.78,221.61 329.74,223.64 329.69,225.61
+             329.69,225.61 329.65,227.42 329.65,227.42
+             330.01,230.24 328.97,232.77 328.13,234.81
+             327.99,235.16 327.85,235.50 327.71,235.84
+             326.87,238.00 325.92,240.26 324.35,242.28
+             324.28,242.47 324.20,242.66 324.09,242.86
+             324.09,242.86 323.32,244.31 323.32,244.31
+             322.53,245.81 321.71,247.37 320.83,248.88
+             319.78,250.69 318.78,252.19 317.75,253.49
+             316.77,254.74 315.13,255.19 313.93,255.19
+             313.65,255.19 313.37,255.16 313.10,255.11
+             311.82,257.69 309.89,259.06 307.37,259.20
+             307.27,259.20 307.16,259.21 307.07,259.21
+             305.84,259.21 304.95,258.81 304.34,258.36
+             304.27,258.40 304.21,258.44 304.15,258.47
+             303.50,258.86 302.70,259.07 301.85,259.07
+             301.23,259.07 299.67,258.95 298.52,257.84
+             297.34,256.69 297.07,255.13 296.91,254.20
+             296.79,253.51 296.87,252.90 297.02,252.40
+             296.12,251.80 295.24,250.23 295.19,250.15
+             295.19,250.15 294.82,247.24 294.82,247.24
+             294.97,246.83 295.10,246.45 295.23,246.07
+             295.52,245.19 295.83,244.27 296.29,243.36
+             297.38,241.20 298.53,239.05 299.64,236.96
+             299.64,236.96 300.19,235.94 300.19,235.94
+             299.24,236.16 296.85,236.66 296.85,236.66
+             296.29,236.78 295.74,236.84 295.20,236.84
+             292.96,236.84 290.96,235.81 289.56,233.96
+             289.19,233.47 288.07,232.00 288.56,230.13
+             289.04,228.27 290.68,227.54 291.30,227.27
+             294.10,226.03 296.75,224.86 298.35,222.67
+             298.92,221.88 299.53,221.15 300.11,220.45
+             300.11,220.45 300.65,219.79 300.65,219.79
+             302.63,217.39 305.43,214.40 309.66,212.65
+             310.13,212.45 310.57,212.33 310.95,212.23
+             311.01,211.85 311.12,211.46 311.27,211.04
+             311.86,209.45 312.45,207.85 313.04,206.25
+             314.68,201.80 316.39,197.20 317.97,192.66
+             318.59,190.88 319.08,189.06 319.61,187.14
+             319.91,186.03 321.31,182.33 321.61,181.97
+             321.61,181.97 323.95,178.73 323.95,178.73
+             323.95,178.73 324.73,171.29 324.73,171.29
+             324.89,161.95 329.32,154.48 334.67,146.37
+             334.67,146.37 336.38,144.91 336.38,144.91
+             336.46,140.43 337.28,136.47 338.88,132.80
+             339.06,132.39 339.27,132.01 339.51,131.68
+             339.30,131.26 339.12,130.82 338.98,130.34
+             338.74,129.48 338.51,128.44 338.69,127.29
+             338.77,126.78 338.85,126.27 338.92,125.77
+             339.20,123.89 339.48,121.94 340.11,119.98
+             340.84,117.67 341.82,115.48 342.76,113.35
+             343.01,112.78 343.27,112.20 343.52,111.63
+             343.95,110.63 344.52,109.96 345.12,109.50
+             345.10,109.21 345.10,108.90 345.14,108.57
+             345.22,107.88 345.29,107.19 345.36,106.49
+             345.51,104.90 345.67,103.26 345.97,101.60
+             347.09,95.33 349.20,90.71 352.60,87.09
+             356.99,82.42 362.56,79.00 369.63,76.62
+             370.42,76.35 372.80,75.76 372.80,75.76
+             372.80,75.76 375.20,75.16 375.20,75.16
+             376.28,74.89 377.36,74.60 378.43,74.32
+             379.52,74.02 380.63,73.73 381.75,73.45
+             381.75,73.45 386.64,70.83 386.64,70.83
+             386.87,70.70 387.06,70.61 387.24,70.50
+             387.24,70.50 388.87,69.53 388.87,69.53
+             390.27,68.70 391.72,67.84 393.09,66.96
+             393.88,66.46 394.82,65.55 395.08,63.05
+             395.23,61.62 395.35,60.16 395.46,58.71
+             394.14,57.92 392.38,56.48 392.07,53.83
+             391.95,52.84 391.86,51.86 391.76,50.87
+             391.66,49.76 391.55,48.64 391.41,47.53
+             391.41,47.53 391.29,46.62 391.29,46.62
+             390.27,46.40 389.18,45.89 388.47,44.92
+             387.72,43.91 387.21,42.83 386.76,41.88
+             386.76,41.88 386.66,41.66 386.66,41.66
+             385.89,40.01 385.15,38.36 384.41,36.70
+             384.41,36.70 384.30,36.43 384.30,36.43
+             383.56,34.78 383.81,32.70 384.96,30.88
+             385.90,29.39 387.22,28.42 388.66,28.13
+             388.62,27.18 388.62,26.26 388.66,25.36
+             388.96,17.39 391.51,11.24 396.44,6.58
+             399.81,3.39 404.04,1.45 409.00,0.83
+             409.92,0.72 410.86,0.66 411.79,0.66
+             422.46,0.66 431.53,8.09 433.84,18.74
+             434.48,21.68 434.75,24.76 434.65,28.09
+             434.65,28.09 434.83,28.16 434.83,28.16
+             437.41,28.85 439.72,32.08 439.66,34.39
+             439.66,34.39 439.65,34.86 439.65,34.86
+             439.65,34.86 439.50,35.30 439.50,35.30
+             439.42,35.60 439.30,35.99 439.10,36.41
+             437.99,38.79 436.87,41.16 435.74,43.52
+             435.50,44.07 435.08,45.05 433.99,45.69
+             433.39,46.03 432.81,46.24 432.35,46.40
+             432.27,46.43 432.19,46.46 432.11,46.49
+             432.11,46.49 431.86,48.26 431.86,48.26
+             431.75,49.06 431.67,49.86 431.58,50.66
+             431.45,51.89 431.31,53.16 431.08,54.44
+             430.64,56.91 428.82,58.21 427.53,58.96
+             427.61,60.09 427.69,61.22 427.75,62.35
+             427.84,64.50 428.62,65.92 430.26,66.94
+             431.65,67.81 433.07,68.64 434.49,69.48
+             435.14,69.86 435.79,70.24 436.45,70.63
+             436.45,70.63 440.83,73.29 440.83,73.29
+             442.35,73.68 443.85,74.12 445.31,74.55
+             446.16,74.80 447.00,75.04 447.85,75.28
+             447.85,75.28 450.38,76.00 450.38,76.00
+             450.38,76.00 452.00,76.37 452.73,76.62
+             459.80,79.00 465.37,82.42 469.76,87.09
+             473.16,90.71 475.27,95.33 476.39,101.60
+             476.69,103.26 476.85,104.89 477.00,106.48
+             477.07,107.18 477.26,109.21 477.24,109.50
+             477.84,109.96 478.41,110.63 478.84,111.63
+             479.09,112.21 479.35,112.78 479.61,113.36
+             480.55,115.48 481.52,117.68 482.25,119.98
+             482.88,121.94 483.16,123.88 483.44,125.76
+             483.51,126.27 483.59,126.78 483.67,127.29
+             483.85,128.44 483.62,129.48 483.38,130.33
+             483.24,130.82 483.06,131.26 482.85,131.68
+             483.09,132.02 483.30,132.39 483.48,132.80
+             485.08,136.47 485.90,140.43 485.98,144.91
+             485.98,144.91 487.69,146.37 487.69,146.37
+             493.04,154.48 497.47,161.95 497.63,171.29
+             497.63,171.29 497.66,173.18 497.66,173.18
+             497.66,173.18 498.41,178.75 498.41,178.75
+             498.41,178.75 502.45,186.03 502.75,187.15
+             503.28,189.07 503.77,190.88 504.39,192.66
+             505.98,197.20 507.68,201.81 509.33,206.27
+             509.92,207.86 510.50,209.45 511.09,211.04
+             511.24,211.46 511.35,211.85 511.41,212.23
+             511.79,212.33 512.23,212.45 512.70,212.65
+             516.93,214.40 519.74,217.39 521.71,219.79
+             521.71,219.79 522.25,220.45 522.25,220.45
+             522.84,221.15 523.44,221.88 524.01,222.67
+             525.61,224.86 528.26,226.03 531.06,227.27
+             531.68,227.54 533.32,228.27 533.80,230.13
+             534.29,232.00 533.17,233.47 532.80,233.96
+             531.40,235.81 529.40,236.84 527.16,236.84
+             527.16,236.84 527.16,236.84 527.16,236.84
+             526.62,236.84 526.07,236.78 525.51,236.66
+             525.51,236.66 525.00,236.55 525.00,236.55
+             524.07,236.36 523.13,236.16 522.17,235.94
+             522.17,235.94 522.75,237.02 522.75,237.02
+             523.85,239.08 524.99,241.22 526.07,243.36
+             526.53,244.27 526.84,245.19 527.14,246.08
+             527.27,246.45 527.39,246.84 527.54,247.24
+             527.54,247.24 527.07,250.32 527.02,250.41
+             526.71,250.95 526.24,251.79 525.35,252.40
+             525.49,252.89 525.57,253.49 525.46,254.15
+             525.29,255.12 525.03,256.69 523.83,257.84
+             522.70,258.95 521.13,259.07 520.51,259.07
+             519.66,259.07 518.86,258.86 518.21,258.48
+             518.15,258.44 518.09,258.40 518.02,258.36
+             517.41,258.81 516.52,259.21 515.29,259.21
+             515.20,259.21 515.09,259.20 514.99,259.20
+             512.47,259.06 510.54,257.69 509.26,255.11
+             508.99,255.16 508.71,255.19 508.43,255.19
+             507.23,255.19 505.60,254.74 504.61,253.49
+             503.58,252.19 502.58,250.69 501.53,248.88
+             500.64,247.36 499.82,245.80 499.03,244.29
+             499.03,244.29 498.28,242.87 498.28,242.87
+             498.16,242.66 498.08,242.46 498.01,242.28
+             496.44,240.26 495.49,238.00 494.64,235.84
+             494.51,235.50 494.37,235.16 494.23,234.81
+             493.39,232.77 492.35,230.24 492.71,227.42
+             492.71,227.42 492.67,225.67 492.67,225.67
+             492.63,223.68 492.58,221.63 492.58,219.59
+             491.75,219.30 490.77,218.67 490.06,217.31
+             488.56,214.42 487.05,211.55 485.54,208.68
+             483.12,204.09 480.62,199.34 478.24,194.63
+             474.48,187.22 471.33,179.67 468.86,172.20
+             468.66,171.59 468.27,170.90 467.85,170.16
+             467.55,169.63 467.25,169.09 466.98,168.55
+             466.74,168.06 466.49,167.57 466.24,167.09
+             465.46,165.56 464.65,163.99 464.08,162.23
+             463.59,160.69 463.59,159.20 463.60,157.87
+             463.60,157.51 463.60,157.15 463.59,156.80
+             463.57,156.22 463.70,155.60 463.95,155.02
+             463.04,154.18 462.16,153.25 461.50,152.17
+             459.59,149.05 457.85,145.86 456.17,142.77
+             455.55,141.63 454.23,139.22 454.20,139.15
+             454.20,139.15 453.91,141.76 453.80,142.61
+             452.65,151.14 450.93,157.54 448.25,163.26
+             449.50,163.66 450.48,164.72 450.82,166.13
+             451.62,169.44 452.39,172.92 453.18,176.77
+             453.44,178.02 453.01,179.41 452.17,180.40
+             453.48,182.87 454.25,185.51 454.88,188.06
+             455.67,191.24 456.32,194.48 456.94,197.61
+             456.94,197.61 457.19,198.91 457.19,198.91
+             457.42,200.05 457.08,201.01 456.90,201.52
+             456.90,201.52 456.84,201.69 456.84,201.69
+             456.84,201.69 456.49,207.37 456.42,208.24
+             458.25,208.94 459.51,210.59 459.86,212.89
+             460.42,216.44 461.02,220.63 461.30,224.83
+             461.68,230.64 461.81,235.34 461.72,239.63
+             461.72,239.63 461.69,240.56 461.69,240.56
+             461.53,247.65 461.37,254.97 460.61,262.20
+             459.94,268.71 458.93,275.26 457.95,281.60
+             457.55,284.19 457.15,286.78 456.77,289.37
+             456.65,290.20 456.48,290.97 456.31,291.72
+             456.31,291.72 456.19,292.27 456.19,292.27
+             456.19,292.27 454.24,303.12 454.24,303.12
+             454.24,303.12 454.24,303.44 454.24,303.44
+             454.27,305.80 454.43,308.12 454.60,310.58
+             454.75,312.71 454.90,314.91 454.96,317.11
+             455.03,319.46 454.73,321.73 454.44,323.92
+             454.44,323.92 454.37,324.44 454.37,324.44
+             454.24,325.50 453.87,326.43 453.57,327.17
+             453.47,327.42 453.38,327.66 453.29,327.91
+             453.29,327.91 453.16,328.30 453.16,328.30
+             453.31,328.60 453.45,328.90 453.60,329.19
+             455.53,333.12 456.92,335.96 458.61,341.85
+             458.89,342.81 459.18,343.75 459.47,344.68
+             460.35,347.56 461.26,350.53 461.59,353.51
+             461.86,355.97 461.79,360.73 461.62,362.73
+             461.55,363.55 461.37,364.55 461.00,365.60
+             461.00,365.60 461.01,367.13 461.01,367.13
+             461.03,370.80 459.89,374.18 458.89,377.17
+             458.72,377.65 458.56,378.13 458.41,378.60
+             455.49,387.61 453.29,396.98 451.18,406.05
+             450.19,410.28 450.02,413.78 450.65,417.07
+             451.00,418.89 451.20,420.71 451.39,422.47
+             451.45,423.01 451.51,423.55 451.57,424.09
+             451.65,424.78 451.57,425.37 451.51,425.76
+             451.50,425.84 451.49,425.92 451.49,425.99
+             451.49,425.99 451.42,426.74 451.42,426.74
+             453.25,426.60 455.81,426.42 458.02,426.42
+             459.81,426.42 461.09,426.53 462.05,426.77
+             466.07,427.74 469.72,430.87 471.14,434.56
+             472.48,438.06 471.76,441.77 469.15,444.74
+             466.64,447.61 463.42,448.48 460.59,449.25
+             458.45,449.83 456.60,450.33 455.39,451.58
+             454.95,452.04 454.51,452.63 454.04,453.27
+             453.53,453.95 453.01,454.66 452.38,455.35
+             450.03,457.91 443.94,458.85 440.43,458.85
+             440.43,458.85 440.43,458.85 440.43,458.85
+             440.43,458.85 440.43,458.85 440.43,458.85 Z"
+        fill="#f5f5f5"
+        id="path14"
+        stroke="black"
+        strokeWidth="1"
+      />
+
+      <path
+        d="M 389.54,40.30
+           C 389.99,41.24 390.42,42.20 391.03,43.03
+             391.30,43.39 392.00,43.57 392.50,43.55
+             392.50,43.55 394.11,43.55 394.11,43.55
+             394.27,44.74 394.42,45.94 394.57,47.13
+             394.84,49.23 394.98,51.35 395.23,53.45
+             395.41,54.97 396.50,55.70 397.88,56.40
+             397.97,55.89 398.04,55.52 398.10,55.16
+             398.48,52.88 398.72,50.57 399.25,48.32
+             399.97,45.30 401.03,42.32 403.65,40.38
+             408.17,37.03 413.00,36.85 418.05,39.24
+             420.66,40.48 422.15,42.66 423.07,45.18
+             423.91,47.51 424.36,50.00 424.90,52.44
+             425.17,53.70 425.25,55.00 425.44,56.48
+             426.69,55.79 427.72,55.12 427.95,53.88
+             428.31,51.88 428.42,49.83 428.71,47.81
+             428.91,46.40 429.10,44.98 429.31,43.56
+             429.31,43.56 430.82,43.57 430.82,43.57
+             431.35,43.36 431.91,43.21 432.39,42.93
+             432.62,42.80 432.73,42.43 432.86,42.15
+             433.99,39.80 435.11,37.43 436.22,35.07
+             436.35,34.79 436.41,34.49 436.47,34.30
+             436.50,33.26 434.84,31.27 433.88,31.22
+             433.88,31.22 431.34,30.16 431.34,30.16
+             431.34,30.16 431.34,30.19 431.34,30.19
+             431.62,26.61 431.52,23.03 430.73,19.42
+             428.56,9.44 419.37,2.74 409.39,3.99
+             405.31,4.51 401.65,6.04 398.62,8.90
+             393.87,13.39 392.08,19.15 391.84,25.48
+             391.78,27.17 391.85,28.85 392.01,30.52
+             392.01,30.52 389.55,31.22 389.55,31.22
+             388.06,31.26 386.60,33.77 387.21,35.14
+             387.98,36.86 388.74,38.59 389.54,40.30"
+        fill="#757575"
+        id="path34"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        d="M 386.48,416.75
+           C 384.13,415.88 379.40,417.50 378.57,419.80
+             378.09,421.14 377.53,422.44 376.94,423.74
+             376.94,423.74 376.92,423.73 376.92,423.73
+             375.29,427.30 375.14,427.42 373.23,430.09
+             371.54,429.96 364.14,429.23 361.54,429.86
+             358.67,430.56 355.77,432.86 354.68,435.70
+             353.85,437.86 354.05,440.32 356.08,442.64
+             359.75,446.82 366.01,445.50 369.74,449.37
+             370.85,450.52 371.72,452.01 372.81,453.19
+             374.55,455.09 383.34,456.78 387.67,454.70
+             390.42,448.85 390.02,445.04 389.33,439.21
+             389.71,436.39 390.08,433.57 390.41,430.74
+             390.74,427.81 391.09,424.87 390.37,421.93
+             389.82,419.70 388.93,417.66 386.48,416.75"
+        fill="#757575"
+        id="path52"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        d="M 461.30,429.86
+           C 458.70,429.23 451.30,429.96 449.61,430.09
+             447.70,427.42 447.55,427.30 445.92,423.73
+             445.92,423.73 445.90,423.74 445.90,423.74
+             445.31,422.44 444.75,421.14 444.27,419.80
+             443.44,417.50 438.71,415.88 436.36,416.75
+             433.91,417.66 433.02,419.70 432.47,421.93
+             431.75,424.87 432.10,427.81 432.43,430.74
+             432.76,433.57 433.13,436.39 433.51,439.21
+             432.82,445.04 432.42,448.85 435.17,454.70
+             439.50,456.78 448.29,455.09 450.03,453.19
+             451.12,452.01 451.98,450.52 453.10,449.37
+             456.83,445.50 463.09,446.82 466.76,442.64
+             468.79,440.32 468.99,437.86 468.16,435.70
+             467.07,432.86 464.17,430.56 461.30,429.86"
+        fill="#757575"
+        id="path72"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        d="M 529.77,230.19
+           C 526.63,228.79 523.50,227.38 521.44,224.54
+             520.75,223.60 519.98,222.71 519.24,221.81
+             517.12,219.22 514.71,216.93 511.48,215.59
+             511.01,215.40 510.50,215.30 510.01,215.16
+             510.01,215.16 505.16,214.72 505.16,214.72
+             505.16,214.72 505.17,214.75 505.20,214.80
+             504.43,214.75 503.63,214.85 502.85,215.14
+             500.67,215.97 498.57,217.00 496.48,218.03
+             496.13,218.20 495.77,218.78 495.77,219.18
+             495.76,221.99 495.84,224.80 495.90,227.61
+             495.50,230.06 496.73,232.42 497.62,234.68
+             498.51,236.98 499.40,239.01 500.84,240.70
+             500.93,240.98 500.99,241.19 501.09,241.37
+             502.14,243.35 503.16,245.35 504.28,247.28
+             505.14,248.75 506.06,250.19 507.11,251.52
+             507.41,251.90 508.34,252.11 508.83,251.94
+             509.61,251.68 509.27,250.91 509.01,250.35
+             508.14,248.50 507.14,246.70 506.37,244.81
+             506.25,244.50 506.09,244.21 505.93,243.94
+             506.29,243.72 506.68,243.36 507.10,242.77
+             507.55,243.74 508.03,244.70 508.47,245.68
+             509.64,248.24 510.81,250.80 511.96,253.37
+             512.59,254.78 513.43,255.92 515.16,256.02
+             516.13,256.07 516.63,255.59 516.61,254.47
+             516.54,254.27 516.43,253.90 516.27,253.55
+             514.90,250.53 513.57,247.49 512.13,244.50
+             511.52,243.23 510.83,242.00 510.12,240.78
+             510.35,240.51 510.62,240.23 510.91,239.95
+             511.52,241.10 512.12,242.25 512.70,243.42
+             514.42,246.87 516.06,250.36 517.86,253.77
+             518.27,254.57 519.06,255.27 519.84,255.74
+             520.27,255.99 521.27,255.89 521.62,255.55
+             522.07,255.11 522.20,254.29 522.32,253.62
+             522.37,253.29 522.12,252.88 521.94,252.54
+             519.32,247.38 516.71,242.22 514.06,237.08
+             514.29,236.85 514.49,236.61 514.66,236.38
+             517.06,240.60 519.47,244.81 521.91,249.00
+             522.18,249.45 523.08,249.98 523.41,249.84
+             523.92,249.63 524.19,248.86 524.55,248.34
+             524.06,247.01 523.75,245.85 523.22,244.79
+             521.78,241.93 520.25,239.12 518.75,236.29
+             517.96,234.80 517.17,233.31 516.37,231.83
+             516.34,231.72 516.30,231.60 516.25,231.47
+             516.72,230.53 517.73,230.23 517.73,230.23
+             518.19,230.97 519.03,231.73 519.86,232.00
+             521.91,232.67 524.05,233.10 526.17,233.54
+             527.85,233.90 529.25,233.38 530.26,232.04
+             531.00,231.06 530.90,230.69 529.77,230.19"
+        fill="#757575"
+        id="path76"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        d="M 325.88,218.03
+           C 323.79,217.00 321.69,215.97 319.51,215.14
+             318.73,214.85 317.94,214.75 317.16,214.80
+             317.19,214.75 317.20,214.72 317.20,214.72
+             317.20,214.72 312.35,215.16 312.35,215.16
+             311.86,215.30 311.35,215.40 310.88,215.59
+             307.65,216.93 305.24,219.22 303.12,221.81
+             302.38,222.71 301.61,223.60 300.92,224.54
+             298.86,227.38 295.73,228.79 292.59,230.19
+             291.46,230.69 291.36,231.06 292.10,232.04
+             293.11,233.38 294.52,233.90 296.19,233.54
+             298.31,233.10 300.45,232.67 302.50,232.00
+             303.33,231.73 304.17,230.97 304.63,230.23
+             304.63,230.23 305.64,230.53 306.11,231.47
+             306.06,231.60 306.02,231.72 306.00,231.83
+             305.19,233.31 304.40,234.80 303.61,236.29
+             302.11,239.12 300.58,241.93 299.14,244.79
+             298.61,245.85 298.30,247.01 297.81,248.34
+             298.17,248.86 298.44,249.63 298.95,249.84
+             299.28,249.98 300.18,249.45 300.45,249.00
+             302.90,244.81 305.30,240.60 307.70,236.38
+             307.87,236.61 308.08,236.85 308.30,237.08
+             305.65,242.22 303.04,247.38 300.42,252.54
+             300.25,252.88 299.99,253.29 300.04,253.62
+             300.16,254.29 300.29,255.11 300.74,255.55
+             301.09,255.89 302.09,255.99 302.52,255.74
+             303.30,255.27 304.09,254.57 304.51,253.77
+             306.30,250.36 307.94,246.87 309.66,243.42
+             310.24,242.25 310.84,241.10 311.45,239.95
+             311.74,240.23 312.01,240.51 312.24,240.78
+             311.53,242.00 310.84,243.23 310.23,244.50
+             308.79,247.49 307.46,250.53 306.09,253.55
+             305.93,253.90 305.82,254.27 305.75,254.47
+             305.73,255.59 306.23,256.07 307.20,256.02
+             308.93,255.92 309.77,254.78 310.40,253.37
+             311.55,250.80 312.72,248.24 313.89,245.68
+             314.33,244.70 314.81,243.74 315.26,242.77
+             315.68,243.36 316.07,243.72 316.43,243.94
+             316.27,244.21 316.11,244.50 315.99,244.81
+             315.23,246.70 314.22,248.50 313.35,250.35
+             313.09,250.91 312.75,251.68 313.53,251.94
+             314.02,252.11 314.95,251.90 315.25,251.52
+             316.30,250.19 317.23,248.75 318.08,247.28
+             319.20,245.35 320.22,243.35 321.27,241.37
+             321.37,241.19 321.43,240.98 321.52,240.70
+             322.96,239.01 323.85,236.98 324.75,234.68
+             325.63,232.42 326.86,230.06 326.46,227.61
+             326.52,224.80 326.60,221.99 326.60,219.18
+             326.59,218.78 326.23,218.20 325.88,218.03"
+        fill="#757575"
+        id="path90"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        d="M 163.05,461.45
+           C 158.90,461.45 155.08,459.99 151.36,456.99
+             151.06,456.75 150.77,456.51 150.48,456.27
+             149.03,455.08 147.89,454.14 146.36,453.53
+             145.99,453.39 145.59,453.25 145.18,453.11
+             142.74,452.27 139.05,450.99 138.04,446.97
+             138.04,446.97 136.56,441.10 136.56,441.10
+             136.56,441.10 136.56,441.04 136.56,441.04
+             136.43,440.61 136.30,440.09 136.25,439.49
+             136.05,437.10 135.88,434.69 135.71,432.29
+             135.71,432.29 135.58,430.46 135.58,430.46
+             135.55,430.00 135.55,429.54 135.57,429.10
+             135.57,429.10 135.05,425.79 135.05,425.79
+             135.02,425.61 134.99,425.46 134.96,425.33
+             134.85,424.84 134.70,424.16 134.84,423.34
+             135.01,422.35 135.15,421.36 135.29,420.37
+             135.66,417.75 136.04,415.04 136.87,412.38
+             137.93,408.99 138.14,403.76 137.37,399.93
+             136.36,394.90 135.10,391.41 133.76,387.71
+             132.45,384.07 131.09,380.30 129.97,375.00
+             128.82,369.56 128.75,362.93 129.78,358.12
+             130.39,355.25 130.84,352.69 131.31,349.99
+             131.55,348.61 131.79,347.20 132.07,345.71
+             132.08,345.44 132.09,344.90 132.11,344.22
+             132.30,338.18 132.39,337.65 132.65,336.99
+             132.65,336.99 132.50,337.00 132.50,337.00
+             132.50,337.00 131.56,334.88 131.56,334.88
+             127.35,325.02 124.94,314.33 124.41,303.10
+             124.05,295.50 124.41,288.12 125.49,281.04
+             125.49,281.04 125.38,280.94 125.38,280.94
+             124.57,280.23 124.08,279.32 123.90,278.25
+             123.70,277.05 123.23,275.13 122.77,273.28
+             122.20,270.98 121.62,268.61 121.37,266.92
+             119.41,257.83 119.13,255.58 118.30,248.97
+             118.30,248.97 118.04,246.88 118.04,246.88
+             118.04,246.88 117.91,245.80 117.91,245.80
+             117.05,238.57 116.84,236.85 116.84,232.26
+             116.84,232.26 116.84,231.75 116.84,231.75
+             116.84,229.80 117.00,227.86 117.57,225.52
+             117.57,225.52 113.70,225.61 112.64,225.59
+             113.12,227.17 113.12,229.16 113.12,231.75
+             113.12,231.75 113.12,232.26 113.12,232.26
+             113.12,236.86 112.92,238.58 112.05,245.83
+             112.05,245.83 111.93,246.85 111.93,246.85
+             111.93,246.85 111.66,248.97 111.66,248.97
+             110.83,255.58 110.55,257.83 108.59,266.92
+             108.35,268.61 107.76,270.98 107.19,273.28
+             106.74,275.13 106.26,277.04 106.07,278.25
+             105.89,279.32 105.39,280.23 104.59,280.94
+             104.59,280.94 104.47,281.04 104.47,281.04
+             105.55,288.12 105.92,295.50 105.56,303.10
+             105.02,314.33 102.62,325.02 98.41,334.88
+             98.41,334.88 97.49,337.01 97.49,337.01
+             97.49,337.01 97.32,336.99 97.32,336.99
+             97.58,337.65 97.66,338.19 97.85,344.23
+             97.87,344.90 97.89,345.44 97.90,345.71
+             98.17,347.20 98.42,348.60 98.66,349.98
+             99.13,352.69 99.57,355.24 100.19,358.12
+             101.22,362.93 101.14,369.56 99.99,375.00
+             98.88,380.30 97.52,384.07 96.20,387.72
+             94.87,391.41 93.61,394.90 92.59,399.93
+             91.82,403.76 92.03,408.99 93.09,412.38
+             93.92,415.04 94.31,417.75 94.68,420.37
+             94.82,421.36 94.96,422.35 95.12,423.34
+             95.26,424.16 95.11,424.84 95.01,425.33
+             94.98,425.46 94.94,425.61 94.92,425.79
+             94.92,425.79 94.39,429.10 94.39,429.10
+             94.42,429.54 94.41,430.00 94.38,430.46
+             94.38,430.46 94.25,432.26 94.25,432.26
+             94.09,434.67 93.92,437.09 93.72,439.49
+             93.67,440.09 93.53,440.62 93.41,441.04
+             93.41,441.04 93.40,441.10 93.40,441.10
+             93.40,441.10 91.93,446.97 91.93,446.97
+             90.92,450.99 87.23,452.27 84.78,453.11
+             84.37,453.25 83.98,453.39 83.60,453.53
+             82.07,454.14 80.93,455.08 79.49,456.26
+             79.20,456.50 78.90,456.75 78.60,456.99
+             74.89,459.99 71.06,461.45 66.91,461.45
+             66.91,461.45 66.91,461.45 66.91,461.45
+             62.30,461.45 57.87,459.65 53.36,457.65
+             51.97,457.03 51.03,455.92 50.70,454.54
+             50.07,451.95 51.81,449.36 53.18,447.64
+             55.51,444.70 59.13,441.56 60.10,440.96
+             64.38,438.31 67.08,435.83 70.42,431.46
+             70.42,431.46 70.53,431.31 70.53,431.31
+             70.53,431.31 73.05,428.71 73.05,428.71
+             73.05,428.71 74.82,418.14 74.82,418.14
+             74.89,416.51 75.10,414.93 75.30,413.39
+             75.30,413.39 75.44,412.31 75.44,412.31
+             75.54,411.50 75.96,410.61 76.65,409.95
+             75.30,407.35 74.14,404.74 73.50,402.85
+             70.62,394.24 69.85,389.19 68.69,381.56
+             68.47,380.09 68.23,378.51 67.96,376.80
+             66.68,368.76 67.11,358.60 67.94,351.77
+             68.90,343.90 71.05,336.53 74.36,329.77
+             74.36,329.77 74.34,325.66 74.34,325.66
+             74.33,324.38 74.33,323.13 74.33,321.89
+             74.33,319.17 74.32,316.61 74.26,314.03
+             74.19,311.01 74.09,307.96 73.97,304.93
+             73.97,304.93 65.22,275.79 65.22,275.79
+             64.91,273.62 64.60,271.72 64.32,269.97
+             63.56,265.16 62.95,261.37 62.66,256.01
+             62.43,251.78 63.10,246.73 63.75,241.85
+             64.10,239.27 64.42,236.83 64.62,234.52
+             65.47,224.55 68.64,213.50 71.44,203.75
+             71.44,203.75 71.97,201.87 71.97,201.87
+             72.52,199.97 73.52,197.54 74.00,195.83
+             74.27,194.89 76.33,189.87 76.33,189.87
+             75.47,186.51 75.36,182.81 75.97,178.48
+             76.31,176.06 76.82,173.67 77.31,171.37
+             77.46,170.65 77.61,169.93 77.76,169.21
+             77.90,168.51 78.14,167.94 78.34,167.48
+             78.40,167.35 78.45,167.22 78.50,167.08
+             78.50,167.08 78.62,166.77 78.62,166.77
+             78.62,166.77 77.68,165.62 77.68,165.62
+             76.05,163.64 75.24,161.28 75.19,158.41
+             75.19,158.41 75.19,158.28 75.19,158.28
+             75.19,158.28 74.49,150.88 74.49,150.88
+             74.49,150.88 74.49,150.84 74.49,150.84
+             74.40,149.94 74.29,148.97 74.18,147.99
+             73.93,145.80 73.68,143.53 73.58,141.65
+             73.53,140.56 73.48,139.47 73.46,138.37
+             72.65,140.70 71.62,142.92 70.00,146.33
+             69.53,147.32 68.58,148.85 67.48,150.61
+             67.24,151.00 67.02,151.35 66.86,151.61
+             66.63,151.99 66.35,152.39 66.01,152.77
+             66.22,153.20 66.33,153.58 66.39,153.78
+             67.35,157.36 66.89,161.09 65.06,164.57
+             63.93,166.71 63.47,168.82 62.94,171.26
+             62.55,173.00 62.16,174.80 61.49,176.74
+             59.21,183.31 56.18,190.91 53.24,198.14
+             51.63,202.11 49.70,205.84 47.84,209.46
+             46.07,212.88 44.25,216.42 42.76,220.05
+             42.58,220.47 42.40,220.89 42.22,221.31
+             42.22,221.31 40.97,224.18 40.97,224.18
+             40.97,224.18 40.86,224.15 40.86,224.15
+             42.64,229.65 41.85,233.96 38.26,238.47
+             38.26,238.47 33.71,244.53 33.71,244.53
+             32.23,247.47 30.43,250.80 27.94,253.73
+             27.61,254.13 26.81,255.07 25.42,255.23
+             25.03,255.28 24.64,255.32 24.26,255.32
+             23.95,255.32 23.66,255.29 23.38,255.25
+             23.17,255.69 22.95,256.14 22.72,256.58
+             21.69,258.60 19.72,259.76 17.33,259.76
+             17.33,259.76 17.32,259.76 17.32,259.76
+             16.19,259.76 15.18,259.44 14.41,258.84
+             14.41,258.84 13.65,259.44 13.65,259.44
+             13.65,259.44 12.50,259.44 12.50,259.44
+             10.61,259.44 8.93,258.55 8.00,257.06
+             7.20,255.78 7.04,254.21 7.52,252.75
+             6.04,251.73 5.18,250.30 5.08,248.72
+             4.93,246.18 6.25,244.26 7.21,242.86
+             7.51,242.44 7.78,242.04 7.97,241.70
+             9.20,239.43 10.49,237.15 11.75,234.94
+             11.18,235.07 7.80,235.81 7.80,235.81
+             7.80,235.81 7.22,235.72 7.22,235.72
+             4.47,235.29 2.54,233.97 1.46,231.82
+             0.76,230.40 1.22,228.88 1.38,228.45
+             1.83,227.21 2.66,226.64 3.27,226.38
+             3.27,226.38 4.35,225.91 4.35,225.91
+             5.50,225.41 6.65,224.91 7.81,224.43
+             7.81,224.43 9.93,221.82 9.93,221.82
+             9.93,221.82 11.93,219.82 11.93,219.82
+             13.89,217.86 15.92,215.82 17.99,213.87
+             18.93,212.99 20.04,212.28 21.27,211.75
+             21.27,211.75 22.88,207.80 23.04,207.47
+             27.66,197.87 30.28,188.42 31.05,178.57
+             31.91,167.54 35.39,157.88 41.40,149.86
+             41.68,149.49 42.30,148.65 43.26,148.05
+             41.37,144.72 40.66,140.47 40.83,137.53
+             41.15,132.05 41.68,129.20 44.04,124.12
+             45.49,120.99 47.11,118.63 48.82,116.80
+             48.77,116.56 48.73,116.27 48.74,115.95
+             48.79,114.60 48.81,113.21 48.82,111.82
+             48.87,106.25 48.93,100.49 50.97,95.17
+             52.48,91.27 56.98,86.16 60.29,83.67
+             65.57,79.70 69.80,78.82 76.13,77.85
+             76.39,77.81 76.63,77.78 76.88,77.76
+             76.88,77.76 82.81,75.15 82.81,75.15
+             82.81,75.15 83.88,74.70 83.88,74.70
+             84.50,74.44 85.04,74.22 85.58,73.97
+             88.89,72.43 92.20,70.88 95.50,69.32
+             95.76,69.20 96.08,69.06 96.46,68.95
+             96.54,67.29 96.68,65.65 96.83,64.06
+             96.83,64.06 96.99,62.21 96.99,62.21
+             96.99,62.21 97.76,59.95 97.76,59.95
+             96.26,58.80 95.37,57.09 95.20,55.04
+             95.03,52.88 94.83,50.71 94.62,48.60
+             93.71,48.45 92.89,48.06 92.28,47.48
+             91.45,46.69 90.97,45.75 90.58,44.93
+             89.33,42.29 88.40,40.25 87.54,38.31
+             86.91,36.89 87.08,35.13 88.00,33.49
+             88.87,31.95 90.18,30.85 91.59,30.43
+             91.59,30.43 91.93,30.25 91.93,30.25
+             91.92,29.34 91.94,28.38 91.99,27.36
+             92.19,23.40 93.00,19.71 94.40,16.40
+             96.73,10.90 102.83,5.59 108.57,4.06
+             110.57,3.53 112.62,3.26 114.66,3.26
+             123.91,3.26 131.92,8.60 135.56,17.21
+             136.65,19.78 137.12,22.66 137.38,24.60
+             137.44,25.07 137.44,25.72 137.43,27.45
+             137.42,28.14 137.42,29.20 137.43,30.02
+             137.43,30.02 138.61,30.81 138.61,30.81
+             142.41,33.34 143.15,36.08 141.18,40.27
+             141.09,40.47 140.97,40.80 140.82,41.19
+             139.77,43.96 138.22,48.04 134.99,48.60
+             134.81,50.41 134.64,52.26 134.55,54.06
+             134.41,56.54 133.44,58.60 131.77,60.01
+             131.77,60.01 132.49,61.18 132.49,61.18
+             132.49,61.18 132.56,61.88 132.56,61.88
+             132.63,62.49 132.68,63.08 132.74,63.65
+             132.84,64.79 132.95,65.86 133.10,66.87
+             133.23,67.68 133.26,68.44 133.20,69.17
+             133.33,69.22 133.44,69.27 133.54,69.32
+             136.84,70.88 140.15,72.43 143.46,73.97
+             143.99,74.21 144.54,74.44 145.15,74.70
+             145.15,74.70 146.20,75.14 146.20,75.14
+             146.20,75.14 152.10,77.73 152.10,77.73
+             152.51,77.74 152.95,77.78 153.40,77.85
+             159.74,78.82 163.96,79.70 169.24,83.67
+             172.55,86.16 177.06,91.27 178.56,95.17
+             180.61,100.49 180.66,106.25 180.72,111.81
+             180.73,113.21 180.74,114.60 180.79,115.95
+             180.80,116.27 180.77,116.56 180.72,116.80
+             182.43,118.63 184.04,120.99 185.50,124.12
+             187.85,129.20 188.39,132.05 188.70,137.53
+             188.87,140.47 188.16,144.72 186.28,148.05
+             187.23,148.65 187.86,149.49 188.14,149.86
+             194.14,157.88 197.62,167.54 198.48,178.57
+             199.25,188.42 201.87,197.87 206.49,207.47
+             206.65,207.80 206.87,208.17 207.11,208.56
+             207.24,208.78 207.37,209.00 207.50,209.22
+             207.50,209.22 208.71,211.33 208.71,211.33
+             208.71,211.33 208.26,211.76 208.26,211.76
+             209.47,212.29 210.57,212.99 211.50,213.87
+             213.58,215.82 215.61,217.86 217.57,219.83
+             217.57,219.83 219.57,221.82 219.57,221.82
+             219.57,221.82 221.68,224.43 221.68,224.43
+             222.85,224.92 224.01,225.42 225.17,225.92
+             225.17,225.92 226.24,226.38 226.24,226.38
+             226.84,226.64 227.67,227.21 228.12,228.45
+             228.28,228.88 228.74,230.40 228.04,231.82
+             226.96,233.97 225.03,235.29 222.28,235.72
+             222.28,235.72 221.70,235.81 221.70,235.81
+             221.70,235.81 218.32,235.07 217.75,234.94
+             219.01,237.15 220.30,239.43 221.53,241.70
+             221.72,242.04 221.99,242.44 222.28,242.86
+             223.25,244.26 224.57,246.18 224.42,248.72
+             224.32,250.30 223.46,251.72 221.98,252.75
+             222.46,254.21 222.30,255.78 221.50,257.06
+             220.55,258.57 218.91,259.44 217.00,259.44
+             217.00,259.44 215.82,259.41 215.82,259.41
+             215.82,259.41 215.09,258.84 215.09,258.84
+             214.31,259.44 213.31,259.76 212.18,259.76
+             212.18,259.76 212.16,259.76 212.16,259.76
+             209.78,259.76 207.81,258.60 206.77,256.58
+             206.55,256.14 206.33,255.69 206.12,255.25
+             205.84,255.29 205.54,255.32 205.23,255.32
+             204.86,255.32 204.47,255.28 204.10,255.23
+             202.68,255.07 201.89,254.13 201.59,253.77
+             199.07,250.81 197.27,247.47 195.79,244.53
+             195.79,244.53 191.19,238.40 191.19,238.40
+             187.65,233.96 186.86,229.65 188.64,224.16
+             188.64,224.16 188.57,224.18 188.57,224.18
+             188.57,224.18 187.32,221.31 187.32,221.31
+             187.13,220.89 186.95,220.47 186.77,220.05
+             185.29,216.42 183.46,212.88 181.69,209.46
+             179.83,205.84 177.90,202.11 176.29,198.14
+             173.35,190.91 170.32,183.31 168.05,176.74
+             167.38,174.80 166.98,173.00 166.60,171.26
+             166.06,168.82 165.60,166.71 164.47,164.57
+             162.64,161.10 162.18,157.36 163.15,153.78
+             163.20,153.57 163.32,153.20 163.52,152.77
+             163.19,152.39 162.90,151.99 162.67,151.61
+             162.51,151.35 162.29,150.99 162.05,150.60
+             160.95,148.85 160.01,147.31 159.53,146.33
+             158.01,143.13 157.01,140.98 156.23,138.80
+             156.17,142.13 155.94,145.36 155.56,148.55
+             155.48,149.22 155.36,149.87 155.25,150.53
+             155.25,150.53 155.13,151.24 155.13,151.24
+             155.13,151.24 154.38,159.12 154.38,159.12
+             154.19,161.70 153.37,163.83 151.81,165.77
+             151.81,165.77 150.92,166.88 150.92,166.88
+             150.96,166.95 151.00,167.03 151.03,167.10
+             151.26,167.54 151.49,168.00 151.65,168.59
+             153.51,175.28 154.22,180.87 153.90,186.19
+             153.83,187.46 153.61,188.68 153.30,189.86
+             153.30,189.86 155.22,194.51 156.10,196.53
+             156.92,198.44 157.45,199.98 157.99,201.87
+             157.99,201.87 158.52,203.74 158.52,203.74
+             161.32,213.49 164.49,224.55 165.35,234.52
+             165.54,236.83 165.87,239.27 166.21,241.85
+             166.86,246.73 167.53,251.78 167.30,256.01
+             167.01,261.37 166.41,265.16 165.64,269.96
+             165.36,271.72 164.56,274.38 164.24,276.55
+             164.24,276.55 155.99,304.93 155.99,304.93
+             155.87,307.96 155.77,311.01 155.70,314.03
+             155.64,316.62 155.64,319.19 155.64,321.91
+             155.64,323.14 155.63,324.39 155.63,325.66
+             155.63,325.66 155.61,329.77 155.61,329.77
+             158.92,336.53 161.07,343.89 162.02,351.77
+             162.85,358.60 163.28,368.77 162.01,376.80
+             161.73,378.51 161.49,380.09 161.27,381.56
+             160.11,389.20 159.34,394.24 156.46,402.85
+             155.83,404.74 154.67,407.35 153.31,409.95
+             154.00,410.61 154.42,411.50 154.52,412.30
+             154.52,412.30 154.66,413.39 154.66,413.39
+             154.86,414.92 155.07,416.51 155.14,418.14
+             155.14,418.14 156.91,428.71 156.91,428.71
+             156.91,428.71 159.44,431.31 159.44,431.31
+             159.44,431.31 159.55,431.46 159.55,431.46
+             162.88,435.83 165.58,438.31 169.86,440.96
+             170.83,441.56 174.46,444.71 176.79,447.64
+             178.15,449.36 179.90,451.95 179.27,454.54
+             178.93,455.92 177.99,457.03 176.62,457.64
+             172.09,459.65 167.66,461.45 163.05,461.45
+             163.05,461.45 163.05,461.45 163.05,461.45 Z"
+        fill="#f5f5f5"
+        id="path104"
+        stroke="black"
+        strokeWidth="1"
+      />
+
+      <BicepsGroup getMuscleClasses={getMuscleClasses} onToggleMuscle={onToggleMuscle} />
+      <ForearmsGroup getMuscleClasses={getMuscleClasses} onToggleMuscle={onToggleMuscle} />
+      <ChestGroup getMuscleClasses={getMuscleClasses} onToggleMuscle={onToggleMuscle} />
+      <TricepsGroup getMuscleClasses={getMuscleClasses} onToggleMuscle={onToggleMuscle} />
+      <AbdominalsGroup getMuscleClasses={getMuscleClasses} onToggleMuscle={onToggleMuscle} />
+      <ObliquesGroup getMuscleClasses={getMuscleClasses} onToggleMuscle={onToggleMuscle} />
+      <QuadricepsGroup getMuscleClasses={getMuscleClasses} onToggleMuscle={onToggleMuscle} />
+      <ShouldersGroup getMuscleClasses={getMuscleClasses} onToggleMuscle={onToggleMuscle} />
+      <CalvesGroup getMuscleClasses={getMuscleClasses} onToggleMuscle={onToggleMuscle} />
+      <TrapsGroup getMuscleClasses={getMuscleClasses} onToggleMuscle={onToggleMuscle} />
+      <BackGroup getMuscleClasses={getMuscleClasses} onToggleMuscle={onToggleMuscle} />
+      <HamstringsGroup getMuscleClasses={getMuscleClasses} onToggleMuscle={onToggleMuscle} />
+      <GlutesGroup getMuscleClasses={getMuscleClasses} onToggleMuscle={onToggleMuscle} />
+      <path
+        d="M 104.03,61.80
+           C 103.06,61.49 102.16,60.94 100.91,60.35
+             100.91,60.35 100.05,62.86 100.05,62.86
+             99.87,65.02 99.64,67.18 99.55,69.35
+             99.53,69.99 99.77,70.71 100.08,71.29
+             101.93,74.70 104.16,77.84 106.87,80.60
+             108.32,82.07 110.05,83.30 111.76,84.48
+             112.76,85.17 113.26,84.85 113.30,83.65
+             113.35,82.13 113.38,80.59 113.19,79.09
+             112.70,75.08 111.25,71.36 109.79,67.61
+             108.67,64.75 106.98,62.76 104.03,61.80"
+        fill="#757575"
+        id="path132"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        d="M 116.30,83.66
+           C 116.30,84.79 116.73,85.05 117.64,84.53
+             118.89,83.82 120.25,83.13 121.20,82.09
+             123.48,79.60 125.62,76.96 127.68,74.28
+             129.24,72.28 130.46,70.10 130.03,67.35
+             129.78,65.73 129.67,64.08 129.47,62.21
+             129.47,62.21 128.49,60.62 128.49,60.62
+             126.72,61.24 125.11,61.94 123.59,62.79
+             122.75,63.25 121.75,63.79 121.34,64.56
+             119.17,68.65 117.42,72.93 116.64,77.52
+             116.30,79.53 116.30,81.61 116.30,83.66"
+        fill="#757575"
+        id="path134"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        d="M 109.84,65.48
+           C 111.79,70.01 113.40,74.63 113.80,79.59
+             113.83,79.97 113.93,80.36 114.10,80.69
+             114.24,80.96 114.53,81.15 114.76,81.38
+             114.99,81.15 115.31,80.95 115.42,80.67
+             115.61,80.18 115.72,79.65 115.77,79.12
+             116.19,74.83 117.46,70.78 119.13,66.84
+             119.45,66.09 119.73,65.33 120.03,64.57
+             120.03,64.57 109.53,64.57 109.53,64.57
+             109.63,64.87 109.71,65.19 109.84,65.48"
+        fill="#757575"
+        id="path136"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        d="M 93.39,43.60
+           C 93.66,44.18 93.97,44.80 94.42,45.23
+             94.72,45.51 95.32,45.61 95.75,45.54
+             95.75,45.54 97.45,45.59 97.45,45.59
+             97.75,48.65 98.05,51.72 98.30,54.79
+             98.41,56.17 99.03,57.22 100.21,57.84
+             104.24,59.99 108.93,63.14 113.77,63.15
+             119.09,63.16 124.33,60.64 128.91,58.21
+             130.57,57.33 131.34,55.82 131.45,53.89
+             131.59,51.15 131.89,48.42 132.16,45.69
+             132.16,45.69 133.86,45.49 133.86,45.49
+             136.04,46.22 137.73,40.31 138.37,38.95
+             139.67,36.19 139.40,35.07 136.88,33.39
+             136.88,33.39 134.49,31.79 134.49,31.79
+             134.17,31.57 134.41,25.80 134.30,25.01
+             134.01,22.83 133.56,20.45 132.70,18.42
+             128.77,9.14 118.99,4.50 109.37,7.06
+             104.57,8.34 99.23,12.97 97.26,17.62
+             95.92,20.77 95.26,24.12 95.10,27.51
+             95.02,29.05 95.01,30.57 95.11,32.06
+             95.11,32.06 92.71,33.36 92.71,33.36
+             91.34,33.53 89.84,35.83 90.38,37.06
+             91.35,39.25 92.36,41.43 93.39,43.60"
+        fill="#757575"
+        id="path162"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        d="M 79.71,412.49
+           C 79.61,412.26 79.22,411.99 79.04,412.03
+             78.82,412.09 78.56,412.44 78.53,412.69
+             78.28,414.61 77.99,416.53 77.92,418.46
+             77.92,418.46 75.96,430.18 75.96,430.18
+             75.96,430.18 72.89,433.34 72.89,433.34
+             69.49,437.79 66.53,440.64 61.74,443.60
+             61.22,443.92 57.83,446.78 55.61,449.57
+             53.84,451.81 52.82,454.00 54.62,454.81
+             62.63,458.36 69.13,460.64 76.65,454.58
+             78.57,453.03 80.11,451.57 82.47,450.64
+             84.83,449.71 88.19,449.10 88.91,446.21
+             89.00,445.88 90.33,440.59 90.33,440.59
+             90.33,440.59 90.34,440.44 90.34,440.44
+             90.47,440.04 90.59,439.64 90.62,439.24
+             90.87,436.24 91.07,433.24 91.28,430.24
+             91.44,427.99 90.67,426.17 89.11,424.48
+             85.68,420.73 81.85,417.26 79.71,412.49"
+        fill="#757575"
+        id="path164"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        d="M 168.23,443.60
+           C 163.44,440.64 160.47,437.79 157.08,433.34
+             157.08,433.34 154.01,430.18 154.01,430.18
+             154.01,430.18 152.04,418.46 152.04,418.46
+             151.98,416.53 151.68,414.61 151.44,412.69
+             151.41,412.44 151.14,412.09 150.93,412.03
+             150.74,411.99 150.35,412.26 150.25,412.49
+             148.11,417.26 144.29,420.73 140.85,424.48
+             139.30,426.17 138.53,427.99 138.68,430.24
+             138.89,433.24 139.09,436.24 139.34,439.24
+             139.38,439.64 139.50,440.04 139.63,440.44
+             139.63,440.44 139.64,440.59 139.64,440.59
+             139.64,440.59 140.97,445.88 141.05,446.21
+             141.78,449.10 145.13,449.71 147.50,450.64
+             149.85,451.57 151.40,453.03 153.31,454.58
+             160.83,460.64 167.33,458.36 175.35,454.81
+             177.15,454.00 176.13,451.81 174.35,449.57
+             172.14,446.78 168.74,443.92 168.23,443.60"
+        fill="#757575"
+        id="path190"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        d="M 36.97,219.69
+           C 37.21,215.21 37.71,210.75 38.11,206.27
+             38.17,205.62 38.23,204.98 38.29,204.33
+             38.29,204.33 39.72,196.96 39.72,196.96
+             39.72,196.96 39.72,196.96 39.72,196.96
+             39.84,196.42 39.95,195.88 40.05,195.34
+             40.13,194.89 40.06,194.41 40.06,193.70
+             35.84,199.72 31.79,205.49 27.74,211.25
+             27.74,211.25 24.95,213.94 24.95,213.94
+             23.14,214.20 21.45,214.89 20.12,216.14
+             17.43,218.66 14.85,221.30 12.24,223.91
+             12.24,223.91 9.73,227.00 9.73,227.00
+             9.73,227.00 9.74,227.00 9.74,227.00
+             7.98,227.71 6.24,228.48 4.49,229.23
+             4.26,229.33 4.09,230.13 4.25,230.44
+             4.93,231.80 6.17,232.41 7.70,232.65
+             10.10,232.12 12.54,231.59 14.98,231.02
+             14.98,231.02 17.11,231.85 17.11,231.85
+             17.05,231.95 16.98,232.04 16.91,232.16
+             16.81,232.32 16.72,232.49 16.62,232.65
+             14.64,236.16 12.62,239.64 10.69,243.18
+             9.78,244.87 8.06,246.48 8.18,248.53
+             8.23,249.32 8.84,249.89 9.32,250.22
+             9.54,250.36 10.30,249.82 10.72,249.47
+             11.10,249.17 11.38,248.73 11.64,248.31
+             13.51,245.22 15.38,242.13 17.23,239.03
+             18.08,237.60 18.91,236.15 19.70,234.69
+             19.70,234.69 20.33,235.44 20.33,235.44
+             18.33,238.89 16.31,242.34 14.40,245.84
+             13.05,248.31 11.84,250.85 10.60,253.38
+             9.91,254.81 10.72,256.37 12.58,256.33
+             12.96,256.03 13.84,255.61 14.31,254.92
+             15.18,253.64 15.81,252.19 16.55,250.82
+             18.58,247.03 20.60,243.23 22.65,239.44
+             22.65,239.44 23.34,240.65 23.34,240.65
+             21.85,243.33 20.36,246.02 18.96,248.74
+             17.95,250.70 17.05,252.72 16.17,254.74
+             15.64,255.95 16.11,256.66 17.32,256.66
+             18.49,256.66 19.42,256.21 19.96,255.16
+             20.65,253.81 21.26,252.41 21.93,251.05
+             23.17,248.56 24.41,246.06 25.69,243.60
+             25.69,243.60 26.67,244.66 26.67,244.66
+             26.53,244.89 26.40,245.13 26.29,245.39
+             25.47,247.26 24.42,249.03 23.54,250.88
+             23.38,251.23 23.42,252.03 23.59,252.10
+             24.02,252.28 24.57,252.20 25.07,252.15
+             25.25,252.12 25.43,251.88 25.58,251.71
+             27.87,249.02 29.52,245.94 31.09,242.82
+             31.09,242.82 31.12,242.80 31.12,242.80
+             31.12,242.80 35.83,236.53 35.83,236.53
+             38.95,232.60 39.35,229.23 37.74,224.61
+             37.19,223.07 36.88,221.32 36.97,219.69"
+        fill="#757575"
+        id="path202"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        d="M 225.01,229.23
+           C 223.26,228.48 221.52,227.71 219.76,227.00
+             219.76,227.00 219.76,227.00 219.76,227.00
+             219.76,227.00 217.26,223.91 217.26,223.91
+             214.64,221.30 212.06,218.66 209.38,216.14
+             208.05,214.89 206.36,214.20 204.55,213.94
+             204.55,213.94 201.75,211.25 201.75,211.25
+             197.71,205.49 193.66,199.72 189.44,193.70
+             189.44,194.41 189.37,194.89 189.45,195.34
+             189.55,195.88 189.66,196.42 189.78,196.96
+             189.78,196.96 189.78,196.96 189.78,196.96
+             189.78,196.96 191.21,204.33 191.21,204.33
+             191.27,204.98 191.33,205.62 191.39,206.27
+             191.79,210.75 192.29,215.21 192.53,219.69
+             192.62,221.32 192.30,223.07 191.76,224.61
+             190.14,229.23 190.54,232.60 193.67,236.53
+             193.67,236.53 198.38,242.80 198.38,242.80
+             198.38,242.80 198.41,242.82 198.41,242.82
+             199.98,245.94 201.63,249.02 203.92,251.71
+             204.07,251.88 204.25,252.12 204.43,252.15
+             204.93,252.20 205.48,252.28 205.91,252.10
+             206.08,252.03 206.12,251.23 205.96,250.88
+             205.08,249.03 204.03,247.26 203.21,245.39
+             203.10,245.13 202.97,244.89 202.83,244.66
+             202.83,244.66 203.81,243.60 203.81,243.60
+             205.09,246.06 206.33,248.56 207.56,251.05
+             208.24,252.41 208.84,253.81 209.54,255.16
+             210.07,256.21 211.01,256.66 212.17,256.66
+             213.38,256.66 213.86,255.95 213.33,254.74
+             212.45,252.72 211.54,250.70 210.54,248.74
+             209.14,246.02 207.65,243.33 206.16,240.65
+             206.16,240.65 206.85,239.44 206.85,239.44
+             208.89,243.23 210.92,247.03 212.95,250.82
+             213.68,252.19 214.32,253.64 215.19,254.92
+             215.66,255.61 216.53,256.03 216.92,256.33
+             218.78,256.37 219.59,254.81 218.90,253.38
+             217.66,250.85 216.45,248.31 215.10,245.84
+             213.18,242.34 211.17,238.89 209.17,235.44
+             209.17,235.44 209.80,234.69 209.80,234.69
+             210.59,236.15 211.42,237.60 212.27,239.03
+             214.12,242.13 215.99,245.22 217.86,248.31
+             218.12,248.73 218.40,249.17 218.77,249.47
+             219.20,249.82 219.96,250.36 220.17,250.22
+             220.66,249.89 221.27,249.32 221.32,248.53
+             221.44,246.48 219.72,244.87 218.80,243.18
+             216.88,239.64 214.86,236.16 212.87,232.65
+             212.78,232.49 212.69,232.32 212.59,232.16
+             212.51,232.04 212.45,231.95 212.39,231.85
+             212.39,231.85 214.52,231.02 214.52,231.02
+             216.95,231.59 219.40,232.12 221.80,232.65
+             223.33,232.41 224.57,231.80 225.25,230.44
+             225.40,230.13 225.23,229.33 225.01,229.23"
+        fill="#757575"
+        stroke="black"
+        strokeWidth="0"
+      />
+    </svg>
+  );
+};
+
+export function MuscleSelection({ onToggleMuscle, selectedMuscles }: MuscleSelectionProps) {
+  const t = useI18n();
+
+  return (
+    <div className="space-y-6">
+      <div className="text-center mb-6">
+        <p className="text-slate-600 dark:text-slate-300 text-sm italic">{t("workout_builder.selection.muscle_selection_description")}</p>
+      </div>
+
+      <div className="flex justify-center">
+        <MuscleIllustration onToggleMuscle={onToggleMuscle} selectedMuscles={selectedMuscles} />
+      </div>
+    </div>
+  );
+}

+ 52 - 0
src/features/workout-builder/ui/muscles.module.css

@@ -0,0 +1,52 @@
+.svgContainer {
+  text-align: center;
+  margin: 2em 0;
+  position: relative;
+}
+
+.illustration {
+  width: 100%;
+  height: auto;
+}
+
+.illustration path {
+  position: relative;
+  z-index: 0;
+}
+
+.muscle {
+}
+.muscleContainer {
+  z-index: 1;
+  cursor: pointer;
+}
+
+.muscle.enabled.hover {
+  fill: #69b0ee;
+  cursor: pointer;
+}
+
+.muscle.enabled.active {
+  fill: #228be6 !important;
+}
+
+.muscle.enabled {
+  fill: #bdbdbd;
+}
+
+.loading {
+  fill: #757575;
+  animation: pulse 2s linear infinite;
+}
+
+@keyframes pulse {
+  0% {
+    opacity: 0.5;
+  }
+  50% {
+    opacity: 0.8;
+  }
+  100% {
+    opacity: 0.5;
+  }
+}

+ 221 - 0
src/features/workout-builder/ui/muscles/abdominals-group.tsx

@@ -0,0 +1,221 @@
+import React from "react";
+import { ExerciseAttributeValueEnum } from "@prisma/client";
+
+export const AbdominalsGroup = ({
+  onToggleMuscle,
+  getMuscleClasses,
+}: {
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  getMuscleClasses: (muscle: ExerciseAttributeValueEnum) => string;
+}) => {
+  return (
+    <g className="group cursor-pointer" onClick={() => onToggleMuscle(ExerciseAttributeValueEnum.ABDOMINALS)}>
+      <path
+        className="fill-transparent"
+        d="M 100.75,123.75
+           C 100.75,123.75 97.50,126.50 97.50,126.50
+             97.50,126.50 94.50,140.25 94.50,140.25
+             94.50,140.25 93.00,152.50 93.00,152.50
+             93.00,152.50 93.00,162.25 93.00,162.25
+             93.00,162.25 92.75,172.25 93.00,172.25
+             93.25,172.25 97.00,177.00 97.00,177.00
+             97.00,177.00 95.50,180.75 95.50,180.75
+             95.50,180.75 96.50,193.75 96.50,193.75
+             96.50,193.75 99.00,202.00 99.00,202.00
+             99.00,202.00 103.50,215.75 103.50,215.75
+             103.50,215.75 107.25,220.75 107.25,220.75
+             107.25,220.75 111.75,224.50 111.75,224.50
+             111.75,224.50 119.25,224.75 119.25,224.75
+             119.25,224.75 125.25,217.00 125.25,217.00
+             125.25,217.00 131.25,201.75 131.25,201.75
+             131.25,201.75 134.75,190.50 134.75,190.50
+             134.75,190.50 134.75,179.50 134.75,179.50
+             134.75,179.50 132.25,178.25 132.25,178.25
+             132.25,178.25 135.25,173.00 135.25,173.00
+             135.25,173.00 137.00,166.75 137.00,166.75
+             137.00,166.75 136.75,156.50 136.75,156.50
+             136.75,156.50 135.75,144.50 135.75,144.50
+             135.75,144.50 133.75,133.25 133.75,133.25
+             133.75,133.25 130.00,124.75 130.00,124.75
+             130.00,124.75 122.50,122.00 122.50,122.00
+             122.50,122.00 119.50,122.00 119.50,122.00
+             119.50,122.00 114.50,126.75 114.50,126.75
+             114.50,126.75 109.50,120.75 109.50,120.75
+             109.50,120.75 101.00,124.00 101.00,124.00"
+        data-elem={ExerciseAttributeValueEnum.ABDOMINALS}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      {/* Path 108 */}
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.ABDOMINALS)}
+        d="M 124.01,216.93
+           C 127.66,211.39 129.67,205.22 131.16,198.84
+             132.43,193.41 133.29,187.93 133.58,182.34
+             133.72,179.75 132.62,178.53 130.03,178.85
+             126.10,179.34 122.39,180.62 118.69,181.94
+             117.42,182.39 116.74,183.22 116.55,184.50
+             116.22,186.76 115.74,189.02 115.63,191.29
+             115.32,197.53 115.09,210.03 115.16,210.04
+             115.16,213.81 115.16,217.59 115.17,221.37
+             115.17,222.78 115.33,222.87 116.71,222.46
+             119.83,221.53 122.21,219.67 124.01,216.93"
+        data-elem={ExerciseAttributeValueEnum.ABDOMINALS}
+        id="path108"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      {/* Path 110 */}
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.ABDOMINALS)}
+        d="M 113.13,184.90
+           C 112.97,183.30 112.15,182.24 110.54,181.81
+             109.81,181.62 109.12,181.24 108.39,181.05
+             105.40,180.29 102.42,179.47 99.40,178.88
+             97.20,178.44 95.82,179.76 95.94,181.83
+             96.38,189.12 97.53,196.30 99.59,203.32
+             101.19,208.79 103.25,214.06 106.84,218.62
+             108.73,221.02 111.32,222.00 114.28,222.83
+             114.33,221.88 114.41,221.20 114.40,220.52
+             114.36,212.51 114.42,204.50 114.22,196.50
+             114.12,192.63 113.51,188.77 113.13,184.90"
+        data-elem={ExerciseAttributeValueEnum.ABDOMINALS}
+        id="path110"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      {/* Path 116 */}
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.ABDOMINALS)}
+        d="M 115.63,177.74
+           C 115.65,179.88 116.89,180.73 118.92,180.17
+             122.26,179.25 125.60,178.34 128.98,177.57
+             130.39,177.25 131.45,176.62 132.17,175.41
+             134.28,171.89 135.47,168.07 135.79,163.97
+             135.86,163.06 135.50,162.49 134.76,161.99
+             130.32,159.00 125.40,157.80 120.12,158.01
+             116.78,158.15 116.35,157.92 115.63,162.19
+             115.57,162.52 115.56,162.87 115.56,163.21
+             115.56,165.58 115.56,167.94 115.56,170.30
+             115.58,170.30 115.60,170.30 115.62,170.30
+             115.62,172.78 115.61,175.26 115.63,177.74"
+        data-elem={ExerciseAttributeValueEnum.ABDOMINALS}
+        id="path116"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      {/* Path 118 */}
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.ABDOMINALS)}
+        d="M 100.30,177.50
+           C 103.85,178.35 107.39,179.28 110.91,180.25
+             112.64,180.72 113.82,179.88 113.85,178.06
+             113.94,173.64 114.15,169.23 114.12,164.81
+             114.11,163.05 113.67,161.28 113.32,159.53
+             113.14,158.61 112.41,158.14 111.46,158.15
+             109.11,158.18 106.75,158.06 104.42,158.32
+             100.98,158.71 97.81,160.00 94.91,161.93
+             94.06,162.51 93.60,163.18 93.79,164.24
+             94.25,168.25 95.34,172.06 97.50,175.52
+             98.15,176.56 99.06,177.20 100.30,177.50"
+        data-elem={ExerciseAttributeValueEnum.ABDOMINALS}
+        id="path118"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      {/* Path 120 */}
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.ABDOMINALS)}
+        d="M 115.59,154.23
+           C 115.61,155.82 115.88,156.08 117.49,156.12
+             119.51,156.17 121.53,156.18 123.55,156.17
+             127.52,156.13 131.13,157.28 134.46,159.41
+             134.81,159.64 135.26,159.71 135.67,159.85
+             135.78,159.42 136.04,158.98 135.99,158.57
+             135.62,155.40 135.27,152.22 134.72,149.07
+             134.58,148.21 133.94,147.31 133.28,146.68
+             129.61,143.16 125.13,141.45 120.09,141.14
+             119.44,141.18 118.79,141.18 118.15,141.25
+             116.35,141.43 115.94,141.83 115.65,143.62
+             115.59,143.95 115.56,144.30 115.56,144.64
+             115.56,147.84 115.54,151.03 115.59,154.23"
+        data-elem={ExerciseAttributeValueEnum.ABDOMINALS}
+        id="path120"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      {/* Path 122 */}
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.ABDOMINALS)}
+        d="M 113.79,142.93
+           C 113.63,141.98 113.08,141.52 112.09,141.38
+             106.45,140.63 101.57,142.46 97.19,145.83
+             96.35,146.47 95.51,147.41 95.17,148.38
+             94.00,151.75 93.49,155.26 93.63,158.84
+             93.64,159.19 93.86,159.53 93.98,159.88
+             94.31,159.76 94.69,159.70 94.98,159.51
+             97.35,157.92 99.91,156.76 102.77,156.45
+             104.66,156.24 106.57,156.19 108.47,156.08
+             108.47,156.09 108.47,156.11 108.47,156.13
+             109.84,156.13 111.22,156.13 112.59,156.13
+             113.34,156.13 113.81,155.81 113.89,155.00
+             114.31,150.97 114.46,146.95 113.79,142.93"
+        data-elem={ExerciseAttributeValueEnum.ABDOMINALS}
+        id="path122"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      {/* Path 124 */}
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.ABDOMINALS)}
+        d="M 115.58,129.73
+           C 115.56,132.16 115.55,134.60 115.56,137.04
+             115.56,137.96 116.07,138.54 116.95,138.74
+             117.51,138.87 118.08,138.94 118.64,138.99
+             123.82,139.50 128.74,140.85 133.25,143.52
+             133.57,143.71 133.91,143.86 134.58,144.21
+             134.58,143.38 134.68,142.85 134.57,142.37
+             133.61,138.14 132.63,133.92 131.61,129.71
+             131.16,127.83 130.08,126.36 128.32,125.55
+             126.04,124.51 123.71,123.59 121.40,122.62
+             120.53,122.26 119.80,122.52 119.30,123.26
+             118.12,125.03 116.97,126.83 115.85,128.63
+             115.66,128.94 115.59,129.36 115.58,129.73"
+        data-elem={ExerciseAttributeValueEnum.ABDOMINALS}
+        id="path124"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      {/* Path 126 */}
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.ABDOMINALS)}
+        d="M 113.76,128.72
+           C 112.63,126.83 111.41,124.99 110.18,123.16
+             109.73,122.48 109.05,122.30 108.26,122.60
+             106.58,123.22 104.88,123.78 103.23,124.46
+             100.23,125.70 98.19,127.72 97.53,131.07
+             96.82,134.65 95.87,138.19 95.08,141.76
+             94.93,142.43 95.06,143.16 95.06,143.96
+             95.38,143.93 95.50,143.94 95.60,143.90
+             95.87,143.77 96.14,143.62 96.40,143.47
+             99.73,141.54 103.25,140.17 107.06,139.57
+             108.79,139.30 110.53,139.08 112.26,138.76
+             113.68,138.50 114.03,138.01 114.04,136.57
+             114.04,134.51 114.05,132.45 114.03,130.39
+             114.02,129.83 114.03,129.18 113.76,128.72"
+        data-elem={ExerciseAttributeValueEnum.ABDOMINALS}
+        id="path126"
+        stroke="black"
+        strokeWidth="0"
+      />
+    </g>
+  );
+};

+ 327 - 0
src/features/workout-builder/ui/muscles/back-group.tsx

@@ -0,0 +1,327 @@
+import { ExerciseAttributeValueEnum } from "@prisma/client";
+
+export const BackGroup = ({
+  onToggleMuscle,
+  getMuscleClasses,
+}: {
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  getMuscleClasses: (muscle: ExerciseAttributeValueEnum) => string;
+}) => {
+  return (
+    <g className="group cursor-pointer" onClick={() => onToggleMuscle(ExerciseAttributeValueEnum.BACK)}>
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.BACK)}
+        d="M 392.64,149.10
+           C 392.27,149.18 392.12,149.19 391.99,149.25
+             389.72,150.24 387.35,150.69 384.89,150.56
+             382.22,150.41 379.57,149.93 377.87,147.62
+             376.09,145.22 374.53,142.65 372.91,140.13
+             372.62,139.66 372.48,139.10 372.27,138.58
+             372.18,138.60 372.08,138.62 371.99,138.64
+             371.98,138.82 371.93,139.01 371.96,139.19
+             372.90,144.96 373.51,150.78 375.45,156.38
+             376.89,160.53 378.59,164.50 381.25,168.00
+             382.04,169.04 382.99,169.97 383.98,170.82
+             385.11,171.81 385.47,171.64 385.74,170.20
+             385.76,170.09 385.77,169.97 385.79,169.86
+             386.85,164.12 388.32,158.50 390.74,153.17
+             391.33,151.86 391.95,150.56 392.64,149.10"
+        data-elem={ExerciseAttributeValueEnum.BACK}
+        id="path30"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.BACK)}
+        d="M 451.05,138.61
+           C 450.93,138.58 450.82,138.55 450.71,138.52
+             450.53,138.88 450.38,139.24 450.18,139.59
+             449.02,141.63 447.96,143.74 446.65,145.68
+             445.30,147.67 443.64,149.45 441.18,150.09
+             437.83,150.96 434.53,150.71 431.32,149.38
+             431.04,149.26 430.74,149.20 430.17,149.02
+             434.12,156.19 436.09,163.69 437.56,171.73
+             438.40,171.16 439.01,170.83 439.51,170.39
+             441.99,168.16 443.69,165.37 445.13,162.40
+             448.22,156.01 449.70,149.17 450.64,142.19
+             450.80,141.00 450.91,139.80 451.05,138.61"
+        data-elem={ExerciseAttributeValueEnum.BACK}
+        id="path28"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.BACK)}
+        d="M 403.69,137.15
+           C 405.75,134.61 405.91,133.56 404.16,130.82
+             401.53,126.69 398.77,122.65 396.09,118.55
+             396.09,118.55 394.01,115.00 394.01,115.00
+             394.01,115.00 393.84,114.97 393.84,114.97
+             393.73,114.71 393.57,114.43 393.34,114.11
+             392.00,112.22 390.57,110.40 389.33,108.45
+             386.85,104.57 385.39,100.28 384.61,95.75
+             384.32,94.04 383.40,93.64 381.89,94.51
+             381.26,94.88 380.66,95.31 380.09,95.76
+             375.26,99.63 372.19,104.64 370.49,110.55
+             370.35,111.05 370.27,111.45 370.24,111.80
+             370.24,111.80 370.24,111.80 370.24,111.80
+             370.24,111.80 370.05,116.31 370.05,116.31
+             369.93,118.08 369.84,119.85 369.73,121.63
+             369.82,123.32 369.87,125.01 370.02,126.70
+             370.53,132.63 372.41,138.07 375.97,142.87
+             378.15,145.81 381.03,147.83 384.60,148.72
+             388.07,149.59 391.14,148.39 393.98,146.49
+             397.77,143.96 400.84,140.67 403.69,137.15"
+        data-elem={ExerciseAttributeValueEnum.BACK}
+        id="path26"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.BACK)}
+        d="M 452.92,116.24
+           C 452.92,116.24 452.75,111.80 452.75,111.80
+             452.75,111.80 452.74,111.80 452.74,111.80
+             452.71,111.52 452.65,111.21 452.55,110.84
+             452.25,109.81 451.90,108.79 451.53,107.77
+             449.58,102.43 446.27,98.13 441.63,94.86
+             439.64,93.45 438.68,93.88 438.25,96.24
+             437.60,99.79 436.62,103.26 434.81,106.37
+             433.22,109.09 431.31,111.63 429.54,114.24
+             429.54,114.24 426.99,118.41 426.99,118.41
+             424.12,122.80 421.24,127.18 418.38,131.58
+             417.40,133.09 417.39,134.61 418.48,136.10
+             421.78,140.59 425.64,144.48 430.44,147.38
+             434.04,149.56 437.71,149.46 441.37,147.65
+             445.32,145.70 447.79,142.32 449.73,138.50
+             452.39,133.25 453.16,127.59 453.20,120.88
+             453.14,119.93 453.06,118.08 452.92,116.24"
+        data-elem={ExerciseAttributeValueEnum.BACK}
+        id="path24"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.BACK)}
+        d="M 410.63,151.32
+           C 410.49,151.32 410.49,146.96 410.13,144.87
+             409.76,142.69 408.79,140.61 408.02,138.52
+             407.56,137.28 406.89,137.09 405.79,137.79
+             405.34,138.08 404.93,138.45 404.57,138.85
+             403.06,140.50 401.58,142.17 400.09,143.84
+             398.48,145.65 396.85,147.45 395.30,149.32
+             393.16,151.90 391.78,154.91 390.52,157.99
+             388.87,162.00 388.06,166.16 387.83,170.47
+             387.78,171.37 388.11,171.83 388.97,172.01
+             390.71,172.37 392.02,173.38 393.15,174.72
+             396.18,178.32 397.67,182.67 399.17,187.01
+             400.63,191.28 402.01,195.58 403.62,199.79
+             405.05,203.55 406.98,207.07 409.47,210.26
+             409.68,210.53 410.06,210.67 410.37,210.86
+             410.50,210.53 410.75,210.20 410.76,209.86
+             410.78,209.06 410.64,208.25 410.64,207.44
+             410.63,188.73 410.63,170.03 410.63,151.32"
+        data-elem={ExerciseAttributeValueEnum.BACK}
+        id="path22"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.BACK)}
+        d="M 412.34,201.13
+           C 412.33,204.02 412.23,206.91 412.21,209.80
+             412.20,210.15 412.41,210.50 412.52,210.85
+             412.85,210.64 413.29,210.51 413.49,210.21
+             414.63,208.52 415.79,206.83 416.81,205.06
+             419.82,199.80 421.42,193.97 423.33,188.28
+             424.66,184.33 425.93,180.34 428.26,176.84
+             429.59,174.85 430.96,172.87 433.48,172.15
+             435.22,171.65 435.24,171.61 435.12,169.77
+             434.62,162.73 432.68,156.10 428.46,150.45
+             425.26,146.17 421.44,142.37 417.87,138.37
+             417.58,138.04 417.14,137.81 416.73,137.61
+             416.04,137.26 415.36,137.37 415.11,138.14
+             414.24,140.80 413.03,143.44 412.73,146.18
+             412.28,150.18 412.47,154.26 412.45,158.31
+             412.42,165.95 412.44,173.58 412.44,181.22
+             412.41,181.22 412.38,181.22 412.35,181.22
+             412.35,187.86 412.36,194.49 412.34,201.13"
+        data-elem={ExerciseAttributeValueEnum.BACK}
+        id="path20"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 385.00,92.75
+           C 385.00,92.75 379.75,94.25 379.75,94.50
+             379.75,94.75 372.75,102.25 372.75,102.25
+             372.75,102.25 370.25,106.75 370.25,106.75
+             370.25,106.75 369.50,115.75 369.50,115.75
+             369.50,115.75 369.25,130.00 369.25,130.00
+             369.25,130.00 369.25,139.25 369.25,139.25
+             369.25,139.25 370.00,151.25 370.00,151.25
+             370.00,151.25 373.25,159.75 373.25,159.75
+             373.25,159.75 375.00,163.25 375.00,163.25
+             375.00,163.25 369.75,170.50 369.75,170.50
+             369.75,170.50 369.75,177.25 369.75,177.25
+             369.75,177.25 370.25,180.25 370.25,180.25
+             370.25,180.25 368.25,191.00 368.25,191.00
+             368.25,191.00 367.25,202.00 367.25,202.00
+             367.25,202.00 367.75,207.25 367.75,207.25
+             367.75,207.25 375.75,196.25 375.75,196.00
+             375.75,195.75 381.75,189.25 381.75,189.25
+             381.75,189.25 396.25,184.50 396.25,184.50
+             396.25,184.50 391.75,176.25 391.75,176.25
+             391.75,176.25 386.50,172.25 386.50,172.25
+             386.50,172.25 388.25,161.50 388.25,161.50
+             388.25,161.50 393.75,148.75 393.75,148.75
+             393.75,148.75 399.75,141.50 399.75,141.50
+             399.75,141.50 406.50,135.75 406.50,135.75
+             406.50,135.75 405.50,129.75 405.50,129.75
+             405.50,129.75 398.75,120.75 398.75,120.75
+             398.75,120.75 393.75,112.75 393.75,112.75
+             393.75,112.75 388.75,106.00 388.75,106.00
+             388.75,106.00 386.25,99.25 386.25,99.25
+             386.25,99.25 385.25,93.75 385.25,93.75"
+        data-elem={ExerciseAttributeValueEnum.BACK}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 415.75,134.25
+           C 415.75,134.25 422.25,123.00 422.25,123.00
+             422.25,123.00 432.00,109.75 432.00,109.75
+             432.00,109.75 436.25,101.25 436.25,101.25
+             436.25,101.25 437.75,93.00 437.75,93.00
+             437.75,93.00 443.00,95.50 443.00,95.50
+             443.00,95.50 449.75,100.25 449.75,100.25
+             449.75,100.25 453.00,107.00 453.00,107.00
+             453.00,107.00 453.50,118.25 453.50,118.25
+             453.50,118.25 453.75,132.25 453.75,132.25
+             453.75,132.25 453.75,139.75 453.75,139.75
+             453.75,139.75 451.00,153.25 451.00,153.25
+             451.00,153.25 448.25,163.25 448.25,163.25
+             448.25,163.25 452.00,168.50 452.00,168.50
+             452.00,168.50 452.50,177.00 452.50,177.00
+             452.50,177.00 452.50,182.00 452.50,182.00
+             452.50,182.00 457.00,197.50 457.00,197.50
+             457.00,197.50 456.25,205.75 456.25,205.75
+             456.25,205.75 451.50,199.75 451.50,199.75
+             451.50,199.75 446.75,195.00 446.75,195.00
+             446.75,195.00 443.00,190.75 443.00,190.75
+             443.00,190.75 437.00,187.50 437.00,187.50
+             437.00,187.50 428.75,186.00 428.75,186.00
+             428.75,186.00 427.25,184.25 427.25,184.25
+             427.25,184.25 430.00,178.50 430.00,178.50
+             430.00,178.50 433.00,174.00 433.00,174.00
+             433.00,174.00 436.25,172.75 436.25,172.75
+             436.25,172.75 436.00,165.75 436.00,165.75
+             436.00,165.75 433.25,156.25 433.25,156.25
+             433.25,156.25 428.25,148.25 428.25,148.25
+             428.25,148.25 422.50,142.00 422.50,142.00
+             422.50,142.00 418.50,137.75 416.00,134.75"
+        data-elem={ExerciseAttributeValueEnum.BACK}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.BACK)}
+        d="M 446.16,166.84
+           C 444.58,168.72 443.04,170.63 441.50,172.50
+             443.05,173.60 444.59,174.58 446.00,175.71
+             446.86,176.40 447.49,177.34 448.30,178.09
+             448.60,178.37 449.21,178.65 449.51,178.53
+             449.82,178.40 450.13,177.76 450.06,177.41
+             449.34,173.89 448.56,170.38 447.72,166.88
+             447.53,166.08 446.81,166.06 446.16,166.84"
+        data-elem={ExerciseAttributeValueEnum.BACK}
+        id="path60"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.BACK)}
+        d="M 431.03,186.03
+           C 434.21,186.80 437.40,187.52 440.48,188.54
+             441.32,188.82 442.10,189.23 442.87,189.68
+             442.87,189.68 445.13,191.11 445.13,191.11
+             445.13,191.11 449.09,195.08 449.09,195.08
+             449.33,195.53 449.57,195.98 449.80,196.44
+             450.49,197.83 451.46,199.09 452.41,200.34
+             452.67,200.67 453.30,200.72 453.76,200.90
+             453.87,200.44 454.15,199.95 454.07,199.53
+             453.35,195.95 452.67,192.36 451.79,188.83
+             450.99,185.60 449.99,182.38 447.97,179.71
+             445.23,176.07 441.55,174.00 437.18,173.73
+             436.64,173.83 436.26,173.80 436.01,173.96
+             435.76,174.12 435.47,174.28 435.22,174.45
+             435.22,174.45 435.21,174.45 435.21,174.45
+             435.21,174.45 435.20,174.46 435.20,174.46
+             435.00,174.60 434.83,174.75 434.70,174.91
+             434.70,174.91 432.49,176.89 432.49,176.89
+             432.49,176.89 432.52,176.99 432.52,176.99
+             432.21,177.19 431.96,177.57 431.75,178.14
+             430.99,180.15 430.27,182.18 429.71,184.24
+             429.36,185.52 429.71,185.71 431.03,186.03"
+        data-elem={ExerciseAttributeValueEnum.BACK}
+        id="path56"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.BACK)}
+        d="M 374.54,178.09
+           C 375.35,177.34 375.98,176.40 376.84,175.71
+             378.25,174.58 379.79,173.60 381.34,172.50
+             379.80,170.63 378.26,168.72 376.68,166.84
+             376.02,166.06 375.31,166.08 375.12,166.88
+             374.28,170.38 373.50,173.89 372.78,177.41
+             372.70,177.76 373.02,178.40 373.33,178.53
+             373.63,178.65 374.24,178.37 374.54,178.09"
+        data-elem={ExerciseAttributeValueEnum.BACK}
+        id="path44"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.BACK)}
+        d="M 388.14,174.91
+           C 388.01,174.75 387.84,174.60 387.64,174.46
+             387.64,174.46 387.63,174.45 387.63,174.45
+             387.63,174.45 387.62,174.45 387.62,174.45
+             387.37,174.28 387.08,174.12 386.83,173.96
+             386.57,173.80 386.20,173.83 385.66,173.73
+             381.29,174.00 377.61,176.07 374.87,179.71
+             372.85,182.38 371.85,185.60 371.05,188.83
+             370.17,192.36 369.48,195.95 368.77,199.53
+             368.69,199.95 368.97,200.44 369.08,200.90
+             369.54,200.72 370.17,200.67 370.43,200.34
+             371.38,199.09 372.35,197.83 373.04,196.44
+             373.27,195.98 373.51,195.53 373.74,195.08
+             373.74,195.08 377.71,191.11 377.71,191.11
+             377.71,191.11 379.97,189.68 379.97,189.68
+             380.74,189.23 381.52,188.82 382.35,188.54
+             385.44,187.52 388.63,186.80 391.81,186.03
+             393.13,185.71 393.48,185.52 393.13,184.24
+             392.56,182.18 391.85,180.15 391.09,178.14
+             390.88,177.57 390.63,177.19 390.32,176.99
+             390.32,176.99 390.35,176.89 390.35,176.89
+             390.35,176.89 388.14,174.91 388.14,174.91"
+        data-elem={ExerciseAttributeValueEnum.BACK}
+        id="path36"
+        stroke="black"
+        strokeWidth="0"
+      />
+    </g>
+  );
+};

+ 142 - 0
src/features/workout-builder/ui/muscles/biceps-group.tsx

@@ -0,0 +1,142 @@
+import { ExerciseAttributeValueEnum } from "@prisma/client";
+
+export const BicepsGroup = ({
+  onToggleMuscle,
+  getMuscleClasses,
+}: {
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  getMuscleClasses: (muscle: ExerciseAttributeValueEnum) => string;
+}) => {
+  return (
+    <g className="group cursor-pointer" onClick={() => onToggleMuscle(ExerciseAttributeValueEnum.BICEPS)}>
+      <path
+        className="fill-transparent"
+        d="M 49.25,117.25
+           C 49.25,117.25 45.50,120.75 45.50,120.75
+             45.50,120.75 42.00,129.00 42.00,129.00
+             42.00,129.00 41.25,137.75 41.25,137.75
+             41.25,137.75 42.00,145.25 42.00,145.25
+             42.00,145.25 46.50,149.50 46.50,149.50
+             46.50,149.50 48.25,153.25 48.25,153.25
+             48.25,153.25 49.25,166.50 49.25,166.50
+             49.25,166.50 60.25,153.00 60.25,153.00
+             60.25,153.00 61.25,149.50 61.25,149.50
+             61.25,149.50 63.75,151.50 63.75,151.50
+             63.75,151.50 68.00,148.75 68.00,148.75
+             68.00,148.75 73.00,140.50 73.00,140.50
+             73.00,140.50 74.25,129.50 74.25,129.50
+             74.25,129.50 74.50,120.25 74.50,120.25
+             74.50,120.25 74.50,116.50 74.50,116.50
+             74.50,116.50 73.00,113.00 73.00,113.00
+             73.00,113.00 71.25,111.50 71.25,111.50
+             71.25,111.50 68.00,110.50 68.00,110.50
+             68.00,110.50 57.75,114.25 57.75,114.25
+             57.75,114.25 49.50,117.50 49.50,117.50"
+        data-elem={ExerciseAttributeValueEnum.BICEPS}
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.BICEPS)}
+        d="M 166.82,151.36
+           C 166.99,151.37 166.72,150.23 166.86,150.14
+             166.46,148.57 166.10,146.98 165.67,145.42
+             164.18,140.02 162.71,134.62 161.15,129.24
+             160.79,128.01 158.77,117.31 158.25,114.97
+             158.05,114.59 157.47,118.80 157.14,121.79
+             157.09,122.29 157.16,124.59 157.08,125.04
+             156.95,125.74 157.27,130.26 157.40,130.96
+             158.57,137.01 159.49,139.00 162.34,144.99
+             162.91,146.19 164.64,148.86 165.33,149.99
+             165.62,150.47 166.25,151.31 166.82,151.36"
+        data-elem={ExerciseAttributeValueEnum.BICEPS}
+        id="path158"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.BICEPS)}
+        d="M 160.10,114.96
+           C 160.64,121.59 161.87,128.11 163.78,134.48
+             164.74,137.69 165.80,140.87 166.86,144.05
+             168.73,149.65 171.29,154.88 174.82,159.66
+             176.46,161.88 177.68,164.42 179.09,166.81
+             179.16,166.93 179.26,167.02 179.52,167.32
+             179.64,166.25 179.80,165.40 179.82,164.55
+             179.94,159.48 179.56,151.75 182.68,147.85
+             184.94,145.02 185.76,140.37 185.60,137.71
+             185.30,132.58 184.87,130.15 182.68,125.43
+             177.61,114.52 170.89,114.39 163.98,111.93
+             161.46,111.02 159.88,112.29 160.10,114.96"
+        data-elem={ExerciseAttributeValueEnum.BICEPS}
+        id="path150"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.BICEPS)}
+        d="M 62.71,151.36
+           C 63.28,151.31 63.91,150.47 64.20,149.99
+             64.90,148.86 66.62,146.19 67.19,144.99
+             70.04,139.00 70.97,137.01 72.13,130.96
+             72.27,130.26 72.59,125.74 72.46,125.04
+             72.37,124.59 72.45,122.29 72.39,121.79
+             72.07,118.80 71.48,114.59 71.29,114.97
+             70.77,117.31 68.74,128.01 68.38,129.24
+             66.83,134.62 65.35,140.02 63.86,145.42
+             63.43,146.98 63.07,148.57 62.68,150.14
+             62.81,150.23 62.54,151.37 62.71,151.36"
+        data-elem={ExerciseAttributeValueEnum.BICEPS}
+        id="path148"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.BICEPS)}
+        d="M 49.72,164.55
+           C 49.74,165.40 49.90,166.25 50.02,167.32
+             50.27,167.02 50.37,166.93 50.44,166.81
+             51.85,164.42 53.07,161.88 54.71,159.66
+             58.24,154.88 60.81,149.65 62.67,144.05
+             63.73,140.87 64.79,137.69 65.76,134.48
+             67.67,128.11 68.90,121.59 69.44,114.96
+             69.66,112.29 68.07,111.02 65.55,111.93
+             58.64,114.39 51.92,114.52 46.86,125.43
+             44.67,130.15 44.23,132.58 43.93,137.71
+             43.78,140.37 44.59,145.02 46.86,147.85
+             49.98,151.75 49.59,159.48 49.72,164.55"
+        data-elem={ExerciseAttributeValueEnum.BICEPS}
+        id="path140"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 155.50,113.75
+           C 155.50,113.75 155.25,124.75 155.25,124.75
+             155.25,124.75 156.00,137.75 156.00,137.75
+             156.00,137.75 159.50,143.75 159.50,143.75
+             159.50,143.75 163.25,151.00 163.25,151.00
+             163.25,151.00 168.75,152.50 168.75,152.50
+             168.75,152.50 174.50,160.25 174.50,160.25
+             174.50,160.25 180.25,168.00 180.25,168.00
+             180.25,168.00 181.00,154.50 181.00,154.50
+             181.00,154.50 183.50,148.25 183.50,148.25
+             183.50,148.25 187.25,144.75 187.25,144.75
+             187.25,144.75 188.75,136.25 188.75,136.25
+             188.75,136.25 188.50,129.00 188.50,129.00
+             188.50,129.00 184.50,121.75 184.50,121.75
+             184.50,121.75 181.00,118.25 181.00,118.25
+             181.00,118.25 174.50,115.00 174.50,115.00
+             174.50,115.00 165.50,111.75 165.50,111.75
+             165.50,111.75 158.25,111.00 158.25,111.00
+             158.25,111.00 155.25,113.50 155.25,113.50"
+        data-elem={ExerciseAttributeValueEnum.BICEPS}
+        stroke="black"
+        strokeWidth="0"
+      />
+    </g>
+  );
+};

+ 414 - 0
src/features/workout-builder/ui/muscles/calves-group.tsx

@@ -0,0 +1,414 @@
+import { ExerciseAttributeValueEnum } from "@prisma/client";
+
+export const CalvesGroup = ({
+  onToggleMuscle,
+  getMuscleClasses,
+}: {
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  getMuscleClasses: (muscle: ExerciseAttributeValueEnum) => string;
+}) => {
+  return (
+    <g className="group cursor-pointer" onClick={() => onToggleMuscle(ExerciseAttributeValueEnum.CALVES)}>
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.CALVES)}
+        d="M 432.29,380.53
+           C 433.40,381.41 434.63,381.43 435.95,380.70
+             439.00,379.01 440.64,376.49 441.69,373.67
+             443.04,370.01 443.56,366.26 443.57,362.48
+             443.57,358.91 443.33,355.35 443.19,351.78
+             442.63,345.13 441.79,338.51 440.02,332.04
+             439.37,329.64 438.21,327.33 436.04,325.58
+             435.22,324.92 434.11,324.49 433.07,324.05
+             432.14,323.66 431.50,324.04 431.47,324.89
+             431.41,326.32 431.40,327.76 431.48,329.19
+             431.60,331.20 431.67,334.59 431.68,336.61
+             431.71,344.21 430.33,346.48 428.25,353.24
+             426.65,358.46 426.07,363.45 426.64,368.76
+             426.90,371.21 427.71,373.95 429.59,377.24
+             429.96,377.89 431.65,380.01 432.29,380.53"
+        data-elem={ExerciseAttributeValueEnum.CALVES}
+        id="path64"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.CALVES)}
+        d="M 378.79,319.96
+           C 378.38,319.97 377.85,320.51 377.62,320.95
+             376.44,323.18 374.52,325.61 373.42,327.88
+             370.78,333.40 369.25,335.88 367.29,342.73
+             366.18,346.60 364.81,350.27 364.42,353.86
+             364.18,356.09 364.24,360.68 364.39,362.45
+             364.76,366.72 367.79,368.98 371.84,370.05
+             374.92,370.87 377.02,369.61 377.26,366.58
+             377.55,363.00 377.46,359.38 377.80,355.80
+             378.36,349.86 379.04,343.93 379.85,338.03
+             380.43,333.81 381.25,329.63 381.25,325.35
+             381.25,323.72 380.80,322.28 380.00,320.91
+             379.75,320.49 379.19,319.95 378.79,319.96"
+        data-elem={ExerciseAttributeValueEnum.CALVES}
+        id="path46"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 90.50,307.75
+           C 90.50,307.75 77.50,324.75 77.50,324.75
+             77.50,324.75 72.50,337.00 72.50,337.00
+             72.50,337.00 68.25,350.75 68.25,350.75
+             68.25,350.75 68.25,368.75 68.25,368.75
+             68.25,368.75 69.75,385.25 69.75,385.25
+             69.75,385.25 74.25,402.00 74.25,402.00
+             74.25,402.00 79.50,411.25 79.50,411.25
+             79.50,411.25 88.25,422.25 88.25,422.25
+             88.25,422.25 93.75,428.25 93.75,428.25
+             93.75,428.25 94.00,421.25 94.00,421.25
+             94.00,421.25 91.50,404.75 91.50,404.75
+             91.50,404.75 93.75,391.75 93.75,391.75
+             93.75,391.75 99.25,378.25 99.25,378.25
+             99.25,378.25 101.25,365.75 101.25,365.75
+             101.25,365.75 97.50,346.75 97.50,346.75
+             97.50,346.75 95.25,332.50 95.25,332.50
+             95.25,332.50 94.50,319.75 94.50,319.75
+             94.50,319.75 92.75,310.25 92.75,310.25"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 137.50,309.75
+           C 137.50,309.75 135.75,325.75 135.75,325.75
+             135.75,325.75 134.50,335.75 134.50,335.75
+             134.50,335.75 131.25,347.00 131.25,347.00
+             131.25,347.00 128.75,358.75 128.75,358.75
+             128.75,358.75 128.75,369.50 128.75,369.50
+             128.75,369.50 132.00,382.75 132.00,382.75
+             132.00,382.75 135.75,391.25 135.75,391.25
+             135.75,391.25 138.00,403.25 138.00,403.25
+             138.00,403.25 137.50,413.25 137.50,413.25
+             137.50,413.25 135.50,425.75 135.50,425.75
+             135.50,425.75 141.00,423.75 141.00,423.75
+             141.00,423.75 149.00,413.75 149.00,413.75
+             149.00,413.75 153.75,408.00 153.75,408.00
+             153.75,408.00 159.50,394.00 159.50,394.00
+             159.50,394.00 161.75,375.50 161.75,375.50
+             161.75,375.50 163.00,361.25 163.00,361.25
+             163.00,361.25 162.00,347.00 162.00,347.00
+             162.00,347.00 159.00,337.50 159.00,337.50
+             159.00,337.50 154.75,330.00 154.75,329.75
+             154.75,329.50 147.25,320.25 147.25,320.25
+             147.25,320.25 142.75,314.25 142.75,314.25
+             142.75,314.25 141.75,310.75 139.50,309.25"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 370.00,328.00
+           C 370.00,328.00 365.25,339.75 365.25,339.75
+             365.25,339.75 361.75,349.00 361.75,349.00
+             361.75,349.00 361.75,362.25 361.75,362.25
+             361.75,362.25 364.25,377.00 364.25,377.00
+             364.25,377.00 370.50,395.75 370.50,395.75
+             370.50,395.75 373.00,409.50 373.00,409.50
+             373.00,409.50 372.00,428.25 372.00,428.25
+             372.00,428.25 375.00,425.75 375.00,425.75
+             375.00,425.75 378.50,419.00 378.50,419.00
+             378.50,419.00 382.75,415.75 382.75,415.75
+             382.75,415.75 388.50,415.75 388.50,415.75
+             388.50,415.75 393.25,421.75 393.25,421.75
+             393.25,421.75 390.25,408.25 390.25,408.25
+             390.25,408.25 390.75,397.00 390.75,397.00
+             390.75,397.00 395.50,379.75 395.50,379.75
+             395.50,379.75 399.75,371.75 399.75,371.75
+             399.75,371.75 400.00,360.00 400.00,360.00
+             400.00,360.00 396.00,348.50 396.00,348.50
+             396.00,348.50 393.00,339.75 393.00,339.75
+             393.00,339.75 392.25,324.00 392.25,324.00
+             392.25,324.00 391.50,322.00 391.50,322.00
+             391.50,322.00 384.00,326.25 384.00,326.25
+             384.00,326.25 381.25,322.00 381.25,322.00
+             381.25,322.00 378.75,319.00 378.75,319.00
+             378.75,319.00 374.00,325.75 374.00,325.75
+             374.00,325.75 370.00,327.75 370.00,327.75"
+        data-elem={ExerciseAttributeValueEnum.CALVES}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 428.50,342.00
+           C 428.50,342.00 424.50,355.00 424.50,355.00
+             424.50,355.00 424.75,364.25 424.50,364.25
+             424.25,364.25 424.75,374.50 424.75,374.75
+             424.75,375.00 429.75,386.00 429.75,386.00
+             429.75,386.00 433.00,403.00 433.00,403.00
+             433.00,403.00 430.00,417.75 430.00,417.75
+             430.00,417.75 435.25,416.25 435.25,416.25
+             435.25,416.25 439.25,416.25 439.25,416.25
+             439.25,416.25 444.00,417.50 444.00,417.50
+             444.00,417.50 449.50,428.00 449.50,428.00
+             449.50,428.00 449.50,417.00 449.50,417.00
+             449.50,417.00 452.00,402.75 452.00,402.75
+             452.00,402.75 456.75,385.00 456.75,385.00
+             456.75,385.00 461.00,367.75 461.00,367.75
+             461.00,367.75 461.75,350.75 461.75,350.75
+             461.75,350.75 459.25,339.50 459.25,339.50
+             459.25,339.50 453.00,328.25 453.00,328.25
+             453.00,328.25 447.75,324.50 447.75,324.50
+             447.75,324.50 445.25,319.75 445.25,319.75
+             445.25,319.75 442.75,320.00 442.75,320.00
+             442.75,320.00 439.75,326.25 439.75,326.25
+             439.75,326.25 436.75,324.75 436.75,324.75
+             436.75,324.75 432.50,322.75 432.50,322.75
+             432.50,322.75 431.25,324.75 431.25,324.75
+             431.25,324.75 430.75,338.00 430.75,338.00
+             430.75,338.00 429.00,342.25 429.00,342.25"
+        data-elem={ExerciseAttributeValueEnum.CALVES}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.CALVES)}
+        d="M 139.32,424.05
+           C 141.70,421.08 144.08,418.10 146.45,415.12
+             148.97,411.96 152.26,405.62 153.51,401.86
+             156.87,391.85 157.28,386.72 158.94,376.31
+             160.09,369.05 159.82,359.41 158.94,352.14
+             157.62,341.33 153.96,331.32 147.64,322.44
+             147.29,321.95 146.94,321.45 146.58,320.96
+             146.54,320.91 146.44,320.91 146.13,320.79
+             146.43,322.78 146.67,324.61 146.98,326.43
+             147.91,331.81 148.64,337.21 148.60,342.67
+             148.56,347.32 148.37,351.96 148.03,356.59
+             147.31,366.52 146.82,376.44 146.72,386.40
+             146.63,395.40 145.83,404.38 143.15,413.06
+             142.59,414.84 141.90,416.58 141.26,418.33
+             141.22,418.46 141.14,418.57 140.94,418.63
+             141.67,416.00 142.38,413.37 143.13,410.74
+             144.74,405.12 145.31,399.35 145.15,393.54
+             144.98,387.94 144.69,382.34 144.13,376.77
+             143.78,373.26 142.90,369.80 142.14,366.34
+             140.73,359.82 139.24,353.32 137.77,346.81
+             137.50,345.59 137.23,344.36 136.95,343.14
+             136.88,342.82 135.74,338.70 135.55,338.10
+             135.34,338.63 135.20,345.86 135.15,346.10
+             134.32,350.59 133.77,354.30 132.82,358.77
+             131.80,363.49 132.05,369.81 133.01,374.36
+             135.19,384.69 138.33,388.97 140.42,399.31
+             141.25,403.45 141.10,409.29 139.84,413.31
+             138.78,416.70 138.50,420.33 137.91,423.85
+             137.85,424.21 138.01,424.61 138.12,425.30
+             138.67,424.74 139.02,424.42 139.32,424.05"
+        data-elem={ExerciseAttributeValueEnum.CALVES}
+        id="path184"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.CALVES)}
+        d="M 140.06,310.63
+           C 139.89,310.30 139.37,309.86 139.16,309.92
+             138.81,310.03 138.41,310.48 138.33,310.85
+             137.74,313.76 137.01,316.65 136.71,319.59
+             136.18,324.67 135.74,329.77 136.44,334.87
+             136.69,336.74 137.28,338.57 137.74,340.41
+             138.57,343.73 139.49,347.03 140.23,350.37
+             141.71,356.98 143.10,363.62 144.54,370.25
+             144.65,370.74 144.83,371.22 144.98,371.70
+             145.09,371.70 145.20,371.70 145.31,371.69
+             145.42,371.21 145.61,370.73 145.64,370.24
+             145.97,365.72 146.35,361.20 146.56,356.67
+             146.80,351.27 146.90,345.86 147.02,340.46
+             147.14,335.43 146.30,330.50 145.04,325.67
+             144.00,321.69 142.77,317.76 141.55,313.84
+             141.20,312.72 140.61,311.67 140.06,310.63"
+        data-elem={ExerciseAttributeValueEnum.CALVES}
+        id="path178"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.CALVES)}
+        d="M 89.90,310.63
+           C 89.35,311.67 88.76,312.72 88.42,313.84
+             87.19,317.76 85.96,321.69 84.92,325.67
+             83.66,330.50 82.83,335.43 82.94,340.46
+             83.07,345.86 83.17,351.27 83.41,356.67
+             83.61,361.20 84.00,365.72 84.32,370.24
+             84.36,370.73 84.54,371.21 84.65,371.69
+             84.76,371.70 84.87,371.70 84.98,371.70
+             85.13,371.22 85.32,370.74 85.43,370.25
+             86.86,363.62 88.25,356.98 89.73,350.37
+             90.48,347.03 91.40,343.73 92.22,340.41
+             92.68,338.57 93.27,336.74 93.53,334.87
+             94.22,329.77 93.78,324.67 93.26,319.59
+             92.95,316.65 92.23,313.76 91.63,310.85
+             91.55,310.48 91.15,310.03 90.81,309.92
+             90.59,309.86 90.08,310.30 89.90,310.63"
+        data-elem={ExerciseAttributeValueEnum.CALVES}
+        id="path168"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.CALVES)}
+        d="M 94.81,346.10
+           C 94.77,345.86 94.63,338.63 94.42,338.10
+             94.22,338.70 93.09,342.82 93.01,343.14
+             92.73,344.36 92.47,345.59 92.19,346.81
+             90.73,353.32 89.24,359.82 87.82,366.34
+             87.07,369.80 86.19,373.26 85.84,376.77
+             85.28,382.34 84.98,387.94 84.82,393.54
+             84.65,399.35 85.23,405.12 86.83,410.74
+             87.58,413.37 88.30,416.00 89.03,418.63
+             88.82,418.57 88.74,418.46 88.70,418.33
+             88.07,416.58 87.37,414.84 86.82,413.06
+             84.13,404.38 83.34,395.40 83.25,386.40
+             83.15,376.44 82.65,366.52 81.93,356.59
+             81.60,351.96 81.40,347.32 81.37,342.67
+             81.33,337.21 82.05,331.81 82.98,326.43
+             83.29,324.61 83.53,322.78 83.83,320.79
+             83.52,320.91 83.42,320.91 83.39,320.96
+             83.03,321.45 82.67,321.95 82.32,322.44
+             76.01,331.32 72.34,341.33 71.03,352.14
+             70.15,359.41 69.87,369.05 71.03,376.31
+             72.68,386.72 73.10,391.85 76.45,401.86
+             77.71,405.62 80.99,411.96 83.51,415.12
+             85.89,418.10 88.26,421.08 90.65,424.05
+             90.94,424.42 91.30,424.74 91.85,425.30
+             91.95,424.61 92.12,424.21 92.06,423.85
+             91.47,420.33 91.19,416.70 90.13,413.31
+             88.87,409.29 88.71,403.45 89.55,399.31
+             91.63,388.97 94.77,384.69 96.95,374.36
+             97.92,369.81 98.16,363.49 97.15,358.77
+             96.19,354.30 95.64,350.59 94.81,346.10"
+        data-elem={ExerciseAttributeValueEnum.CALVES}
+        id="path166"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.CALVES)}
+        d="M 435.16,400.96
+           C 435.80,403.90 435.68,408.43 434.86,411.24
+             434.49,412.51 434.02,413.76 433.62,415.03
+             433.48,415.49 433.43,415.97 433.28,416.72
+             434.00,416.23 434.43,415.89 434.91,415.61
+             437.86,413.92 442.04,414.73 444.56,417.47
+             446.39,419.46 447.22,421.86 447.69,424.42
+             447.77,424.86 447.87,425.29 447.96,425.73
+             448.07,425.72 448.19,425.72 448.31,425.72
+             448.35,425.30 448.45,424.87 448.41,424.47
+             448.14,422.20 447.95,419.91 447.52,417.67
+             446.73,413.51 447.11,409.44 448.07,405.33
+             450.25,396.03 452.42,386.74 455.38,377.61
+             456.43,374.38 457.84,370.84 457.82,367.15
+             456.04,369.15 453.82,371.17 453.13,373.46
+             450.31,382.77 448.01,392.19 446.07,401.70
+             446.04,401.85 445.98,401.99 445.67,402.09
+             446.09,399.65 446.48,397.21 446.94,394.78
+             447.41,392.33 447.93,389.89 448.46,387.46
+             449.01,384.99 449.60,382.52 450.17,380.05
+             450.73,377.64 451.28,375.23 451.90,372.58
+             450.31,373.01 449.02,373.47 447.67,373.68
+             446.49,373.87 445.25,373.88 444.05,373.77
+             443.28,373.70 443.14,374.02 442.97,374.54
+             442.31,376.62 441.32,378.52 439.63,380.05
+             436.39,382.97 434.38,383.07 430.92,380.26
+             431.36,382.20 431.74,383.91 432.13,385.61
+             433.40,391.29 433.93,395.27 435.16,400.96"
+        data-elem={ExerciseAttributeValueEnum.CALVES}
+        id="path68"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.CALVES)}
+        d="M 445.04,355.80
+           C 445.38,359.38 445.29,363.00 445.58,366.58
+             445.81,369.61 447.92,370.87 451.00,370.05
+             455.05,368.98 458.08,366.72 458.45,362.45
+             458.60,360.68 458.66,356.09 458.42,353.86
+             458.03,350.27 456.66,346.60 455.55,342.73
+             453.59,335.88 452.06,333.40 449.42,327.88
+             448.32,325.61 446.40,323.18 445.22,320.95
+             444.99,320.51 444.46,319.97 444.05,319.96
+             443.65,319.95 443.09,320.49 442.84,320.91
+             442.04,322.28 441.59,323.72 441.59,325.35
+             441.58,329.63 442.41,333.81 442.99,338.03
+             443.80,343.93 444.48,349.86 445.04,355.80"
+        data-elem={ExerciseAttributeValueEnum.CALVES}
+        id="path62"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.CALVES)}
+        d="M 383.21,380.05
+           C 381.52,378.52 380.53,376.62 379.87,374.54
+             379.70,374.02 379.56,373.70 378.79,373.77
+             377.59,373.88 376.35,373.87 375.17,373.68
+             373.82,373.47 372.53,373.01 370.94,372.58
+             371.56,375.23 372.11,377.64 372.67,380.05
+             373.24,382.52 373.83,384.99 374.38,387.46
+             374.91,389.89 375.43,392.33 375.90,394.78
+             376.36,397.21 376.75,399.65 377.17,402.09
+             376.86,401.99 376.80,401.85 376.77,401.70
+             374.83,392.19 372.53,382.77 369.71,373.46
+             369.02,371.17 366.80,369.15 365.02,367.15
+             365.00,370.84 366.41,374.38 367.46,377.61
+             370.42,386.74 372.59,396.03 374.76,405.33
+             375.73,409.44 376.11,413.51 375.32,417.67
+             374.89,419.91 374.70,422.20 374.43,424.47
+             374.39,424.87 374.49,425.30 374.53,425.72
+             374.65,425.72 374.76,425.72 374.88,425.73
+             374.97,425.29 375.07,424.86 375.15,424.42
+             375.62,421.86 376.45,419.46 378.28,417.47
+             380.80,414.73 384.98,413.92 387.93,415.61
+             388.41,415.89 388.84,416.23 389.56,416.72
+             389.41,415.97 389.36,415.49 389.22,415.03
+             388.82,413.76 388.35,412.51 387.98,411.24
+             387.16,408.43 387.04,403.90 387.68,400.96
+             388.91,395.27 389.44,391.29 390.71,385.61
+             391.09,383.91 391.48,382.20 391.92,380.26
+             388.46,383.07 386.45,382.97 383.21,380.05"
+        data-elem={ExerciseAttributeValueEnum.CALVES}
+        id="path54"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.CALVES)}
+        d="M 391.16,336.61
+           C 391.17,334.59 391.24,331.20 391.35,329.19
+             391.44,327.76 391.43,326.32 391.37,324.89
+             391.34,324.04 390.70,323.66 389.77,324.05
+             388.73,324.49 387.62,324.92 386.79,325.58
+             384.63,327.33 383.47,329.64 382.82,332.04
+             381.05,338.51 380.21,345.13 379.65,351.78
+             379.51,355.35 379.27,358.91 379.27,362.48
+             379.28,366.26 379.80,370.01 381.15,373.67
+             382.20,376.49 383.84,379.01 386.89,380.70
+             388.21,381.43 389.44,381.41 390.54,380.53
+             391.19,380.01 392.88,377.89 393.25,377.24
+             395.13,373.95 395.94,371.21 396.20,368.76
+             396.77,363.45 396.19,358.46 394.59,353.24
+             392.50,346.48 391.13,344.21 391.16,336.61"
+        data-elem={ExerciseAttributeValueEnum.CALVES}
+        id="path50"
+        stroke="black"
+        strokeWidth="0"
+      />
+    </g>
+  );
+};

+ 125 - 0
src/features/workout-builder/ui/muscles/chest-group.tsx

@@ -0,0 +1,125 @@
+import React from "react";
+import { ExerciseAttributeValueEnum } from "@prisma/client";
+
+export const ChestGroup = ({
+  onToggleMuscle,
+  getMuscleClasses,
+}: {
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  getMuscleClasses: (muscle: ExerciseAttributeValueEnum) => string;
+}) => {
+  return (
+    <g className="group cursor-pointer" onClick={() => onToggleMuscle(ExerciseAttributeValueEnum.CHEST)}>
+      <path
+        className="fill-transparent"
+        d="M 72.50,111.50
+           C 72.50,111.50 77.50,102.50 77.50,102.25
+             77.50,102.00 81.75,94.00 81.75,94.00
+             81.75,94.00 84.50,87.50 84.50,87.50
+             84.50,87.50 85.50,85.50 85.50,85.50
+             85.50,85.50 88.75,83.25 88.75,83.25
+             88.75,83.25 95.50,83.50 95.50,83.50
+             95.50,83.50 99.75,84.25 99.75,84.25
+             99.75,84.25 104.25,86.00 104.25,86.00
+             104.25,86.00 113.00,86.75 113.00,86.75
+             113.00,86.75 120.50,86.75 120.50,86.75
+             120.50,86.75 126.75,86.00 126.75,86.00
+             126.75,86.00 133.50,83.75 133.50,83.75
+             133.50,83.75 138.00,83.50 138.00,83.50
+             138.00,83.50 141.50,83.75 141.50,83.75
+             141.50,83.75 143.75,86.25 143.75,86.25
+             143.75,86.25 149.00,96.00 149.00,96.00
+             149.00,96.00 154.25,106.00 154.25,106.00
+             154.25,106.00 156.00,110.50 156.00,110.50
+             156.00,110.50 155.00,115.00 155.00,115.00
+             155.00,115.00 149.75,118.00 149.75,118.00M 136.75,123.50
+           C 136.75,123.50 132.50,124.25 132.50,124.25
+             132.50,124.25 127.75,123.75 127.75,123.75
+             127.75,123.75 119.75,120.25 119.75,120.25
+             119.75,120.25 115.00,127.75 115.00,127.75
+             115.00,127.75 109.25,120.50 109.25,120.50
+             109.25,120.50 103.00,124.00 103.00,124.00
+             103.00,124.00 98.50,124.75 98.50,124.75
+             98.50,124.75 91.75,123.25 91.75,123.25
+             91.75,123.25 80.00,118.00 80.00,118.00
+             80.00,118.00 73.00,111.75 73.00,111.75"
+        data-elem={ExerciseAttributeValueEnum.CHEST}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.CHEST)}
+        d="M 128.00,122.83
+           C 132.18,123.49 136.25,123.15 140.14,121.62
+             145.31,119.58 149.70,116.28 153.73,112.49
+             154.47,111.79 154.70,110.91 154.40,109.98
+             153.95,108.57 153.53,107.12 152.81,105.84
+             149.78,100.45 146.82,95.05 144.62,89.25
+             143.53,86.37 139.34,82.87 136.11,83.86
+             131.78,85.18 127.51,86.71 123.26,88.29
+             119.12,89.83 116.94,93.03 116.62,97.33
+             116.32,101.36 116.14,105.41 116.31,109.44
+             116.56,115.50 121.62,121.81 128.00,122.83"
+        data-elem={ExerciseAttributeValueEnum.CHEST}
+        id="path106"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.CHEST)}
+        d="M 115.70,124.93
+           C 116.59,123.70 117.47,122.46 118.32,121.20
+             118.61,120.76 118.81,120.26 119.06,119.77
+             118.96,119.45 118.93,119.13 118.77,118.89
+             117.79,117.39 116.84,115.87 115.76,114.45
+             114.99,113.43 114.47,113.43 113.69,114.49
+             112.62,115.92 111.67,117.44 110.74,118.97
+             110.55,119.30 110.53,119.94 110.72,120.25
+             111.72,121.86 112.79,123.44 113.91,124.98
+             114.45,125.72 115.15,125.69 115.70,124.93"
+        data-elem={ExerciseAttributeValueEnum.CHEST}
+        id="path138"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.CHEST)}
+        d="M 112.42,97.33
+           C 112.10,93.03 109.92,89.83 105.78,88.29
+             101.53,86.71 97.26,85.18 92.93,83.86
+             89.70,82.87 85.51,86.37 84.42,89.25
+             82.22,95.05 79.26,100.45 76.23,105.84
+             75.51,107.12 75.09,108.57 74.64,109.98
+             74.34,110.91 74.57,111.79 75.31,112.49
+             79.34,116.28 83.73,119.58 88.90,121.62
+             92.79,123.15 96.86,123.49 101.04,122.83
+             107.42,121.81 112.48,115.50 112.73,109.44
+             112.90,105.41 112.72,101.36 112.42,97.33"
+        data-elem={ExerciseAttributeValueEnum.CHEST}
+        id="path198"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        d="M 114.71,95.58
+           C 114.89,95.35 115.00,95.27 115.02,95.18
+             115.68,92.72 116.69,90.44 118.43,88.53
+             118.64,88.30 118.61,87.85 118.69,87.50
+             118.33,87.47 117.94,87.32 117.63,87.42
+             115.83,88.01 114.05,88.05 112.23,87.51
+             111.81,87.38 111.31,87.52 110.84,87.54
+             111.01,87.97 111.09,88.49 111.37,88.83
+             112.74,90.47 113.65,92.33 114.26,94.36
+             114.37,94.74 114.53,95.10 114.71,95.58"
+        data-elem={ExerciseAttributeValueEnum.CHEST}
+        fill="#757575"
+        id="path160"
+        stroke="black"
+        strokeWidth="0"
+      />
+    </g>
+  );
+};

+ 353 - 0
src/features/workout-builder/ui/muscles/forearms-group.tsx

@@ -0,0 +1,353 @@
+import React from "react";
+import { ExerciseAttributeValueEnum } from "@prisma/client";
+
+export const ForearmsGroup = ({
+  onToggleMuscle,
+  getMuscleClasses,
+}: {
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  getMuscleClasses: (muscle: ExerciseAttributeValueEnum) => string;
+}) => {
+  return (
+    <g className="group cursor-pointer" onClick={() => onToggleMuscle(ExerciseAttributeValueEnum.FOREARMS)}>
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.FOREARMS)}
+        d="M 355.58,156.70
+           C 355.59,156.41 355.36,155.93 355.14,155.87
+             354.89,155.80 354.44,156.04 354.24,156.27
+             353.09,157.56 351.97,158.87 350.89,160.21
+             349.34,162.13 347.83,164.08 346.29,166.01
+             343.77,169.18 342.67,172.95 341.43,176.65
+             338.78,184.50 336.21,192.37 333.61,200.23
+             333.56,200.37 333.47,200.49 333.41,200.62
+             333.41,200.62 333.22,200.56 333.22,200.56
+             333.93,198.29 334.63,196.01 335.37,193.75
+             337.89,185.98 340.45,178.23 342.93,170.45
+             343.64,168.21 345.02,166.40 346.37,164.53
+             347.10,163.53 347.70,162.43 348.24,161.32
+             348.74,160.29 348.53,159.30 347.48,158.68
+             346.54,158.12 345.55,157.52 344.49,157.26
+             343.88,157.12 343.42,157.14 343.10,157.31
+             343.10,157.31 343.10,157.31 343.10,157.31
+             343.10,157.31 343.08,157.33 343.08,157.33
+             342.97,157.39 342.88,157.48 342.81,157.58
+             342.81,157.58 340.41,159.83 340.41,159.83
+             339.15,160.69 337.92,161.59 336.53,162.57
+             336.53,162.57 333.38,166.06 333.38,166.06
+             332.94,166.53 332.53,167.03 332.12,167.52
+             327.93,172.51 326.70,178.25 326.95,184.54
+             327.20,190.89 326.96,197.24 325.80,203.51
+             325.66,203.51 325.52,203.50 325.38,203.50
+             325.49,199.61 325.66,195.72 325.69,191.83
+             325.71,189.79 325.50,187.74 325.37,185.71
+             325.35,185.36 325.33,184.98 325.16,184.69
+             324.95,184.33 324.59,184.05 324.29,183.73
+             324.05,184.06 323.71,184.35 323.60,184.71
+             322.71,187.71 322.00,190.76 320.98,193.70
+             318.82,199.88 316.52,206.00 314.26,212.14
+             313.85,213.26 314.07,213.77 315.21,213.55
+             319.80,212.64 323.64,214.58 327.53,216.36
+             328.39,216.75 328.98,216.80 329.48,215.84
+             333.40,208.28 337.44,200.78 341.28,193.19
+             344.89,186.07 347.98,178.75 350.48,171.20
+             350.94,169.78 351.85,168.51 352.52,167.15
+             353.47,165.20 354.59,163.29 355.25,161.25
+             355.71,159.84 355.54,158.22 355.58,156.70"
+        data-elem={ExerciseAttributeValueEnum.FOREARMS}
+        id="path94"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.FOREARMS)}
+        d="M 328.92,170.86
+           C 331.73,166.23 335.11,161.99 338.87,158.01
+             339.52,157.32 339.80,156.59 339.61,155.68
+             339.18,153.57 338.81,151.44 338.37,149.33
+             338.28,148.91 338.00,148.53 337.81,148.13
+             337.65,148.13 337.49,148.12 337.33,148.12
+             332.60,155.30 328.07,162.55 327.92,171.34
+             328.04,171.41 328.15,171.47 328.27,171.54
+             328.49,171.31 328.76,171.12 328.92,170.86"
+        data-elem={ExerciseAttributeValueEnum.FOREARMS}
+        id="path92"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.FOREARMS)}
+        d="M 507.15,213.55
+           C 508.29,213.77 508.51,213.26 508.10,212.14
+             505.85,206.00 503.54,199.88 501.38,193.70
+             500.36,190.76 499.65,187.71 498.76,184.71
+             498.65,184.35 498.31,184.06 498.08,183.73
+             497.78,184.05 497.41,184.33 497.20,184.69
+             497.03,184.98 497.01,185.36 496.99,185.71
+             496.86,187.74 496.65,189.79 496.67,191.83
+             496.70,195.72 496.87,199.61 496.98,203.50
+             496.84,203.50 496.70,203.51 496.56,203.51
+             495.41,197.24 495.16,190.89 495.41,184.54
+             495.66,178.25 494.43,172.51 490.25,167.52
+             489.97,167.19 489.70,166.86 489.42,166.54
+             489.42,166.54 489.42,166.54 489.42,166.54
+             489.28,166.37 489.13,166.22 488.98,166.06
+             488.98,166.06 485.83,162.57 485.83,162.57
+             484.44,161.59 483.21,160.69 481.95,159.83
+             481.95,159.83 479.55,157.58 479.55,157.58
+             479.48,157.48 479.39,157.39 479.28,157.33
+             479.28,157.33 479.26,157.31 479.26,157.31
+             479.26,157.31 479.26,157.31 479.26,157.31
+             478.94,157.14 478.48,157.12 477.87,157.26
+             476.81,157.52 475.82,158.12 474.88,158.68
+             473.83,159.30 473.62,160.29 474.12,161.32
+             474.66,162.43 475.26,163.53 475.99,164.53
+             477.34,166.40 478.72,168.21 479.43,170.45
+             481.91,178.23 484.47,185.98 486.99,193.75
+             487.73,196.01 488.43,198.29 489.14,200.56
+             489.08,200.58 489.02,200.60 488.96,200.62
+             488.89,200.49 488.80,200.37 488.75,200.23
+             486.15,192.37 483.58,184.50 480.94,176.65
+             479.69,172.95 478.59,169.18 476.07,166.01
+             474.53,164.08 473.02,162.13 471.47,160.21
+             470.39,158.87 469.27,157.56 468.12,156.27
+             467.92,156.04 467.47,155.80 467.22,155.87
+             467.00,155.93 466.77,156.41 466.78,156.70
+             466.83,158.22 466.65,159.84 467.11,161.25
+             467.77,163.29 468.89,165.20 469.84,167.15
+             470.51,168.51 471.42,169.78 471.89,171.20
+             474.38,178.75 477.47,186.07 481.08,193.19
+             484.92,200.78 488.96,208.28 492.89,215.84
+             493.38,216.80 493.97,216.75 494.83,216.36
+             498.72,214.58 502.56,212.64 507.15,213.55"
+        data-elem={ExerciseAttributeValueEnum.FOREARMS}
+        id="path86"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.FOREARMS)}
+        d="M 483.49,158.01
+           C 487.25,161.99 490.63,166.23 493.44,170.86
+             493.60,171.12 493.87,171.31 494.09,171.54
+             494.21,171.47 494.32,171.41 494.44,171.34
+             494.30,162.55 489.77,155.30 485.03,148.12
+             484.87,148.12 484.72,148.13 484.56,148.13
+             484.36,148.53 484.08,148.91 483.99,149.33
+             483.55,151.44 483.18,153.57 482.75,155.68
+             482.57,156.59 482.84,157.32 483.49,158.01"
+        data-elem={ExerciseAttributeValueEnum.FOREARMS}
+        id="path80"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 43.75,147.00
+           C 43.75,147.00 37.50,154.25 37.50,154.25
+             37.50,154.25 34.25,163.00 34.25,163.00
+             34.25,163.00 32.00,173.00 32.00,173.00
+             32.00,173.00 30.75,183.25 30.75,183.25
+             30.75,183.25 27.75,195.75 27.75,195.75
+             27.75,195.75 22.50,207.50 22.50,207.50
+             22.50,207.50 20.00,213.50 20.00,213.50
+             20.00,213.50 22.00,213.75 22.00,213.75
+             22.00,213.75 26.75,212.00 26.75,211.75
+             26.75,211.50 33.25,203.50 33.25,203.50
+             33.25,203.50 39.00,196.25 39.00,196.25
+             39.00,196.25 36.75,213.75 36.75,213.75
+             36.75,213.75 37.50,222.25 37.50,222.25
+             37.50,222.25 37.75,224.25 37.75,224.25
+             37.75,224.25 41.00,221.25 41.00,221.25
+             41.00,221.25 47.75,210.25 47.75,210.25
+             47.75,210.25 54.25,195.75 54.25,195.75
+             54.25,195.75 62.00,173.75 62.00,173.75M 63.75,166.75
+           C 63.75,166.75 66.25,161.25 66.25,161.25
+             66.25,161.25 66.25,153.50 66.25,153.50
+             66.25,153.50 63.00,150.75 63.00,150.75
+             63.00,150.75 59.00,155.50 59.00,155.50
+             59.00,155.50 50.75,166.00 50.75,166.00
+             50.75,166.00 50.00,157.50 50.00,157.50
+             50.00,157.50 48.25,150.25 48.25,150.25
+             48.25,150.25 46.75,148.75 46.75,148.75
+             46.75,148.75 43.50,146.75 43.50,146.75"
+        data-elem={ExerciseAttributeValueEnum.FOREARMS}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 168.50,176.75
+           C 168.50,176.75 171.50,183.25 171.50,183.25
+             171.50,183.25 175.50,195.75 175.50,195.75
+             175.50,195.75 184.50,212.50 184.50,212.50
+             184.50,212.50 191.00,227.00 191.00,227.00
+             191.00,227.00 192.25,220.50 192.25,220.50
+             192.25,220.50 192.25,213.25 192.25,213.25
+             192.25,213.25 191.25,200.00 191.25,200.00
+             191.25,200.00 188.75,193.25 188.75,193.25
+             188.75,193.25 200.00,207.00 200.00,207.00
+             200.00,207.00 205.00,212.00 205.00,212.00
+             205.00,212.00 210.00,213.50 210.00,213.50
+             210.00,213.50 206.50,207.25 206.50,207.25
+             206.50,207.25 201.75,194.50 201.75,194.50
+             201.75,194.50 198.75,183.25 198.75,183.25
+             198.75,183.25 197.25,168.25 197.25,168.25
+             197.25,168.25 192.75,158.50 192.75,158.50
+             192.75,158.50 189.00,151.50 189.00,151.50
+             189.00,151.50 186.50,148.50 186.50,148.50
+             186.50,148.50 183.25,148.50 183.25,148.50
+             183.25,148.50 181.50,152.50 181.50,152.50
+             181.50,152.50 180.50,155.75 180.50,155.75
+             180.50,155.75 180.75,159.25 180.75,159.25
+             180.75,159.25 179.25,167.75 179.25,167.75
+             179.25,167.75 173.25,158.50 173.25,158.50
+             173.25,158.50 167.00,152.25 167.00,152.25
+             167.00,152.25 164.00,152.00 164.00,152.00
+             164.00,152.00 164.00,155.00 164.00,155.00
+             164.00,155.00 165.25,164.00 165.25,164.00
+             165.25,164.00 167.25,175.75 167.25,175.75"
+        data-elem={ExerciseAttributeValueEnum.FOREARMS}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 334.25,147.25
+           C 334.25,147.25 326.75,161.25 326.75,161.25
+             326.75,161.25 324.25,172.50 324.25,172.50
+             324.25,172.50 324.00,180.00 324.00,180.00
+             324.00,180.00 318.75,189.25 318.75,189.25
+             318.75,189.25 315.25,200.50 315.25,200.75
+             315.25,201.00 310.50,214.25 310.50,214.25
+             310.50,214.25 317.25,214.25 317.25,214.25
+             317.25,214.25 325.75,217.00 325.75,217.00
+             325.75,217.00 329.75,218.75 329.75,218.75
+             329.75,218.75 335.25,213.75 335.25,213.75
+             332.22,215.34 348.00,186.50 348.00,186.50
+             348.00,186.50 356.75,167.00 356.75,167.00
+             356.75,167.00 358.25,155.50 358.25,155.50
+             358.25,155.50 355.50,154.50 355.50,154.50
+             355.50,154.50 350.00,156.50 350.00,156.50
+             350.00,156.50 342.75,155.25 342.75,155.25
+             342.75,155.25 340.25,153.25 340.25,153.25
+             340.25,153.25 338.00,146.25 338.00,146.25
+             338.00,146.25 333.75,147.50 333.75,147.50"
+        data-elem={ExerciseAttributeValueEnum.FOREARMS}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 464.50,162.00
+           C 464.50,162.00 485.75,208.75 485.75,208.75
+             485.75,208.75 491.00,215.75 491.00,215.75
+             491.00,215.75 492.00,218.25 492.00,218.25
+             492.00,218.25 498.50,215.75 498.50,215.75
+             498.50,215.75 510.25,214.25 510.25,214.25
+             510.25,214.25 510.25,211.25 510.25,211.25
+             510.25,211.25 506.00,196.50 506.00,196.50
+             506.00,196.50 500.00,182.25 500.00,182.25
+             500.00,182.25 498.50,178.25 498.50,178.25
+             498.50,178.25 497.25,162.75 497.25,162.75
+             497.25,162.75 492.75,153.50 492.75,153.50
+             492.75,153.50 487.50,146.25 487.50,146.25
+             487.50,146.25 485.50,145.00 485.50,145.00
+             485.50,145.00 483.25,150.00 483.25,150.00
+             483.25,150.00 481.25,154.00 481.25,154.00
+             481.25,154.00 472.50,156.75 472.50,156.75
+             472.50,156.75 464.75,155.00 464.75,155.00
+             464.75,155.00 463.75,157.50 463.75,157.50
+             463.75,157.50 463.50,159.50 464.50,162.25"
+        data-elem={ExerciseAttributeValueEnum.FOREARMS}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.FOREARMS)}
+        d="M 184.01,182.16
+           C 182.46,177.62 180.92,173.06 179.01,168.66
+             177.34,164.81 174.77,161.45 172.04,158.24
+             170.81,156.80 169.62,155.31 168.35,153.90
+             168.03,153.55 167.33,153.14 167.04,153.27
+             166.62,153.46 166.28,154.08 166.15,154.58
+             165.35,157.56 165.82,160.46 167.22,163.12
+             169.42,167.29 169.45,171.29 170.98,175.72
+             173.32,182.49 176.47,190.34 179.17,196.97
+             182.25,204.56 186.54,211.29 189.65,218.87
+             189.89,219.45 190.15,220.02 190.40,220.59
+             190.54,220.56 190.68,220.53 190.83,220.50
+             190.89,219.68 191.04,218.87 191.01,218.05
+             190.61,205.71 187.98,193.80 184.01,182.16"
+        data-elem={ExerciseAttributeValueEnum.FOREARMS}
+        id="path154"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.FOREARMS)}
+        d="M 182.33,152.10
+           C 180.80,155.22 180.88,158.50 181.14,161.83
+             182.08,174.13 186.40,185.26 192.66,195.74
+             195.54,200.56 198.76,205.15 202.46,209.38
+             203.03,210.03 203.78,210.53 204.45,211.10
+             204.57,210.98 204.69,210.87 204.80,210.76
+             204.43,210.11 204.02,209.49 203.69,208.81
+             199.12,199.31 196.21,189.39 195.39,178.81
+             194.62,168.95 191.67,159.76 185.65,151.73
+             184.29,149.90 183.34,150.04 182.33,152.10"
+        data-elem={ExerciseAttributeValueEnum.FOREARMS}
+        id="path156"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.FOREARMS)}
+        d="M 62.31,163.12
+           C 63.71,160.46 64.19,157.56 63.39,154.58
+             63.25,154.08 62.91,153.46 62.49,153.27
+             62.20,153.14 61.50,153.55 61.18,153.90
+             59.91,155.31 58.73,156.80 57.49,158.24
+             54.77,161.45 52.19,164.81 50.52,168.66
+             48.61,173.06 47.07,177.62 45.52,182.16
+             41.56,193.80 38.92,205.71 38.52,218.05
+             38.50,218.87 38.64,219.68 38.71,220.50
+             38.85,220.53 38.99,220.56 39.14,220.59
+             39.39,220.02 39.65,219.45 39.88,218.87
+             43.00,211.29 47.28,204.56 50.36,196.97
+             53.06,190.34 56.21,182.49 58.55,175.72
+             60.09,171.29 60.12,167.29 62.31,163.12"
+        data-elem={ExerciseAttributeValueEnum.FOREARMS}
+        id="path144"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.FOREARMS)}
+        d="M 27.08,209.38
+           C 30.78,205.15 33.99,200.56 36.87,195.74
+             43.13,185.26 47.45,174.13 48.40,161.83
+             48.65,158.50 48.73,155.22 47.21,152.10
+             46.20,150.04 45.25,149.90 43.88,151.73
+             37.87,159.76 34.92,168.95 34.15,178.81
+             33.32,189.39 30.42,199.31 25.84,208.81
+             25.52,209.49 25.10,210.11 24.73,210.76
+             24.85,210.87 24.96,210.98 25.08,211.10
+             25.75,210.53 26.50,210.03 27.08,209.38"
+        data-elem={ExerciseAttributeValueEnum.FOREARMS}
+        id="path146"
+        stroke="black"
+        strokeWidth="0"
+      />
+    </g>
+  );
+};

+ 100 - 0
src/features/workout-builder/ui/muscles/glutes-group.tsx

@@ -0,0 +1,100 @@
+import { ExerciseAttributeValueEnum } from "@prisma/client";
+
+export const GlutesGroup = ({
+  onToggleMuscle,
+  getMuscleClasses,
+}: {
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  getMuscleClasses: (muscle: ExerciseAttributeValueEnum) => string;
+}) => {
+  return (
+    <g className="group cursor-pointer" onClick={() => onToggleMuscle(ExerciseAttributeValueEnum.GLUTES)}>
+      <path
+        className="fill-transparent"
+        d="M 394.25,186.00
+           C 394.25,186.00 387.50,187.25 387.50,187.25
+             387.50,187.25 376.00,194.00 376.00,194.00
+             376.00,194.00 370.00,202.75 370.00,202.75
+             370.00,202.75 366.25,207.25 366.25,207.25
+             366.25,207.25 372.75,211.25 372.75,211.25
+             372.75,211.25 377.00,217.25 377.00,217.25
+             377.00,217.25 378.75,228.25 378.75,228.25
+             378.75,228.25 377.25,238.75 377.25,238.75
+             377.25,238.75 377.00,241.25 377.00,241.25
+             377.00,241.25 384.50,240.00 384.50,240.00
+             384.50,240.00 396.25,235.75 396.25,235.75
+             396.25,235.75 405.75,229.50 405.75,229.50
+             405.75,229.50 411.25,225.50 411.25,225.50
+             411.25,225.50 418.75,231.50 418.75,231.50
+             418.75,231.50 429.75,236.25 429.75,236.25
+             429.75,236.25 441.50,240.00 441.50,240.00
+             441.50,240.00 445.75,240.00 445.75,240.00
+             445.75,240.00 445.00,231.75 445.00,231.75
+             445.00,231.75 444.50,223.50 444.50,223.50
+             444.50,223.50 446.00,215.25 446.00,215.25
+             446.00,215.25 451.50,209.75 451.50,209.75
+             451.50,209.75 455.75,208.00 455.75,208.00
+             455.75,208.00 452.00,200.75 452.00,200.75
+             452.00,200.75 448.00,196.75 448.00,196.75
+             448.00,196.75 441.00,190.00 441.00,190.00
+             441.00,190.00 436.75,187.75 436.75,187.75
+             436.75,187.75 429.25,186.00 429.25,186.00
+             429.25,186.00 426.00,185.75 426.00,185.75
+             426.00,185.75 423.50,194.75 423.50,194.75
+             423.50,194.75 418.75,205.25 418.75,205.25
+             418.75,205.25 413.75,211.25 413.75,211.25
+             413.75,211.25 411.00,213.75 411.00,213.75
+             411.00,213.75 408.25,210.75 408.25,210.75
+             408.25,210.75 402.50,201.50 402.50,201.50
+             402.50,201.50 399.50,192.50 399.50,192.50
+             399.50,192.50 397.25,186.25 397.25,186.25
+             397.25,186.25 394.50,185.75 394.50,185.75"
+        data-elem={ExerciseAttributeValueEnum.GLUTES}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.GLUTES)}
+        d="M 424.40,232.59
+           C 429.67,235.69 435.46,237.94 441.58,239.60
+             443.95,240.25 445.11,239.44 444.76,237.31
+             444.43,234.27 443.96,231.23 443.80,228.18
+             443.60,224.00 444.35,219.87 445.72,215.83
+             446.63,213.13 448.53,211.05 451.46,209.66
+             453.26,208.80 453.59,208.14 452.95,206.57
+             450.74,201.11 447.74,196.03 442.81,191.94
+             439.51,189.20 435.63,187.30 430.95,186.71
+             428.73,186.43 427.74,186.99 427.22,188.85
+             424.62,198.20 419.82,206.79 413.60,214.80
+             411.72,217.20 411.67,219.22 412.98,221.68
+             415.46,226.35 419.58,229.74 424.40,232.59"
+        data-elem={ExerciseAttributeValueEnum.GLUTES}
+        id="path66"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.GLUTES)}
+        d="M 395.62,188.85
+           C 395.10,186.99 394.11,186.43 391.89,186.71
+             387.21,187.30 383.33,189.20 380.03,191.94
+             375.10,196.03 372.10,201.11 369.89,206.57
+             369.25,208.14 369.58,208.80 371.38,209.66
+             374.31,211.05 376.21,213.13 377.12,215.83
+             378.49,219.87 379.24,224.00 379.04,228.18
+             378.88,231.23 378.41,234.27 378.08,237.31
+             377.73,239.44 378.89,240.25 381.26,239.60
+             387.38,237.94 393.17,235.69 398.44,232.59
+             403.26,229.74 407.38,226.35 409.86,221.68
+             411.17,219.22 411.12,217.20 409.24,214.80
+             403.02,206.79 398.22,198.20 395.62,188.85"
+        data-elem={ExerciseAttributeValueEnum.GLUTES}
+        id="path42"
+        stroke="black"
+        strokeWidth="0"
+      />
+    </g>
+  );
+};

+ 262 - 0
src/features/workout-builder/ui/muscles/hamstrings-group.tsx

@@ -0,0 +1,262 @@
+import { ExerciseAttributeValueEnum } from "@prisma/client";
+
+export const HamstringsGroup = ({
+  onToggleMuscle,
+  getMuscleClasses,
+}: {
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  getMuscleClasses: (muscle: ExerciseAttributeValueEnum) => string;
+}) => {
+  return (
+    <g className="group cursor-pointer" onClick={() => onToggleMuscle(ExerciseAttributeValueEnum.HAMSTRINGS)}>
+      <path
+        className="fill-transparent"
+        d="M 365.50,209.50
+           C 365.50,209.50 370.00,210.00 370.00,210.00
+             370.00,210.00 375.00,213.50 375.00,213.50
+             375.00,213.50 377.50,219.25 377.50,219.25
+             377.50,219.25 377.50,229.25 377.50,229.25
+             377.50,229.25 377.00,237.25 377.00,237.25
+             377.00,237.25 377.00,239.75 377.00,239.75
+             377.00,239.75 382.00,239.75 382.00,239.75
+             382.00,239.75 389.25,238.75 389.25,238.75
+             389.25,238.75 400.50,233.25 400.50,233.25
+             400.50,233.25 406.50,230.25 406.50,230.25
+             406.50,230.25 408.50,229.25 408.50,229.25
+             408.50,229.25 408.75,243.50 408.75,243.50
+             408.75,243.50 410.00,258.00 410.00,258.00
+             410.00,258.00 409.75,272.25 409.75,272.25
+             409.75,272.25 409.75,286.50 409.75,286.50
+             409.75,286.50 408.00,300.50 408.00,300.50
+             408.00,300.50 403.50,318.50 403.50,318.75
+             403.50,319.00 399.00,334.75 399.00,334.75
+             399.00,334.75 393.25,341.25 393.25,341.25
+             393.25,341.25 392.25,331.25 392.25,331.25
+             392.25,331.25 392.25,326.00 392.25,326.00
+             392.25,326.00 391.00,322.25 391.00,322.25
+             391.00,322.25 384.00,327.25 384.00,327.25
+             384.00,327.25 382.00,324.50 382.00,324.50
+             382.00,324.50 379.25,318.75 379.25,318.75
+             379.25,318.75 376.50,321.25 376.50,321.25
+             376.50,321.25 371.00,329.50 371.00,329.50
+             371.00,329.50 369.25,324.00 369.25,324.00
+             369.25,324.00 368.00,306.25 368.00,306.25
+             368.00,306.25 366.75,295.00 366.75,295.00
+             366.75,295.00 363.00,268.50 363.00,268.50
+             363.00,268.50 362.00,246.25 362.00,246.25
+             362.00,246.25 362.25,216.50 362.25,216.50
+             362.25,216.50 364.25,211.75 365.00,209.25"
+        data-elem={ExerciseAttributeValueEnum.HAMSTRINGS}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.HAMSTRINGS)}
+        d="M 441.45,241.64
+           C 440.46,241.28 439.45,240.94 438.44,240.64
+             436.85,240.18 436.23,240.55 436.10,242.07
+             435.85,244.93 435.62,247.81 435.72,250.66
+             435.90,255.66 436.30,260.65 436.66,265.64
+             436.81,267.61 437.17,269.56 437.26,271.53
+             437.59,278.00 437.84,284.47 438.11,290.93
+             438.45,299.17 440.40,307.00 444.28,314.45
+             446.28,318.27 447.81,322.30 449.56,326.23
+             449.65,326.44 449.77,326.63 449.88,326.83
+             450.01,326.85 450.14,326.86 450.28,326.88
+             450.60,325.93 451.09,325.00 451.21,324.03
+             451.51,321.76 451.84,319.46 451.78,317.19
+             451.66,312.62 451.12,308.06 451.05,303.49
+             451.05,303.27 451.05,303.05 451.05,302.83
+             451.05,302.83 453.07,291.65 453.07,291.65
+             453.26,290.74 453.49,289.83 453.62,288.91
+             454.93,279.90 456.51,270.91 457.44,261.87
+             458.22,254.46 458.36,247.00 458.53,239.56
+             458.64,234.72 458.43,229.86 458.12,225.03
+             457.86,221.14 457.32,217.25 456.72,213.38
+             456.38,211.20 454.98,210.62 452.62,211.34
+             450.64,211.95 449.28,213.23 448.21,214.79
+             445.94,218.14 445.41,221.86 445.29,225.66
+             445.12,230.79 446.16,235.77 447.42,240.71
+             447.37,243.31 443.19,242.21 441.45,241.64"
+        data-elem={ExerciseAttributeValueEnum.HAMSTRINGS}
+        id="path74"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.HAMSTRINGS)}
+        d="M 429.00,338.21
+           C 429.23,338.17 429.46,338.13 429.69,338.09
+             429.69,338.09 429.79,327.66 429.79,327.66
+             429.83,326.68 429.94,325.69 429.92,324.71
+             429.88,323.32 430.47,322.23 431.49,321.13
+             434.73,317.60 437.07,313.64 437.94,309.12
+             438.19,307.88 438.03,306.68 437.66,305.53
+             437.66,305.53 437.66,305.53 437.66,305.53
+             437.66,305.53 435.81,287.16 435.81,287.16
+             435.81,287.16 435.81,287.13 435.81,287.13
+             435.82,286.71 435.84,286.29 435.84,285.87
+             435.89,281.30 435.47,276.73 435.16,272.17
+             434.79,266.95 434.36,261.73 433.85,256.52
+             433.43,252.12 433.01,247.71 432.31,243.35
+             431.70,239.54 429.74,236.47 425.50,234.84
+             422.94,233.86 420.36,232.82 418.43,230.88
+             417.71,230.16 416.55,230.62 416.44,231.60
+             416.43,231.77 416.43,231.95 416.45,232.13
+             416.45,232.13 416.46,235.53 416.46,235.53
+             416.43,236.96 415.11,254.53 415.20,255.95
+             415.78,266.09 415.88,279.95 416.44,290.10
+             416.76,295.71 418.39,304.42 420.34,311.87
+             422.59,320.53 423.36,325.91 427.66,335.88
+             428.14,336.65 428.55,337.43 429.00,338.21"
+        data-elem={ExerciseAttributeValueEnum.HAMSTRINGS}
+        id="path70"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.HAMSTRINGS)}
+        d="M 434.82,322.36
+           C 435.93,323.13 436.89,324.09 437.93,324.95
+             438.28,325.24 438.65,325.50 439.19,325.91
+             439.48,324.90 439.65,324.07 439.97,323.29
+             440.65,321.65 441.34,319.99 442.17,318.41
+             442.59,317.62 442.83,316.93 442.40,316.12
+             441.33,314.11 440.26,312.11 439.06,309.86
+             438.81,310.34 438.69,310.50 438.65,310.67
+             437.79,314.07 436.20,317.16 434.26,320.11
+             433.54,321.21 433.74,321.62 434.82,322.36"
+        data-elem={ExerciseAttributeValueEnum.HAMSTRINGS}
+        id="path58"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.HAMSTRINGS)}
+        d="M 406.39,232.13
+           C 406.41,231.95 406.41,231.77 406.40,231.60
+             406.29,230.62 405.13,230.16 404.41,230.88
+             402.47,232.82 399.90,233.86 397.34,234.84
+             393.10,236.47 391.14,239.54 390.53,243.35
+             389.83,247.71 389.41,252.12 388.99,256.52
+             388.48,261.73 388.05,266.95 387.68,272.17
+             387.37,276.73 386.95,281.30 387.00,285.87
+             387.00,286.29 387.02,286.71 387.03,287.13
+             387.03,287.13 387.03,287.16 387.03,287.16
+             387.03,287.16 385.18,305.53 385.18,305.53
+             385.18,305.53 385.18,305.53 385.18,305.53
+             384.81,306.68 384.65,307.88 384.89,309.12
+             385.77,313.64 388.11,317.60 391.35,321.13
+             392.37,322.23 392.96,323.32 392.92,324.71
+             392.90,325.69 393.01,326.68 393.05,327.66
+             393.05,327.66 393.15,338.09 393.15,338.09
+             393.38,338.13 393.61,338.17 393.84,338.21
+             394.29,337.43 394.70,336.65 395.18,335.88
+             399.48,325.91 400.25,320.53 402.50,311.87
+             404.45,304.42 406.08,295.71 406.40,290.10
+             406.96,279.95 407.06,266.09 407.64,255.95
+             407.73,254.53 406.41,236.96 406.38,235.53
+             406.38,235.53 406.39,232.13 406.39,232.13"
+        data-elem={ExerciseAttributeValueEnum.HAMSTRINGS}
+        id="path48"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.HAMSTRINGS)}
+        d="M 383.65,325.91
+           C 384.19,325.50 384.56,325.24 384.91,324.95
+             385.95,324.09 386.91,323.13 388.02,322.36
+             389.10,321.62 389.30,321.21 388.58,320.11
+             386.64,317.16 385.05,314.07 384.19,310.67
+             384.15,310.50 384.03,310.34 383.78,309.86
+             382.58,312.11 381.51,314.11 380.44,316.12
+             380.01,316.93 380.25,317.62 380.67,318.41
+             381.50,319.99 382.19,321.65 382.87,323.29
+             383.19,324.07 383.36,324.90 383.65,325.91"
+        data-elem={ExerciseAttributeValueEnum.HAMSTRINGS}
+        id="path40"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.HAMSTRINGS)}
+        d="M 377.55,225.66
+           C 377.43,221.86 376.90,218.14 374.63,214.79
+             373.56,213.23 372.20,211.95 370.22,211.34
+             367.86,210.62 366.46,211.20 366.12,213.38
+             365.52,217.25 364.98,221.14 364.72,225.03
+             364.41,229.86 364.20,234.72 364.31,239.56
+             364.48,247.00 364.62,254.46 365.39,261.87
+             366.33,270.91 367.91,279.90 369.22,288.91
+             369.35,289.83 369.58,290.74 369.77,291.65
+             369.77,291.65 371.79,302.83 371.79,302.83
+             371.79,303.05 371.79,303.27 371.79,303.49
+             371.72,308.06 371.18,312.62 371.06,317.19
+             371.00,319.46 371.33,321.76 371.63,324.03
+             371.75,325.00 372.24,325.93 372.56,326.88
+             372.70,326.86 372.83,326.85 372.96,326.83
+             373.07,326.63 373.19,326.44 373.28,326.23
+             375.03,322.30 376.56,318.27 378.55,314.45
+             382.44,307.00 384.39,299.17 384.73,290.93
+             385.00,284.47 385.25,278.00 385.58,271.53
+             385.67,269.56 386.03,267.61 386.18,265.64
+             386.53,260.65 386.94,255.66 387.12,250.66
+             387.22,247.81 386.99,244.93 386.74,242.07
+             386.61,240.55 385.99,240.18 384.40,240.64
+             383.39,240.94 382.38,241.28 381.39,241.64
+             379.65,242.21 375.47,243.31 375.42,240.71
+             376.68,235.77 377.72,230.79 377.55,225.66"
+        data-elem={ExerciseAttributeValueEnum.HAMSTRINGS}
+        id="path38"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 414.25,228.25
+           C 414.25,228.25 421.50,232.00 421.50,232.00
+             421.50,232.00 437.75,239.75 437.75,239.75
+             437.75,239.75 445.50,240.50 445.50,240.50
+             445.50,240.50 445.00,227.00 445.00,227.00
+             445.00,227.00 446.00,217.00 446.00,217.00
+             446.00,217.00 450.25,210.75 450.25,210.75
+             450.25,210.75 455.25,210.50 455.25,210.50
+             455.25,210.50 457.25,208.75 457.25,208.75
+             457.25,208.75 459.75,211.50 459.75,211.50
+             459.75,211.50 461.00,228.00 461.00,228.00
+             461.00,228.00 461.00,243.75 461.00,243.75
+             461.00,243.75 460.50,261.25 460.50,261.25
+             460.50,261.25 456.75,282.75 456.75,282.75
+             456.75,282.75 453.75,302.50 453.75,302.50
+             453.75,302.50 453.75,321.50 453.75,321.50
+             453.75,321.50 452.00,329.25 452.00,329.25
+             452.00,329.25 447.00,322.25 447.00,322.25
+             447.00,322.25 444.50,318.00 444.50,318.00
+             444.50,318.00 441.75,322.00 441.75,322.00
+             441.75,322.00 439.75,327.75 439.75,327.75
+             439.75,327.75 433.00,322.00 433.00,322.00
+             433.00,322.00 431.50,323.25 431.50,323.25
+             431.50,323.25 430.25,340.00 430.25,340.00
+             430.25,340.00 425.75,338.00 425.75,338.00
+             425.75,338.00 421.25,326.00 421.25,326.00
+             421.25,326.00 418.75,315.00 418.50,315.00
+             418.25,315.00 414.50,295.25 414.50,295.25
+             414.50,295.25 414.25,274.50 414.25,274.50
+             414.25,274.50 414.00,251.50 414.00,251.50
+             414.00,251.50 414.25,237.25 414.25,237.25
+             414.25,237.25 414.75,232.00 414.75,229.25"
+        data-elem={ExerciseAttributeValueEnum.HAMSTRINGS}
+        stroke="black"
+        strokeWidth="0"
+      />
+    </g>
+  );
+};

+ 212 - 0
src/features/workout-builder/ui/muscles/obliques-group.tsx

@@ -0,0 +1,212 @@
+import React from "react";
+import { ExerciseAttributeValueEnum } from "@prisma/client";
+
+export const ObliquesGroup = ({
+  onToggleMuscle,
+  getMuscleClasses,
+}: {
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  getMuscleClasses: (muscle: ExerciseAttributeValueEnum) => string;
+}) => {
+  return (
+    <g className="group cursor-pointer" onClick={() => onToggleMuscle(ExerciseAttributeValueEnum.OBLIQUES)}>
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.OBLIQUES)}
+        d="M 134.28,178.67
+           C 135.80,178.08 137.44,177.63 138.74,176.72
+             142.62,174.02 145.10,170.17 146.78,165.84
+             147.58,163.80 147.29,161.70 146.02,159.83
+             143.83,156.62 141.13,153.89 138.15,151.43
+             137.82,151.16 137.39,151.02 136.74,150.68
+             136.87,151.36 136.92,151.76 137.02,152.15
+             138.19,156.68 138.78,161.29 138.44,165.97
+             138.11,170.47 136.77,174.56 133.37,177.76
+             133.19,177.94 133.06,178.17 132.66,178.69
+             133.43,178.69 133.91,178.81 134.28,178.67"
+        data-elem={ExerciseAttributeValueEnum.OBLIQUES}
+        id="path128"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.OBLIQUES)}
+        d="M 96.36,177.87
+           C 93.31,175.14 91.86,171.59 91.33,167.64
+             90.63,162.39 91.23,157.23 92.57,152.14
+             92.68,151.73 92.71,151.30 92.78,150.88
+             92.69,150.83 92.60,150.78 92.51,150.72
+             92.06,151.03 91.54,151.26 91.17,151.65
+             88.72,154.19 86.19,156.67 83.92,159.37
+             82.10,161.53 81.92,164.15 83.14,166.68
+             84.09,168.66 85.19,170.60 86.47,172.39
+             88.38,175.05 90.74,177.28 93.94,178.36
+             94.81,178.66 95.73,179.06 96.79,178.44
+             96.58,178.17 96.50,177.99 96.36,177.87"
+        data-elem={ExerciseAttributeValueEnum.OBLIQUES}
+        id="path130"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.OBLIQUES)}
+        d="M 133.30,127.21
+           C 134.46,133.05 135.57,138.89 136.92,144.67
+             137.30,146.28 138.27,147.83 139.28,149.17
+             140.60,150.93 142.19,152.50 143.76,154.05
+             146.20,156.46 148.04,159.20 148.93,162.54
+             149.03,162.88 149.17,163.22 149.39,163.82
+             150.71,162.19 151.16,160.53 151.28,158.82
+             151.28,158.82 152.05,150.83 152.05,150.83
+             152.19,149.95 152.36,149.07 152.47,148.18
+             153.20,142.15 153.30,136.10 152.92,130.04
+             152.72,126.77 152.45,123.50 152.14,120.24
+             152.01,118.81 151.55,118.53 150.26,119.02
+             150.26,119.02 135.99,124.40 135.99,124.40
+             135.99,124.40 135.99,124.41 135.99,124.41
+             135.78,124.42 135.56,124.44 135.32,124.48
+             133.82,124.70 133.01,125.72 133.30,127.21"
+        data-elem={ExerciseAttributeValueEnum.OBLIQUES}
+        id="path192"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.OBLIQUES)}
+        d="M 79.63,119.11
+           C 79.59,119.09 79.56,119.08 79.52,119.06
+             79.52,119.06 79.39,119.02 79.39,119.02
+             79.39,119.02 79.39,119.02 79.39,119.02
+             77.87,118.42 77.56,119.01 77.32,121.30
+             76.60,128.01 76.33,134.74 76.69,141.49
+             76.83,144.18 77.31,147.83 77.60,150.78
+             77.60,150.78 77.60,150.83 77.60,150.83
+             77.60,150.83 78.30,158.17 78.30,158.17
+             78.30,158.23 78.30,158.29 78.30,158.36
+             78.33,160.24 78.75,162.03 80.08,163.65
+             80.28,163.40 80.39,163.33 80.42,163.23
+             80.55,162.88 80.67,162.51 80.78,162.15
+             81.49,159.74 82.57,157.54 84.32,155.70
+             85.82,154.13 87.32,152.56 88.81,150.98
+             91.12,148.51 92.82,145.72 93.31,142.29
+             93.42,141.50 93.60,140.72 93.76,139.94
+             94.61,135.79 95.50,131.66 96.28,127.50
+             96.64,125.60 95.80,124.63 93.88,124.42
+             93.80,124.42 93.73,124.42 93.65,124.41
+             93.65,124.41 93.66,124.40 93.66,124.40
+             93.66,124.40 79.63,119.11 79.63,119.11"
+        data-elem={ExerciseAttributeValueEnum.OBLIQUES}
+        id="path194"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 131.50,125.25
+           C 131.50,125.25 135.75,145.25 135.75,145.25
+             135.75,145.25 136.75,154.00 136.75,154.00
+             136.75,154.00 137.00,164.75 137.00,164.75
+             137.00,164.75 136.25,171.75 136.25,171.75
+             136.25,171.75 132.75,176.75 132.75,176.75
+             132.75,176.75 134.75,180.25 134.75,180.25
+             134.75,180.25 133.50,192.00 133.50,192.00
+             133.50,192.00 130.75,202.50 130.75,202.50
+             130.75,202.50 124.75,217.25 124.75,217.25
+             124.75,217.25 123.25,220.50 123.25,220.50
+             123.25,220.50 132.00,217.25 132.00,217.25
+             132.00,217.25 144.75,204.00 144.75,204.00
+             144.75,204.00 151.25,192.75 151.25,192.75
+             151.25,192.75 152.50,184.25 152.50,184.25
+             152.50,184.25 152.00,171.75 152.00,171.75
+             152.00,171.75 151.25,167.00 151.25,167.00
+             151.25,167.00 154.75,158.50 154.75,158.50
+             154.75,158.50 155.25,133.75 155.25,133.75
+             155.25,133.75 154.50,116.50 154.50,116.25
+             154.50,116.00 152.00,117.00 152.00,117.00
+             152.00,117.00 145.75,120.25 145.75,120.25
+             145.75,120.25 138.25,123.50 138.25,123.50
+             138.25,123.50 131.50,125.00 131.50,125.00"
+        data-elem={ExerciseAttributeValueEnum.OBLIQUES}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      {/* front  */}
+      <path
+        className="fill-transparent"
+        d="M 75.00,115.75
+           C 75.00,115.75 74.00,138.50 74.00,138.50
+             74.00,138.50 75.50,151.00 75.50,151.00
+             75.50,151.00 75.75,163.25 75.75,163.25
+             75.75,163.25 78.75,166.50 78.75,166.50
+             78.75,166.50 76.00,179.50 76.00,179.50
+             76.00,179.50 76.00,187.00 76.00,187.00
+             76.00,187.00 77.75,192.00 77.75,192.00
+             77.75,192.00 81.50,197.50 81.50,197.50
+             81.50,197.50 87.25,205.50 87.25,205.50
+             87.25,205.50 94.00,213.50 94.00,213.50
+             94.00,213.50 102.25,219.25 102.25,219.25
+             102.25,219.25 106.00,220.75 106.00,220.75
+             106.00,220.75 101.25,207.00 101.25,207.00
+             101.25,207.00 96.75,194.50 96.75,194.50
+             96.75,194.50 95.00,180.00 94.75,180.00
+             94.50,180.00 96.25,177.25 96.25,177.25
+             96.25,177.25 93.50,170.50 93.50,170.50
+             93.50,170.50 93.25,155.00 93.25,155.00
+             93.25,155.00 94.00,142.75 94.00,142.75
+             94.00,142.75 96.75,127.75 96.75,127.75
+             96.75,127.75 98.50,125.00 98.50,125.00
+             98.50,125.00 80.50,119.00 80.50,119.00
+             80.50,119.00 75.25,115.50 75.25,115.50"
+        data-elem={ExerciseAttributeValueEnum.OBLIQUES}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.OBLIQUES)}
+        d="M 125.27,217.07
+           C 125.09,217.39 125.10,217.82 125.02,218.20
+             125.41,218.20 125.87,218.33 126.20,218.18
+             127.38,217.66 128.62,217.18 129.65,216.44
+             137.46,210.87 143.48,203.73 147.82,195.19
+             149.29,192.30 150.60,189.30 150.80,186.01
+             151.14,180.36 150.16,174.85 148.66,169.42
+             148.53,168.97 148.27,168.57 147.93,167.83
+             147.49,168.64 147.24,169.11 146.99,169.57
+             144.93,173.36 142.29,176.69 138.49,178.77
+             136.30,179.97 135.45,181.45 135.46,183.84
+             135.49,188.83 134.47,193.68 133.09,198.45
+             131.22,204.97 128.54,211.14 125.27,217.07"
+        data-elem={ExerciseAttributeValueEnum.OBLIQUES}
+        id="path112"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.OBLIQUES)}
+        d="M 97.07,214.29
+           C 99.04,215.92 101.02,217.56 103.56,218.25
+             103.88,218.33 104.26,218.19 104.62,218.15
+             104.55,217.83 104.56,217.48 104.41,217.20
+             103.37,215.13 102.21,213.10 101.24,211.00
+             97.13,202.07 94.13,192.84 94.06,182.87
+             94.05,181.21 93.41,180.03 91.92,179.28
+             87.87,177.21 85.11,173.86 82.81,170.05
+             82.45,169.45 82.15,168.80 81.81,168.18
+             81.68,168.18 81.55,168.18 81.41,168.17
+             81.20,168.73 80.92,169.26 80.80,169.83
+             80.19,172.85 79.48,175.86 79.05,178.91
+             78.44,183.21 78.48,187.48 80.18,191.62
+             83.88,200.63 89.61,208.11 97.07,214.29"
+        data-elem={ExerciseAttributeValueEnum.OBLIQUES}
+        id="path114"
+        stroke="black"
+        strokeWidth="0"
+      />
+    </g>
+  );
+};

+ 259 - 0
src/features/workout-builder/ui/muscles/quadriceps-group.tsx

@@ -0,0 +1,259 @@
+import { ExerciseAttributeValueEnum } from "@prisma/client";
+
+export const QuadricepsGroup = ({
+  onToggleMuscle,
+  getMuscleClasses,
+}: {
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  getMuscleClasses: (muscle: ExerciseAttributeValueEnum) => string;
+}) => {
+  return (
+    <g className="group cursor-pointer" onClick={() => onToggleMuscle(ExerciseAttributeValueEnum.QUADRICEPS)}>
+      <path
+        className="fill-transparent"
+        d="M 77.00,190.50
+           C 77.00,190.50 83.75,201.75 83.75,201.75
+             83.75,201.75 88.25,208.75 88.25,208.75
+             88.25,208.75 95.25,214.50 95.25,214.50
+             95.25,214.50 106.75,222.50 106.75,222.50
+             106.75,222.50 112.25,224.50 112.25,224.50
+             112.25,224.50 112.75,239.50 112.75,239.50
+             112.75,239.50 107.75,269.00 107.75,269.00
+             107.75,269.00 104.00,280.75 104.00,280.75
+             104.00,280.75 105.75,298.25 105.75,298.25
+             105.75,298.25 104.50,314.50 104.50,314.50
+             104.50,314.50 99.25,331.25 99.25,331.25
+             99.25,331.25 95.50,336.75 95.50,336.75
+             95.50,336.75 94.25,316.00 94.25,316.00
+             94.25,316.00 90.75,307.75 90.75,307.75
+             90.75,307.75 85.50,315.75 85.50,315.75
+             85.50,315.75 78.00,326.25 78.00,326.25
+             78.00,326.25 75.25,328.75 75.25,328.75
+             75.25,328.75 74.00,303.00 74.00,303.00
+             74.00,303.00 64.75,276.75 64.75,276.75
+             64.75,276.75 64.25,264.25 64.25,264.25
+             64.25,264.25 64.25,248.00 64.25,248.00
+             64.25,248.00 65.75,221.25 65.75,221.25
+             65.75,221.25 69.50,210.75 69.50,210.75
+             69.50,210.75 74.00,198.50 74.00,198.50
+             74.00,198.50 77.00,190.75 77.00,190.75M 118.25,225.00
+           C 118.25,225.00 128.75,219.00 128.75,219.00
+             128.75,219.00 137.25,212.25 137.25,212.25
+             137.25,212.25 145.25,202.00 145.25,202.00
+             145.25,202.00 152.75,190.75 152.75,190.75
+             152.75,190.75 157.25,198.50 157.25,198.50
+             157.25,198.50 162.00,212.25 162.00,212.25
+             162.00,212.25 165.50,229.00 165.50,229.00
+             165.50,229.00 166.50,244.25 166.50,244.25
+             166.50,244.25 167.50,256.25 167.50,256.25
+             167.50,256.25 164.25,273.00 164.25,273.00
+             164.25,273.00 160.50,288.00 160.50,288.00
+             160.50,288.00 157.00,298.75 157.00,298.75
+             157.00,298.75 155.50,303.75 155.50,303.75
+             155.50,303.75 155.50,316.25 155.50,316.25
+             155.50,316.25 155.00,331.00 155.00,331.00
+             155.00,331.00 147.75,319.75 147.75,319.75
+             147.75,319.75 139.50,307.50 139.50,307.50
+             139.50,307.50 138.00,308.75 138.00,308.75
+             138.00,308.75 136.75,316.00 136.75,316.00
+             136.75,316.00 135.75,324.00 135.75,324.00
+             135.75,324.00 134.50,337.50 134.50,337.50
+             134.50,337.50 128.00,324.25 128.00,324.25
+             128.00,324.25 125.50,310.50 125.50,310.50
+             125.50,310.50 125.50,298.25 125.50,298.25
+             125.50,298.25 125.50,282.75 125.50,282.75
+             125.50,282.75 125.75,279.50 125.75,279.50
+             125.75,279.50 120.75,258.75 120.75,258.75
+             120.75,258.75 118.25,247.00 118.25,247.00
+             118.25,247.00 118.25,236.75 118.25,236.75
+             118.25,236.75 118.00,228.75 118.00,228.75
+             118.00,228.75 118.00,224.50 118.00,224.50"
+        data-elem={ExerciseAttributeValueEnum.QUADRICEPS}
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.QUADRICEPS)}
+        d="M 98.39,269.85
+           C 98.33,270.21 98.24,270.57 98.21,270.93
+             97.87,274.80 97.58,278.68 97.20,282.55
+             96.90,285.46 96.66,288.40 96.09,291.27
+             95.09,296.32 93.86,301.31 92.76,306.33
+             92.65,306.84 92.62,307.42 92.77,307.90
+             95.03,314.93 95.42,322.18 95.37,329.48
+             95.36,330.86 95.28,332.24 95.24,333.62
+             95.34,333.63 95.45,333.64 95.55,333.65
+             99.74,323.86 101.95,313.60 102.45,302.95
+             102.99,291.71 101.95,280.64 98.86,269.81
+             98.71,269.82 98.55,269.84 98.39,269.85"
+        data-elem={ExerciseAttributeValueEnum.QUADRICEPS}
+        id="path170"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.QUADRICEPS)}
+        d="M 95.65,269.75
+           C 95.73,264.98 95.58,260.18 94.51,255.53
+             92.85,248.29 90.84,241.13 89.07,233.91
+             86.68,224.21 84.38,214.49 82.04,204.79
+             81.75,203.60 81.43,202.43 81.05,201.27
+             80.97,201.01 80.60,200.84 80.36,200.63
+             80.20,200.90 79.99,201.16 79.88,201.45
+             79.79,201.70 79.80,201.98 79.80,202.25
+             79.80,205.26 79.86,208.27 79.79,211.28
+             79.71,214.97 79.65,218.68 79.36,222.36
+             79.04,226.31 78.40,230.23 78.03,234.17
+             77.30,241.88 76.57,249.59 76.03,257.31
+             75.66,262.48 75.32,267.67 75.48,272.84
+             75.74,281.94 76.41,291.03 76.86,300.13
+             77.09,304.74 77.26,309.35 77.37,313.96
+             77.46,317.76 77.42,321.57 77.44,325.64
+             77.79,325.27 78.01,325.08 78.17,324.84
+             80.70,321.12 83.31,317.46 85.70,313.66
+             87.96,310.08 90.00,306.35 91.28,302.28
+             93.64,294.74 94.44,286.92 95.25,279.11
+             95.58,276.01 95.60,272.87 95.65,269.75"
+        data-elem={ExerciseAttributeValueEnum.QUADRICEPS}
+        id="path172"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.QUADRICEPS)}
+        d="M 108.84,225.24
+           C 106.63,223.43 100.82,220.73 98.71,218.80
+             93.08,213.68 90.27,212.08 86.11,205.66
+             85.16,204.20 84.27,202.70 83.35,201.22
+             83.23,201.24 83.11,201.26 82.99,201.28
+             83.06,202.02 83.11,202.76 83.22,203.48
+             84.36,210.42 86.19,217.18 88.33,223.88
+             93.24,239.25 97.20,254.88 100.81,270.61
+             101.42,273.27 101.95,275.95 102.52,278.62
+             102.83,278.34 102.95,278.05 103.00,277.74
+             103.47,274.88 105.14,269.24 105.53,266.37
+             107.68,256.43 107.79,254.80 108.84,246.48
+             109.82,238.30 110.01,236.87 110.01,232.26
+             110.01,227.97 110.07,226.24 108.84,225.24"
+        data-elem={ExerciseAttributeValueEnum.QUADRICEPS}
+        id="path174"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.QUADRICEPS)}
+        d="M 68.30,275.34
+           C 68.32,275.60 75.63,303.92 75.71,304.19
+             75.94,302.37 73.80,274.89 73.95,266.76
+             74.17,255.40 75.57,245.74 76.61,234.43
+             76.79,232.45 77.08,230.49 77.26,228.52
+             77.65,224.23 78.22,219.94 78.30,215.64
+             78.42,210.12 78.15,204.59 78.00,199.07
+             77.94,197.03 77.76,194.99 77.63,192.95
+             77.50,192.96 77.37,192.96 77.25,192.96
+             77.17,193.24 77.09,193.53 77.02,193.81
+             76.34,196.78 75.80,199.79 74.96,202.72
+             72.10,212.75 68.60,224.48 67.71,234.79
+             67.13,241.61 65.44,249.80 65.76,255.84
+             66.15,262.99 67.13,267.34 68.30,275.34"
+        data-elem={ExerciseAttributeValueEnum.QUADRICEPS}
+        id="path176"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.QUADRICEPS)}
+        d="M 152.52,325.64
+           C 152.54,321.57 152.50,317.76 152.60,313.96
+             152.70,309.35 152.87,304.74 153.10,300.13
+             153.55,291.03 154.23,281.94 154.49,272.84
+             154.64,267.67 154.30,262.48 153.94,257.31
+             153.39,249.59 152.66,241.88 151.93,234.17
+             151.56,230.23 150.92,226.31 150.61,222.36
+             150.32,218.68 150.25,214.97 150.17,211.28
+             150.11,208.27 150.16,205.26 150.16,202.25
+             150.16,201.98 150.17,201.70 150.08,201.45
+             149.98,201.16 149.77,200.90 149.60,200.63
+             149.36,200.84 148.99,201.01 148.91,201.27
+             148.54,202.43 148.21,203.60 147.93,204.79
+             145.58,214.49 143.28,224.21 140.90,233.91
+             139.12,241.13 137.11,248.29 135.45,255.53
+             134.38,260.18 134.23,264.98 134.32,269.75
+             134.37,272.87 134.39,276.01 134.71,279.11
+             135.53,286.92 136.33,294.74 138.69,302.28
+             139.96,306.35 142.00,310.08 144.26,313.66
+             146.66,317.46 149.27,321.12 151.79,324.84
+             151.95,325.08 152.18,325.27 152.52,325.64"
+        data-elem={ExerciseAttributeValueEnum.QUADRICEPS}
+        id="path180"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.QUADRICEPS)}
+        d="M 134.73,333.62
+           C 134.68,332.24 134.61,330.86 134.60,329.48
+             134.55,322.18 134.93,314.93 137.19,307.90
+             137.35,307.42 137.32,306.84 137.21,306.33
+             136.10,301.31 134.87,296.32 133.88,291.27
+             133.31,288.40 133.06,285.46 132.77,282.55
+             132.38,278.68 132.10,274.80 131.76,270.93
+             131.73,270.57 131.63,270.21 131.57,269.85
+             131.41,269.84 131.26,269.82 131.10,269.81
+             128.01,280.64 126.98,291.71 127.51,302.95
+             128.01,313.60 130.23,323.86 134.41,333.65
+             134.52,333.64 134.62,333.63 134.73,333.62"
+        data-elem={ExerciseAttributeValueEnum.QUADRICEPS}
+        id="path182"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.QUADRICEPS)}
+        d="M 161.67,275.34
+           C 162.84,267.34 163.81,262.99 164.20,255.84
+             164.53,249.80 162.84,241.61 162.25,234.79
+             161.37,224.48 157.87,212.75 155.00,202.72
+             154.17,199.79 153.62,196.78 152.94,193.81
+             152.88,193.53 152.79,193.24 152.72,192.96
+             152.59,192.96 152.46,192.96 152.34,192.95
+             152.21,194.99 152.02,197.03 151.97,199.07
+             151.82,204.59 151.55,210.12 151.66,215.64
+             151.75,219.94 152.32,224.23 152.71,228.52
+             152.88,230.49 153.18,232.45 153.36,234.43
+             154.39,245.74 155.80,255.40 156.01,266.76
+             156.17,274.89 154.02,302.37 154.26,304.19
+             154.33,303.92 161.64,275.60 161.67,275.34"
+        data-elem={ExerciseAttributeValueEnum.QUADRICEPS}
+        id="path186"
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.QUADRICEPS)}
+        d="M 129.16,270.61
+           C 132.77,254.88 136.72,239.25 141.63,223.88
+             143.77,217.18 145.61,210.42 146.74,203.48
+             146.86,202.76 146.90,202.02 146.98,201.28
+             146.86,201.26 146.74,201.24 146.61,201.22
+             145.70,202.70 144.80,204.20 143.85,205.66
+             139.69,212.08 136.88,213.68 131.26,218.80
+             129.14,220.73 123.33,223.43 121.12,225.24
+             119.90,226.24 119.95,227.97 119.95,232.26
+             119.95,236.87 120.14,238.30 121.12,246.48
+             122.17,254.80 122.29,256.43 124.43,266.37
+             124.83,269.24 126.49,274.88 126.96,277.74
+             127.02,278.05 127.13,278.34 127.45,278.62
+             128.01,275.95 128.55,273.27 129.16,270.61"
+        data-elem={ExerciseAttributeValueEnum.QUADRICEPS}
+        id="path188"
+        stroke="black"
+        strokeWidth="0"
+      />
+    </g>
+  );
+};

+ 188 - 0
src/features/workout-builder/ui/muscles/shoulders-group.tsx

@@ -0,0 +1,188 @@
+import { ExerciseAttributeValueEnum } from "@prisma/client";
+
+export const ShouldersGroup = ({
+  onToggleMuscle,
+  getMuscleClasses,
+}: {
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  getMuscleClasses: (muscle: ExerciseAttributeValueEnum) => string;
+}) => {
+  return (
+    <g className="group cursor-pointer" onClick={() => onToggleMuscle(ExerciseAttributeValueEnum.SHOULDERS)}>
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.SHOULDERS)}
+        d="M 349.30,110.19
+           C 350.53,110.32 351.75,110.47 352.37,110.54
+             358.40,110.63 363.20,108.85 367.19,105.28
+             370.34,102.46 373.12,99.22 376.21,96.32
+             377.79,94.83 379.66,93.63 381.47,92.40
+             382.21,91.90 382.52,91.35 382.46,90.50
+             382.16,85.93 377.78,80.55 373.38,79.53
+             372.52,79.33 371.48,79.36 370.65,79.64
+             364.68,81.65 359.28,84.64 354.93,89.27
+             351.53,92.89 349.96,97.39 349.10,102.16
+             348.71,104.40 348.57,106.68 348.31,108.93
+             348.22,109.69 348.54,110.10 349.30,110.19"
+        data-elem={ExerciseAttributeValueEnum.SHOULDERS}
+        id="path96"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.SHOULDERS)}
+        d="M 439.90,90.50
+           C 439.84,91.35 440.15,91.90 440.89,92.40
+             442.70,93.63 444.57,94.83 446.15,96.32
+             449.24,99.22 452.02,102.46 455.17,105.28
+             459.17,108.85 463.96,110.63 469.99,110.54
+             470.61,110.47 471.83,110.32 473.06,110.19
+             473.82,110.10 474.14,109.69 474.05,108.93
+             473.80,106.68 473.66,104.40 473.26,102.16
+             472.41,97.39 470.83,92.89 467.44,89.27
+             463.08,84.64 457.68,81.65 451.71,79.64
+             450.88,79.36 449.84,79.33 448.98,79.53
+             444.58,80.55 440.20,85.93 439.90,90.50"
+        data-elem={ExerciseAttributeValueEnum.SHOULDERS}
+        id="path88"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 82.75,82.25
+           C 82.75,82.25 75.75,78.50 75.75,78.50
+             75.75,78.50 64.00,80.50 64.00,80.50
+             64.00,80.50 58.25,85.25 58.25,85.25
+             58.25,85.25 53.25,90.75 53.25,90.75
+             53.25,90.75 50.25,98.25 50.25,98.25
+             50.25,98.25 48.50,109.50 48.50,109.50
+             48.50,109.50 48.75,118.50 48.75,118.50
+             48.75,118.50 55.50,114.25 55.50,114.25
+             55.50,114.25 62.50,111.75 62.50,111.75
+             62.50,111.75 71.50,110.50 71.50,110.25
+             71.50,110.00 76.00,105.00 76.00,105.00
+             76.00,105.00 80.75,96.50 80.75,96.50
+             80.75,96.50 85.00,86.25 85.00,86.25
+             85.00,86.25 82.75,82.50 82.75,82.50"
+        data-elem={ExerciseAttributeValueEnum.SHOULDERS}
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className="fill-transparent"
+        d="M 144.25,85.00
+           C 144.25,85.00 150.50,79.25 150.75,79.25
+             151.00,79.25 157.25,78.50 157.25,78.50
+             157.25,78.50 167.00,81.75 167.00,81.75
+             167.00,81.75 172.75,86.75 172.75,86.75
+             172.75,86.75 177.00,94.00 177.00,94.00
+             177.00,94.00 180.50,103.75 180.50,103.75
+             180.50,103.75 180.50,113.25 180.50,113.25
+             180.50,113.25 180.50,117.50 180.50,117.50
+             180.50,117.50 176.25,115.75 176.25,115.75
+             176.25,115.75 166.00,112.25 166.00,112.25
+             166.00,112.25 159.00,111.00 159.00,111.00
+             159.00,111.00 155.25,107.75 155.25,107.75
+             155.25,107.75 149.25,97.00 149.25,97.00
+             149.25,97.00 146.25,90.50 146.25,90.50
+             146.25,90.50 145.00,87.00 145.00,87.00"
+        data-elem={ExerciseAttributeValueEnum.SHOULDERS}
+        stroke="black"
+        strokeWidth="0"
+      />
+      <path
+        className="fill-transparent"
+        d="M 364.00,79.50
+           C 364.00,79.50 357.50,82.75 357.50,82.75
+             357.50,82.75 352.50,87.50 352.50,87.50
+             352.50,87.50 349.25,93.50 349.25,93.50
+             349.25,93.50 346.25,102.25 346.25,102.25
+             346.25,102.25 345.75,109.50 345.75,109.50
+             345.75,109.50 348.25,111.00 348.25,111.00
+             348.25,111.00 354.75,111.25 354.75,111.25
+             354.75,111.25 362.50,110.00 362.50,110.00
+             362.50,110.00 367.75,106.25 367.75,106.25
+             367.75,106.25 373.75,101.00 373.75,101.00
+             373.75,101.00 379.00,95.50 379.00,95.50
+             379.00,95.50 384.25,92.25 384.25,92.25
+             384.25,92.25 382.25,85.50 382.25,85.50
+             382.25,85.50 378.50,80.25 378.50,80.25
+             378.50,80.25 374.25,79.00 374.25,79.00
+             374.25,79.00 369.50,78.25 369.50,78.25
+             369.50,78.25 370.75,78.25 367.25,78.75"
+        data-elem={ExerciseAttributeValueEnum.SHOULDERS}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 453.25,76.50
+           C 453.25,76.50 462.00,80.25 462.00,80.25
+             462.00,80.25 467.75,85.50 467.75,85.50
+             467.75,85.50 473.00,92.50 473.00,92.50
+             473.00,92.50 476.75,103.00 476.75,103.00
+             476.75,103.00 476.75,109.00 476.75,109.00
+             476.75,109.00 475.50,111.00 475.50,111.00
+             475.50,111.00 471.25,111.00 471.25,111.00
+             471.25,111.00 464.50,111.00 464.50,111.00
+             464.50,111.00 457.50,108.00 457.50,108.00
+             457.50,108.00 452.00,102.75 452.00,102.75
+             452.00,102.75 445.25,96.75 445.25,96.75
+             445.25,96.75 440.00,93.25 440.00,93.25
+             440.00,93.25 439.00,90.00 439.00,90.00
+             439.00,90.00 441.00,86.00 441.00,86.00
+             441.00,86.00 443.50,81.75 443.50,81.75
+             443.50,81.75 448.50,78.00 448.50,78.00
+             448.50,78.00 453.75,76.75 453.75,76.75"
+        data-elem={ExerciseAttributeValueEnum.SHOULDERS}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.SHOULDERS)}
+        d="M 145.59,86.76
+           C 146.96,92.75 151.13,99.57 154.22,104.96
+             156.56,109.06 156.74,107.90 160.65,109.64
+             162.67,110.54 168.21,111.43 170.18,112.42
+             171.86,113.27 174.37,114.35 175.95,115.39
+             176.25,115.59 177.13,116.42 177.51,116.76
+             177.60,116.40 177.69,116.23 177.69,116.06
+             177.46,109.59 178.00,102.38 175.66,96.29
+             174.38,92.97 170.21,88.28 167.38,86.15
+             162.73,82.66 159.09,81.86 152.93,80.92
+             152.27,80.82 151.35,80.76 150.79,81.09
+             149.27,82.00 147.83,83.08 146.44,84.18
+             145.66,84.81 145.36,85.71 145.59,86.76"
+        data-elem={ExerciseAttributeValueEnum.SHOULDERS}
+        id="path152"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.SHOULDERS)}
+        d="M 53.58,115.39
+           C 55.17,114.35 57.67,113.27 59.35,112.42
+             61.32,111.43 66.87,110.54 68.88,109.64
+             72.80,107.90 72.98,109.06 75.32,104.96
+             78.40,99.57 82.58,92.75 83.94,86.76
+             84.18,85.71 83.88,84.81 83.10,84.18
+             81.70,83.08 80.27,82.00 78.74,81.09
+             78.18,80.76 77.27,80.82 76.60,80.92
+             70.44,81.86 66.80,82.66 62.16,86.15
+             59.33,88.28 55.15,92.97 53.87,96.29
+             51.53,102.38 52.08,109.59 51.85,116.06
+             51.84,116.23 51.93,116.40 52.02,116.76
+             52.40,116.42 53.28,115.59 53.58,115.39"
+        data-elem={ExerciseAttributeValueEnum.SHOULDERS}
+        id="path142"
+        stroke="black"
+        strokeWidth="0"
+      />
+    </g>
+  );
+};

+ 243 - 0
src/features/workout-builder/ui/muscles/traps-group.tsx

@@ -0,0 +1,243 @@
+import { ExerciseAttributeValueEnum } from "@prisma/client";
+
+export const TrapsGroup = ({
+  onToggleMuscle,
+  getMuscleClasses,
+}: {
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  getMuscleClasses: (muscle: ExerciseAttributeValueEnum) => string;
+}) => {
+  return (
+    <g className="group cursor-pointer" onClick={() => onToggleMuscle(ExerciseAttributeValueEnum.TRAPS)}>
+      <path
+        className="fill-transparent"
+        d="M 85.67,85.05
+           C 85.67,85.05 87.62,84.15 87.62,84.15
+             87.62,84.15 89.87,83.25 89.72,83.25
+             89.57,83.25 92.27,83.10 92.27,83.10
+             92.27,83.10 94.82,83.55 94.82,83.55
+             94.82,83.55 97.52,84.60 97.52,84.60
+             97.52,84.60 100.82,85.35 100.82,85.35
+             100.82,85.35 107.72,87.75 107.72,87.75
+             107.72,87.75 108.62,87.15 108.62,87.15
+             108.62,87.15 110.72,86.40 110.72,86.40
+             110.72,86.40 118.67,86.40 118.67,86.40
+             118.67,86.40 121.07,87.90 121.07,87.90
+             121.07,87.90 124.37,87.15 124.37,87.15
+             124.37,87.15 127.97,85.50 127.97,85.50
+             127.97,85.50 132.77,84.15 132.77,84.15
+             132.77,84.15 136.38,83.10 136.38,83.10
+             136.38,83.10 139.08,82.95 139.08,82.95
+             139.08,82.95 141.18,83.55 141.18,83.55
+             141.18,83.55 144.48,85.65 144.48,85.65
+             144.48,85.65 145.38,83.85 145.38,83.85
+             145.38,83.85 148.08,81.45 148.08,81.45
+             148.08,81.45 152.73,78.90 152.73,78.90
+             152.73,78.90 131.57,69.15 131.57,69.15
+             131.57,69.15 128.87,73.80 128.87,73.80
+             128.87,73.80 124.37,79.50 124.37,79.50
+             124.37,79.50 119.27,85.20 119.27,85.20
+             119.27,85.20 115.22,86.10 115.22,86.10
+             115.22,86.10 111.62,85.20 111.62,85.20
+             111.62,85.20 109.22,83.40 109.22,83.40
+             109.22,83.40 106.37,81.15 106.37,81.15
+             106.37,81.15 102.32,76.20 102.32,76.20
+             102.32,76.20 99.17,71.70 99.17,71.70
+             99.17,71.70 96.32,69.60 96.32,69.60
+             96.32,69.60 76.21,78.45 76.21,78.45
+             76.21,78.45 77.86,79.95 77.86,79.95
+             77.86,79.95 80.42,81.30 80.42,81.30
+             80.42,81.30 82.52,82.65 82.52,82.65
+             82.52,82.65 84.77,85.20 84.77,85.20"
+        data-elem={ExerciseAttributeValueEnum.TRAPS}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.TRAPS)}
+        d="M 424.86,75.58
+           C 421.55,75.92 418.66,76.93 416.95,80.04
+             414.97,83.62 413.60,87.52 413.16,91.51
+             412.49,97.59 412.33,103.74 412.23,109.87
+             412.08,118.66 412.18,127.46 412.19,136.26
+             412.20,137.66 412.33,139.06 412.40,140.46
+             413.72,133.20 418.01,127.57 422.22,121.89
+             424.83,118.35 427.44,114.82 429.97,111.22
+             432.62,107.45 435.01,103.52 436.13,98.99
+             436.99,95.51 437.70,91.98 438.61,88.52
+             439.53,85.05 441.09,81.93 444.29,79.96
+             445.13,79.45 446.07,79.11 446.96,78.68
+             446.97,78.57 446.98,78.46 446.98,78.35
+             444.21,77.57 441.46,76.69 438.66,76.03
+             434.10,74.96 429.48,75.11 424.86,75.58"
+        data-elem={ExerciseAttributeValueEnum.TRAPS}
+        id="path18"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.TRAPS)}
+        d="M 406.94,81.88
+           C 405.66,78.80 403.68,76.45 400.04,75.90
+             395.59,75.23 391.12,74.84 386.69,75.63
+             383.08,76.27 379.54,77.36 375.97,78.25
+             375.97,78.42 375.97,78.59 375.97,78.76
+             381.23,80.32 383.31,84.46 384.56,89.25
+             385.03,91.07 385.37,92.93 385.78,94.78
+             386.65,98.66 387.50,102.60 389.72,105.96
+             393.31,111.39 397.04,116.74 400.84,122.03
+             404.25,126.77 407.77,131.41 409.53,137.08
+             409.90,138.27 410.14,139.50 410.51,140.99
+             410.61,139.02 410.79,137.33 410.77,135.65
+             410.67,122.97 410.48,110.28 410.41,97.59
+             410.37,92.08 409.03,86.89 406.94,81.88"
+        data-elem={ExerciseAttributeValueEnum.TRAPS}
+        id="path16"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className="fill-transparent"
+        d="M 410.93,37.50
+           C 410.93,37.50 416.18,38.40 416.18,38.40
+             416.18,38.40 418.73,39.60 418.73,39.60
+             418.73,39.60 422.18,43.05 422.18,43.05
+             422.18,43.05 424.28,48.60 424.28,48.60
+             424.28,48.60 425.48,55.35 425.48,55.35
+             425.48,55.35 426.53,61.65 426.53,61.65
+             426.53,61.65 428.48,65.55 428.48,65.55
+             428.48,65.55 434.33,69.60 434.33,69.60
+             434.33,69.60 440.18,72.75 440.18,72.75
+             440.18,72.75 446.48,75.00 446.48,75.00
+             446.48,75.00 449.93,75.75 449.93,75.75
+             449.93,75.75 445.28,79.80 445.28,79.80
+             445.28,79.80 441.23,84.30 441.23,84.30
+             441.23,84.30 439.58,87.75 439.58,87.75
+             439.58,87.75 438.23,93.15 438.23,93.15
+             438.23,93.15 436.58,100.35 436.58,100.35
+             436.58,100.35 434.18,105.75 434.18,105.75
+             434.18,105.75 430.28,112.05 430.28,112.05
+             430.28,112.05 420.08,126.30 420.08,126.30
+             420.08,126.30 414.68,136.80 414.68,136.80
+             414.68,136.80 411.23,142.95 411.23,142.95
+             411.23,142.95 407.78,135.60 407.78,135.60
+             407.78,135.60 405.23,130.50 405.23,130.50
+             405.23,130.50 402.68,126.60 402.68,126.60
+             402.68,126.60 398.17,118.95 398.17,118.95
+             398.17,118.95 394.87,114.45 394.87,114.45
+             394.87,114.45 390.37,108.15 390.37,108.15
+             390.37,108.15 387.52,102.15 387.52,102.15
+             387.52,102.15 385.12,94.05 385.12,94.05
+             385.12,94.05 383.02,86.85 383.02,86.85
+             383.02,86.85 380.17,82.65 380.17,82.65
+             380.17,82.65 376.12,79.35 376.12,79.35
+             376.12,79.35 374.32,78.15 374.32,78.15
+             374.32,78.15 372.37,76.05 372.37,76.05
+             372.37,76.05 380.62,74.55 380.62,74.55
+             380.62,74.55 387.22,71.25 387.22,71.25
+             387.22,71.25 394.42,65.85 394.42,65.85
+             394.42,65.85 396.67,61.50 396.67,61.50
+             396.67,61.50 397.57,57.15 397.57,57.15
+             397.57,57.15 399.82,48.15 399.82,48.15
+             399.82,48.15 400.42,44.40 400.42,44.40
+             400.42,44.40 403.28,40.95 403.28,40.95
+             403.28,40.95 408.08,38.40 408.08,38.40
+             408.08,38.40 410.78,37.80 410.78,37.80"
+        data-elem={ExerciseAttributeValueEnum.TRAPS}
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.TRAPS)}
+        d="M 85.02,84.19
+           C 86.82,83.05 90.21,81.65 92.21,82.21
+             92.23,82.21 92.25,82.22 92.27,82.22
+             93.75,82.66 95.25,83.04 96.74,83.43
+             99.90,84.27 103.08,85.07 106.25,85.88
+             106.95,86.06 107.66,86.23 108.37,86.34
+             108.63,86.37 108.92,86.19 109.19,86.11
+             109.11,85.84 109.10,85.49 108.93,85.30
+             107.66,83.93 106.33,82.62 105.07,81.24
+             102.63,78.57 100.12,75.95 98.64,72.56
+             98.25,71.65 97.57,71.78 96.83,72.13
+             93.52,73.69 90.21,75.24 86.89,76.78
+             86.04,77.18 85.16,77.53 84.06,78.00
+             84.06,78.00 79.16,80.15 79.16,80.15
+             79.16,80.15 84.02,81.63 85.02,84.19"
+        data-elem={ExerciseAttributeValueEnum.TRAPS}
+        id="path200"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.TRAPS)}
+        d="M 130.40,72.56
+           C 128.92,75.95 126.41,78.57 123.97,81.24
+             122.71,82.62 121.38,83.93 120.11,85.30
+             119.94,85.49 119.93,85.84 119.85,86.11
+             120.12,86.19 120.41,86.37 120.67,86.34
+             121.38,86.23 122.09,86.06 122.79,85.88
+             125.96,85.07 129.14,84.27 132.30,83.43
+             133.79,83.04 135.29,82.66 136.77,82.22
+             136.79,82.22 136.80,82.21 136.83,82.21
+             138.83,81.65 142.22,83.05 144.02,84.19
+             145.02,81.63 149.88,80.15 149.88,80.15
+             149.88,80.15 144.98,78.00 144.98,78.00
+             143.88,77.53 143.00,77.18 142.15,76.78
+             138.83,75.24 135.52,73.69 132.21,72.13
+             131.47,71.78 130.79,71.65 130.40,72.56"
+        data-elem={ExerciseAttributeValueEnum.TRAPS}
+        id="path196"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.TRAPS)}
+        d="M 419.29,75.38
+           C 419.29,75.38 424.79,74.06 424.79,74.06
+             424.79,74.06 424.79,74.06 424.79,74.06
+             428.21,74.17 431.63,74.14 435.05,74.19
+             435.22,74.20 435.39,74.11 435.85,74.00
+             435.36,73.69 435.09,73.53 434.82,73.37
+             432.73,72.13 430.62,70.93 428.57,69.64
+             425.94,68.01 424.70,65.57 424.56,62.50
+             424.44,59.85 424.17,57.19 424.06,54.54
+             423.90,50.55 422.75,46.88 420.76,43.45
+             420.58,43.15 420.31,42.90 420.09,42.63
+             419.96,42.67 419.83,42.71 419.71,42.76
+             420.15,47.98 420.60,53.21 421.05,58.46
+             420.96,58.13 420.84,57.82 420.80,57.49
+             420.11,52.46 419.45,47.42 418.72,42.39
+             418.64,41.83 418.26,41.11 417.81,40.84
+             413.99,38.61 410.08,38.57 406.09,40.49
+             404.91,41.06 404.55,41.84 404.48,43.11
+             404.20,48.78 403.43,54.39 401.96,59.89
+             401.81,60.47 401.54,61.01 401.33,61.57
+             402.70,53.56 403.58,44.00 402.82,42.59
+             402.50,43.02 402.16,43.38 401.92,43.80
+             400.42,46.37 399.44,49.12 399.18,52.09
+             398.84,55.85 398.64,59.62 398.25,63.38
+             397.98,65.90 397.07,68.20 394.81,69.65
+             392.86,70.89 390.86,72.05 388.87,73.23
+             388.53,73.44 388.16,73.62 387.58,73.93
+             388.04,74.07 388.25,74.18 388.45,74.17
+             392.08,74.12 395.71,74.07 399.34,73.99
+             399.34,73.99 399.33,74.00 399.33,74.00
+             399.33,74.00 404.10,75.42 404.10,75.42
+             408.96,79.25 410.94,84.36 411.51,90.45
+             412.37,87.37 412.94,84.65 413.89,82.08
+             414.88,79.39 416.88,77.35 419.29,75.38"
+        data-elem={ExerciseAttributeValueEnum.TRAPS}
+        id="path32"
+        stroke="black"
+        strokeWidth="0"
+      />
+    </g>
+  );
+};

+ 165 - 0
src/features/workout-builder/ui/muscles/triceps-group.tsx

@@ -0,0 +1,165 @@
+import React from "react";
+import { ExerciseAttributeValueEnum } from "@prisma/client";
+
+export const TricepsGroup = ({
+  onToggleMuscle,
+  getMuscleClasses,
+}: {
+  onToggleMuscle: (muscle: ExerciseAttributeValueEnum) => void;
+  getMuscleClasses: (muscle: ExerciseAttributeValueEnum) => string;
+}) => {
+  return (
+    <g className="group cursor-pointer" onClick={() => onToggleMuscle(ExerciseAttributeValueEnum.TRICEPS)}>
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.TRICEPS)}
+        d="M 478.44,132.70
+           C 477.17,132.60 475.86,132.25 474.77,131.75
+             472.83,130.86 471.05,129.76 468.96,128.62
+             468.99,129.09 469.03,129.35 469.03,129.62
+             469.02,131.66 469.21,133.71 468.95,135.73
+             468.64,138.15 467.53,140.35 464.61,141.69
+             464.57,141.72 464.53,141.77 464.49,141.82
+             464.31,141.83 463.98,141.83 463.36,141.77
+             462.16,141.67 460.56,140.30 459.67,139.45
+             459.46,139.24 459.25,139.02 459.04,138.81
+             459.02,138.79 459.01,138.78 459.01,138.78
+             459.01,138.78 459.02,138.79 459.02,138.79
+             458.42,138.20 457.82,137.61 457.24,137.01
+             457.12,137.06 457.00,137.12 456.88,137.18
+             456.94,137.39 456.98,137.61 457.09,137.81
+             459.43,142.05 461.66,146.33 464.22,150.51
+             465.11,151.97 466.74,153.23 468.22,154.47
+             468.66,154.84 469.71,154.83 470.47,155.00
+             470.47,155.00 474.13,155.27 474.13,155.27
+             474.54,155.34 475.01,155.25 475.55,155.06
+             477.12,154.50 478.73,153.95 480.39,153.63
+             481.50,153.43 482.01,153.04 482.10,152.23
+             482.37,149.83 482.84,147.43 482.80,145.04
+             482.73,141.31 482.10,137.61 480.56,134.07
+             480.20,133.25 479.68,132.80 478.44,132.70"
+        data-elem={ExerciseAttributeValueEnum.TRICEPS}
+        fill="#757575"
+        id="path78"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      {/* Path 82 */}
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.TRICEPS)}
+        d="M 466.43,137.75
+           C 466.50,137.55 466.56,137.34 466.58,137.14
+             466.79,135.14 466.99,133.14 467.13,131.75
+             466.82,129.82 466.57,128.54 466.41,127.25
+             465.53,120.08 461.16,114.46 456.77,108.87
+             456.41,108.40 455.41,108.13 454.74,108.19
+             454.37,108.23 454.05,109.10 453.78,109.64
+             453.64,109.93 453.63,110.30 453.63,110.63
+             453.65,115.00 453.56,119.37 453.74,123.73
+             454.00,129.73 456.89,134.72 461.26,139.01
+             463.57,141.28 465.45,140.75 466.43,137.75"
+        data-elem={ExerciseAttributeValueEnum.TRICEPS}
+        fill="#757575"
+        id="path82"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      {/* Path 84 */}
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.TRICEPS)}
+        d="M 465.31,111.50
+           C 464.02,111.23 462.74,110.93 461.05,110.56
+             461.36,111.45 461.48,112.00 461.74,112.50
+             463.17,115.34 464.82,118.12 466.05,121.01
+             467.83,125.22 471.46,128.13 475.39,130.86
+             477.62,132.42 479.64,131.80 480.31,129.45
+             480.47,128.91 480.61,128.33 480.52,127.79
+             480.15,125.50 479.92,123.17 479.22,120.94
+             478.34,118.21 477.07,115.56 475.92,112.89
+             475.60,112.16 475.11,111.53 473.87,111.81
+             470.99,112.47 468.13,112.09 465.31,111.50"
+        data-elem={ExerciseAttributeValueEnum.TRICEPS}
+        fill="#757575"
+        id="path84"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      {/* Path 98 */}
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.TRICEPS)}
+        d="M 368.73,110.63
+           C 368.73,110.30 368.72,109.93 368.58,109.64
+             368.32,109.10 367.99,108.23 367.62,108.19
+             366.96,108.13 365.95,108.40 365.59,108.87
+             361.20,114.46 356.83,120.08 355.95,127.25
+             355.79,128.54 355.54,129.82 355.23,131.75
+             355.37,133.14 355.57,135.14 355.78,137.14
+             355.80,137.34 355.86,137.55 355.93,137.75
+             356.91,140.75 358.79,141.28 361.10,139.01
+             365.47,134.72 368.36,129.73 368.62,123.73
+             368.80,119.37 368.71,115.00 368.73,110.63"
+        data-elem={ExerciseAttributeValueEnum.TRICEPS}
+        fill="#757575"
+        id="path98"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.TRICEPS)}
+        d="M 341.97,153.63
+           C 343.63,153.95 345.24,154.50 346.81,155.06
+             347.35,155.25 347.82,155.34 348.23,155.27
+             348.23,155.27 351.89,155.00 351.89,155.00
+             352.66,154.83 353.70,154.84 354.14,154.47
+             355.62,153.23 357.25,151.97 358.14,150.51
+             360.70,146.33 362.93,142.05 365.27,137.81
+             365.38,137.61 365.42,137.39 365.49,137.18
+             365.36,137.12 365.24,137.06 365.12,137.01
+             364.54,137.61 363.94,138.20 363.34,138.79
+             363.34,138.79 363.35,138.78 363.35,138.78
+             363.35,138.78 363.34,138.79 363.33,138.81
+             363.11,139.02 362.90,139.24 362.69,139.45
+             361.80,140.30 360.20,141.67 359.00,141.77
+             358.38,141.83 358.05,141.83 357.88,141.82
+             357.84,141.77 357.79,141.72 357.75,141.69
+             354.83,140.35 353.72,138.15 353.41,135.73
+             353.15,133.71 353.34,131.66 353.33,129.62
+             353.33,129.35 353.37,129.09 353.40,128.62
+             351.31,129.76 349.53,130.86 347.60,131.75
+             346.50,132.25 345.19,132.60 343.92,132.70
+             342.68,132.80 342.16,133.25 341.80,134.07
+             340.26,137.61 339.63,141.31 339.56,145.04
+             339.52,147.43 340.00,149.83 340.26,152.23
+             340.35,153.04 340.86,153.43 341.97,153.63"
+        data-elem={ExerciseAttributeValueEnum.TRICEPS}
+        fill="#757575"
+        id="path100"
+        stroke="black"
+        strokeWidth="0"
+      />
+
+      <path
+        className={getMuscleClasses(ExerciseAttributeValueEnum.TRICEPS)}
+        d="M 346.98,130.86
+           C 350.90,128.13 354.53,125.22 356.32,121.01
+             357.54,118.12 359.19,115.34 360.62,112.50
+             360.88,112.00 361.00,111.45 361.31,110.56
+             359.62,110.93 358.34,111.23 357.05,111.50
+             354.23,112.09 351.37,112.47 348.49,111.81
+             347.26,111.53 346.76,112.16 346.44,112.89
+             345.29,115.56 344.01,118.21 343.15,120.94
+             342.44,123.17 342.21,125.50 341.84,127.79
+             341.75,128.33 341.89,128.91 342.05,129.45
+             342.72,131.80 344.74,132.42 346.98,130.86"
+        data-elem={ExerciseAttributeValueEnum.TRICEPS}
+        fill="#757575"
+        id="path102"
+        stroke="black"
+        strokeWidth="0"
+      />
+    </g>
+  );
+};

+ 27 - 24
src/features/workout-builder/ui/workout-stepper.tsx

@@ -8,6 +8,7 @@ import { Button } from "@/components/ui/button";
 import { StepperStepProps } from "../types";
 import { useWorkoutStepper } from "../model/use-workout-stepper";
 import { StepperHeader } from "./stepper-header";
+import { MuscleSelection } from "./muscle-selection";
 import { EquipmentSelection } from "./equipment-selection";
 
 function NavigationFooter({
@@ -17,6 +18,7 @@ function NavigationFooter({
   onPrevious,
   onNext,
   selectedEquipment,
+  selectedMuscles,
 }: {
   currentStep: number;
   totalSteps: number;
@@ -24,6 +26,7 @@ function NavigationFooter({
   onPrevious: () => void;
   onNext: () => void;
   selectedEquipment: any[];
+  selectedMuscles: any[];
 }) {
   const t = useI18n();
   const isFirstStep = currentStep === 1;
@@ -40,10 +43,7 @@ function NavigationFooter({
               <div className="flex items-center gap-2 text-sm">
                 <Zap className="h-4 w-4 text-emerald-500" />
                 <span className="font-medium text-slate-700 dark:text-slate-300">
-                  {selectedEquipment.length}{" "}
-                  {selectedEquipment.length === 1
-                    ? t("workout_builder.stats.equipment_selected")
-                    : t("workout_builder.stats.equipment_selected_plural")}
+                  {t("workout_builder.stats.equipment_selected", { count: selectedEquipment.length })}
                 </span>
               </div>
             )}
@@ -51,7 +51,7 @@ function NavigationFooter({
               <div className="flex items-center gap-2 text-sm">
                 <CheckCircle className="h-4 w-4 text-blue-500" />
                 <span className="font-medium text-slate-700 dark:text-slate-300">
-                  {t(`workout_builder.steps.${currentStep === 2 ? "muscles" : "exercises"}.title`)}
+                  {t("workout_builder.stats.muscle_selected", { count: selectedMuscles.length })}
                 </span>
               </div>
             )}
@@ -103,10 +103,7 @@ function NavigationFooter({
             <div className="flex items-center gap-2 text-sm">
               <Zap className="h-4 w-4 text-emerald-500" />
               <span className="font-medium text-slate-700 dark:text-slate-300">
-                {selectedEquipment.length}{" "}
-                {selectedEquipment.length === 1
-                  ? t("workout_builder.stats.equipment_selected")
-                  : t("workout_builder.stats.equipment_selected_plural")}
+                {t("workout_builder.stats.equipment_selected", { count: selectedEquipment.length })}
               </span>
             </div>
           )}
@@ -114,7 +111,7 @@ function NavigationFooter({
             <div className="flex items-center gap-2 text-sm">
               <CheckCircle className="h-4 w-4 text-blue-500" />
               <span className="font-medium text-slate-700 dark:text-slate-300">
-                {t(`workout_builder.steps.${currentStep === 2 ? "muscles" : "exercises"}.title`)}
+                {t("workout_builder.stats.muscle_selected", { count: selectedMuscles.length })}
               </span>
             </div>
           )}
@@ -142,8 +139,21 @@ function NavigationFooter({
 
 export function WorkoutStepper() {
   const t = useI18n();
-  const { currentStep, selectedEquipment, nextStep, prevStep, toggleEquipment, clearEquipment, canProceedToStep2, canProceedToStep3 } =
-    useWorkoutStepper();
+  const {
+    currentStep,
+    selectedEquipment,
+    nextStep,
+    prevStep,
+    toggleEquipment,
+    clearEquipment,
+    selectedMuscles,
+    toggleMuscle,
+    canProceedToStep2,
+    canProceedToStep3,
+  } = useWorkoutStepper();
+
+  // Calculer si on peut continuer selon l'étape
+  const canContinue = currentStep === 1 ? canProceedToStep2 : currentStep === 2 ? canProceedToStep3 : false;
 
   // Calculer l'état des étapes avec traductions
   const STEPPER_STEPS: StepperStepProps[] = [
@@ -176,9 +186,6 @@ export function WorkoutStepper() {
     isCompleted: step.stepNumber < currentStep,
   }));
 
-  // Déterminer si on peut continuer
-  const canContinue = (currentStep === 1 && canProceedToStep2) || (currentStep === 2 && canProceedToStep3) || currentStep === 3;
-
   // Rendu du contenu de l'étape actuelle
   const renderStepContent = () => {
     switch (currentStep) {
@@ -187,17 +194,12 @@ export function WorkoutStepper() {
           <EquipmentSelection onClearEquipment={clearEquipment} onToggleEquipment={toggleEquipment} selectedEquipment={selectedEquipment} />
         );
       case 2:
-        return (
-          <div className="text-center py-12">
-            <h2 className="text-2xl font-bold mb-4">{t("workout_builder.selection.muscle_selection_coming_soon")}</h2>
-            <p className="text-muted-foreground">{t("workout_builder.selection.muscle_selection_description")}</p>
-          </div>
-        );
+        return <MuscleSelection onToggleMuscle={toggleMuscle} selectedEquipment={selectedEquipment} selectedMuscles={selectedMuscles} />;
       case 3:
         return (
-          <div className="text-center py-12">
-            <h2 className="text-2xl font-bold mb-4">{t("workout_builder.selection.exercise_selection_coming_soon")}</h2>
-            <p className="text-muted-foreground">{t("workout_builder.selection.exercise_selection_description")}</p>
+          <div className="text-center py-20">
+            <h3 className="text-xl font-semibold mb-4">{t("workout_builder.coming_soon.exercises")}</h3>
+            <p className="text-slate-600 dark:text-slate-400">{t("workout_builder.coming_soon.exercises_description")}</p>
           </div>
         );
       default:
@@ -220,6 +222,7 @@ export function WorkoutStepper() {
         onNext={nextStep}
         onPrevious={prevStep}
         selectedEquipment={selectedEquipment}
+        selectedMuscles={selectedMuscles}
         totalSteps={STEPPER_STEPS.length}
       />
     </div>

+ 28 - 0
src/shared/styles/globals.css

@@ -50,6 +50,34 @@
   --color-accent-red: #cf0026;
 }
 
+@layer components {
+  /* Muscle illustration styles */
+  .muscle-enabled {
+    @apply fill-blue-300 stroke-blue-500 cursor-pointer;
+  }
+
+  .muscle-enabled:hover {
+    @apply fill-blue-400 stroke-blue-600;
+  }
+
+  .muscle-active {
+    @apply fill-emerald-400 stroke-emerald-600;
+    stroke-width: 1 !important;
+  }
+
+  .muscle-active:hover {
+    @apply fill-emerald-500 stroke-emerald-700;
+  }
+
+  .muscle-hover {
+    @apply fill-slate-300 stroke-slate-600;
+  }
+
+  .muscle-loading {
+    @apply opacity-50 animate-pulse;
+  }
+}
+
 .skeleton {
   @apply animate-pulse bg-gray-200 dark:bg-gray-700;
 }

+ 1 - 1
tailwind.config.ts

@@ -52,7 +52,7 @@ const config: Config = {
           DEFAULT: "#171718",
           dark: "#232324",
         },
-        primary: "#3E84F4",
+        primary: "#238BE6",
         green: {
           "100": "#DCFCE7",
           "200": "#D9F9EB",