diff --git a/alfa-client/apps/info-e2e/.eslintrc.json b/alfa-client/apps/info-e2e/.eslintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..696cb8b12127425419f6d2809c5f15a5963d86de --- /dev/null +++ b/alfa-client/apps/info-e2e/.eslintrc.json @@ -0,0 +1,10 @@ +{ + "extends": ["plugin:cypress/recommended", "../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/alfa-client/apps/info-e2e/cypress.config.ts b/alfa-client/apps/info-e2e/cypress.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..7df58bdcfa071c45e23c30e751581287aaacd2e8 --- /dev/null +++ b/alfa-client/apps/info-e2e/cypress.config.ts @@ -0,0 +1,7 @@ +import { nxE2EPreset } from '@nx/cypress/plugins/cypress-preset'; + +import { defineConfig } from 'cypress'; + +export default defineConfig({ + e2e: { ...nxE2EPreset(__filename, { cypressDir: 'src' }), baseUrl: 'http://localhost:4200' }, +}); diff --git a/alfa-client/apps/info-e2e/project.json b/alfa-client/apps/info-e2e/project.json new file mode 100644 index 0000000000000000000000000000000000000000..2582290b0a800dcaef7e9bcdd3f0b218414656f8 --- /dev/null +++ b/alfa-client/apps/info-e2e/project.json @@ -0,0 +1,29 @@ +{ + "name": "info-e2e", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "sourceRoot": "apps/info-e2e/src", + "tags": [], + "implicitDependencies": ["info"], + "targets": { + "e2e": { + "executor": "@nx/cypress:cypress", + "options": { + "cypressConfig": "apps/info-e2e/cypress.config.ts", + "testingType": "e2e", + "devServerTarget": "info:serve:development" + }, + "configurations": { + "production": { + "devServerTarget": "info:serve:production" + }, + "ci": { + "devServerTarget": "info:serve-static" + } + } + }, + "lint": { + "executor": "@nx/eslint:lint" + } + } +} diff --git a/alfa-client/apps/info-e2e/src/e2e/app.cy.ts b/alfa-client/apps/info-e2e/src/e2e/app.cy.ts new file mode 100644 index 0000000000000000000000000000000000000000..904740f4a976253f4bcb00eb67bfda320a5d436f --- /dev/null +++ b/alfa-client/apps/info-e2e/src/e2e/app.cy.ts @@ -0,0 +1,13 @@ +import { getGreeting } from '../support/app.po'; + +describe('info-e2e', () => { + beforeEach(() => cy.visit('/')); + + it('should display welcome message', () => { + // Custom command example, see `../support/commands.ts` file + cy.login('my-email@something.com', 'myPassword'); + + // Function helper example, see `../support/app.po.ts` file + getGreeting().contains(/Welcome/); + }); +}); diff --git a/alfa-client/apps/info-e2e/src/fixtures/example.json b/alfa-client/apps/info-e2e/src/fixtures/example.json new file mode 100644 index 0000000000000000000000000000000000000000..02e4254378e9785f013be7cc8d94a8229dcbcbb7 --- /dev/null +++ b/alfa-client/apps/info-e2e/src/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} diff --git a/alfa-client/apps/info-e2e/src/support/app.po.ts b/alfa-client/apps/info-e2e/src/support/app.po.ts new file mode 100644 index 0000000000000000000000000000000000000000..32934246969c2ecb827ac05677785933a707a54d --- /dev/null +++ b/alfa-client/apps/info-e2e/src/support/app.po.ts @@ -0,0 +1 @@ +export const getGreeting = () => cy.get('h1'); diff --git a/alfa-client/apps/info-e2e/src/support/commands.ts b/alfa-client/apps/info-e2e/src/support/commands.ts new file mode 100644 index 0000000000000000000000000000000000000000..c421a3c47c1aa0f82f17f545268ec5965e6b5a79 --- /dev/null +++ b/alfa-client/apps/info-e2e/src/support/commands.ts @@ -0,0 +1,35 @@ +/// <reference types="cypress" /> + +// *********************************************** +// This example commands.ts shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** + +// eslint-disable-next-line @typescript-eslint/no-namespace +declare namespace Cypress { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + interface Chainable<Subject> { + login(email: string, password: string): void; + } +} + +// -- This is a parent command -- +Cypress.Commands.add('login', (email, password) => { + console.log('Custom command example: Login', email, password); +}); +// +// -- This is a child command -- +// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) diff --git a/alfa-client/apps/info-e2e/src/support/e2e.ts b/alfa-client/apps/info-e2e/src/support/e2e.ts new file mode 100644 index 0000000000000000000000000000000000000000..1c1a9e772baea367e08b1c7b15e65b3fede3d17f --- /dev/null +++ b/alfa-client/apps/info-e2e/src/support/e2e.ts @@ -0,0 +1,17 @@ +// *********************************************************** +// This example support/e2e.ts is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.ts using ES2015 syntax: +import './commands'; diff --git a/alfa-client/apps/info-e2e/tsconfig.json b/alfa-client/apps/info-e2e/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..e28de1d7913d8d554fee7f55bdf42f0bd4125191 --- /dev/null +++ b/alfa-client/apps/info-e2e/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "allowJs": true, + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["cypress", "node"], + "sourceMap": false, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["**/*.ts", "**/*.js", "cypress.config.ts", "**/*.cy.ts", "**/*.cy.js", "**/*.d.ts"] +} diff --git a/alfa-client/apps/info/.eslintrc.json b/alfa-client/apps/info/.eslintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..437641b9a11a424b46bcf2606b683998a3a6bba1 --- /dev/null +++ b/alfa-client/apps/info/.eslintrc.json @@ -0,0 +1,33 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts"], + "extends": ["plugin:@nx/angular", "plugin:@angular-eslint/template/process-inline-templates"], + "rules": { + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "app", + "style": "camelCase" + } + ], + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "app", + "style": "kebab-case" + } + ] + } + }, + { + "files": ["*.html"], + "extends": ["plugin:@nx/angular-template"], + "rules": {} + } + ] +} diff --git a/alfa-client/apps/info/jest.config.ts b/alfa-client/apps/info/jest.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..ae2366cf2ae77ab38f66c709e392a383f2e42aae --- /dev/null +++ b/alfa-client/apps/info/jest.config.ts @@ -0,0 +1,22 @@ +/* eslint-disable */ +export default { + displayName: 'info', + preset: '../../jest.preset.js', + setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'], + coverageDirectory: '../../coverage/apps/info', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '<rootDir>/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/alfa-client/apps/info/project.json b/alfa-client/apps/info/project.json new file mode 100644 index 0000000000000000000000000000000000000000..2a2d8535964e81fc5bf91c57a6a035ef83c51d1c --- /dev/null +++ b/alfa-client/apps/info/project.json @@ -0,0 +1,95 @@ +{ + "name": "info", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "prefix": "app", + "sourceRoot": "apps/info/src", + "tags": [], + "targets": { + "build": { + "executor": "@angular-devkit/build-angular:browser", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/apps/info", + "index": "apps/info/src/index.html", + "main": "apps/info/src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "apps/info/tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": ["apps/info/src/favicon.ico", "apps/info/src/assets"], + "styles": ["apps/info/src/styles.scss"], + "scripts": [], + "stylePreprocessorOptions": { + "includePaths": [ + "apps/alfa/src/styles/abstracts", + "node_modules/@angular", + "node_modules/include-media", + "node_modules/typeface-roboto" + ] + } + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "executor": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "info:build:production" + }, + "development": { + "buildTarget": "info:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "executor": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "info:build" + } + }, + "lint": { + "executor": "@nx/eslint:lint" + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "apps/info/jest.config.ts" + } + }, + "serve-static": { + "executor": "@nx/web:file-server", + "options": { + "buildTarget": "info:build", + "port": 4200, + "spa": true + } + } + } +} diff --git a/alfa-client/apps/info/src/app/app.component.html b/alfa-client/apps/info/src/app/app.component.html new file mode 100644 index 0000000000000000000000000000000000000000..8a9193807993f22bc8471d0b53b39f46fd383aa3 --- /dev/null +++ b/alfa-client/apps/info/src/app/app.component.html @@ -0,0 +1,115 @@ +<header + class="flex h-16 items-center justify-between border-b border-b-ozggray-300 bg-white px-9 py-2" + data-test-id="admin-header" +> + <a + class="rounded border-2 border-transparent p-1 outline-2 outline-offset-2 hover:border-primary focus-visible:border-gray-200 focus-visible:outline-focus" + aria-label="OZG-Cloud Administration" + routerLink="/" + data-test-id="logo-link" + > + LOGO + </a> +</header> +<div class="relative flex w-full flex-auto justify-center"> + <main class="flex-auto bg-background-50 p-6"> + <div class="ozg-prose prose"> + <h1>Erklärung zur Barrierefreiheit</h1> + <p> + Die Staatskanzlei des Ministerpräsidenten ist bemüht, ihre Anwendung im Einklang mit § 11 Absatz 1 + Landesbehindertengleichstellungsgesetz (LBGG) sowie den Anforderungen der Barrierefreiheit gemäß § 13 Absatz 3 LBGG + barrierefrei zugänglich zu machen. + </p> + <p>Diese Erklärung zur Barrierefreiheit gilt für:</p> + <ul> + <li> + <a href="https://se.kop.schleswig-holstein.de" target="_blank">https://se.kop.schleswig-holstein.de</a> + </li> + <li> + <a href="https://luebeck.kop.schleswig-holstein.de" target="_blank">https://luebeck.kop.schleswig-holstein.de</a> + </li> + <li> + <a href="https://kiel.kop.schleswig-holstein.de" target="_blank">https://kiel.kop.schleswig-holstein.de</a> + </li> + </ul> + <h2>Stand der Vereinbarkeit mit den Anforderungen</h2> + <p>Diese Website/mobile Anwendung ist teilweise mit § 13 Absatz 3 LBGG vereinbar.</p> + <h2>Nicht barrierefreie Inhalte</h2> + <p>Die nachstehend aufgeführten Inhalte sind unvereinbar mit § 13 Absatz 3 LBGG und somit nicht barrierefrei:</p> + <ul> + <li>Erläuterungen zu den Inhalten und der Navigation dieser Anwendung in leichter Sprache sind nicht vorhanden.</li> + <li> + Responsive Darstellung ist nicht vorhanden, weshalb Inhalte nur bedingt verlustfrei vergrößerbar sind oder umbrechen. + </li> + <li>Gliedernde Überschriften und Bereiche sind nicht umfassend vorhanden.</li> + <li>Benutzerdefinierte Einstellungen (Farbauswahl und Schriftgröße) werden nicht umfänglich angewendet.</li> + <li>Die Einstellungsmöglichkeiten im oberen Navigationsmenü können nicht per Tastatursteuerung erreicht werden.</li> + <li>Die Vorschläge der Vorgangssuche sind nicht per Screenreader wahrnehmbar.</li> + <li>Vereinzelt treten Texte mit zu geringem Kontrast zum Hintergrund auf.</li> + <li>Vereinzelt ist der Tastaturfokus nur schwer wahrnehmbar. Bei Datumspickern ist keine Fokushervorhebung vorhanden.</li> + <li> + Es fehlen Statusmeldungen, die Screenreader-Nutzende über Änderungen der Suchergebnisse oder über Änderungen von + Anträgen informieren. + </li> + <li> + Der als PDF zur Verfügung gestellte Benutzerleitfaden, sowie die als PDF abgespeicherten Nachrichten der Anwendung + entsprechen nicht dem PDF/UA-Standard. + </li> + </ul> + <p> + Die Anwendung befindet sich derzeit noch in der Entwicklung. An bestehenden und bekannten Barrieren wird gearbeitet, um + eine Barrierefreiheit gemäß § 13 Absatz 3 LBGG gewährleisten zu können. + </p> + <h2>Erstellung dieser Erklärung zur Barrierefreiheit</h2> + <p>Diese Erklärung wurde am 15.07.2024 erstellt.</p> + <p> + Die Aussagen bezüglich der Vereinbarkeit mit den Barrierefreiheitsanforderungen in dieser Erklärung beruhen auf einem + Prüfbericht von Dataport vom 08.04.2024 und einer Selbstbewertung. + </p> + <p>Die Erklärung wurde zuletzt am 15.07.2024 aktualisiert.</p> + <h2>Feedback und Kontaktangaben</h2> + <p> + Sie möchten uns bestehende Barrieren mitteilen oder Informationen zur Umsetzung der Barrierefreiheit erfragen? Für Ihr + Feedback sowie alle weiteren Informationen sprechen Sie unsere Verantwortlichen Kontaktpersonen unter + <a href="mailto:digitalisierung@stk.landsh.de">digitalisierung@stk.landsh.de</a> an. + </p> + <h2>Beschwerdeverfahren</h2> + <p> + Wenn auch nach Ihrem Feedback an den oben genannten Kontakt keine zufriedenstellende Lösung gefunden wurde, können Sie + sich an die Beschwerdestelle des Landes Schleswig-Holstein gemäß Landesbehindertengleichstellungsgesetz (LBGG) wenden. Die + Beschwerdestelle hat die Aufgabe, Konflikte zum Thema Barrierefreiheit zwischen Menschen mit Behinderungen und + öffentlichen Stellen in Schleswig-Holstein zu lösen. Dabei geht es nicht darum, Gewinner oder Verlierer zu finden. + Vielmehr ist es das Ziel, mit Hilfe der Beschwerdestelle gemeinsam und außergerichtlich eine Lösung für ein Problem zu + finden. Das Beschwerdeverfahren ist kostenlos. Es muss kein Rechtsbeistand eingeschaltet werden. + </p> + <p> + Auf der + <a href="https://www.landtag.ltsh.de/beauftragte/beschwerdestelle-fuer-barrieren/" target="_blank" + >Internetseite der Beschwerdestelle</a + > + finden Sie alle Informationen zum Beschwerdeverfahren. Dort können Sie nachlesen, wie ein Beschwerdeverfahren abläuft. + </p> + <p>Sie erreichen die Beschwerdestelle unter folgender Adresse:</p> + <p>Beschwerdestelle nach dem Behindertengleichstellungsgesetz bei der Landesbeauftragten für Menschen mit Behinderung</p> + <p>Büroanschrift: Karolinenweg 1 24105 Kiel</p> + <p>Postanschrift: Postfach 7121 24171 Kiel</p> + <p>Telefon: +49 431 988 1620</p> + <p> + E-Mail: + <a href="mailto:bbit@landtag.ltsh.de">bbit@landtag.ltsh.de</a> + </p> + </div> + + <footer class="ozg-prose"> + <nav> + <ul class="flex flex-row flex-wrap justify-center gap-9 pt-14"> + <li><a routerLink="/barrierefreiheit">Barrierefreiheit</a></li> + <li><a routerLink="/datenschutzerklarrung">Datenschutzerklärung</a></li> + <li><a routerLink="/impressum">Impressum</a></li> + </ul> + </nav> + </footer> + + <router-outlet></router-outlet> + </main> +</div> diff --git a/alfa-client/apps/info/src/app/app.component.scss b/alfa-client/apps/info/src/app/app.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/alfa-client/apps/info/src/app/app.component.spec.ts b/alfa-client/apps/info/src/app/app.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..0f49c5d7e876c27aeb99adf35200f2dfc2fd2e03 --- /dev/null +++ b/alfa-client/apps/info/src/app/app.component.spec.ts @@ -0,0 +1,25 @@ +import { TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; +import { NxWelcomeComponent } from './nx-welcome.component'; + +describe('AppComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AppComponent, NxWelcomeComponent, RouterTestingModule], + }).compileComponents(); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('h1')?.textContent).toContain('Welcome info'); + }); + + it(`should have as title 'info'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual('info'); + }); +}); diff --git a/alfa-client/apps/info/src/app/app.component.ts b/alfa-client/apps/info/src/app/app.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..0b1ed01b56d8435808e3c52fba146b1dc807a278 --- /dev/null +++ b/alfa-client/apps/info/src/app/app.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +@Component({ + standalone: true, + imports: [RouterModule], + selector: 'app-root', + templateUrl: './app.component.html', + styleUrl: './app.component.scss', +}) +export class AppComponent { + title = 'info'; +} diff --git a/alfa-client/apps/info/src/app/app.config.ts b/alfa-client/apps/info/src/app/app.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..ed404941f7b7e0784f92f0bc82c7cab3b2914047 --- /dev/null +++ b/alfa-client/apps/info/src/app/app.config.ts @@ -0,0 +1,7 @@ +import { ApplicationConfig } from '@angular/core'; +import { provideRouter } from '@angular/router'; +import { appRoutes } from './app.routes'; + +export const appConfig: ApplicationConfig = { + providers: [provideRouter(appRoutes)], +}; diff --git a/alfa-client/apps/info/src/app/app.routes.ts b/alfa-client/apps/info/src/app/app.routes.ts new file mode 100644 index 0000000000000000000000000000000000000000..8762dfe2c6510c01425b35c6cf76371cc0b332c6 --- /dev/null +++ b/alfa-client/apps/info/src/app/app.routes.ts @@ -0,0 +1,3 @@ +import { Route } from '@angular/router'; + +export const appRoutes: Route[] = []; diff --git a/alfa-client/apps/info/src/assets/.gitkeep b/alfa-client/apps/info/src/assets/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/alfa-client/apps/info/src/favicon.ico b/alfa-client/apps/info/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..317ebcb2336e0833a22dddf0ab287849f26fda57 Binary files /dev/null and b/alfa-client/apps/info/src/favicon.ico differ diff --git a/alfa-client/apps/info/src/index.html b/alfa-client/apps/info/src/index.html new file mode 100644 index 0000000000000000000000000000000000000000..1c98446a114b23800f609cdce62aee5da0d11a49 --- /dev/null +++ b/alfa-client/apps/info/src/index.html @@ -0,0 +1,13 @@ +<!doctype html> +<html lang="en" class="h-full bg-white antialiased"> + <head> + <meta charset="utf-8" /> + <title>Info</title> + <base href="/" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <link rel="icon" type="image/x-icon" href="favicon.ico" /> + </head> + <body class="flex min-h-full bg-white text-black"> + <app-root class="flex w-full flex-col"></app-root> + </body> +</html> diff --git a/alfa-client/apps/info/src/main.ts b/alfa-client/apps/info/src/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..7205a13df94cc9e1949c07ac16454fc4faf8b564 --- /dev/null +++ b/alfa-client/apps/info/src/main.ts @@ -0,0 +1,5 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { AppComponent } from './app/app.component'; +import { appConfig } from './app/app.config'; + +bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err)); diff --git a/alfa-client/apps/info/src/styles.scss b/alfa-client/apps/info/src/styles.scss new file mode 100644 index 0000000000000000000000000000000000000000..e8b9bb8f36b34dd294d70f707c3ba23965dbf339 --- /dev/null +++ b/alfa-client/apps/info/src/styles.scss @@ -0,0 +1,11 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@import 'libs/design-system/src/lib/tailwind-preset/root.css'; + +@layer components { + .ozg-prose a { + @apply text-primary no-underline hover:text-primary-hover hover:underline focus-visible:rounded-md focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus; + } +} diff --git a/alfa-client/apps/info/src/test-setup.ts b/alfa-client/apps/info/src/test-setup.ts new file mode 100644 index 0000000000000000000000000000000000000000..ab1eeeb335d7890571dda105cf8bc1ea77086866 --- /dev/null +++ b/alfa-client/apps/info/src/test-setup.ts @@ -0,0 +1,8 @@ +// @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment +globalThis.ngJest = { + testEnvironmentOptions: { + errorOnUnknownElements: true, + errorOnUnknownProperties: true, + }, +}; +import 'jest-preset-angular/setup-jest'; diff --git a/alfa-client/apps/info/tailwind.config.js b/alfa-client/apps/info/tailwind.config.js new file mode 100644 index 0000000000000000000000000000000000000000..9fd1192933dc7dfc4be0b96c7301380e7bc6a1f7 --- /dev/null +++ b/alfa-client/apps/info/tailwind.config.js @@ -0,0 +1,16 @@ +/* eslint-env node */ +/* eslint @typescript-eslint/no-var-requires: "off" */ + +const { createGlobPatternsForDependencies } = require('@nx/angular/tailwind'); +const { join } = require('path'); +const sharedTailwindConfig = require('../../libs/design-system/src/lib/tailwind-preset/tailwind.config.js'); + +/** @type {import('tailwindcss').Config} */ +module.exports = { + presets: [sharedTailwindConfig], + content: [join(__dirname, 'src/**/!(*.stories|*.spec).{ts,html}'), ...createGlobPatternsForDependencies(__dirname)], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/alfa-client/apps/info/tsconfig.app.json b/alfa-client/apps/info/tsconfig.app.json new file mode 100644 index 0000000000000000000000000000000000000000..fff4a41d444a486d4cf163be19f8601e0510c270 --- /dev/null +++ b/alfa-client/apps/info/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts"], + "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] +} diff --git a/alfa-client/apps/info/tsconfig.editor.json b/alfa-client/apps/info/tsconfig.editor.json new file mode 100644 index 0000000000000000000000000000000000000000..a8ac182c08dec53b3647f810cd2c47a51ace51c9 --- /dev/null +++ b/alfa-client/apps/info/tsconfig.editor.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*.ts"], + "compilerOptions": {}, + "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] +} diff --git a/alfa-client/apps/info/tsconfig.json b/alfa-client/apps/info/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..de18e88adcda3cbae746e2c6cdf0625592966cd9 --- /dev/null +++ b/alfa-client/apps/info/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "target": "es2022", + "useDefineForClassFields": false, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.editor.json" + }, + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ], + "extends": "../../tsconfig.base.json", + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/alfa-client/apps/info/tsconfig.spec.json b/alfa-client/apps/info/tsconfig.spec.json new file mode 100644 index 0000000000000000000000000000000000000000..7870b7c011681fb77d6114001f44d3eeca69975b --- /dev/null +++ b/alfa-client/apps/info/tsconfig.spec.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "target": "es2016", + "types": ["jest", "node"] + }, + "files": ["src/test-setup.ts"], + "include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"] +} diff --git a/alfa-client/libs/design-system/src/lib/tailwind-preset/root.css b/alfa-client/libs/design-system/src/lib/tailwind-preset/root.css index 22790260b6e1dfc572920df9f126930e36fd683b..00d1a2d0676bfb305fe215e2b379a0a96ee38647 100644 --- a/alfa-client/libs/design-system/src/lib/tailwind-preset/root.css +++ b/alfa-client/libs/design-system/src/lib/tailwind-preset/root.css @@ -3,6 +3,13 @@ @tailwind utilities; @import '~@angular/cdk/overlay-prebuilt.css'; +@import 'typeface-roboto/index.css'; + +@layer base { + html { + font-family: 'Roboto', 'Helvetica Neue', sans-serif; + } +} :root { --warning: 38 92% 50%; diff --git a/alfa-client/libs/design-system/src/lib/tailwind-preset/tailwind.config.js b/alfa-client/libs/design-system/src/lib/tailwind-preset/tailwind.config.js index 88f03501ec468c7aea37ab033a35ce86c7d57280..68734c4d0c02b31874d30b3a030a0892e251476e 100644 --- a/alfa-client/libs/design-system/src/lib/tailwind-preset/tailwind.config.js +++ b/alfa-client/libs/design-system/src/lib/tailwind-preset/tailwind.config.js @@ -130,5 +130,5 @@ module.exports = { }, }, }, - plugins: [], + plugins: [require('@tailwindcss/typography')], }; diff --git a/alfa-client/nx.json b/alfa-client/nx.json index d5846d9ce54ec894bf7601a95e7f626e1bfe360b..d4a997871fa8e52b66b2003fbd860e6249437ecb 100644 --- a/alfa-client/nx.json +++ b/alfa-client/nx.json @@ -4,10 +4,10 @@ }, "generators": { "@nx/angular:application": { - "style": "scss", + "e2eTestRunner": "cypress", "linter": "eslint", - "unitTestRunner": "jest", - "e2eTestRunner": "cypress" + "style": "scss", + "unitTestRunner": "jest" }, "@nx/angular:library": { "linter": "eslint", @@ -67,6 +67,11 @@ "@nx/eslint:lint": { "inputs": ["default", "{workspaceRoot}/.eslintrc.json"], "cache": true + }, + "@angular-devkit/build-angular:browser": { + "cache": true, + "dependsOn": ["^build"], + "inputs": ["production", "^production"] } }, "namedInputs": { diff --git a/alfa-client/package-lock.json b/alfa-client/package-lock.json index f5d4ef0b6b33ddad3f5f22615556d5c373121bea..60754866c3fb107583f93192d120458feecf3e2c 100644 --- a/alfa-client/package-lock.json +++ b/alfa-client/package-lock.json @@ -79,6 +79,7 @@ "@swc-node/register": "1.9.1", "@swc/core": "~1.5.7", "@swc/helpers": "~0.5.2", + "@tailwindcss/typography": "^0.5.15", "@testing-library/jest-dom": "6.4.5", "@types/file-saver": "2.0.7", "@types/jest": "29.4.4", @@ -15388,6 +15389,36 @@ "@swc/counter": "^0.1.3" } }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.15", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@tailwindcss/typography/-/typography-0.5.15.tgz", + "integrity": "sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20" + } + }, + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@testing-library/jest-dom": { "version": "6.4.5", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@testing-library/jest-dom/-/jest-dom-6.4.5.tgz", @@ -28163,6 +28194,13 @@ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "license": "MIT" }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -28190,6 +28228,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.isstring": { "version": "4.0.1", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lodash.isstring/-/lodash.isstring-4.0.1.tgz", diff --git a/alfa-client/package.json b/alfa-client/package.json index b081dded54752bbfd6e7ccdd48e8736e41e34d44..c6d61cc487a9253a5164f48b3b5c9340d4cae95e 100644 --- a/alfa-client/package.json +++ b/alfa-client/package.json @@ -7,6 +7,7 @@ "start:admin": "nx run admin:serve --port 4301 --disable-host-check", "start:demo": "nx run demo:serve --port 4500 --disable-host-check", "start:debug": "nx run alfa:serve --port 4300 --disable-host-check --verbose", + "start:info": "nx run info:serve --port 4600 --disable-host-check", "start-for-screenreader": "nx run alfa:serve --host 192.168.178.20 --port 4300 --disable-host-check --verbose", "start:devbe": "nx run alfa:serve --port 4300 --disable-host-check --proxy-config proxy.dev.conf.json --verbose", "build": "nx run alfa:build", @@ -121,6 +122,7 @@ "@swc-node/register": "1.9.1", "@swc/core": "~1.5.7", "@swc/helpers": "~0.5.2", + "@tailwindcss/typography": "^0.5.15", "@testing-library/jest-dom": "6.4.5", "@types/file-saver": "2.0.7", "@types/jest": "29.4.4",