Kaynağa Gözat

style: update various components to improve layout and styling consistency across the application, including adjustments to padding, margins, and tooltip positioning for better user experience

Mathias 1 ay önce
ebeveyn
işleme
0f78d7f1bf

+ 1 - 1
app/[locale]/layout.tsx

@@ -158,7 +158,7 @@ export default async function RootLayout({ params, children }: RootLayoutProps)
             {/* Main Card Container */}
             <div className="card w-full max-w-3xl min-h-[500px] max-h-[90vh] h-[80vh] bg-white dark:bg-[#232324] shadow-xl border border-base-200 dark:border-gray-800 flex flex-col justify-between overflow-hidden max-sm:rounded-none max-sm:h-full">
               <Header />
-              <div className="flex-1 overflow-auto px-2 sm:px-6 flex flex-col">{children}</div>
+              <div className="flex-1 overflow-auto flex flex-col">{children}</div>
               <Footer />
             </div>
 

+ 1 - 1
app/[locale]/page.tsx

@@ -7,7 +7,7 @@ export default async function HomePage() {
   // const t = await getI18n();
 
   return (
-    <div className="bg-background text-foreground relative flex h-fit flex-col">
+    <div className="bg-background text-foreground relative flex h-fit flex-col h-full">
       <WorkoutStepper />
     </div>
   );

+ 9 - 5
src/features/layout/Footer.tsx

@@ -2,6 +2,7 @@ import { Github, Mail, Twitter } from "lucide-react";
 
 import { getI18n } from "locales/server";
 import { TFunction } from "locales/client";
+import { cn } from "@/shared/lib/utils";
 import { Link } from "@/components/ui/link";
 
 const SOCIAL_LINKS = [
@@ -25,15 +26,15 @@ const SOCIAL_LINKS = [
 const NAVIGATION = (t: TFunction) => [
   { name: t("commons.donate"), href: "https://ko-fi.com/workoutcool" },
   { name: t("commons.about"), href: "/about" },
-  { name: t("commons.privacy"), href: "/legal/privacy" },
+  { name: t("commons.privacy"), href: "/legal/privacy", hideOnMobile: true },
 ];
 
 export const Footer = async () => {
   const t = await getI18n();
 
   return (
-    <footer className="border-t border-base-300 dark:border-gray-800 bg-base-100 dark:bg-black px-2 sm:px-6 py-4 rounded-b-lg">
-      <div className="flex flex-col sm:flex-row justify-between items-center gap-4">
+    <footer className="border-t border-base-300 dark:border-gray-800 bg-base-100 dark:bg-black px-4 sm:px-6 py-4 rounded-b-lg">
+      <div className="flex  sm:flex-row justify-between items-center gap-4">
         {/* Social Icons */}
         <div className="flex gap-2">
           {SOCIAL_LINKS.map(({ href, icon: Icon, label }) => (
@@ -52,9 +53,12 @@ export const Footer = async () => {
 
         {/* Navigation Links */}
         <div className="flex sm:flex-row gap-2 sm:gap-4 text-center text-gray-700 dark:text-gray-300">
-          {NAVIGATION(t).map(({ name, href }) => (
+          {NAVIGATION(t).map(({ name, href, hideOnMobile }) => (
             <Link
-              className="hover:underline hover:text-blue-500 dark:hover:text-blue-400 text-xs sm:text-sm"
+              className={cn(
+                "hover:underline hover:text-blue-500 dark:hover:text-blue-400 text-xs sm:text-sm",
+                hideOnMobile && "hidden sm:block",
+              )}
               href={href}
               key={name}
               size="sm"

+ 3 - 3
src/features/layout/Header.tsx

@@ -29,13 +29,13 @@ export const Header = () => {
       {/* Logo and Title */}
       <div className="navbar-start flex items-center gap-2">
         <Link
-          className="group flex items-center space-x-3 rounded-xl bg-gradient-to-r px-4 py-2 transition-all duration-200 dark:text-gray-200 dark:bg-gray-800"
+          className="group flex items-center space-x-3 rounded-xl bg-gradient-to-r px-2 sm:px-4 py-2 transition-all duration-200 dark:text-gray-200 dark:bg-gray-800"
           href="/"
         >
           <div className="relative flex-none">
             <Image
               alt="workout cool logo"
-              className="h-6 w-6 sm:h-8 sm:w-8 transition-transform duration-200 group-hover:rotate-[20deg] group-hover:scale-110"
+              className="h-10 w-10 sm:h-8 sm:w-8 transition-transform duration-200 group-hover:rotate-[20deg] group-hover:scale-110"
               height={32}
               src={Logo}
               width={32}
@@ -55,7 +55,7 @@ export const Header = () => {
           className="hover:bg-slate-200 dark:hover:bg-gray-800 rounded-full p-2 transition flex"
           href="/"
         >
-          <div className="tooltip" data-tip={t("commons.home")}>
+          <div className="tooltip tooltip-bottom" data-tip={t("commons.home")}>
             <Home className="w-6 h-6 text-blue-500 dark:text-blue-400" />
           </div>
         </Link>

+ 1 - 1
src/features/release-notes/ui/release-notes-dialog.tsx

@@ -18,7 +18,7 @@ export function ReleaseNotesDialog() {
     <Dialog>
       <DialogTrigger asChild>
         <Button aria-label={t("release_notes.release_notes")} className="rounded-full hover:bg-slate-200" size="small" variant="ghost">
-          <div className="tooltip" data-tip={t("commons.changelog")}>
+          <div className="tooltip tooltip-bottom" data-tip={t("commons.changelog")}>
             <Bell className="text-blue-500 dark:text-blue-400 h-6 w-6" />
           </div>
         </Button>

+ 1 - 1
src/features/theme/ThemeToggle.tsx

@@ -19,7 +19,7 @@ export function ThemeToggle() {
       onClick={() => setTheme(resolvedTheme === "light" ? "dark" : "light")}
       variant="ghost"
     >
-      <div className="tooltip" data-tip={resolvedTheme === "light" ? "Dark mode" : "Light mode"}>
+      <div className="tooltip tooltip-bottom" data-tip={resolvedTheme === "light" ? "Dark mode" : "Light mode"}>
         {resolvedTheme === "light" ? (
           <MoonIcon className="text-blue-500 dark:text-blue-400" />
         ) : (

+ 1 - 1
src/features/workout-builder/ui/equipment-selection.tsx

@@ -68,7 +68,7 @@ function EquipmentCard({ equipment, isSelected, onToggle }: EquipmentCardProps)
       )}
       onClick={onToggle}
     >
-      <CardContent className="p-4 h-auto flex flex-col justify-center items-center relative">
+      <CardContent className="p-2 sm:p-4 h-auto flex flex-col justify-center items-center relative">
         <div
           className={cn(
             "absolute top-3 left-3 w-2 h-2 rounded-full transition-colors duration-200",

+ 0 - 12
src/features/workout-builder/ui/exercises-selection.tsx

@@ -4,8 +4,6 @@ import { arrayMove, SortableContext, verticalListSortingStrategy } from "@dnd-ki
 import { restrictToVerticalAxis } from "@dnd-kit/modifiers";
 import { DndContext, closestCenter, PointerSensor, useSensor, useSensors, DragEndEvent } from "@dnd-kit/core";
 
-import { Button } from "@/components/ui/button";
-
 import { useWorkoutStepper } from "../model/use-workout-stepper";
 import { ExerciseListItem } from "./exercise-list-item";
 
@@ -117,16 +115,6 @@ export const ExercisesSelection = ({
               </div>
             </SortableContext>
           </DndContext>
-          <div className="flex items-center justify-center gap-4 mt-8">
-            <Button
-              className="px-8 bg-blue-600 hover:bg-blue-700"
-              disabled={flatExercises.length === 0}
-              onClick={handleStartWorkout}
-              size="large"
-            >
-              Start Workout
-            </Button>
-          </div>
         </div>
       ) : error ? (
         <div className="text-center py-20">

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

@@ -6,7 +6,6 @@
 
 .illustration {
   width: 100%;
-  height: auto;
 }
 
 .illustration path {

+ 1 - 1
src/features/workout-builder/ui/stepper-header.tsx

@@ -91,7 +91,7 @@ function StepperStep({ description, isActive, isCompleted, stepNumber, title }:
 export function StepperHeader({ steps }: StepperHeaderProps) {
   const { resolvedTheme } = useTheme();
   return (
-    <div className={cn("w-full", resolvedTheme === "dark" ? "my-8" : "my-8")}>
+    <div className={cn("w-full my-8 px-2 sm:px-6")}>
       {/* Layout mobile - vertical */}
       <div className="flex flex-col space-y-6 md:hidden">
         {steps.map((step, index) => (

+ 8 - 10
src/features/workout-builder/ui/workout-stepper-footer.tsx

@@ -10,6 +10,7 @@ export function WorkoutBuilderFooter({
   canContinue,
   onPrevious,
   onNext,
+  onStartWorkout,
   selectedEquipment,
   selectedMuscles,
 }: {
@@ -18,6 +19,7 @@ export function WorkoutBuilderFooter({
   canContinue: boolean;
   onPrevious: VoidFunction;
   onNext: VoidFunction;
+  onStartWorkout?: VoidFunction;
   selectedEquipment: any[];
   selectedMuscles: any[];
 }) {
@@ -28,12 +30,12 @@ export function WorkoutBuilderFooter({
   return (
     <div className="w-full sticky bottom-0 z-10">
       {/* Mobile layout - vertical stack */}
-      <div className="flex flex-col gap-4 ">
+      <div className="flex flex-col gap-4 px-2 sm:px-6 pb-2">
         {/* Center stats on top for mobile */}
         <div className="flex items-center justify-center"></div>
 
         {/* Navigation buttons */}
-        <div className="flex items-center justify-between gap-3 bg-white w-full rounded-sm p-2">
+        <div className="min-h-12 flex items-center justify-between gap-3 bg-white w-full p-0.5 border border-slate-400 dark:border-slate-700 rounded-full">
           {/* Previous button */}
           <Button className="flex-1 rounded-full" disabled={isFirstStep} onClick={onPrevious} size="default" variant="ghost">
             <div className="flex items-center gap-2">
@@ -42,25 +44,21 @@ export function WorkoutBuilderFooter({
             </div>
           </Button>
 
-          {/* Next/Complete button */}
+          {/* Next/Start Workout button */}
           <Button
-            className="flex-1 rounded-full"
+            className="flex-1 rounded-full bg-blue-600 hover:bg-blue-700 min-h-12"
             disabled={!canContinue}
-            onClick={isFinalStep ? () => console.log("Complete workout!") : onNext}
+            onClick={isFinalStep ? () => onStartWorkout?.() : onNext}
             size="default"
             variant="default"
           >
             <div className="flex items-center justify-center gap-2">
-              <span className="font-semibold">
-                {isFinalStep ? t("workout_builder.navigation.complete") : t("workout_builder.navigation.continue")}
-              </span>
+              <span className="font-semibold">{isFinalStep ? "Commencer la séance" : t("workout_builder.navigation.continue")}</span>
               <ArrowRight className="h-4 w-4" />
             </div>
           </Button>
         </div>
       </div>
-
-      {/* Desktop layout - horizontal */}
     </div>
   );
 }

+ 3 - 2
src/features/workout-builder/ui/workout-stepper.tsx

@@ -207,16 +207,17 @@ export function WorkoutStepper() {
   };
 
   return (
-    <div className="w-full max-w-6xl mx-auto">
+    <div className="w-full max-w-6xl mx-auto h-full">
       <StepperHeader steps={steps} />
 
-      <div className="">{renderStepContent()}</div>
+      <div className="px-2 sm:px-6">{renderStepContent()}</div>
 
       <WorkoutBuilderFooter
         canContinue={canContinue}
         currentStep={currentStep}
         onNext={nextStep}
         onPrevious={prevStep}
+        onStartWorkout={handleStartWorkout}
         selectedEquipment={selectedEquipment}
         selectedMuscles={selectedMuscles}
         totalSteps={STEPPER_STEPS.length}

+ 2 - 2
src/features/workout-session/ui/workout-session-header.tsx

@@ -52,8 +52,8 @@ export function WorkoutSessionHeader({
 
   return (
     <>
-      <div className="w-full mb-8">
-        <div className="rounded-xl p-3 bg-slate-50 dark:bg-slate-900/80">
+      <div className="w-full mt-4 mb-8 px-2 sm:px-6">
+        <div className="rounded-xl p-3 bg-slate-50 dark:bg-slate-900/80 border border-slate-200 dark:border-slate-700">
           <div className="flex items-center justify-between mb-4">
             <div className="flex items-center gap-2">
               <div className="w-2 h-2 rounded-full bg-emerald-400 animate-ping"></div>

+ 1 - 1
src/features/workout-session/ui/workout-session-sets.tsx

@@ -84,7 +84,7 @@ export function WorkoutSessionSets({
   };
 
   return (
-    <div className="w-full max-w-3xl mx-auto pb-8">
+    <div className="w-full max-w-3xl mx-auto pb-8 px-2 sm:px-6">
       <ol className="relative border-l-2 ml-2 border-slate-200 dark:border-slate-700">
         {session.exercises.map((ex, idx) => {
           const allSetsCompleted = ex.sets.length > 0 && ex.sets.every((set) => set.completed);

+ 1 - 1
src/widgets/language-selector/language-selector.tsx

@@ -24,7 +24,7 @@ export function LanguageSelector() {
 
   return (
     <div className="dropdown dropdown-end">
-      <div className="tooltip" data-tip={t("commons.change_language")}>
+      <div className="tooltip tooltip-bottom" data-tip={t("commons.change_language")}>
         <div
           className="btn btn-ghost btn-circle h-8 w-8 p-0 text-xl flex items-center justify-center hover:bg-slate-200 border-none dark:hover:bg-gray-800 rounded-full"
           role="button"