diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 000000000..47a861b16 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,55 @@ +You are an expert in TypeScript, Angular, and scalable web application development. You write functional, maintainable, performant, and accessible code following Angular and TypeScript best practices. + +## TypeScript Best Practices + +- Use strict type checking +- Prefer type inference when the type is obvious +- Avoid the `any` type; use `unknown` when type is uncertain + +## Angular Best Practices + +- Always use standalone components over NgModules +- Must NOT set `standalone: true` inside Angular decorators. It's the default in Angular v20+. +- Use signals for state management +- Implement lazy loading for feature routes +- Do NOT use the `@HostBinding` and `@HostListener` decorators. Put host bindings inside the `host` object of the `@Component` or `@Directive` decorator instead +- Use `NgOptimizedImage` for all static images. + - `NgOptimizedImage` does not work for inline base64 images. + +## Accessibility Requirements + +- It MUST pass all AXE checks. +- It MUST follow all WCAG AA minimums, including focus management, color contrast, and ARIA attributes. + +### Components + +- Keep components small and focused on a single responsibility +- Use `input()` and `output()` functions instead of decorators +- Use `computed()` for derived state +- Set `changeDetection: ChangeDetectionStrategy.OnPush` in `@Component` decorator +- Prefer inline templates for small components +- Prefer Reactive forms instead of Template-driven ones +- Do NOT use `ngClass`, use `class` bindings instead +- Do NOT use `ngStyle`, use `style` bindings instead +- When using external templates/styles, use paths relative to the component TS file. + +## State Management + +- Use signals for local component state +- Use `computed()` for derived state +- Keep state transformations pure and predictable +- Do NOT use `mutate` on signals, use `update` or `set` instead + +## Templates + +- Keep templates simple and avoid complex logic +- Use native control flow (`@if`, `@for`, `@switch`) instead of `*ngIf`, `*ngFor`, `*ngSwitch` +- Use the async pipe to handle observables +- Do not assume globals like (`new Date()`) are available. +- Do not write arrow functions in templates (they are not supported). + +## Services + +- Design services around a single responsibility +- Use the `providedIn: 'root'` option for singleton services +- Use the `inject()` function instead of constructor injection diff --git a/angular.json b/angular.json index 9ab4eb53b..1722d2dd9 100644 --- a/angular.json +++ b/angular.json @@ -45,8 +45,8 @@ } ], "styles": [ - "client/styles/_themes.scss", "client/styles.scss", + "client/styles/artisans.scss", "node_modules/@ecodev/natural-layout/natural-layout.css" ], "scripts": [], @@ -113,8 +113,9 @@ "tsConfig": "client/tsconfig.spec.json", "karmaConfig": "client/karma.conf.js", "styles": [ - "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", - "client/styles.scss" + "client/styles.scss", + "client/styles/artisans.scss", + "node_modules/@ecodev/natural-layout/natural-layout.css" ], "scripts": [], "assets": [ @@ -145,7 +146,10 @@ "cli": { "schematicCollections": ["@angular-eslint/schematics"], "packageManager": "yarn", - "analytics": false + "analytics": false, + "cache": { + "enabled": false + } }, "schematics": { "@angular-eslint/schematics:application": { diff --git a/client/app/_app.theme.scss b/client/app/_app.theme.scss deleted file mode 100644 index 6b1b59939..000000000 --- a/client/app/_app.theme.scss +++ /dev/null @@ -1,52 +0,0 @@ -@use 'sass:map'; -@use '@angular/material' as mat; -@mixin app($theme) { - $primary: map.get($theme, primary); - $accent: map.get($theme, accent); - $background: map.get($theme, background); - $foreground: map.get($theme, foreground); - - // Splash logo and login page have different background than usual layout for other pages - // and they need to have the correct background color in dark mode (otherwise we get black text on black background) - @at-root app-root > div { - & > div { - background: mat.m2-get-color-from-palette($background, background); - } - } - - ng-progress { - .ng-bar { - box-shadow: mat.m2-get-color-from-palette($accent) 0 0 5px !important; - background-color: mat.m2-get-color-from-palette($accent) !important; - height: 3px !important; - } - - .ng-meteor { - top: 0 !important; - transform: none !important; - opacity: 1 !important; - box-shadow: mat.m2-get-color-from-palette($accent) 0 0 20px !important; - width: 25px !important; - } - } - - .witnesses { - display: grid; - grid-template-columns: 50% 50%; - grid-gap: 20px; - - @media screen and (max-width: 700px) { - grid-template-columns: 100%; - } - } - - .witness { - display: inline-block; // prevents columns to break paragraph (from bottom to top of next column) - margin-bottom: 30px; - border-width: 0; - border-left-width: 5px; - border-style: solid; - border-color: mat.m2-get-color-from-palette($primary); - padding: 0 0 0 10px; - } -} diff --git a/client/app/admin/admin-routing.module.ts b/client/app/admin/admin.routes.ts similarity index 100% rename from client/app/admin/admin-routing.module.ts rename to client/app/admin/admin.routes.ts diff --git a/client/app/admin/admin/_admin.theme.scss b/client/app/admin/admin/_admin.theme.scss deleted file mode 100644 index 7b1d07963..000000000 --- a/client/app/admin/admin/_admin.theme.scss +++ /dev/null @@ -1,16 +0,0 @@ -@use 'sass:map'; -@use '@angular/material' as mat; -@mixin admin($theme) { - $background: map.get($theme, background); - - app-admin { - // Re-use the same hover effect for active menu item, and add the Material boldness to text - a.mat-mdc-list-item.active { - background: mat.m2-get-color-from-palette($background, 'hover'); - - .mdc-list-item__primary-text { - font-weight: 500; - } - } - } -} diff --git a/client/app/admin/admin/admin.component.html b/client/app/admin/admin/admin.component.html index eb87e3a98..cd76102b6 100644 --- a/client/app/admin/admin/admin.component.html +++ b/client/app/admin/admin/admin.component.html @@ -1,71 +1,75 @@ -
- - + + -
+
- - logo - + + logo + -
-
+
+
- - -
- - - - Utilisateurs - - - Tous les utilisateurs - Import - - + + +
+ + + + Utilisateurs + + + Tous les utilisateurs + Import + + - - - Produits - - - Tous les produits - - + + + Produits + + + Tous les produits + + - - - Communauté - - - Actualités - Événements - Commentaires - Conversations carbone - - Documents facilitateurs - - - + + + Communauté + + + Actualités + Événements + Commentaires + Conversations carbone + Documents facilitateurs + + - - - Comptabilité - - - Ventes - - - -
-
- -
- -
-
-
-
+ + + Comptabilité + + + Ventes + + + +
+ + +
+ +
+
+ diff --git a/client/app/admin/admin/admin.component.scss b/client/app/admin/admin/admin.component.scss index e75f6fdc3..be6ba0c52 100644 --- a/client/app/admin/admin/admin.component.scss +++ b/client/app/admin/admin/admin.component.scss @@ -1,4 +1,41 @@ -.admin-body { - padding: 20px; +@use '@angular/material' as mat; + +natural-sidenav-container { + @include mat.sidenav-overrides( + ( + container-width: 280px, + ) + ); +} + +mat-accordion { + @include mat.expansion-overrides( + ( + container-background-color: transparent, + ) + ); +} + +natural-sidenav-content { + border-top-left-radius: var(--mat-sys-corner-large); + background-color: var(--mat-sys-surface-bright); + padding: 20px clamp(5px, 2vw, 20px); + min-height: calc(100vh - 160px); overflow: auto; + @media (max-width: 400px) { + padding: 6px; + } +} + +.header-toolbar { + @include mat.toolbar-overrides( + ( + container-background-color: var(--mat-sys-surface-container), + container-text-color: var(--mat-sys-on-surface), + ) + ); +} + +::ng-deep app-admin .mat-font-title-lg { + margin-bottom: 0.3em; } diff --git a/client/app/admin/comments/comments/comments.component.html b/client/app/admin/comments/comments/comments.component.html index 41f93ab26..c6146ad22 100644 --- a/client/app/admin/comments/comments/comments.component.html +++ b/client/app/admin/comments/comments/comments.component.html @@ -1,7 +1,7 @@ @if (dataSource) {
-
+
{{ routeData?.seo.title }}
@if (isUpdatePage()) { - + Voir la page diff --git a/client/app/admin/events/events/events.component.html b/client/app/admin/events/events/events.component.html index 7b54951b9..aa0ec7be1 100644 --- a/client/app/admin/events/events/events.component.html +++ b/client/app/admin/events/events/events.component.html @@ -1,7 +1,7 @@ @if (dataSource) {
-
+
{{ routeData?.seo.title }}
@if (isUpdatePage()) { - + Voir la page @@ -30,7 +30,7 @@
-

Document

+

Document

-
+
{{ routeData?.seo.title }}
diff --git a/client/app/admin/newses/news/news.component.html b/client/app/admin/newses/news/news.component.html index 1b9a741ad..fa3d6c33b 100644 --- a/client/app/admin/newses/news/news.component.html +++ b/client/app/admin/newses/news/news.component.html @@ -6,7 +6,7 @@ [newLabel]="data.seo.title" > @if (isUpdatePage()) { - + Voir la page @@ -34,7 +34,7 @@ > -
Contenu
+
Contenu
diff --git a/client/app/admin/newses/newses/newses.component.html b/client/app/admin/newses/newses/newses.component.html index e24bd9403..4f57d9a70 100644 --- a/client/app/admin/newses/newses/newses.component.html +++ b/client/app/admin/newses/newses/newses.component.html @@ -1,7 +1,7 @@ @if (dataSource) {
-
+
{{ routeData?.seo.title }}
{{ data.seo.title }}
-
ou
+
ou
{{ data.seo.title }} /> @if (form.hasError('productXorSubscription')) { -

+

Une vente ne peut pas concerner à la fois un produit et un abonnement. C'est soit l'un, soit l'autre, soit rien du tout.

@@ -37,9 +37,9 @@

{{ data.seo.title }}

- + - diff --git a/client/app/admin/order/order-line/order-line.component.scss b/client/app/admin/order/order-line/order-line.component.scss index e69de29bb..9e89ab5c0 100644 --- a/client/app/admin/order/order-line/order-line.component.scss +++ b/client/app/admin/order/order-line/order-line.component.scss @@ -0,0 +1,3 @@ +.warning { + color: var(--mat-sys-tertiary-container); +} diff --git a/client/app/admin/order/order-lines/order-lines.component.html b/client/app/admin/order/order-lines/order-lines.component.html index 2c3803ead..52e6427a6 100644 --- a/client/app/admin/order/order-lines/order-lines.component.html +++ b/client/app/admin/order/order-lines/order-lines.component.html @@ -9,7 +9,8 @@ [multipleGroups]="true" [selections]="naturalSearchSelections" (selectionChange)="search($event)" - />§ + /> + § Commande du {{ data.model.creationDate | />
-
+
Total :
@if (data.model.balanceCHF !== '0.00') {
@@ -41,5 +41,5 @@

Commande du {{ data.model.creationDate | - + diff --git a/client/app/admin/order/order/order.component.ts b/client/app/admin/order/order/order.component.ts index 429cce51f..28d9f8e92 100644 --- a/client/app/admin/order/order/order.component.ts +++ b/client/app/admin/order/order/order.component.ts @@ -50,7 +50,7 @@ export class OrderComponent { /** * Template usage */ - protected UserRole = UserRole; + protected readonly UserRole = UserRole; public constructor() { this.viewer = this.dialogData.activatedRoute.snapshot.data.viewer diff --git a/client/app/admin/order/orders/orders.component.html b/client/app/admin/order/orders/orders.component.html index 5e0bcba90..da8c323ab 100644 --- a/client/app/admin/order/orders/orders.component.html +++ b/client/app/admin/order/orders/orders.component.html @@ -1,7 +1,7 @@ @if (dataSource) {

-

Illustration

+

Illustration

Illustration
-

Aperçu du produit

+

Aperçu du produit

Aperçu du produit
@if (isUpdatePage()) {
-

Tags

+

Tags

-
+
{{ routeData?.seo.title }}
{{ form.get('name')?.errors | errorMessage }} -
Description
+
Description

@@ -27,8 +27,8 @@ Ce champ est masqué à l'utilisateur mais est utilisé pour l'ordre des sessions - + >Ce champ est masqué à l'utilisateur mais est utilisé pour l'ordre des sessions @@ -38,8 +38,9 @@ Ce champ est masqué à l'utilisateur mais il est utilisé à des fins d'administration - + >Ce champ est masqué à l'utilisateur mais il est utilisé à des fins + d'administration @@ -53,31 +54,30 @@ >
- - @if (datesForm) { -
-

Dates de la session

- @for (date of datesForm.controls; track date) { -
- - Date - - - -
- } - -
- } - - @if (isUpdatePage()) { -
-

Facilitateurs

+
+ @if (datesForm) { +
+

Dates de la session

+ @for (date of datesForm.controls; track date) { +
+ + Date + + + +
+ } + +
+ } + + @if (isUpdatePage()) { +

Facilitateurs

Facilitateurs
-
- } + } +
@@ -123,7 +123,7 @@

Facilitateurs

-

Formulaire d'inscription

+

Formulaire d'inscription

Url du formulaire diff --git a/client/app/admin/sessions/sessions/sessions.component.html b/client/app/admin/sessions/sessions/sessions.component.html index 23e1747e7..966c995e4 100644 --- a/client/app/admin/sessions/sessions/sessions.component.html +++ b/client/app/admin/sessions/sessions/sessions.component.html @@ -1,7 +1,7 @@ @if (dataSource) {
- } diff --git a/client/app/admin/users/import/import.component.html b/client/app/admin/users/import/import.component.html index 314319e84..8fcdc8346 100644 --- a/client/app/admin/users/import/import.component.html +++ b/client/app/admin/users/import/import.component.html @@ -1,11 +1,11 @@
-

{{ routeData.seo.title }}

+

{{ routeData.seo.title }}

-

Uploadez un fichier CSV pour importer les utilisateurs et leur accès:

+

Uploadez un fichier CSV pour importer les utilisateurs et leur accès:

@@ -73,7 +73,7 @@

{{ routeData.seo.title }}

@for (error of errors; track error) {

- + {{ error }}

} diff --git a/client/app/admin/users/user/user.component.html b/client/app/admin/users/user/user.component.html index 48a7ee5f7..33b5ce4b7 100644 --- a/client/app/admin/users/user/user.component.html +++ b/client/app/admin/users/user/user.component.html @@ -7,10 +7,10 @@ /> @if (isUpdatePage() && data.model.shouldDelete) { - Cet utilisateur n'existe pas dans Crésus. Il doit soit être ajouté dans Crésus, soit être supprimé - définitivement ici. - + définitivement ici. } @@ -19,7 +19,7 @@
-

Coordonnées

+

Coordonnées

Téléphone @@ -27,12 +27,12 @@

Coordonnées

-

Compte

+

Compte

email @if (form.get('email')?.hasError('duplicateValue')) { - Cet email est déjà attribué + Cet email est déjà attribué } @else { {{ form.get('email')?.errors | errorMessage }} } @@ -48,17 +48,16 @@

Compte

formControlName="isPublicFacilitator" class="nat-margin-bottom" (change)="update()" + >Facilitateur public - Facilitateur public - -

État

+

État

- Abonnement : + Abonnement : @if (data.model.subscriptionLastReviewNumber) { Abonné {{ data.model.subscriptionType | enum: 'ProductType' | async }} jusqu'au numéro{{ data.model.subscriptionLastReviewNumber @@ -71,13 +70,13 @@

État

- Accès temporaire : + Accès temporaire : {{ data.model.webTemporaryAccess ? 'oui' : 'non' }}
-

Conversations carbone animées

+

Conversations carbone animées

Conversations carbone animées @if (data.model.firstLogin) {
- Première connexion : + Première connexion : {{ data.model.firstLogin | date }} ({{ data.model.firstLogin | timeAgo }})
} @if (data.model.lastLogin) {
- Dernière connexion : + Dernière connexion : {{ data.model.lastLogin | date }} ({{ data.model.lastLogin | timeAgo }})
} diff --git a/client/app/admin/users/users/users.component.html b/client/app/admin/users/users/users.component.html index 87e3f48f9..ad0d1ebc3 100644 --- a/client/app/admin/users/users/users.component.html +++ b/client/app/admin/users/users/users.component.html @@ -1,7 +1,7 @@ @if (dataSource) {
-
+
{{ routeData?.seo.title }}
- - - @if (!initialized) { - - } -
+ + +@if (!initialized) { + +} diff --git a/client/app/app.component.scss b/client/app/app.component.scss index e69de29bb..2d559ede4 100644 --- a/client/app/app.component.scss +++ b/client/app/app.component.scss @@ -0,0 +1,15 @@ +// .nat-fill +:host { + &, + ::ng-deep { + .app-page-reference + * { + display: flex; + flex: 1; + flex-direction: column; + width: 100%; + min-width: 100%; + height: 100%; + min-height: 100%; + } + } +} diff --git a/client/app/app.config.ts b/client/app/app.config.ts new file mode 100644 index 000000000..0e9fd8bb9 --- /dev/null +++ b/client/app/app.config.ts @@ -0,0 +1,118 @@ +import { + APP_ID, + ApplicationConfig, + inject, + LOCALE_ID, + provideAppInitializer, + provideZoneChangeDetection, +} from '@angular/core'; +import {routes} from './app.routes'; +import {Apollo} from 'apollo-angular'; +import {MAT_TOOLTIP_DEFAULT_OPTIONS, MatTooltipDefaultOptions} from '@angular/material/tooltip'; +import {apolloOptionsProvider} from './shared/config/apollo-options.provider'; +import {LocalizedPaginatorIntlService} from './shared/services/localized-paginator-intl.service'; +import {DATE_PIPE_DEFAULT_OPTIONS, DatePipeConfig, registerLocaleData} from '@angular/common'; +import { + activityInterceptor, + graphqlQuerySigner, + naturalProviders, + NaturalSwissParsingDateAdapter, + provideErrorHandler, + provideIcons, + provideSeo, +} from '@ecodev/natural'; +import {provideHttpClient, withInterceptors} from '@angular/common/http'; +import {MAT_PAGINATOR_DEFAULT_OPTIONS, MatPaginatorDefaultOptions, MatPaginatorIntl} from '@angular/material/paginator'; +import { + DateAdapter, + ErrorStateMatcher, + provideNativeDateAdapter, + ShowOnDirtyErrorStateMatcher, +} from '@angular/material/core'; +import {LoggerExtraService} from './shared/services/logger-extra.service'; +import {localConfig} from './shared/generated-config'; +import localeFRCH from '@angular/common/locales/fr-CH'; +import {provideRouter, withInMemoryScrolling, withRouterConfig} from '@angular/router'; +import {MAT_TABS_CONFIG, MatTabsConfig} from '@angular/material/tabs'; + +registerLocaleData(localeFRCH); + +const matTooltipCustomConfig: MatTooltipDefaultOptions = { + showDelay: 5, + hideDelay: 5, + touchendHideDelay: 5, + touchGestures: 'off', +}; + +export const appConfig: ApplicationConfig = { + providers: [ + provideZoneChangeDetection({eventCoalescing: true}), + provideNativeDateAdapter(), + Apollo, + naturalProviders, + provideErrorHandler(localConfig.log.url, LoggerExtraService), + provideSeo({ + applicationName: 'Les artisans de la transition', + defaultDescription: 'Comprendre l’urgence écologique, Des pistes pour y répondre', + defaultRobots: 'all, index, follow', + }), + provideIcons({}), + {provide: APP_ID, useValue: 'serverApp'}, + { + provide: DateAdapter, + useClass: NaturalSwissParsingDateAdapter, + }, + { + provide: DATE_PIPE_DEFAULT_OPTIONS, + useValue: {dateFormat: 'dd.MM.y HH:mm'} satisfies DatePipeConfig, + }, + { + // Use OnDirty instead of default OnTouched, that allows to validate while editing. Touched is updated after blur. + provide: ErrorStateMatcher, + useClass: ShowOnDirtyErrorStateMatcher, + }, + { + // See https://github.com/angular/components/issues/26580 + provide: MAT_PAGINATOR_DEFAULT_OPTIONS, + useValue: { + formFieldAppearance: 'fill', + } satisfies MatPaginatorDefaultOptions, + }, + { + provide: MAT_TABS_CONFIG, + useValue: { + stretchTabs: false, + } satisfies MatTabsConfig, + }, + { + provide: LOCALE_ID, + useValue: 'fr-CH', + }, + { + provide: DATE_PIPE_DEFAULT_OPTIONS, + useValue: { + timezone: 'fr-CH', + } satisfies DatePipeConfig, + }, + { + provide: MatPaginatorIntl, + useClass: LocalizedPaginatorIntlService, + }, + apolloOptionsProvider, + {provide: MAT_TOOLTIP_DEFAULT_OPTIONS, useValue: matTooltipCustomConfig}, + provideHttpClient(withInterceptors([activityInterceptor, graphqlQuerySigner(localConfig.signedQueries.key)])), + provideRouter( + routes, + withRouterConfig({ + paramsInheritanceStrategy: 'always', + }), + withInMemoryScrolling({ + scrollPositionRestoration: 'top', + }), + ), + provideAppInitializer(() => { + const dateAdapter = inject(DateAdapter); + dateAdapter.setLocale('fr-ch'); + }), + ], +}; diff --git a/client/app/app-routing.module.ts b/client/app/app.routes.ts similarity index 75% rename from client/app/app-routing.module.ts rename to client/app/app.routes.ts index f3b6a235e..2ffc2a66a 100644 --- a/client/app/app-routing.module.ts +++ b/client/app/app.routes.ts @@ -12,18 +12,18 @@ export const routes: Routes = [ }, { path: 'admin', - loadChildren: () => import('./admin/admin-routing.module').then(m => m.routes), + loadChildren: () => import('./admin/admin.routes').then(m => m.routes), }, { // Registration path: 'user', component: FrontOfficeComponent, - loadChildren: () => import('./user/user-routing.module').then(m => m.routes), + loadChildren: () => import('./user/user.routes').then(m => m.routes), }, { path: '', component: FrontOfficeComponent, resolve: {viewer: resolveViewer}, - loadChildren: () => import('./front-office/front-office-routing.module').then(m => m.routes), + loadChildren: () => import('./front-office/front-office.routes').then(m => m.routes), }, ]; diff --git a/client/app/front-office/_front-office.theme.scss b/client/app/front-office/_front-office.theme.scss deleted file mode 100644 index 9b11ee5d6..000000000 --- a/client/app/front-office/_front-office.theme.scss +++ /dev/null @@ -1,88 +0,0 @@ -@use 'sass:color'; -@use 'sass:map'; -@use '@angular/material' as mat; -@mixin front-office($theme) { - $primary: map.get($theme, primary); - $accent: map.get($theme, accent); - $warn: map.get($theme, warn); - $bg: map.get($theme, background); - $fg: map.get($theme, foreground); - - app-front-office { - #header-top { - background: color.adjust(mat.m2-get-color-from-palette($bg, app-bar), $lightness: -5%); - .mat-mdc-button:not(:disabled) { - color: color.adjust(mat.m2-get-color-from-palette($fg, text), $lightness: 35%); - } - } - - #mobile-menu .mat-expansion-panel-body { - padding-right: 0 !important; - } - - #search-field .mdc-line-ripple::before { - border: none; - } - - #logo-slogan { - color: mat.m2-get-color-from-palette($accent); - } - - #menu-main > ul { - a { - color: color.adjust(mat.m2-get-color-from-palette($fg, text), $lightness: 20%); - } - - li:hover > a, - a.open, - a.active { - span { - border-color: mat.m2-get-color-from-palette($primary) !important; - } - } - - & > li.hasMenu::after { - background: mat.m2-get-color-from-palette($bg, card); - } - - ul a:hover, - a.open, - a.active { - color: mat.m2-get-color-from-palette($primary); - } - } - - #mobile-menu a:hover { - color: mat.m2-get-color-from-palette($primary) !important; - } - - #newsletter-zone { - background: mat.m2-get-color-from-palette($accent); - color: mat.m2-get-color-from-palette($accent, default-contrast); - } - - #footer { - background: #e1e1e3; - - .mat-mdc-form-field, - mat-form-field * { - border-bottom-color: mat.m2-get-color-from-palette($primary, default-contrast) !important; - color: mat.m2-get-color-from-palette($primary, default-contrast) !important; - } - - mat-form-field .mat-mdc-text-field-wrapper { - background-color: #0000000a !important; - } - } - - #footer-body { - a:hover { - color: mat.m2-get-color-from-palette($accent); - } - - .mdc-list-item__primary-text { - text-transform: uppercase; - } - } - } -} diff --git a/client/app/front-office/components/agir-avec-nous/actions/actions.component.html b/client/app/front-office/components/agir-avec-nous/actions/actions.component.html index a35595d48..0300b8a08 100644 --- a/client/app/front-office/components/agir-avec-nous/actions/actions.component.html +++ b/client/app/front-office/components/agir-avec-nous/actions/actions.component.html @@ -4,31 +4,31 @@ >
-
-

Informer

+
+

Informer

- LaRevueDurable est une revue indépendante franco-suisse sur l’écologie, la durabilité et la - transition. + LaRevueDurable + est une revue indépendante franco-suisse sur l’écologie, la durabilité et la transition.

-

Impliquer

+

Impliquer

Les Conversations carbone

Le Climat entre nos mains

-
-

Agir

+
+

Agir

Désinvestir de l’industrie des énergies fossiles

Numérique éthique

Alimentation

-
-

TOUTES NOS ACTIONS

+
+

TOUTES NOS ACTIONS

-
+

Pour faire avancer la transition écologique et sociale en Suisse romande, les Artisans de la transition @@ -36,7 +36,8 @@

TOUTES NOS ACTIONS

se sent concerné au point de vouloir s’impliquer, et on se met à agir. Les trois axes se renforcent ensuite les uns les autres. Cette façon d’envisager l’engagement se fonde sur vingt ans d’enquêtes et d’expériences sur le terrain menés pour, avec et grâce à - LaRevueDurable. + LaRevueDurable + .

diff --git a/client/app/front-office/components/agir-avec-nous/agir-au-quotidien/agir-au-quotidien.component.html b/client/app/front-office/components/agir-avec-nous/agir-au-quotidien/agir-au-quotidien.component.html index a29601a55..630299319 100644 --- a/client/app/front-office/components/agir-avec-nous/agir-au-quotidien/agir-au-quotidien.component.html +++ b/client/app/front-office/components/agir-avec-nous/agir-au-quotidien/agir-au-quotidien.component.html @@ -3,10 +3,10 @@ [style.backgroundImage]="'url(assets/images/illustration-pages/artisansdelatransition_photocase-leonrojo.jpg)'" >
-
-

AGIR AU QUOTIDIEN

+
+

AGIR AU QUOTIDIEN

-
+
  • Le confinement nous a amenés à changer de style de vie très rapidement et à grande échelle. Des @@ -14,13 +14,17 @@

    AGIR AU QUOTIDIEN

    pérenniser et faire fructifier cette expérience inédite.
  • - Après la sortie du numéro 63 de LaRevueDurable , les - Artisans de la transition ont mis sur pied un cycle de quatre ateliers, dans quatre - villes de Suisse romande, à propos du capitalisme de surveillance et des alternatives libres et - éthique aux services des Gafam. Voici les principaux conseils issus de ces ateliers : + Après la sortie du numéro 63 de + LaRevueDurable + , les + Artisans de la transition + ont mis sur pied un cycle de quatre ateliers, dans quatre villes de Suisse romande, à propos du + capitalisme de surveillance et des alternatives libres et éthique aux services des Gafam. Voici les + principaux conseils issus de ces ateliers : Guide pour l’informatique éthique. + > + .
  • Guide pour des habits durables
diff --git a/client/app/front-office/components/agir-avec-nous/alimentation/alimentation.component.html b/client/app/front-office/components/agir-avec-nous/alimentation/alimentation.component.html index 1dfd367f9..b8d925438 100644 --- a/client/app/front-office/components/agir-avec-nous/alimentation/alimentation.component.html +++ b/client/app/front-office/components/agir-avec-nous/alimentation/alimentation.component.html @@ -3,43 +3,49 @@ [style.backgroundImage]="'url(assets/images/illustration-pages/epicerie_a_cote-artisans.webp)'" >
-
-

ALIMENTATION

+
+

ALIMENTATION

-
+

De nombreuses personnes – producteurs, transformatrices, distributeurs, restauratrices et mangeurs – s’efforcent de rendre l’agriculture et l’alimentation plus saine, meilleure pour les sols, le climat et - la biodiversité, plus équitable et accessible. Les Artisans de la transition veulent - appuyer leurs démarches pour construire des circuits courts alimentaires artisanaux collectifs et faire - de ces circuits les supports à un changement de système alimentaire. + la biodiversité, plus équitable et accessible. Les + Artisans de la transition + veulent appuyer leurs démarches pour construire des circuits courts alimentaires artisanaux collectifs + et faire de ces circuits les supports à un changement de système alimentaire.

- En 2021, les Artisans de la transition ont publié un dossier de LaRevueDurable sur ce - thème et écrit et produit un documentaire de 37 minutes, Manger, c’est politique !, qui raconte la - construction de quatre circuits courts alimentaires artisanaux collectifs au sein de l’agroécoquartier - Les Vergers, à Meyrin, dans le canton de Genève. Ce film, qui met notamment en avant le supermarché - participatif paysan La Fève, a fait l’objet d’une soixantaine de projections, principalement en Suisse - romande, suivies de discussions avec des acteurs et des actrices locales de ces circuits. + En 2021, les + Artisans de la transition + ont publié un dossier de LaRevueDurable sur ce thème et écrit et produit un documentaire de 37 minutes, + Manger, c’est politique !, qui raconte la construction de quatre circuits courts alimentaires artisanaux + collectifs au sein de l’agroécoquartier Les Vergers, à Meyrin, dans le canton de Genève. Ce film, qui + met notamment en avant le supermarché participatif paysan La Fève, a fait l’objet d’une soixantaine de + projections, principalement en Suisse romande, suivies de discussions avec des acteurs et des actrices + locales de ces circuits.

- Pour organiser ces projections-débats, les Artisans de la transition ont sollicité, - partout en Suisse romande, l’appui d’épiceries alternatives qui se sont souvent révélées enthousiastes - et proactives. Bio, vrac, participatives ou coopératives de productrices et de producteurs, ces - commerces trop peu valorisés sont alternatifs à la grande distribution et à l’industrialisation - systématique insoutenable du système alimentaire. De leur enthousiasme est née l’envie de mieux les - connaître, de les étudier de près, d’examiner leurs actions et leurs dynamiques. + Pour organiser ces projections-débats, les + Artisans de la transition + ont sollicité, partout en Suisse romande, l’appui d’épiceries alternatives qui se sont souvent révélées + enthousiastes et proactives. Bio, vrac, participatives ou coopératives de productrices et de + producteurs, ces commerces trop peu valorisés sont alternatifs à la grande distribution et à + l’industrialisation systématique insoutenable du système alimentaire. De leur enthousiasme est née + l’envie de mieux les connaître, de les étudier de près, d’examiner leurs actions et leurs dynamiques.

- Les Artisans de la transition ont ainsi analysé l’évolution des épiceries alternatives - en Suisse romande de 2010 à 2023, mené 48 entretiens avec 55 gérantes et gérants, et réuni des épiceries - alternatives à Neuchâtel, Lausanne, Fribourg et Bienne pour les encourager à coopérer. A Fribourg, ils - ont stimulé et accompagné la création de l’association d’épiceries alternatives fribourgeoises EpiFri et - organisé son assemblée constitutive le 6 juillet 2023. + Les + Artisans de la transition + ont ainsi analysé l’évolution des épiceries alternatives en Suisse romande de 2010 à 2023, mené 48 + entretiens avec 55 gérantes et gérants, et réuni des épiceries alternatives à Neuchâtel, Lausanne, + Fribourg et Bienne pour les encourager à coopérer. A Fribourg, ils ont stimulé et accompagné la création + de l’association d’épiceries alternatives fribourgeoises EpiFri et organisé son assemblée constitutive + le 6 juillet 2023.

@@ -58,38 +64,37 @@

ALIMENTATION

- Car tous ces efforts renforcent chez les Artisans de la transition la conviction que - ces commerces alternatifs portent en eux un vrai potentiel pour rendre le système alimentaire - soutenable. Ils leur apparaissent irremplaçables en tant que lieux « carrefours » où tous les - acteurs et toutes les actrices des circuits courts alimentaires artisanaux ont l’occasion de se croiser, - d’échanger et, potentiellement, de coopérer à cette fin. + Car tous ces efforts renforcent chez les + Artisans de la transition + la conviction que ces commerces alternatifs portent en eux un vrai potentiel pour rendre le système + alimentaire soutenable. Ils leur apparaissent irremplaçables en tant que lieux « carrefours » + où tous les acteurs et toutes les actrices des circuits courts alimentaires artisanaux ont l’occasion de + se croiser, d’échanger et, potentiellement, de coopérer à cette fin.

- Plus de 65 épiceries alternatives ont signé une prise de - position commune qui attire l’attention sur leur action et leur volonté de participer à la construction - d’un système alimentaire plus juste et soutenable. L’idée et l’espoir sont que cette première action - collective en augure d’autres sur la durée. + Plus de + 65 épiceries alternatives + ont signé une prise de position commune qui attire l’attention sur leur action et leur volonté de + participer à la construction d’un système alimentaire plus juste et soutenable. L’idée et l’espoir sont + que cette première action collective en augure d’autres sur la durée.

- Pour renforcer cet élan, les Artisans de la transition sortiront début 2025 un dossier - de LaRevueDurable sur les atouts des épiceries alternatives et les moyens de les fortifier et un nouveau - film documentaire, - Irremplaçables épiceries!, qui relie leur - action et leur engagement à une vision de l’agriculture dite « paysanne » avec laquelle elles sont - alignées et qu’elles pourraient promouvoir. + Pour renforcer cet élan, les + Artisans de la transition + sortiront début 2025 un dossier de LaRevueDurable sur les atouts des épiceries alternatives et les + moyens de les fortifier et un nouveau film documentaire, + Irremplaçables épiceries! + , qui relie leur action et leur engagement à une vision de l’agriculture dite « paysanne » avec laquelle + elles sont alignées et qu’elles pourraient promouvoir.

diff --git a/client/app/front-office/components/agir-avec-nous/alimentation/alimentation1.component.html b/client/app/front-office/components/agir-avec-nous/alimentation/alimentation1.component.html index 221a227eb..68ba129ea 100644 --- a/client/app/front-office/components/agir-avec-nous/alimentation/alimentation1.component.html +++ b/client/app/front-office/components/agir-avec-nous/alimentation/alimentation1.component.html @@ -3,57 +3,70 @@ [style.backgroundImage]="'url(assets/images/illustration-pages/epicerie_a_cote-artisans.webp)'" >
-
-

ALIMENTATION

+
+

ALIMENTATION

-
+

- L’alimentation a toujours été au centre du travail de LaRevueDurable, puis des - Artisans de la transition. Ce thème très populaire dans la population génère de - nombreuses initiatives chez les professionnels à tous les maillons des circuits alimentaires. + L’alimentation a toujours été au centre du travail de + LaRevueDurable + , puis des + Artisans de la transition + . Ce thème très populaire dans la population génère de nombreuses initiatives chez les professionnels à + tous les maillons des circuits alimentaires.

De très nombreuses personnes – producteurs, transformatrices, distributeurs, restauratrices et mangeurs – s’efforcent de rendre l’agriculture et l’alimentation plus saine, meilleure pour les sols, le climat - et la biodiversité, plus juste et équitable. Les Artisans de la transition se donnent - pour mission d’appuyer leurs démarches afin de promouvoir la construction de circuits courts + et la biodiversité, plus juste et équitable. Les + Artisans de la transition + se donnent pour mission d’appuyer leurs démarches afin de promouvoir la construction de circuits courts alimentaires collectifs.

- En juillet 2021, LaRevueDurable a publié un dossier - sur ce thème. + En juillet 2021, + LaRevueDurable + a publié un dossier + sur ce thème + .

- Grâce à ce travail d’enquête et rédactionnel, les Artisans de la transition ont pu - écrire et produire un documentaire, Manger, c’est politique ! dont la première a eu lieu en septembre, à - Lausanne. Ce film de 37 minutes raconte la construction de quatre circuits courts alimentaires - collectifs à Meyrin, dans le canton de Genève. + Grâce à ce travail d’enquête et rédactionnel, les + Artisans de la transition + ont pu écrire et produire un documentaire, Manger, c’est politique ! dont la première a eu lieu en + septembre, à Lausanne. Ce film de 37 minutes raconte la construction de quatre circuits courts + alimentaires collectifs à Meyrin, dans le canton de Genève.

- D’octobre à novembre 2021, les Artisans de la transition ont organisé ou coorganisé - cinq soirées lors desquelles ce film a été projeté, suivi de discussions avec des acteurs et des - actrices locales des circuits courts. Une quarantaine d’intervenants et plus de 600 personnes ont - participé à ces soirées. + D’octobre à novembre 2021, les + Artisans de la transition + ont organisé ou coorganisé cinq soirées lors desquelles ce film a été projeté, suivi de discussions avec + des acteurs et des actrices locales des circuits courts. Une quarantaine d’intervenants et plus de 600 + personnes ont participé à ces soirées.

- Aujourd’hui, les Artisans de la transition invitent les personnes qui ont aimé ce film - à organiser une projection suivie d’une discussion si possible en présence d’élus dans un contexte - associatif ou au sein d’établissements d’enseignement. Si l’idée vous tente, vous trouverez plus - d’informations + Aujourd’hui, les + Artisans de la transition + invitent les personnes qui ont aimé ce film à organiser une projection suivie d’une discussion si + possible en présence d’élus dans un contexte associatif ou au sein d’établissements d’enseignement. Si + l’idée vous tente, vous trouverez plus d’informations ici .

- La suite du projet alimentaire des Artisans de la transition passe par l’organisation - d’autres événements avec des acteurs et des actrices de l’alimentation soutenable pour promouvoir les - circuits cours alimentaires collectifs et lutter contre l’industrialisation toujours plus exacerbée de - l’alimentation et l’allongement des circuits alimentaires qui en résulte. + La suite du projet alimentaire des + Artisans de la transition + passe par l’organisation d’autres événements avec des acteurs et des actrices de l’alimentation + soutenable pour promouvoir les circuits cours alimentaires collectifs et lutter contre + l’industrialisation toujours plus exacerbée de l’alimentation et l’allongement des circuits alimentaires + qui en résulte.

- Les Artisans de la transition voudraient notamment appuyer la dynamique émergente des - épiceries alternatives à la grande distribution et animer une veille sur les marges de manœuvre - cantonales et communales. + Les + Artisans de la transition + voudraient notamment appuyer la dynamique émergente des épiceries alternatives à la grande distribution + et animer une veille sur les marges de manœuvre cantonales et communales.

Pour toute information, contactez diff --git a/client/app/front-office/components/agir-avec-nous/bns/bns.component.html b/client/app/front-office/components/agir-avec-nous/bns/bns.component.html index 45964de8a..b684204ea 100644 --- a/client/app/front-office/components/agir-avec-nous/bns/bns.component.html +++ b/client/app/front-office/components/agir-avec-nous/bns/bns.component.html @@ -1,23 +1,24 @@

-

RAPPORTS BNS

+

RAPPORTS BNS

-
+

Depuis 2016, l’association a publié trois rapports sur les investissements de la Banque Nationale Suisse dans l’industrie des énergies fossiles, dont les deux premiers ont donné lieu à de nombreuses motions parlementaires, y compris au niveau fédéral.

-

Français

+

Français

-

Sur le climat, la BNS égare la place financière suisse

+

Sur le climat, la BNS égare la place financière suisse

Fribourg, mardi 21 avril 2020. A trois jours de l’assemblée générale annuelle de la BNS, l’association - Artisans de la transition publie un nouveau rapport sur la politique de gestion des - risques climatiques de cette institution. Le constat est clair : la BNS n’a toujours pas pris la mesure - du risque systémique colossal et potentiellement irréversible que le changement climatique pose au - système financier et à l’ensemble de l’économie suisses. + Artisans de la transition + publie un nouveau rapport sur la politique de gestion des risques climatiques de cette institution. Le + constat est clair : la BNS n’a toujours pas pris la mesure du risque systémique colossal et + potentiellement irréversible que le changement climatique pose au système financier et à l’ensemble de + l’économie suisses.

Selon la BNS, la Suisse n’étant pas en bord la mer, ses biens matériels étant bien assurés, la @@ -33,11 +34,9 @@

Sur le climat, la BNS égare la place financière suisse

politique, une stratégie pour aplatir la courbe des risques climatiques.

- Rapport BNS 2020 (pdf) - + Rapport BNS 2020 (pdf) -

+

Les investissements de la BNS dans l’industrie des énergies fossiles sont contraires aux intérêts de la Suisse

@@ -45,21 +44,20 @@

- Mardi 24 avril 2018, les Artisans de la transition publient une nouvelle étude sur les - placements de la Banque nationale suisse dans l’industrie des énergies fossiles aux Etats-Unis et au - Royaume-Uni. Alors que cette institution gère l’une des plus importantes fortunes au monde, elle n’a - toujours pas de politique climatique. Ce faisant, la BNS est en retard sur l’évolution de la finance - internationale, en contradiction avec les politiques climatiques fédérales et nuit aux intérêts de la - Suisse. + Mardi 24 avril 2018, les + Artisans de la transition + publient une nouvelle étude sur les placements de la Banque nationale suisse dans l’industrie des + énergies fossiles aux Etats-Unis et au Royaume-Uni. Alors que cette institution gère l’une des plus + importantes fortunes au monde, elle n’a toujours pas de politique climatique. Ce faisant, la BNS est en + retard sur l’évolution de la finance internationale, en contradiction avec les politiques climatiques + fédérales et nuit aux intérêts de la Suisse.

- Rapport BNS 2018 (pdf) - + Rapport BNS 2018 (pdf) -

+

Les investissements de la BNS dans l’industrie fossile aux Etats-Unis : une catastrophe financière et pour le climat

@@ -67,31 +65,35 @@

- Jeudi 16 décembre, les Artisans de la transition publient un rapport sur les placements - de la Banque nationale suisse aux Etats-Unis. Pour les Artisans de la transition, South - Pole Group a passé en revue les 2535 titres que la BNS possède aux Etats-Unis, évalué les émissions de - CO2 dont ils sont responsables et l’évolution de leur valeur du 1er janvier 2013 au 31 - décembre 2015, date du dernier exercice pour lequel les émissions de CO2 des entreprises sont - connues. + Jeudi 16 décembre, les + Artisans de la transition + publient un rapport sur les placements de la Banque nationale suisse aux Etats-Unis. Pour les + Artisans de la transition + , South Pole Group a passé en revue les 2535 titres que la BNS possède aux Etats-Unis, évalué les + émissions de CO + 2 + dont ils sont responsables et l’évolution de leur valeur du 1er janvier 2013 au 31 décembre 2015, date + du dernier exercice pour lequel les émissions de CO + 2 + des entreprises sont connues.

Les résultats sont éloquents : avec moins de 10 % de sa fortune placés à la Bourse des Etats-Unis, soit 61,5 milliards de dollars/francs (les deux monnaies sont à parité), la Banque nationale suisse - (BNS) émet autant de CO2 que la Suisse entière et contribue à placer le monde sur une - trajectoire de +4°C à +6°C de hausse de la température. Très loin, donc, de l’objectif de l’accord de - Paris qui vise à limiter cette hausse bien en dessous de 2°C. Et au lieu d’obtenir de solides rendements - financiers, la BNS a perdu, avec ses placements dans l’industrie fossile aux Etats-Unis, 4 milliards de - dollars/francs en trois ans. + (BNS) émet autant de CO + 2 + que la Suisse entière et contribue à placer le monde sur une trajectoire de +4°C à +6°C de hausse de la + température. Très loin, donc, de l’objectif de l’accord de Paris qui vise à limiter cette hausse bien en + dessous de 2°C. Et au lieu d’obtenir de solides rendements financiers, la BNS a perdu, avec ses + placements dans l’industrie fossile aux Etats-Unis, 4 milliards de dollars/francs en trois ans.

- Rapport BNS 2016 (pdf) - + Rapport BNS 2016 (pdf) -

Deutsch

+

Deutsch

-

Die Nationalbank sendet dem Schweizer Finanzplatz falsche Signale

+

Die Nationalbank sendet dem Schweizer Finanzplatz falsche Signale

@@ -99,11 +101,11 @@

Die Nationalbank sendet dem Schweizer Finanzplatz falsche Sig 21. April 2020. Die Schweizerische Nationalbank (SNB) hat nach wie vor nicht begriffen, welch enormes Risiko der Klimawandel für das Schweizer Finanzsystem und die gesamte Wirtschaft darstellt. Zu diesem Schluss kommt eine Studie, welche der Verein - Artisans de la transition gemeinsam mit der Klima-Allianz Schweiz drei Tage vor der - Generalversammlung der SNB publiziert. Gemäss der SNB stellt der Klimawandel für die Schweizer - Wirtschaft und das Finanzsystem nur ein moderates Risiko dar: Die Schweiz liege nicht am Meer, ihre - Sachwerte seien gut versichert, die Redundanz der Bankrechenzentren sei gewährleistet und sie habe kaum - Schwerindustrie. + Artisans de la transition + gemeinsam mit der Klima-Allianz Schweiz drei Tage vor der Generalversammlung der SNB publiziert. Gemäss + der SNB stellt der Klimawandel für die Schweizer Wirtschaft und das Finanzsystem nur ein moderates + Risiko dar: Die Schweiz liege nicht am Meer, ihre Sachwerte seien gut versichert, die Redundanz der + Bankrechenzentren sei gewährleistet und sie habe kaum Schwerindustrie.

@@ -114,27 +116,30 @@

Die Nationalbank sendet dem Schweizer Finanzplatz falsche Sig Risikokurve zu entwickeln.

- SNB Investitionen-Bericht 2020 (pdf) - -

Prädikat klimaschädlich Studie zur Anlagepolitik der Schweizerischen Nationalbank

+ SNB Investitionen-Bericht 2020 (pdf) +

+ Prädikat klimaschädlich Studie zur Anlagepolitik der Schweizerischen Nationalbank +

- Am Dienstag, 24. April 2018, veröffentlichten die Artisans de la transition eine neue - Studie über die Investitionen der Schweizerischen Nationalbank in Fossile Unternehmen. Die BNS verwaltet - zwar eines der größten Vermögen der Welt, hat aber noch keine Klimapolitik. Damit hinkt Sie der - internationalen finanziellen Entwicklung hinterher, widerspricht der Klimapolitik des Bundes und schadet - den Interessen der Schweiz. + Am Dienstag, 24. April 2018, veröffentlichten die + Artisans de la transition + eine neue Studie über die Investitionen der Schweizerischen Nationalbank in Fossile Unternehmen. Die BNS + verwaltet zwar eines der größten Vermögen der Welt, hat aber noch keine Klimapolitik. Damit hinkt Sie + der internationalen finanziellen Entwicklung hinterher, widerspricht der Klimapolitik des Bundes und + schadet den Interessen der Schweiz.

- SNB Investitionen-Bericht 2018 (pdf) - + SNB Investitionen-Bericht 2018 (pdf) -

+

USA-Finanzanlagen der Schweizer Nationalbank in fossile Unternehmen: ein Desaster für Rendite und Klima.

@@ -145,13 +150,15 @@

Artisans-Bericht zeigt zum ersten Mal die Klimawirkung der Investitionen der SNB auf.

- SNB Investitionen-Bericht 2016 (pdf) - + SNB Investitionen-Bericht 2016 (pdf) -

English

+

English

-

The SNB’s misguided view of climate risks misleads the entire Swiss financial centre

+

+ The SNB’s misguided view of climate risks misleads the entire Swiss financial centre +

@@ -170,11 +177,11 @@

The SNB’s misguided view of climate risks misleads the enti climate risks curve as soon as possible.

- SNB Investment’s 2020 report (pdf) - + SNB Investment’s 2020 report (pdf) -

+

The Swiss National Bank’s Investments in the Fossil Fuel Industry Inflicts Heavy Losses to Switzerland

@@ -183,19 +190,22 @@

With a portfolio of 865 billion dollars, the Swiss National Bank (SNB) is amongst the biggest public investors in the world. A new report published today shows that the known portion of the SNB's equity portfolio (95.6 billion dollars, representing 60 % of the bank's equity investments) was the source - of 48.5 million tons of CO2 in 2017. That’s more than the total emissions attributable to - Switzerland in 2016 (48.3 million tons), the last available data. + of 48.5 million tons of CO + 2 + in 2017. That’s more than the total emissions attributable to Switzerland in 2016 (48.3 million tons), + the last available data.

- The report, issued by Artisans de la transition is based on research done by three - specialists: ISS-Ethix, 2°Investing initiative and Profundo. It shows that the SNB could tip the scales - in favour of the energy transition at no cost. Better still, with a significant benefice. ISS-Ethix has - calculated that if the SNB had divested 7.6 billion dollars that are invested into the most - carbon-intensive companies and had used this money instead to finance more climate-friendly companies, - it would have halved the emissions resulting from its equity portfolio and improved its financial - performance by 20 billion dollars over the last three years (between January 1st, 2015 and December - 31st, 2017). + The report, issued by + Artisans de la transition + is based on research done by three specialists: ISS-Ethix, 2°Investing initiative and Profundo. It shows + that the SNB could tip the scales in favour of the energy transition at no cost. Better still, with a + significant benefice. ISS-Ethix has calculated that if the SNB had divested 7.6 billion dollars that are + invested into the most carbon-intensive companies and had used this money instead to finance more + climate-friendly companies, it would have halved the emissions resulting from its equity portfolio and + improved its financial performance by 20 billion dollars over the last three years (between January 1st, + 2015 and December 31st, 2017).

@@ -207,14 +217,14 @@

is 0.85°C. The SNB is thus making the situation much worse for the country.

- SNB Investment’s 2018 report (pdf) - + SNB Investment’s 2018 report (pdf)

diff --git a/client/app/front-office/components/agir-avec-nous/bns/bns.component.scss b/client/app/front-office/components/agir-avec-nous/bns/bns.component.scss index d8f6bae9a..5904bd046 100644 --- a/client/app/front-office/components/agir-avec-nous/bns/bns.component.scss +++ b/client/app/front-office/components/agir-avec-nous/bns/bns.component.scss @@ -1,9 +1,9 @@ -h1.mat-h1 { +h1.mat-font-headline-sm { clear: both; margin-top: 3em; } -h2.mat-h2 { +h2.mat-font-title-lg { clear: both; margin-top: 2em; } @@ -20,12 +20,6 @@ h2.mat-h2 { height: 150px; } -.mat-mdc-unelevated-button { - display: block; - clear: both; - width: 300px; -} - .illustration { margin: 30px 0; max-width: 100%; diff --git a/client/app/front-office/components/agir-avec-nous/desinvestir-fossile/desinvestir-fossile.component.html b/client/app/front-office/components/agir-avec-nous/desinvestir-fossile/desinvestir-fossile.component.html index cdac400e1..c6386139b 100644 --- a/client/app/front-office/components/agir-avec-nous/desinvestir-fossile/desinvestir-fossile.component.html +++ b/client/app/front-office/components/agir-avec-nous/desinvestir-fossile/desinvestir-fossile.component.html @@ -5,16 +5,17 @@ " >
-
-

DÉSINVESTIR DE L’INDUSTRIE DES ÉNERGIES FOSSILES

+
+

DÉSINVESTIR DE L’INDUSTRIE DES ÉNERGIES FOSSILES

-
+

Etre sobre dans l’usage des combustibles et des carburants fossiles est fondamental pour baisser les - émissions de CO2. Il est tout aussi fondamental de s’attaquer en complément, avec toute la - vigueur nécessaire, à l’amont du cycle du carbone en posant un couvercle sur les puits et les mines - d’énergies fossiles. + émissions de CO + 2 + . Il est tout aussi fondamental de s’attaquer en complément, avec toute la vigueur nécessaire, à l’amont + du cycle du carbone en posant un couvercle sur les puits et les mines d’énergies fossiles.

Cette action part du constat qu’il y a cinq fois plus d’énergies fossiles dans le sous-sol de la Terre @@ -27,7 +28,10 @@

DÉSINVESTIR DE L’INDUSTRIE DES ÉNERGIES FOSSILES< En 2015, les Artisans de la transition ont lancé la première campagne publique pour appeler à désinvestir des 200 plus grandes entreprises d’énergie fossile du monde. Grâce à un crowdfunding, ils ont publié - le n°55 de LaRevueDurable + + le n°55 de + LaRevueDurable + qui décrit l’histoire et explique les fondements du désinvestissement et organisé deux cycles de trois conférences en partenariat avec la Ville de Genève et l’Université de Lausanne.

@@ -43,26 +47,24 @@

DÉSINVESTIR DE L’INDUSTRIE DES ÉNERGIES FOSSILES<

En 2021, ils ont publié la note d’analyse - Pour le pire ou pour le meilleur + Pour le pire ou pour le meilleur . Et ce communiqué de presse en 2022 : La place financière suisse soutient l’expansion du charbon dans le monde - + >La place financière suisse soutient l’expansion du charbon dans le monde .

-

Rapports BNS

- En savoir plus - +

Rapports BNS

+ En savoir plus
diff --git a/client/app/front-office/components/agir-avec-nous/irremplacables-epiceries/irremplacables-epiceries.component.html b/client/app/front-office/components/agir-avec-nous/irremplacables-epiceries/irremplacables-epiceries.component.html index 6d139946f..ba5043582 100644 --- a/client/app/front-office/components/agir-avec-nous/irremplacables-epiceries/irremplacables-epiceries.component.html +++ b/client/app/front-office/components/agir-avec-nous/irremplacables-epiceries/irremplacables-epiceries.component.html @@ -5,11 +5,11 @@ " >
-
-

IRREMPLAÇABLES ÉPICERIES

+
+

IRREMPLAÇABLES ÉPICERIES

-
+

Le documentaire Irremplaçables épiceries ! présente en 47 minutes la façon dont les épiceries alternatives de Suisse romande s’approvisionnent en donnant la priorité aux fermes en agroécologie et @@ -40,19 +40,21 @@

IRREMPLAÇABLES ÉPICERIES

épiceries ont une place essentielle.

- Les Artisans de la transition espèrent que ce film incitera les épiceries alternatives - à faire leur cette vision du système alimentaire. Il est rempli d’informations et stimule la discussion - en poussant à la mise en place ou au renforcement de politiques alimentaires ambitieuses. + Les Artisans de la transition + espèrent que ce film incitera les épiceries alternatives à faire leur cette vision du système + alimentaire. Il est rempli d’informations et stimule la discussion en poussant à la mise en place ou au + renforcement de politiques alimentaires ambitieuses.

- Les Artisans de la transition sollicitent l’appui des épiceries alternatives et des - organisations paysannes qui défendent les circuits courts alimentaires artisanaux collectifs pour - organiser des projections à conditions qu’elles soient suivies d’une discussion dans un contexte - associatif, politique et éducatif. + Les Artisans de la transition + sollicitent l’appui des épiceries alternatives et des organisations paysannes qui défendent les circuits + courts alimentaires artisanaux collectifs pour organiser des projections à conditions qu’elles soient + suivies d’une discussion dans un contexte associatif, politique et éducatif.

Si vous souhaitez organiser un tel événement, vous pouvez - remplir ce formulaire. + remplir ce formulaire + .

diff --git a/client/app/front-office/components/agir-avec-nous/numerique-ethique/numerique-ethique.component.html b/client/app/front-office/components/agir-avec-nous/numerique-ethique/numerique-ethique.component.html index 17c2ff15d..6e3ced3f6 100644 --- a/client/app/front-office/components/agir-avec-nous/numerique-ethique/numerique-ethique.component.html +++ b/client/app/front-office/components/agir-avec-nous/numerique-ethique/numerique-ethique.component.html @@ -3,11 +3,11 @@ [style.backgroundImage]="'url(assets/images/illustration-pages/larevuedurable-tatyana-aksenova-photocase.jpg)'" >
-
-

NUMÉRIQUE ÉTHIQUE

+
+

NUMÉRIQUE ÉTHIQUE

-
+

Chercher des informations sur internet, acheter en ligne ou avec sa carte de crédit, échanger sur les réseaux sociaux, participer à des visioconférences, regarder des vidéos, utiliser son GPS, gérer ses @@ -27,8 +27,8 @@

NUMÉRIQUE ÉTHIQUE

En 2019, les Artisans de la transition ont publié le dossier - n°63 de LaRevueDurable sur ce mode opératoire - ultrapuissant incompatible avec la transition. En 2020, le dossier + n°63 de LaRevueDurable + sur ce mode opératoire ultrapuissant incompatible avec la transition. En 2020, le dossier n°64 de LaRevueDurable associait ce mode opératoire à la croissance fulgurante de l’industrie textile.

diff --git a/client/app/front-office/components/agir-avec-nous/rapport-epiceries-alternatives/rapport-epiceries-alternatives.component.html b/client/app/front-office/components/agir-avec-nous/rapport-epiceries-alternatives/rapport-epiceries-alternatives.component.html index 528abfb34..9ba99e47e 100644 --- a/client/app/front-office/components/agir-avec-nous/rapport-epiceries-alternatives/rapport-epiceries-alternatives.component.html +++ b/client/app/front-office/components/agir-avec-nous/rapport-epiceries-alternatives/rapport-epiceries-alternatives.component.html @@ -1,14 +1,16 @@ -
-

PREMIER RAPPORT SUR LES ÉPICERIES ALTERNATIVES EN SUISSE ROMANDE

+
+

PREMIER RAPPORT SUR LES ÉPICERIES ALTERNATIVES EN SUISSE ROMANDE

-
+

- Paru le 20 novembre 2024, le rapport des Artisans de la transition Les épiceries - alternatives sont irremplaçables montre, pour la première fois, la claire dynamique positive des - épiceries alternatives en Suisse romande entre 2010 et 2023. Leur nombre a presque quadruplé pour - arriver à 149. Rapporté à l’évolution démographique, l’essor est encore plus frappant. Fin 2009, il y en - a environ une pour 50 000 habitants. Fin 2023, il y en a environ une pour 16 000 habitants. + Paru le 20 novembre 2024, le rapport des + Artisans de la transition + Les épiceries alternatives sont irremplaçables montre, pour la première fois, la claire dynamique + positive des épiceries alternatives en Suisse romande entre 2010 et 2023. Leur nombre a presque + quadruplé pour arriver à 149. Rapporté à l’évolution démographique, l’essor est encore plus frappant. + Fin 2009, il y en a environ une pour 50 000 habitants. Fin 2023, il y en a environ une pour 16 000 + habitants.

@@ -21,17 +23,19 @@

PREMIER RAPPORT SUR LES ÉPICERIES ALTERNATIVES EN SU 48 d’entre elles révèlent qu’elles sont bien plus que de simples canaux de distribution. A l’occasion de la sortie du rapport des Artisans de la transition, plus de 65 d’entre elles ont signé une prise de position pour défendre un système alimentaire plus juste et soutenable. Le site - https://epiceries-alternatives.ch permet de localiser - les épiceries alternatives signataires de sa région. + https://epiceries-alternatives.ch + permet de localiser les épiceries alternatives signataires de sa région.

Pour soutenir ces épiceries, une voie est d’identifier tout ce qui peut motiver, stimuler, encourager à - y faire ses courses. Le rapport des Artisans de la transition identifie et analyse en - sus les obstacles à leur rayonnement, puis développe cinq propositions pour lever ces obstacles. + y faire ses courses. Le rapport des + Artisans de la transition + identifie et analyse en sus les obstacles à leur rayonnement, puis développe cinq propositions pour + lever ces obstacles.


- Rapport 2024 (pdf) + Rapport 2024 (pdf)

diff --git a/client/app/front-office/components/association/comite-status/comite-status.component.html b/client/app/front-office/components/association/comite-status/comite-status.component.html index 6f9822d8b..b62173286 100644 --- a/client/app/front-office/components/association/comite-status/comite-status.component.html +++ b/client/app/front-office/components/association/comite-status/comite-status.component.html @@ -1,20 +1,20 @@ -
-

COMITÉ ET STATUTS

+
+

COMITÉ ET STATUTS

-
-
Comité
+
+

Comité

-
Président
+

Président

Yvan Maillard Ardenti pilote le programme « Justice climatique » à la fondation Pain pour le prochain. Grand connaisseur de la finance éthique, il a été l’une des chevilles ouvrières du collectif Non au charbon ! qui, en 2008-2009, a fait capoter, avec les Amis de - LaRevueDurable, un projet d’investissement fribourgeois dans une centrale à charbon au - nord de l’Allemagne. + LaRevueDurable + , un projet d’investissement fribourgeois dans une centrale à charbon au nord de l’Allemagne.

-
Secrétaire
+

Secrétaire

Depuis qu’il a pris sa retraite d’enseignant en géographie, Jacques Eschmann profite de la nature et laisse libre cours à son esprit contemplatif. Il reste toutefois aussi très impliqué dans plusieurs @@ -22,11 +22,12 @@

COMITÉ ET STATUTS

en aide aux plus démunis qui ont besoin d’assistance médicale, et les Grands-parents pour le climat.

-
Membres
+

Membres

Stéphane Cuennet est géographe, journaliste et traducteur. Il propose des services rédactionnels sur tous les thèmes liés au territoire et à l’environnement. Il a longtemps assuré la présidence des Amis de - LaRevueDurable. + LaRevueDurable + .

Berthe Darras est ingénieure agronome. Elle partage sa vie professionnelle entre la défense des paysans @@ -56,35 +57,23 @@

COMITÉ ET STATUTS

justice sociale.

-

Statuts de l'association

+

Statuts de l'association

- à télécharger en PDF - + à télécharger en PDF

-

Rapports annuels d'activité

+

Rapports annuels d'activité

diff --git a/client/app/front-office/components/association/convictions/convictions.component.html b/client/app/front-office/components/association/convictions/convictions.component.html index 33855f747..780aaacc8 100644 --- a/client/app/front-office/components/association/convictions/convictions.component.html +++ b/client/app/front-office/components/association/convictions/convictions.component.html @@ -5,26 +5,27 @@ " >
-
-

NOS CONVICTIONS

+
+

NOS CONVICTIONS

-
-

+

+

« Lorsqu’on commence à agir, l’espoir est partout. Au lieu de chercher l’espoir, il faut donc plutôt chercher à agir. L’espoir suivra. » Greta Thunberg

 

L’association - Artisans de la transition voudrait créer un maximum d’opportunités d’agir pour - construire une société soutenable. A cette fin : + Artisans de la transition + voudrait créer un maximum d’opportunités d’agir pour construire une société soutenable. A cette + fin :

  • elle informe et réfléchit avec - LaRevueDurable, revue semestrielle consacrée à l’écologie, des rapports et une - lettre d’information ; + LaRevueDurable + , revue semestrielle consacrée à l’écologie, des rapports et une lettre d’information ;
  • elle stimule l’implication personnelle grâce à la méthode des Conversations carbone, dont elle diff --git a/client/app/front-office/components/association/partenariats/partenariats.component.html b/client/app/front-office/components/association/partenariats/partenariats.component.html index dd9aae9fc..6bf52075d 100644 --- a/client/app/front-office/components/association/partenariats/partenariats.component.html +++ b/client/app/front-office/components/association/partenariats/partenariats.component.html @@ -1,10 +1,10 @@ -
    -

    PARTENARIATS ET COOPÉRATIONS

    +
    +

    PARTENARIATS ET COOPÉRATIONS

    -
    +
    -
    Plate-forme développement durable-HES-SO
    +
    Plate-forme développement durable-HES-SO

    Les hautes écoles de la HES-SO s’engagent pour le développement durable. Les Artisans de la transition sont partenaires officiels de leur @@ -13,28 +13,33 @@

    PARTENARIATS ET COOPÉRATIONS

    > en ligne depuis juin 2019. Elle valorise des projets d’enseignement, de recherche appliquée, de campus et de stratégie institutionnelle qui contribuent à la transition écologique. Chaque projet - est accompagné d’un article de LaRevueDurable, qui approfondit ou offre une autre - approche des thèmes abordés. + est accompagné d’un article de + LaRevueDurable + , qui approfondit ou offre une autre approche des thèmes abordés.

    logo hes-so
    -
    CAS - Développement durable de l'Université de Genève
    +
    CAS - Développement durable de l'Université de Genève

    Le CAS développement durable horizon 2030 de l’Université de Genève a pour objectifs l’acquisition, le développement et la consolidation de connaissances scientifiques pluridisciplinaires et de compétences transversales sur le développement durable.

    - logo cas + logo cas +
    -
    Hepia - Haute école du paysage, d’ingénierie et d’architecture de Genève
    +
    + Hepia - Haute école du paysage, d’ingénierie et d’architecture de Genève +

    - Depuis 2015, l’hepia abonne tous ses étudiants et son personnel à LaRevueDurable. + Depuis 2015, l’hepia abonne tous ses étudiants et son personnel à + LaRevueDurable + .

    logo hepia @@ -42,10 +47,12 @@

    PARTENARIATS ET COOPÉRATIONS

    -
    Tera
    +
    Tera

    - En 2010, LaRevueDurable a inauguré un partenariat de contenu avec Tera, qui se - traduit par une rubrique régulière dans la revue. + En 2010, + LaRevueDurable + a inauguré un partenariat de contenu avec Tera, qui se traduit par une rubrique régulière dans la + revue.

    logo tera diff --git a/client/app/front-office/components/association/qui-sommes-nous/qui-sommes-nous.component.html b/client/app/front-office/components/association/qui-sommes-nous/qui-sommes-nous.component.html index a4bcf17dc..df0c8100e 100644 --- a/client/app/front-office/components/association/qui-sommes-nous/qui-sommes-nous.component.html +++ b/client/app/front-office/components/association/qui-sommes-nous/qui-sommes-nous.component.html @@ -1,10 +1,10 @@
    -
    -

    QUI SOMMES-NOUS ?

    +
    +

    QUI SOMMES-NOUS ?

    -
    +
    @@ -31,12 +31,14 @@

    QUI SOMMES-NOUS ?

    - Après quatorze années passées à animer LaRevueDurable, Susana Jourdan et Jacques - Mirenowicz ont voulu étoffer leurs moyens de partager leurs compréhensions, convictions et amour du - présent et de l’avenir. L’écriture reste pour eux essentielle, mais fait partie, depuis mars 2016, - d’un ensemble de trois types d’actions, avec le travail sur soi pour agir de manière résolue et la - création d’opportunités stratégiques pour aider un maximum de personnes à construire une société - soutenable en actionnant quelques leviers bien ciblés. + Après quatorze années passées à animer + LaRevueDurable + , Susana Jourdan et Jacques Mirenowicz ont voulu étoffer leurs moyens de partager leurs + compréhensions, convictions et amour du présent et de l’avenir. L’écriture reste pour eux + essentielle, mais fait partie, depuis mars 2016, d’un ensemble de trois types d’actions, avec le + travail sur soi pour agir de manière résolue et la création d’opportunités stratégiques pour aider + un maximum de personnes à construire une société soutenable en actionnant quelques leviers bien + ciblés.

    @@ -53,8 +55,11 @@

    QUI SOMMES-NOUS ?

    Dans son itinétaire professionnel à nombreuses facettes, Nathalie se réjouit de soutenir une cause qui lui tient à cœur : le respect et la responsabilité face à la Création. Elle s’occupe - des abonnements à LaRevueDurable et de différentes tâches administratives liées - aux Artisans de la transition. + des abonnements à + LaRevueDurable + et de différentes tâches administratives liées aux + Artisans de la transition + .

    @@ -70,10 +75,12 @@

    QUI SOMMES-NOUS ?

    - Zélé et fidèle gardien de la ligne graphique de LaRevueDurable et de ses - émanations, Jean-Christophe Froidevaux mobilise son talent et son dévouement pour valoriser - graphiquement les documents, ce site internet et les idées des - Artisans de la transition. + Zélé et fidèle gardien de la ligne graphique de + LaRevueDurable + et de ses émanations, Jean-Christophe Froidevaux mobilise son talent et son dévouement pour + valoriser graphiquement les documents, ce site internet et les idées des + Artisans de la transition + .

    @@ -93,8 +100,9 @@

    QUI SOMMES-NOUS ?

    Elle traque maladresses et étourderies, fautes de frappe, d’orthographe, de grammaire, de convention, de typographie, etc. avec une fiabilité et une disponibilité jamais démenties. Anne - Florence vérifie aussi, lors de chaque bouclage de LaRevueDurable, les épreuves - peu avant leur envoi à l’imprimeur. + Florence vérifie aussi, lors de chaque bouclage de + LaRevueDurable + , les épreuves peu avant leur envoi à l’imprimeur.

    @@ -105,8 +113,10 @@

    QUI SOMMES-NOUS ?

    - Il illustre chaque dossier de LaRevueDurable de ses dessins talentueux et - évocateurs, colorés et vivants, recherchés et décalés. Une signature à part entière. + Il illustre chaque dossier de + LaRevueDurable + de ses dessins talentueux et évocateurs, colorés et vivants, recherchés et décalés. Une + signature à part entière.

    @@ -125,22 +135,24 @@

    QUI SOMMES-NOUS ?

    Formé en gestion publique, Amédée apporte son plein de vitalité dans l’œuvre des - Artisans de la transition pour façonner un monde plus juste et vivant. Il est - chargé de projets et participe notamment aux programme sur les circuits courts alimentaires - collectifs en Suisse romande. + Artisans de la transition + pour façonner un monde plus juste et vivant. Il est chargé de projets et participe notamment aux + programme sur les circuits courts alimentaires collectifs en Suisse romande.

    -

    Une question de cohérence

    +

    Une question de cohérence

    - Les Artisans de la transition s’efforcent chaque jour de mettre leurs actes en - cohérence avec leurs idées et leurs convictions. LaRevueDurable est imprimée - localement sur du papier recyclé. Elle est vendue uniquement par abonnement et dans des points de - vente ciblés pour éviter le gaspillage lié à la diffusion en kiosque. Elle est acheminée sous - plastique recyclé ou sous enveloppe en papier. + Les + Artisans de la transition + s’efforcent chaque jour de mettre leurs actes en cohérence avec leurs idées et leurs convictions. + LaRevueDurable + est imprimée localement sur du papier recyclé. Elle est vendue uniquement par abonnement et dans des + points de vente ciblés pour éviter le gaspillage lié à la diffusion en kiosque. Elle est acheminée + sous plastique recyclé ou sous enveloppe en papier.

    Le bureau utilise du courant 100 % solaire issu de la Coopérative Optima Solar Fribourg @@ -149,9 +161,10 @@

    Une question de cohérence

    presque exclusivement à pied, à vélo et en train.

    - Les Artisans de la transition s’engagent pour un numérique éthique sans - surveillance et ont renoncé pour cette raison, en 2019, à être présents sur les réseaux sociaux - Twitter et Facebook. + Les + Artisans de la transition + s’engagent pour un numérique éthique sans surveillance et ont renoncé pour cette raison, en 2019, à + être présents sur les réseaux sociaux Twitter et Facebook.

    diff --git a/client/app/front-office/components/circuits-courts/circuits-courts.component.html b/client/app/front-office/components/circuits-courts/circuits-courts.component.html index 1444d928a..2278b3d09 100644 --- a/client/app/front-office/components/circuits-courts/circuits-courts.component.html +++ b/client/app/front-office/components/circuits-courts/circuits-courts.component.html @@ -3,11 +3,11 @@ [style.backgroundImage]="'url(assets/images/illustration-pages/epicerie_alternative_intchieno-artisans.webp)'" >
    -
    -

    MANGER C'EST POLITIQUE

    +
    +

    MANGER C'EST POLITIQUE

    -
    + diff --git a/client/app/front-office/components/comment-list/comment-list.component.html b/client/app/front-office/components/comment-list/comment-list.component.html index fed508cfc..3a27774de 100644 --- a/client/app/front-office/components/comment-list/comment-list.component.html +++ b/client/app/front-office/components/comment-list/comment-list.component.html @@ -5,7 +5,7 @@ Rédiger un commentaire - Publier + Publier
    } @@ -14,29 +14,23 @@ @for (comment of dataSource?.data?.items; track comment) {
    @if (comment.authorName) { -
    +
    {{ comment.authorName }} - - Posté le {{ comment.creationDate | date: 'longDate' }} - + Posté le {{ comment.creationDate | date: 'longDate' }} @if (comment.permissions?.update) { - + }
    } -
    {{ comment.description }}
    +
    {{ comment.description }}
    }
    } @if (!dataSource?.data?.items?.length) { -
    Aucun commentaire
    +
    Aucun commentaire
    }
    diff --git a/client/app/front-office/components/conditions-generales-vente/conditions-generales-vente.component.html b/client/app/front-office/components/conditions-generales-vente/conditions-generales-vente.component.html index 72fa36ac5..f938c3023 100644 --- a/client/app/front-office/components/conditions-generales-vente/conditions-generales-vente.component.html +++ b/client/app/front-office/components/conditions-generales-vente/conditions-generales-vente.component.html @@ -1,22 +1,26 @@ -
    -

    CONDITIONS GÉNÉRALES DE VENTE

    +
    +

    CONDITIONS GÉNÉRALES DE VENTE

    -
    +

    Les présentes conditions générales ont pour objet de définir les droits et les obligations des parties dans le cadre de la vente en ligne, de produits papier ou en format pdf, sur le site - www.artisansdelatransition.org. + www.artisansdelatransition.org + .

    -

    Article 1 : Généralités

    +

    Article 1 : Généralités

    - Ce site internet est exploité par l'association Artisans de la transition, association - éditrice de LaRevueDurable. Son siège se trouve à la Rue de Lausanne 23, 1700 Fribourg - Suisse. + Ce site internet est exploité par l'association + Artisans de la transition + , association éditrice de + LaRevueDurable + . Son siège se trouve à la Rue de Lausanne 23, 1700 Fribourg Suisse.

    Toute personne physique effectuant un achat via le site internet - www.artisansdelatransition.org, est dénommée "le client". + www.artisansdelatransition.org + , est dénommée "le client".

    Le client reconnaît avoir pris connaissance au moment de passer sa commande, des conditions de vente et @@ -28,7 +32,7 @@

    Article 1 : Généralités

    présentes conditions générales, c’est-à-dire avoir la majorité légale et ne pas être sous tutelle ou curatelle.

    -

    Article 2 : Intégralité

    +

    Article 2 : Intégralité

    Les présentes conditions générales comprennent l'intégralité des droits et obligations des parties. Aucune condition générale ou spécifique, figurant dans les documents envoyés ou remis par le client, ne @@ -37,7 +41,8 @@

    Article 2 : Intégralité

    se réserve le droit de modifier ou d’adapter à n’importe quel moment et sans préavis les présentes conditions générales, avec application immédiate des nouvelles. Cependant, en cas de modification, il sera appliqué les conditions générales de vente en vigueur sur le site - www.artisansdelatransition.org, à la date d’enregistrement de la commande. + www.artisansdelatransition.org + , à la date d’enregistrement de la commande.

    Si une condition venait à faire défaut, elle serait considérée être régie par les usages en vigueur dans @@ -46,12 +51,13 @@

    Article 2 : Intégralité

    réglementation ou par une décision de justice, cela ne saurait affecter la validité et le respect des présentes conditions générales de vente.

    -

    Article 3 : Propriété intellectuelle

    +

    Article 3 : Propriété intellectuelle

    - Le site www.artisansdelatransition.org relève de la législation suisse et - internationale sur les droits d’auteur et la propriété intellectuelle. Tous les droits de reproduction - d’exploitation, de diffusion ou de modification du contenu y sont réservés, y compris les - représentations iconographiques et photographiques. + Le site + www.artisansdelatransition.org + relève de la législation suisse et internationale sur les droits d’auteur et la propriété + intellectuelle. Tous les droits de reproduction d’exploitation, de diffusion ou de modification du + contenu y sont réservés, y compris les représentations iconographiques et photographiques.

    La présentation générale du site est originale et également protégée. Nul n’est autorisé à reproduire le @@ -68,25 +74,31 @@

    Article 3 : Propriété intellectuelle

    A moins qu’une autre source ne soit citée, les graphiques sont la propriété de - LaRevueDurable. Les illustrations et les photos sont la propriété de leurs auteurs et - leur reproduction doit être négociée directement avec eux. + LaRevueDurable + . Les illustrations et les photos sont la propriété de leurs auteurs et leur reproduction doit être + négociée directement avec eux.

    -

    Article 4 : Prix

    +

    Article 4 : Prix

    - Les prix des produits proposés à la vente sur www.artisansdelatransition.org sont - indiqués en Francs Suisses (CHF) et en euros. + Les prix des produits proposés à la vente sur + www.artisansdelatransition.org + sont indiqués en Francs Suisses (CHF) et en euros.

    Les personnes résidantes en Suisse sont tenues de passer leur commande en CHF. Les personnes résidant en dehors de la Suisse sont tenues de passer leur commande en euros.

    -

    L’association Artisans de la transition n’est pas soumise à la TVA.

    +

    + L’association + Artisans de la transition + n’est pas soumise à la TVA. +

    Les frais de livraison sont compris dans le prix sauf pour les livraisons dans des pays en dehors de l’Union européenne. Dans ce cas, les frais de livraison sont indiqués de manière distincte à côté de l’offre.

    -

    Article 5 : Conclusion du contrat

    +

    Article 5 : Conclusion du contrat

    Toutes les étapes de la procédure de commande sont clairement identifiées et le client a la possibilité de vérifier le détail de sa commande, son prix total, et de corriger d’éventuelles erreurs avant de @@ -112,15 +124,16 @@

    Article 5 : Conclusion du contrat

    Les clients qui ont souscrit un abonnement sont prévenus lorsque celui-ci arrive à échéance et sont invités à le renouveler. Les abonnements ne sont jamais reconduits de manière tacite.

    -

    Article 6 : Paiement

    +

    Article 6 : Paiement

    Tous les paiements par carte de crédit passent par un serveur sécurisé. Les informations saisies (notamment le numéro de carte et la date de validité) ne circulent pas « en clair » sur internet mais sont cryptés via le service Datatrans.

    - En aucun cas l'association Artisans de la transition n'a connaissance du numéro de - carte du client et ne les stocke aucunement. + En aucun cas l'association + Artisans de la transition + n'a connaissance du numéro de carte du client et ne les stocke aucunement.

    Lors de la finalisation du processus de commande, le client est invité à saisir son numéro de carte @@ -130,14 +143,16 @@

    Article 6 : Paiement

    Les cartes acceptées sont les suivantes : Visa, MasterCard, Postcard et Paypal.

    - Le client garantit à www.artisansdelatransition.org qu'il dispose des - autorisations nécessaires pour utiliser le mode de paiement choisi par lui-même, lors de la validation - du bon de commande. + Le client garantit à + www.artisansdelatransition.org + qu'il dispose des autorisations nécessaires pour utiliser le mode de paiement choisi par lui-même, lors + de la validation du bon de commande.

    - www.artisansdelatransition.org se réserve le droit de suspendre ou annuler tout - traitement de commande en cas de refus d'autorisation de paiement par carte bancaire de la part des - organismes officiellement accrédités ou en cas de non-paiement de la commande. + www.artisansdelatransition.org + se réserve le droit de suspendre ou annuler tout traitement de commande en cas de refus d'autorisation + de paiement par carte bancaire de la part des organismes officiellement accrédités ou en cas de + non-paiement de la commande.

    Les clients qui possèdent des cartes prépayées peuvent les utiliser à tout moment pour régler un achat @@ -145,13 +160,14 @@

    Article 6 : Paiement

    de paiement différents. C’est pourquoi, le solde du compte prépayé doit être égal ou supérieur au montant de la commande à régler.

    -

    Article 7 : Sécurité des paiements

    +

    Article 7 : Sécurité des paiements

    Datatrans, - www.datatrans.ch, est spécialisé dans les - transactions de paiement dans le commerce en ligne et exploite un système efficace permettant de - réaliser rapidement des paiements avec toutes les cartes de crédit, avec la Postcard ainsi qu’avec - différentes cartes de client, tout en bénéficiant de la plus haute sécurité de transaction. + www.datatrans.ch + , est spécialisé dans les transactions de paiement dans le commerce en ligne et exploite un système + efficace permettant de réaliser rapidement des paiements avec toutes les cartes de crédit, avec la + Postcard ainsi qu’avec différentes cartes de client, tout en bénéficiant de la plus haute sécurité de + transaction.

    Les systèmes de Datatrans sont exploités en Suisse et répondent à tous les standards de sécurité @@ -162,15 +178,17 @@

    Article 7 : Sécurité des paiements

    communication entre Datatrans et les différents instituts de finance s’effectue via des branchements de location ou VPN.

    -

    Article 8 : Réclamations

    +

    Article 8 : Réclamations

    Pour toute information ou réclamation concernant les produits proposés à la vente sur - www.artisansdelatransition.org, ou sur les présentes conditions générales de - vente, le client s’adresser à - abos@larevuedurable.com ou par courrier à cette adresse - : Association Artisans de la transition, Rue de Lausanne 23, 1700 Fribourg, Suisse. + www.artisansdelatransition.org + , ou sur les présentes conditions générales de vente, le client s’adresser à + abos@larevuedurable.com + ou par courrier à cette adresse : Association + Artisans de la transition + , Rue de Lausanne 23, 1700 Fribourg, Suisse.

    -

    Article 9 : Cas de force majeure

    +

    Article 9 : Cas de force majeure

    Aucune des deux parties n'aura failli à ses obligations contractuelles, dans la mesure où leur exécution sera retardée, entravée ou empêchée par un cas fortuit ou un cas de force majeure. @@ -195,30 +213,34 @@

    Article 9 : Cas de force majeure

    inondations, la foudre, la grève, l’incendie, la catastrophe, la panne et d’une manière générale tout événement ne permettant pas la bonne exécution des commandes.

    -

    Article 10 : Responsabilité

    +

    Article 10 : Responsabilité

    - La responsabilité de l'association Artisans de la transition ne saurait être engagée - pour tous les inconvénients ou dommages inhérents à l’utilisation du réseau internet, notamment une - rupture du service, une intrusion extérieure ou la présence de virus informatiques, ou de fait qualifié - de force majeure, conformément à la jurisprudence. + La responsabilité de l'association + Artisans de la transition + ne saurait être engagée pour tous les inconvénients ou dommages inhérents à l’utilisation du réseau + internet, notamment une rupture du service, une intrusion extérieure ou la présence de virus + informatiques, ou de fait qualifié de force majeure, conformément à la jurisprudence.

    -

    Article 11 : Conservation et archivage des transactions

    +

    Article 11 : Conservation et archivage des transactions

    - L'association Artisans de la transition procède à l’archivage des bons de commandes et - des factures sur un support fiable et durable correspondant à une copie fidèle et pouvant être produit à - titre de preuve. Les registres informatisés conservés dans les systèmes informatiques de l'association - Artisans de la transition dans des conditions raisonnables de sécurité, seront - considérés par la société et le client comme les preuves des communications, des commandes et des - paiements intervenus entre les parties. + L'association + Artisans de la transition + procède à l’archivage des bons de commandes et des factures sur un support fiable et durable + correspondant à une copie fidèle et pouvant être produit à titre de preuve. Les registres informatisés + conservés dans les systèmes informatiques de l'association + Artisans de la transition + dans des conditions raisonnables de sécurité, seront considérés par la société et le client comme les + preuves des communications, des commandes et des paiements intervenus entre les parties.

    -

    Article 12 : Données personnelles

    +

    Article 12 : Données personnelles

    Les données personnelles du client (nom, prénom, adresse, email, etc…) sont conservées par l'association - Artisans de la transition et ne sont en aucun cas revendues ou partagées à une tierce - partie, si ce n’est pour satisfaire à un ordre de justice ou sur accord du client concerné. + Artisans de la transition + et ne sont en aucun cas revendues ou partagées à une tierce partie, si ce n’est pour satisfaire à un + ordre de justice ou sur accord du client concerné.

    Le client a la possibilité de demander la modification ou la radiation de ses données.

    -

    Article 13 : Droit applicable

    +

    Article 13 : Droit applicable

    Les présentes conditions générales de vente en ligne sont soumises au droit suisse uniquement. En particulier, pour tout ce qui n’est pas expressément prévu dans les présentes, les règles du Code des @@ -226,7 +248,9 @@

    Article 13 : Droit applicable

    Tous litiges qui ne pourraient être réglés à l’amiable seront portés devant les tribunaux compétents du - ressort du siège social de l'association Artisans de la transition. + ressort du siège social de l'association + Artisans de la transition + .

    diff --git a/client/app/front-office/components/contact/contact.component.html b/client/app/front-office/components/contact/contact.component.html index b9ed04e48..1a477850f 100644 --- a/client/app/front-office/components/contact/contact.component.html +++ b/client/app/front-office/components/contact/contact.component.html @@ -5,11 +5,11 @@ " >
    -
    -

    NOUS CONTACTER

    +
    +

    NOUS CONTACTER

    -
    +

    Nous nous réjouissons de vous lire : @@ -18,7 +18,7 @@

    NOUS CONTACTER

    ou de vous entendre, toute la semaine sauf le mercredi : - +41 26 321 37 11 + +41 26 321 37 11

    diff --git a/client/app/front-office/components/donation/donation.component.html b/client/app/front-office/components/donation/donation.component.html index 5229ba359..ad59f8ee8 100644 --- a/client/app/front-office/components/donation/donation.component.html +++ b/client/app/front-office/components/donation/donation.component.html @@ -18,7 +18,5 @@

    Faire un don

    - + diff --git a/client/app/front-office/components/event-page/event-page.component.html b/client/app/front-office/components/event-page/event-page.component.html index 9244020f6..9080f0f4a 100644 --- a/client/app/front-office/components/event-page/event-page.component.html +++ b/client/app/front-office/components/event-page/event-page.component.html @@ -1,26 +1,26 @@
    -
    +
    {{ data.model.date | date: 'EEEE d MMMM yyyy' | capitalize }}
    -

    +

    {{ data.model.name }} @if (isUpdatePage() && data.model.permissions.update) { - + }

    -
    {{ data.model.type }}
    -
    {{ data.model.place }}
    +
    {{ data.model.type }}
    +
    {{ data.model.place }}
    -

    Commentaires

    +

    Commentaires

    @if (isUpdatePage()) { } diff --git a/client/app/front-office/components/event-page/event-page.component.ts b/client/app/front-office/components/event-page/event-page.component.ts index 5d073f95e..aca501f22 100644 --- a/client/app/front-office/components/event-page/event-page.component.ts +++ b/client/app/front-office/components/event-page/event-page.component.ts @@ -4,19 +4,19 @@ import {NaturalAbstractDetail, NaturalCapitalizePipe, NaturalIconDirective} from import {EventService} from '../../../admin/events/services/event.service'; import {CommentListComponent} from '../comment-list/comment-list.component'; import {MatIcon} from '@angular/material/icon'; -import {MatIconButton} from '@angular/material/button'; +import {MatMiniFabButton} from '@angular/material/button'; import {DatePipe} from '@angular/common'; @Component({ selector: 'app-event-page', imports: [ DatePipe, - MatIconButton, RouterLink, MatIcon, NaturalIconDirective, CommentListComponent, NaturalCapitalizePipe, + MatMiniFabButton, ], templateUrl: './event-page.component.html', styleUrl: './event-page.component.scss', diff --git a/client/app/front-office/components/events-page/events-page.component.html b/client/app/front-office/components/events-page/events-page.component.html index b8ffab627..93dc86a30 100644 --- a/client/app/front-office/components/events-page/events-page.component.html +++ b/client/app/front-office/components/events-page/events-page.component.html @@ -1,10 +1,10 @@
    -

    AGENDA

    +

    AGENDA

    @for (event of items; track event) {
    - {{ event.name }} + {{ event.name }}
    {{ event.date | date: 'EEEE d MMMM yyyy' | capitalize }}
    {{ event.place }}
    {{ event.type }}
    diff --git a/client/app/front-office/components/faire-un-don/faire-un-don.component.html b/client/app/front-office/components/faire-un-don/faire-un-don.component.html index c32bab2ed..a3b9276f3 100644 --- a/client/app/front-office/components/faire-un-don/faire-un-don.component.html +++ b/client/app/front-office/components/faire-un-don/faire-un-don.component.html @@ -4,11 +4,11 @@
    -
    -

    FAIRE UN DON

    +
    +

    FAIRE UN DON

    -
    +

    Les dons composent la moitié des revenus de l’association. Ils garantissent son indépendance. En @@ -16,15 +16,22 @@

    FAIRE UN DON


    - Faire un don + Faire un don
    diff --git a/client/app/front-office/components/home-block/home-block.component.html b/client/app/front-office/components/home-block/home-block.component.html index 3fd10d863..b9a5940e4 100644 --- a/client/app/front-office/components/home-block/home-block.component.html +++ b/client/app/front-office/components/home-block/home-block.component.html @@ -1,8 +1,8 @@ @if (!editMode) {
    -
    {{ form.get('title')?.value }}
    -
    {{ form.get('description')?.value }}
    - +
    {{ form.get('title')?.value }}
    +
    {{ form.get('description')?.value }}
    +
    {{ form.get('buttonLabel')?.value }} @if ((permissionsService.crud | async)?.configuration.create) { @@ -10,7 +10,7 @@ class="edit-button" color="none" style="color: black; background-color: white" - mat-fab + matFab (click)="editMode = true" > @@ -52,8 +52,8 @@
    - - + diff --git a/client/app/front-office/components/homepage/_homepage.theme.scss b/client/app/front-office/components/homepage/_homepage.theme.scss deleted file mode 100644 index 9a189c7d9..000000000 --- a/client/app/front-office/components/homepage/_homepage.theme.scss +++ /dev/null @@ -1,31 +0,0 @@ -@use 'sass:map'; -@use '@angular/material' as mat; -@mixin homepage($theme) { - $primary: map.get($theme, primary); - $accent: map.get($theme, accent); - $warn: map.get($theme, warn); - $bg: map.get($theme, background); - $fg: map.get($theme, foreground); - - app-homepage { - a.mat-headline-4 { - color: mat.m2-get-color-from-palette($fg, base); - - &:hover { - color: mat.m2-get-color-from-palette($primary); - } - } - - .description { - color: mat.m2-get-color-from-palette($fg, base, 0.75); - } - - .events { - background: mat.m2-get-color-from-palette($accent, A100); - - mat-divider { - border-color: mat.m2-get-color-from-palette($accent); - } - } - } -} diff --git a/client/app/front-office/components/homepage/homepage.component.html b/client/app/front-office/components/homepage/homepage.component.html index 9e9b682cd..4d7ad6e0f 100644 --- a/client/app/front-office/components/homepage/homepage.component.html +++ b/client/app/front-office/components/homepage/homepage.component.html @@ -18,7 +18,7 @@
    -
    +
    ACTUALITÉS
    @if ((permissionsService.crud | async)?.news.create) { @@ -26,7 +26,7 @@ class="absolute" color="none" style="color: black; background-color: white" - mat-fab + matFab routerLink="/admin/news" > @@ -38,23 +38,25 @@
    @for (news of newses; track news) {
    -
    +
    {{ news.date | date: 'EEE dd.MM.yy' | capitalize }}
    - {{ news.name }} -
    {{ news.description }}
    + {{ + news.name + }} +
    {{ news.description }}
    }
    -
    +
    AGENDA
    @if ((permissionsService.crud | async)?.event.create) { @@ -62,7 +64,7 @@ class="absolute" color="none" style="color: black; background-color: white" - mat-fab + matFab routerLink="/admin/event" > @@ -74,18 +76,16 @@ @for (event of events; track event) {
    - {{ event.name }} - -
    + {{ event.name }} +
    {{ event.date | date: 'EEE dd.MM.yy' | capitalize }} - - {{ event.place }} - {{ event.type }} + - {{ event.place }} - {{ event.type }}
    }
    @@ -116,18 +116,18 @@ }
    -
    Le dernier numéro
    -
    +
    Le dernier numéro
    +
    {{ currentReview.reviewNumber }} | {{ currentReview.releaseDate | date: 'MMMM yyyy' | capitalize }}
    - {{ currentReview.name }} - + {{ + currentReview.name + }} @if (!currentReview.file) { -
    +
    Disponible en versions papier ou PDF avec votre abonnnement
    @@ -137,9 +137,13 @@ @if (currentReview.file) { }
    @@ -149,31 +153,33 @@
    -
    NOUS SOUTENIR
    +
    NOUS SOUTENIR
    -
    +
    -
    S'abonner
    -
    +
    S'abonner
    +

    - En presque vingt ans, LaRevueDurable a publié plus de 1100 articles de fond - sur tous les thèmes qui touchent à la durabilité dans une soixantaine de pays. + En presque vingt ans, + LaRevueDurable + a publié plus de 1100 articles de fond sur tous les thèmes qui touchent à la durabilité dans + une soixantaine de pays.

    - Voir les abonnements + Voir les abonnements
    @@ -183,14 +189,16 @@ [style.backgroundImage]="'url(assets/images/homepage/larevuedurable-jehan.khodl-4.jpg)'" >
    -
    Rejoindre l’association
    -
    +
    Rejoindre l’association
    +

    - Devenir membre des Artisans de la transition permet un lien direct et - privilégié avec notre action. Et nous donne plus de légitimité et de poids. + Devenir membre des + Artisans de la transition + permet un lien direct et privilégié avec notre action. Et nous donne plus de légitimité et + de poids.

    - Découvrir l'association + Découvrir l'association
    @@ -199,15 +207,15 @@ [style.backgroundImage]="'url(assets/images/homepage/larevuedurable-jehan.khodl-6.jpg)'" >
    -
    Faire un don
    -
    +
    Faire un don
    +

    Les dons composent la moitié des revenus de l’association. Ils garantissent son indépendance. En faisant un don à l’association, vous soutenez une petite équipe motivée et compétente.

    - Faire un don + Faire un don
    diff --git a/client/app/front-office/components/homepage/homepage.component.scss b/client/app/front-office/components/homepage/homepage.component.scss index d51740b3a..69dfdedf6 100644 --- a/client/app/front-office/components/homepage/homepage.component.scss +++ b/client/app/front-office/components/homepage/homepage.component.scss @@ -1,4 +1,5 @@ @use 'sass:color'; +@use '@angular/material' as mat; @use '../../../../styles/responsive'; @use '../../../../styles/variables'; @@ -66,7 +67,7 @@ max-width: 50vw; text-align: center; - .mat-headline-3 { + .mat-font-display-md { margin-bottom: 30px; } } @@ -95,7 +96,7 @@ height: 550px; } - .mat-headline-2 { + .mat-font-display-lg { padding-top: 120px; } @@ -122,7 +123,7 @@ padding: 30px 0 0 30px; } - .mat-headline-4 { + .mat-font-headline-lg { margin-bottom: 0; min-height: 120px; } @@ -130,7 +131,7 @@ } .support.section { - .mat-h1 { + .mat-font-headline-sm { min-height: 64px; } @@ -182,3 +183,23 @@ color: white; } } + +a.mat-font-headline-lg { + color: var(--mat-sys-on-surface); + + &:hover { + color: var(--mat-sys-primary-container); + } +} + +.description { + color: color-mix(in srgb, var(--mat-sys-on-background) 90%, white); +} + +.events { + background: rgb(246, 242, 230); + + mat-divider { + border-color: var(--mat-sys-tertiary-container); + } +} diff --git a/client/app/front-office/components/legal-mentions/legal-mentions.component.html b/client/app/front-office/components/legal-mentions/legal-mentions.component.html index b3ae7b038..f68afe7c9 100644 --- a/client/app/front-office/components/legal-mentions/legal-mentions.component.html +++ b/client/app/front-office/components/legal-mentions/legal-mentions.component.html @@ -1,23 +1,39 @@ -
    -

    MENTIONS LÉGALES

    +
    +

    MENTIONS LÉGALES

    -
    -

    Association Artisans de la transition, Rue de Lausanne 23, 1700 Fribourg, Suisse

    -

    Tél.:+41 26 321 37 11

    -

    Co-directeurs : Susana Jourdan et Jacques Mirenowicz

    +

    - Conception graphique : + Association + Artisans de la transition + , Rue de Lausanne 23, 1700 Fribourg, Suisse +

    +

    + Tél.: + +41 26 321 37 11 +

    +

    + Co-directeurs : + Susana Jourdan et Jacques Mirenowicz +

    +

    + Conception graphique : Jean-Christophe Froidevaux, Vent d’ouest

    - Développement web : + Développement web : ecodev

    -

    Hébergeur du site : ecodev

    -

    Dessins : Jehan Khodl

    +

    + Hébergeur du site : + ecodev +

    +

    + Dessins : + Jehan Khodl +

    -

    Crédits photos :

    +

    Crédits photos :

    • Page d’accueil : Victor Savanyu
    • Nos convictions : Eléonore Henry de Frahan/Collectif Argos
    • @@ -32,36 +48,41 @@

      Crédits photos :

      Les auteurs des autres photos sont les - Artisans de la transition ou sont explicitement mentionnés dans les articles de - LaRevueDurable correspondants. + Artisans de la transition + ou sont explicitement mentionnés dans les articles de LaRevueDurable correspondants.

      -

      Liens avec d’autres sites

      +

      Liens avec d’autres sites

      L’association - Artisans de la transition ont contrôlé les hyperliens qui partent de ce site vers des - sites tiers à la date de l’établissement des liens. Des contenus contraires au droit n’étaient pas - identifiables à la date de l’établissement de ces liens. L’association - Artisans de la transition ne saurait raisonnablement, sans indice concret d’une - violation du droit, effectuer la surveillance continue des contenus des sites Internet avec lesquels ce - site est lié par des liens. L’association Artisans de la transition supprimera de tels - liens immédiatement en cas de découverte d’une quelconque violation du droit. + Artisans de la transition + ont contrôlé les hyperliens qui partent de ce site vers des sites tiers à la date de l’établissement des + liens. Des contenus contraires au droit n’étaient pas identifiables à la date de l’établissement de ces + liens. L’association + Artisans de la transition + ne saurait raisonnablement, sans indice concret d’une violation du droit, effectuer la surveillance + continue des contenus des sites Internet avec lesquels ce site est lié par des liens. L’association + Artisans de la transition + supprimera de tels liens immédiatement en cas de découverte d’une quelconque violation du droit.

      -

      Politique de confidentialité

      +

      Politique de confidentialité

      Les données personnelles du client (nom, prénom, adresse, adresse électronique, etc.) sont collectées pour pouvoir établir les factures et les envois nécessaires. L’association - Artisans de la transition les conserve, mais en aucun cas les revend ou les partage à - une tierce partie, si ce n’est pour satisfaire à un ordre de justice. Le client peut demander la - modification ou la radiation de ses données en adressant un message à - courriel@artisansdelatransition.org. + Artisans de la transition + les conserve, mais en aucun cas les revend ou les partage à une tierce partie, si ce n’est pour + satisfaire à un ordre de justice. Le client peut demander la modification ou la radiation de ses données + en adressant un message à + courriel@artisansdelatransition.org + .

      - Le site www.artisansdelatransition.org utilise des cookies de connexion. Ces - cookies servent à reconnaître votre navigateur et à enregistrer les préférences que vous avez - déterminées lors de votre précédente visite sur le site. Nous utilisons aussi des cookies pour mesurer - l’audience du site. Ces données sont totalement anonymisées et servent uniquement à comprendre - l’utilisation globale du site par les visiteurs. + Le site + www.artisansdelatransition.org + utilise des cookies de connexion. Ces cookies servent à reconnaître votre navigateur et à enregistrer + les préférences que vous avez déterminées lors de votre précédente visite sur le site. Nous utilisons + aussi des cookies pour mesurer l’audience du site. Ces données sont totalement anonymisées et servent + uniquement à comprendre l’utilisation globale du site par les visiteurs.

      Ce site bannit tous les autres cookies, qui servent à personnaliser les contenus publicitaires, à diff --git a/client/app/front-office/components/login/login.component.html b/client/app/front-office/components/login/login.component.html index 42ad1eb48..96ab3e715 100644 --- a/client/app/front-office/components/login/login.component.html +++ b/client/app/front-office/components/login/login.component.html @@ -29,28 +29,22 @@ [type]="hidePassword ? 'password' : 'text'" (keydown.enter)="maybeConfirm()" /> - {{ form.controls.password.errors | errorMessage }}

      -
      Pas encore de compte ?
      - Créer un compte +
      Pas encore de compte ?
      + Créer un compte
    diff --git a/client/app/front-office/components/menu/_menu.theme.scss b/client/app/front-office/components/menu/_menu.theme.scss deleted file mode 100644 index dd0dcbfbf..000000000 --- a/client/app/front-office/components/menu/_menu.theme.scss +++ /dev/null @@ -1,36 +0,0 @@ -@use 'sass:color'; -@use 'sass:map'; -@use '@angular/material' as mat; -@mixin menu($theme) { - $primary: map.get($theme, primary); - $accent: map.get($theme, accent); - $warn: map.get($theme, warn); - $bg: map.get($theme, background); - $fg: map.get($theme, foreground); - - .mega-menu { - background: mat.m2-get-color-from-palette($bg, base); - - ul { - a { - color: color.adjust(mat.m2-get-color-from-palette($fg, text), $lightness: 20%); - } - - a:hover { - color: mat.m2-get-color-from-palette($primary) !important; - } - - li:hover > a { - border-color: mat.m2-get-color-from-palette($primary) !important; - } - - & > li.hasMenu::after { - background: mat.m2-get-color-from-palette($bg, card); - } - - a.active { - color: mat.m2-get-color-from-palette($primary) !important; - } - } - } -} diff --git a/client/app/front-office/components/menu/menu.component.html b/client/app/front-office/components/menu/menu.component.html index b531c39e4..011fca68c 100644 --- a/client/app/front-office/components/menu/menu.component.html +++ b/client/app/front-office/components/menu/menu.component.html @@ -10,8 +10,8 @@ @for (item of navigation; track item) {
  • - {{ item.display }} + {{ item.display }} +
  • } diff --git a/client/app/front-office/components/menu/menu.component.scss b/client/app/front-office/components/menu/menu.component.scss index 78b203a79..ac14ee2cf 100644 --- a/client/app/front-office/components/menu/menu.component.scss +++ b/client/app/front-office/components/menu/menu.component.scss @@ -21,6 +21,8 @@ animation: _mat-menu-enter 120ms cubic-bezier(0, 0, 0.2, 1); border-radius: 5px; background: white; + + background: var(--mat-sys-surface-container-lowest); padding-top: 15px; padding-bottom: 15px; overflow: auto; @@ -65,4 +67,26 @@ } } } + + ul { + a { + color: var(--mat-sys-on-surface); + } + + a:hover { + color: var(--mat-sys-primary-container) !important; + } + + li:hover > a { + border-color: var(--mat-sys-primary-container) !important; + } + + & > li.hasMenu::after { + background: var(--mat-sys-surface-container-lowest); + } + + a.active { + color: var(--mat-sys-primary-container) !important; + } + } } diff --git a/client/app/front-office/components/news-page/news-page.component.html b/client/app/front-office/components/news-page/news-page.component.html index f4ce89a5b..b1a3c8d5e 100644 --- a/client/app/front-office/components/news-page/news-page.component.html +++ b/client/app/front-office/components/news-page/news-page.component.html @@ -1,21 +1,21 @@
    -
    {{ data.model.date | date: 'EEEE d MMMM yyyy' | capitalize }}
    +
    {{ data.model.date | date: 'EEEE d MMMM yyyy' | capitalize }}
    -

    +

    {{ data.model.name }} @if (isUpdatePage() && data.model.permissions.update) { - + }

    -
    +
    -

    Commentaires

    +

    Commentaires

    @if (isUpdatePage()) { } diff --git a/client/app/front-office/components/news-page/news-page.component.ts b/client/app/front-office/components/news-page/news-page.component.ts index bb22b47b5..5dae3b145 100644 --- a/client/app/front-office/components/news-page/news-page.component.ts +++ b/client/app/front-office/components/news-page/news-page.component.ts @@ -5,19 +5,19 @@ import {NewsService} from '../../../admin/newses/services/news.service'; import {PermissionsService} from '../../../shared/services/permissions.service'; import {CommentListComponent} from '../comment-list/comment-list.component'; import {MatIcon} from '@angular/material/icon'; -import {MatIconButton} from '@angular/material/button'; +import {MatMiniFabButton} from '@angular/material/button'; import {DatePipe} from '@angular/common'; @Component({ selector: 'app-news-page', imports: [ DatePipe, - MatIconButton, RouterLink, MatIcon, NaturalIconDirective, CommentListComponent, NaturalCapitalizePipe, + MatMiniFabButton, ], templateUrl: './news-page.component.html', styleUrl: './news-page.component.scss', diff --git a/client/app/front-office/components/newses-page/newses-page.component.html b/client/app/front-office/components/newses-page/newses-page.component.html index 72fcb2708..733f93b7e 100644 --- a/client/app/front-office/components/newses-page/newses-page.component.html +++ b/client/app/front-office/components/newses-page/newses-page.component.html @@ -1,12 +1,12 @@
    -

    ACTUALITÉS

    +

    ACTUALITÉS

    @for (news of items; track news) {
    {{ news.date | date: 'EEEE d MMMM yyyy' | capitalize }}
    - {{ news.name }} -
    {{ news.description }}
    + {{ news.name }} +
    {{ news.description }}
    }
    diff --git a/client/app/front-office/components/points-de-vente/points-de-vente.component.html b/client/app/front-office/components/points-de-vente/points-de-vente.component.html index 5fe128669..e6fc89c27 100644 --- a/client/app/front-office/components/points-de-vente/points-de-vente.component.html +++ b/client/app/front-office/components/points-de-vente/points-de-vente.component.html @@ -4,209 +4,209 @@ >
    -

    POINTS DE VENTE

    +

    POINTS DE VENTE

    - Vous habitez une commune où - LaRevueDurable n’est pas diffusée et où vous connaissez un lieu de passage qui attire des - personnes engagées – librairie, épicerie bio, etc. – susceptible de la diffuser ? N’hésitez pas à nous en - parler : courriel@artisansdelatransition.org + Vous habitez une commune où LaRevueDurable n’est pas diffusée et où vous connaissez un lieu de + passage qui attire des personnes engagées – librairie, épicerie bio, etc. – susceptible de la diffuser ? + N’hésitez pas à nous en parler : + courriel@artisansdelatransition.org

    -

    Suisse

    +

    Suisse

    -

    Fribourg

    +

    Fribourg

    -
    Atout Vrac
    -
    Grand-Rue 10
    -
    Fribourg
    +
    Atout Vrac
    +
    Grand-Rue 10
    +
    Fribourg
    -
    Le Petit Paradis
    -
    Place du Petit paradis 24
    -
    Fribourg
    +
    Le Petit Paradis
    +
    Place du Petit paradis 24
    +
    Fribourg
    -
    Librairie Albert Le Grand
    -
    Rue du Temple 1
    -
    Fribourg
    +
    Librairie Albert Le Grand
    +
    Rue du Temple 1
    +
    Fribourg
    -
    Librairie Payot
    -
    Rue de Romont 21
    -
    Fribourg
    +
    Librairie Payot
    +
    Rue de Romont 21
    +
    Fribourg
    -
    Vrac boulevard
    -
    Rte de la Glâne 122
    -
    Villars-sur-Glâne
    +
    Vrac boulevard
    +
    Rte de la Glâne 122
    +
    Villars-sur-Glâne
    -

    Genève

    +

    Genève

    -
    Cactus Sport
    -
    Rue du Pont Neuf 6
    -
    Carouge
    +
    Cactus Sport
    +
    Rue du Pont Neuf 6
    +
    Carouge
    -
    Itopie Informatique
    -
    Rue Lissignol 10
    -
    Genève
    +
    Itopie Informatique
    +
    Rue Lissignol 10
    +
    Genève
    -
    Librairie du Boulevard
    -
    Rue de Carouge 34
    -
    Genève
    +
    Librairie du Boulevard
    +
    Rue de Carouge 34
    +
    Genève
    -
    Librairie Fahrenheit 451
    -
    Rue Voltaire 24
    -
    Genève
    +
    Librairie Fahrenheit 451
    +
    Rue Voltaire 24
    +
    Genève
    -
    Mag’grottes
    -
    Rue des Grottes 9
    -
    Genève
    +
    Mag’grottes
    +
    Rue des Grottes 9
    +
    Genève
    -

    Neuchâtel

    +

    Neuchâtel

    -
    Cérès autrement
    -
    Place des Halles 5
    -
    Neuchâtel
    +
    Cérès autrement
    +
    Place des Halles 5
    +
    Neuchâtel
    -
    Librairie La Méridienne
    -
    Rue du Marché 6
    -
    La Chaux-de-Fonds
    +
    Librairie La Méridienne
    +
    Rue du Marché 6
    +
    La Chaux-de-Fonds
    -
    L’Aubier
    -
    Les Murailles 5
    -
    Montézillon
    +
    L’Aubier
    +
    Les Murailles 5
    +
    Montézillon
    -

    Vaud

    +

    Vaud

    -
    Librairie La Fontaine SA
    -
    EPFL-Rolex Learning Center
    -
    Ecublens
    +
    Librairie La Fontaine SA
    +
    EPFL-Rolex Learning Center
    +
    Ecublens
    -
    Librairie Payot
    -
    Place Pépinet 3
    -
    Lausanne
    +
    Librairie Payot
    +
    Place Pépinet 3
    +
    Lausanne
    -
    Magasin du Monde
    -
    Place de la Riponne 10
    -
    Lausanne
    +
    Magasin du Monde
    +
    Place de la Riponne 10
    +
    Lausanne
    -
    Topinambour
    -
    Avenue William-Fraisse 9
    -
    Lausanne
    +
    Topinambour
    +
    Avenue William-Fraisse 9
    +
    Lausanne
    -
    Magasin la Fontaine
    -
    Chemin de la Fontaine 2
    -
    Nyon
    +
    Magasin la Fontaine
    +
    Chemin de la Fontaine 2
    +
    Nyon
    -
    Librairie l’Etage
    -
    Rue du Lac 44
    -
    Yverdon-les-Bains
    +
    Librairie l’Etage
    +
    Rue du Lac 44
    +
    Yverdon-les-Bains
    -
    Librairie Payot
    -
    Rue des Remparts 1
    -
    Yverdon-les-Bains
    +
    Librairie Payot
    +
    Rue des Remparts 1
    +
    Yverdon-les-Bains
    -

    France

    +

    France

    -
    Le Vert de Terre
    -
    186, rue Alexandre Bérard
    -
    01500 Ambérieu-en-Bugey
    +
    Le Vert de Terre
    +
    186, rue Alexandre Bérard
    +
    01500 Ambérieu-en-Bugey
    -
    L’Arbre à Pain
    -
    150, avenue du Général Leclerc
    -
    15000 Aurillac
    +
    L’Arbre à Pain
    +
    150, avenue du Général Leclerc
    +
    15000 Aurillac
    -
    Bio Estella
    -
    ZA Pont de Joux bat B2
    -
    13390 Auriol
    +
    Bio Estella
    +
    ZA Pont de Joux bat B2
    +
    13390 Auriol
    -
    Biocoop La Canopee
    -
    3, allée de l’Ile aux Moineaux
    -
    25000 Besançon
    +
    Biocoop La Canopee
    +
    3, allée de l’Ile aux Moineaux
    +
    25000 Besançon
    -
    Biocoop Le Cres
    -
    10, route de Nîmes
    -
    34920 Le Cresse
    +
    Biocoop Le Cres
    +
    10, route de Nîmes
    +
    34920 Le Cresse
    -
    Biocoop du Haut-Doubs
    -
    9, rue Arthur Bourdin
    -
    25300 Pontarlier
    +
    Biocoop du Haut-Doubs
    +
    9, rue Arthur Bourdin
    +
    25300 Pontarlier
    -
    Biocoop Campana
    -
    8, avenue de l’Entreprise
    -
    Les Moutiers
    -
    12000 Rodez
    +
    Biocoop Campana
    +
    8, avenue de l’Entreprise
    +
    Les Moutiers
    +
    12000 Rodez
    -
    Biocoop La Gambille
    -
    10, rue de Robien
    -
    22000 Saint-Brieuc
    +
    Biocoop La Gambille
    +
    10, rue de Robien
    +
    22000 Saint-Brieuc
    -
    Apollon 74
    -
    Domaine David
    -
    14, chemin de la Ferme
    -
    74160 Saint-Julien-en-Genevois
    +
    Apollon 74
    +
    Domaine David
    +
    14, chemin de la Ferme
    +
    74160 Saint-Julien-en-Genevois
    diff --git a/client/app/front-office/components/projet/projet.component.html b/client/app/front-office/components/projet/projet.component.html index a392629c8..f88bcc696 100644 --- a/client/app/front-office/components/projet/projet.component.html +++ b/client/app/front-office/components/projet/projet.component.html @@ -3,82 +3,78 @@ [style.backgroundImage]="'url(assets/images/illustration-pages/artisans_de_la_transition_notre-projet.jpg)'" >
    -
    -
    -

    NOTRE PROJET

    +
    +

    NOTRE PROJET

    -
    -
    -

    - Les journalistes jugent souvent LaRevueDurable très engagée. Ses lecteurs saluent - sa rigueur. Ce sont les deux traits les plus caractéristiques de ce projet éditorial. -

    -

    - A qui s’adresse LaRevueDurable ? Poserait-on la question à un peintre ou à un - écrivain ? LaRevueDurable n’est pas un « produit » de presse, c’est une - création, une quête permanente. Derrière son contenu et sa forme, pas d’étude de marché ni d’analyse - d’agence. Pour savoir si cette revue peut vous instruire et vous aider à avancer, y a-t-il une autre - option que de lire et de découvrir ses numéros ? -

    +
    +
    +

    + Les journalistes jugent souvent LaRevueDurable très engagée. Ses lecteurs saluent sa + rigueur. Ce sont les deux traits les plus caractéristiques de ce projet éditorial. +

    +

    + A qui s’adresse LaRevueDurable  ? Poserait-on la question à un peintre ou à un + écrivain ? LaRevueDurable n’est pas un « produit » de presse, c’est une + création, une quête permanente. Derrière son contenu et sa forme, pas d’étude de marché ni d’analyse + d’agence. Pour savoir si cette revue peut vous instruire et vous aider à avancer, y a-t-il une autre + option que de lire et de découvrir ses numéros ? +

    -

    Aux sources de LaRevueDurable

    +

    Aux sources de LaRevueDurable

    -
      -
    • -

      - Il était une fois, au départ de LaRevueDurable, deux idéalistes. Au début - de l’aventure, en 2002, ils ressemblaient à cela. -

      - - - -
    • -
    -
    -
      -
    • -

      - Quelques années plus tard, ils ont un peu plus de verbe qu’à leurs débuts (entretien RTS en - juin 2008). -

      -
      - - -
      -
    • -
    -
    -
      -
    • -

      - En 2019, Jacques Mirenowicz évoque ces dix dernières années de mobilisation pour le climat. -

      - - - -
    • -
    -
    +
      +
    • +

      + Il était une fois, au départ de LaRevueDurable , deux idéalistes. Au début de + l’aventure, en 2002, ils ressemblaient à cela. +

      + + + +
    • +
    +
    +
      +
    • +

      + Quelques années plus tard, ils ont un peu plus de verbe qu’à leurs débuts (entretien RTS en juin + 2008). +

      +
      + + +
      +
    • +
    +
    +
      +
    • +

      En 2019, Jacques Mirenowicz évoque ces dix dernières années de mobilisation pour le climat.

      + + + +
    • +
    diff --git a/client/app/front-office/components/session-facilitator-private/_session-facilitator-private.theme.scss b/client/app/front-office/components/session-facilitator-private/_session-facilitator-private.theme.scss deleted file mode 100644 index fa8717850..000000000 --- a/client/app/front-office/components/session-facilitator-private/_session-facilitator-private.theme.scss +++ /dev/null @@ -1,24 +0,0 @@ -@use 'sass:map'; -@use '@angular/material' as mat; -@mixin session-facilitator-private($theme) { - $primary: map.get($theme, primary); - $accent: map.get($theme, accent); - $warn: map.get($theme, warn); - $bg: map.get($theme, background); - $fg: map.get($theme, foreground); - - app-session-facilitator-private { - .facilitator { - border-left-color: mat.m2-get-color-from-palette($primary); - } - - .category { - border-left-color: mat.m2-get-color-from-palette($accent); - } - - .document:hover { - background: mat.m2-get-color-from-palette($primary); - color: mat.m2-get-color-from-palette($primary, default-contrast); - } - } -} diff --git a/client/app/front-office/components/session-facilitator-private/session-facilitator-private.component.html b/client/app/front-office/components/session-facilitator-private/session-facilitator-private.component.html index 149c80112..349c7e557 100644 --- a/client/app/front-office/components/session-facilitator-private/session-facilitator-private.component.html +++ b/client/app/front-office/components/session-facilitator-private/session-facilitator-private.component.html @@ -4,11 +4,11 @@ >
    -

    Page réservée aux facilitateurs

    +

    Page réservée aux facilitateurs

    -
    -

    Liste des facilitateurs

    +
    +

    Liste des facilitateurs

    @for (user of facilitators; track user) {
    @@ -21,11 +21,11 @@

    Liste des facilitateurs

    -

    Documents

    +

    Documents

      @for (category of categories | keyvalue; track category) {
    • -

      {{ category.key }}

      +

      {{ category.key }}

      @for (document of category.value; track document) { @if (document.file) { diff --git a/client/app/front-office/components/session-facilitator-private/session-facilitator-private.component.scss b/client/app/front-office/components/session-facilitator-private/session-facilitator-private.component.scss index 8ee7503e0..ee79be38a 100644 --- a/client/app/front-office/components/session-facilitator-private/session-facilitator-private.component.scss +++ b/client/app/front-office/components/session-facilitator-private/session-facilitator-private.component.scss @@ -1,4 +1,5 @@ @use '../../../../styles/mixins'; + @include mixins.page-with-illustration(); .facilitators { @@ -52,3 +53,16 @@ padding: 3px 5px; } } + +.facilitator { + border-left-color: var(--mat-sys-primary-container); +} + +.category { + border-left-color: var(--mat-sys-tertiary-container); +} + +.document:hover { + background: var(--mat-sys-primary-container); + color: var(--mat-sys-on-primary-container); +} diff --git a/client/app/front-office/components/session-facilitator/_session-facilitator.theme.scss b/client/app/front-office/components/session-facilitator/_session-facilitator.theme.scss deleted file mode 100644 index 98eb744f4..000000000 --- a/client/app/front-office/components/session-facilitator/_session-facilitator.theme.scss +++ /dev/null @@ -1,15 +0,0 @@ -@use 'sass:map'; -@use '@angular/material' as mat; -@mixin session-facilitator($theme) { - $primary: map.get($theme, primary); - $accent: map.get($theme, accent); - $warn: map.get($theme, warn); - $bg: map.get($theme, background); - $fg: map.get($theme, foreground); - - app-session-facilitator { - .facilitator { - border-left-color: mat.m2-get-color-from-palette($primary); - } - } -} diff --git a/client/app/front-office/components/session-facilitator/session-facilitator.component.html b/client/app/front-office/components/session-facilitator/session-facilitator.component.html index 13b04bc58..b09820a59 100644 --- a/client/app/front-office/components/session-facilitator/session-facilitator.component.html +++ b/client/app/front-office/components/session-facilitator/session-facilitator.component.html @@ -4,15 +4,15 @@ >
    -

    DEVENIR FACILITATEURS·TRICES !

    +

    DEVENIR FACILITATEURS·TRICES !

    -
    +

    Vous aussi, vous pouvez vous engager dans la transition en devenant facilitatrice ou facilitateur de Conversations carbone.

    -

    La facilitation, c’est …

    +

    La facilitation, c’est …

    • … mettre en place et animer une dynamique de groupe favorable aux échanges bienveillants ;
    • … concrétiser et enrichir son engagement ;
    • @@ -25,7 +25,7 @@

      La facilitation, c’est …

      près de là où vous habitez.
    -

    La facilitation, ce n’est pas …

    +

    La facilitation, ce n’est pas …

    • … maîtriser des connaissances théoriques pointues sur le climat et l’écologie ;
    • … transmettre des contenus techniques.
    • @@ -51,7 +51,7 @@

      La facilitation, ce n’est pas …

       

      -

      Des facilitatrices et facilitateurs ont fait le pas

      +

      Des facilitatrices et facilitateurs ont fait le pas

      « Lorsque j’ai atteint l’âge de la retraite après des décennies de travail intense dans la santé @@ -67,7 +67,8 @@

      Des facilitatrices et facilitateurs ont fait le pas

      « L’animation de Conversations carbone me met en contact avec toutes sortes de personnes qui s’interrogent sur ce qu’elles peuvent faire. C’est à chaque fois des rencontres très enrichissantes, et ces groupes permettent de belles expériences d’intelligence collective selon une procédure bien - rodée. » Jacques, facilitateur + rodée. » + Jacques, facilitateur

      « Je suis toujours joyeuse de cofaciliter une Conversation carbone parce que c’est doux de @@ -78,7 +79,8 @@

      Des facilitatrices et facilitateurs ont fait le pas

      « Les Conversations carbone renforcent ma confiance dans mes compétences à accompagner un groupe à deux avec une certaine spontanéité. J' 'ai adoré quand une participante a réalisé qu'elle pouvait continuer à aimer ses proches même s' 'ils ne sont pas aussi sensibles aux enjeux - environnementaux. » Prisca, facilitatrice + environnementaux. » + Prisca, facilitatrice

      diff --git a/client/app/front-office/components/session-facilitator/session-facilitator.component.scss b/client/app/front-office/components/session-facilitator/session-facilitator.component.scss index 3c070bd15..88c436100 100644 --- a/client/app/front-office/components/session-facilitator/session-facilitator.component.scss +++ b/client/app/front-office/components/session-facilitator/session-facilitator.component.scss @@ -14,6 +14,7 @@ align-items: flex-start; border-left-width: 6px; border-left-style: solid; + border-left-color: var(--mat-sys-primary-container); padding: 5px 0 5px 10px; } } diff --git a/client/app/front-office/components/session-method/session-method.component.html b/client/app/front-office/components/session-method/session-method.component.html index 91f9588d3..71420cf09 100644 --- a/client/app/front-office/components/session-method/session-method.component.html +++ b/client/app/front-office/components/session-method/session-method.component.html @@ -3,12 +3,12 @@ [style.backgroundImage]="'url(assets/images/illustration-pages/conversations-carbone-methode.jpg)'" >
    -
    -

    LA METHODE DES CONVERSATIONS CARBONE

    +
    +

    LA METHODE DES CONVERSATIONS CARBONE

    -
    -
    Six rencontres pour comprendre, échanger et se mettre en mouvement
    +
    +

    Six rencontres pour comprendre, échanger et se mettre en mouvement

    Dans une Conversation carbone, une équipe de facilitation accompagne un groupe de huit à dix personnes pendant six ateliers participatifs structurés et dynamiques de deux heures. @@ -32,9 +32,11 @@

    LA METHODE DES CONVERSATIONS CARBONE

    le changement climatique ».

    - Les Artisans de la transition mettent en pratique les Conversations carbone depuis - 2017. A ce jour, près de 700 personnes ont participé à une Conversation carbone en Suisse romande et 80 - % d’entre elles disent que cette expérience les a aidées à modifier leurs comportements. + Les + Artisans de la transition + mettent en pratique les Conversations carbone depuis 2017. A ce jour, près de 700 personnes ont + participé à une Conversation carbone en Suisse romande et 80 % d’entre elles disent que cette expérience + les a aidées à modifier leurs comportements.

    @if (cart) {
    -
    Panier
    +
    Panier
    @if (cart.isEmpty()) {
    -
    Aucun article dans le panier
    +
    Aucun article dans le panier
    } @@ -28,24 +26,22 @@ > {{ line.product.name }}, {{ line.type | enum: 'ProductType' | async }} - {{ line.product.name }}, {{ line.type | enum: 'ProductType' | async }} - @if (line.quantity > 1) {
    x {{ line.quantity }}
    } -
    +
    {{ line.totalTaxInc | currency: currencyService.current.value }}
    @if (line.quantity === 1) { } -
    @@ -113,17 +104,17 @@ style="width: 70px; height: 70px" [style.backgroundImage]="'url(assets/images/homepage/la-revue-durable_faire-un-don.jpg)'" >
    - Don -
    + Don +
    {{ cart.donationAmount | currency: currencyService.current.value }}
    - + Continuer mes achats +
    @if (!cart.donationAmount) { - } - +
    }
    diff --git a/client/app/front-office/modules/cart/components/cart/cart.component.scss b/client/app/front-office/modules/cart/components/cart/cart.component.scss index 1c2b7cd2c..56878c428 100644 --- a/client/app/front-office/modules/cart/components/cart/cart.component.scss +++ b/client/app/front-office/modules/cart/components/cart/cart.component.scss @@ -1,9 +1,17 @@ @use '../../../../../../styles/responsive'; +.mat-font-headline-lg { + margin-bottom: 0.5em; +} + .cart-buttons .mat-mdc-unelevated-button[color] { min-width: 200px; } +.cart-item .mat-mdc-button-base:not(.mdc-fab) { + justify-content: start; +} + :host { @include responsive.responsive(responsive.$lt-md) { .cart-buttons > * { diff --git a/client/app/front-office/modules/cart/components/cart/cart.component.ts b/client/app/front-office/modules/cart/components/cart/cart.component.ts index 900ee88e0..f175bb2cc 100644 --- a/client/app/front-office/modules/cart/components/cart/cart.component.ts +++ b/client/app/front-office/modules/cart/components/cart/cart.component.ts @@ -15,7 +15,7 @@ import {CartCollectionService} from '../../services/cart-collection.service'; import {MatDivider} from '@angular/material/divider'; import {MatIcon} from '@angular/material/icon'; import {PriceComponent} from '../../../../../shared/components/price/price.component'; -import {MatButton, MatIconButton} from '@angular/material/button'; +import {MatButton, MatMiniFabButton} from '@angular/material/button'; import {AsyncPipe, CurrencyPipe} from '@angular/common'; @Component({ @@ -24,7 +24,6 @@ import {AsyncPipe, CurrencyPipe} from '@angular/common'; AsyncPipe, CurrencyPipe, MatButton, - MatIconButton, RouterLink, PriceComponent, MatIcon, @@ -33,6 +32,7 @@ import {AsyncPipe, CurrencyPipe} from '@angular/common'; RouterOutlet, NaturalEnumPipe, NaturalBackgroundDensityDirective, + MatMiniFabButton, ], templateUrl: './cart.component.html', styleUrl: './cart.component.scss', diff --git a/client/app/front-office/modules/cart/components/create-order/create-order.component.html b/client/app/front-office/modules/cart/components/create-order/create-order.component.html index 3eccbdb2a..173253924 100644 --- a/client/app/front-office/modules/cart/components/create-order/create-order.component.html +++ b/client/app/front-office/modules/cart/components/create-order/create-order.component.html @@ -2,41 +2,42 @@
    -

    MÉTHODE DE PAIEMENT

    +

    MÉTHODE DE PAIEMENT

    Paiement par carte de crédit - + >Paiement par carte de crédit
    Recevoir une facture
    -

    Votre adresse

    +

    Votre adresse

    -

    Adresse de facturation

    +

    Adresse de facturation

    Identique à mon adresse - Identique à mon adresse - @if (!billingForm.get('sameAsBilling')?.value) { }
    -
    +
    @for (line of cart.productLines; track line) {
    - {{ line.product.name }} + {{ + line.product.name + }}
    Version : {{ line.type | enum: 'ProductType' | async }}
    Quantité : {{ line.quantity }}
    @@ -56,13 +57,13 @@

    Adresse de facturation

    Don
    }
    -
    Prix total
    -
    +
    Prix total
    +
    {{ cart.totalTaxInc | currency: currencyService.current.value }}
    + - + diff --git a/client/app/front-office/modules/shop/components/product-page/_product-page.theme.scss b/client/app/front-office/modules/shop/components/product-page/_product-page.theme.scss deleted file mode 100644 index 1c1488a91..000000000 --- a/client/app/front-office/modules/shop/components/product-page/_product-page.theme.scss +++ /dev/null @@ -1,22 +0,0 @@ -@use 'sass:map'; -@use '@angular/material' as mat; -@mixin product-page($theme) { - $primary: map.get($theme, primary); - $accent: map.get($theme, accent); - $warn: map.get($theme, warn); - $bg: map.get($theme, background); - $fg: map.get($theme, foreground); - - app-product-page { - .review { - a { - color: mat.m2-get-color-from-palette($fg, text); - } - } - - app-products-page .container { - padding-right: 0; - padding-left: 0; - } - } -} diff --git a/client/app/front-office/modules/shop/components/product-page/product-page.component.html b/client/app/front-office/modules/shop/components/product-page/product-page.component.html index f41e87051..36b2a394b 100644 --- a/client/app/front-office/modules/shop/components/product-page/product-page.component.html +++ b/client/app/front-office/modules/shop/components/product-page/product-page.component.html @@ -6,36 +6,35 @@
    @if (data.model.reviewNumber) { -
    +
    N° {{ data.model.reviewNumber }}
    } @if (data.model.releaseDate) { -
    +
    {{ data.model.releaseDate | date: 'MMMM yyyy' | capitalize }}
    } @if (data.model.permissions.update) { - + }
    -

    {{ data.model.name }}

    +

    {{ data.model.name }}

    + -
    +
    @if (data.model.readingDuration) { -
    - -
    - {{ data.model.readingDuration - }}{{ data.model.readingDuration > 1 ? 'minutes' : 'minute' }} de lecture -
    -
    + + + {{ data.model.readingDuration }}{{ data.model.readingDuration > 1 ? 'minutes' : 'minute' }} + de lecture + }
    -
    +
    @@ -53,10 +52,10 @@

    {{ data.model.name }}

    - Voir les articles de ce numéro @@ -81,9 +80,9 @@

    {{ data.model.name }}

    [naturalSrcDensity]="`/api/image/${data.model.review.image.id}/300`" /> - Article issu de la revue - - N° {{ data.model.review.reviewNumber }} + Article issu de la revue + + N° {{ data.model.review.reviewNumber }} {{ data.model.review.name }} {{ data.model.review.releaseDate | date: 'MMMM yyyy' | capitalize }} @@ -92,31 +91,25 @@

    {{ data.model.name }}

    @if (!viewer) { -
    -
    Intéressé par ce contenu ?
    +
    +
    Intéressé par ce contenu ?
    Si vous êtes déjà abonné à la version numérique
    - connectez-vous ! - + connectez-vous !
    } -
    +
    @if (data.model.file) { -
    +
    -

    Téléchargement

    +

    Téléchargement

    @if (data.model.reviewNumber) { -

    - Vous pouvez dès à présent télécharger cette revue en format numérique (PDF) -

    +

    Vous pouvez dès à présent télécharger cette revue en format numérique (PDF)

    } @if (!data.model.reviewNumber) { -

    - Vous pouvez dès à présent télécharger cet article en format numérique (PDF) -

    +

    Vous pouvez dès à présent télécharger cet article en format numérique (PDF)

    } - + @if (data.model.reviewNumber) { Télécharger cette revue @@ -131,20 +124,19 @@

    Téléchargement

    @if (showBuyPaper || showBuyDigital) {
    @if (data.model.reviewNumber) { -
    Acheter le numéro
    +
    Acheter le numéro
    } @if (!data.model.reviewNumber) { -
    Acheter cet article
    +
    Acheter cet article
    }
    @if (showBuyPaper) {
    -
    +
    @@ -152,12 +144,11 @@

    Téléchargement

    } @if (showBuyDigital) {
    } @if (!viewer?.subscriptionType) { -
    -

    S'abonner

    +
    +

    S'abonner

    Un accès à - toute la base de données + toute la base de données avec près de - 1000 articles + 1000 articles de fond sur tous les thèmes qui touchent à la durabilité dans une soixantaine de pays

    Un travail rédactionnel - indépendant + indépendant . Aucun partenariat ni soutient financier n'y porte atteinte.

    L'envie de - comprendre + comprendre et le pouvoir d' - agir + agir pour - construire + construire une société écologique et solidaire.

    - S'abonner + S'abonner
    }
    -
    Pour continuer votre lecture ...
    +
    Pour continuer votre lecture ...
    @if (title) { -
    {{ title }}
    +
    {{ title }}
    } @if (items && items.length) { @@ -17,15 +17,15 @@ @if (showTagsOnProducts) {
    @for (tag of product.productTags; track tag) { - {{ tag.name }} - + {{ + tag.name + }} }
    } - {{ product.name }} + {{ + product.name + }} @if ($index <= 1 && product.illustration) {
    @@ -81,9 +80,9 @@ }
    -
    +
    @if (product.reviewNumber) { - N° {{ product.reviewNumber }} + N° {{ product.reviewNumber }} } @if (product.releaseDate) { @@ -91,33 +90,31 @@ }
    - {{ product.name }} - + {{ + product.name + }}
    - + Voir le détail - + >Voir le détail @if (product.file) { Télécharger - Télécharger - }
    @@ -127,7 +124,7 @@ }
    @if (items && dataSource?.data?.length > items.length) { - + {{ route.snapshot.data.showMoreLabel }} } @@ -135,6 +132,6 @@ } @if (items && items.length === 0 && route.snapshot.data.showNoResults) { -
    Aucun résultat n'a été trouvé.
    +
    Aucun résultat n'a été trouvé.
    }
    diff --git a/client/app/front-office/modules/shop/components/products-page/products-page.component.scss b/client/app/front-office/modules/shop/components/products-page/products-page.component.scss index 664bb6e44..2880a7f6e 100644 --- a/client/app/front-office/modules/shop/components/products-page/products-page.component.scss +++ b/client/app/front-office/modules/shop/components/products-page/products-page.component.scss @@ -76,7 +76,7 @@ } .product-price { - .frame-primary { + .nat-frame-primary { margin-right: 5px; padding: 5px; } @@ -97,3 +97,15 @@ margin-bottom: 30px; } } + +.products.grid .product { + border-color: var(--mat-sys-primary-container) !important; +} + +.product-name { + color: var(--mat-sys-on-surface); +} + +.product-tag { + color: var(--mat-sys-primary-container); +} diff --git a/client/app/front-office/modules/shop/components/products-page/products-page.component.ts b/client/app/front-office/modules/shop/components/products-page/products-page.component.ts index ea284d6c2..0549051ce 100644 --- a/client/app/front-office/modules/shop/components/products-page/products-page.component.ts +++ b/client/app/front-office/modules/shop/components/products-page/products-page.component.ts @@ -86,7 +86,7 @@ export class ProductsPageComponent extends AbstractInfiniteLoadList
    -

    S'ABONNER

    -

    +

    S'ABONNER

    +

    Plus de 1000 articles de fond sur tous les thèmes qui touchent à la durabilité dans une soixantaine de pays. - LaRevueDurable constitue l’une des plus importantes bases de données disponibles sur la - durabilité et la transition écologique en français. Voici nos formules d’abonnement. + LaRevueDurable + constitue l’une des plus importantes bases de données disponibles sur la durabilité et la transition + écologique en français. Voici nos formules d’abonnement.

    -

    +

    Si vous souhaitez offrir un abonnement, merci de contacter directement courriel@artisansdelatransition.org

    @@ -17,37 +18,37 @@

    S'ABONNER

    Abonnements personnels -->
    -

    Abonnement personnel

    +

    Abonnement personnel

    -
    Abonnement papier
    +
    Abonnement papier

    Arrive directement dans votre boîte aux lettres

    Pour 2 ans = 3 numéros

    - Acheter cet abonnement + Acheter cet abonnement
    -
    +
    Abonnement numérique -
    Disponible en format pdf
    +
    Disponible en format pdf

    Vous êtes prévenu des nouvelles parutions par courriel

    Accès illimité et instantané à plus de 1000 articles

    Pour 2 ans = 3 numéros

    - Acheter cet abonnement + Acheter cet abonnement
    -
    Abonnement papier et numérique (pdf)
    +
    Abonnement papier et numérique (pdf)

    Vous offre le confort de la lecture sur papier et l’accès illimité à plus de 1000 articles

    Pour 2 ans = 3 numéros

    - Acheter cet abonnement + Acheter cet abonnement
    @@ -56,39 +57,43 @@

    Abonnement personnel

    Abonnements profesionnels -->
    -

    Abonnement professionnel

    +

    Abonnement professionnel

    -
    Abonnement papier
    +
    Abonnement papier

    Arrive directement dans votre entreprise, collectivité, association

    Pour 2 ans = 3 numéros

    - Acheter cet abonnement + Acheter cet abonnement
    -
    Abonnement numérique
    +
    Abonnement numérique

    Vous êtes prévenu des nouvelles parutions par courriel

    Accès illimité et instantané à plus de 1000 articles pour trois utilisateurs

    Sur demande, il est possibilité d’ajouter des utilisateurs supplémentaires

    Pour 2 ans = 3 numéros

    - Acheter cet abonnement
    -
    Abonnement papier et numérique (pdf)
    +
    Abonnement papier et numérique (pdf)

    Vous offre le confort de la lecture sur papier et l’accès illimité à plus de 1000 articles

    Accès illimité et instantané à plus de 1000 articles pour trois utilisateurs

    Sur demande, il est possibilité d’ajouter des utilisateurs supplémentaires

    Pour 2 ans = 3 numéros

    - Acheter cet abonnement + Acheter cet abonnement
    diff --git a/client/app/front-office/modules/shop/components/subscriptions/subscriptions.component.scss b/client/app/front-office/modules/shop/components/subscriptions/subscriptions.component.scss index 362668241..dad08a92d 100644 --- a/client/app/front-office/modules/shop/components/subscriptions/subscriptions.component.scss +++ b/client/app/front-office/modules/shop/components/subscriptions/subscriptions.component.scss @@ -17,7 +17,7 @@ margin-bottom: 40px; } - & > *:not(.mat-h1) { + & > *:not(.mat-font-headline-sm) { display: flex; flex: 1; flex-direction: column; @@ -44,3 +44,17 @@ } } } + +.subscription.standard { + background: var(--mat-sys-primary-container); + color: var(--mat-sys-on-primary-container); +} + +.subscription.pro { + background: var(--mat-sys-tertiary-container); + color: var(--mat-sys-on-tertiary-container); +} + +.subscription.popular { + border: 10px solid var(--mat-sys-surface-container-lowest); +} diff --git a/client/app/front-office/modules/shop/components/subscriptions/subscriptions.component.ts b/client/app/front-office/modules/shop/components/subscriptions/subscriptions.component.ts index 9f70d93cf..9bcc0fed7 100644 --- a/client/app/front-office/modules/shop/components/subscriptions/subscriptions.component.ts +++ b/client/app/front-office/modules/shop/components/subscriptions/subscriptions.component.ts @@ -25,7 +25,7 @@ export class SubscriptionsComponent implements OnInit { protected subscriptions: Record | null = null; - protected ProductType = ProductType; + protected readonly ProductType = ProductType; public ngOnInit(): void { this.subscriptionService diff --git a/client/app/front-office/modules/shop/shop-routing.module.ts b/client/app/front-office/modules/shop/shop.routes.ts similarity index 100% rename from client/app/front-office/modules/shop/shop-routing.module.ts rename to client/app/front-office/modules/shop/shop.routes.ts diff --git a/client/app/profile/components/account/account.component.html b/client/app/profile/components/account/account.component.html index c4c1649c2..6af8c9ff7 100644 --- a/client/app/profile/components/account/account.component.html +++ b/client/app/profile/components/account/account.component.html @@ -1,9 +1,9 @@
    -

    Données personnelles

    +

    Données personnelles

    -

    Compte

    +

    Compte

    @@ -12,7 +12,7 @@

    Compte

    -
    @@ -22,9 +22,9 @@

    Compte

    -

    Adresse

    +

    Adresse

    -

    +

    Il s'agit de votre adresse principale qui est utilisée pour la facturation et la livraison. Lors des commandes vous pourrez définir une adresse de facturation différente.

    @@ -39,7 +39,7 @@

    Adresse

    - diff --git a/client/app/profile/components/history/history.component.html b/client/app/profile/components/history/history.component.html index fe32ca4c1..c0ebacf9b 100644 --- a/client/app/profile/components/history/history.component.html +++ b/client/app/profile/components/history/history.component.html @@ -1,6 +1,6 @@ @if (dataSource) {
    -

    Commandes

    +

    Commandes

    diff --git a/client/app/profile/components/profile/_profile.theme.scss b/client/app/profile/components/profile/_profile.theme.scss deleted file mode 100644 index f110e305f..000000000 --- a/client/app/profile/components/profile/_profile.theme.scss +++ /dev/null @@ -1,22 +0,0 @@ -@use 'sass:map'; -@use '@angular/material' as mat; -@mixin profile($theme) { - $primary: map.get($theme, primary); - $accent: map.get($theme, accent); - $warn: map.get($theme, warn); - $bg: map.get($theme, background); - $fg: map.get($theme, foreground); - - app-profile { - mat-nav-list { - padding-top: 0 !important; // override native .mat-list-base - * { - color: inherit !important; - } - } - - .active { - background: mat.m2-get-color-from-palette($primary, 400); - } - } -} diff --git a/client/app/profile/components/profile/profile.component.html b/client/app/profile/components/profile/profile.component.html index b5008dcdd..5a6322972 100644 --- a/client/app/profile/components/profile/profile.component.html +++ b/client/app/profile/components/profile/profile.component.html @@ -1,44 +1,43 @@ @if (viewer) { -
    +
    -
    Bonjour {{ viewer.firstName }},
    -
    -
    Mon abonnement à LaRevueDurable
    +
    Mon abonnement à LaRevueDurable
    @if (viewer.subscriptionLastReviewNumber) {
    Abonné {{ viewer.subscriptionType | enum: 'ProductType' | async }} jusqu'au numéro{{ viewer.subscriptionLastReviewNumber }}
    - Renouveler + Renouveler } @if (viewer.webTemporaryAccess) {
    Abonnement actif
    } @if (!viewer.subscriptionLastReviewNumber && !viewer.webTemporaryAccess) {
    N'est pas abonné.
    - S'abonner + S'abonner }
    -
    Mon statut Artisans de la transition
    +
    Mon statut Artisans de la transition
    {{ viewer.membership | enum: 'Membership' | async }}
    @if (membershipProduct) { } @if (viewer.membership !== Membership.None) { - Arrêter les cotisations + Arrêter les cotisations }
    @@ -48,26 +47,26 @@
    -
    -
    Mon compte
    +
    +
    Mon compte
    Articles et revues achetées - + >Articles et revues achetées Données personnelles - + >Données personnelles Commandes - + >Commandes
    diff --git a/client/app/profile/components/profile/profile.component.scss b/client/app/profile/components/profile/profile.component.scss index b61f1ac4f..bc1ef87d7 100644 --- a/client/app/profile/components/profile/profile.component.scss +++ b/client/app/profile/components/profile/profile.component.scss @@ -1,12 +1,39 @@ +@use '@angular/material' as mat; + .introduction { padding-top: 50px; padding-bottom: 50px; } -.body .mat-h2 { +.body .mat-font-title-lg { margin-bottom: 10px; } #profile-content { margin-bottom: 50px; } + +mat-nav-list { + padding-top: 0 !important; // override native .mat-list-base + * { + color: inherit !important; + } + + @include mat.list-overrides( + ( + list-item-hover-label-text-color: var(--mat-sys-on-primary-container), + list-item-focus-label-text-color: var(--mat-sys-on-primary-container), + list-item-label-text-color: var(--mat-sys-on-primary-container), + active-indicator-shape: 0, + ) + ); +} + +.active { + @include mat.list-overrides( + ( + list-item-container-color: rgba(255, 255, 255, 0.3), + list-item-container-shape: 0, + ) + ); +} diff --git a/client/app/profile/components/profile/profile.component.ts b/client/app/profile/components/profile/profile.component.ts index b0fdb6e22..049534c46 100644 --- a/client/app/profile/components/profile/profile.component.ts +++ b/client/app/profile/components/profile/profile.component.ts @@ -35,8 +35,8 @@ export class ProfileComponent implements OnInit { protected readonly productService = inject(ProductService); protected viewer: CurrentUserForProfile['viewer'] = null; - protected ProductType = ProductType; - protected Membership = Membership; + protected readonly ProductType = ProductType; + protected readonly Membership = Membership; protected membershipProduct: Product['product'] | null = null; diff --git a/client/app/profile/components/purchases/_purchases.theme.scss b/client/app/profile/components/purchases/_purchases.theme.scss deleted file mode 100644 index 4a42a2fe6..000000000 --- a/client/app/profile/components/purchases/_purchases.theme.scss +++ /dev/null @@ -1,15 +0,0 @@ -@use 'sass:map'; -@use '@angular/material' as mat; -@mixin purchases($theme) { - $primary: map.get($theme, primary); - $accent: map.get($theme, accent); - $warn: map.get($theme, warn); - $bg: map.get($theme, background); - $fg: map.get($theme, foreground); - - app-purchases { - .product a { - color: mat.m2-get-color-from-palette($fg, text); - } - } -} diff --git a/client/app/profile/components/purchases/purchases.component.html b/client/app/profile/components/purchases/purchases.component.html index 3ab1a64cf..f1a4e8d2b 100644 --- a/client/app/profile/components/purchases/purchases.component.html +++ b/client/app/profile/components/purchases/purchases.component.html @@ -1,6 +1,6 @@ @if (dataSource) {
    -

    Articles achetés

    +

    Articles achetés

    Articles achetés }
    -
    +
    @if (orderLine.product.reviewNumber) { - N° {{ orderLine.product.reviewNumber }} + N° {{ orderLine.product.reviewNumber }} } @if (orderLine.product.releaseDate) { @@ -35,13 +35,13 @@

    Articles achetés

    {{ orderLine.product.name }} @if (canDownload(orderLine)) { - + Télécharger diff --git a/client/app/profile/components/purchases/purchases.component.scss b/client/app/profile/components/purchases/purchases.component.scss index c6856b154..83b3099ac 100644 --- a/client/app/profile/components/purchases/purchases.component.scss +++ b/client/app/profile/components/purchases/purchases.component.scss @@ -1,3 +1,7 @@ .product-image img { max-width: 100px; } + +.product a { + color: var(--mat-sys-on-surface); +} diff --git a/client/app/profile/components/purchases/purchases.component.ts b/client/app/profile/components/purchases/purchases.component.ts index 6b9d1c309..7817ea420 100644 --- a/client/app/profile/components/purchases/purchases.component.ts +++ b/client/app/profile/components/purchases/purchases.component.ts @@ -41,7 +41,7 @@ import {AsyncPipe, DatePipe} from '@angular/common'; export class PurchasesComponent extends NaturalAbstractList implements OnInit { private readonly naturalFileService = inject(NaturalFileService); - protected ProductType = ProductType; + protected readonly ProductType = ProductType; public constructor() { super(inject(PurchaseService)); diff --git a/client/app/profile/profile-routing.module.ts b/client/app/profile/profile.routes.ts similarity index 100% rename from client/app/profile/profile-routing.module.ts rename to client/app/profile/profile.routes.ts diff --git a/client/app/shared/components/boot-loader/boot-loader.component.html b/client/app/shared/components/boot-loader/boot-loader.component.html index 008cebc28..419778eb1 100644 --- a/client/app/shared/components/boot-loader/boot-loader.component.html +++ b/client/app/shared/components/boot-loader/boot-loader.component.html @@ -1,3 +1 @@ -
    - -
    + diff --git a/client/app/shared/components/boot-loader/_boot-loader.external.scss b/client/app/shared/components/boot-loader/boot-loader.component.scss similarity index 93% rename from client/app/shared/components/boot-loader/_boot-loader.external.scss rename to client/app/shared/components/boot-loader/boot-loader.component.scss index c97756252..20c26ae36 100644 --- a/client/app/shared/components/boot-loader/_boot-loader.external.scss +++ b/client/app/shared/components/boot-loader/boot-loader.component.scss @@ -1,4 +1,4 @@ -.bootloader { +:host { display: flex; position: absolute; top: 0; diff --git a/client/app/shared/components/boot-loader/boot-loader.component.ts b/client/app/shared/components/boot-loader/boot-loader.component.ts index d8dbeeaef..0edcedd2d 100644 --- a/client/app/shared/components/boot-loader/boot-loader.component.ts +++ b/client/app/shared/components/boot-loader/boot-loader.component.ts @@ -3,5 +3,6 @@ import {Component} from '@angular/core'; @Component({ selector: 'app-boot-loader', templateUrl: './boot-loader.component.html', + styleUrl: 'boot-loader.component.scss', }) export class BootLoaderComponent {} diff --git a/client/app/shared/components/breadcrumbs/_breadcrumbs.theme.scss b/client/app/shared/components/breadcrumbs/_breadcrumbs.theme.scss deleted file mode 100644 index ca6f6e69b..000000000 --- a/client/app/shared/components/breadcrumbs/_breadcrumbs.theme.scss +++ /dev/null @@ -1,26 +0,0 @@ -@use 'sass:map'; -@use '@angular/material' as mat; -@mixin breadcrumbs($theme) { - $primary: map.get($theme, primary); - $accent: map.get($theme, accent); - $background: map.get($theme, background); - $foreground: map.get($theme, foreground); - - app-breadcrumbs { - .mat-mdc-button { - padding-right: 7px; - padding-left: 7px; - } - - * { - color: mat.m2-get-color-from-palette($foreground, text, 0.7); - } - - .separator { - &::before, - &::after { - border-color: mat.m2-get-color-from-palette($foreground, text, 0.3); - } - } - } -} diff --git a/client/app/shared/components/breadcrumbs/breadcrumbs.component.html b/client/app/shared/components/breadcrumbs/breadcrumbs.component.html index 3cede268c..0f8567a2a 100644 --- a/client/app/shared/components/breadcrumbs/breadcrumbs.component.html +++ b/client/app/shared/components/breadcrumbs/breadcrumbs.component.html @@ -2,6 +2,6 @@
    } @for (breadcrumb of breadcrumbs; track $index) { - {{ breadcrumb.label }} + {{ breadcrumb.label }}
    } diff --git a/client/app/shared/components/breadcrumbs/breadcrumbs.component.scss b/client/app/shared/components/breadcrumbs/breadcrumbs.component.scss index 4f8324b4a..24b6119ca 100644 --- a/client/app/shared/components/breadcrumbs/breadcrumbs.component.scss +++ b/client/app/shared/components/breadcrumbs/breadcrumbs.component.scss @@ -1,8 +1,21 @@ +@use '@angular/material' as mat; + :host { display: flex; flex-direction: row; align-items: center; + + @include mat.button-overrides( + ( + text-label-text-color: color-mix(in srgb, var(--mat-sys-on-surface) 80%, transparent), + ) + ); +} + +* { + color: color-mix(in srgb, var(--mat-sys-on-surface) 50%, transparent); } + mat-icon { transform: scale(0.66); } @@ -39,3 +52,8 @@ mat-icon { border-left-color: transparent; } } + +.mat-mdc-button { + padding-right: 7px; + padding-left: 7px; +} diff --git a/client/app/shared/components/breadcrumbs/breadcrumbs.component.ts b/client/app/shared/components/breadcrumbs/breadcrumbs.component.ts index 54c0d97df..3352fcd7d 100644 --- a/client/app/shared/components/breadcrumbs/breadcrumbs.component.ts +++ b/client/app/shared/components/breadcrumbs/breadcrumbs.component.ts @@ -1,4 +1,4 @@ -import {Component, DestroyRef, HostBinding, inject, Input, OnInit} from '@angular/core'; +import {Component, DestroyRef, inject, OnInit} from '@angular/core'; import {ActivatedRouteSnapshot, NavigationEnd, Router, RouterLink} from '@angular/router'; import {filter} from 'rxjs/operators'; import {MatButton} from '@angular/material/button'; @@ -17,11 +17,9 @@ export type Breadcrumb = { }) export class BreadcrumbsComponent implements OnInit { private readonly router = inject(Router); - private readonly destroyRef = inject(DestroyRef); - @HostBinding('class.mat-body') private isBody = true; - @Input() public breadcrumbs: Breadcrumb[] = []; + protected breadcrumbs: Breadcrumb[] = []; public ngOnInit(): void { this.update(); diff --git a/client/app/shared/components/error/error.component.html b/client/app/shared/components/error/error.component.html index d8e8ee77b..7da735c44 100644 --- a/client/app/shared/components/error/error.component.html +++ b/client/app/shared/components/error/error.component.html @@ -1,6 +1,6 @@
    -

    +

    Oups, une erreur est survenue

    @@ -14,7 +14,7 @@

    diff --git a/client/app/shared/components/tags-navigation/_tags-navigation.theme.scss b/client/app/shared/components/tags-navigation/_tags-navigation.theme.scss deleted file mode 100644 index 52a91bcc3..000000000 --- a/client/app/shared/components/tags-navigation/_tags-navigation.theme.scss +++ /dev/null @@ -1,24 +0,0 @@ -@use 'sass:map'; -@use '@angular/material' as mat; -@mixin tags-navigation($theme) { - $primary: map.get($theme, primary); - $accent: map.get($theme, accent); - $background: map.get($theme, background); - $foreground: map.get($theme, foreground); - - app-tags-navigation { - &, - a { - // explicit a gives more ponderation to css selector - color: mat.m2-get-color-from-palette($foreground, text, 0.25); - } - - .dot { - background-color: mat.m2-get-color-from-palette($foreground, text, 0.15); - } - - a:hover { - color: mat.m2-get-color-from-palette($primary); - } - } -} diff --git a/client/app/shared/components/tags-navigation/tags-navigation.component.scss b/client/app/shared/components/tags-navigation/tags-navigation.component.scss index 0600173c5..280377c73 100644 --- a/client/app/shared/components/tags-navigation/tags-navigation.component.scss +++ b/client/app/shared/components/tags-navigation/tags-navigation.component.scss @@ -27,3 +27,19 @@ top: -3px; } } + +:host { + &, + a { + // explicit a gives more ponderation to css selector + color: color-mix(in srgb, var(--mat-sys-on-surface-variant) 40%, white); + } + + .dot { + background-color: color-mix(in srgb, var(--mat-sys-on-surface-variant) 30%, white); + } + + a:hover { + color: var(--mat-sys-primary-container); + } +} diff --git a/client/app/user/components/change-password/change-password.component.html b/client/app/user/components/change-password/change-password.component.html index f478212ad..40a110fca 100644 --- a/client/app/user/components/change-password/change-password.component.html +++ b/client/app/user/components/change-password/change-password.component.html @@ -1,16 +1,11 @@
    -

    Changement de mot de passe

    +

    Changement de mot de passe

    - diff --git a/client/app/user/components/register/register.component.html b/client/app/user/components/register/register.component.html index 32cb53a0e..92a3a6e1c 100644 --- a/client/app/user/components/register/register.component.html +++ b/client/app/user/components/register/register.component.html @@ -1,6 +1,6 @@
    -

    {{ route.snapshot.data.seo.title }}

    +

    {{ route.snapshot.data.seo.title }}

    email @@ -12,18 +12,23 @@

    {{ route.snapshot.data.seo.title }}

    @if (step === 2) {
    -

    Compte

    +

    Compte

    -

    Coordonnées

    +

    Coordonnées

    }
    -
    diff --git a/client/app/user/components/request-password-reset/request-password-reset.component.html b/client/app/user/components/request-password-reset/request-password-reset.component.html index 3c3de97b8..5d28bef3b 100644 --- a/client/app/user/components/request-password-reset/request-password-reset.component.html +++ b/client/app/user/components/request-password-reset/request-password-reset.component.html @@ -1,6 +1,6 @@
    -

    Demande de changement de mot de passe

    +

    Demande de changement de mot de passe

    Email @@ -11,7 +11,7 @@

    Demande de changement de mot de passe

    - diff --git a/client/app/user/user-routing.module.ts b/client/app/user/user.routes.ts similarity index 100% rename from client/app/user/user-routing.module.ts rename to client/app/user/user.routes.ts diff --git a/client/index.html b/client/index.html index 4cdbda027..800d37bcc 100644 --- a/client/index.html +++ b/client/index.html @@ -1,5 +1,5 @@ - + Les artisans de la transition @@ -15,11 +15,24 @@ - + + + - - - + + + + diff --git a/client/main.ts b/client/main.ts index 9e9011a15..d485741da 100644 --- a/client/main.ts +++ b/client/main.ts @@ -1,115 +1,7 @@ -import {APP_ID, inject, LOCALE_ID, provideAppInitializer, provideZoneChangeDetection} from '@angular/core'; -import {AppComponent} from './app/app.component'; -import {routes} from './app/app-routing.module'; import {bootstrapApplication} from '@angular/platform-browser'; -import {Apollo} from 'apollo-angular'; -import {MAT_TOOLTIP_DEFAULT_OPTIONS, MatTooltipDefaultOptions} from '@angular/material/tooltip'; -import {apolloOptionsProvider} from './app/shared/config/apollo-options.provider'; -import {LocalizedPaginatorIntlService} from './app/shared/services/localized-paginator-intl.service'; -import {DATE_PIPE_DEFAULT_OPTIONS, DatePipeConfig, registerLocaleData} from '@angular/common'; -import { - activityInterceptor, - graphqlQuerySigner, - naturalProviders, - NaturalSwissParsingDateAdapter, - provideErrorHandler, - provideIcons, - provideSeo, -} from '@ecodev/natural'; -import {provideHttpClient, withInterceptors} from '@angular/common/http'; -import {MAT_PAGINATOR_DEFAULT_OPTIONS, MatPaginatorDefaultOptions, MatPaginatorIntl} from '@angular/material/paginator'; -import { - DateAdapter, - ErrorStateMatcher, - provideNativeDateAdapter, - ShowOnDirtyErrorStateMatcher, -} from '@angular/material/core'; -import {LoggerExtraService} from './app/shared/services/logger-extra.service'; -import {localConfig} from './app/shared/generated-config'; -import localeFRCH from '@angular/common/locales/fr-CH'; -import {provideRouter, withInMemoryScrolling, withRouterConfig} from '@angular/router'; -import {MAT_TABS_CONFIG, MatTabsConfig} from '@angular/material/tabs'; - -registerLocaleData(localeFRCH); - -const matTooltipCustomConfig: MatTooltipDefaultOptions = { - showDelay: 5, - hideDelay: 5, - touchendHideDelay: 5, - touchGestures: 'off', -}; +import {appConfig} from './app/app.config'; +import {AppComponent} from './app/app.component'; -bootstrapApplication(AppComponent, { - providers: [ - provideZoneChangeDetection({eventCoalescing: true}), - provideNativeDateAdapter(), - Apollo, - naturalProviders, - provideErrorHandler(localConfig.log.url, LoggerExtraService), - provideSeo({ - applicationName: 'Les artisans de la transition', - defaultDescription: 'Comprendre l’urgence écologique, Des pistes pour y répondre', - defaultRobots: 'all, index, follow', - }), - provideIcons({}), - {provide: APP_ID, useValue: 'serverApp'}, - { - provide: DateAdapter, - useClass: NaturalSwissParsingDateAdapter, - }, - { - provide: DATE_PIPE_DEFAULT_OPTIONS, - useValue: {dateFormat: 'dd.MM.y HH:mm'} satisfies DatePipeConfig, - }, - { - // Use OnDirty instead of default OnTouched, that allows to validate while editing. Touched is updated after blur. - provide: ErrorStateMatcher, - useClass: ShowOnDirtyErrorStateMatcher, - }, - { - // See https://github.com/angular/components/issues/26580 - provide: MAT_PAGINATOR_DEFAULT_OPTIONS, - useValue: { - formFieldAppearance: 'fill', - } satisfies MatPaginatorDefaultOptions, - }, - { - provide: MAT_TABS_CONFIG, - useValue: { - stretchTabs: false, - } satisfies MatTabsConfig, - }, - { - provide: LOCALE_ID, - useValue: 'fr-CH', - }, - { - provide: DATE_PIPE_DEFAULT_OPTIONS, - useValue: { - timezone: 'fr-CH', - } satisfies DatePipeConfig, - }, - { - provide: MatPaginatorIntl, - useClass: LocalizedPaginatorIntlService, - }, - apolloOptionsProvider, - {provide: MAT_TOOLTIP_DEFAULT_OPTIONS, useValue: matTooltipCustomConfig}, - provideHttpClient(withInterceptors([activityInterceptor, graphqlQuerySigner(localConfig.signedQueries.key)])), - provideRouter( - routes, - withRouterConfig({ - paramsInheritanceStrategy: 'always', - }), - withInMemoryScrolling({ - scrollPositionRestoration: 'top', - }), - ), - provideAppInitializer(() => { - const dateAdapter = inject(DateAdapter); - dateAdapter.setLocale('fr-ch'); - }), - ], -}).catch((err: unknown) => { +bootstrapApplication(AppComponent, appConfig).catch((err: unknown) => { console.error(err); }); diff --git a/client/styles.scss b/client/styles.scss index e1dabb47b..2a46c1886 100644 --- a/client/styles.scss +++ b/client/styles.scss @@ -1,15 +1,54 @@ -/* You can add global styles to this file, and also import other style files */ -@use 'app/shared/components/boot-loader/boot-loader.external'; @use 'styles/responsive'; +@use '@ecodev/natural'; @use '@ecodev/natural-layout' as nat; +@use '@angular/material' as mat; -body { - margin: 0; +html { + @include mat.theme( + ( + color: (), + typography: Roboto, + density: 0, + ) + ); } html, -body { +body, +app-root { + margin: 0; height: 100%; + min-height: 100%; +} + +app-root { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} + +body { + background-color: var(--mat-sys-surface-container); + color: var(--mat-sys-on-surface); + font: var(--mat-sys-body-medium); + + @include mat.table-overrides( + ( + row-item-outline-color: var(--mat-sys-outline-variant), + ) + ); + + @include mat.sidenav-overrides( + ( + container-background-color: var(--mat-sys-surface-container), + content-background-color: var(--mat-sys-surface-container), + ) + ); +} + +natural-sidenav-container { + margin: 0; } .container { @@ -89,11 +128,6 @@ input[type='number'] { -moz-appearance: textfield; /* Firefox */ } -.mdc-button { - height: auto !important; - min-height: var(--mat-button-filled-container-height); -} - .natural-table { display: table; @@ -134,12 +168,6 @@ input[type='number'] { width: 14em; } -.mat-mdc-button, -.mat-mdc-outlined-button, -.mat-mdc-unelevated-button { - border-radius: 0 !important; -} - .page-illustration { display: none; background-position: center; @@ -207,3 +235,187 @@ input[type='number'] { [class*='-vertical'][class*='-gap-'] > * { margin-bottom: 0 !important; } + +ng-progress { + .ng-bar { + box-shadow: var(--mat-sys-tertiary-container) 0 0 5px !important; + background-color: var(--mat-sys-tertiary-container) !important; + height: 3px !important; + } + + .ng-meteor { + top: 0 !important; + transform: none !important; + opacity: 1 !important; + box-shadow: var(--mat-sys-tertiary-container) 0 0 20px !important; + width: 25px !important; + } +} + +.pageHeader { + padding-top: 20px; + + .pageTitle { + position: relative; + min-width: 300px; + + & > span { + position: absolute; + top: -1.7em; + left: 0; + color: var(--mat-sys-primary-container); + font-size: 0.6em; + } + } +} + +app-admin router-outlet + * { + padding-bottom: 100px; +} + +.text-bold { + font-weight: bold !important; +} + +.text-thin { + font-weight: 100 !important; +} + +.frame-green { + background: #00ae8c; + color: white; +} + +.frame-stroked-primary { + border: 1px solid var(--mat-sys-primary-container); +} + +.frame-stroked-accent { + border: 1px solid var(--mat-sys-tertiary-container); +} + +.frame-stroked-warn { + border: 1px solid var(--mat-sys-error-container); +} + +.frame-padding { + padding: 30px; +} + +.text-light { + color: color-mix(in srgb, var(--mat-sys-on-surface) 50%, transparent); +} + +a { + color: var(--mat-sys-primary-container); +} + +[matButton='filled'][color='tertiary'] { + @include mat.button-overrides( + ( + filled-container-shape: 0, + filled-container-color: var(--mat-sys-tertiary-container), + ) + ); +} + +.rich-text { + line-height: 1.6em; + + .strong { + font-weight: bold; + } + + ul { + position: relative; + list-style: none; + + li { + margin-left: 0; + + &::before { + position: absolute; + left: 0; + content: '➔'; + } + } + } + + h1, + h2, + h3 { + margin-top: 1.3em; + } + + img { + margin: 1em 0; + max-width: 100%; + } + + .image-before-title { + position: relative; + top: 2.5em; + } +} + +app-home-block, +app-subscriptions, +.nat-frame-primary, +.nat-frame-tertiary, +.frame-green { + @include mat.button-overrides( + ( + filled-container-color: white, + filled-label-text-color: black, + text-label-text-color: black, + ) + ); +} + +.rich-text a, +a.app-link { + &:not(.mat-mdc-button-base):not(.no-style) { + border-bottom-width: 2px; + border-bottom-style: solid; + border-color: var(--mat-sys-primary); + color: var(--mat-sys-primary); + text-decoration: none; + + &:hover { + border-color: var(--mat-sys-tertiary-container); + color: var(--mat-sys-tertiary-container); + } + } +} + +.rich-text { + h1, + h2, + h3, + h4, + h5, + h6, + p { + margin-bottom: 1em; + } +} + +.witnesses { + display: grid; + grid-template-columns: 50% 50%; + grid-gap: 20px; + + @media screen and (max-width: 700px) { + grid-template-columns: 100%; + } +} + +.witness { + display: inline-block; // prevents columns to break paragraph (from bottom to top of next column) + margin-bottom: 30px; + border-width: 0; + border-left-width: 5px; + border-style: solid; + border-color: var(--mat-sys-primary-container); + padding: 0 0 0 10px; +} diff --git a/client/styles/_artisans.theme.scss b/client/styles/_artisans.theme.scss deleted file mode 100644 index b1271e782..000000000 --- a/client/styles/_artisans.theme.scss +++ /dev/null @@ -1,89 +0,0 @@ -@use 'sass:map'; -@use '@angular/material' as mat; -@mixin artisans($theme) { - $primary: map.get($theme, primary); - $accent: map.get($theme, accent); - $warn: map.get($theme, warn); - $bg: map.get($theme, background); - $fg: map.get($theme, foreground); - - .text-primary { - color: mat.m2-get-color-from-palette($primary); - } - - .text-accent { - color: mat.m2-get-color-from-palette($accent); - } - - .text-warn { - color: mat.m2-get-color-from-palette($warn); - } - - .text-light { - color: mat.m2-get-color-from-palette($fg, base, 0.5); - } - - .text-bold { - font-weight: bold !important; - } - - .text-thin { - font-weight: 100 !important; - } - - .frame-primary { - background: mat.m2-get-color-from-palette($primary); - - &, - a:not(.mat-mdc-unelevated-button):not(.mat-mdc-button):not(.mat-mdc-raised-button):not(.mat-tonal-button) { - color: mat.m2-get-color-from-palette($primary, default-contrast); - } - } - - .frame-accent { - background: mat.m2-get-color-from-palette($accent); - - &, - a:not(.mat-mdc-unelevated-button):not(.mat-mdc-button):not(.mat-mdc-raised-button):not(.mat-tonal-button) { - color: mat.m2-get-color-from-palette($accent, default-contrast); - } - } - - .frame-warn { - background: mat.m2-get-color-from-palette($warn); - - &, - a:not(.mat-mdc-unelevated-button):not(.mat-mdc-button):not(.mat-mdc-raised-button):not(.mat-tonal-button) { - color: mat.m2-get-color-from-palette($warn, default-contrast); - } - } - - .frame-green { - background: #00ae8c; - - &, - a:not(.mat-mdc-unelevated-button):not(.mat-mdc-button):not(.mat-mdc-raised-button):not(.mat-tonal-button) { - color: #ffffff; - } - } - - .frame-stroked-primary { - border: 1px solid mat.m2-get-color-from-palette($primary); - } - - .frame-stroked-accent { - border: 1px solid mat.m2-get-color-from-palette($accent); - } - - .frame-stroked-warn { - border: 1px solid mat.m2-get-color-from-palette($warn); - } - - .frame-padding { - padding: 30px; - } - - a { - color: mat.m2-get-color-from-palette($primary); - } -} diff --git a/client/styles/_components.scss b/client/styles/_components.scss deleted file mode 100644 index b3a28c4e3..000000000 --- a/client/styles/_components.scss +++ /dev/null @@ -1,74 +0,0 @@ -/** - * !!! NEVER INCLUDE THIS FILE IN A SCSS FILE - * See source doc here https://github.com/angular/material2/tree/master/src/lib/core/theming - */ -// Import theming files full relative way or karma will display warning -@use 'sass:map'; -@use '@angular/material' as mat; -@use '@ecodev/natural'; -@use '@ecodev/natural-editor'; -@use '../app/app.theme'; -@use 'rich-text'; -@use 'artisans.theme'; -@use '../app/shared/components/breadcrumbs/breadcrumbs.theme'; -@use '../app/shared/components/tags-navigation/tags-navigation.theme'; -@use '../app/admin/admin/admin.theme'; -@use '../app/admin/order/order-line/order-line.theme'; -@use '../app/profile/components/profile/profile.theme'; -@use '../app/profile/components/purchases/purchases.theme'; -@use '../app/front-office/components/homepage/homepage.theme'; -@use '../app/front-office/front-office.theme'; -@use '../app/front-office/components/menu/menu.theme'; -@use '../app/front-office/components/session-facilitator/session-facilitator.theme'; -@use '../app/front-office/components/session-facilitator-private/session-facilitator-private.theme'; -@use '../app/front-office/modules/shop/components/products-page/products-page.theme'; -@use '../app/front-office/modules/shop/components/product-page/product-page.theme'; -@use '../app/front-office/modules/shop/components/subscriptions/subscriptions.theme'; - -@mixin page-header($theme) { - $primary: map.get($theme, primary); - $accent: map.get($theme, accent); - $background: map.get($theme, background); - $foreground: map.get($theme, foreground); - - .pageHeader { - padding-top: 20px; - - .pageTitle { - position: relative; - min-width: 300px; - - & > span { - position: absolute; - top: -1.7em; - left: 0; - color: mat.m2-get-color-from-palette($primary); - font-size: 0.6em; - } - } - } -} - -// Include components themes -@mixin components-theme($theme) { - @include app.app($theme); - @include natural.natural($theme); - @include natural-editor.natural-editor($theme); - @include artisans.artisans($theme); - @include page-header($theme); - @include rich-text.rich-text($theme); - @include profile.profile($theme); - @include homepage.homepage($theme); - @include front-office.front-office($theme); - @include products-page.products-page($theme); - @include product-page.product-page($theme); - @include tags-navigation.tags-navigation($theme); - @include menu.menu($theme); - @include breadcrumbs.breadcrumbs($theme); - @include order-line.order-line($theme); - @include subscriptions.subscriptions($theme); - @include purchases.purchases($theme); - @include session-facilitator.session-facilitator($theme); - @include session-facilitator-private.session-facilitator-private($theme); - @include admin.admin($theme); -} diff --git a/client/styles/_rich-text.scss b/client/styles/_rich-text.scss deleted file mode 100644 index bfd983c83..000000000 --- a/client/styles/_rich-text.scss +++ /dev/null @@ -1,89 +0,0 @@ -@use 'sass:map'; -@use '@angular/material' as mat; -/** - * For some rich text editor or for static text oriented front-office pages content - */ -@mixin rich-text($theme) { - $primary: map.get($theme, primary); - $accent: map.get($theme, accent); - $background: map.get($theme, background); - $foreground: map.get($theme, foreground); - - .rich-text { - line-height: 1.6em; - - .strong { - font-weight: bold; - } - - ul { - position: relative; - list-style: none; - - li { - margin-left: 0; - - &::before { - position: absolute; - left: 0; - content: '➔'; - } - } - } - - h1, - h2, - h3 { - margin-top: 1.3em; - } - - img { - margin: 1em 0; - max-width: 100%; - } - - .image-before-title { - position: relative; - top: 2.5em; - } - } - - .rich-text a, - a.app-link { - &:not(.mat-mdc-button-base):not(.no-style) { - border-bottom: 2px solid mat.m2-get-color-from-palette($primary); - color: inherit; - - &:hover { - color: mat.m2-get-color-from-palette($primary); - } - } - } - - // Admin part - .rich-text.admin-editor { - border-bottom: 1px solid mat.m2-get-color-from-palette($foreground, base, 0.5); - border-top-right-radius: 4px; - border-top-left-radius: 4px; - background: mat.m2-get-color-from-palette( - $foreground, - base, - if(map.get($theme, is-dark), 0.1, 0.04) - ); // match official mat-form-field component style - padding: 10px 10px 0 10px; - font-size: 13px; - - .ql-editor { - padding: 0.25em 0 0.75em 0; - - p { - margin-bottom: 0; - } - } - - .label { - opacity: 0.6; - font-size: 0.9em; - } - } -} diff --git a/client/styles/_themes.scss b/client/styles/_themes.scss deleted file mode 100644 index 9df5cd925..000000000 --- a/client/styles/_themes.scss +++ /dev/null @@ -1,278 +0,0 @@ -/** - * !!! NEVER INCLUDE THIS FILE IN A SCSS FILE - * See source doc here https://github.com/angular/material2/tree/master/src/lib/core/theming - */ -// Import theming files full relative way or karma will display warning -@use 'sass:map'; -@use '@angular/material' as mat; -@use '@ecodev/natural'; -@use 'components'; - -$artisans-blue: ( - 50: #e3f2fd, - 100: #bbdefb, - 200: #90caf9, - 300: #64b5f6, - 400: #42a5f5, - 500: #0e7ecb, - 600: #1e88e5, - 700: #1976d2, - 800: #1565c0, - 900: #0d47a1, - A100: #82b1ff, - A200: #448aff, - A400: #2979ff, - A700: #466287, - contrast: ( - 50: rgba(black, 0.87), - 100: rgba(black, 0.87), - 200: rgba(black, 0.87), - 300: rgba(black, 0.87), - 400: rgba(black, 0.87), - 500: white, - 600: white, - 700: white, - 800: white, - 900: white, - A100: rgba(black, 0.87), - A200: white, - A400: white, - A700: white, - ), -); - -$artisans-orange: ( - 50: #fbe9e7, - 100: #ffccbc, - 200: #ffab91, - 300: #ff8a65, - 400: #ff7043, - 500: #ef6031, - 600: #f4511e, - 700: #e64a19, - 800: #d84315, - 900: #bf360c, - A100: #f6f2e6, - A200: #ff6e40, - A400: #ff3d00, - A700: #dd2c00, - contrast: ( - 50: rgba(black, 0.87), - 100: rgba(black, 0.87), - 200: rgba(black, 0.87), - 300: rgba(black, 0.87), - 400: rgba(black, 0.87), - 500: white, - 600: white, - 700: white, - 800: white, - 900: white, - A100: rgba(black, 0.87), - A200: rgba(black, 0.87), - A400: white, - A700: white, - ), -); - -$artisans-green: ( - 50: #e0f2f1, - 100: #b2dfdb, - 200: #80cbc4, - 300: #4db6ac, - 400: #26a69a, - 500: #00ae8c, - 600: #00897b, - 700: #00796b, - 800: #00695c, - 900: #004d40, - A100: #a7ffeb, - A200: #64ffda, - A400: #1de9b6, - A700: #00bfa5, - contrast: ( - 50: rgba(black, 0.87), - 100: rgba(black, 0.87), - 200: rgba(black, 0.87), - 300: rgba(black, 0.87), - 400: rgba(black, 0.87), - 500: white, - 600: white, - 700: white, - 800: white, - 900: white, - A100: rgba(black, 0.87), - A200: rgba(black, 0.87), - A400: rgba(black, 0.87), - A700: rgba(black, 0.87), - ), -); - -// Configure themes -$artisans-primary: mat.m2-define-palette($artisans-blue); -$artisans-accent: mat.m2-define-palette($artisans-orange); -$artisans-warn: mat.m2-define-palette(mat.$m2-red-palette); -$artisans-theme: mat.m2-define-light-theme( - ( - color: ( - primary: $artisans-primary, - accent: $artisans-accent, - warn: $artisans-warn, - ), - ) -); - -@mixin applyTheme($theme) { - $foreground: map.get($theme, foreground); - color: mat.m2-get-color-from-palette($foreground, text); - - @include mat.autocomplete-color($theme); - @include mat.button-color($theme); - @include mat.button-toggle-color($theme); - @include mat.card-color($theme); - @include mat.checkbox-color($theme); - @include mat.chips-color($theme); - @include mat.core-color($theme); - @include mat.datepicker-color($theme); - @include mat.dialog-color($theme); - @include mat.divider-color($theme); - @include mat.expansion-color($theme); - @include mat.fab-color($theme); - @include mat.form-field-color($theme); - @include mat.icon-color($theme); - @include mat.icon-button-color($theme); - @include mat.input-color($theme); - @include mat.list-color($theme); - @include mat.menu-color($theme); - @include mat.paginator-color($theme); - @include mat.progress-spinner-color($theme); - @include mat.radio-color($theme); - @include mat.select-color($theme); - @include mat.sidenav-color($theme); - @include mat.slide-toggle-color($theme); - @include mat.snack-bar-color($theme); - @include mat.sort-color($theme); - @include mat.table-color($theme); - @include mat.tabs-color($theme); - @include mat.toolbar-color($theme); - @include mat.tooltip-color($theme); - @include mat.tree-color($theme); - - @include components.components-theme($theme); -} - -// Include Material bases, densities, typographies and core (only once !) -// Only 31 modules used on a total of 37 modules - -// This fake theme is only use to tell Material we use Material v2, and not v3. Colors are never used. -$fake-material-v2-theme: mat.m2-define-light-theme( - ( - color: ( - primary: mat.m2-define-palette(mat.$m2-indigo-palette), - accent: mat.m2-define-palette(mat.$m2-indigo-palette), - ), - ) -); - -@include mat.autocomplete-base($fake-material-v2-theme); -@include mat.button-base($fake-material-v2-theme); -@include mat.button-toggle-base($fake-material-v2-theme); -@include mat.card-base($fake-material-v2-theme); -@include mat.checkbox-base($fake-material-v2-theme); -@include mat.chips-base($fake-material-v2-theme); -@include mat.core-base($fake-material-v2-theme); -@include mat.datepicker-base($fake-material-v2-theme); -@include mat.dialog-base($fake-material-v2-theme); -@include mat.divider-base($fake-material-v2-theme); -@include mat.expansion-base($fake-material-v2-theme); -@include mat.fab-base($fake-material-v2-theme); -@include mat.form-field-base($fake-material-v2-theme); -@include mat.icon-base($fake-material-v2-theme); -@include mat.icon-button-base($fake-material-v2-theme); -@include mat.input-base($fake-material-v2-theme); -@include mat.list-base($fake-material-v2-theme); -@include mat.menu-base($fake-material-v2-theme); -@include mat.paginator-base($fake-material-v2-theme); -@include mat.progress-spinner-base($fake-material-v2-theme); -@include mat.radio-base($fake-material-v2-theme); -@include mat.select-base($fake-material-v2-theme); -@include mat.sidenav-base($fake-material-v2-theme); -@include mat.slide-toggle-base($fake-material-v2-theme); -@include mat.snack-bar-base($fake-material-v2-theme); -@include mat.sort-base($fake-material-v2-theme); -@include mat.table-base($fake-material-v2-theme); -@include mat.tabs-base($fake-material-v2-theme); -@include mat.toolbar-base($fake-material-v2-theme); -@include mat.tooltip-base($fake-material-v2-theme); -@include mat.tree-base($fake-material-v2-theme); - -@include mat.autocomplete-density(0); -@include mat.button-density(0); -@include mat.button-toggle-density(0); -@include mat.card-density(0); -@include mat.checkbox-density(0); -@include mat.chips-density(0); -@include mat.core-density(0); -@include mat.datepicker-density(0); -@include mat.dialog-density(0); -@include mat.divider-density(0); -@include mat.expansion-density(0); -@include mat.fab-density(0); -@include mat.form-field-density(0); -@include mat.icon-density(0); -@include mat.icon-button-density(0); -@include mat.input-density(0); -@include mat.list-density(0); -@include mat.menu-density(0); -@include mat.paginator-density(0); -@include mat.progress-spinner-density(0); -@include mat.radio-density(0); -@include mat.select-density(0); -@include mat.sidenav-density(0); -@include mat.slide-toggle-density(0); -@include mat.snack-bar-density(0); -@include mat.sort-density(0); -@include mat.table-density(0); -@include mat.tabs-density(0); -@include mat.toolbar-density(0); -@include mat.tooltip-density(0); -@include mat.tree-density(0); - -@include mat.typography-hierarchy(natural.$typography); -@include mat.autocomplete-typography(natural.$typography); -@include mat.button-typography(natural.$typography); -@include mat.button-toggle-typography(natural.$typography); -@include mat.card-typography(natural.$typography); -@include mat.checkbox-typography(natural.$typography); -@include mat.chips-typography(natural.$typography); -@include mat.core-typography(natural.$typography); -@include mat.datepicker-typography(natural.$typography); -@include mat.dialog-typography(natural.$typography); -@include mat.divider-typography(natural.$typography); -@include mat.expansion-typography(natural.$typography); -@include mat.fab-typography(natural.$typography); -@include mat.form-field-typography(natural.$typography); -@include mat.icon-typography(natural.$typography); -@include mat.icon-button-typography(natural.$typography); -@include mat.input-typography(natural.$typography); -@include mat.list-typography(natural.$typography); -@include mat.menu-typography(natural.$typography); -@include mat.paginator-typography(natural.$typography); -@include mat.progress-spinner-typography(natural.$typography); -@include mat.radio-typography(natural.$typography); -@include mat.select-typography(natural.$typography); -@include mat.sidenav-typography(natural.$typography); -@include mat.slide-toggle-typography(natural.$typography); -@include mat.snack-bar-typography(natural.$typography); -@include mat.sort-typography(natural.$typography); -@include mat.table-typography(natural.$typography); -@include mat.tabs-typography(natural.$typography); -@include mat.toolbar-typography(natural.$typography); -@include mat.tooltip-typography(natural.$typography); -@include mat.tree-typography(natural.$typography); - -@include mat.elevation-classes(); -@include mat.app-background(); - -body { - @include applyTheme($artisans-theme); -} diff --git a/client/styles/artisans.scss b/client/styles/artisans.scss new file mode 100644 index 000000000..f3756f1aa --- /dev/null +++ b/client/styles/artisans.scss @@ -0,0 +1,75 @@ +/* + * Theme 1 (light + dark): + * Seed: #0E7ECB + * Core Colors: + * Primary: #0E7ECB + * Tertiary: #EF6031 + * Neutral: #FFFFFF + * Neutral Variant: #FFFFFF + * + * Theme 1 Builder Link: + * http://material-foundation.github.io/material-theme-builder/?primary=0E7ECB&tertiary=EF6031&neutral=FFFFFF&neutralVariant=FFFFFF&colorMatch=true + */ + +@use '@angular/material' as mat; +/* prettier-ignore */ +:root, :host, +[data-theme="artisansdelatransition"] { + @include mat.theme-overrides(( + primary: #005F9D, + primary-container: #0079C4, + primary-fixed: #D0E4FF, + primary-fixed-dim: #9CCAFF, + on-primary: #FFFFFF, + on-primary-container: #FDFCFF, + on-primary-fixed: #001D35, + on-primary-fixed-variant: #00497A, + inverse-primary: #9CCAFF, + + secondary: #45617F, + secondary-container: #BDDAFE, + secondary-fixed: #D0E4FF, + secondary-fixed-dim: #ACC9EC, + on-secondary: #FFFFFF, + on-secondary-container: #445F7E, + on-secondary-fixed: #001D35, + on-secondary-fixed-variant: #2C4966, + + tertiary: #AA3000, + tertiary-container: #EF6031, // not generated, set manually to match branding + tertiary-fixed: #FFDBD0, + tertiary-fixed-dim: #FFB59E, + on-tertiary: #FFFFFF, + on-tertiary-container: #FFFBFF, + on-tertiary-fixed: #3A0B00, + on-tertiary-fixed-variant: #852400, + + error: #BC0100, + error-container: #EB0000, + on-error: #FFFFFF, + on-error-container: #FFFBFF, + + surface: #FCF8F8, + surface-variant: #E0E3E3, + on-surface: #1C1B1B, + on-surface-variant: #444748, + surface-dim: #DDD9D9, + surface-bright: #FCF8F8, + surface-container-lowest: #FFFFFF, + surface-container-low: #F6F3F2, + surface-container: #F1EDEC, + surface-container-high: #EBE7E7, + surface-container-highest: #E5E2E1, + surface-tint: #0062A1, + inverse-surface: #313030, + inverse-on-surface: #F4F0EF, + + background: #F8F9FF, + on-background: #181C21, + + outline: #747878, + outline-variant: #C4C7C8, + shadow: #000000, + scrim: #000000 + )); +} diff --git a/client/styles/material_guides.scss b/client/styles/material_guides.scss deleted file mode 100644 index 18bb10a65..000000000 --- a/client/styles/material_guides.scss +++ /dev/null @@ -1,64 +0,0 @@ -// Palettes background et foreground de material -// N'est utilisé par rien, mais est juste là à titre d'aide -// NE PAS SUPPRIMER - -nothing { - // Background light; - status-bar: #e0e0e0; - app-bar: #f5f5f5; - background: #fafafa; - hover: rgba(0, 0, 0, 0.04); - card: white; - dialog: white; - disabled-button: rgba(0, 0, 0, 0.12); - raised-button: white; - focused-button: rgba(0, 0, 0, 0.06); - selected-button: #e0e0e0; - selected-disabled-button: #bdbdbd; - disabled-button-toggle: #eeeeee; - - // Background dark; - status-bar: black; - app-bar: #212121; - background: #303030; - hover: rgba(255, 255, 255, 0.04); - card: #424242; - dialog: #424242; - disabled-button: rgba(255, 255, 255, 0.12); - raised-button: #424242; - focused-button: rgba(255, 255, 255, 0.06); - selected-button: #212121; - selected-disabled-button: #424242; - disabled-button-toggle: #000000; - - // Foreground light; - base: black; - divider: rgba(0, 0, 0, 0.12); - dividers: rgba(0, 0, 0, 0.12); - disabled: rgba(0, 0, 0, 0.38); - disabled-button: rgba(0, 0, 0, 0.38); - disabled-text: rgba(0, 0, 0, 0.38); - hint-text: rgba(0, 0, 0, 0.38); - secondary-text: rgba(0, 0, 0, 0.54); - icon: rgba(0, 0, 0, 0.54); - icons: rgba(0, 0, 0, 0.54); - text: rgba(0, 0, 0, 0.87); - slider-off: rgba(0, 0, 0, 0.26); - slider-off-active: rgba(0, 0, 0, 0.38); - - // Foreground dark - base: white; - divider: rgba(255, 255, 255, 0.12); - dividers: rgba(255, 255, 255, 0.12); - disabled: rgba(255, 255, 255, 0.3); - disabled-button: rgba(255, 255, 255, 0.3); - disabled-text: rgba(255, 255, 255, 0.3); - hint-text: rgba(255, 255, 255, 0.3); - secondary-text: rgba(255, 255, 255, 0.7); - icon: white; - icons: white; - text: white; - slider-min: white; - slider-off: rgba(255, 255, 255, 0.3); - slider-off-active: rgba(255, 255, 255, 0.3); -} diff --git a/package.json b/package.json index d2358db56..be2d7c602 100644 --- a/package.json +++ b/package.json @@ -25,9 +25,9 @@ "@angular/platform-browser": "^20.3.7", "@angular/router": "^20.3.7", "@apollo/client": "^3.13.7", - "@ecodev/fab-speed-dial": "^20.0.0", - "@ecodev/natural": "^65.0.5", - "@ecodev/natural-editor": "^65.0.5", + "@ecodev/fab-speed-dial": "^21.0.0", + "@ecodev/natural": "^66.0.14", + "@ecodev/natural-editor": "^66.0.14", "@ecodev/natural-layout": "^2.0.2", "@graphql-codegen/cli": "^6.0.0", "@graphql-codegen/typescript-apollo-angular": "^4.0.1", @@ -41,7 +41,7 @@ "rxjs": "~7.8.2", "striptags": "^4.0.0-alpha.4", "tslib": "^2.8.1", - "type-fest": "^4.41.0", + "type-fest": "^5.3.1", "zone.js": "~0.15.1" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 0ffc0e20c..ac935374b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -901,17 +901,17 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@ecodev/fab-speed-dial@^20.0.0": - version "20.0.0" - resolved "https://registry.yarnpkg.com/@ecodev/fab-speed-dial/-/fab-speed-dial-20.0.0.tgz#b6506b11c1086df4e74e3919119aea47425f79d0" - integrity sha512-zVgUnA5Ze1Rktf1sq+CDVPT82bjFWgykxSHPrCQH3mKenL6A//5hQ5lW6bhCf++huk6cnYN/9EIunjmhPGdgcQ== +"@ecodev/fab-speed-dial@^21.0.0": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@ecodev/fab-speed-dial/-/fab-speed-dial-21.0.0.tgz#606279347e4dbf76b01cf675de7d89d6a9e98dce" + integrity sha512-YsykrjTPCCPz39Okw/7tJipi4/G8UTciLaFKUwg1HkDILZ1irRx1KKQ4q+Hpdad/7GAbdAyzoi1O/whtWnXbcQ== dependencies: tslib "^2.8.1" -"@ecodev/natural-editor@^65.0.5": - version "65.0.5" - resolved "https://registry.yarnpkg.com/@ecodev/natural-editor/-/natural-editor-65.0.5.tgz#849935db14e59c3da3087f7a7d962a46af67b288" - integrity sha512-IUDQ2ZiyQKZfqj2rA8r8nICzhhOGbMgbYoQ2POkfzpM3EaI0ZHoXIUsiHwCDE2CnkXvCUMgRzfarGRxYSe74xg== +"@ecodev/natural-editor@^66.0.14": + version "66.0.14" + resolved "https://registry.yarnpkg.com/@ecodev/natural-editor/-/natural-editor-66.0.14.tgz#a769cc4a59cd8a1b002c932bc0bc78d4d6ec3581" + integrity sha512-itZ7IYgRuPKLmBz5ex5s7euTD1s2pWVmd1coH0p2lqPW5ydvtHPQXWFthBdYU2m2LgDTdVAVddmL4FpFW8kMQw== dependencies: prosemirror-commands "^1.5.2" prosemirror-dropcursor "^1.8.1" @@ -933,10 +933,10 @@ resolved "https://registry.yarnpkg.com/@ecodev/natural-layout/-/natural-layout-2.0.2.tgz#e2c64c2ddb3c60793a39236b52624fde323e610a" integrity sha512-BV75kFQmpfuSBNQ1jyKu+IdGkFTMESjPrtKrEyc3MqcmVhV5IiYU0LXTaghLZozuZgCT9HfMOnEsh05aS2j9uQ== -"@ecodev/natural@^65.0.5": - version "65.0.5" - resolved "https://registry.yarnpkg.com/@ecodev/natural/-/natural-65.0.5.tgz#60a9b4d11d8be18cbb06355fa46a59eac820a58e" - integrity sha512-WbUNm57k+h96RndoB417ervh0N2FkQMTI3EFagDJgqC4U5nx5/T2v9SgJJhVqiVlMzSaP+Ne5riWpi/Z9pIsrw== +"@ecodev/natural@^66.0.14": + version "66.0.14" + resolved "https://registry.yarnpkg.com/@ecodev/natural/-/natural-66.0.14.tgz#f521cfe3fc7dea3fecda91ce8e8f1c732293590c" + integrity sha512-U6CPN4538lQSnAs0PVutOwL1oYSUdgVpLf+/imTJk++xyid6/19rL2I9N+8K31jCeLVXHaZFYfm6Qk/gCUgVxg== dependencies: extract-files "^13.0.0" tslib "^2.8.1" @@ -6869,6 +6869,11 @@ sync-fetch@0.6.0-2: timeout-signal "^2.0.0" whatwg-mimetype "^4.0.0" +tagged-tag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tagged-tag/-/tagged-tag-1.0.0.tgz#a0b5917c2864cba54841495abfa3f6b13edcf4d6" + integrity sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng== + tar@^6.1.11: version "6.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" @@ -6996,10 +7001,12 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^4.41.0: - version "4.41.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" - integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== +type-fest@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-5.3.1.tgz#251b8d0a813c1dbccf1f9450ba5adcdf7072adc2" + integrity sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg== + dependencies: + tagged-tag "^1.0.0" type-is@^2.0.0, type-is@^2.0.1: version "2.0.1"