2026, next try

This commit is contained in:
Anders Englöf Ytterström 2025-12-26 18:09:17 +01:00
parent 516feae195
commit 8328354ac5
10 changed files with 547 additions and 579 deletions

View file

@ -1,384 +1,112 @@
const cardio = [
{
run_for: [4, 3],
pause_for: 2,
planned_at: "2025-02-05",
completed: false,
completed_at: null,
},
{
run_for: [5, 4],
pause_for: 2,
planned_at: "2025-02-07",
completed: false,
completed_at: null,
},
{
run_for: [6, 5],
pause_for: 2,
planned_at: "2025-02-10",
completed: false,
completed_at: null,
},
{
run_for: [7, 6],
pause_for: 2,
planned_at: "2025-02-12",
completed: false,
completed_at: null,
},
{
run_for: [12],
pause_for: 5,
planned_at: "2025-02-14",
completed: false,
completed_at: null,
},
{
run_for: [7, 6],
pause_for: 2,
planned_at: "2025-02-17",
completed: false,
completed_at: null,
},
{
run_for: [8, 7],
pause_for: 2,
planned_at: "2025-02-19",
completed: false,
completed_at: null,
},
{
run_for: [14],
pause_for: 5,
planned_at: "2025-02-21",
completed: false,
completed_at: null,
},
{
run_for: [8, 7],
pause_for: 2,
planned_at: "2025-02-24",
completed: false,
completed_at: null,
},
{
run_for: [9, 8],
pause_for: 2,
planned_at: "2025-02-26",
completed: false,
completed_at: null,
},
{
run_for: [16],
pause_for: 5,
planned_at: "2025-02-28",
completed: false,
completed_at: null,
},
{
run_for: [9, 8],
pause_for: 2,
planned_at: "2025-03-03",
completed: false,
completed_at: null,
},
{
run_for: [10, 9],
pause_for: 2,
planned_at: "2025-03-05",
completed: false,
completed_at: null,
},
{
run_for: [20],
pause_for: 5,
planned_at: "2025-03-07",
completed: false,
completed_at: null,
},
{
run_for: [10, 9],
pause_for: 2,
planned_at: "2025-03-10",
completed: false,
completed_at: null,
},
{
run_for: [11, 10],
pause_for: 2,
planned_at: "2025-03-12",
completed: false,
completed_at: null,
},
{
run_for: [23],
pause_for: 5,
planned_at: "2025-03-14",
completed: false,
completed_at: null,
},
{
run_for: [11, 10],
pause_for: 2,
planned_at: "2025-03-17",
completed: false,
completed_at: null,
},
{
run_for: [12, 11],
pause_for: 2,
planned_at: "2025-03-19",
completed: false,
completed_at: null,
},
{
run_for: [26],
pause_for: 5,
planned_at: "2025-03-21",
completed: false,
completed_at: null,
},
{
run_for: [12, 11],
pause_for: 2,
planned_at: "2025-03-24",
completed: false,
completed_at: null,
},
{
run_for: [13, 12],
pause_for: 2,
planned_at: "2025-03-26",
completed: false,
completed_at: null,
},
{
run_for: [30],
pause_for: 5,
planned_at: "2025-03-28",
completed: false,
completed_at: null,
},
];
const gym = [ const gym = [
{ {
name: "rehab 1/3", name: "rehab 1/2",
planned_at: "2025-02-02", planned_at: "2025-12-31",
completed: true,
completed_at: "2025-02-02",
},
{
name: "rehab 2/3",
planned_at: "2025-02-04",
completed: false, completed: false,
completed_at: null, completed_at: null,
}, },
{ {
name: "rehab 3/3", name: "rehab 2/2",
planned_at: "2025-02-06", planned_at: "2026-01-02",
completed: false,
completed_at: null,
},
{
name: "A 1:1",
planned_at: "2025-02-09",
completed: false,
completed_at: null,
},
{
name: "A 1:2",
planned_at: "2025-02-11",
completed: false,
completed_at: null,
},
{
name: "A 1:3",
planned_at: "2025-02-13",
completed: false,
completed_at: null,
},
{
name: "A 2:1",
planned_at: "2025-02-16",
completed: false,
completed_at: null,
},
{
name: "A 2:2",
planned_at: "2025-02-18",
completed: false,
completed_at: null,
},
{
name: "A 2:3",
planned_at: "2025-02-20",
completed: false,
completed_at: null,
},
{
name: "A 3:1",
planned_at: "2025-02-23",
completed: false,
completed_at: null,
},
{
name: "A 3:2",
planned_at: "2025-02-25",
completed: false,
completed_at: null,
},
{
name: "A 3:3",
planned_at: "2025-02-27",
completed: false,
completed_at: null,
},
{
name: "A 4:1",
planned_at: "2025-03-02",
completed: false,
completed_at: null,
},
{
name: "A 4:2",
planned_at: "2025-03-04",
completed: false,
completed_at: null,
},
{
name: "A 4:3",
planned_at: "2025-03-06",
completed: false,
completed_at: null,
},
{
name: "B 1:1",
planned_at: "2025-03-09",
completed: false,
completed_at: null,
},
{
name: "B 1:2",
planned_at: "2025-03-11",
completed: false,
completed_at: null,
},
{
name: "B 1:3",
planned_at: "2025-03-13",
completed: false,
completed_at: null,
},
{
name: "B 2:1",
planned_at: "2025-03-16",
completed: false,
completed_at: null,
},
{
name: "B 2:2",
planned_at: "2025-03-18",
completed: false,
completed_at: null,
},
{
name: "B 2:3",
planned_at: "2025-03-20",
completed: false,
completed_at: null,
},
{
name: "B 3:1",
planned_at: "2025-03-23",
completed: false,
completed_at: null,
},
{
name: "B 3:2",
planned_at: "2025-03-25",
completed: false,
completed_at: null,
},
{
name: "B 3:3",
planned_at: "2025-03-27",
completed: false,
completed_at: null,
},
{
name: "B 4:1",
planned_at: "2025-03-30",
completed: false,
completed_at: null,
},
{
name: "B 4:2",
planned_at: "2025-04-01",
completed: false,
completed_at: null,
},
{
name: "B 4:3",
planned_at: "2025-04-03",
completed: false,
completed_at: null,
},
{
name: "C 1:1",
planned_at: "2025-04-06",
completed: false,
completed_at: null,
},
{
name: "C 1:2",
planned_at: "2025-04-08",
completed: false,
completed_at: null,
},
{
name: "C 1:3",
planned_at: "2025-04-10",
completed: false,
completed_at: null,
},
{
name: "C 2:1",
planned_at: "2025-04-13",
completed: false,
completed_at: null,
},
{
name: "C 2:2",
planned_at: "2025-04-15",
completed: false,
completed_at: null,
},
{
name: "C 2:3",
planned_at: "2025-04-17",
completed: false,
completed_at: null,
},
{
name: "C 3:1",
planned_at: "2025-04-20",
completed: false,
completed_at: null,
},
{
name: "C 3:2",
planned_at: "2025-04-22",
completed: false,
completed_at: null,
},
{
name: "C 3:3",
planned_at: "2025-04-24",
completed: false, completed: false,
completed_at: null, completed_at: null,
}, },
{ name: "PLL 1:1", planned_at: "2026-01-05", completed: false, completed_at: null },
{ name: "PLL 1:2", planned_at: "2026-01-06", completed: false, completed_at: null },
{ name: "PLL 1:3", planned_at: "2026-01-07", completed: false, completed_at: null },
{ name: "PLL 1:4", planned_at: "2026-01-09", completed: false, completed_at: null },
{ name: "PLL 2:1", planned_at: "2026-01-12", completed: false, completed_at: null },
{ name: "PLL 2:2", planned_at: "2026-01-13", completed: false, completed_at: null },
{ name: "PLL 2:3", planned_at: "2026-01-14", completed: false, completed_at: null },
{ name: "PLL 2:4", planned_at: "2026-01-16", completed: false, completed_at: null },
{ name: "PLL 3:1", planned_at: "2026-01-19", completed: false, completed_at: null },
{ name: "PLL 3:2", planned_at: "2026-01-20", completed: false, completed_at: null },
{ name: "PLL 3:3", planned_at: "2026-01-21", completed: false, completed_at: null },
{ name: "PLL 3:4", planned_at: "2026-01-23", completed: false, completed_at: null },
{ name: "PLL 4:1", planned_at: "2026-01-26", completed: false, completed_at: null },
{ name: "PLL 4:2", planned_at: "2026-01-27", completed: false, completed_at: null },
{ name: "PLL 4:3", planned_at: "2026-01-28", completed: false, completed_at: null },
{ name: "PLL 4:4", planned_at: "2026-01-30", completed: false, completed_at: null },
{ name: "PLL 5:1", planned_at: "2026-02-02", completed: false, completed_at: null },
{ name: "PLL 5:2", planned_at: "2026-02-03", completed: false, completed_at: null },
{ name: "PLL 5:3", planned_at: "2026-02-04", completed: false, completed_at: null },
{ name: "PLL 5:4", planned_at: "2026-02-06", completed: false, completed_at: null },
{ name: "PLL 6:1", planned_at: "2026-02-09", completed: false, completed_at: null },
{ name: "PLL 6:2", planned_at: "2026-02-10", completed: false, completed_at: null },
{ name: "PLL 6:3", planned_at: "2026-02-11", completed: false, completed_at: null },
{ name: "PLL 6:4", planned_at: "2026-02-13", completed: false, completed_at: null },
{ name: "PLL 1:1", planned_at: "2026-02-16", completed: false, completed_at: null },
{ name: "PLL 1:2", planned_at: "2026-02-17", completed: false, completed_at: null },
{ name: "PLL 1:3", planned_at: "2026-02-18", completed: false, completed_at: null },
{ name: "PLL 1:4", planned_at: "2026-02-20", completed: false, completed_at: null },
{ name: "PLL 2:1", planned_at: "2026-02-23", completed: false, completed_at: null },
{ name: "PLL 2:2", planned_at: "2026-02-24", completed: false, completed_at: null },
{ name: "PLL 2:3", planned_at: "2026-02-25", completed: false, completed_at: null },
{ name: "PLL 2:4", planned_at: "2026-02-27", completed: false, completed_at: null },
{ name: "PLL 3:1", planned_at: "2026-03-02", completed: false, completed_at: null },
{ name: "PLL 3:2", planned_at: "2026-03-03", completed: false, completed_at: null },
{ name: "PLL 3:3", planned_at: "2026-03-04", completed: false, completed_at: null },
{ name: "PLL 3:4", planned_at: "2026-03-06", completed: false, completed_at: null },
{ name: "PLL 4:1", planned_at: "2026-03-09", completed: false, completed_at: null },
{ name: "PLL 4:2", planned_at: "2026-03-10", completed: false, completed_at: null },
{ name: "PLL 4:3", planned_at: "2026-03-11", completed: false, completed_at: null },
{ name: "PLL 4:4", planned_at: "2026-03-13", completed: false, completed_at: null },
{ name: "PLL 5:1", planned_at: "2026-03-16", completed: false, completed_at: null },
{ name: "PLL 5:2", planned_at: "2026-03-17", completed: false, completed_at: null },
{ name: "PLL 5:3", planned_at: "2026-03-18", completed: false, completed_at: null },
{ name: "PLL 5:4", planned_at: "2026-03-20", completed: false, completed_at: null },
{ name: "PLL 6:1", planned_at: "2026-03-23", completed: false, completed_at: null },
{ name: "PLL 6:2", planned_at: "2026-03-24", completed: false, completed_at: null },
{ name: "PLL 6:3", planned_at: "2026-03-25", completed: false, completed_at: null },
{ name: "PLL 6:4", planned_at: "2026-03-27", completed: false, completed_at: null },
{ name: "PLL 1:1", planned_at: "2026-03-30", completed: false, completed_at: null },
{ name: "PLL 1:2", planned_at: "2026-03-31", completed: false, completed_at: null },
{ name: "PLL 1:3", planned_at: "2026-04-01", completed: false, completed_at: null },
{ name: "PLL 1:4", planned_at: "2026-04-03", completed: false, completed_at: null },
{ name: "PLL 2:1", planned_at: "2026-04-06", completed: false, completed_at: null },
{ name: "PLL 2:2", planned_at: "2026-04-07", completed: false, completed_at: null },
{ name: "PLL 2:3", planned_at: "2026-04-08", completed: false, completed_at: null },
{ name: "PLL 2:4", planned_at: "2026-04-10", completed: false, completed_at: null },
{ name: "PLL 3:1", planned_at: "2026-04-13", completed: false, completed_at: null },
{ name: "PLL 3:2", planned_at: "2026-04-14", completed: false, completed_at: null },
{ name: "PLL 3:3", planned_at: "2026-04-15", completed: false, completed_at: null },
{ name: "PLL 3:4", planned_at: "2026-04-17", completed: false, completed_at: null },
{ name: "PLL 4:1", planned_at: "2026-04-20", completed: false, completed_at: null },
{ name: "PLL 4:2", planned_at: "2026-04-21", completed: false, completed_at: null },
{ name: "PLL 4:3", planned_at: "2026-04-22", completed: false, completed_at: null },
{ name: "PLL 4:4", planned_at: "2026-04-24", completed: false, completed_at: null },
{ name: "PLL 5:1", planned_at: "2026-04-27", completed: false, completed_at: null },
{ name: "PLL 5:2", planned_at: "2026-04-28", completed: false, completed_at: null },
{ name: "PLL 5:3", planned_at: "2026-04-29", completed: false, completed_at: null },
{ name: "PLL 5:4", planned_at: "2026-05-01", completed: false, completed_at: null },
{ name: "PLL 6:1", planned_at: "2026-05-04", completed: false, completed_at: null },
{ name: "PLL 6:2", planned_at: "2026-05-05", completed: false, completed_at: null },
{ name: "PLL 6:3", planned_at: "2026-05-06", completed: false, completed_at: null },
{ name: "PLL 6:4", planned_at: "2026-05-08", completed: false, completed_at: null },
{ name: "PLL 1:1", planned_at: "2026-05-11", completed: false, completed_at: null },
{ name: "PLL 1:2", planned_at: "2026-05-12", completed: false, completed_at: null },
{ name: "PLL 1:3", planned_at: "2026-05-13", completed: false, completed_at: null },
{ name: "PLL 1:4", planned_at: "2026-05-15", completed: false, completed_at: null },
{ name: "PLL 2:1", planned_at: "2026-05-18", completed: false, completed_at: null },
{ name: "PLL 2:2", planned_at: "2026-05-19", completed: false, completed_at: null },
{ name: "PLL 2:3", planned_at: "2026-05-20", completed: false, completed_at: null },
{ name: "PLL 2:4", planned_at: "2026-05-22", completed: false, completed_at: null },
{ name: "PLL 3:1", planned_at: "2026-05-25", completed: false, completed_at: null },
{ name: "PLL 3:2", planned_at: "2026-05-26", completed: false, completed_at: null },
{ name: "PLL 3:3", planned_at: "2026-05-27", completed: false, completed_at: null },
{ name: "PLL 3:4", planned_at: "2026-05-29", completed: false, completed_at: null },
{ name: "PLL 4:1", planned_at: "2026-06-01", completed: false, completed_at: null },
{ name: "PLL 4:2", planned_at: "2026-06-02", completed: false, completed_at: null },
{ name: "PLL 4:3", planned_at: "2026-06-03", completed: false, completed_at: null },
{ name: "PLL 4:4", planned_at: "2026-06-05", completed: false, completed_at: null },
{ name: "PLL 5:1", planned_at: "2026-06-08", completed: false, completed_at: null },
{ name: "PLL 5:2", planned_at: "2026-06-09", completed: false, completed_at: null },
{ name: "PLL 5:3", planned_at: "2026-06-10", completed: false, completed_at: null },
{ name: "PLL 5:4", planned_at: "2026-06-12", completed: false, completed_at: null },
{ name: "PLL 6:1", planned_at: "2026-06-15", completed: false, completed_at: null },
{ name: "PLL 6:2", planned_at: "2026-06-16", completed: false, completed_at: null },
{ name: "PLL 6:3", planned_at: "2026-06-18", completed: false, completed_at: null },
{ name: "PLL 6:4", planned_at: "2026-06-20", completed: false, completed_at: null },
]; ];
const fast = [ const fast = [
@ -399,120 +127,349 @@ const fast = [
]; ];
const diet = [ const diet = [
{ date: "2025-02-10", completed: false }, { date: "2026-01-05", completed: false },
{ date: "2025-02-11", completed: false }, { date: "2026-01-06", completed: false },
{ date: "2025-02-12", completed: false }, { date: "2026-01-07", completed: false },
{ date: "2025-02-13", completed: false }, { date: "2026-01-08", completed: false },
{ date: "2025-02-14", completed: false }, { date: "2026-01-09", completed: false },
{ date: "2025-02-15", completed: false }, { date: "2026-01-10", completed: false },
{ date: "2025-02-16", completed: false }, { date: "2026-01-11", completed: false },
{ date: "2025-02-17", completed: false }, { date: "2026-01-12", completed: false },
{ date: "2025-02-18", completed: false }, { date: "2026-01-13", completed: false },
{ date: "2025-02-19", completed: false }, { date: "2026-01-14", completed: false },
{ date: "2025-02-10", completed: false }, { date: "2026-01-15", completed: false },
{ date: "2025-02-21", completed: false }, { date: "2026-01-16", completed: false },
{ date: "2025-02-22", completed: false }, { date: "2026-01-17", completed: false },
{ date: "2025-02-23", completed: false }, { date: "2026-01-18", completed: false },
{ date: "2025-02-24", completed: false }, { date: "2026-01-19", completed: false },
{ date: "2025-02-25", completed: false }, { date: "2026-01-20", completed: false },
{ date: "2025-02-26", completed: false }, { date: "2026-01-21", completed: false },
{ date: "2025-02-27", completed: false }, { date: "2026-01-22", completed: false },
{ date: "2025-02-28", completed: false }, { date: "2026-01-23", completed: false },
{ date: "2025-03-01", completed: false }, { date: "2026-01-24", completed: false },
{ date: "2025-03-02", completed: false }, { date: "2026-01-25", completed: false },
{ date: "2025-03-03", completed: false }, { date: "2026-01-26", completed: false },
{ date: "2025-03-04", excluded: true, because: "Semmeldagen" }, { date: "2026-01-27", completed: false },
{ date: "2025-03-05", completed: false }, { date: "2026-01-28", completed: false },
{ date: "2025-03-06", completed: false }, { date: "2026-01-29", completed: false },
{ date: "2025-03-07", completed: false }, { date: "2026-01-30", completed: false },
{ date: "2025-03-08", completed: false }, { date: "2026-01-31", completed: false },
{ date: "2025-03-09", completed: false }, { date: "2026-02-10", completed: false },
{ date: "2025-03-10", completed: false }, { date: "2026-02-11", completed: false },
{ date: "2025-03-11", completed: false }, { date: "2026-02-12", completed: false },
{ date: "2025-03-12", completed: false }, { date: "2026-02-13", completed: false },
{ date: "2025-03-13", completed: false }, { date: "2026-02-14", completed: false },
{ date: "2025-03-14", completed: false }, { date: "2026-02-15", completed: false },
{ date: "2025-03-15", completed: false }, { date: "2026-02-16", completed: false },
{ date: "2025-03-16", completed: false }, { date: "2026-02-17", completed: false },
{ date: "2025-03-17", completed: false }, { date: "2026-02-18", completed: false },
{ date: "2025-03-18", completed: false }, { date: "2026-02-19", completed: false },
{ date: "2025-03-19", completed: false }, { date: "2026-02-20", completed: false },
{ date: "2025-03-20", completed: false }, { date: "2026-02-21", completed: false },
{ date: "2025-03-21", completed: false }, { date: "2026-02-22", completed: false },
{ date: "2025-03-22", completed: false }, { date: "2026-02-23", completed: false },
{ date: "2025-03-23", completed: false }, { date: "2026-02-24", completed: false },
{ date: "2025-03-24", completed: false }, { date: "2026-02-25", completed: false },
{ date: "2025-03-25", completed: false }, { date: "2026-02-26", completed: false },
{ date: "2025-03-26", completed: false }, { date: "2026-02-27", completed: false },
{ date: "2025-03-27", completed: false }, { date: "2026-02-28", completed: false },
{ date: "2025-03-28", completed: false }, { date: "2026-03-01", completed: false },
{ date: "2025-03-29", excluded: true, because: "Födelsedag" }, { date: "2026-03-02", completed: false },
{ date: "2025-03-30", completed: false }, { date: "2026-03-03", completed: false },
{ date: "2025-03-31", completed: false }, { date: "2026-03-04", completed: false },
{ date: "2025-04-01", completed: false }, { date: "2026-03-05", completed: false },
{ date: "2025-04-02", completed: false }, { date: "2026-03-06", completed: false },
{ date: "2025-04-03", completed: false }, { date: "2026-03-07", completed: false },
{ date: "2025-04-04", completed: false }, { date: "2026-03-08", completed: false },
{ date: "2025-04-05", completed: false }, { date: "2026-03-09", completed: false },
{ date: "2025-04-06", completed: false }, { date: "2026-03-10", completed: false },
{ date: "2025-04-07", completed: false }, { date: "2026-03-11", completed: false },
{ date: "2025-04-08", completed: false }, { date: "2026-03-12", completed: false },
{ date: "2025-04-09", completed: false }, { date: "2026-03-13", completed: false },
{ date: "2025-04-10", completed: false }, { date: "2026-03-14", completed: false },
{ date: "2025-04-11", completed: false }, { date: "2026-03-15", completed: false },
{ date: "2025-04-12", completed: false }, { date: "2026-03-16", completed: false },
{ date: "2025-04-13", completed: false }, { date: "2026-03-17", completed: false },
{ date: "2025-04-14", completed: false }, { date: "2026-03-18", completed: false },
{ date: "2025-04-15", completed: false }, { date: "2026-03-19", completed: false },
{ date: "2025-04-16", completed: false }, { date: "2026-03-20", completed: false },
{ date: "2025-04-17", excluded: true, because: "Påsk" }, { date: "2026-03-21", completed: false },
{ date: "2025-04-18", completed: false }, { date: "2026-03-22", completed: false },
{ date: "2025-04-19", completed: false }, { date: "2026-03-23", completed: false },
{ date: "2025-04-10", completed: false }, { date: "2026-03-24", completed: false },
{ date: "2025-04-21", completed: false }, { date: "2026-03-25", completed: false },
{ date: "2025-04-22", completed: false }, { date: "2026-03-26", completed: false },
{ date: "2025-04-23", completed: false }, { date: "2026-03-27", completed: false },
{ date: "2025-04-24", completed: false }, { date: "2026-03-28", completed: false },
{ date: "2025-04-25", completed: false }, { date: "2026-03-29", completed: false },
{ date: "2025-04-26", completed: false }, { date: "2026-03-30", completed: false },
{ date: "2025-04-27", completed: false }, { date: "2026-03-31", completed: false },
{ date: "2025-04-28", completed: false }, { date: "2026-04-01", completed: false },
{ date: "2025-04-29", completed: false }, { date: "2026-04-02", completed: false },
{ date: "2025-04-30", completed: false }, { date: "2026-04-03", completed: false },
{ date: "2025-05-01", completed: false }, { date: "2026-04-04", completed: false },
{ date: "2025-05-02", completed: false }, { date: "2026-04-05", completed: false },
{ date: "2025-05-03", completed: false }, { date: "2026-04-06", completed: false },
{ date: "2025-05-04", completed: false }, { date: "2026-04-07", completed: false },
{ date: "2025-05-05", completed: false }, { date: "2026-04-08", completed: false },
{ date: "2025-05-06", completed: false }, { date: "2026-04-09", completed: false },
{ date: "2025-05-07", completed: false }, { date: "2026-04-10", completed: false },
{ date: "2025-05-08", completed: false }, { date: "2026-04-11", completed: false },
{ date: "2025-05-09", completed: false }, { date: "2026-04-12", completed: false },
{ date: "2025-05-10", completed: false }, { date: "2026-04-13", completed: false },
{ date: "2025-05-11", completed: false }, { date: "2026-04-14", completed: false },
{ date: "2025-05-12", completed: false }, { date: "2026-04-15", completed: false },
{ date: "2025-05-13", completed: false }, { date: "2026-04-16", completed: false },
{ date: "2025-05-14", completed: false }, { date: "2026-04-17", completed: false },
{ date: "2025-05-15", completed: false }, { date: "2026-04-18", completed: false },
{ date: "2025-05-16", completed: false }, { date: "2026-04-19", completed: false },
{ date: "2025-05-17", completed: false }, { date: "2026-04-20", completed: false },
{ date: "2025-05-18", completed: false }, { date: "2026-04-21", completed: false },
{ date: "2025-05-19", completed: false }, { date: "2026-04-22", completed: false },
{ date: "2025-05-10", completed: false }, { date: "2026-04-23", completed: false },
{ date: "2025-05-21", completed: false }, { date: "2026-04-24", completed: false },
{ date: "2025-05-22", completed: false }, { date: "2026-04-25", completed: false },
{ date: "2025-05-23", completed: false }, { date: "2026-04-26", completed: false },
{ date: "2025-05-24", completed: false }, { date: "2026-04-27", completed: false },
{ date: "2025-05-25", completed: false }, { date: "2026-04-28", completed: false },
{ date: "2025-05-26", completed: false }, { date: "2026-04-29", completed: false },
{ date: "2025-05-27", completed: false }, { date: "2026-04-30", completed: false },
{ date: "2025-05-28", completed: false }, { date: "2026-05-01", completed: false },
{ date: "2025-05-29", completed: false }, { date: "2026-05-02", completed: false },
{ date: "2025-05-30", completed: false }, { date: "2026-05-03", completed: false },
{ date: "2025-05-31", completed: false }, { date: "2026-05-04", completed: false },
{ date: "2026-05-05", completed: false },
{ date: "2026-05-06", completed: false },
{ date: "2026-05-07", completed: false },
{ date: "2026-05-08", completed: false },
{ date: "2026-05-09", completed: false },
{ date: "2026-05-10", completed: false },
{ date: "2026-05-11", completed: false },
{ date: "2026-05-12", completed: false },
{ date: "2026-05-13", completed: false },
{ date: "2026-05-14", completed: false },
{ date: "2026-05-15", completed: false },
{ date: "2026-05-16", completed: false },
{ date: "2026-05-17", completed: false },
{ date: "2026-05-18", completed: false },
{ date: "2026-05-19", completed: false },
{ date: "2026-05-20", completed: false },
{ date: "2026-05-21", completed: false },
{ date: "2026-05-22", completed: false },
{ date: "2026-05-23", completed: false },
{ date: "2026-05-24", completed: false },
{ date: "2026-05-25", completed: false },
{ date: "2026-05-26", completed: false },
{ date: "2026-05-27", completed: false },
{ date: "2026-05-28", completed: false },
{ date: "2026-05-29", completed: false },
{ date: "2026-05-30", completed: false },
{ date: "2026-05-31", completed: false },
{ date: "2026-06-01", completed: false },
{ date: "2026-06-02", completed: false },
{ date: "2026-06-03", completed: false },
{ date: "2026-06-04", completed: false },
{ date: "2026-06-05", completed: false },
{ date: "2026-06-06", completed: false },
{ date: "2026-06-07", completed: false },
{ date: "2026-06-08", completed: false },
{ date: "2026-06-09", completed: false },
{ date: "2026-06-10", completed: false },
{ date: "2026-06-11", completed: false },
{ date: "2026-06-12", completed: false },
{ date: "2026-06-13", completed: false },
{ date: "2026-06-14", completed: false },
{ date: "2026-06-15", completed: false },
{ date: "2026-06-16", completed: false },
{ date: "2026-06-17", completed: false },
{ date: "2026-06-18", completed: false },
{ date: "2026-06-19", completed: false },
{ date: "2026-06-20", completed: false },
{ date: "2026-06-21", completed: false },
{ date: "2026-06-22", completed: false },
{ date: "2026-06-23", completed: false },
{ date: "2026-06-24", completed: false },
{ date: "2026-06-25", completed: false },
{ date: "2026-06-26", completed: false },
{ date: "2026-06-27", completed: false },
{ date: "2026-06-28", completed: false },
{ date: "2026-06-29", completed: false },
{ date: "2026-06-30", completed: false },
]; ];
const walks = [
{ date: "2026-01-05", completed: false },
{ date: "2026-01-06", completed: false },
{ date: "2026-01-07", completed: false },
{ date: "2026-01-08", completed: false },
{ date: "2026-01-09", completed: false },
{ date: "2026-01-10", completed: false },
{ date: "2026-01-11", completed: false },
{ date: "2026-01-12", completed: false },
{ date: "2026-01-13", completed: false },
{ date: "2026-01-14", completed: false },
{ date: "2026-01-15", completed: false },
{ date: "2026-01-16", completed: false },
{ date: "2026-01-17", completed: false },
{ date: "2026-01-18", completed: false },
{ date: "2026-01-19", completed: false },
{ date: "2026-01-20", completed: false },
{ date: "2026-01-21", completed: false },
{ date: "2026-01-22", completed: false },
{ date: "2026-01-23", completed: false },
{ date: "2026-01-24", completed: false },
{ date: "2026-01-25", completed: false },
{ date: "2026-01-26", completed: false },
{ date: "2026-01-27", completed: false },
{ date: "2026-01-28", completed: false },
{ date: "2026-01-29", completed: false },
{ date: "2026-01-30", completed: false },
{ date: "2026-01-31", completed: false },
{ date: "2026-02-10", completed: false },
{ date: "2026-02-11", completed: false },
{ date: "2026-02-12", completed: false },
{ date: "2026-02-13", completed: false },
{ date: "2026-02-14", completed: false },
{ date: "2026-02-15", completed: false },
{ date: "2026-02-16", completed: false },
{ date: "2026-02-17", completed: false },
{ date: "2026-02-18", completed: false },
{ date: "2026-02-19", completed: false },
{ date: "2026-02-20", completed: false },
{ date: "2026-02-21", completed: false },
{ date: "2026-02-22", completed: false },
{ date: "2026-02-23", completed: false },
{ date: "2026-02-24", completed: false },
{ date: "2026-02-25", completed: false },
{ date: "2026-02-26", completed: false },
{ date: "2026-02-27", completed: false },
{ date: "2026-02-28", completed: false },
{ date: "2026-03-01", completed: false },
{ date: "2026-03-02", completed: false },
{ date: "2026-03-03", completed: false },
{ date: "2026-03-04", completed: false },
{ date: "2026-03-05", completed: false },
{ date: "2026-03-06", completed: false },
{ date: "2026-03-07", completed: false },
{ date: "2026-03-08", completed: false },
{ date: "2026-03-09", completed: false },
{ date: "2026-03-10", completed: false },
{ date: "2026-03-11", completed: false },
{ date: "2026-03-12", completed: false },
{ date: "2026-03-13", completed: false },
{ date: "2026-03-14", completed: false },
{ date: "2026-03-15", completed: false },
{ date: "2026-03-16", completed: false },
{ date: "2026-03-17", completed: false },
{ date: "2026-03-18", completed: false },
{ date: "2026-03-19", completed: false },
{ date: "2026-03-20", completed: false },
{ date: "2026-03-21", completed: false },
{ date: "2026-03-22", completed: false },
{ date: "2026-03-23", completed: false },
{ date: "2026-03-24", completed: false },
{ date: "2026-03-25", completed: false },
{ date: "2026-03-26", completed: false },
{ date: "2026-03-27", completed: false },
{ date: "2026-03-28", completed: false },
{ date: "2026-03-29", completed: false },
{ date: "2026-03-30", completed: false },
{ date: "2026-03-31", completed: false },
{ date: "2026-04-01", completed: false },
{ date: "2026-04-02", completed: false },
{ date: "2026-04-03", completed: false },
{ date: "2026-04-04", completed: false },
{ date: "2026-04-05", completed: false },
{ date: "2026-04-06", completed: false },
{ date: "2026-04-07", completed: false },
{ date: "2026-04-08", completed: false },
{ date: "2026-04-09", completed: false },
{ date: "2026-04-10", completed: false },
{ date: "2026-04-11", completed: false },
{ date: "2026-04-12", completed: false },
{ date: "2026-04-13", completed: false },
{ date: "2026-04-14", completed: false },
{ date: "2026-04-15", completed: false },
{ date: "2026-04-16", completed: false },
{ date: "2026-04-17", completed: false },
{ date: "2026-04-18", completed: false },
{ date: "2026-04-19", completed: false },
{ date: "2026-04-20", completed: false },
{ date: "2026-04-21", completed: false },
{ date: "2026-04-22", completed: false },
{ date: "2026-04-23", completed: false },
{ date: "2026-04-24", completed: false },
{ date: "2026-04-25", completed: false },
{ date: "2026-04-26", completed: false },
{ date: "2026-04-27", completed: false },
{ date: "2026-04-28", completed: false },
{ date: "2026-04-29", completed: false },
{ date: "2026-04-30", completed: false },
{ date: "2026-05-01", completed: false },
{ date: "2026-05-02", completed: false },
{ date: "2026-05-03", completed: false },
{ date: "2026-05-04", completed: false },
{ date: "2026-05-05", completed: false },
{ date: "2026-05-06", completed: false },
{ date: "2026-05-07", completed: false },
{ date: "2026-05-08", completed: false },
{ date: "2026-05-09", completed: false },
{ date: "2026-05-10", completed: false },
{ date: "2026-05-11", completed: false },
{ date: "2026-05-12", completed: false },
{ date: "2026-05-13", completed: false },
{ date: "2026-05-14", completed: false },
{ date: "2026-05-15", completed: false },
{ date: "2026-05-16", completed: false },
{ date: "2026-05-17", completed: false },
{ date: "2026-05-18", completed: false },
{ date: "2026-05-19", completed: false },
{ date: "2026-05-20", completed: false },
{ date: "2026-05-21", completed: false },
{ date: "2026-05-22", completed: false },
{ date: "2026-05-23", completed: false },
{ date: "2026-05-24", completed: false },
{ date: "2026-05-25", completed: false },
{ date: "2026-05-26", completed: false },
{ date: "2026-05-27", completed: false },
{ date: "2026-05-28", completed: false },
{ date: "2026-05-29", completed: false },
{ date: "2026-05-30", completed: false },
{ date: "2026-05-31", completed: false },
{ date: "2026-06-01", completed: false },
{ date: "2026-06-02", completed: false },
{ date: "2026-06-03", completed: false },
{ date: "2026-06-04", completed: false },
{ date: "2026-06-05", completed: false },
{ date: "2026-06-06", completed: false },
{ date: "2026-06-07", completed: false },
{ date: "2026-06-08", completed: false },
{ date: "2026-06-09", completed: false },
{ date: "2026-06-10", completed: false },
{ date: "2026-06-11", completed: false },
{ date: "2026-06-12", completed: false },
{ date: "2026-06-13", completed: false },
{ date: "2026-06-14", completed: false },
{ date: "2026-06-15", completed: false },
{ date: "2026-06-16", completed: false },
{ date: "2026-06-17", completed: false },
{ date: "2026-06-18", completed: false },
{ date: "2026-06-19", completed: false },
{ date: "2026-06-20", completed: false },
{ date: "2026-06-21", completed: false },
{ date: "2026-06-22", completed: false },
{ date: "2026-06-23", completed: false },
{ date: "2026-06-24", completed: false },
{ date: "2026-06-25", completed: false },
{ date: "2026-06-26", completed: false },
{ date: "2026-06-27", completed: false },
{ date: "2026-06-28", completed: false },
{ date: "2026-06-29", completed: false },
{ date: "2026-06-30", completed: false },
];
export default { export default {
cardio, walks,
gym, gym,
diet, diet,
fast, fast,

12
package-lock.json generated
View file

@ -84,6 +84,7 @@
"integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==", "integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@ampproject/remapping": "^2.2.0", "@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.26.2", "@babel/code-frame": "^7.26.2",
@ -2401,6 +2402,7 @@
"integrity": "sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==", "integrity": "sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1",
"debug": "^4.4.0", "debug": "^4.4.0",
@ -2474,6 +2476,7 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
"integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
"license": "MIT", "license": "MIT",
"peer": true,
"bin": { "bin": {
"acorn": "bin/acorn" "acorn": "bin/acorn"
}, },
@ -2496,6 +2499,7 @@
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"fast-deep-equal": "^3.1.3", "fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1", "fast-uri": "^3.0.1",
@ -2703,6 +2707,7 @@
} }
], ],
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"caniuse-lite": "^1.0.30001688", "caniuse-lite": "^1.0.30001688",
"electron-to-chromium": "^1.5.73", "electron-to-chromium": "^1.5.73",
@ -4459,6 +4464,7 @@
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"engines": { "engines": {
"node": ">=12" "node": ">=12"
}, },
@ -4511,6 +4517,7 @@
"integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"bin": { "bin": {
"prettier": "bin/prettier.cjs" "prettier": "bin/prettier.cjs"
}, },
@ -5217,6 +5224,7 @@
"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.19.6.tgz", "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.19.6.tgz",
"integrity": "sha512-6ydekB3qyqUal+UhfMjmVOjRGtxysR8vuiMhi2nwuBtPJWnctVlsGspjVFB05qmR+TXI1emuqtZt81c0XiFleA==", "integrity": "sha512-6ydekB3qyqUal+UhfMjmVOjRGtxysR8vuiMhi2nwuBtPJWnctVlsGspjVFB05qmR+TXI1emuqtZt81c0XiFleA==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@ampproject/remapping": "^2.3.0", "@ampproject/remapping": "^2.3.0",
"@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/sourcemap-codec": "^1.5.0",
@ -5308,6 +5316,7 @@
"integrity": "sha512-w8CXxxbFA5zfNsR/i8HZq5bvn18AK0O9jj7hyo1YqkovLxEFa0uP0LCVGZRqiRaKRFxXhELBp8SteeAjEnfeJg==", "integrity": "sha512-w8CXxxbFA5zfNsR/i8HZq5bvn18AK0O9jj7hyo1YqkovLxEFa0uP0LCVGZRqiRaKRFxXhELBp8SteeAjEnfeJg==",
"dev": true, "dev": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"peer": true,
"dependencies": { "dependencies": {
"@jridgewell/source-map": "^0.3.3", "@jridgewell/source-map": "^0.3.3",
"acorn": "^8.8.2", "acorn": "^8.8.2",
@ -5442,6 +5451,7 @@
"integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"bin": { "bin": {
"tsc": "bin/tsc", "tsc": "bin/tsc",
"tsserver": "bin/tsserver" "tsserver": "bin/tsserver"
@ -5584,6 +5594,7 @@
"integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"esbuild": "^0.24.2", "esbuild": "^0.24.2",
"postcss": "^8.4.49", "postcss": "^8.4.49",
@ -5989,6 +6000,7 @@
"integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"bin": { "bin": {
"rollup": "dist/bin/rollup" "rollup": "dist/bin/rollup"
}, },

