feat: refactorer l'interface Daily/Weekly/Monthly avec design moderne masonry layout, topbar avec onglets pills interactifs (daily/weekly/monthly), toolbar de navigation avec boutons prev/next et date courante, grille responsive 4 colonnes avec cartes hover animées, variables CSS personnalisables, support complet thème clair/sombre, et amélioration responsive avec breakpoints optimisés pour mobile/tablette

This commit is contained in:
Bruno Charest 2026-02-19 09:14:53 -05:00
parent ec8f08e003
commit 46ecb16241
2 changed files with 308 additions and 30 deletions

View File

@ -2571,6 +2571,285 @@ select:focus {
} }
} }
/* ===== Daily / Weekly / Monthly ===== */
.daily {
padding: 1.5rem 0 2.5rem;
}
.daily-topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
margin-bottom: 1.5rem;
padding: 0.75rem 1rem;
border-radius: 16px;
background: var(--bg-card);
border: 1px solid var(--border);
box-shadow: var(--shadow-sm);
}
.daily-topbar-left {
display: inline-flex;
align-items: center;
gap: 0.6rem;
font-weight: 600;
color: var(--text-main);
}
.daily-topbar-tabs {
display: inline-flex;
gap: 0.5rem;
background: var(--bg-body);
padding: 0.35rem;
border-radius: 999px;
border: 1px solid var(--border-light);
}
.daily-tab {
padding: 0.45rem 0.95rem;
border-radius: 999px;
font-weight: 600;
font-size: 0.85rem;
color: var(--text-secondary);
transition: all 0.2s ease;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.daily-tab.is-active {
background: var(--primary);
color: #ffffff;
box-shadow: 0 8px 18px rgba(59, 130, 246, 0.35);
}
.daily-tab.is-inactive:hover {
color: var(--text-main);
background: var(--bg-card-hover);
}
.daily-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
margin-bottom: 1.75rem;
padding: 0.9rem 1.1rem;
border-radius: 16px;
background: linear-gradient(135deg, rgba(15, 23, 42, 0.05), rgba(15, 23, 42, 0.02));
border: 1px solid var(--border);
}
.daily-toolbar-label {
display: inline-flex;
align-items: center;
gap: 0.6rem;
font-weight: 600;
color: var(--text-main);
}
.daily-toolbar-nav {
display: flex;
align-items: center;
gap: 0.75rem;
flex: 1;
justify-content: center;
flex-wrap: wrap;
}
.daily-nav-btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0.95rem;
border-radius: 10px;
border: 1px solid var(--border);
background: var(--bg-card);
color: var(--text-main);
font-weight: 600;
font-size: 0.85rem;
transition: all 0.2s ease;
}
.daily-nav-btn:hover {
background: var(--bg-card-hover);
transform: translateY(-1px);
}
.daily-nav-btn[disabled] {
opacity: 0.5;
cursor: not-allowed;
transform: none;
}
.daily-current-date {
font-weight: 700;
color: var(--text-main);
padding: 0.35rem 0.9rem;
border-radius: 999px;
background: var(--bg-card);
border: 1px dashed var(--border);
font-size: 0.9rem;
}
.daily-calendar-btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0.95rem;
border-radius: 999px;
background: var(--primary-light);
color: var(--primary);
font-weight: 600;
font-size: 0.85rem;
}
.daily-calendar-btn:hover {
background: rgba(59, 130, 246, 0.2);
color: var(--primary-hover);
}
.daily-grid {
column-count: 4;
column-gap: 18px;
width: 100%;
}
.daily-item {
display: inline-block;
width: 100%;
margin-bottom: 18px;
break-inside: avoid;
}
.daily-card {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 18px;
overflow: hidden;
box-shadow: var(--shadow-md);
transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.daily-card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-lg);
}
.daily-item-header {
display: block;
padding: 1rem 1.1rem 0.75rem;
font-weight: 600;
color: var(--text-main);
font-size: 1rem;
line-height: 1.35;
}
.daily-item-image {
width: 100%;
height: 160px;
background-size: cover;
background-position: center;
}
.daily-item-body {
padding: 0.85rem 1.1rem 0.5rem;
color: var(--text-secondary);
font-size: 0.9rem;
line-height: 1.55;
}
.daily-item-footer {
padding: 0.75rem 1.1rem 1rem;
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
flex-wrap: wrap;
border-top: 1px solid var(--border-light);
font-size: 0.8rem;
color: var(--text-muted);
}
.daily-item-footer-subtitle {
color: var(--text-secondary);
font-weight: 600;
}
.daily-item-tags {
color: var(--text-muted);
font-size: 0.78rem;
font-weight: 500;
}
[data-theme="dark"] .daily-topbar,
[data-theme="dark"] .daily-toolbar {
background: #111827;
border-color: #1f2937;
}
[data-theme="dark"] .daily-topbar-tabs {
background: #0f172a;
border-color: #1f2937;
}
[data-theme="dark"] .daily-tab.is-active {
box-shadow: 0 10px 20px rgba(96, 165, 250, 0.35);
}
[data-theme="dark"] .daily-calendar-btn {
background: rgba(96, 165, 250, 0.15);
color: #cfe1ff;
}
[data-theme="dark"] .daily-card {
background: #101a2c;
border-color: #1e2a44;
box-shadow: 0 18px 26px rgba(4, 12, 26, 0.45);
}
[data-theme="dark"] .daily-item-footer {
border-top-color: #1e2a44;
}
@media (max-width: 1200px) {
.daily-grid {
column-count: 3;
}
}
@media (max-width: 900px) {
.daily-grid {
column-count: 2;
}
.daily-toolbar {
flex-direction: column;
align-items: flex-start;
}
.daily-toolbar-nav {
width: 100%;
justify-content: flex-start;
}
}
@media (max-width: 600px) {
.daily-grid {
column-count: 1;
}
.daily-topbar {
flex-direction: column;
align-items: flex-start;
}
.daily-topbar-tabs {
width: 100%;
justify-content: space-between;
}
}
/* ===== Bulk Bookmark Creation ===== */ /* ===== Bulk Bookmark Creation ===== */
.page-add .col-md-6.col-md-offset-3 { .page-add .col-md-6.col-md-offset-3 {
width: 100%; width: 100%;

View File

@ -7,47 +7,46 @@
<body class="dark-toolbar"> <body class="dark-toolbar">
{include="page.header"} {include="page.header"}
<div class="subheader is-dark" style="margin-bottom: 1.5rem;"> <div class="daily">
<div class="container text-center"> <div class="daily-topbar">
<div class="btn-group" role="group"> <div class="daily-topbar-left">
<a class="btn {if="array_key_exists('day', $_GET) || (!array_key_exists('week', $_GET) && !array_key_exists('month', $_GET))"}btn-primary{else}btn-secondary{/if}" href="{$base_path}/daily?day" title="{'Daily'|t}">{'Daily'|t}</a> <i class="mdi mdi-compass-outline" aria-hidden="true"></i>
<a class="btn {if="array_key_exists('week', $_GET)"}btn-primary{else}btn-secondary{/if}" href="{$base_path}/daily?week" title="{'Weekly'|t}">{'Weekly'|t}</a> <span>{'Time navigation'|t}</span>
<a class="btn {if="array_key_exists('month', $_GET)"}btn-primary{else}btn-secondary{/if}" href="{$base_path}/daily?month" title="{'Monthly'|t}">{'Monthly'|t}</a> </div>
<div class="daily-topbar-tabs" role="group" aria-label="{'Daily / Weekly / Monthly'|t}">
<a class="daily-tab {if="array_key_exists('day', $_GET) || (!array_key_exists('week', $_GET) && !array_key_exists('month', $_GET))"}is-active{else}is-inactive{/if}" href="{$base_path}/daily?day" title="{'Daily'|t}">{'Daily'|t}</a>
<a class="daily-tab {if="array_key_exists('week', $_GET)"}is-active{else}is-inactive{/if}" href="{$base_path}/daily?week" title="{'Weekly'|t}">{'Weekly'|t}</a>
<a class="daily-tab {if="array_key_exists('month', $_GET)"}is-active{else}is-inactive{/if}" href="{$base_path}/daily?month" title="{'Monthly'|t}">{'Monthly'|t}</a>
</div> </div>
</div> </div>
</div>
<div class="daily">
<div id="plugin_zone_start_picwall" class="plugin_zone"> <div id="plugin_zone_start_picwall" class="plugin_zone">
{loop="$plugin_start_zone"} {loop="$plugin_start_zone"}
{$value} {$value}
{/loop} {/loop}
</div> </div>
<div class="daily-header"> <div class="daily-toolbar">
<h1>{$localizedType} Shaarli</h1> <div class="daily-toolbar-label">
<p class="daily-header-subtitle">{function="t('All links of one :type in a single page.', '', 1, 'shaarli', [':type' => t($type)])"}</p> <i class="mdi mdi-clock-outline" aria-hidden="true"></i>
<div class="container"> <span>{'Time navigation'|t}</span>
<div class="row">
<div class="col-xs-6">
<a {if="$previousday"}href="{$base_path}/daily?{$type}={$previousday}"{else}href="#"{/if} class="btn btn-secondary" {if="!$previousday"}disabled{/if}>
<i class="mdi mdi-arrow-left"></i> {function="t('Previous :type', '', 1, 'shaarli', [':type' => t($type)], true)"}
</a>
</div>
<div class="col-xs-6 text-right">
<a {if="$nextday"}href="{$base_path}/daily?{$type}={$nextday}"{else}href="#"{/if} class="btn btn-secondary" {if="!$nextday"}disabled{/if}>
{function="t('Next :type', '', 1, 'shaarli', [':type' => t($type)], true)"} <i class="mdi mdi-arrow-right"></i>
</a>
</div>
</div>
<hr class="darker">
</div> </div>
<div class="daily-toolbar-nav">
<a {if="$previousday"}href="{$base_path}/daily?{$type}={$previousday}"{else}href="#"{/if} class="daily-nav-btn" {if="!$previousday"}disabled{/if}>
<i class="mdi mdi-arrow-left"></i>
{function="t('Previous :type', '', 1, 'shaarli', [':type' => t($type)], true)"}
</a>
<span class="daily-current-date">{$dayDesc}</span>
<a {if="$nextday"}href="{$base_path}/daily?{$type}={$nextday}"{else}href="#"{/if} class="daily-nav-btn" {if="!$nextday"}disabled{/if}>
{function="t('Next :type', '', 1, 'shaarli', [':type' => t($type)], true)"}
<i class="mdi mdi-arrow-right"></i>
</a>
</div>
<a class="daily-calendar-btn" href="{$base_path}/daily" title="{'Calendar'|t}">
<i class="mdi mdi-calendar" aria-hidden="true"></i>
<span>{'Calendar'|t}</span>
</a>
</div> </div>
<h2 class="daily-title">{$dayDesc}</h2>
<div id="plugin_zone_about_daily" class="plugin_zone"> <div id="plugin_zone_about_daily" class="plugin_zone">
{loop="$daily_about_plugin"} {loop="$daily_about_plugin"}
{$value} {$value}