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; - } + } }