diff --git a/src/addons/badges/pages/issued-badge/issued-badge.html b/src/addons/badges/pages/issued-badge/issued-badge.html index 834845a06..fde877cb2 100644 --- a/src/addons/badges/pages/issued-badge/issued-badge.html +++ b/src/addons/badges/pages/issued-badge/issued-badge.html @@ -13,7 +13,7 @@ - + diff --git a/src/addons/blog/pages/entries/entries.html b/src/addons/blog/pages/entries/entries.html index 41697ecd3..d1a56b3c0 100644 --- a/src/addons/blog/pages/entries/entries.html +++ b/src/addons/blog/pages/entries/entries.html @@ -15,7 +15,7 @@ - + {{ 'addon.blog.showonlyyourentries' | translate }} @@ -68,7 +68,8 @@
- {{entry.lastmodified | + {{entry.lastmodified + | coreTimeAgo}}
diff --git a/src/addons/calendar/components/components.module.ts b/src/addons/calendar/components/components.module.ts index 283909027..68b2bdee2 100644 --- a/src/addons/calendar/components/components.module.ts +++ b/src/addons/calendar/components/components.module.ts @@ -18,14 +18,14 @@ import { CoreSharedModule } from '@/core/shared.module'; import { AddonCalendarCalendarComponent } from './calendar/calendar'; import { AddonCalendarUpcomingEventsComponent } from './upcoming-events/upcoming-events'; -import { AddonCalendarFilterPopoverComponent } from './filter/filter'; +import { AddonCalendarFilterComponent } from './filter/filter'; import { AddonCalendarReminderTimeModalComponent } from './reminder-time-modal/reminder-time-modal'; @NgModule({ declarations: [ AddonCalendarCalendarComponent, AddonCalendarUpcomingEventsComponent, - AddonCalendarFilterPopoverComponent, + AddonCalendarFilterComponent, AddonCalendarReminderTimeModalComponent, ], imports: [ @@ -36,7 +36,7 @@ import { AddonCalendarReminderTimeModalComponent } from './reminder-time-modal/r exports: [ AddonCalendarCalendarComponent, AddonCalendarUpcomingEventsComponent, - AddonCalendarFilterPopoverComponent, + AddonCalendarFilterComponent, AddonCalendarReminderTimeModalComponent, ], }) diff --git a/src/addons/calendar/components/filter/addon-calendar-filter-popover.html b/src/addons/calendar/components/filter/addon-calendar-filter-popover.html deleted file mode 100644 index fd88358b3..000000000 --- a/src/addons/calendar/components/filter/addon-calendar-filter-popover.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - {{ 'addon.calendar.' + type + 'events' | translate}} - - - - - - - - - - - - - - diff --git a/src/addons/calendar/components/filter/filter.html b/src/addons/calendar/components/filter/filter.html new file mode 100644 index 000000000..c49826ce1 --- /dev/null +++ b/src/addons/calendar/components/filter/filter.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + {{ 'addon.calendar.' + type + 'events' | translate}} + + + + + + + + + + + + + + + diff --git a/src/addons/calendar/components/filter/filter-popover.scss b/src/addons/calendar/components/filter/filter.scss similarity index 100% rename from src/addons/calendar/components/filter/filter-popover.scss rename to src/addons/calendar/components/filter/filter.scss diff --git a/src/addons/calendar/components/filter/filter.ts b/src/addons/calendar/components/filter/filter.ts index 8827846c5..9d25721b2 100644 --- a/src/addons/calendar/components/filter/filter.ts +++ b/src/addons/calendar/components/filter/filter.ts @@ -15,6 +15,7 @@ import { Component, Input, OnInit } from '@angular/core'; import { CoreEnrolledCourseData } from '@features/courses/services/courses'; import { CoreUtils } from '@services/utils/utils'; +import { ModalController } from '@singletons'; import { CoreEvents } from '@singletons/events'; import { AddonCalendarEventType, AddonCalendarProvider } from '../../services/calendar'; import { AddonCalendarFilter, AddonCalendarEventIcons } from '../../services/calendar-helper'; @@ -23,11 +24,11 @@ import { AddonCalendarFilter, AddonCalendarEventIcons } from '../../services/cal * Component to display the events filter that includes events types and a list of courses. */ @Component({ - selector: 'addon-calendar-filter-popover', - templateUrl: 'addon-calendar-filter-popover.html', - styleUrls: ['../../calendar-common.scss', 'filter-popover.scss'], + selector: 'addon-calendar-filter', + templateUrl: 'filter.html', + styleUrls: ['../../calendar-common.scss', 'filter.scss'], }) -export class AddonCalendarFilterPopoverComponent implements OnInit { +export class AddonCalendarFilterComponent implements OnInit { @Input() filter: AddonCalendarFilter = { filtered: false, @@ -56,7 +57,7 @@ export class AddonCalendarFilterPopoverComponent implements OnInit { } /** - * Init the component. + * @inheritdoc */ ngOnInit(): void { this.courseId = this.filter.courseId || -1; @@ -80,4 +81,11 @@ export class AddonCalendarFilterPopoverComponent implements OnInit { CoreEvents.trigger(AddonCalendarProvider.FILTER_CHANGED_EVENT, this.filter); } + /** + * Close modal. + */ + closeModal(): void { + ModalController.dismiss(); + } + } diff --git a/src/addons/calendar/components/upcoming-events/addon-calendar-upcoming-events.html b/src/addons/calendar/components/upcoming-events/addon-calendar-upcoming-events.html index 143eec51c..e5a295569 100644 --- a/src/addons/calendar/components/upcoming-events/addon-calendar-upcoming-events.html +++ b/src/addons/calendar/components/upcoming-events/addon-calendar-upcoming-events.html @@ -1,36 +1,38 @@ - + - - - - - - - {{ 'addon.calendar.type' + event.formattedType | translate }} - {{ event.iconTitle }} - -

- -

-

-
- - - {{ 'core.notsent' | translate }} - - - - {{ 'core.deletedoffline' | translate }} - -
+ + + + + + + + {{ 'addon.calendar.type' + event.formattedType | translate }} + {{ event.iconTitle }} + +

+ +

+

+
+ + + {{ 'core.notsent' | translate }} + + + + {{ 'core.deletedoffline' | translate }} + +
+
diff --git a/src/addons/calendar/pages/day/day.html b/src/addons/calendar/pages/day/day.html index d245f7258..daf9206dd 100644 --- a/src/addons/calendar/pages/day/day.html +++ b/src/addons/calendar/pages/day/day.html @@ -7,7 +7,7 @@

{{ 'addon.calendar.calendarevents' | translate }}

- + @@ -50,7 +50,7 @@ - + @@ -65,36 +65,39 @@ - - - - - - - - {{ 'addon.calendar.type' + event.formattedType | translate }} - {{ event.iconTitle }} - -

- -

-

-
- - - {{ 'core.notsent' | translate }} - - - - {{ 'core.deletedoffline' | translate }} - -
+ + + + + + + + + {{ 'addon.calendar.type' + event.formattedType | translate }} + {{ event.iconTitle + }} + +

+ +

+

+
+ + + {{ 'core.notsent' | translate }} + + + + {{ 'core.deletedoffline' | translate }} + +
+
diff --git a/src/addons/calendar/pages/day/day.page.ts b/src/addons/calendar/pages/day/day.page.ts index 03b10b0b2..be2c15588 100644 --- a/src/addons/calendar/pages/day/day.page.ts +++ b/src/addons/calendar/pages/day/day.page.ts @@ -31,7 +31,7 @@ import { AddonCalendarFilter, AddonCalendarHelper } from '../../services/calenda import { AddonCalendarSync, AddonCalendarSyncProvider } from '../../services/calendar-sync'; import { CoreCategoryData, CoreCourses, CoreEnrolledCourseData } from '@features/courses/services/courses'; import { CoreCoursesHelper } from '@features/courses/services/courses-helper'; -import { AddonCalendarFilterPopoverComponent } from '../../components/filter/filter'; +import { AddonCalendarFilterComponent } from '../../components/filter/filter'; import moment from 'moment'; import { Network, NgZone } from '@singletons'; import { CoreNavigator } from '@services/navigator'; @@ -348,18 +348,15 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { } /** - * Show the context menu. - * - * @param event Event. + * Show the filter menu. */ - async openFilter(event: MouseEvent): Promise { - await CoreDomUtils.openPopover({ - component: AddonCalendarFilterPopoverComponent, + async openFilter(): Promise { + await CoreDomUtils.openSideModal({ + component: AddonCalendarFilterComponent, componentProps: { courses: this.manager?.getSource().courses, filter: this.filter, }, - event, }); } diff --git a/src/addons/calendar/pages/index/index.html b/src/addons/calendar/pages/index/index.html index 8675bca95..61b07e7d5 100644 --- a/src/addons/calendar/pages/index/index.html +++ b/src/addons/calendar/pages/index/index.html @@ -7,7 +7,7 @@

{{ (showCalendar ? 'addon.calendar.calendarevents' : 'addon.calendar.upcomingevents') | translate }}

- + diff --git a/src/addons/calendar/pages/index/index.page.ts b/src/addons/calendar/pages/index/index.page.ts index 0b55de067..c0ac2fb1c 100644 --- a/src/addons/calendar/pages/index/index.page.ts +++ b/src/addons/calendar/pages/index/index.page.ts @@ -29,7 +29,7 @@ import { CoreEnrolledCourseData } from '@features/courses/services/courses'; import { ActivatedRoute, Params } from '@angular/router'; import { AddonCalendarCalendarComponent } from '../../components/calendar/calendar'; import { AddonCalendarUpcomingEventsComponent } from '../../components/upcoming-events/upcoming-events'; -import { AddonCalendarFilterPopoverComponent } from '../../components/filter/filter'; +import { AddonCalendarFilterComponent } from '../../components/filter/filter'; import { CoreNavigator } from '@services/navigator'; import { CoreLocalNotifications } from '@services/local-notifications'; import { CoreConstants } from '@/core/constants'; @@ -328,18 +328,15 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { } /** - * Show the context menu. - * - * @param event Event. + * Show the filter menu. */ - async openFilter(event: MouseEvent): Promise { - await CoreDomUtils.openPopover({ - component: AddonCalendarFilterPopoverComponent, + async openFilter(): Promise { + await CoreDomUtils.openSideModal({ + component: AddonCalendarFilterComponent, componentProps: { courses: this.courses, filter: this.filter, }, - event, }); } diff --git a/src/addons/competency/pages/competency/competency.html b/src/addons/competency/pages/competency/competency.html index a73a97e2c..53b0778d7 100644 --- a/src/addons/competency/pages/competency/competency.html +++ b/src/addons/competency/pages/competency/competency.html @@ -14,7 +14,7 @@ - + diff --git a/src/addons/competency/pages/competencysummary/competencysummary.html b/src/addons/competency/pages/competencysummary/competencysummary.html index 1467f6e50..b5314d334 100644 --- a/src/addons/competency/pages/competencysummary/competencysummary.html +++ b/src/addons/competency/pages/competencysummary/competencysummary.html @@ -14,7 +14,7 @@ - + diff --git a/src/addons/competency/pages/coursecompetencies/coursecompetencies.html b/src/addons/competency/pages/coursecompetencies/coursecompetencies.html index fd6746901..6ca87f8af 100644 --- a/src/addons/competency/pages/coursecompetencies/coursecompetencies.html +++ b/src/addons/competency/pages/coursecompetencies/coursecompetencies.html @@ -12,7 +12,7 @@ - + diff --git a/src/addons/competency/pages/plan/plan.html b/src/addons/competency/pages/plan/plan.html index 0f84cbb7f..1f2275c70 100644 --- a/src/addons/competency/pages/plan/plan.html +++ b/src/addons/competency/pages/plan/plan.html @@ -12,7 +12,7 @@ - + diff --git a/src/addons/messages/pages/discussion/discussion.html b/src/addons/messages/pages/discussion/discussion.html index fc9dd7c3c..7427dbd18 100644 --- a/src/addons/messages/pages/discussion/discussion.html +++ b/src/addons/messages/pages/discussion/discussion.html @@ -69,7 +69,8 @@

{{ title }}

- +

{{ message.timecreated | coreFormatDate: "strftimedayshort" }} @@ -157,7 +158,7 @@ {{ 'addon.messages.acceptandaddcontact' | translate }} - + {{ 'addon.messages.decline' | translate }} diff --git a/src/addons/mod/assign/components/index/addon-mod-assign-index.html b/src/addons/mod/assign/components/index/addon-mod-assign-index.html index 4072066ff..2c09b70b1 100644 --- a/src/addons/mod/assign/components/index/addon-mod-assign-index.html +++ b/src/addons/mod/assign/components/index/addon-mod-assign-index.html @@ -6,7 +6,7 @@ - + + - + - + - + +
+ + + - - - - - - - - - -

{{ 'addon.mod_choice.previewonly' | translate:{$a: openTimeReadable} }}

-

{{ 'addon.mod_choice.notopenyet' | translate:{$a: openTimeReadable} }}

-
-
-
- - - - - -

- {{ 'addon.mod_choice.yourselection' | translate }} - - -

-

{{ 'addon.mod_choice.expired' | translate:{$a: closeTimeReadable} }}

-
-
-
- - - - - - {{ publishInfo | translate }} - - - - - - - + + + + - +

{{ 'addon.mod_choice.previewonly' | translate:{$a: openTimeReadable} }}

+

{{ 'addon.mod_choice.notopenyet' | translate:{$a: openTimeReadable} }}

-
-
- - - - - - - - -
+ + + + + +

+ {{ 'addon.mod_choice.yourselection' | translate }} + + +

+

{{ 'addon.mod_choice.expired' | translate:{$a: closeTimeReadable} }}

+
+
+
+ + + + + + {{ publishInfo | translate }} + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/addons/mod/data/components/index/addon-mod-data-index.html b/src/addons/mod/data/components/index/addon-mod-data-index.html index 40b51ef5a..3289a134c 100644 --- a/src/addons/mod/data/components/index/addon-mod-data-index.html +++ b/src/addons/mod/data/components/index/addon-mod-data-index.html @@ -18,7 +18,7 @@ - + - + diff --git a/src/addons/mod/feedback/components/index/addon-mod-feedback-index.html b/src/addons/mod/feedback/components/index/addon-mod-feedback-index.html index 7a1c4b742..f74b6c412 100644 --- a/src/addons/mod/feedback/components/index/addon-mod-feedback-index.html +++ b/src/addons/mod/feedback/components/index/addon-mod-feedback-index.html @@ -6,7 +6,7 @@ - + - + diff --git a/src/addons/mod/folder/components/index/addon-mod-folder-index.html b/src/addons/mod/folder/components/index/addon-mod-folder-index.html index fd09820a8..e4c02d9d6 100644 --- a/src/addons/mod/folder/components/index/addon-mod-folder-index.html +++ b/src/addons/mod/folder/components/index/addon-mod-folder-index.html @@ -6,7 +6,7 @@ - + - + diff --git a/src/addons/mod/glossary/pages/entry/entry.html b/src/addons/mod/glossary/pages/entry/entry.html index c68402e12..3965b0f64 100644 --- a/src/addons/mod/glossary/pages/entry/entry.html +++ b/src/addons/mod/glossary/pages/entry/entry.html @@ -16,7 +16,7 @@ - + diff --git a/src/addons/mod/imscp/components/index/addon-mod-imscp-index.html b/src/addons/mod/imscp/components/index/addon-mod-imscp-index.html index 0f43d70d2..9d025fe8d 100644 --- a/src/addons/mod/imscp/components/index/addon-mod-imscp-index.html +++ b/src/addons/mod/imscp/components/index/addon-mod-imscp-index.html @@ -6,7 +6,7 @@ - + - + diff --git a/src/addons/mod/lesson/pages/player/player.html b/src/addons/mod/lesson/pages/player/player.html index adb7dd441..5e49e931a 100644 --- a/src/addons/mod/lesson/pages/player/player.html +++ b/src/addons/mod/lesson/pages/player/player.html @@ -18,7 +18,7 @@ - + diff --git a/src/addons/mod/lesson/pages/user-retake/user-retake.html b/src/addons/mod/lesson/pages/user-retake/user-retake.html index 872b6577a..6b90ad1b0 100644 --- a/src/addons/mod/lesson/pages/user-retake/user-retake.html +++ b/src/addons/mod/lesson/pages/user-retake/user-retake.html @@ -13,7 +13,7 @@ - +
diff --git a/src/addons/mod/lti/components/index/addon-mod-lti-index.html b/src/addons/mod/lti/components/index/addon-mod-lti-index.html index a85613113..1ab132e1e 100644 --- a/src/addons/mod/lti/components/index/addon-mod-lti-index.html +++ b/src/addons/mod/lti/components/index/addon-mod-lti-index.html @@ -6,7 +6,7 @@ - + - + - + - + diff --git a/src/addons/mod/quiz/pages/player/player.html b/src/addons/mod/quiz/pages/player/player.html index 94d0aa3be..f34cf4c47 100644 --- a/src/addons/mod/quiz/pages/player/player.html +++ b/src/addons/mod/quiz/pages/player/player.html @@ -31,7 +31,7 @@ - + {{ 'addon.mod_quiz.startattempt' | translate }} diff --git a/src/addons/mod/quiz/pages/review/review.html b/src/addons/mod/quiz/pages/review/review.html index 38286d18a..a7aa60562 100644 --- a/src/addons/mod/quiz/pages/review/review.html +++ b/src/addons/mod/quiz/pages/review/review.html @@ -19,7 +19,7 @@ - + diff --git a/src/addons/mod/resource/components/index/addon-mod-resource-index.html b/src/addons/mod/resource/components/index/addon-mod-resource-index.html index cf24bdd04..bcac791b8 100644 --- a/src/addons/mod/resource/components/index/addon-mod-resource-index.html +++ b/src/addons/mod/resource/components/index/addon-mod-resource-index.html @@ -6,7 +6,7 @@ - + - + -
+
diff --git a/src/addons/mod/survey/components/index/addon-mod-survey-index.html b/src/addons/mod/survey/components/index/addon-mod-survey-index.html index 431d04f34..8c20281fe 100644 --- a/src/addons/mod/survey/components/index/addon-mod-survey-index.html +++ b/src/addons/mod/survey/components/index/addon-mod-survey-index.html @@ -6,7 +6,7 @@ - + - + - + + diff --git a/src/addons/mod/workshop/components/index/addon-mod-workshop-index.html b/src/addons/mod/workshop/components/index/addon-mod-workshop-index.html index 7ce927fb2..15e6f16dd 100644 --- a/src/addons/mod/workshop/components/index/addon-mod-workshop-index.html +++ b/src/addons/mod/workshop/components/index/addon-mod-workshop-index.html @@ -6,7 +6,7 @@ - + diff --git a/src/addons/mod/workshop/components/submission/addon-mod-workshop-submission.html b/src/addons/mod/workshop/components/submission/addon-mod-workshop-submission.html index f69d312a9..ee7f08609 100644 --- a/src/addons/mod/workshop/components/submission/addon-mod-workshop-submission.html +++ b/src/addons/mod/workshop/components/submission/addon-mod-workshop-submission.html @@ -1,4 +1,4 @@ - +
diff --git a/src/addons/notes/pages/list/list.html b/src/addons/notes/pages/list/list.html index e3a373bbe..db1ee143d 100644 --- a/src/addons/notes/pages/list/list.html +++ b/src/addons/notes/pages/list/list.html @@ -30,7 +30,7 @@ - + diff --git a/src/addons/notifications/pages/list/list.html b/src/addons/notifications/pages/list/list.html index 0630a22d2..17f97fcf5 100644 --- a/src/addons/notifications/pages/list/list.html +++ b/src/addons/notifications/pages/list/list.html @@ -16,64 +16,67 @@ -
- - - - - {{ 'addon.notifications.markallread' | translate }} - -
+
- - + + + + + {{ 'addon.notifications.markallread' | translate }} + +
+ + + - - - - - + + + + + - + - -

- + +

+ + +

+

{{ notification.userfromfullname }}

+
+ + {{ notification.timecreated | coreDateDayOrTime }} + + + + +
+ + + -

-

{{ notification.userfromfullname }}

-
- - {{ notification.timecreated | coreDateDayOrTime }} - - - - -
- - - - - - - - -
+
+
+ + + +
-
diff --git a/src/addons/privatefiles/pages/index/index.html b/src/addons/privatefiles/pages/index/index.html index 3ddf3e3f7..a3555462f 100644 --- a/src/addons/privatefiles/pages/index/index.html +++ b/src/addons/privatefiles/pages/index/index.html @@ -14,7 +14,7 @@ - + diff --git a/src/addons/storagemanager/pages/course-storage/course-storage.html b/src/addons/storagemanager/pages/course-storage/course-storage.html index bd058183d..47f5e7b6c 100644 --- a/src/addons/storagemanager/pages/course-storage/course-storage.html +++ b/src/addons/storagemanager/pages/course-storage/course-storage.html @@ -9,7 +9,7 @@ - +

{{ 'addon.storagemanager.courseinfo' | translate }}

diff --git a/src/addons/storagemanager/pages/courses-storage/courses-storage.html b/src/addons/storagemanager/pages/courses-storage/courses-storage.html index beb388d23..93aa52341 100644 --- a/src/addons/storagemanager/pages/courses-storage/courses-storage.html +++ b/src/addons/storagemanager/pages/courses-storage/courses-storage.html @@ -9,7 +9,7 @@ - +

{{ 'addon.storagemanager.alldata' | translate }}

diff --git a/src/core/components/loading/loading.scss b/src/core/components/loading/loading.scss index a843495ec..fc4d95b1f 100644 --- a/src/core/components/loading/loading.scss +++ b/src/core/components/loading/loading.scss @@ -81,6 +81,12 @@ flex-direction: column; } + &.list-item-limited-width .core-loading-content { + max-width: var(--list-item-max-width); + margin-left: auto !important; + margin-right: auto !important; + } + &.safe-area-padding:not(.core-loading-inline) .core-loading-content, &.safe-area-padding-horizontal:not(.core-loading-inline) .core-loading-content { @include safe-area-padding-horizontal(0px, 0px); diff --git a/src/core/features/comments/pages/viewer/viewer.html b/src/core/features/comments/pages/viewer/viewer.html index 1534cdcef..4e1336a18 100644 --- a/src/core/features/comments/pages/viewer/viewer.html +++ b/src/core/features/comments/pages/viewer/viewer.html @@ -38,7 +38,7 @@ - +

diff --git a/src/core/features/course/components/tag-area/core-course-tag-area.html b/src/core/features/course/components/tag-area/core-course-tag-area.html index aa0f0df2b..033ffc509 100644 --- a/src/core/features/course/components/tag-area/core-course-tag-area.html +++ b/src/core/features/course/components/tag-area/core-course-tag-area.html @@ -1,8 +1,10 @@ - - - -

{{ item.courseName }}

-

{{ 'core.category' | translate }}: {{ item.categoryName }}

- -
+ + + + +

{{ item.courseName }}

+

{{ 'core.category' | translate }}: {{ item.categoryName }}

+
+
+ +
diff --git a/src/core/features/course/pages/module-preview/module-preview.html b/src/core/features/course/pages/module-preview/module-preview.html index cd47cd96d..ee720ffd2 100644 --- a/src/core/features/course/pages/module-preview/module-preview.html +++ b/src/core/features/course/pages/module-preview/module-preview.html @@ -22,7 +22,7 @@ - +
diff --git a/src/core/features/courses/components/course-list-item/course-list-item.scss b/src/core/features/courses/components/course-list-item/course-list-item.scss index d6bc0342e..48e3c7284 100644 --- a/src/core/features/courses/components/course-list-item/course-list-item.scss +++ b/src/core/features/courses/components/course-list-item/course-list-item.scss @@ -102,7 +102,7 @@ ion-chip { // List layout. ion-card.core-course-list-item { - max-width: var(--list-item--max-width); + max-width: var(--list-item-max-width); ion-icon.course-icon { padding: 12px; diff --git a/src/core/features/login/pages/change-password/change-password.html b/src/core/features/login/pages/change-password/change-password.html index b36619a1b..7b808cbd7 100644 --- a/src/core/features/login/pages/change-password/change-password.html +++ b/src/core/features/login/pages/change-password/change-password.html @@ -16,7 +16,7 @@ - + diff --git a/src/core/features/login/pages/credentials/credentials.html b/src/core/features/login/pages/credentials/credentials.html index 2335e3cca..61d29ffbf 100644 --- a/src/core/features/login/pages/credentials/credentials.html +++ b/src/core/features/login/pages/credentials/credentials.html @@ -16,7 +16,7 @@ - +