Skip to content

Commit 3cb42a5

Browse files
committed
feat(app-content): Revise sidebar selection and content edge styling
Main content now has a subtle left divider and rounded left edge next to the navigation. Selected nav and list items use a softly tinted pill instead of a solid primary fill. Signed-off-by: nfebe <fenn25.fn@gmail.com>
1 parent 9cf17af commit 3cb42a5

44 files changed

Lines changed: 185 additions & 19 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/assets/NcAppNavigationItem.scss

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,42 @@
2828
}
2929
}
3030

31-
// When .active class is applied, change color background of link and utils. The
32-
// !important prevents the focus state to override the active state.
33-
&.active {
31+
// !important so :focus-within does not override the active state.
32+
// New design (NC34+): glassy tinted bg + inline-start stripe.
33+
&:not(.app-navigation-entry--legacy).active {
34+
background-color: color-mix(in srgb, var(--color-primary-element) 16%, transparent) !important;
35+
36+
&:hover {
37+
background-color: color-mix(in srgb, var(--color-primary-element) 25%, transparent) !important;
38+
}
39+
40+
&:not(.app-navigation-entry--editing) {
41+
.app-navigation-entry-link,
42+
.app-navigation-entry-button {
43+
color: var(--color-main-text) !important;
44+
}
45+
}
46+
47+
&:not(.app-navigation-entry--editing)::before {
48+
content: '';
49+
position: absolute;
50+
inset-block: calc(var(--default-grid-baseline, 4px) * 2);
51+
inset-inline-start: 0;
52+
width: 3px;
53+
background-color: var(--color-primary-element);
54+
border-radius: 999px;
55+
animation: nc-nav-stripe-in var(--animation-quick, 200ms) ease-out;
56+
}
57+
}
58+
59+
// Legacy design (NC < 34): solid primary fill.
60+
&.app-navigation-entry--legacy.active {
3461
background-color: var(--color-primary-element) !important;
3562

3663
&:hover {
3764
background-color: var(--color-primary-element-hover) !important;
3865
}
3966

40-
// overwrite active text color
4167
.app-navigation-entry-link, .app-navigation-entry-button {
4268
color: var(--color-primary-element-text) !important;
4369
}
@@ -46,6 +72,10 @@
4672
&:hover {
4773
background-color: var(--color-background-hover);
4874
}
75+
&:not(.app-navigation-entry--legacy):focus-within,
76+
&:not(.app-navigation-entry--legacy):hover {
77+
background-color: color-mix(in srgb, var(--color-primary-element) 8%, transparent);
78+
}
4979
&.active,
5080
&:focus-within,
5181
&:hover {
@@ -71,7 +101,10 @@
71101
.app-navigation-entry__actions:hover :deep(.button-vue) {
72102
background-color: var(--color-background-dark) !important;
73103
}
74-
&.active .app-navigation-entry__actions:hover :deep(.button-vue) {
104+
&:not(.app-navigation-entry--legacy).active .app-navigation-entry__actions:hover :deep(.button-vue) {
105+
background-color: var(--color-background-dark) !important;
106+
}
107+
&.app-navigation-entry--legacy.active .app-navigation-entry__actions:hover :deep(.button-vue) {
75108
background-color: var(--color-primary-element) !important;
76109
}
77110

@@ -97,6 +130,7 @@
97130
padding: 0;
98131
white-space: nowrap;
99132
color: var(--color-main-text);
133+
font-weight: 500;
100134
background-repeat: no-repeat;
101135
background-position: $icon-margin center;
102136
background-size: $icon-size $icon-size;
@@ -227,3 +261,14 @@
227261
}
228262
}
229263
}
264+
265+
@keyframes nc-nav-stripe-in {
266+
from {
267+
transform: scaleY(0);
268+
opacity: 0;
269+
}
270+
to {
271+
transform: scaleY(1);
272+
opacity: 1;
273+
}
274+
}

src/components/NcAppNavigation/NcAppNavigation.vue

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ import NcAppNavigationList from '../NcAppNavigationList/NcAppNavigationList.vue'
145145
import NcAppNavigationToggle from './NcAppNavigationToggle.vue'
146146
import { useIsMobile } from '../../composables/useIsMobile/index.ts'
147147
import { getTrapStack } from '../../utils/focusTrap.ts'
148+
import { isLegacy34 } from '../../utils/legacy.ts'
148149
import { HAS_APP_NAVIGATION_KEY } from '../NcContent/constants.ts'
149150
150151
const props = defineProps<{
@@ -296,7 +297,10 @@ function handleEsc(): void {
296297
<div
297298
ref="appNavigationContainer"
298299
class="app-navigation"
299-
:class="{ 'app-navigation--closed': !open }">
300+
:class="{
301+
'app-navigation--closed': !open,
302+
'app-navigation--legacy': isLegacy34,
303+
}">
300304
<nav
301305
id="app-navigation-vue"
302306
:aria-hidden="open ? 'false' : 'true'"
@@ -354,9 +358,14 @@ function handleEsc(): void {
354358
user-select: none;
355359
flex-grow: 0;
356360
flex-shrink: 0;
357-
background-color: var(--color-main-background-blur, var(--color-main-background));
358-
-webkit-backdrop-filter: var(--filter-background-blur, none);
359-
backdrop-filter: var(--filter-background-blur, none);
361+
// New design (NC34+): transparent so the frosted chrome on NcContent shows through.
362+
background-color: transparent;
363+
364+
&--legacy {
365+
background-color: var(--color-main-background-blur, var(--color-main-background));
366+
-webkit-backdrop-filter: var(--filter-background-blur, none);
367+
backdrop-filter: var(--filter-background-blur, none);
368+
}
360369
361370
&--closed {
362371
margin-inline-start: calc(-1 * min($navigation-width, var(--app-navigation-max-width)));

src/components/NcAppNavigationItem/NcAppNavigationIconCollapsible.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
'icon-collapse--open': open,
1313
}"
1414
:aria-label="labelButton"
15-
:variant="active ? 'tertiary-on-primary' : 'tertiary'"
15+
:variant="(active && isLegacy34) ? 'tertiary-on-primary' : 'tertiary'"
1616
@click="onClick">
1717
<template #icon>
1818
<ChevronUp
@@ -29,6 +29,7 @@
2929
import ChevronDown from 'vue-material-design-icons/ChevronDown.vue'
3030
import ChevronUp from 'vue-material-design-icons/ChevronUp.vue'
3131
import { t } from '../../l10n.ts'
32+
import { isLegacy34 } from '../../utils/legacy.ts'
3233
import NcButton from '../NcButton/index.ts'
3334
3435
export default {
@@ -40,6 +41,10 @@ export default {
4041
ChevronUp,
4142
},
4243
44+
setup() {
45+
return { isLegacy34 }
46+
},
47+
4348
props: {
4449
/**
4550
* Is the list currently open (or collapsed)

src/components/NcAppNavigationItem/NcAppNavigationItem.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ Just set the `pinned` prop.
322322
:class="{
323323
'app-navigation-entry--editing': editingActive,
324324
'app-navigation-entry--deleted': undo,
325+
'app-navigation-entry--legacy': isLegacy34,
325326
active: (to && isActive) || active,
326327
}">
327328
<!-- Icon and name -->
@@ -391,7 +392,7 @@ Just set the `pinned` prop.
391392
:open="menuOpen"
392393
:forceMenu="forceMenu"
393394
:defaultIcon="menuIcon"
394-
:variant="(to && isActive) || active ? 'tertiary-on-primary' : 'tertiary'"
395+
variant="tertiary"
395396
@update:open="onMenuToggle">
396397
<template #icon>
397398
<!-- @slot Slot for the custom menu icon -->
@@ -444,6 +445,7 @@ import NcInputConfirmCancel from './NcInputConfirmCancel.vue'
444445
import { useIsMobile } from '../../composables/useIsMobile/index.js'
445446
import { t } from '../../l10n.ts'
446447
import { createElementId } from '../../utils/createElementId.ts'
448+
import { isLegacy34 } from '../../utils/legacy.ts'
447449
import NcActionButton from '../NcActionButton/index.js'
448450
import NcActions from '../NcActions/index.js'
449451
import NcLoadingIcon from '../NcLoadingIcon/index.ts'
@@ -663,6 +665,7 @@ export default {
663665
setup() {
664666
return {
665667
isMobile: useIsMobile(),
668+
isLegacy34,
666669
}
667670
},
668671

src/components/NcAppNavigationItem/NcInputConfirmCancel.vue

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
</docs>
1313

1414
<template>
15-
<div class="app-navigation-input-confirm">
15+
<div class="app-navigation-input-confirm" :class="{ 'app-navigation-input-confirm--legacy': isLegacy34 }">
1616
<form
1717
@submit.prevent="confirm"
1818
@keydown.esc.exact.stop.prevent="cancel"
@@ -51,6 +51,7 @@
5151
import IconArrowRight from 'vue-material-design-icons/ArrowRight.vue'
5252
import IconClose from 'vue-material-design-icons/Close.vue'
5353
import { t } from '../../l10n.ts'
54+
import { isLegacy34 } from '../../utils/legacy.ts'
5455
import NcButton from '../NcButton/index.js'
5556
5657
export default {
@@ -62,6 +63,10 @@ export default {
6263
NcButton,
6364
},
6465
66+
setup() {
67+
return { isLegacy34 }
68+
},
69+
6570
props: {
6671
/**
6772
* If this element is used on a primary element set to true for primary styling.
@@ -156,5 +161,25 @@ $input-margin: 5px;
156161
border-color: var(--color-primary-element);
157162
}
158163
}
164+
165+
// New design (NC34+): square confirm/cancel buttons with consistent gaps.
166+
&:not(&--legacy) {
167+
form {
168+
align-items: center;
169+
gap: $input-margin;
170+
padding-inline-end: $input-margin;
171+
}
172+
173+
.app-navigation-input-confirm__input {
174+
margin-inline-end: 0 !important;
175+
}
176+
177+
:deep(.button-vue) {
178+
width: $input-height !important;
179+
min-width: $input-height !important;
180+
height: $input-height !important;
181+
flex: 0 0 $input-height;
182+
}
183+
}
159184
}
160185
</style>

src/components/NcContent/NcContent.vue

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ import NcButton from '../NcButton/NcButton.vue'
7171
import NcIconSvgWrapper from '../NcIconSvgWrapper/NcIconSvgWrapper.vue'
7272
import { useIsMobile } from '../../composables/useIsMobile/index.js'
7373
import { t } from '../../l10n.ts'
74+
import { isLegacy34 } from '../../utils/legacy.ts'
7475
import { CONTENT_SELECTOR_KEY, HAS_APP_NAVIGATION_KEY } from './constants.ts'
7576
import contentSvg from './content-selected.svg?raw'
7677
import navigationSvg from './navigation-selected.svg?raw'
@@ -145,7 +146,10 @@ function setAppNavigation(value: boolean): void {
145146
</script>
146147

147148
<template>
148-
<div id="content-vue" class="content" :class="`app-${appName.toLowerCase()}`">
149+
<div
150+
id="content-vue"
151+
class="content"
152+
:class="[`app-${appName.toLowerCase()}`, { 'content--legacy': isLegacy34 }]">
149153
<Teleport to="#skip-actions">
150154
<div class="vue-skip-actions__container">
151155
<div class="vue-skip-actions__headline">
@@ -190,6 +194,15 @@ function setAppNavigation(value: boolean): void {
190194
padding: var(--body-container-margin)!important;
191195
backdrop-filter: brightness(50%);
192196
}
197+
198+
// New design (NC34+): divider only when an open navigation is present.
199+
@media only screen and (min-width: $breakpoint-mobile) {
200+
.content:not(.content--legacy) .app-navigation:not(.app-navigation--closed):not(.app-navigation--close) ~ .app-content {
201+
border-inline-start: 1px solid var(--color-border);
202+
border-start-start-radius: var(--body-container-radius);
203+
border-end-start-radius: var(--body-container-radius);
204+
}
205+
}
193206
</style>
194207

195208
<style lang="scss" scoped>
@@ -236,6 +249,14 @@ function setAppNavigation(value: boolean): void {
236249
overflow: hidden;
237250
padding: 0;
238251
252+
// New design (NC34+): wrapper carries the frosted chrome so nav and
253+
// AppContent rounded-edge cutouts share one surface.
254+
&:not(&--legacy) {
255+
background-color: var(--color-main-background-blur, var(--color-main-background));
256+
backdrop-filter: var(--filter-background-blur, none);
257+
-webkit-backdrop-filter: var(--filter-background-blur, none);
258+
}
259+
239260
&:not(.with-sidebar--full) {
240261
position: fixed;
241262
}

0 commit comments

Comments
 (0)