picocrank 1.21.5 → 1.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +8 -8
- package/public/themes/README.md +29 -0
- package/public/themes/catppuccin/theme.css +195 -0
- package/public/themes/dracula/theme.css +181 -0
- package/public/themes/index.json +7 -0
- package/public/themes/waffles/theme.css +143 -0
- package/router.js +20 -0
- package/styles/dark-theme.css +15 -1
- package/styles.css +18 -2
- package/vite.config.js +57 -0
- package/vue/components/CheckGroup.vue +156 -0
- package/vue/components/FormField.vue +14 -2
- package/vue/components/Header.vue +139 -33
- package/vue/components/QuickSearch.vue +325 -348
- package/vue/components/RadioGroup.vue +191 -0
- package/vue/components/Sidebar.vue +226 -262
- package/vue/components/SidebarNavLink.vue +161 -0
- package/vue/composables/useCustomTheme.js +162 -0
- package/vue/data/examplePeople.js +45 -0
- package/vue/views/App.vue +85 -15
- package/vue/views/FormExample.vue +64 -29
- package/vue/views/PageStructure.vue +168 -95
- package/vue/views/TableExample.vue +2 -76
- package/vue/views/ThemePreview.vue +172 -0
- package/vue/views/UserDetails.vue +39 -0
- package/vue/views/Welcome.vue +9 -6
|
@@ -1,100 +1,115 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<aside
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
2
|
+
<aside
|
|
3
|
+
:id="SIDEBAR_PANEL_ID"
|
|
4
|
+
ref="sidebarRef"
|
|
5
|
+
class="sidebar"
|
|
6
|
+
:class="{ 'shown': isOpen, 'stuck': isStuck }"
|
|
7
|
+
aria-label="Sidebar"
|
|
8
|
+
:aria-hidden="isVisible ? undefined : 'true'"
|
|
9
|
+
:inert="isVisible ? undefined : true"
|
|
10
|
+
>
|
|
11
|
+
<div class="flex-row">
|
|
12
|
+
<h2 :id="headingId">Navigation</h2>
|
|
13
|
+
<div class="fg1" />
|
|
14
|
+
<button
|
|
15
|
+
type="button"
|
|
16
|
+
class="stick-toggle"
|
|
17
|
+
:aria-pressed="isStuck"
|
|
18
|
+
:aria-label="isStuck ? 'Unstick sidebar' : 'Stick sidebar'"
|
|
19
|
+
:title="isStuck ? 'Unstick sidebar' : 'Stick sidebar'"
|
|
20
|
+
@click="toggleStick"
|
|
21
|
+
>
|
|
22
|
+
<span aria-hidden="true">
|
|
23
|
+
<HugeiconsIcon
|
|
24
|
+
v-if="isStuck"
|
|
25
|
+
:icon="Pin02Icon"
|
|
26
|
+
width="1em"
|
|
27
|
+
height="1em"
|
|
28
|
+
:strokeWidth="3"
|
|
29
|
+
/>
|
|
30
|
+
<HugeiconsIcon
|
|
31
|
+
v-else
|
|
32
|
+
:icon="PinIcon"
|
|
33
|
+
width="1em"
|
|
34
|
+
height="1em"
|
|
35
|
+
:strokeWidth="3"
|
|
36
|
+
/>
|
|
37
|
+
</span>
|
|
38
|
+
</button>
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<nav class="mainnav" :aria-labelledby="headingId">
|
|
42
|
+
<menu class="navigation-links">
|
|
43
|
+
<SidebarNavLink
|
|
44
|
+
v-for="link in navigationGroups.ungrouped"
|
|
45
|
+
:key="link.name"
|
|
46
|
+
:link="link"
|
|
47
|
+
:active="isLinkActive(link)"
|
|
48
|
+
@select="handleNavItemClick"
|
|
49
|
+
/>
|
|
50
|
+
|
|
51
|
+
<li
|
|
52
|
+
v-for="section in navigationGroups.sections"
|
|
53
|
+
:key="section.id"
|
|
54
|
+
class="nav-section"
|
|
55
|
+
>
|
|
56
|
+
<button
|
|
57
|
+
type="button"
|
|
58
|
+
class="nav-section-header"
|
|
59
|
+
:id="sectionHeaderId(section.id)"
|
|
60
|
+
:aria-expanded="!isSectionCollapsed(section.id)"
|
|
61
|
+
:aria-controls="sectionPanelId(section.id)"
|
|
62
|
+
@click="toggleSection(section.id)"
|
|
63
|
+
>
|
|
64
|
+
<span>{{ section.title }}</span>
|
|
65
|
+
<HugeiconsIcon
|
|
66
|
+
:icon="isSectionCollapsed(section.id) ? ArrowRight01Icon : ArrowDown01Icon"
|
|
67
|
+
width="0.85em"
|
|
68
|
+
height="0.85em"
|
|
69
|
+
class="nav-section-chevron"
|
|
70
|
+
aria-hidden="true"
|
|
71
|
+
/>
|
|
72
|
+
</button>
|
|
73
|
+
|
|
74
|
+
<menu
|
|
75
|
+
:id="sectionPanelId(section.id)"
|
|
76
|
+
class="nav-section-links"
|
|
77
|
+
role="group"
|
|
78
|
+
:aria-labelledby="sectionHeaderId(section.id)"
|
|
79
|
+
:hidden="isSectionCollapsed(section.id)"
|
|
80
|
+
>
|
|
81
|
+
<SidebarNavLink
|
|
82
|
+
v-for="link in section.items"
|
|
83
|
+
:key="link.name"
|
|
84
|
+
:link="link"
|
|
85
|
+
:active="isLinkActive(link)"
|
|
86
|
+
@select="handleNavItemClick"
|
|
87
|
+
/>
|
|
88
|
+
</menu>
|
|
89
|
+
</li>
|
|
90
|
+
|
|
91
|
+
<SidebarNavLink
|
|
92
|
+
v-for="link in navigationGroups.trailingUngrouped"
|
|
93
|
+
:key="link.name"
|
|
94
|
+
:link="link"
|
|
95
|
+
:active="isLinkActive(link)"
|
|
96
|
+
@select="handleNavItemClick"
|
|
97
|
+
/>
|
|
98
|
+
</menu>
|
|
99
|
+
</nav>
|
|
88
100
|
</aside>
|
|
89
101
|
</template>
|
|
90
102
|
|
|
91
103
|
<script setup>
|
|
92
|
-
import { ref, inject, onUnmounted, watch, nextTick, computed } from 'vue'
|
|
104
|
+
import { ref, inject, onUnmounted, watch, nextTick, computed, useId } from 'vue'
|
|
93
105
|
import { useRoute } from 'vue-router'
|
|
94
106
|
import { HugeiconsIcon } from '@hugeicons/vue'
|
|
95
107
|
import { Pin02Icon, PinIcon, ArrowDown01Icon, ArrowRight01Icon } from '@hugeicons/core-free-icons'
|
|
108
|
+
import SidebarNavLink from './SidebarNavLink.vue'
|
|
96
109
|
|
|
97
110
|
const STORAGE_KEY = 'picocrank-nav-sections-collapsed'
|
|
111
|
+
const SIDEBAR_PANEL_ID = 'picocrank-sidebar'
|
|
112
|
+
const TOGGLER_ID = 'sidebar-toggler-button'
|
|
98
113
|
|
|
99
114
|
const props = defineProps({
|
|
100
115
|
navigation: {
|
|
@@ -107,13 +122,15 @@ const isOpen = ref(false)
|
|
|
107
122
|
const isStuck = ref(false)
|
|
108
123
|
const sidebarRef = ref(null)
|
|
109
124
|
const route = useRoute()
|
|
125
|
+
const headingId = useId()
|
|
126
|
+
|
|
127
|
+
const isVisible = computed(() => isOpen.value || isStuck.value)
|
|
110
128
|
|
|
111
129
|
const injectedNavigation = inject('navigation', null)
|
|
112
130
|
|
|
113
131
|
const navigation = computed(() => {
|
|
114
132
|
const nav = props.navigation || injectedNavigation
|
|
115
133
|
if (!nav) return null
|
|
116
|
-
// Component ref (or ref-like): use exposed API
|
|
117
134
|
if (nav.value) {
|
|
118
135
|
return nav.value
|
|
119
136
|
}
|
|
@@ -158,6 +175,14 @@ function isSectionCollapsed(sectionId) {
|
|
|
158
175
|
return collapsedSections.value.has(sectionId)
|
|
159
176
|
}
|
|
160
177
|
|
|
178
|
+
function sectionHeaderId(sectionId) {
|
|
179
|
+
return `nav-section-header-${sectionId}`
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function sectionPanelId(sectionId) {
|
|
183
|
+
return `nav-section-${sectionId}`
|
|
184
|
+
}
|
|
185
|
+
|
|
161
186
|
function toggleSection(sectionId) {
|
|
162
187
|
const next = new Set(collapsedSections.value)
|
|
163
188
|
if (next.has(sectionId)) {
|
|
@@ -202,40 +227,6 @@ const navigationGroups = computed(() => {
|
|
|
202
227
|
return { ungrouped, trailingUngrouped, sections }
|
|
203
228
|
})
|
|
204
229
|
|
|
205
|
-
const visibleNavItems = computed(() => {
|
|
206
|
-
const items = []
|
|
207
|
-
|
|
208
|
-
for (const link of navigationGroups.value.ungrouped) {
|
|
209
|
-
items.push({ key: link.name, kind: 'link', link })
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
for (const section of navigationGroups.value.sections) {
|
|
213
|
-
const collapsed = isSectionCollapsed(section.id)
|
|
214
|
-
items.push({
|
|
215
|
-
key: section.id,
|
|
216
|
-
kind: 'section-header',
|
|
217
|
-
section,
|
|
218
|
-
collapsed,
|
|
219
|
-
})
|
|
220
|
-
|
|
221
|
-
if (!collapsed) {
|
|
222
|
-
for (const link of section.items) {
|
|
223
|
-
items.push({
|
|
224
|
-
key: link.name,
|
|
225
|
-
kind: 'link',
|
|
226
|
-
link,
|
|
227
|
-
})
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
for (const link of navigationGroups.value.trailingUngrouped) {
|
|
233
|
-
items.push({ key: link.name, kind: 'link', link })
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
return items
|
|
237
|
-
})
|
|
238
|
-
|
|
239
230
|
function expandSectionContainingActiveRoute() {
|
|
240
231
|
for (const section of navigationGroups.value.sections) {
|
|
241
232
|
const hasActiveLink = section.items.some((link) => isActive(link))
|
|
@@ -254,126 +245,143 @@ watch(() => route.fullPath, () => {
|
|
|
254
245
|
}, { immediate: true })
|
|
255
246
|
|
|
256
247
|
function toggleStick() {
|
|
257
|
-
|
|
248
|
+
isStuck.value = !isStuck.value
|
|
258
249
|
}
|
|
259
250
|
|
|
260
251
|
function stick() {
|
|
261
|
-
|
|
252
|
+
isStuck.value = true
|
|
262
253
|
}
|
|
263
254
|
|
|
264
255
|
function unstick() {
|
|
265
|
-
|
|
256
|
+
isStuck.value = false
|
|
266
257
|
}
|
|
267
258
|
|
|
268
259
|
function toggle() {
|
|
269
|
-
|
|
270
|
-
|
|
260
|
+
isOpen.value = !isOpen.value
|
|
261
|
+
isStuck.value = false
|
|
271
262
|
}
|
|
272
263
|
|
|
273
264
|
function open() {
|
|
274
|
-
|
|
265
|
+
isOpen.value = true
|
|
275
266
|
}
|
|
276
267
|
|
|
277
268
|
function close() {
|
|
278
|
-
|
|
279
|
-
|
|
269
|
+
isOpen.value = false
|
|
270
|
+
isStuck.value = false
|
|
280
271
|
}
|
|
281
272
|
|
|
282
273
|
function isLinkActive(link) {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
274
|
+
if (link.disabled) {
|
|
275
|
+
return false
|
|
276
|
+
}
|
|
277
|
+
return isActive(link)
|
|
287
278
|
}
|
|
288
279
|
|
|
289
|
-
function
|
|
290
|
-
|
|
280
|
+
function handleNavItemClick(link) {
|
|
281
|
+
if (link.disabled) {
|
|
282
|
+
return
|
|
283
|
+
}
|
|
284
|
+
if (link.type === 'callback' && link.callback) {
|
|
285
|
+
handleLinkClick(() => link.callback())
|
|
286
|
+
return
|
|
287
|
+
}
|
|
288
|
+
handleLinkClick()
|
|
291
289
|
}
|
|
292
290
|
|
|
293
|
-
function
|
|
294
|
-
|
|
291
|
+
function handleLinkClick(callback = null) {
|
|
292
|
+
if (callback) {
|
|
293
|
+
callback()
|
|
294
|
+
}
|
|
295
|
+
if (!isStuck.value) {
|
|
296
|
+
close()
|
|
297
|
+
}
|
|
295
298
|
}
|
|
296
299
|
|
|
297
|
-
function
|
|
298
|
-
|
|
299
|
-
|
|
300
|
+
function syncTogglerAria() {
|
|
301
|
+
const toggler = document.getElementById(TOGGLER_ID)
|
|
302
|
+
if (!toggler) {
|
|
303
|
+
return
|
|
304
|
+
}
|
|
300
305
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
306
|
+
const expanded = isVisible.value
|
|
307
|
+
toggler.setAttribute('aria-expanded', String(expanded))
|
|
308
|
+
toggler.setAttribute('aria-controls', SIDEBAR_PANEL_ID)
|
|
309
|
+
toggler.setAttribute(
|
|
310
|
+
'aria-label',
|
|
311
|
+
expanded ? 'Close sidebar navigation' : 'Open sidebar navigation',
|
|
312
|
+
)
|
|
313
|
+
toggler.removeAttribute('aria-pressed')
|
|
314
|
+
toggler.removeAttribute('aria-haspopup')
|
|
310
315
|
}
|
|
311
316
|
|
|
312
|
-
function
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
317
|
+
function handleClickOutside(event) {
|
|
318
|
+
if (!isOpen.value || isStuck.value) {
|
|
319
|
+
return
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const target = event.target
|
|
323
|
+
|
|
324
|
+
const sidebarButton = document.getElementById('sidebar-button')
|
|
325
|
+
const sidebarTogglerButton = document.getElementById(TOGGLER_ID)
|
|
326
|
+
|
|
327
|
+
if (sidebarButton && sidebarButton.contains(target)) {
|
|
328
|
+
return
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (sidebarTogglerButton && sidebarTogglerButton.contains(target)) {
|
|
332
|
+
return
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
if (sidebarRef.value && !sidebarRef.value.contains(target)) {
|
|
336
|
+
close()
|
|
337
|
+
}
|
|
319
338
|
}
|
|
320
339
|
|
|
321
|
-
function
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
if (sidebarButton && sidebarButton.contains(target)) {
|
|
332
|
-
return
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
if (sidebarTogglerButton && sidebarTogglerButton.contains(target)) {
|
|
336
|
-
return
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
if (sidebarRef.value && !sidebarRef.value.contains(target)) {
|
|
340
|
-
close()
|
|
341
|
-
}
|
|
340
|
+
function handleDocumentKeydown(event) {
|
|
341
|
+
if (event.key !== 'Escape') {
|
|
342
|
+
return
|
|
343
|
+
}
|
|
344
|
+
if (!isOpen.value || isStuck.value) {
|
|
345
|
+
return
|
|
346
|
+
}
|
|
347
|
+
close()
|
|
348
|
+
document.getElementById(TOGGLER_ID)?.focus()
|
|
342
349
|
}
|
|
343
350
|
|
|
344
351
|
watch([isOpen, isStuck], ([open, stuck]) => {
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
+
nextTick(() => {
|
|
353
|
+
syncTogglerAria()
|
|
354
|
+
if (open && !stuck) {
|
|
355
|
+
document.addEventListener('click', handleClickOutside)
|
|
356
|
+
document.addEventListener('keydown', handleDocumentKeydown)
|
|
357
|
+
} else {
|
|
358
|
+
document.removeEventListener('click', handleClickOutside)
|
|
359
|
+
document.removeEventListener('keydown', handleDocumentKeydown)
|
|
360
|
+
}
|
|
361
|
+
})
|
|
352
362
|
}, { immediate: true })
|
|
353
363
|
|
|
354
364
|
onUnmounted(() => {
|
|
355
|
-
|
|
365
|
+
document.removeEventListener('click', handleClickOutside)
|
|
366
|
+
document.removeEventListener('keydown', handleDocumentKeydown)
|
|
356
367
|
})
|
|
357
368
|
|
|
358
369
|
defineExpose({
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
370
|
+
isOpen,
|
|
371
|
+
isStuck,
|
|
372
|
+
isVisible,
|
|
373
|
+
stick,
|
|
374
|
+
unstick,
|
|
375
|
+
toggleStick,
|
|
376
|
+
toggle,
|
|
377
|
+
open,
|
|
378
|
+
close,
|
|
366
379
|
})
|
|
367
380
|
</script>
|
|
368
381
|
|
|
369
382
|
<style scoped>
|
|
370
|
-
|
|
371
383
|
h2 {
|
|
372
|
-
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
.active {
|
|
376
|
-
text-decoration: underline;
|
|
384
|
+
padding: .75em;
|
|
377
385
|
}
|
|
378
386
|
|
|
379
387
|
li {
|
|
@@ -385,45 +393,15 @@ button {
|
|
|
385
393
|
border: 0;
|
|
386
394
|
}
|
|
387
395
|
|
|
388
|
-
.navigation-links
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
padding:
|
|
393
|
-
border-radius: 0;
|
|
394
|
-
position: relative;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
.nav-link-title {
|
|
398
|
-
flex: 1;
|
|
399
|
-
min-width: 0;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
.nav-link-indicator {
|
|
403
|
-
width: 0.5rem;
|
|
404
|
-
height: 0.5rem;
|
|
405
|
-
border-radius: 50%;
|
|
406
|
-
background: var(--indicator-color, #dc3545);
|
|
407
|
-
flex-shrink: 0;
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
.nav-link-count {
|
|
411
|
-
min-width: 1.25rem;
|
|
412
|
-
padding: 0.1rem 0.4rem;
|
|
413
|
-
border-radius: 999px;
|
|
414
|
-
background: var(--indicator-color, #dc3545);
|
|
415
|
-
color: #fff;
|
|
416
|
-
font-size: 0.75em;
|
|
417
|
-
font-weight: 600;
|
|
418
|
-
line-height: 1.2;
|
|
419
|
-
text-align: center;
|
|
420
|
-
flex-shrink: 0;
|
|
396
|
+
.navigation-links,
|
|
397
|
+
.nav-section-links {
|
|
398
|
+
list-style: none;
|
|
399
|
+
margin: 0;
|
|
400
|
+
padding: 0;
|
|
421
401
|
}
|
|
422
402
|
|
|
423
|
-
.
|
|
424
|
-
|
|
425
|
-
cursor: not-allowed;
|
|
426
|
-
opacity: 0.55;
|
|
403
|
+
.nav-section {
|
|
404
|
+
list-style: none;
|
|
427
405
|
}
|
|
428
406
|
|
|
429
407
|
.nav-section-header {
|
|
@@ -452,12 +430,6 @@ button {
|
|
|
452
430
|
opacity: 0.8;
|
|
453
431
|
}
|
|
454
432
|
|
|
455
|
-
.separator {
|
|
456
|
-
height: 1px;
|
|
457
|
-
background-color: #eee;
|
|
458
|
-
margin: 0.5rem 0.75rem;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
433
|
.icon {
|
|
462
434
|
font-size: 1.2em;
|
|
463
435
|
width: 1.5rem;
|
|
@@ -465,30 +437,22 @@ button {
|
|
|
465
437
|
}
|
|
466
438
|
|
|
467
439
|
html[data-theme="dark"] {
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
.nav-section-header {
|
|
473
|
-
color: #f8f9fa;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
.separator {
|
|
477
|
-
background-color: #444;
|
|
478
|
-
}
|
|
440
|
+
.nav-section-header {
|
|
441
|
+
color: #f8f9fa;
|
|
442
|
+
}
|
|
479
443
|
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
444
|
+
.supplemental-links {
|
|
445
|
+
border-top: 1px solid #444;
|
|
446
|
+
}
|
|
483
447
|
}
|
|
484
448
|
|
|
485
449
|
@media (max-width: 768px) {
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
450
|
+
.sidebar {
|
|
451
|
+
left: -100%;
|
|
452
|
+
}
|
|
489
453
|
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
454
|
+
.sidebar.shown {
|
|
455
|
+
left: 0;
|
|
456
|
+
}
|
|
493
457
|
}
|
|
494
458
|
</style>
|