Skip to content

Commit 1252e06

Browse files
committed
Étape 4: Add double accordion for portrait mobile and fix breakpoints (≤900px landscape for drawer)
1 parent c710403 commit 1252e06

3 files changed

Lines changed: 149 additions & 34 deletions

File tree

applications/index.md

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ custom_css:
66
- /assets/css/contributors.css
77
- /assets/css/applications.css
88
custom_js:
9-
- /assets/js/applications.js?v=9
9+
- /assets/js/applications.js?v=14
1010
---
1111

1212
<div class="contributors-page">
@@ -30,10 +30,19 @@ custom_js:
3030
<div class="filter-sidebar-inner">
3131
<div class="sidebar-header">
3232
<h3><i class="fa-solid fa-filter"></i> Filters</h3>
33+
<div class="sidebar-header-actions">
34+
<!-- Portrait collapse button (hidden by default) -->
35+
<button class="portrait-collapse-btn" id="portrait-collapse-btn" style="display: none;">
36+
<i class="fa-solid fa-chevron-down"></i>
37+
</button>
3338
<button class="filter-reset hidden" id="filter-reset">
3439
<i class="fa-solid fa-rotate-left"></i> Clear all
3540
</button>
3641
</div>
42+
</div>
43+
44+
<!-- Collapsible content wrapper (level 1) -->
45+
<div class="portrait-content-wrapper" id="portrait-content-wrapper">
3746

3847
<div class="filter-counter-box">
3948
<span class="filter-counter" id="filter-counter">{{ app_count }} application{% if app_count != 1 %}s{% endif %}</span>
@@ -44,13 +53,13 @@ custom_js:
4453
<input type="text" id="search-input" placeholder="Search applications..." />
4554
</div>
4655

47-
<!-- Toggle button for mobile portrait (hidden by default) -->
56+
<!-- Toggle button for mobile portrait tags (level 2) -->
4857
<button class="mobile-filter-toggle" id="mobile-filter-toggle" style="display: none;">
4958
<span>Show filter tags</span>
5059
<i class="fa-solid fa-chevron-down"></i>
5160
</button>
5261

53-
<!-- Collapsible tags container -->
62+
<!-- Collapsible tags container (level 2) -->
5463
<div class="filter-tags-wrapper" id="filter-tags-wrapper">
5564

5665
<div class="filter-tags-section">
@@ -78,6 +87,8 @@ custom_js:
7887
<div class="filter-bar" id="filter-bar-techniques"></div>
7988
</div>
8089

90+
</div>
91+
8192
</div>
8293
</div>
8394
</aside>

assets/css/applications.css

Lines changed: 108 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -125,17 +125,81 @@
125125
min-height: 44px;
126126
}
127127

