Add responsive game filters and hybrid toolbox drawer
All checks were successful
Deploy Sokko G / deploy (push) Successful in 20s

This commit is contained in:
Shinuwa 2026-09-27 18:00:49 +02:00
parent 1ee460b94f
commit 00e73f0062
32 changed files with 1202 additions and 241 deletions

View file

@ -4,31 +4,20 @@
.aniimo-home-card img { padding: 0 15%; object-fit: cover; object-position: 50% 38%; }
.aniimo-layout .game-results { min-width: 0; }
.aniimo-filters { min-width: 0; }
.aniimo-filters > .filter-chip { margin-bottom: var(--space-3); }
.aniimo-filter-sections { gap: 16px; }
.aniimo-filter-section-surface + .aniimo-filter-section-surface { padding-top: 12px; border-top: 1px solid var(--color-border); }
.aniimo-filter-section {
min-width: 0;
margin: 0;
padding: 0;
border: 0;
legend { width: 100%; padding: 0; margin-bottom: 6px; }
}
.aniimo-filter-toggle.nds-button {
display: flex;
width: 100%;
justify-content: space-between;
padding-inline: 4px;
.ui-icon { width: 14px; height: 14px; }
}
.aniimo-selected-count { margin-left: auto; color: var(--color-accent-gold); }
.aniimo-filters .nds-filter-advanced-options { flex: 1 1 auto; }
.aniimo-prismana-filter span { white-space: nowrap; }
.aniimo-filters .aniimo-abilities-dropdown { flex-basis: 180px; min-width: 180px; }
.nds-filter-menu.aniimo-abilities-menu { width: min(680px, calc(100vw - 32px)); }
.aniimo-filter-options {
display: grid;
gap: 8px;
}
.aniimo-chip-options { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; }
.aniimo-chip-options { gap: 6px; }
.aniimo-chip-options .filter-chip { min-width: 0; }
.aniimo-ability-options { gap: 2px; }
.aniimo-ability-options { grid-template-columns: repeat(2, minmax(0, 1fr)); align-items: start; gap: 12px; overflow: visible; }
.aniimo-ability-column { display: grid; min-width: 0; align-content: start; gap: 6px; }
.aniimo-ability-column:first-child { padding-right: 12px; border-right: 1px solid var(--color-border); }
.aniimo-ability-list { display: grid; gap: 4px; }
.aniimo-ability-filter {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(64px, 1fr) 2ch;
@ -52,6 +41,15 @@
stroke-linejoin: round;
shape-rendering: geometricPrecision;
}
@media (max-width: 560px) {
.aniimo-ability-options { gap: 8px; }
.aniimo-ability-column:first-child { padding-right: 8px; }
.aniimo-ability-filter { grid-template-columns: minmax(0, 1fr) 2ch; }
.aniimo-ability-filter label { grid-column: 1 / -1; }
}
@media (max-width: 760px) {
.nds-filter-menu.aniimo-abilities-menu { width: auto; }
}
.aniimo-grid { grid-template-columns: repeat(auto-fill, minmax(min(100%, 220px), 1fr)); }
.aniimo-result { min-width: 0; max-width: 280px; width: 100%; }
.aniimo-tabs-slot { height: 36px; min-width: 0; padding: 2px; }

View file

@ -44,3 +44,16 @@
.ui-tooltip-top-start::after {
left: 16px;
}
.ui-tooltip-right {
transform: translate(0, -50%);
}
.ui-tooltip-right::after {
top: 50%;
left: 0;
border-right: 0;
border-bottom: 1px solid rgba(165, 180, 252, 0.18);
border-left: 1px solid rgba(165, 180, 252, 0.18);
transform: translate(-4px, -50%) rotate(45deg);
}

View file