View file

@ -4,7 +4,7 @@
import { currentView } from "./lib/store"; import { currentView } from "./lib/store";
import Summary from "./lib/Summary.svelte"; import Summary from "./lib/Summary.svelte";
import GymProgress from "./lib/GymProgress.svelte"; import GymProgress from "./lib/GymProgress.svelte";
import CardioProgress from "./lib/CardioProgress.svelte"; import WalksProgress from "./lib/WalksProgress.svelte";
import DietProgress from "./lib/DietProgress.svelte"; import DietProgress from "./lib/DietProgress.svelte";
import FastProgress from "./lib/FastProgress.svelte"; import FastProgress from "./lib/FastProgress.svelte";
import Info from "./lib/Info.svelte"; import Info from "./lib/Info.svelte";
@ -18,7 +18,7 @@
<GymProgress /> <GymProgress />
{/if} {/if}
{#if $currentView === 2} {#if $currentView === 2}
<CardioProgress /> <WalksProgress />
{/if} {/if}
{#if $currentView === 3} {#if $currentView === 3}
<DietProgress /> <DietProgress />

View file

@ -1,14 +1,14 @@
<script lang="ts"> <script lang="ts">
import DietProgress from "./DietProgress.svelte"; import DietProgress from "./DietProgress.svelte";
import P from "./svg-path"; import P from "./svg-path";
import { gym, cardio, diet, fast } from "./store"; import { gym, walks, diet } from "./store";
export const DEG_TO_RAD = Math.PI / 180; export const DEG_TO_RAD = Math.PI / 180;
export const RAD_TO_DEG = 180 / Math.PI; export const RAD_TO_DEG = 180 / Math.PI;
export const FULL_CIRCLE_IN_RADIANS = 2 * Math.PI; export const FULL_CIRCLE_IN_RADIANS = 2 * Math.PI;
const size = 400; const size = 400;
const segmentHeight = 16; const segmentHeight = 32;
const span = 0.8 * FULL_CIRCLE_IN_RADIANS; const span = 0.8 * FULL_CIRCLE_IN_RADIANS;
const startAngle = 0.25 * FULL_CIRCLE_IN_RADIANS + span / 2; const startAngle = 0.25 * FULL_CIRCLE_IN_RADIANS + span / 2;
@ -26,18 +26,20 @@
const borderRadius = thickness / 2; const borderRadius = thickness / 2;
const outerRadius = radius; const outerRadius = radius;
const innerRadius = outerRadius - thickness; const innerRadius = outerRadius - thickness;
const radEndAngle = startAngle - radLength;
const borderRadiusAngle = const borderRadiusAngle =
(borderRadius / (outerRadius * FULL_CIRCLE_IN_RADIANS)) * (borderRadius / (outerRadius * FULL_CIRCLE_IN_RADIANS)) *
FULL_CIRCLE_IN_RADIANS; FULL_CIRCLE_IN_RADIANS;
const radEndAngle = startAngle - Math.max(radLength, 3 * borderRadiusAngle);
const isLongTrack = radLength - 2 * borderRadiusAngle > Math.PI; const isLongTrack = radLength - 2 * borderRadiusAngle > Math.PI;
const start = startAngle + (offset ?? 0); const start = startAngle + (offset ?? 0);
return P() return P()
// mitt mellan startkortsidan (ca kl 8)
.moveTo( .moveTo(
-Math.sin(start) * (outerRadius - borderRadius), -Math.sin(start) * (outerRadius - borderRadius),
Math.cos(start) * (outerRadius - borderRadius), Math.cos(start) * (outerRadius - borderRadius),
) )
// kantavrundningen till yttre långsidan
.arcTo( .arcTo(
borderRadius, borderRadius,
borderRadius, borderRadius,
@ -46,6 +48,7 @@
-Math.sin(start - borderRadiusAngle) * outerRadius, -Math.sin(start - borderRadiusAngle) * outerRadius,
Math.cos(start - borderRadiusAngle) * outerRadius, Math.cos(start - borderRadiusAngle) * outerRadius,
) )
// yttre långsidan, start till slut
.arcTo( .arcTo(
outerRadius, outerRadius,
outerRadius, outerRadius,
@ -54,6 +57,7 @@
-Math.sin(radEndAngle + borderRadiusAngle) * outerRadius, -Math.sin(radEndAngle + borderRadiusAngle) * outerRadius,
Math.cos(radEndAngle + borderRadiusAngle) * outerRadius, Math.cos(radEndAngle + borderRadiusAngle) * outerRadius,
) )
// kantutjämningen från yttre långsidan till slutkortsidan
.arcTo( .arcTo(
borderRadius, borderRadius,
borderRadius, borderRadius,
@ -62,10 +66,12 @@
-Math.sin(radEndAngle) * (outerRadius - borderRadius), -Math.sin(radEndAngle) * (outerRadius - borderRadius),
Math.cos(radEndAngle) * (outerRadius - borderRadius), Math.cos(radEndAngle) * (outerRadius - borderRadius),
) )
// linje slutkortsidan, från yttersidan till innersidan
.lineTo( .lineTo(
-Math.sin(radEndAngle) * (innerRadius + borderRadius), -Math.sin(radEndAngle) * (innerRadius + borderRadius),
Math.cos(radEndAngle) * (innerRadius + borderRadius), Math.cos(radEndAngle) * (innerRadius + borderRadius),
) )
// kantutjämning till innersidan
.arcTo( .arcTo(
borderRadius, borderRadius,
borderRadius, borderRadius,
@ -74,6 +80,7 @@
-Math.sin(radEndAngle + borderRadiusAngle) * innerRadius, -Math.sin(radEndAngle + borderRadiusAngle) * innerRadius,
Math.cos(radEndAngle + borderRadiusAngle) * innerRadius, Math.cos(radEndAngle + borderRadiusAngle) * innerRadius,
) )
// innersidan, slut till start
.arcTo( .arcTo(
innerRadius, innerRadius,
innerRadius, innerRadius,
@ -82,6 +89,7 @@
-Math.sin(start - borderRadiusAngle) * innerRadius, -Math.sin(start - borderRadiusAngle) * innerRadius,
Math.cos(start - borderRadiusAngle) * innerRadius, Math.cos(start - borderRadiusAngle) * innerRadius,
) )
// kantutjämning från innersidan till start
.arcTo( .arcTo(
borderRadius, borderRadius,
borderRadius, borderRadius,
@ -90,6 +98,7 @@
-Math.sin(start) * (innerRadius + borderRadius), -Math.sin(start) * (innerRadius + borderRadius),
Math.cos(start) * (innerRadius + borderRadius), Math.cos(start) * (innerRadius + borderRadius),
) )
// stäng, blir en rak linje till den redan existerande kantutjämningen
.close() .close()
.stringify(); .stringify();
}; };
@ -102,7 +111,7 @@
}, },
{ {
c: "cardio", c: "cardio",
progress: $cardio.filter((c) => c.completed).length / $cardio.length, progress: $walks.filter((c) => c.completed).length / $walks.length,
level: 1, level: 1,
}, },
{ {
@ -112,11 +121,6 @@
$diet.filter((c) => !c.excluded).length, $diet.filter((c) => !c.excluded).length,
level: 2, level: 2,
}, },
{
c: "fast",
progress: $fast.filter((c) => c.completed).length / $fast.length,
level: 3,
},
]; ];
</script> </script>
@ -129,7 +133,7 @@
fill="#fff" fill="#fff"
opacity="0.066" opacity="0.066"
d={points( d={points(
size / 2 - level * (segmentHeight + 4), size / 2 - level * (segmentHeight + 6),
span, span,
segmentHeight, segmentHeight,
)} )}
@ -138,18 +142,18 @@
class={c} class={c}
fill="currentColor" fill="currentColor"
d={points( d={points(
size / 2 - level * (segmentHeight + 4), size / 2 - level * (segmentHeight + 6),
progress * span, progress * span,
segmentHeight, segmentHeight,
)} )}
/> />
<path <path
fill="#fff" fill="#fff"
opacity="0.4" opacity="0"
d={points( d={points(
size / 2 - level * (segmentHeight + 4) - 4, size / 2 - level * (segmentHeight + 4) - 6,
progress * span * 0.98, progress * span * 0.98,
4, 6,
)} )}
/> />
{/each} {/each}