128+
/* Portrait double accordion */
129+
.sidebar-header-actions {
130+
display: flex;
131+
flex-direction: row-reverse;
132+
gap: 0.5rem;
133+
align-items: center;
134+
flex: 1;
135+
}
136+
137+
.portrait-collapse-btn {
138+
display: flex !important;
139+
align-items: center;
140+
justify-content: center;
141+
width: 36px;
142+
height: 36px;
143+
background: var(--color-canvas-default, #ffffff);
144+
border: 1px solid var(--color-border-default, #e1e4e8);
145+
border-radius: 6px;
146+
cursor: pointer;
147+
color: var(--color-text-secondary, #586069);
148+
transition: all 0.15s ease;
149+
margin-left: auto;
150+
order: -1;
151+
}
152+
153+
.portrait-collapse-btn:hover {
154+
background: var(--color-canvas-subtle, #f6f8fa);
155+
}
156+
157+
.portrait-collapse-btn i {
158+
transition: transform 0.3s ease;
159+
}
160+
161+
.portrait-collapse-btn.expanded i {
162+
transform: rotate(180deg);
163+
}
164+
165+
/* Level 1 wrapper - collapsed by default */
166+
.portrait-content-wrapper {
167+
max-height: 0;
168+
overflow: hidden;
169+
transition: max-height 0.3s ease-in-out;
170+
}
171+
172+
.portrait-content-wrapper.expanded {
173+
max-height: 3000px;
174+
}
175+
128176
/* Card optimizations for portrait mobile */
129-
.apps-main {
130-
padding: 1rem;
177+
.container {
178+
padding-left: 0 !important;
179+
padding-right: 0 !important;
131180
}
132181

133-
.apps-main .contributors-header h1 {
134-
font-size: 1.75rem;
182+
.contributors-page {
183+
padding: 0 !important;
184+
}
185+
186+
.contributors-section {
187+
max-width: 100% !important;
188+
padding: 0 !important;
189+
}
190+
191+
.apps-main {
192+
padding: 1rem;
193+
max-width: 100% !important;
135194
}
136195

137196
.apps-main .contributors-header {
138197
margin-bottom: 1rem;
198+
padding: 0;
199+
}
200+
201+
.apps-main .contributors-header h1 {
202+
font-size: 1.75rem;
139203
}
140204

141205
.view-toggle-bar {
@@ -152,13 +216,13 @@
152216
}
153217

154218
.app-avatar-text {
155-
font-size: 1.25rem;
156-
padding: 0.4rem 0.6rem;
157-
width: 100px;
219+
font-size: 1rem;
220+
padding: 0.3rem 0.5rem;
221+
width: 75px;
158222
}
159223

160224
.app-title {
161-
font-size: 1rem;
225+
font-size: 0.95rem;
162226
}
163227

164228
.app-body {
@@ -173,10 +237,34 @@
173237
font-size: 0.65rem;
174238
padding: 0.2rem 0.5rem;
175239
}
240+
241+
/* Detailed view overrides for portrait mobile */
242+
.app-grid:not(.compact) .app-avatar-text {
243+
width: 75px !important;
244+
font-size: 1rem;
245+
}
246+
247+
/* Compact view overrides for portrait mobile */
248+
.app-grid.compact .app-avatar-text {
249+
width: 75px !important;
250+
font-size: 0.9rem;
251+
}
252+
253+
.app-grid.compact .app-title {
254+
font-size: 0.85rem;
255+
}
176256
}
177257

178-
/* Landscape mode ONLY - drawer sidebar (small screens only) */
179-
@media (max-width: 900px) and (max-height: 500px) and (orientation: landscape) {
258+
/* Landscape mode - drawer sidebar (≤768px in landscape OR small height) */
259+
@media (max-width: 900px) and (orientation: landscape) {
260+
/* Change layout to 1 column since sidebar is fixed */
261+
.apps-layout {
262+
grid-template-columns: 1fr;
263+
margin-left: 0;
264+
margin-right: 0;
265+
width: 100%;
266+
}
267+
180268
/* Show and configure overlay - behind sidebar but above content */
181269
.landscape-overlay {
182270
display: block;
@@ -228,7 +316,7 @@
228316
display: flex !important;
229317
position: fixed;
230318
left: 10px;
231-
top: 10px;
319+
top: 70px;
232320
z-index: 1001;
233321
width: 48px;
234322
height: 48px;
@@ -242,6 +330,15 @@
242330
color: var(--color-text-secondary, #586069);
243331
transition: all 0.15s ease;
244332
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
333+
opacity: 1;
334+
visibility: visible;
335+
transition: opacity 0.3s ease, visibility 0.3s ease;
336+
}
337+
338+
.landscape-hamburger.hidden {
339+
opacity: 0;
340+
visibility: hidden;
341+
pointer-events: none;
245342
}
246343

247344
.landscape-hamburger:hover {
@@ -308,24 +405,6 @@
308405
}
309406
}
310407

311-
@media (max-width: 968px) and (min-width: 481px) {
312-
.apps-layout {
313-
grid-template-columns: 1fr;
314-
margin-left: 0;
315-
margin-right: 0;
316-
width: 100%;
317-
}
318-
.filter-sidebar {
319-
border-right: none;
320-
border-bottom: 1px solid var(--color-border-default, #e1e4e8);
321-
}
322-
.filter-sidebar-inner {
323-
position: relative !important;
324-
top: 0 !important;
325-
max-height: none !important;
326-
}
327-
}
328-
329408
.sidebar-header {
330409
display: flex;
331410
justify-content: space-between;

assets/js/applications.js

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,29 @@
3535
btnDetailed.addEventListener('click', function() { setView('detailed'); });
3636
btnCompact.addEventListener('click', function() { setView('compact'); });
3737

38-
// ÉTAPE 1: Mobile portrait filter toggle
38+
// ÉTAPE 4: Portrait double accordion - Level 1 (main content)
39+
var portraitCollapseBtn = document.getElementById('portrait-collapse-btn');
40+
var portraitContentWrapper = document.getElementById('portrait-content-wrapper');
41+
var PORTRAIT_CONTENT_KEY = 'portrait-content-expanded';
42+
43+
if (portraitCollapseBtn && portraitContentWrapper) {
44+
// Load saved state (default: collapsed)
45+
var contentState = localStorage.getItem(PORTRAIT_CONTENT_KEY);
46+
if (contentState === 'true') {
47+
portraitContentWrapper.classList.add('expanded');
48+
portraitCollapseBtn.classList.add('expanded');
49+
}
50+
51+
// Toggle on click
52+
portraitCollapseBtn.addEventListener('click', function() {
53+
portraitContentWrapper.classList.toggle('expanded');
54+
portraitCollapseBtn.classList.toggle('expanded');
55+
var isExpanded = portraitContentWrapper.classList.contains('expanded');
56+
localStorage.setItem(PORTRAIT_CONTENT_KEY, isExpanded);
57+
});
58+
}
59+
60+
// ÉTAPE 1: Mobile portrait filter toggle - Level 2 (tags)
3961
var mobileFilterToggle = document.getElementById('mobile-filter-toggle');
4062
var filterTagsWrapper = document.getElementById('filter-tags-wrapper');
4163
var MOBILE_FILTERS_KEY = 'mobile-filters-expanded';
@@ -71,15 +93,18 @@
7193
if (drawerState === 'false') {
7294
filterSidebar.classList.add('closed');
7395
landscapeOverlay.classList.remove('visible');
96+
landscapeHamburger.classList.remove('hidden');
7497
} else {
75-
// Default: drawer open, show overlay
98+
// Default: drawer open, show overlay, hide hamburger
7699
landscapeOverlay.classList.add('visible');
100+
landscapeHamburger.classList.add('hidden');
77101
}
78102

79103
// Toggle drawer
80104
function toggleDrawer() {
81105
filterSidebar.classList.toggle('closed');
82106
landscapeOverlay.classList.toggle('visible');
107+
landscapeHamburger.classList.toggle('hidden');
83108
var isOpen = !filterSidebar.classList.contains('closed');
84109
localStorage.setItem(LANDSCAPE_DRAWER_KEY, isOpen);
85110
}

0 commit comments

Comments
 (0)