diff --git a/.github/workflows/lint-stylelint.yml b/.github/workflows/lint-stylelint.yml
new file mode 100644
index 0000000000..2686f672f7
--- /dev/null
+++ b/.github/workflows/lint-stylelint.yml
@@ -0,0 +1,51 @@
+# This workflow is provided via the organization template repository
+#
+# https://github.com/nextcloud/.github
+# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
+#
+# SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors
+# SPDX-License-Identifier: MIT
+
+name: Lint stylelint
+
+on: pull_request
+
+permissions:
+ contents: read
+
+concurrency:
+ group: lint-stylelint-${{ github.head_ref || github.run_id }}
+ cancel-in-progress: true
+
+jobs:
+ lint:
+ runs-on: ubuntu-latest
+
+ name: stylelint
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
+
+ - name: Read package.json node and npm engines version
+ uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3
+ id: versions
+ with:
+ fallbackNode: '^20'
+ fallbackNpm: '^10'
+
+ - name: Set up node ${{ steps.versions.outputs.nodeVersion }}
+ uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v3
+ with:
+ node-version: ${{ steps.versions.outputs.nodeVersion }}
+
+ - name: Set up npm ${{ steps.versions.outputs.npmVersion }}
+ run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}"
+
+ - name: Install dependencies
+ env:
+ CYPRESS_INSTALL_BINARY: 0
+ run: npm ci
+
+ - name: Lint
+ run: npm run stylelint
diff --git a/.stylelintignore b/.stylelintignore
index c01a6674ea..d96170e4fb 100644
--- a/.stylelintignore
+++ b/.stylelintignore
@@ -1 +1,3 @@
-src/fonts
\ No newline at end of file
+src/fonts
+*.json
+*.orig
diff --git a/css/app-navigation.scss b/css/app-navigation.scss
index c1922c809f..dba9eb30d2 100644
--- a/css/app-navigation.scss
+++ b/css/app-navigation.scss
@@ -189,7 +189,7 @@
.multiselect {
width: 100%;
- border-radius: var(--border-radius-large);
+ border-radius: var(--border-radius-large);
&__content-wrapper {
z-index: 200 !important;
diff --git a/css/app-sidebar.scss b/css/app-sidebar.scss
index 1e8abcde0e..b19fc59b9a 100644
--- a/css/app-sidebar.scss
+++ b/css/app-sidebar.scss
@@ -366,9 +366,6 @@
flex: 1 auto;
}
- &--timed {
- }
-
&--all-day {
flex-wrap: wrap;
margin-bottom: 5px;
@@ -518,6 +515,10 @@
}
&__icon {
+ flex-shrink: 0;
+ margin-left: -5px;
+ margin-right: 5px;
+
&--hidden {
visibility: hidden;
}
@@ -534,12 +535,6 @@
opacity: 1;
}
- &__icon {
- flex-shrink: 0;
- margin-left: -5px;
- margin-right: 5px;
- }
-
&__input {
flex-grow: 2;
@@ -702,6 +697,7 @@
}
+/* stylelint-disable-next-line no-duplicate-selectors */
.event-popover .event-popover__inner {
.event-popover__response-buttons {
margin-top: 8px;
@@ -736,6 +732,7 @@
overflow: unset !important;
}
+ /* stylelint-disable-next-line no-duplicate-selectors */
.event-popover__inner {
text-align: left;
max-width: 480px;
diff --git a/css/calendar.scss b/css/calendar.scss
index 1f8eb00360..c4c07e2b16 100644
--- a/css/calendar.scss
+++ b/css/calendar.scss
@@ -19,14 +19,14 @@
* License along with this library. If not, see .
*
*/
-@import 'app-navigation.scss';
-@import 'app-sidebar.scss';
-@import 'app-settings.scss';
-@import 'app-modal.scss';
-@import 'freebusy.scss';
-@import 'fullcalendar.scss';
-@import 'global.scss';
-@import 'import.scss';
-@import 'print.scss';
-@import 'public.scss';
-@import 'props-linkify-links.scss';
+@import 'app-navigation';
+@import 'app-sidebar';
+@import 'app-settings';
+@import 'app-modal';
+@import 'freebusy';
+@import 'fullcalendar';
+@import 'global';
+@import 'import';
+@import 'print';
+@import 'public';
+@import 'props-linkify-links';
diff --git a/css/dashboard.css b/css/dashboard.css
index 12b67671e0..abbdf8a707 100644
--- a/css/dashboard.css
+++ b/css/dashboard.css
@@ -1,4 +1,4 @@
.app-icon-calendar {
background-image: url('../img/calendar-dark.svg');
- filter: var(--background-invert-if-dark);
+ filter: var(--background-invert-if-dark);
}
diff --git a/css/fullcalendar.scss b/css/fullcalendar.scss
index f164e1bda0..59458797fe 100644
--- a/css/fullcalendar.scss
+++ b/css/fullcalendar.scss
@@ -23,6 +23,8 @@
/** Override some FullCalendar CSS vars: */
.fc {
+ font-family: var(--font-face) !important;
+
--fc-small-font-size: 0.875em;
--fc-page-bg-color: var(--color-main-background) !important;
--fc-neutral-bg-color: var(--color-background-dark) !important;
@@ -49,10 +51,6 @@
--fc-list-event-hover-bg-color: var(--color-background-hover) !important;
}
-.fc {
- font-family: var(--font-face) !important;
-}
-
// ### FullCalendar Grid adjustments
// Make the labels lighter
.fc-timegrid-axis-frame,
@@ -241,6 +239,9 @@
.fc-col-header-cell {
word-break: break-word;
white-space: normal;
+
+ // Fix week button overlapping with the toggle
+ padding-top: 10px !important;
}
.fc-timeGridWeek-view {
@@ -276,14 +277,11 @@
min-height: 150px !important;
}
}
+
.fc-daygrid-day-events {
position:relative !important;
}
-// Fix week button overlapping with the toggle
-.fc-col-header-cell {
- padding-top: 10px !important;
-}
.fc-timegrid-axis-cushion {
margin-top: 44px;
}
diff --git a/src/components/AppNavigation/AppNavigationHeader/AppNavigationHeaderDatePicker.vue b/src/components/AppNavigation/AppNavigationHeader/AppNavigationHeaderDatePicker.vue
index c447faa4ab..b319fb480c 100644
--- a/src/components/AppNavigation/AppNavigationHeader/AppNavigationHeaderDatePicker.vue
+++ b/src/components/AppNavigation/AppNavigationHeader/AppNavigationHeaderDatePicker.vue
@@ -235,6 +235,6 @@ export default {
diff --git a/src/components/AppNavigation/EditCalendarModal/SharingSearch.vue b/src/components/AppNavigation/EditCalendarModal/SharingSearch.vue
index c0c81baac4..fc5b06794d 100644
--- a/src/components/AppNavigation/EditCalendarModal/SharingSearch.vue
+++ b/src/components/AppNavigation/EditCalendarModal/SharingSearch.vue
@@ -283,8 +283,8 @@ export default {
gap: 10px;
width: 100%;
-&__group-icon,
-&__team-icon {
+ &__group-icon,
+ &__team-icon {
width: 32px;
height: 32px;
border-radius: 16px;
diff --git a/src/components/AppNavigation/Settings/SettingsAttachmentsFolder.vue b/src/components/AppNavigation/Settings/SettingsAttachmentsFolder.vue
index e787fb5cd9..95688b5156 100644
--- a/src/components/AppNavigation/Settings/SettingsAttachmentsFolder.vue
+++ b/src/components/AppNavigation/Settings/SettingsAttachmentsFolder.vue
@@ -90,7 +90,3 @@ export default {
},
}
-
-
diff --git a/src/components/AppointmentConfigModal.vue b/src/components/AppointmentConfigModal.vue
index 2cd709a8ee..18b94ad713 100644
--- a/src/components/AppointmentConfigModal.vue
+++ b/src/components/AppointmentConfigModal.vue
@@ -331,8 +331,8 @@ export default {
diff --git a/src/components/CalendarGrid.vue b/src/components/CalendarGrid.vue
index 265ed2e635..e16716c2c3 100644
--- a/src/components/CalendarGrid.vue
+++ b/src/components/CalendarGrid.vue
@@ -345,6 +345,7 @@ export default {
height: 16px;
width: 16px;
}
+
.fullcalendar-widget{
min-height: 500px;
:deep(.fc-col-header-cell-cushion){
diff --git a/src/components/Editor/Attachments/AttachmentsList.vue b/src/components/Editor/Attachments/AttachmentsList.vue
index f7b0cac3ec..90ea4b1b4f 100644
--- a/src/components/Editor/Attachments/AttachmentsList.vue
+++ b/src/components/Editor/Attachments/AttachmentsList.vue
@@ -249,6 +249,7 @@ export default {
.attachments-input {
display: none;
}
+
.attachments-summary {
display:flex;
align-items: center;
@@ -300,6 +301,7 @@ export default {
margin-top: 1rem;
text-align: center;
}
+
.button-group {
display: flex;
align-content: center;
@@ -309,6 +311,7 @@ export default {
margin-right: 6px;
}
}
+
.attachment-icon {
width: 24px;
height: 24px;
diff --git a/src/components/Editor/FreeBusy/FreeBusy.vue b/src/components/Editor/FreeBusy/FreeBusy.vue
index 35bc8ac650..4e15833556 100644
--- a/src/components/Editor/FreeBusy/FreeBusy.vue
+++ b/src/components/Editor/FreeBusy/FreeBusy.vue
@@ -527,6 +527,7 @@ export default {
display: block;
height: 100%;
}
+
.modal__content {
padding: 50px;
//when the calendar is open, it's cut at the bottom, adding a margin fixes it
@@ -574,9 +575,11 @@ export default {
}
}
}
+
:deep(.vs__search ) {
text-overflow: ellipsis;
}
+
:deep(.mx-input) {
height: 38px !important;
}
diff --git a/src/components/Editor/Invitees/InviteesListItem.vue b/src/components/Editor/Invitees/InviteesListItem.vue
index 30b3d53d00..91f87ce1fc 100644
--- a/src/components/Editor/Invitees/InviteesListItem.vue
+++ b/src/components/Editor/Invitees/InviteesListItem.vue
@@ -254,6 +254,7 @@ export default {
.invitees-list-item {
flex-wrap: wrap;
}
+
.invitees-list-item__actions {
display: flex;
}
diff --git a/src/components/Editor/Resources/ResourceRoomType.vue b/src/components/Editor/Resources/ResourceRoomType.vue
index 51526c819e..6954564090 100644
--- a/src/components/Editor/Resources/ResourceRoomType.vue
+++ b/src/components/Editor/Resources/ResourceRoomType.vue
@@ -82,6 +82,6 @@ export default {
diff --git a/src/components/Shared/CalendarPicker.vue b/src/components/Shared/CalendarPicker.vue
index ec67ad8a3a..b2089d9e3c 100644
--- a/src/components/Shared/CalendarPicker.vue
+++ b/src/components/Shared/CalendarPicker.vue
@@ -138,7 +138,7 @@ export default {
diff --git a/src/views/Appointments/Booking.vue b/src/views/Appointments/Booking.vue
index 6dca070934..36356ccc47 100644
--- a/src/views/Appointments/Booking.vue
+++ b/src/views/Appointments/Booking.vue
@@ -292,7 +292,7 @@ export default {
}
&__time-zone {
- max-width: 250px;
+ max-width: 250px;
}
&__slot-selection .material-design-icon.loading-icon.animation-rotate {
diff --git a/src/views/Appointments/Overview.vue b/src/views/Appointments/Overview.vue
index 9b85f8d725..fda0b32f21 100644
--- a/src/views/Appointments/Overview.vue
+++ b/src/views/Appointments/Overview.vue
@@ -188,11 +188,11 @@ export default {
diff --git a/src/views/EditSidebar.vue b/src/views/EditSidebar.vue
index 2f3d27f4d4..31e8e9046f 100644
--- a/src/views/EditSidebar.vue
+++ b/src/views/EditSidebar.vue
@@ -648,16 +648,19 @@ export default {
}
}
}
+
.modal-subtitle {
font-weight: bold;
font-size: 16px;
margin-top: 16px;
}
+
.modal-h {
font-size: 24px;
font-weight: bold;
margin: 10px 0;
}
+
.modal-footer {
display: flex;
align-items: center;
@@ -671,21 +674,26 @@ export default {
}
}
}
+
.attachments, .users {
display: flex;
flex-wrap: wrap;
}
+
.attachment-list-item, .user-list-item {
width: 50%
}
+
.attachment-icon {
width: 40px;
height: auto;
border-radius: var(--border-radius);
}
+
.property-location {
margin-top: 10px;
}
+
.property-description {
margin-bottom: 10px;
}
@@ -720,9 +728,9 @@ export default {
padding-top: 5px;
}
- .empty-content {
+ .empty-content {
height: 100vh;
padding: 0 20px;
- }
+ }
}