Implement responsive mobile/desktop UI layout
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
This commit is contained in:
parent
e11a95efa7
commit
b89384ffb5
4 changed files with 667 additions and 40 deletions
|
|
@ -44,7 +44,60 @@
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
<div class="calendar-grid">
|
<div class="calendar-container">
|
||||||
|
<!-- Desktop week-based layout -->
|
||||||
|
<div class="calendar-grid desktop-calendar">
|
||||||
|
@foreach (var week in GetWeeksInMonth())
|
||||||
|
{
|
||||||
|
@foreach (var day in week)
|
||||||
|
{
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">
|
||||||
|
@day.ToString("dd.MM.yyyy") (@day.ToString("dddd"))
|
||||||
|
</div>
|
||||||
|
<div class="shifts">
|
||||||
|
@foreach (var shift in Shifts)
|
||||||
|
{
|
||||||
|
<div class="tooltip-wrapper">
|
||||||
|
<button class="shift-button @(SelectedSchedule.ContainsKey(day) && SelectedSchedule[day] == shift.Name ? "selected" : "")"
|
||||||
|
@onclick="() => SelectShift(day, shift.Name)"
|
||||||
|
disabled="@_isLoadingTransport">
|
||||||
|
@if (_isLoadingTransport && SelectedSchedule.ContainsKey(day) && SelectedSchedule[day] == shift.Name)
|
||||||
|
{
|
||||||
|
<span class="loading-spinner">⏳</span>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@if (shift.IsPngIcon)
|
||||||
|
{
|
||||||
|
<img src="icons\@shift.Icon" alt="@shift.Name" style="width: 24px; height: 24px;" />
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@shift.Icon
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</button>
|
||||||
|
<span class="tooltip">@shift.Name</span>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
@if (SelectedSchedule.ContainsKey(day))
|
||||||
|
{
|
||||||
|
<div class="shift-times">
|
||||||
|
<small>@GetShiftTimes(day)</small>
|
||||||
|
</div>
|
||||||
|
<div class="transport-info">
|
||||||
|
<small>@GetTransportSummary(day)</small>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Mobile single-column layout -->
|
||||||
|
<div class="calendar-grid mobile-calendar">
|
||||||
@foreach (var day in SelectedDate.DaysInMonth())
|
@foreach (var day in SelectedDate.DaysInMonth())
|
||||||
{
|
{
|
||||||
<div class="day-cell">
|
<div class="day-cell">
|
||||||
|
|
@ -90,6 +143,7 @@ else
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
<ConfigurationDialog IsVisible="_showConfigDialog"
|
<ConfigurationDialog IsVisible="_showConfigDialog"
|
||||||
|
|
|
||||||
|
|
@ -320,5 +320,35 @@ namespace ShiftScheduler.Client.Pages
|
||||||
Shifts = await HttpClient.GetFromJsonAsync<List<Shift>>("api/shift/shifts") ?? new();
|
Shifts = await HttpClient.GetFromJsonAsync<List<Shift>>("api/shift/shifts") ?? new();
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper method to group days by week for desktop calendar view
|
||||||
|
// Each week starts with Monday and ends with Sunday (max 7 days per row)
|
||||||
|
private List<List<DateTime>> GetWeeksInMonth()
|
||||||
|
{
|
||||||
|
var days = SelectedDate.DaysInMonth();
|
||||||
|
var weeks = new List<List<DateTime>>();
|
||||||
|
var currentWeek = new List<DateTime>();
|
||||||
|
|
||||||
|
foreach (var day in days)
|
||||||
|
{
|
||||||
|
// Add the day to current week
|
||||||
|
currentWeek.Add(day);
|
||||||
|
|
||||||
|
// If it's Sunday or we have 7 days, end the week
|
||||||
|
if (day.DayOfWeek == DayOfWeek.Sunday || currentWeek.Count == 7)
|
||||||
|
{
|
||||||
|
weeks.Add(currentWeek);
|
||||||
|
currentWeek = new List<DateTime>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add any remaining days as the last week
|
||||||
|
if (currentWeek.Count > 0)
|
||||||
|
{
|
||||||
|
weeks.Add(currentWeek);
|
||||||
|
}
|
||||||
|
|
||||||
|
return weeks;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,26 @@
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 1rem;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
|
/* Make buttons scrollable instead of fixed */
|
||||||
|
position: static;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mobile top navigation - stack vertically */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.top-nav-buttons {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: stretch;
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.month-selection {
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-buttons {
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Month selection buttons */
|
/* Month selection buttons */
|
||||||
|
|
@ -75,11 +95,43 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calendar container */
|
/* Calendar container */
|
||||||
|
.calendar-container {
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
.calendar-grid {
|
.calendar-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
margin-top: 1rem;
|
}
|
||||||
|
|
||||||
|
/* Desktop calendar grid - week-based layout with 7 columns max */
|
||||||
|
.desktop-calendar {
|
||||||
|
grid-template-columns: repeat(7, 1fr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mobile calendar grid - single column */
|
||||||
|
.mobile-calendar {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Show desktop calendar only on larger screens */
|
||||||
|
@media (min-width: 769px) {
|
||||||
|
.desktop-calendar {
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
.mobile-calendar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Show mobile calendar only on smaller screens */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.desktop-calendar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.mobile-calendar {
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Each day cell */
|
/* Each day cell */
|
||||||
|
|
@ -91,6 +143,14 @@
|
||||||
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Mobile day cell adjustments */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.day-cell {
|
||||||
|
padding: 0.75rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Day number */
|
/* Day number */
|
||||||
.day-header {
|
.day-header {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
|
@ -102,11 +162,25 @@
|
||||||
/* Shift buttons container */
|
/* Shift buttons container */
|
||||||
.shifts {
|
.shifts {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(3, 1fr);
|
|
||||||
gap: 0.5rem;
|
gap: 0.5rem;
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Desktop shift buttons - 3 columns */
|
||||||
|
@media (min-width: 769px) {
|
||||||
|
.shifts {
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mobile shift buttons - single row */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.shifts {
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(60px, 1fr));
|
||||||
|
gap: 0.25rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Individual shift buttons */
|
/* Individual shift buttons */
|
||||||
.shift-button {
|
.shift-button {
|
||||||
border: 2px solid #ddd;
|
border: 2px solid #ddd;
|
||||||
|
|
@ -123,6 +197,15 @@
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Mobile shift button adjustments */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.shift-button {
|
||||||
|
min-height: 2rem;
|
||||||
|
font-size: 1rem;
|
||||||
|
padding: 0.4rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.shift-button:hover {
|
.shift-button:hover {
|
||||||
background-color: #f8f9fa;
|
background-color: #f8f9fa;
|
||||||
border-color: #007bff;
|
border-color: #007bff;
|
||||||
|
|
|
||||||
460
Client/wwwroot/demo.html
Normal file
460
Client/wwwroot/demo.html
Normal file
|
|
@ -0,0 +1,460 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Shift Scheduler - Mobile UI Demo</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 20px;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Top navigation buttons */
|
||||||
|
.top-nav-buttons {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 1rem;
|
||||||
|
/* Make buttons scrollable instead of fixed */
|
||||||
|
position: static;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mobile top navigation - stack vertically */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.top-nav-buttons {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: stretch;
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.month-selection {
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-buttons {
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Month selection buttons */
|
||||||
|
.month-selection {
|
||||||
|
display: flex;
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Action buttons container */
|
||||||
|
.action-buttons {
|
||||||
|
display: flex;
|
||||||
|
gap: 0.5rem;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Month navigation buttons */
|
||||||
|
.month-btn {
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
|
border: 2px solid #1b6ec2;
|
||||||
|
background-color: #fff;
|
||||||
|
color: #1b6ec2;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.month-btn:hover {
|
||||||
|
background-color: #f8f9fa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.month-btn.selected {
|
||||||
|
background-color: #1b6ec2;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Export button */
|
||||||
|
.btn.export-btn {
|
||||||
|
margin: 5px;
|
||||||
|
padding: 10px 20px;
|
||||||
|
font-size: 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
background-color: #ADD8E6; /* Light blue */
|
||||||
|
color: #333;
|
||||||
|
border: 2px solid #87CEEB; /* Slightly darker blue border */
|
||||||
|
border-radius: 5px;
|
||||||
|
transition: background-color 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn.export-btn:hover {
|
||||||
|
background-color: #87CEEB;
|
||||||
|
border-color: #4682B4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reset button */
|
||||||
|
.reset-btn {
|
||||||
|
margin: 5px;
|
||||||
|
padding: 10px 20px;
|
||||||
|
font-size: 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
background-color: #FFB6C1; /* Light red/pink */
|
||||||
|
color: #333;
|
||||||
|
border: 2px solid #FF91A4; /* Slightly darker red border */
|
||||||
|
border-radius: 5px;
|
||||||
|
transition: background-color 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.reset-btn:hover {
|
||||||
|
background-color: #FF91A4;
|
||||||
|
border-color: #FF69B4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Configuration button */
|
||||||
|
.btn.config-btn {
|
||||||
|
margin: 5px;
|
||||||
|
padding: 10px 20px;
|
||||||
|
font-size: 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
background-color: #DDA0DD; /* Light purple/plum */
|
||||||
|
color: #333;
|
||||||
|
border: 2px solid #DA70D6; /* Slightly darker purple border */
|
||||||
|
border-radius: 5px;
|
||||||
|
transition: background-color 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn.config-btn:hover {
|
||||||
|
background-color: #DA70D6;
|
||||||
|
border-color: #BA55D3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calendar container */
|
||||||
|
.calendar-container {
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-grid {
|
||||||
|
display: grid;
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Desktop calendar grid - week-based layout with 7 columns max */
|
||||||
|
.desktop-calendar {
|
||||||
|
grid-template-columns: repeat(7, 1fr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mobile calendar grid - single column */
|
||||||
|
.mobile-calendar {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Show desktop calendar only on larger screens */
|
||||||
|
@media (min-width: 769px) {
|
||||||
|
.desktop-calendar {
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
.mobile-calendar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Show mobile calendar only on smaller screens */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.desktop-calendar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.mobile-calendar {
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Each day cell */
|
||||||
|
.day-cell {
|
||||||
|
border: 1px solid #dee2e6;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 1rem;
|
||||||
|
background-color: #fff;
|
||||||
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mobile day cell adjustments */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.day-cell {
|
||||||
|
padding: 0.75rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Day number */
|
||||||
|
.day-header {
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
color: #333;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Shift buttons container */
|
||||||
|
.shifts {
|
||||||
|
display: grid;
|
||||||
|
gap: 0.5rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Desktop shift buttons - 3 columns */
|
||||||
|
@media (min-width: 769px) {
|
||||||
|
.shifts {
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mobile shift buttons - single row */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.shifts {
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(60px, 1fr));
|
||||||
|
gap: 0.25rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Individual shift buttons */
|
||||||
|
.shift-button {
|
||||||
|
border: 2px solid #ddd;
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 0.5rem;
|
||||||
|
background-color: #fff;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
text-align: center;
|
||||||
|
min-height: 2.5rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mobile shift button adjustments */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.shift-button {
|
||||||
|
min-height: 2rem;
|
||||||
|
font-size: 1rem;
|
||||||
|
padding: 0.4rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.shift-button:hover {
|
||||||
|
background-color: #f8f9fa;
|
||||||
|
border-color: #007bff;
|
||||||
|
transform: translateY(-1px);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Selected shift */
|
||||||
|
.shift-button.selected {
|
||||||
|
background-color: #007bff;
|
||||||
|
color: white;
|
||||||
|
border-color: #0056b3;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
color: #333;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.demo-note {
|
||||||
|
background-color: #e7f3ff;
|
||||||
|
border: 1px solid #b3d9ff;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 1rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
color: #0066cc;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="demo-note">
|
||||||
|
<strong>Demo Note:</strong> This is a responsive layout demo. Resize your browser window to see mobile vs desktop layouts.
|
||||||
|
<br>Desktop (>768px): Week-based grid with max 7 columns, 3-column shift buttons
|
||||||
|
<br>Mobile (≤768px): Single column layout, single-row shift buttons
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3>Shift Scheduler - November 2024</h3>
|
||||||
|
|
||||||
|
<div class="top-nav-buttons">
|
||||||
|
<div class="month-selection">
|
||||||
|
<button class="month-btn">Next Month</button>
|
||||||
|
<button class="month-btn selected">Current Month</button>
|
||||||
|
</div>
|
||||||
|
<div class="action-buttons">
|
||||||
|
<button class="reset-btn">Reset Schedule</button>
|
||||||
|
<button class="btn export-btn">Export to ICS</button>
|
||||||
|
<button class="btn export-btn">Export to PDF</button>
|
||||||
|
<button class="btn config-btn">⚙️ Configuration</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="calendar-container">
|
||||||
|
<!-- Desktop week-based layout -->
|
||||||
|
<div class="calendar-grid desktop-calendar">
|
||||||
|
<!-- Week 1 -->
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">01.11.2024 (Friday)</div>
|
||||||
|
<div class="shifts">
|
||||||
|
<button class="shift-button">⚫</button>
|
||||||
|
<button class="shift-button">🌴</button>
|
||||||
|
<button class="shift-button">🌅</button>
|
||||||
|
<button class="shift-button">🌆</button>
|
||||||
|
<button class="shift-button">☀️</button>
|
||||||
|
<button class="shift-button">📋</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">02.11.2024 (Saturday)</div>
|
||||||
|
<div class="shifts">
|
||||||
|
<button class="shift-button selected">⚫</button>
|
||||||
|
<button class="shift-button">🌴</button>
|
||||||
|
<button class="shift-button">🌅</button>
|
||||||
|
<button class="shift-button">🌆</button>
|
||||||
|
<button class="shift-button">☀️</button>
|
||||||
|
<button class="shift-button">📋</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">03.11.2024 (Sunday)</div>
|
||||||
|
<div class="shifts">
|
||||||
|
<button class="shift-button">⚫</button>
|
||||||
|
<button class="shift-button selected">🌴</button>
|
||||||
|
<button class="shift-button">🌅</button>
|
||||||
|
<button class="shift-button">🌆</button>
|
||||||
|
<button class="shift-button">☀️</button>
|
||||||
|
<button class="shift-button">📋</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Week 2 -->
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">04.11.2024 (Monday)</div>
|
||||||
|
<div class="shifts">
|
||||||
|
<button class="shift-button">⚫</button>
|
||||||
|
<button class="shift-button">🌴</button>
|
||||||
|
<button class="shift-button selected">🌅</button>
|
||||||
|
<button class="shift-button">🌆</button>
|
||||||
|
<button class="shift-button">☀️</button>
|
||||||
|
<button class="shift-button">📋</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">05.11.2024 (Tuesday)</div>
|
||||||
|
<div class="shifts">
|
||||||
|
<button class="shift-button">⚫</button>
|
||||||
|
<button class="shift-button">🌴</button>
|
||||||
|
<button class="shift-button">🌅</button>
|
||||||
|
<button class="shift-button selected">🌆</button>
|
||||||
|
<button class="shift-button">☀️</button>
|
||||||
|
<button class="shift-button">📋</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">06.11.2024 (Wednesday)</div>
|
||||||
|
<div class="shifts">
|
||||||
|
<button class="shift-button">⚫</button>
|
||||||
|
<button class="shift-button">🌴</button>
|
||||||
|
<button class="shift-button">🌅</button>
|
||||||
|
<button class="shift-button">🌆</button>
|
||||||
|
<button class="shift-button selected">☀️</button>
|
||||||
|
<button class="shift-button">📋</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">07.11.2024 (Thursday)</div>
|
||||||
|
<div class="shifts">
|
||||||
|
<button class="shift-button">⚫</button>
|
||||||
|
<button class="shift-button">🌴</button>
|
||||||
|
<button class="shift-button">🌅</button>
|
||||||
|
<button class="shift-button">🌆</button>
|
||||||
|
<button class="shift-button">☀️</button>
|
||||||
|
<button class="shift-button selected">📋</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Mobile single-column layout -->
|
||||||
|
<div class="calendar-grid mobile-calendar">
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">01.11.2024 (Friday)</div>
|
||||||
|
<div class="shifts">
|
||||||
|
<button class="shift-button">⚫</button>
|
||||||
|
<button class="shift-button">🌴</button>
|
||||||
|
<button class="shift-button">🌅</button>
|
||||||
|
<button class="shift-button">🌆</button>
|
||||||
|
<button class="shift-button">☀️</button>
|
||||||
|
<button class="shift-button">📋</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">02.11.2024 (Saturday)</div>
|
||||||
|
<div class="shifts">
|
||||||
|
<button class="shift-button selected">⚫</button>
|
||||||
|
<button class="shift-button">🌴</button>
|
||||||
|
<button class="shift-button">🌅</button>
|
||||||
|
<button class="shift-button">🌆</button>
|
||||||
|
<button class="shift-button">☀️</button>
|
||||||
|
<button class="shift-button">📋</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">03.11.2024 (Sunday)</div>
|
||||||
|
<div class="shifts">
|
||||||
|
<button class="shift-button">⚫</button>
|
||||||
|
<button class="shift-button selected">🌴</button>
|
||||||
|
<button class="shift-button">🌅</button>
|
||||||
|
<button class="shift-button">🌆</button>
|
||||||
|
<button class="shift-button">☀️</button>
|
||||||
|
<button class="shift-button">📋</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">04.11.2024 (Monday)</div>
|
||||||
|
<div class="shifts">
|
||||||
|
<button class="shift-button">⚫</button>
|
||||||
|
<button class="shift-button">🌴</button>
|
||||||
|
<button class="shift-button selected">🌅</button>
|
||||||
|
<button class="shift-button">🌆</button>
|
||||||
|
<button class="shift-button">☀️</button>
|
||||||
|
<button class="shift-button">📋</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">05.11.2024 (Tuesday)</div>
|
||||||
|
<div class="shifts">
|
||||||
|
<button class="shift-button">⚫</button>
|
||||||
|
<button class="shift-button">🌴</button>
|
||||||
|
<button class="shift-button">🌅</button>
|
||||||
|
<button class="shift-button selected">🌆</button>
|
||||||
|
<button class="shift-button">☀️</button>
|
||||||
|
<button class="shift-button">📋</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">06.11.2024 (Wednesday)</div>
|
||||||
|
<div class="shifts">
|
||||||
|
<button class="shift-button">⚫</button>
|
||||||
|
<button class="shift-button">🌴</button>
|
||||||
|
<button class="shift-button">🌅</button>
|
||||||
|
<button class="shift-button">🌆</button>
|
||||||
|
<button class="shift-button selected">☀️</button>
|
||||||
|
<button class="shift-button">📋</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="day-cell">
|
||||||
|
<div class="day-header">07.11.2024 (Thursday)</div>
|
||||||
|
<div class="shifts">
|
||||||
|
<button class="shift-button">⚫</button>
|
||||||
|
<button class="shift-button">🌴</button>
|
||||||
|
<button class="shift-button">🌅</button>
|
||||||
|
<button class="shift-button">🌆</button>
|
||||||
|
<button class="shift-button">☀️</button>
|
||||||
|
<button class="shift-button selected">📋</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Loading…
Reference in a new issue