@ -468,6 +468,15 @@
padding: var(--space-4);
}
.design-system-filter-preview {
width: 100%;
min-width: 0;
}
.design-system-filter-preview[data-variant="horizontal-compact"] {
container-type: inline-size;
}
.design-system-pattern-card strong,
.design-system-pattern-wide strong,
.design-system-pattern-hero strong,

View file

@ -33,6 +33,10 @@
justify-content: center;
}
.sidebar[data-variant="compact"] .sidebar-note {
display: block;
}
.about-story-section,
.about-contribute-section {
grid-template-columns: 1fr;
@ -379,9 +383,13 @@
color: var(--color-text-primary);
}
}
@media (max-width: 699px) {
.drawer-panel {
width: 100vw;
min-width: 0;
width: min(720px, 94vw);
max-width: none;
}
.drawer-resize-handle {

View file

@ -9,6 +9,10 @@
min-height: 100vh;
}
.app-shell.sidebar-compact {
grid-template-columns: 72px minmax(0, 1fr);
}
.sidebar {
position: fixed;
inset: 0 auto 0 0;
@ -292,6 +296,61 @@
display: inline-flex;
}
.sidebar[data-variant="compact"] {
width: 72px;
gap: var(--space-4);
padding: var(--space-4) 10px;
}
.sidebar[data-variant="compact"] .brand-name,
.sidebar[data-variant="compact"] .nav-item strong,
.sidebar[data-variant="compact"] .sidebar-about-link strong,
.sidebar[data-variant="compact"] .sidebar-mascot,
.sidebar[data-variant="compact"] .sidebar-note > .badge,
.sidebar[data-variant="compact"] .sidebar-note > p {
display: none;
}
.sidebar[data-variant="compact"] .brand,
.sidebar[data-variant="compact"] .nav-item,
.sidebar[data-variant="compact"] .sidebar-about-link {
justify-content: center;
}
.sidebar[data-variant="compact"] .nav-item {
width: 100%;
padding-inline: 10px;
}
.sidebar[data-variant="compact"] .sidebar-secondary-links {
margin-top: auto;
}
.sidebar[data-variant="compact"] .sidebar-about-link {
width: 100%;
padding-inline: 8px;
}
.sidebar[data-variant="compact"] .sidebar-note {
display: block;
margin-top: 0;
padding: 6px;
border-radius: var(--radius-md);
}
.sidebar[data-variant="compact"] .sidebar-storage-actions {
flex-direction: column;
align-items: center;
gap: 6px;
margin-top: 0;
}
.sidebar[data-variant="compact"] .sidebar-action-button {
width: 36px;
height: 36px;
flex: 0 0 36px;
}
.content-shell {
grid-column: 2;
display: flex;
@ -300,6 +359,26 @@
flex-direction: column;
}
@media (min-width: 700px) {
.app-shell.toolbox-drawer-open .content-shell {
display: grid;
grid-template-columns: minmax(0, 1fr) 700px;
grid-template-rows: auto minmax(0, 1fr);
}
.app-shell.toolbox-drawer-open .topbar {
grid-column: 1 / -1;
grid-row: 1;
}
.app-shell.toolbox-drawer-open main {
grid-column: 1;
grid-row: 2;
min-width: 0;
width: min(1600px, max(0px, calc(100% - 64px)));
}
}
.topbar {
position: sticky;
top: 0;

View file

@ -158,6 +158,248 @@
@include controls.filter-panel-pattern;
}
.nds-filter-panel[data-variant="horizontal-compact"],
.nds-filter-panel[data-variant="horizontal-menu"] {
@include controls.filter-bar-pattern;
}
.nds-filter-panel[data-variant="horizontal-compact"]:has(> .nds-active-filters),
.nds-filter-panel[data-variant="horizontal-menu"]:has(> .nds-active-filters) {
row-gap: 10px;
}
.nds-filter-panel[data-variant="horizontal-compact"] {
container-type: inline-size;
}
.nds-filter-search {
flex: 0 1 280px;
width: min(100%, 280px);
max-width: 280px;
min-width: min(100%, 190px);
}
.nds-filter-search > .nds-input {
width: 100%;
}
.nds-filter-group {
display: flex;
min-width: 0;
align-items: center;
gap: 8px;
padding-left: 10px;
border-left: 1px solid var(--color-border-hover);
}
.nds-filter-group-label {
flex: 0 0 auto;
color: var(--color-text-secondary);
font-size: var(--font-size-sm);
font-weight: 800;
}
.nds-filter-direct-options,
.nds-filter-advanced-options {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 6px;
min-width: 0;
}
.nds-filter-option {
@include controls.text-button(sm);
width: auto;
min-width: 0;
flex: 0 0 auto;
justify-content: center;
padding-inline: 8px;
font-weight: 800;
}
.nds-filter-option:hover:not(.active, [aria-pressed="true"]) {
@include controls.text-button-hover;
}
.nds-filter-option.active,
.nds-filter-option[aria-pressed="true"] {
@include controls.text-button-active;
}
.nds-filter-option > img,
.nds-filter-option > .ui-icon,
.nds-filter-option > [class$="-icon"] {
width: 20px;
height: 20px;
flex: 0 0 20px;
object-fit: contain;
}
.nds-filter-option-label {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.nds-filter-panel[data-variant="horizontal-compact"] .nds-filter-logic,
.nds-filter-panel[data-variant="horizontal-menu"] .nds-filter-logic {
min-height: 34px;
margin: 0;
padding: 4px 6px 4px 10px;
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
background: rgba(5, 7, 17, 0.46);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.025);
}
.nds-filter-reset {
flex: 0 0 auto;
margin-left: auto;
}
.nds-filter-dropdown {
position: relative;
flex: 0 1 176px;
min-width: 176px;
}
.nds-filter-dropdown.is-open {
z-index: 2;
}
.nds-filter-menu-trigger.nds-select-trigger,
.nds-filter-menu-trigger.nds-select-trigger[data-size="sm"] {
grid-template-columns: 14px minmax(0, 1fr) auto;
min-width: 176px;
width: 100%;
}
.nds-filter-count {
display: inline-grid;
min-width: 20px;
min-height: 20px;
place-items: center;
padding-inline: 5px;
border: 1px solid rgba(246, 196, 83, 0.28);
border-radius: var(--radius-pill);
background: rgba(246, 196, 83, 0.1);
color: var(--color-accent-gold);
font-size: 0.68rem;
line-height: 1;
}
.nds-filter-menu {
position: absolute;
z-index: 90;
top: calc(100% + 8px);
left: 0;
width: min(320px, calc(100vw - 32px));
padding: 10px;
overflow: visible;
}
.nds-filter-menu[data-columns="2"] .nds-filter-menu-options {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.nds-filter-panel .nds-filter-menu .nds-filter-logic {
margin-bottom: 12px;
}
.nds-filter-dropdown.is-aligned-end > .nds-filter-menu {
right: 0;
left: auto;
}
.nds-filter-menu-fieldset {
min-width: 0;
margin: 0;
padding: 0;
border: 0;
}
.nds-filter-menu-options {
display: grid;
gap: 6px;
overflow: visible;
}
.nds-filter-menu-option {
grid-template-columns: 18px 22px minmax(0, 1fr);
min-width: 0;
width: 100%;
border-radius: var(--radius-md);
}
.nds-filter-menu-option > span:last-child {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
@container (max-width: 1040px) {
.nds-filter-panel[data-variant="horizontal-compact"] .nds-filter-option {
width: 36px;
min-width: 36px;
padding-inline: 0;
}
.nds-filter-panel[data-variant="horizontal-compact"] .nds-filter-option-label {
position: absolute;
width: 1px;
height: 1px;
margin: -1px;
padding: 0;
overflow: hidden;
border: 0;
clip: rect(0 0 0 0);
white-space: nowrap;
}
}
@media (max-width: 760px) {
.nds-filter-panel[data-variant="horizontal-compact"],
.nds-filter-panel[data-variant="horizontal-menu"] {
align-items: stretch;
}
.nds-filter-search {
flex-basis: 100%;
width: 100%;
max-width: none;
}
.nds-filter-group {
flex: 1 1 100%;
flex-wrap: wrap;
padding-top: 8px;
padding-left: 0;
border-top: 1px solid var(--color-border-hover);
border-left: 0;
}
.nds-filter-direct-options,
.nds-filter-advanced-options {
flex: 1 1 100%;
}
.nds-filter-dropdown {
position: static;
flex: 1 1 176px;
}
.nds-filter-menu,
.nds-filter-dropdown.is-aligned-end > .nds-filter-menu {
top: calc(100% + 8px);
right: 12px;
left: 12px;
width: auto;
}
}
.nds-reorder-indicator,
.nds-reorder-indicator[data-axis="vertical"][data-placement="before"] {
@include controls.reorder-indicator-pattern(vertical, before);

View file

@ -241,6 +241,20 @@
backdrop-filter: blur(10px);
}
@mixin filter-bar-pattern {
@include filter-panel-pattern;
position: relative;
overflow: visible;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 10px;
min-width: 0;
padding: 10px 12px;
border-radius: var(--radius-lg);
background: rgba(12, 16, 34, 0.82);
}
@mixin reorder-indicator-pattern($axis: vertical, $placement: before) {
position: relative;

View file

@ -1,7 +1,7 @@
// Rôle : regroupe le layout, les filtres et les barres de contrôle des pages jeux.
.game-layout {
display: grid;
grid-template-columns: minmax(240px, 300px) minmax(0, 1fr);
grid-template-columns: minmax(0, 1fr);
gap: var(--space-5);
margin-top: var(--space-6);
align-items: start;
@ -9,7 +9,42 @@
.game-filters {
position: sticky;
top: 92px;
top: 68px;
z-index: 40;
}
.nds-active-filters {
display: flex;
width: calc(100% + 24px);
min-width: 0;
flex: 1 1 calc(100% + 24px);
flex-wrap: wrap;
align-items: center;
gap: 4px;
min-height: 28px;
margin: 0 -12px -6px;
padding: 4px 12px 0;
border-top: 1px solid rgba(246, 196, 83, 0.3);
}
.nds-active-filter.nds-badge {
min-height: 24px;
gap: 4px;
padding: 2px 6px 2px 8px;
color: var(--color-text-secondary);
cursor: pointer;
}
.nds-active-filter.nds-badge:hover {
border-color: var(--color-primary-border);
background: var(--color-primary-soft);
color: var(--color-text-primary);
}
.nds-active-filter .ui-icon {
width: 13px;
height: 13px;
flex: 0 0 13px;
}
.filter-panel-head,

View file

@ -3,21 +3,13 @@
display: none;
}
.drawer-backdrop {
position: fixed;
inset: var(--drawer-top-offset, 68px) 0 0 0;
z-index: 40;
background: rgba(2, 3, 9, 0.24);
backdrop-filter: none;
}
.drawer-panel {
position: fixed;
inset: var(--drawer-top-offset, 68px) 0 0 auto;
z-index: 50;
width: min(720px, 94vw);
min-width: 360px;
max-width: 94vw;
width: var(--drawer-panel-width, 700px);
min-width: 700px;
max-width: max(700px, 94vw);
padding: var(--space-5);
}
@ -36,7 +28,7 @@
.drawer-resize-handle {
position: fixed;
top: calc(var(--drawer-top-offset, 68px) + ((100vh - var(--drawer-top-offset, 68px)) / 2));
right: calc(var(--drawer-panel-width, min(720px, 94vw)) - 18px);
right: calc(var(--drawer-panel-width, 700px) - 18px);
z-index: 62;
width: 14px;
height: 72px;