View file

@ -1,43 +0,0 @@
<script lang="ts">
import { cardio } from "./store";
import {dm, back } from "./common";
const remaining = $cardio.length;
const days = ["ons", "fre", "mån"];
let done = $derived($cardio.filter((c) => c.completed).length);
</script>
<header>
<button class="clickable back" onclick={() => back()}>←</button>
<h1>
Konditionsträning: {done} av {remaining}
</h1>
</header>
<main>
<progress hidden max={remaining} value={done}></progress>
<div class="calendar">
{#each $cardio as col, i}
<article class="clickable">
<label>
<input type="checkbox" bind:checked={col.completed} />
<strong
>{(col.run_for as number[])
.map((m) => `${m} min`)
.join(" + ")}, {col.pause_for} vila</strong
>
<small>{days[i % 3]} {dm(col.planned_at)}</small>
</label>
</article>
{/each}
</div>
</main>
<style>
main {
background-color: #5dc5f8;
border-top: 4px solid rgba(0, 0, 0, 0.2)
}
article:nth-child(1) {
grid-column: 2;
}
</style>

View file

@ -2,7 +2,7 @@
import { gym } from "./store"; import { gym } from "./store";
import {dm, back } from "./common"; import {dm, back } from "./common";
const remaining = $gym.length; const remaining = $gym.length;
const days = ["sön", "tis", "tor"]; const days = ["mån", "tis", "ons", "fre"];
let done = $derived($gym.filter((c) => c.completed).length); let done = $derived($gym.filter((c) => c.completed).length);
</script> </script>
@ -33,6 +33,10 @@
border-top: 4px solid rgba(0, 0, 0, 0.2) border-top: 4px solid rgba(0, 0, 0, 0.2)
} }
.calendar {
grid-template-columns: repeat(4, 1fr);
}
article:nth-child(1) { article:nth-child(1) {
grid-column: 3; grid-column: 3;
} }

View file

@ -12,25 +12,19 @@
<main> <main>
<div class="infobox"> <div class="infobox">
<h2>Hej, Anders har en 40-årskris xD</h2> <h2>Hej, Anders har en 40-årskris xD</h2>
<p><em>Dessutom hägrar en vecka på Sweden rock festival.</em>
Ryggen och benen behöver vara i form.</p>
<p> <p>
För att göra träningen litet mer belönande skapades denna app för att ge honom För att göra träningen litet mer belönande skapades denna app för att ge honom
möjlighet att bocka i allt han gör. möjlighet att bocka i allt han gör.
</p> </p>
<h2>Börja löpträna</h2> <h2>Daglig stegräkning</h2>
<p>Anders har tidigare löptränat, men inte gjort det kontinuerligt sedan 2017.</p> <p>Anders jobbar på kontor och behöver se till att röra sig.</p>
<p><b>Metod:</b> löpträning 3 gånger per vecka: 2 pass med 2 intervaller, ett långpass. Linjär <strong>Minst 10 000 steg varje dag.</strong>
progression med 60&ndash;120 sekunders ökning per pass.</p> <h2>Återuppta styrketräning</h2>
<strong>Mål: 5km löpning efter 7 veckor.</strong> <p>Anders föredrar baslyft med frivikter. Hans PB slogs senast januari 2023. Han behöver prioritera att bygga litet muskler.</p>
<h2>Återuppta styrkelyft</h2>
<p>Anders föredrar baslyft med frivikter. Hans PB slogs senast januari 2023.</p>
<p> <p>
<b>Metod</b>: styrketräning 3 gånger per vecka. 4 veckor grundträning (A-blocket), <b>Metod</b>: Powerbuilding, 4ggr/vecka.
4 veckor specialiserad träning (B-blocket), 3 veckor toppning (C-blocket).
</p> </p>
<strong>Mål: 11 veckors träning, med avslutande toppning och <strong>Mål: 24 veckors träning.</strong>
styrkelyftstotal.</strong>
<h2>Inleda diet</h2> <h2>Inleda diet</h2>
<p> <p>
Anders har ett uppskattat BMI på 28-32 vid start av denna utmaning. Anders har ett uppskattat BMI på 28-32 vid start av denna utmaning.
@ -38,7 +32,7 @@
<p> <p>
<b>Metod</b>: Följa <b>Metod</b>: Följa
<a href="https://www.youtube.com/watch?v=fB_ESE2XwOU">Alan Thralls tips</a>, som listas nedan. <a href="https://www.youtube.com/watch?v=fB_ESE2XwOU">Alan Thralls tips</a>, som listas nedan.
Anders cheat meals: Semla på semmeldagen, fika på födelsedagen, liten godispåse på lördagar. Anders cheat meals: Semla på semmeldagen, fika på födelsedagen.
</p> </p>
<blockquote> <blockquote>
<ul> <ul>
@ -59,7 +53,7 @@
</li> </li>
</ul> </ul>
</blockquote> </blockquote>
<p><strong>Mål: Följa ovan kostråd 16 veckor, med fördefinierade cheat meals.</strong></p> <p><strong>Mål: Följa ovan kostråd jan&ndash;juni, med fördefinierade cheat meals.</strong></p>
<h2>Vem?</h2> <h2>Vem?</h2>
<p> <p>
Anders skapade denna PWA. Han är en webbutvecklare som är pappa, älskar hårdrock och föredrar att Anders skapade denna PWA. Han är en webbutvecklare som är pappa, älskar hårdrock och föredrar att

View file

@ -1,9 +1,8 @@
<script lang="ts"> <script lang="ts">
import { gym, fast, cardio, diet, currentView } from "./store"; import { gym, fast, walks, diet, currentView } from "./store";
import Arc from "./Arc.svelte"; import Arc from "./Arc.svelte";
let gymProgress = $derived($gym.filter((c) => c.completed).length); let gymProgress = $derived($gym.filter((c) => c.completed).length);
let cardioProgress = $derived($cardio.filter((c) => c.completed).length); let walksProgress = $derived($walks.filter((c) => c.completed).length);
let fastProgress = $derived($fast.filter((c) => c.completed).length);
let dietProgress = $derived($diet.filter((c) => c.completed).length); let dietProgress = $derived($diet.filter((c) => c.completed).length);
let dietTotal = $derived($diet.filter((c) => !c.excluded).length); let dietTotal = $derived($diet.filter((c) => !c.excluded).length);
@ -14,34 +13,28 @@
<main> <main>
<h1>Dags att komma i form!</h1> <h1>Dags att komma i form!</h1>
<Arc />
<div class="progress"> <div class="progress">
<h2>Styrketräning, 3d/v under 11 veckor</h2> <h2>Powerbuilding Lite</h2>
<div class="progress-row"> <div class="progress-row">
<progress class="gym" value={gymProgress} max={$gym.length}></progress> <progress class="gym" value={gymProgress} max={$gym.length}></progress>
<i>{gymProgress} / {$gym.length}</i> <i>{gymProgress} / {$gym.length}</i>
<button class="clickable gym" onclick={() => navigate(1)}>+</button> <button class="clickable gym" onclick={() => navigate(1)}>+</button>
</div> </div>
<h2>Konditionsträning, 3d/v under 7 veckor</h2> <h2>10 000&ndash;15 000 steg/dag</h2>
<div class="progress-row"> <div class="progress-row">
<progress class="cardio" value={cardioProgress} max={$cardio.length} <progress class="walks" value={walksProgress} max={$walks.length}
></progress> ></progress>
<i>{cardioProgress} / {$cardio.length}</i> <i>{walksProgress} / {$walks.length}</i>
<button class="clickable cardio" onclick={() => navigate(2)}>+</button> <button class="clickable walks" onclick={() => navigate(2)}>+</button>
</div> </div>
<h2>Diet, feb&ndash;maj</h2> <h2>Diet, jan&ndash;maj</h2>
<div class="progress-row"> <div class="progress-row">
<progress class="diet" value={dietProgress} max={dietTotal}></progress> <progress class="diet" value={dietProgress} max={dietTotal}></progress>
<i>{dietProgress} / {dietTotal}</i> <i>{dietProgress} / {dietTotal}</i>
<button class="clickable diet" onclick={() => navigate(3)}>+</button> <button class="clickable diet" onclick={() => navigate(3)}>+</button>
</div> </div>
<h2>Fasta, 3d/v under maj</h2>
<div class="progress-row">
<progress class="fast" value={fastProgress} max={$fast.length}></progress>
<i>{fastProgress} / {$fast.length}</i>
<button class="clickable fast" onclick={() => navigate(5)}>+</button>
</div>
</div> </div>
<Arc />
<div class="top-button"> <div class="top-button">
<button class="clickable info" onclick={() => navigate(4)}> Va? </button> <button class="clickable info" onclick={() => navigate(4)}> Va? </button>
</div> </div>
@ -60,7 +53,7 @@
} }
progress { progress {
&.cardio { &.walks {
--pcolor: #5dc5f8; --pcolor: #5dc5f8;
} }
@ -185,7 +178,7 @@
background-color: var(--btn-bg); background-color: var(--btn-bg);
padding: 0.25em 0.66em; padding: 0.25em 0.66em;
&.cardio { &.walks {
--btn-bg: #5dc5f8; --btn-bg: #5dc5f8;
} }

View file

@ -0,0 +1,48 @@
<script lang="ts">
import { walks } from "./store";
import {dm, back } from "./common";
const remaining = $walks.length;
const days = ["ons", "fre", "mån"];
let done = $derived($walks.filter((c) => c.completed).length);
</script>
<header>
<button class="clickable back" onclick={() => back()}>←</button>
<h1>
Stegutmaning: {done} av {remaining}
</h1>
</header>
<main>
<progress hidden max={remaining} value={done}></progress>
<div class="calendar">
{#each $walks as day, i}
<article class="clickable">
{#if day.excluded}
<div class="red">
{day.because}
</div>
{:else}
<label>
<input type="checkbox" bind:checked={day.completed} />
{dm(day.date)}
</label>
{/if}
</article>
{/each}
</div>
</main>
<style>
main {
background-color: #5dc5f8;
border-top: 4px solid rgba(0, 0, 0, 0.2)
}
.calendar {
grid-template-columns: repeat(7, 1fr);
}
article:nth-child(1) {
grid-column: 1;
}
</style>

View file

@ -3,8 +3,7 @@ import { persisted } from "svelte-persisted-store";
import defaultState from "../../data/default-state"; import defaultState from "../../data/default-state";
export const currentView = writable(0); export const currentView = writable(0);
export const walks = persisted("walks", defaultState.walks);
export const cardio = persisted("cardio", defaultState.cardio);
export const gym = persisted("gym", defaultState.gym); export const gym = persisted("gym", defaultState.gym);
export const diet = persisted("diet", defaultState.diet); export const diet = persisted("diet", defaultState.diet);
export const fast = persisted("fast", defaultState.fast); export const fast = persisted("fast", defaultState.fast);