From 06796a0a9d545667c1365e052f551949b6bb7313 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 8 May 2025 12:06:05 +0100 Subject: [PATCH 01/15] Create module element-web-module-banner --- modules/banner/README.md | 45 ++++ modules/banner/element-web/package.json | 29 +++ modules/banner/element-web/src/Banner.tsx | 65 ++++++ modules/banner/element-web/src/Logo.tsx | 39 ++++ modules/banner/element-web/src/Menu.tsx | 207 ++++++++++++++++++ .../element-web/src/Univention/Menu.tsx | 50 +++++ .../src/Univention/SilentLogin.tsx | 41 ++++ .../element-web/src/Univention/navigation.ts | 86 ++++++++ modules/banner/element-web/src/config.ts | 93 ++++++++ modules/banner/element-web/src/index.tsx | 46 ++++ modules/banner/element-web/src/theme.ts | 43 ++++ .../banner/element-web/src/translations.json | 22 ++ .../banner/element-web/tests/banner.spec.ts | 153 +++++++++++++ .../banner/element-web/tests/fixture/app1.png | Bin 0 -> 1588 bytes .../banner/element-web/tests/fixture/app2.png | Bin 0 -> 13818 bytes .../banner/element-web/tests/fixture/logo.svg | 50 +++++ .../element-web/tests/fixture/navigation.json | 44 ++++ .../tests/fixture/silent/index.html | 14 ++ modules/banner/element-web/tsconfig.json | 8 + modules/banner/element-web/vite.config.ts | 45 ++++ modules/opendesk/element-web/package.json | 2 +- 21 files changed, 1081 insertions(+), 1 deletion(-) create mode 100644 modules/banner/README.md create mode 100644 modules/banner/element-web/package.json create mode 100644 modules/banner/element-web/src/Banner.tsx create mode 100644 modules/banner/element-web/src/Logo.tsx create mode 100644 modules/banner/element-web/src/Menu.tsx create mode 100644 modules/banner/element-web/src/Univention/Menu.tsx create mode 100644 modules/banner/element-web/src/Univention/SilentLogin.tsx create mode 100644 modules/banner/element-web/src/Univention/navigation.ts create mode 100644 modules/banner/element-web/src/config.ts create mode 100644 modules/banner/element-web/src/index.tsx create mode 100644 modules/banner/element-web/src/theme.ts create mode 100644 modules/banner/element-web/src/translations.json create mode 100644 modules/banner/element-web/tests/banner.spec.ts create mode 100644 modules/banner/element-web/tests/fixture/app1.png create mode 100644 modules/banner/element-web/tests/fixture/app2.png create mode 100644 modules/banner/element-web/tests/fixture/logo.svg create mode 100644 modules/banner/element-web/tests/fixture/navigation.json create mode 100644 modules/banner/element-web/tests/fixture/silent/index.html create mode 100644 modules/banner/element-web/tsconfig.json create mode 100644 modules/banner/element-web/vite.config.ts diff --git a/modules/banner/README.md b/modules/banner/README.md new file mode 100644 index 0000000000..c62890c417 --- /dev/null +++ b/modules/banner/README.md @@ -0,0 +1,45 @@ +# @element-hq/element-web-module-banner + +Banner module for Element Web. +Allows rendering a top bar with slide out left panel menu. + +Supports the following configuration options: + +| Key | Type | Description | +| ------------- | ------ | ------------------------------------------------------------ | +| logo_url | string | URL to the logo to render in the banner | +| logo_link_url | string | URL to send the user to when clicking the logo in the banner | +| menu | `Menu` | Data to render in the banner menu | + +The `Menu` type is fulfilled by the following discriminated union: + +### Univention menu + +| Key | Type | Description | +| ------- | ------------ | ------------------------------------------------------------------------------------------------------------------------ | +| type | "univention" | The type for this menu config | +| ics_url | string | URL to the UCS Intercom Service, https://docs.software-univention.de/intercom-service/latest/architecture.html#endpoints | + +### Static menu + +| Key | Type | Description | +| ---------- | ---------------- | ------------------------------------------------------------------------- | +| type | "static" | The type for this menu config | +| logo_url | string, optional | URL to the logo to render in the menu, defaults to banner logo if omitted | +| categories | `[]Category` | Categories to render in the menu | + +The `Category` type is fulfilled by the following interface: + +| Key | Type | Description | +| ----- | -------- | -------------------------------- | +| name | string | The name of this category | +| links | `[]Link` | Links to render in this category | + +The `Link` type is fulfilled by the following interface: + +| Key | Type | Description | +| -------- | ---------------- | --------------------------------------- | +| icon_uri | string | URL to the icon to render for this link | +| name | string | The name to render for this link | +| link_url | string | The URL to link to | +| target | string, optional | The `target` to use for this link | diff --git a/modules/banner/element-web/package.json b/modules/banner/element-web/package.json new file mode 100644 index 0000000000..85ac88a46b --- /dev/null +++ b/modules/banner/element-web/package.json @@ -0,0 +1,29 @@ +{ + "name": "@element-hq/element-web-module-banner", + "private": true, + "version": "0.0.0", + "type": "module", + "main": "lib/index.js", + "scripts": { + "prepare": "vite build", + "lint:ts": "tsc --noEmit", + "test": "echo no tests yet" + }, + "devDependencies": { + "@element-hq/element-web-module-api": "^0.2.0", + "@types/node": "^22.10.7", + "@types/react": "^19", + "@vitejs/plugin-react": "^4.3.4", + "react": "^19", + "rollup-plugin-external-globals": "^0.13.0", + "typescript": "^5.7.3", + "vite": "^6.0.11", + "vite-plugin-node-polyfills": "^0.23.0" + }, + "dependencies": { + "@radix-ui/react-dialog": "^1.1.6", + "framer-motion": "^12.4.10", + "styled-components": "^6.1.18", + "zod": "^3.24.2" + } +} diff --git a/modules/banner/element-web/src/Banner.tsx b/modules/banner/element-web/src/Banner.tsx new file mode 100644 index 0000000000..4ad63827ab --- /dev/null +++ b/modules/banner/element-web/src/Banner.tsx @@ -0,0 +1,65 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { type FC } from "react"; +import styled, { ThemeProvider } from "styled-components"; +import { type Api } from "@element-hq/element-web-module-api"; + +import { type ModuleConfig } from "./config"; +import UniventionMenu from "./Univention/Menu"; +import Menu from "./Menu"; +import { theme } from "./theme"; +import Logo from "./Logo.tsx"; + +const Root = styled.nav` + background-color: ${({ theme }) => theme.compound.color.bgCanvasDefault}; + border-bottom: ${({ theme }) => theme.navbar.border}; + height: ${({ theme }) => theme.navbar.height}; + display: grid; + grid-template-columns: ${({ theme }) => `${theme.navbar.triggerWidth} auto`}; + gap: 24px; +`; + +const Main = styled.div` + display: flex; + align-items: center; + grid-column: 2; +`; + +interface Props { + api: Api; + logoUrl: string; + href: string; + menu: ModuleConfig["menu"]; +} + +const Banner: FC = ({ api, logoUrl, href, menu }) => { + let menuJsx; + switch (menu.type) { + case "static": { + menuJsx = ; + break; + } + case "univention": { + menuJsx = ; + break; + } + } + + return ( + + + {menuJsx} +
+ +
+
+
+ ); +}; + +export default Banner; diff --git a/modules/banner/element-web/src/Logo.tsx b/modules/banner/element-web/src/Logo.tsx new file mode 100644 index 0000000000..48840486ca --- /dev/null +++ b/modules/banner/element-web/src/Logo.tsx @@ -0,0 +1,39 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { type FC } from "react"; +import styled from "styled-components"; +import { type Api } from "@element-hq/element-web-module-api"; + +const Anchor = styled.a` + display: flex; +`; + +const Image = styled.img` + height: ${({ theme }) => theme.navbar.logoHeight}; + align-self: center; +`; + +interface Props { + api: Api; + src: string; + href?: string; +} + +const Logo: FC = ({ api, src, href }) => { + const img = {api.i18n.translate("Portal; + + if (!href) return img; + + return ( + + {img} + + ); +}; + +export default Logo; diff --git a/modules/banner/element-web/src/Menu.tsx b/modules/banner/element-web/src/Menu.tsx new file mode 100644 index 0000000000..9ca1763858 --- /dev/null +++ b/modules/banner/element-web/src/Menu.tsx @@ -0,0 +1,207 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { type FC, useState } from "react"; +import { AnimatePresence, motion } from "framer-motion"; +import * as Dialog from "@radix-ui/react-dialog"; +import styled from "styled-components"; + +import { StaticConfig } from "./config"; +import { theme } from "./theme"; +import type { Api } from "@element-hq/element-web-module-api"; +import Logo from "./Logo.tsx"; + +const Sidebar = styled(motion.div)` + padding: 16px 12px; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3); + overflow: auto; + position: fixed; + left: 0; + top: 0; + height: 100%; + width: ${({ theme }): string => theme.menu.width}; + background: white; + border-top-right-radius: 16px; + border-bottom-right-radius: 16px; +`; + +const SidebarHeading = styled.div` + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; +`; + +const Launcher = styled.button` + align-items: center; + border: none; + color: ${({ theme }) => theme.compound.color.textPrimary}; + cursor: pointer; + display: flex; + + &:hover, + &:focus, + &[data-expanded="true"] { + background-color: ${({ theme }): string => theme.color.accent}; + color: #ffffff; + } + + svg { + margin: auto; + } +`; + +const CloseButton = styled.button` + /* Reset button styles */ + appearance: none; + background: none; + border: none; + padding: 0; + margin: 0; + + height: 32px; + width: 32px; + cursor: pointer; + border-radius: 8px; + + &:hover, + &:focus { + background-color: rgba(238, 239, 242, 1); + } +`; + +const CategoryHeading = styled.h2` + font-weight: 700; + font-size: 12px; + color: #203257; + margin-top: 16px; + margin-bottom: 8px; +`; + +const LinkButton = styled.a` + font-size: 14px; + color: #000000; + font-weight: 500; + display: flex; + border-radius: 8px; + padding: 8px; + align-items: center; + + &:hover { + background-color: #eeeff2; + } +`; + +const LinkLogo = styled.img` + height: 24px; + width: 24px; + border-radius: 3px; + border: 1px solid #eeeff2; + margin-right: 8px; + background-color: #ffffff; +`; + +const Overlay = styled(motion.div)` + background-color: rgba(238, 239, 242, 0.5); + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; +`; + +interface Props { + api: Api; + config: StaticConfig; + fallbackLogoUrl: string; +} + +const WIDTH = parseInt(theme.menu.width.slice(0, -2), 10); + +const Category: FC<{ + data: StaticConfig["categories"][number]; +}> = ({ data }) => { + return ( +
+ {data.name} + {data.links.map((link) => ( + + {link.name} + + ))} +
+ ); +}; + +const Menu: FC = ({ api, config, fallbackLogoUrl }) => { + const [open, setOpen] = useState(false); + + return ( + + + + + + + + + + + {open && ( + + + + + + + + + + setOpen(false)} + > + + + + + + + {config.categories.map((category) => ( + + ))} + + + + )} + + + ); +}; + +export default Menu; diff --git a/modules/banner/element-web/src/Univention/Menu.tsx b/modules/banner/element-web/src/Univention/Menu.tsx new file mode 100644 index 0000000000..690b03e94c --- /dev/null +++ b/modules/banner/element-web/src/Univention/Menu.tsx @@ -0,0 +1,50 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { FC, useEffect, useState } from "react"; + +import type { Api } from "@element-hq/element-web-module-api"; +import { StaticConfig, UniventionConfig } from "../config"; +import StaticMenu from "../Menu"; +import { fetchNavigation } from "./navigation"; +import SilentLogin from "./SilentLogin"; + +interface Props { + api: Api; + config: UniventionConfig; + fallbackLogoUrl: string; +} + +const Menu: FC = ({ api, config, fallbackLogoUrl }) => { + const [loggedIn, setLoggedIn] = useState(false); + const [data, setData] = useState(); + const language = api.i18n.language.toLowerCase().startsWith("de") ? "de-DE" : "en"; + + useEffect(() => { + let discard = false; + + setData(null); + fetchNavigation(config.ics_url, language).then((data) => { + if (discard) return; + setData(data); + }); + + return (): void => { + discard = true; + }; + }, [config, language, loggedIn]); + + if (!loggedIn) { + return ; + } + if (data) { + return ; + } + return
; +}; + +export default Menu; diff --git a/modules/banner/element-web/src/Univention/SilentLogin.tsx b/modules/banner/element-web/src/Univention/SilentLogin.tsx new file mode 100644 index 0000000000..06814333c2 --- /dev/null +++ b/modules/banner/element-web/src/Univention/SilentLogin.tsx @@ -0,0 +1,41 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { FC, useEffect } from "react"; +import styled from "styled-components"; + +const HiddenIFrame = styled.iframe` + display: none; +`; + +interface Props { + icsUrl: string; + onLoggedIn(success: boolean): void; +} + +const SilentLogin: FC = ({ onLoggedIn, icsUrl }) => { + const url = new URL("silent", icsUrl); + + useEffect(() => { + const listener = (event: MessageEvent): void => { + if (event.origin === url.origin && typeof event.data === "object" && event.data["loggedIn"] === true) { + onLoggedIn(true); + } + }; + + window.addEventListener("message", listener); + + return (): void => { + window.removeEventListener("message", listener); + }; + }, [onLoggedIn, url.origin]); + + // TODO title? + return ; +}; + +export default SilentLogin; diff --git a/modules/banner/element-web/src/Univention/navigation.ts b/modules/banner/element-web/src/Univention/navigation.ts new file mode 100644 index 0000000000..8443d2951f --- /dev/null +++ b/modules/banner/element-web/src/Univention/navigation.ts @@ -0,0 +1,86 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { z } from "zod"; + +import { StaticConfig } from "../config"; + +/** + * Univention Central Navigation API + * https://docs.software-univention.de/nubus-kubernetes-customization/1.x/en/api/central-navigation.html + */ +export const UniventionCentralNavigation = z.object({ + categories: z.array( + z.object({ + identifier: z.string(), + display_name: z.string(), + entries: z.array( + z.object({ + /** + * A unique identifier for the navigation item. + */ + identifier: z.string(), + /** + * The URL to the icon in SVG format. + */ + icon_url: z.string(), + /** + * The label of the link. + */ + display_name: z.string(), + /** + * The destination URL of the link. + */ + link: z.string(), + /** + * The browsing context in which the browser opens the link. + * Corresponds to the `target` property of `` tags in HTML. + */ + target: z.string(), + /** + * It’s usually empty. + */ + keywords: z.object({}).optional(), + }), + ), + }), + ), +}); + +type UniventionCentralNavigation = z.infer; + +function navigationToConfig(navigation: UniventionCentralNavigation): StaticConfig { + return { + type: "static", + categories: navigation.categories.map((category) => ({ + name: category.display_name, + links: category.entries.map((entry) => ({ + icon_uri: entry.icon_url, + name: entry.display_name, + link_url: entry.link, + target: entry.target, + })), + })), + }; +} + +export async function fetchNavigation(icsUrl: string, language: string): Promise { + const url = new URL("navigation.json", icsUrl); + url.search = `?language=${language}`; + + const response = await fetch(url, { + credentials: "include", + }); + + if (!response.ok) { + throw new Error(`Failed to fetch navigation: ${response.status}`); + } + + const data = await response.json(); + const config = await UniventionCentralNavigation.parseAsync(data); + return navigationToConfig(config); +} diff --git a/modules/banner/element-web/src/config.ts b/modules/banner/element-web/src/config.ts new file mode 100644 index 0000000000..3e5966bbbc --- /dev/null +++ b/modules/banner/element-web/src/config.ts @@ -0,0 +1,93 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { z } from "zod"; + +const StaticConfig = z.object({ + type: z.literal("static"), + + /** + * Alternative logo URL to display in the popover menu. + * Will use the main logo url if omitted. + */ + logo_url: z.string().url().optional(), + + /** + * Categories of links to display in the menu. + */ + categories: z.array( + z.object({ + /** + * The category display name + */ + name: z.string(), + /** + * List of links to display in the category + */ + links: z.array( + z.object({ + /** + * The URL to the icon. + */ + icon_uri: z.string().url(), + /** + * The label of the link. + */ + name: z.string(), + /** + * The destination URL of the link. + */ + link_url: z.string().url(), + /** + * The browsing context in which the browser opens the link. + */ + target: z.string().optional(), + }), + ), + }), + ), +}); + +export type StaticConfig = z.infer; + +const UniventionConfig = z.object({ + type: z.literal("univention"), + + /** + * Base URL to an Intercom Service + * https://docs.software-univention.de/intercom-service/latest/architecture.html#endpoints + */ + ics_url: z.string().url(), +}); + +export type UniventionConfig = z.infer; + +export const ModuleConfig = z.object({ + /** + * The URL of the portal logo.svg file. + * @example `https://example.com/logo.svg` + */ + logo_url: z.string().url(), + + /** + * The URL of the portal. + * @example `https://example.com` + */ + logo_link_url: z.string().url(), + + menu: z.discriminatedUnion("type", [StaticConfig, UniventionConfig]), +}); + +export type ModuleConfig = z.infer; + +export const CONFIG_KEY = "io.element.element-web-modules.banner"; + +declare module "@element-hq/element-web-module-api" { + export interface Config { + [CONFIG_KEY]: ModuleConfig; + } +} diff --git a/modules/banner/element-web/src/index.tsx b/modules/banner/element-web/src/index.tsx new file mode 100644 index 0000000000..9eeb972671 --- /dev/null +++ b/modules/banner/element-web/src/index.tsx @@ -0,0 +1,46 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import type { Module, Api, ModuleFactory } from "@element-hq/element-web-module-api"; +import Translations from "./translations.json"; +import { ModuleConfig, CONFIG_KEY } from "./config"; +import Banner from "./Banner"; +import { name as ModuleName } from "../package.json"; + +class TopBarModule implements Module { + public static readonly moduleApiVersion = "^0.2.0"; + + private config?: ModuleConfig; + + public constructor(private api: Api) {} + + public async load(): Promise { + this.api.i18n.register(Translations); + + try { + this.config = ModuleConfig.parse(this.api.config.get(CONFIG_KEY)); + } catch (e) { + console.error("Failed to init module", e); + throw new Error(`Errors in module configuration for "${ModuleName}"`); + } + + const div = document.createElement("div"); + this.api.rootNode.before(div); + + const root = this.api.createRoot(div); + root.render( + , + ); + } +} + +export default TopBarModule satisfies ModuleFactory; diff --git a/modules/banner/element-web/src/theme.ts b/modules/banner/element-web/src/theme.ts new file mode 100644 index 0000000000..4eec071127 --- /dev/null +++ b/modules/banner/element-web/src/theme.ts @@ -0,0 +1,43 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { DefaultTheme } from "styled-components"; + +const bgCanvasDefault = "var(--cpd-color-bg-canvas-default)"; +const textActionAccent = "var(--cpd-color-text-action-accent)"; +const textPrimary = "var(--cpd-color-text-primary)"; +const iconOnSolidPrimary = "var(--cpd-color-icon-on-solid-primary)"; + +const bodyMdSemibold = "var(--cpd-font-body-md-semibold)"; + +export const theme: DefaultTheme = { + compound: { + color: { + bgCanvasDefault, + textActionAccent, + textPrimary, + iconOnSolidPrimary, + }, + font: { + bodyMdSemibold, + }, + }, + color: { + accent: "#571EFA", // primary/700 TODO + }, + navbar: { + border: "1px solid #D3D7DE", // TODO + boxShadow: "4px 4px 12px 0 rgba(118, 131, 156, 0.6)", + height: "60px", + triggerWidth: "68px", + logoHeight: "34px", + }, + menu: { + // TODO + width: "235px", + }, +}; diff --git a/modules/banner/element-web/src/translations.json b/modules/banner/element-web/src/translations.json new file mode 100644 index 0000000000..a177686956 --- /dev/null +++ b/modules/banner/element-web/src/translations.json @@ -0,0 +1,22 @@ +{ + "Portal logo": { + "en": "Portal logo", + "de": "Portal Logo" + }, + "Menu": { + "en": "Menu", + "de": "Menü" + }, + "Show menu": { + "en": "Show menu", + "de": "Menü anzeigen" + }, + "Close menu": { + "en": "Close menu", + "de": "Menü schließen" + }, + "Show portal": { + "en": "Show portal", + "de": "Portal anzeigen" + } +} diff --git a/modules/banner/element-web/tests/banner.spec.ts b/modules/banner/element-web/tests/banner.spec.ts new file mode 100644 index 0000000000..7637b688ad --- /dev/null +++ b/modules/banner/element-web/tests/banner.spec.ts @@ -0,0 +1,153 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { test, expect } from "../../../../playwright/element-web-test.ts"; +import { ModuleConfig } from "../src/config.ts"; + +test.describe("Banner", () => { + test.use({ + displayName: "Timmy", + page: async ({ context, page, moduleDir }, use) => { + for (const path of ["logo.svg", "app1.png", "app2.png"]) { + await context.route(`/${path}*`, async (route) => { + await route.fulfill({ path: `${moduleDir}/tests/fixture/${path}` }); + }); + } + await context.route("http://localhost:8080/ics/navigation.json*", async (route) => { + await route.fulfill({ + path: `${moduleDir}/tests/fixture/navigation.json`, + contentType: "application/json", + }); + }); + await context.route("http://localhost:8080/ics/silent", async (route) => { + await route.fulfill({ path: `${moduleDir}/tests/fixture/silent/index.html`, contentType: "text/html" }); + }); + + await page.goto("/"); + await use(page); + }, + }); + + test("should error if config is missing", { tag: ["@screenshot"] }, async ({ page }) => { + await expect(page.getByText("Your Element is misconfigured")).toBeVisible(); + // We don't take a screenshot as we don't want to assert Element's styling, only our own + }); + + const configs: ModuleConfig[] = [ + { + logo_url: "http://localhost:8080/logo.svg", + logo_link_url: "https://example.com/portal", + menu: { + type: "static", + categories: [ + { + name: "Applications", + links: [ + { + icon_uri: "http://localhost:8080/app1.png", + name: "App 1", + link_url: "https://example.com/app1", + target: "app1", + }, + { + icon_uri: "http://localhost:8080/app2.png", + name: "Riot", + link_url: "https://riot.im/app", + target: "riot-im", + }, + ], + }, + { + name: "Links", + links: [ + { + icon_uri: "http://localhost:8080/app1.png", + name: "Link", + link_url: "https://example.com/link1", + }, + ], + }, + ], + }, + }, + { + logo_url: "http://localhost:8080/logo.svg", + logo_link_url: "https://example.com/portal", + menu: { + type: "univention", + ics_url: "http://localhost:8080/ics/", + }, + }, + ]; + + for (const config of configs) { + const type = config.menu.type; + + test.describe(`${type} config`, () => { + test.use({ + config: { + "io.element.element-web-modules.banner": config, + }, + }); + + test("should render", { tag: ["@screenshot"] }, async ({ page, axe }) => { + await expect(page.getByRole("heading", { name: "Welcome to Element!" })).toBeVisible(); + await expect(page.getByLabel("Show portal")).toHaveAttribute("href", "https://example.com/portal"); + + const nav = page.locator("nav"); + if (type === "univention") { + await expect(nav).toMatchScreenshot(`${type}_nav_loading.png`); + // The stub silent html doesn't seem to work in Playwright so send the postMessage manually + await page.evaluate(() => { + window.postMessage({ + loggedIn: true, + }); + }); + } + + const trigger = page.getByLabel("Show menu"); + await expect(trigger).toBeVisible(); + + // Assert the banner looks as we expect + await expect(nav).toMatchAriaSnapshot(); + await expect(nav).toMatchScreenshot(`${type}_nav.png`); + + // Check hover styles + await trigger.hover(); + await expect(nav).toMatchScreenshot(`${type}_nav_hover.png`); + + await test.step("open menu", async () => { + await trigger.click(); + const app1 = page.getByText("App 1"); + await expect(app1).toHaveAttribute("href", "https://example.com/app1"); + await app1.hover(); + + // Assert the sidebar looks as we expect + const sidebar = page.getByRole("dialog"); + await expect(sidebar).toMatchAriaSnapshot(); + await expect(page).toMatchScreenshot(`${type}_menu.png`, { + // We exclude this as we don't want to assert Element's styling, only our own + css: ` + #matrixchat { + opacity: 0; + background: orchid; + } + `, + }); + }); + + await test.step("close menu", async () => { + await expect(axe).toHaveNoViolations(); + + // Assert it closes by clicking the overlay + await page.getByTestId("dialog-overlay").click(); + await expect(page.getByRole("dialog")).not.toBeVisible(); + }); + }); + }); + } +}); diff --git a/modules/banner/element-web/tests/fixture/app1.png b/modules/banner/element-web/tests/fixture/app1.png new file mode 100644 index 0000000000000000000000000000000000000000..2c34416b885b9728da50b3d275652cec6e9d6004 GIT binary patch literal 1588 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 T^B6||yQ} + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/banner/element-web/tests/fixture/navigation.json b/modules/banner/element-web/tests/fixture/navigation.json new file mode 100644 index 0000000000..79bac98d25 --- /dev/null +++ b/modules/banner/element-web/tests/fixture/navigation.json @@ -0,0 +1,44 @@ +{ + "categories": [ + { + "identifier": "category1", + "display_name": "Category 1", + "entries": [ + { + "identifier": "app1", + "display_name": "App 1", + "icon_url": "http://localhost:8080/app1.png", + "link": "https://example.com/app1", + "target": "_blank" + }, + { + "identifier": "app2", + "display_name": "App 2", + "icon_url": "http://localhost:8080/app2.png", + "link": "https://example.com/app2", + "target": "_blank" + } + ] + }, + { + "identifier": "category2", + "display_name": "Category 2", + "entries": [ + { + "identifier": "app3", + "display_name": "App 3", + "icon_url": "http://localhost:8080/app1.png", + "link": "https://example.com/app3", + "target": "_blank" + }, + { + "identifier": "app4", + "display_name": "App 4", + "icon_url": "http://localhost:8080/app2.png", + "link": "https://example.com/app4", + "target": "_blank" + } + ] + } + ] +} diff --git a/modules/banner/element-web/tests/fixture/silent/index.html b/modules/banner/element-web/tests/fixture/silent/index.html new file mode 100644 index 0000000000..ae80633f60 --- /dev/null +++ b/modules/banner/element-web/tests/fixture/silent/index.html @@ -0,0 +1,14 @@ + + + + + + Univention Silent Login + + + + diff --git a/modules/banner/element-web/tsconfig.json b/modules/banner/element-web/tsconfig.json new file mode 100644 index 0000000000..fbda6380e7 --- /dev/null +++ b/modules/banner/element-web/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "lib", + "jsx": "react-jsx" + }, + "include": ["src"] +} diff --git a/modules/banner/element-web/vite.config.ts b/modules/banner/element-web/vite.config.ts new file mode 100644 index 0000000000..48d989a42c --- /dev/null +++ b/modules/banner/element-web/vite.config.ts @@ -0,0 +1,45 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import { nodePolyfills } from "vite-plugin-node-polyfills"; +import externalGlobals from "rollup-plugin-external-globals"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export default defineConfig({ + build: { + lib: { + entry: resolve(__dirname, "src/index.tsx"), + name: "element-web-module-banner", + fileName: "index", + formats: ["es"], + }, + outDir: "lib", + target: "esnext", + sourcemap: true, + rollupOptions: { + external: ["react"], + }, + }, + plugins: [ + react(), + nodePolyfills({ + include: ["events"], + }), + externalGlobals({ + // Reuse React from the host app + react: "window.React", + }), + ], + define: { + process: { env: {} }, + }, +}); diff --git a/modules/opendesk/element-web/package.json b/modules/opendesk/element-web/package.json index e74754c4ce..438d65dfa1 100644 --- a/modules/opendesk/element-web/package.json +++ b/modules/opendesk/element-web/package.json @@ -12,7 +12,7 @@ "test": "echo no tests yet" }, "devDependencies": { - "@element-hq/element-web-module-api": "^0.1.0", + "@element-hq/element-web-module-api": "^0.2.0", "@nordeck/element-web-guest-module": "^2.0.0", "@nordeck/element-web-opendesk-module": "^0.5.0", "@nordeck/element-web-widget-lifecycle-module": "^1.0.1", From a111937d00f919cbb7cc39a50120bc4f11ca7cda Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 8 May 2025 12:43:50 +0100 Subject: [PATCH 02/15] Iterate --- modules/banner/element-web/package.json | 3 +- modules/banner/element-web/src/Banner.tsx | 8 ++--- modules/banner/element-web/src/Logo.tsx | 2 +- modules/banner/element-web/src/Menu.tsx | 2 +- .../element-web/src/Univention/navigation.ts | 2 +- modules/banner/element-web/src/theme.ts | 29 +++++++++++++++++++ 6 files changed, 38 insertions(+), 8 deletions(-) diff --git a/modules/banner/element-web/package.json b/modules/banner/element-web/package.json index 85ac88a46b..bdc07531a0 100644 --- a/modules/banner/element-web/package.json +++ b/modules/banner/element-web/package.json @@ -6,7 +6,8 @@ "main": "lib/index.js", "scripts": { "prepare": "vite build", - "lint:ts": "tsc --noEmit", + "lint:types": "tsc --noEmit", + "lint:codestyle": "echo 'handled by lint:eslint'", "test": "echo no tests yet" }, "devDependencies": { diff --git a/modules/banner/element-web/src/Banner.tsx b/modules/banner/element-web/src/Banner.tsx index 4ad63827ab..2d957f9b6e 100644 --- a/modules/banner/element-web/src/Banner.tsx +++ b/modules/banner/element-web/src/Banner.tsx @@ -16,11 +16,11 @@ import { theme } from "./theme"; import Logo from "./Logo.tsx"; const Root = styled.nav` - background-color: ${({ theme }) => theme.compound.color.bgCanvasDefault}; - border-bottom: ${({ theme }) => theme.navbar.border}; - height: ${({ theme }) => theme.navbar.height}; + background-color: ${({ theme }): string => theme.compound.color.bgCanvasDefault}; + border-bottom: ${({ theme }): string => theme.navbar.border}; + height: ${({ theme }): string => theme.navbar.height}; display: grid; - grid-template-columns: ${({ theme }) => `${theme.navbar.triggerWidth} auto`}; + grid-template-columns: ${({ theme }): string => `${theme.navbar.triggerWidth} auto`}; gap: 24px; `; diff --git a/modules/banner/element-web/src/Logo.tsx b/modules/banner/element-web/src/Logo.tsx index 48840486ca..0866bf802c 100644 --- a/modules/banner/element-web/src/Logo.tsx +++ b/modules/banner/element-web/src/Logo.tsx @@ -14,7 +14,7 @@ const Anchor = styled.a` `; const Image = styled.img` - height: ${({ theme }) => theme.navbar.logoHeight}; + height: ${({ theme }): string => theme.navbar.logoHeight}; align-self: center; `; diff --git a/modules/banner/element-web/src/Menu.tsx b/modules/banner/element-web/src/Menu.tsx index 9ca1763858..033bc78f9d 100644 --- a/modules/banner/element-web/src/Menu.tsx +++ b/modules/banner/element-web/src/Menu.tsx @@ -39,7 +39,7 @@ const SidebarHeading = styled.div` const Launcher = styled.button` align-items: center; border: none; - color: ${({ theme }) => theme.compound.color.textPrimary}; + color: ${({ theme }): string => theme.compound.color.textPrimary}; cursor: pointer; display: flex; diff --git a/modules/banner/element-web/src/Univention/navigation.ts b/modules/banner/element-web/src/Univention/navigation.ts index 8443d2951f..96b035d3ed 100644 --- a/modules/banner/element-web/src/Univention/navigation.ts +++ b/modules/banner/element-web/src/Univention/navigation.ts @@ -13,7 +13,7 @@ import { StaticConfig } from "../config"; * Univention Central Navigation API * https://docs.software-univention.de/nubus-kubernetes-customization/1.x/en/api/central-navigation.html */ -export const UniventionCentralNavigation = z.object({ +const UniventionCentralNavigation = z.object({ categories: z.array( z.object({ identifier: z.string(), diff --git a/modules/banner/element-web/src/theme.ts b/modules/banner/element-web/src/theme.ts index 4eec071127..300cf1924a 100644 --- a/modules/banner/element-web/src/theme.ts +++ b/modules/banner/element-web/src/theme.ts @@ -14,6 +14,35 @@ const iconOnSolidPrimary = "var(--cpd-color-icon-on-solid-primary)"; const bodyMdSemibold = "var(--cpd-font-body-md-semibold)"; +declare module "styled-components" { + export interface DefaultTheme { + compound: { + color: { + bgCanvasDefault: string; + textActionAccent: string; + textPrimary: string; + iconOnSolidPrimary: string; + }; + font: { + bodyMdSemibold: string; + }; + }; + color: { + accent: string; + }; + navbar: { + border: string; + boxShadow: string; + height: string; + triggerWidth: string; + logoHeight: string; + }; + menu: { + width: string; + }; + } +} + export const theme: DefaultTheme = { compound: { color: { From 5ecc754c94e127d5efcad60367037af14c39475e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 13 May 2025 10:34:02 +0100 Subject: [PATCH 03/15] Stash --- modules/banner/element-web/src/config.ts | 6 ++ .../banner/element-web/tests/banner.spec.ts | 8 +- .../element-web/tests/fixture/navigation.json | 79 ++++++++++++++----- .../tests/fixture/opendesk/app1.svg | 3 + .../tests/fixture/opendesk/app10.svg | 4 + .../tests/fixture/opendesk/app11.svg | 4 + .../tests/fixture/opendesk/app2.svg | 6 ++ .../tests/fixture/opendesk/app3.svg | 4 + .../tests/fixture/opendesk/app4.svg | 4 + .../tests/fixture/opendesk/app5.svg | 4 + .../tests/fixture/opendesk/app6.svg | 7 ++ .../tests/fixture/opendesk/app7.svg | 6 ++ .../tests/fixture/opendesk/app8.svg | 4 + .../tests/fixture/opendesk/app9.svg | 5 ++ .../tests/fixture/opendesk/logofull.svg | 13 +++ .../tests/fixture/opendesk/logomark.svg | 4 + modules/banner/element-web/vite.config.ts | 4 +- modules/opendesk/element-web/src/index.ts | 2 +- .../element-web/tests/opendesk.spec.ts | 2 +- 19 files changed, 145 insertions(+), 24 deletions(-) create mode 100644 modules/banner/element-web/tests/fixture/opendesk/app1.svg create mode 100644 modules/banner/element-web/tests/fixture/opendesk/app10.svg create mode 100644 modules/banner/element-web/tests/fixture/opendesk/app11.svg create mode 100644 modules/banner/element-web/tests/fixture/opendesk/app2.svg create mode 100644 modules/banner/element-web/tests/fixture/opendesk/app3.svg create mode 100644 modules/banner/element-web/tests/fixture/opendesk/app4.svg create mode 100644 modules/banner/element-web/tests/fixture/opendesk/app5.svg create mode 100644 modules/banner/element-web/tests/fixture/opendesk/app6.svg create mode 100644 modules/banner/element-web/tests/fixture/opendesk/app7.svg create mode 100644 modules/banner/element-web/tests/fixture/opendesk/app8.svg create mode 100644 modules/banner/element-web/tests/fixture/opendesk/app9.svg create mode 100644 modules/banner/element-web/tests/fixture/opendesk/logofull.svg create mode 100644 modules/banner/element-web/tests/fixture/opendesk/logomark.svg diff --git a/modules/banner/element-web/src/config.ts b/modules/banner/element-web/src/config.ts index 3e5966bbbc..8b6db1c122 100644 --- a/modules/banner/element-web/src/config.ts +++ b/modules/banner/element-web/src/config.ts @@ -57,6 +57,12 @@ export type StaticConfig = z.infer; const UniventionConfig = z.object({ type: z.literal("univention"), + /** + * Alternative logo URL to display in the popover menu. + * Will use the main logo url if omitted. + */ + logo_url: z.string().url().optional(), + /** * Base URL to an Intercom Service * https://docs.software-univention.de/intercom-service/latest/architecture.html#endpoints diff --git a/modules/banner/element-web/tests/banner.spec.ts b/modules/banner/element-web/tests/banner.spec.ts index 7637b688ad..4795b67a6a 100644 --- a/modules/banner/element-web/tests/banner.spec.ts +++ b/modules/banner/element-web/tests/banner.spec.ts @@ -12,9 +12,10 @@ test.describe("Banner", () => { test.use({ displayName: "Timmy", page: async ({ context, page, moduleDir }, use) => { - for (const path of ["logo.svg", "app1.png", "app2.png"]) { + for (const path of ["logo.svg", "app1.png", "app2.png", "opendesk/"]) { await context.route(`/${path}*`, async (route) => { - await route.fulfill({ path: `${moduleDir}/tests/fixture/${path}` }); + const file = new URL(route.request().url()).pathname; + await route.fulfill({ path: `${moduleDir}/tests/fixture/${file}` }); }); } await context.route("http://localhost:8080/ics/navigation.json*", async (route) => { @@ -75,10 +76,11 @@ test.describe("Banner", () => { }, }, { - logo_url: "http://localhost:8080/logo.svg", + logo_url: "http://localhost:8080/opendesk/logomark.svg", logo_link_url: "https://example.com/portal", menu: { type: "univention", + logo_url: "http://localhost:8080/opendesk/logofull.svg", ics_url: "http://localhost:8080/ics/", }, }, diff --git a/modules/banner/element-web/tests/fixture/navigation.json b/modules/banner/element-web/tests/fixture/navigation.json index 79bac98d25..7c05eca422 100644 --- a/modules/banner/element-web/tests/fixture/navigation.json +++ b/modules/banner/element-web/tests/fixture/navigation.json @@ -1,41 +1,84 @@ { "categories": [ { - "identifier": "category1", - "display_name": "Category 1", + "identifier": "applications", + "display_name": "Anwendungen", "entries": [ { "identifier": "app1", - "display_name": "App 1", - "icon_url": "http://localhost:8080/app1.png", + "display_name": "Portal", + "icon_url": "http://localhost:8080/opendesk/app1.svg", "link": "https://example.com/app1", "target": "_blank" }, { "identifier": "app2", - "display_name": "App 2", - "icon_url": "http://localhost:8080/app2.png", + "display_name": "Aufgaben", + "icon_url": "http://localhost:8080/opendesk/app2.svg", "link": "https://example.com/app2", "target": "_blank" - } - ] - }, - { - "identifier": "category2", - "display_name": "Category 2", - "entries": [ + }, { "identifier": "app3", - "display_name": "App 3", - "icon_url": "http://localhost:8080/app1.png", + "display_name": "Chat", + "icon_url": "http://localhost:8080/opendesk/app3.svg", "link": "https://example.com/app3", "target": "_blank" }, { "identifier": "app4", - "display_name": "App 4", - "icon_url": "http://localhost:8080/app2.png", - "link": "https://example.com/app4", + "display_name": "Dateien", + "icon_url": "http://localhost:8080/opendesk/app4.svg", + "link": "https://example.com/ap4", + "target": "_blank" + }, + { + "identifier": "app5", + "display_name": "E-Mail", + "icon_url": "http://localhost:8080/opendesk/app5.svg", + "link": "https://example.com/app5", + "target": "_blank" + }, + { + "identifier": "app6", + "display_name": "Kelender", + "icon_url": "http://localhost:8080/opendesk/app6.svg", + "link": "https://example.com/app6", + "target": "_blank" + }, + { + "identifier": "app7", + "display_name": "Kontakte", + "icon_url": "http://localhost:8080/opendesk/app7.svg", + "link": "https://example.com/app7", + "target": "_blank" + }, + { + "identifier": "app8", + "display_name": "Notizen", + "icon_url": "http://localhost:8080/opendesk/app8.svg", + "link": "https://example.com/app8", + "target": "_blank" + }, + { + "identifier": "app9", + "display_name": "Projekte", + "icon_url": "http://localhost:8080/opendesk/app9.svg", + "link": "https://example.com/app9", + "target": "_blank" + }, + { + "identifier": "app10", + "display_name": "Videokonferenz", + "icon_url": "http://localhost:8080/opendesk/app10.svg", + "link": "https://example.com/app10", + "target": "_blank" + }, + { + "identifier": "app11", + "display_name": "Wiki", + "icon_url": "http://localhost:8080/opendesk/app11.svg", + "link": "https://example.com/app11", "target": "_blank" } ] diff --git a/modules/banner/element-web/tests/fixture/opendesk/app1.svg b/modules/banner/element-web/tests/fixture/opendesk/app1.svg new file mode 100644 index 0000000000..758e28621f --- /dev/null +++ b/modules/banner/element-web/tests/fixture/opendesk/app1.svg @@ -0,0 +1,3 @@ + + + diff --git a/modules/banner/element-web/tests/fixture/opendesk/app10.svg b/modules/banner/element-web/tests/fixture/opendesk/app10.svg new file mode 100644 index 0000000000..147057229c --- /dev/null +++ b/modules/banner/element-web/tests/fixture/opendesk/app10.svg @@ -0,0 +1,4 @@ + + + + diff --git a/modules/banner/element-web/tests/fixture/opendesk/app11.svg b/modules/banner/element-web/tests/fixture/opendesk/app11.svg new file mode 100644 index 0000000000..d853d42473 --- /dev/null +++ b/modules/banner/element-web/tests/fixture/opendesk/app11.svg @@ -0,0 +1,4 @@ + + + + diff --git a/modules/banner/element-web/tests/fixture/opendesk/app2.svg b/modules/banner/element-web/tests/fixture/opendesk/app2.svg new file mode 100644 index 0000000000..a537b52199 --- /dev/null +++ b/modules/banner/element-web/tests/fixture/opendesk/app2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/modules/banner/element-web/tests/fixture/opendesk/app3.svg b/modules/banner/element-web/tests/fixture/opendesk/app3.svg new file mode 100644 index 0000000000..90f21f0667 --- /dev/null +++ b/modules/banner/element-web/tests/fixture/opendesk/app3.svg @@ -0,0 +1,4 @@ + + + + diff --git a/modules/banner/element-web/tests/fixture/opendesk/app4.svg b/modules/banner/element-web/tests/fixture/opendesk/app4.svg new file mode 100644 index 0000000000..6c78f1bf58 --- /dev/null +++ b/modules/banner/element-web/tests/fixture/opendesk/app4.svg @@ -0,0 +1,4 @@ + + + + diff --git a/modules/banner/element-web/tests/fixture/opendesk/app5.svg b/modules/banner/element-web/tests/fixture/opendesk/app5.svg new file mode 100644 index 0000000000..90d15399f3 --- /dev/null +++ b/modules/banner/element-web/tests/fixture/opendesk/app5.svg @@ -0,0 +1,4 @@ + + + + diff --git a/modules/banner/element-web/tests/fixture/opendesk/app6.svg b/modules/banner/element-web/tests/fixture/opendesk/app6.svg new file mode 100644 index 0000000000..dbdba6b547 --- /dev/null +++ b/modules/banner/element-web/tests/fixture/opendesk/app6.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/modules/banner/element-web/tests/fixture/opendesk/app7.svg b/modules/banner/element-web/tests/fixture/opendesk/app7.svg new file mode 100644 index 0000000000..e88e54cbfe --- /dev/null +++ b/modules/banner/element-web/tests/fixture/opendesk/app7.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/modules/banner/element-web/tests/fixture/opendesk/app8.svg b/modules/banner/element-web/tests/fixture/opendesk/app8.svg new file mode 100644 index 0000000000..1658f680ec --- /dev/null +++ b/modules/banner/element-web/tests/fixture/opendesk/app8.svg @@ -0,0 +1,4 @@ + + + + diff --git a/modules/banner/element-web/tests/fixture/opendesk/app9.svg b/modules/banner/element-web/tests/fixture/opendesk/app9.svg new file mode 100644 index 0000000000..590bc7dc27 --- /dev/null +++ b/modules/banner/element-web/tests/fixture/opendesk/app9.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/modules/banner/element-web/tests/fixture/opendesk/logofull.svg b/modules/banner/element-web/tests/fixture/opendesk/logofull.svg new file mode 100644 index 0000000000..eaadffcfe3 --- /dev/null +++ b/modules/banner/element-web/tests/fixture/opendesk/logofull.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/modules/banner/element-web/tests/fixture/opendesk/logomark.svg b/modules/banner/element-web/tests/fixture/opendesk/logomark.svg new file mode 100644 index 0000000000..d23f0ec64c --- /dev/null +++ b/modules/banner/element-web/tests/fixture/opendesk/logomark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/modules/banner/element-web/vite.config.ts b/modules/banner/element-web/vite.config.ts index 48d989a42c..79d308a798 100644 --- a/modules/banner/element-web/vite.config.ts +++ b/modules/banner/element-web/vite.config.ts @@ -40,6 +40,8 @@ export default defineConfig({ }), ], define: { - process: { env: {} }, + // Use production mode for the build as it is tested against production builds of Element Web, + // this is required for React JSX versions to be compatible. + process: { env: { NODE_ENV: "production" } }, }, }); diff --git a/modules/opendesk/element-web/src/index.ts b/modules/opendesk/element-web/src/index.ts index d88e7f774d..f8f9ab289e 100644 --- a/modules/opendesk/element-web/src/index.ts +++ b/modules/opendesk/element-web/src/index.ts @@ -41,7 +41,7 @@ declare global { } class OpendeskModule implements Module { - public static readonly moduleApiVersion = "^0.1.1"; + public static readonly moduleApiVersion = "^0.2.0"; public constructor(private api: Api) {} diff --git a/modules/opendesk/element-web/tests/opendesk.spec.ts b/modules/opendesk/element-web/tests/opendesk.spec.ts index a182535d49..5c7a79e926 100644 --- a/modules/opendesk/element-web/tests/opendesk.spec.ts +++ b/modules/opendesk/element-web/tests/opendesk.spec.ts @@ -87,7 +87,7 @@ test.use({ }, "net.nordeck.element_web.module.widget_toggles": { config: { - types: [], + types: ["jitsi"], }, }, "net.nordeck.element_web.module.widget_lifecycle": { From 1985a351d9945dc7e2c9062a93071dc37edeab08 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 14 May 2025 09:27:27 +0100 Subject: [PATCH 04/15] Bump module API version --- modules/banner/element-web/package.json | 2 +- modules/banner/element-web/src/index.tsx | 2 +- modules/opendesk/element-web/src/index.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/banner/element-web/package.json b/modules/banner/element-web/package.json index bdc07531a0..2c5076379d 100644 --- a/modules/banner/element-web/package.json +++ b/modules/banner/element-web/package.json @@ -11,7 +11,7 @@ "test": "echo no tests yet" }, "devDependencies": { - "@element-hq/element-web-module-api": "^0.2.0", + "@element-hq/element-web-module-api": "^1.0.0", "@types/node": "^22.10.7", "@types/react": "^19", "@vitejs/plugin-react": "^4.3.4", diff --git a/modules/banner/element-web/src/index.tsx b/modules/banner/element-web/src/index.tsx index 9eeb972671..cc1e1e5123 100644 --- a/modules/banner/element-web/src/index.tsx +++ b/modules/banner/element-web/src/index.tsx @@ -12,7 +12,7 @@ import Banner from "./Banner"; import { name as ModuleName } from "../package.json"; class TopBarModule implements Module { - public static readonly moduleApiVersion = "^0.2.0"; + public static readonly moduleApiVersion = "^1.0.0"; private config?: ModuleConfig; diff --git a/modules/opendesk/element-web/src/index.ts b/modules/opendesk/element-web/src/index.ts index f8f9ab289e..e50aac9ce4 100644 --- a/modules/opendesk/element-web/src/index.ts +++ b/modules/opendesk/element-web/src/index.ts @@ -41,7 +41,7 @@ declare global { } class OpendeskModule implements Module { - public static readonly moduleApiVersion = "^0.2.0"; + public static readonly moduleApiVersion = "^1.0.0"; public constructor(private api: Api) {} From 3c7bb885fdbccea9bf9c6a57bc7d7a4bd82062a8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 14 May 2025 11:56:58 +0100 Subject: [PATCH 05/15] Iterate --- modules/banner/element-web/package.json | 2 + modules/banner/element-web/src/Logo.tsx | 4 +- modules/banner/element-web/src/Menu.tsx | 91 ++++++++++----- .../element-web/src/Univention/Menu.tsx | 30 ++--- .../banner/element-web/src/translations.json | 14 ++- .../banner/element-web/tests/banner.spec.ts | 108 +++++++++++++----- .../element-web/tests/fixture/navigation.json | 2 +- .../tests/fixture/silent/index.html | 6 +- 8 files changed, 174 insertions(+), 83 deletions(-) diff --git a/modules/banner/element-web/package.json b/modules/banner/element-web/package.json index 2c5076379d..6aa9b89e56 100644 --- a/modules/banner/element-web/package.json +++ b/modules/banner/element-web/package.json @@ -23,6 +23,8 @@ }, "dependencies": { "@radix-ui/react-dialog": "^1.1.6", + "@vector-im/compound-design-tokens": "^4.0.3", + "@vector-im/compound-web": "^7.11.0", "framer-motion": "^12.4.10", "styled-components": "^6.1.18", "zod": "^3.24.2" diff --git a/modules/banner/element-web/src/Logo.tsx b/modules/banner/element-web/src/Logo.tsx index 0866bf802c..d515cfdb4e 100644 --- a/modules/banner/element-web/src/Logo.tsx +++ b/modules/banner/element-web/src/Logo.tsx @@ -25,12 +25,12 @@ interface Props { } const Logo: FC = ({ api, src, href }) => { - const img = {api.i18n.translate("Portal; + const img = {api.i18n.translate("logo_alt")}; if (!href) return img; return ( - + {img} ); diff --git a/modules/banner/element-web/src/Menu.tsx b/modules/banner/element-web/src/Menu.tsx index 033bc78f9d..df6771a56d 100644 --- a/modules/banner/element-web/src/Menu.tsx +++ b/modules/banner/element-web/src/Menu.tsx @@ -5,10 +5,11 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE files in the repository root for full details. */ -import { type FC, useState } from "react"; +import { type FC, type JSX, useState } from "react"; import { AnimatePresence, motion } from "framer-motion"; import * as Dialog from "@radix-ui/react-dialog"; import styled from "styled-components"; +import { InlineSpinner } from "@vector-im/compound-web"; import { StaticConfig } from "./config"; import { theme } from "./theme"; @@ -16,7 +17,7 @@ import type { Api } from "@element-hq/element-web-module-api"; import Logo from "./Logo.tsx"; const Sidebar = styled(motion.div)` - padding: 16px 12px; + padding: 16px 12px 0; box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3); overflow: auto; position: fixed; @@ -105,6 +106,19 @@ const LinkLogo = styled.img` background-color: #ffffff; `; +const CentredContainer = styled.div` + display: flex; + height: 100%; + width: 100%; + align-items: center; + text-align: center; + font-weight: 600; + + svg { + margin: 0 auto; + } +`; + const Overlay = styled(motion.div)` background-color: rgba(238, 239, 242, 0.5); position: fixed; @@ -116,7 +130,7 @@ const Overlay = styled(motion.div)` interface Props { api: Api; - config: StaticConfig; + config: StaticConfig | Error | null; // null for loading fallbackLogoUrl: string; } @@ -140,10 +154,29 @@ const Category: FC<{ const Menu: FC = ({ api, config, fallbackLogoUrl }) => { const [open, setOpen] = useState(false); + let content: JSX.Element; + if (config instanceof Error) { + content = {api.i18n.translate("univention_error")}; + } else if (config) { + content = ( + <> + {config.categories.map((category) => ( + + ))} + + ); + } else { + content = ( + + + + ); + } + return ( - + @@ -168,33 +201,33 @@ const Menu: FC = ({ api, config, fallbackLogoUrl }) => { animate={{ x: 0 }} exit={{ x: -WIDTH }} transition={{ type: "tween", ease: "easeInOut", duration: 0.3 }} - aria-label={api.i18n.translate("Menu")} + aria-label={api.i18n.translate("menu_label")} > - - - - setOpen(false)} - > - + + + + setOpen(false)} > - - - - - - {config.categories.map((category) => ( - - ))} + + + + + + + + {content} diff --git a/modules/banner/element-web/src/Univention/Menu.tsx b/modules/banner/element-web/src/Univention/Menu.tsx index 690b03e94c..7416c99232 100644 --- a/modules/banner/element-web/src/Univention/Menu.tsx +++ b/modules/banner/element-web/src/Univention/Menu.tsx @@ -21,30 +21,34 @@ interface Props { const Menu: FC = ({ api, config, fallbackLogoUrl }) => { const [loggedIn, setLoggedIn] = useState(false); - const [data, setData] = useState(); + const [data, setData] = useState(); const language = api.i18n.language.toLowerCase().startsWith("de") ? "de-DE" : "en"; useEffect(() => { let discard = false; - setData(null); - fetchNavigation(config.ics_url, language).then((data) => { - if (discard) return; - setData(data); - }); + setData(undefined); + fetchNavigation(config.ics_url, language) + .then((data) => { + if (discard) return; + setData(data); + }) + .catch((error) => { + if (discard) return; + setData(error); + }); return (): void => { discard = true; }; }, [config, language, loggedIn]); - if (!loggedIn) { - return ; - } - if (data) { - return ; - } - return
; + return ( + <> + {!loggedIn && } + + + ); }; export default Menu; diff --git a/modules/banner/element-web/src/translations.json b/modules/banner/element-web/src/translations.json index a177686956..be2627e3aa 100644 --- a/modules/banner/element-web/src/translations.json +++ b/modules/banner/element-web/src/translations.json @@ -1,22 +1,26 @@ { - "Portal logo": { + "logo_alt": { "en": "Portal logo", "de": "Portal Logo" }, - "Menu": { + "menu_label": { "en": "Menu", "de": "Menü" }, - "Show menu": { + "trigger_label": { "en": "Show menu", "de": "Menü anzeigen" }, - "Close menu": { + "close_label": { "en": "Close menu", "de": "Menü schließen" }, - "Show portal": { + "logo_link_label": { "en": "Show portal", "de": "Portal anzeigen" + }, + "univention_error": { + "en": "Failed to load data from Univention", + "de": "Daten konnten nicht von Univention geladen werden" } } diff --git a/modules/banner/element-web/tests/banner.spec.ts b/modules/banner/element-web/tests/banner.spec.ts index 4795b67a6a..41216f91e5 100644 --- a/modules/banner/element-web/tests/banner.spec.ts +++ b/modules/banner/element-web/tests/banner.spec.ts @@ -11,6 +11,9 @@ import { ModuleConfig } from "../src/config.ts"; test.describe("Banner", () => { test.use({ displayName: "Timmy", + navigationJsonResolver: async ({}, use) => { + await use(Promise.withResolvers()); + }, page: async ({ context, page, moduleDir }, use) => { for (const path of ["logo.svg", "app1.png", "app2.png", "opendesk/"]) { await context.route(`/${path}*`, async (route) => { @@ -18,15 +21,6 @@ test.describe("Banner", () => { await route.fulfill({ path: `${moduleDir}/tests/fixture/${file}` }); }); } - await context.route("http://localhost:8080/ics/navigation.json*", async (route) => { - await route.fulfill({ - path: `${moduleDir}/tests/fixture/navigation.json`, - contentType: "application/json", - }); - }); - await context.route("http://localhost:8080/ics/silent", async (route) => { - await route.fulfill({ path: `${moduleDir}/tests/fixture/silent/index.html`, contentType: "text/html" }); - }); await page.goto("/"); await use(page); @@ -35,6 +29,7 @@ test.describe("Banner", () => { test("should error if config is missing", { tag: ["@screenshot"] }, async ({ page }) => { await expect(page.getByText("Your Element is misconfigured")).toBeVisible(); + await expect(page.getByText("Errors in module configuration")).toBeVisible(); // We don't take a screenshot as we don't want to assert Element's styling, only our own }); @@ -50,8 +45,8 @@ test.describe("Banner", () => { links: [ { icon_uri: "http://localhost:8080/app1.png", - name: "App 1", - link_url: "https://example.com/app1", + name: "E-Mail", + link_url: "https://example.com/email", target: "app1", }, { @@ -96,20 +91,27 @@ test.describe("Banner", () => { }, }); - test("should render", { tag: ["@screenshot"] }, async ({ page, axe }) => { + test.beforeEach(async ({ context, moduleDir, navigationJsonResolver }) => { + await context.route("http://localhost:8080/ics/navigation.json*", async (route) => { + await navigationJsonResolver.promise; + await route.fulfill({ + path: `${moduleDir}/tests/fixture/navigation.json`, + contentType: "application/json", + }); + }); + await context.route("http://localhost:8080/ics/silent", async (route) => { + await route.fulfill({ + path: `${moduleDir}/tests/fixture/silent/index.html`, + contentType: "text/html", + }); + }); + }); + + test("should render", { tag: ["@screenshot"] }, async ({ page, axe, navigationJsonResolver }) => { await expect(page.getByRole("heading", { name: "Welcome to Element!" })).toBeVisible(); await expect(page.getByLabel("Show portal")).toHaveAttribute("href", "https://example.com/portal"); const nav = page.locator("nav"); - if (type === "univention") { - await expect(nav).toMatchScreenshot(`${type}_nav_loading.png`); - // The stub silent html doesn't seem to work in Playwright so send the postMessage manually - await page.evaluate(() => { - window.postMessage({ - loggedIn: true, - }); - }); - } const trigger = page.getByLabel("Show menu"); await expect(trigger).toBeVisible(); @@ -124,21 +126,28 @@ test.describe("Banner", () => { await test.step("open menu", async () => { await trigger.click(); - const app1 = page.getByText("App 1"); - await expect(app1).toHaveAttribute("href", "https://example.com/app1"); - await app1.hover(); + const sidebar = page.getByRole("dialog"); + + if (type === "univention") { + await expect(sidebar).toMatchScreenshot(`${type}_menu_loading.png`); + await navigationJsonResolver.resolve(); + } + + const emailApp = page.getByText("E-Mail"); + await expect(emailApp).toHaveAttribute("href", "https://example.com/email"); + await emailApp.hover(); // Assert the sidebar looks as we expect - const sidebar = page.getByRole("dialog"); + await expect(axe).toHaveNoViolations(); await expect(sidebar).toMatchAriaSnapshot(); await expect(page).toMatchScreenshot(`${type}_menu.png`, { // We exclude this as we don't want to assert Element's styling, only our own css: ` - #matrixchat { - opacity: 0; - background: orchid; - } - `, + #matrixchat { + opacity: 0; + background: orchid; + } + `, }); }); @@ -152,4 +161,43 @@ test.describe("Banner", () => { }); }); } + + test.describe("univention config", () => { + test.use({ + config: { + "io.element.element-web-modules.banner": { + logo_url: "http://localhost:8080/opendesk/logomark.svg", + logo_link_url: "https://example.com/portal", + menu: { + type: "univention", + logo_url: "http://localhost:8080/opendesk/logofull.svg", + ics_url: "http://localhost:8080/ics/", + }, + }, + }, + }); + + test.beforeEach(async ({ context }) => { + await context.route("http://localhost:8080/ics/silent", async (route) => { + await route.fulfill({ status: 500 }); + }); + await context.route("http://localhost:8080/ics/navigation.json*", async (route) => { + await route.fulfill({ status: 500 }); + }); + }); + + test("should render error", { tag: ["@screenshot"] }, async ({ page, axe }) => { + await expect(page.getByRole("heading", { name: "Welcome to Element!" })).toBeVisible(); + await expect(page.getByLabel("Show portal")).toHaveAttribute("href", "https://example.com/portal"); + + const nav = page.locator("nav"); + + const trigger = page.getByLabel("Show menu"); + + await trigger.click(); + const sidebar = page.getByRole("dialog"); + await expect(sidebar.getByText("Failed to load")).toBeVisible(); + await expect(sidebar).toMatchScreenshot("univention_error.png"); + }); + }); }); diff --git a/modules/banner/element-web/tests/fixture/navigation.json b/modules/banner/element-web/tests/fixture/navigation.json index 7c05eca422..7365ff1371 100644 --- a/modules/banner/element-web/tests/fixture/navigation.json +++ b/modules/banner/element-web/tests/fixture/navigation.json @@ -36,7 +36,7 @@ "identifier": "app5", "display_name": "E-Mail", "icon_url": "http://localhost:8080/opendesk/app5.svg", - "link": "https://example.com/app5", + "link": "https://example.com/email", "target": "_blank" }, { diff --git a/modules/banner/element-web/tests/fixture/silent/index.html b/modules/banner/element-web/tests/fixture/silent/index.html index ae80633f60..84072225b1 100644 --- a/modules/banner/element-web/tests/fixture/silent/index.html +++ b/modules/banner/element-web/tests/fixture/silent/index.html @@ -5,9 +5,9 @@ Univention Silent Login From 1a2184d5c89eca0430efec640e446298fc8ff0a2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 14 May 2025 13:52:58 +0100 Subject: [PATCH 06/15] Iterate --- modules/banner/element-web/src/Menu.tsx | 6 +++++- .../banner/element-web/tests/banner.spec.ts | 17 +++++++++++------ .../banner.spec.ts/static-menu-linux.png | Bin 0 -> 14028 bytes .../banner.spec.ts/static-nav-hover-linux.png | Bin 0 -> 2281 bytes .../banner.spec.ts/static-nav-linux.png | Bin 0 -> 2323 bytes .../banner.spec.ts/univention-error-linux.png | Bin 0 -> 8861 bytes .../banner.spec.ts/univention-menu-linux.png | Bin 0 -> 27234 bytes .../univention-menu-loading-linux.png | Bin 0 -> 6317 bytes .../univention-nav-hover-linux.png | Bin 0 -> 1111 bytes .../banner.spec.ts/univention-nav-linux.png | Bin 0 -> 1117 bytes 10 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 modules/banner/element-web/tests/snapshots/banner.spec.ts/static-menu-linux.png create mode 100644 modules/banner/element-web/tests/snapshots/banner.spec.ts/static-nav-hover-linux.png create mode 100644 modules/banner/element-web/tests/snapshots/banner.spec.ts/static-nav-linux.png create mode 100644 modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-error-linux.png create mode 100644 modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-menu-linux.png create mode 100644 modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-menu-loading-linux.png create mode 100644 modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-nav-hover-linux.png create mode 100644 modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-nav-linux.png diff --git a/modules/banner/element-web/src/Menu.tsx b/modules/banner/element-web/src/Menu.tsx index df6771a56d..7b32d53c56 100644 --- a/modules/banner/element-web/src/Menu.tsx +++ b/modules/banner/element-web/src/Menu.tsx @@ -155,6 +155,7 @@ const Menu: FC = ({ api, config, fallbackLogoUrl }) => { const [open, setOpen] = useState(false); let content: JSX.Element; + let logoUrl = fallbackLogoUrl; if (config instanceof Error) { content = {api.i18n.translate("univention_error")}; } else if (config) { @@ -165,6 +166,9 @@ const Menu: FC = ({ api, config, fallbackLogoUrl }) => { ))} ); + if (config.logo_url) { + logoUrl = config.logo_url; + } } else { content = ( @@ -205,7 +209,7 @@ const Menu: FC = ({ api, config, fallbackLogoUrl }) => { > - + ; +}>({ + navigationJsonResolver: async ({}, use) => { + await use(Promise.withResolvers()); + }, +}); + test.describe("Banner", () => { test.use({ displayName: "Timmy", - navigationJsonResolver: async ({}, use) => { - await use(Promise.withResolvers()); - }, page: async ({ context, page, moduleDir }, use) => { for (const path of ["logo.svg", "app1.png", "app2.png", "opendesk/"]) { await context.route(`/${path}*`, async (route) => { @@ -190,14 +196,13 @@ test.describe("Banner", () => { await expect(page.getByRole("heading", { name: "Welcome to Element!" })).toBeVisible(); await expect(page.getByLabel("Show portal")).toHaveAttribute("href", "https://example.com/portal"); - const nav = page.locator("nav"); - const trigger = page.getByLabel("Show menu"); await trigger.click(); const sidebar = page.getByRole("dialog"); await expect(sidebar.getByText("Failed to load")).toBeVisible(); await expect(sidebar).toMatchScreenshot("univention_error.png"); + await expect(axe).toHaveNoViolations(); }); }); }); diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/static-menu-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/static-menu-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..ae2531c66bbd75e0a7f0760076db290015acb092 GIT binary patch literal 14028 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 bAHY~ftVJ=K#CuB8K? literal 0 HcmV?d00001 diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/static-nav-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/static-nav-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..dfa9b9b2553f216e529ca54293f387920c121075 GIT binary patch literal 2323 zcmbtVX;f257Jewu8TJtaXtQ)s!D+z&+Mof%#;_ehTDCxtRUjBZc0!0Gv>+;rEF!DH z2rW?z#E6h&P!k&oi-8Ox`!1lOL}Uqs1L(Ymf9Fj9==$+)ovQn8efPUx)xG}P83$#B zy$S#TC_6c#-2gxioC4Oc9pE<=>z)7_nRqt`TcEyMdkz3#T~6psBQX^Rq4&-U&&pal)6bae9wHFghXX8;(E@d|g=l*ftyy-8vO>t;3ey zyWT7dA>+%!Cl?@a03g+Y@wX?QKLI8dd(QTnONDt?g~bAW+82vm zT3QO(czIntt15?*yN$#_A8<7y5{YI&TWc#(JxvB$^E3vb?h zSX&!XF&hBwN`GJgc|DVpwASEQ6!ldJQdL2rkb05beDB^pCNui$=K9ps)V^={@bLQ& z9?UJj7umwYD!db7Z~>l};W&&DY$D|f8VE{klh35CvfXEltm`!m|RyNhvz zh4HPqUOI!pxPSj(!_X+mpqE$8X32;+2}NbGSW6~{4}S&|jB5gShW6~<9m4Y7T;2yM zC@p}sV;;^PG5#@tNA_c1^oxji_};_SRrIc_f*m#DBhEy>!Jp6WgI@i8hD2$Dbot>REH8tJ2 zbLXc4CX>O~ZHupvq&CP8_|4UD`gS(rX?Wt3mNdMbZYU<)!yY)9Ke12Nh z!9$q(H{nNd-M8n&;<3k}*-wjK%@&TN<>}dwmu8%}hd515=7xrJF4qUf3U1A!yWWwP z-4s3My$F0XB0jM`1_>Zg|GeDbp-On*9v4*|)cy>UGH0<^ERjfTuhD2Ufk4pS?ubC6 z(Ju=RoSvEN@9*buID3wSeUPLeUQV@KJs%t#QqkIzs$9t8Du@N{dXFN41Q)e>7ydEV62A1?*D z&dJH?@mGNkH&EAO0(qmopIk&U2E2^@88B5Ze7#)wWUNJK=k6it%A7k6M~_^SNc^5(BF+Sg z_C`B7IVC1awl>xrNXNmV6%-%{KYf!71Ynr{V-2`GtH$Vw=OxI1uYcA-nD}}*?2~!T zeGf6O7S>c$R16Lr=%QK9?01FyH&Lr>V*?ZFD~sY?9RpZhTm zyqVy05ogK;Uj!4AFK-^WTU;DXmVET2P$(%WDXFQ}dZ!@FG+Wubu@`y8X9q8##cZ;9vU=l}R)KLQ;S6B874 zcRmu2N5#JrGRL;1u~`7AFUS78r{}Fm(e2~Cy*x0tI$w6@*0Yv2o0OIC@Nh@+4M$i( zdHL|zSn9^AxUy0g@p6R6vA8j)Opp zjeRrJP}I-Oe}XT%^_72RnT2*1EiJ_nOG`^X>}d+?Dt|A!qpGCT&Xmn-L2kE9b?V!g zW0#ImDSE%_mZ`QGn3=r}YgiAdy)Ftg85Ac`Fxw4dy1PwgkO$+RKMBY~e zkT(6&MIRDSloDtKD5ZJ-jRUt+_^e*sAp_d5Up literal 0 HcmV?d00001 diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-error-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-error-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..14f92293ba62f7e1e9cdcc1f91fff4c8a8e7dee1 GIT binary patch literal 8861 zcmeHNXH=8R)0?8oK`72mUJj?|t z1n1hgKOJ(VQ78fRjRr_x z`Qv12Nb2HSIq94n@mn;)e_U^!6W`{PwIxlJ<@F zCUaNy-N$P86csa>sc0E@+XNtQPA)=`v{YF2D{+5kQ2ohI^%p;t3hf)R=3FXzzJruk zfw9@yy79XBn+-krK4kql(HAO^RmA>*S`^}+>s;XVL z1l|AdYqO4rwtriAl8-ur5oty~NGvD({?D~r!o0ij?p>jW8Z{Ef{ z{xE*C`9~{^LS+qAt@kK+A?j=VOx93nS9mX^;a6prL0)63y$-D|rz(SN#lwbrJZ~5K zte#2tK$5Qx0oT=|u^Qo2II!Z#A9r>C!(-N6{ppxIh{ys9*; zTGwPEs`YuXS3dgO{3NNu!#VE1$HkO*pf3f@;z0RsFXt2|wT7Kskf~{|am&8GEhYwC z$7F@mFe2Q>rI7O z1oTG5!pNj`+(aeR%}p`*$f`} za(=R}6vTrbsIWqv9^+>!ZP0m|@u4S+k*lk#fWn^|8X9_gdml=3EBe32jh6%4+88S} zQBi4QHL+xBa5+21Uz`zlXX-0^SErHg88di29i8SiI3zCCjG;+CM|o;$>TOVRa`Lx= zf+ov~Fv=NrxA_orvcF8gaoxQ6>|fGKKE)}AoX&c7-)adY{59LVOH2hMIoZhA*xGwY zJ=G?ZH277uz0F*4{VheaIjYROZYzg!UKnK=xcQAZ=Vz0lA6WR(#H8N&d0fw^&v+6- z-5!%U70tG)NV506?#B@4>j*-R9CdRtgk=s@75*%AnSLJctLYt17V~o)`OphBU!oJ< zt7N8ppzBK$Z?~5qY)>7+Ar+ed_Wb=%`qCw->oqhr!GzHl!1DD5vX$IHGYdb$RaH~~ zle{C~CTLQoT7v4wTp8%-V6xoo*8X3Ayh@XX7%v#-4K>*JeA*l-^utdRwn{5o_uA;x z?3MoU$1XZrS#AE?CbHp_`(P!C(gy7sR+UlrM&hQKWPxswiW>02 z_fz4jWQ3&PVwC2Hq^xz@;)~CFk(3z@(*+czwv|v^n7uV!hs%JrayB>;w#M!!Z8olF zkA%g<#p!8lb4fW5g30@g7jQB3`2nzcP`Zvy2qC$^g+L%YfBt-Pa}yhSR$kx|il*S} zvDfJ6ENbjOvxUm$p)~Q#Apy&5)o#BxqZ+Mq)W!u0flwY96->Dx@_kB5%Ck8+%%Ldy?aXd(Zvz|Za05Z$Aio_;CQsDd>4D6= z|1tnH0PCw*3Yqxy=~MLSSf!51PthS4^zM=QanI5bSQAPx) zASPO-e|Uf{k;5`BjLzc37Ee=sPte^^-LNWx07P9~-N(nrZ$7}O6t@c)7C`3Wh(6dy zJ_}x86@;&2x0%iTI^Pn+$OS4ZE7QrDJKh?@0W9m<`kf4THhyOPkOV{w^_3meu1Bj3 zR3g317~sf=j{z8h6CrtVw1lv0Tr z^KyZTDjRgDg75aA(@c3mJ|8pJZ^01)Q9ige;+cMM-TR1$(_m$n34rSebktYr2YIz9 z&nc!~8sYGpA(;UB0@l)t@=E*qiI1*+ekel?r|;l)7nt9XeCK@X|51D-cGMw*?G;7o zr~y;6b8=3dpB@|>e8=glT~3-_JKn`&D{a6^v`j9clbT@)ScH@Q0?al9y-~Y8g%GF` zqGVvtHPp6!&j4Ey)TlM<0f$HesCtVlrMbCzc-SzhrxuD;PVG(3$)Wrbs(fi=)Sm;U zba6qs<-LnSQ-vxTa-rB(3#6M_qt~}7H%w2D++4K}b3sMH!xy22yt2%RPU{%<@UPV1 zGho>&Dh{tyG88yM!dx0WgQMywJ?vFeZhD213JPaUxC%N(6I3_@0|Uab|Cx?X?F{~O zz890F(A(P!kP%12GP_N1wfhXRFgx&>+NV#SYHDi8$Mt9{zd4_`R{#LM2bP?4e>4S% zlJ^7zXhLTjVTH=wEyvRkXyYnd2)lL;3;1}_PCG@ImXUFww-*H%LwyC9cc$8|`?qsA zWd~@eHF27!O*Y|?_twf$0RjNcI5!&`^6&NtAi{+LkvE!6MB--b+m*rD&kxZM zpMJyu24XkGyP{KYP9Y6rwS%jL$np*&3j!~=y#MvJwcgflA32A}K!mSGn*z0Ss#l9N-3 zy~)P*J1?mZw9M!~?qJcE0)GrN1b7=8LbO`226$6IbOgv`L@baSGU{fxK&bm1cCD&;_tl!|8>+(z9JcMh?^PGD}(`&=;D;n z+t;@}RyvU;ZYPS`t^wjkM|U@l&KZ6jZF6orRpS5<2S8X?!+$s;HV;ig_=NaMO)7Z+ zHvvWj9&LDbvYNO}*KPu|$0Kg5_J~?`vt9(yu2(yQjIafA8{i9f{i~@cjWL=tr1o>Ha5n_Y+PIriMkW6=+KMP zSYB}Gc$wL$--I&d{P5?$ge9Kj3^z76zsbtV>Tjp4Eu~vpR3z)YF(?*B>RpS>zZ}Oc zXZZa2(BR-8I*fu)O3Nt$}Kpt_>gE1zn^jB5SB9#Hg3I*Us{`2mSblJR?yLnHq%IdX5 zBp7&F28H4y7Mq7L-Ll~6Ujs*zLzPfkX`iGJesWWuz^#8wMaAh+;5zRLhv+ ze+ew`_3Is7-NF;absb}#KHJRQKi92kviERmPqHt^WU*xiY1q+FJhvH5<@gt7>3}5F zRX$cy=4z#diQPhFrJi^MVt?=ZrbK#M`0Q6kYv7;39@feMNbvu3`t#}y%uU8j?LHQ& zuYWuSo(Go<9$dQqjOxZSs(+ZN-ZTHV`M)~(FChN&yn$9>f?8H}XZXDQTUW#A%48Hw z>2pqDpo!<=&eF%fstfW96;3m8i<#=v0r^`ko+j!VQ|4rp>-KaBa>tosHV&w~J zJlH7Ad7W}kZR%>A1#xUsaYZJBHzvAR1Tk_|ZFn8CNK|hq2Dqf=YC-qaFRIedZq^30c({Uo8`}rE2onvoR z_fpp8vy|5*&yI*PdNI;I3m*qKC#J<8zMvCHhk*M1kfdOw;qIy1a>do^g65{+CnaOf zr)G*w?sAOU8{!X^hd7Hp_2oADSstq?||qxeO;T*(1Wdn|DApl64U zj&V9wnlpG+&DdV^=C7l7`3w;*vtz!vK^NY!+E!KF{gSC94FLwE#hE}1ha{}LwK-}O z6>Z$t$Ia=q%PV7hK0*@RrHx;mSCkg_!8lnb){tDp!*{JMR$2Eydssel(D|5$o>P|M zhixtOpD78n#?uOLE@O zZ20xVjCJj1KK_A1Ye(KsMy93UnRedvj1a%!S17yTf}4r(B|j(qn_1pE}9^g)pPg`MehGd7l{n{3s{hI+aC1hUS=5-aLj#w{6#{QC?N+D7xs z>FAj)(9EY14`~!w$dnlTqoU>;ge)sj63aBY6S)62$m>^!{5}4;J7<3G{aMv@lL%30 zZo5UZ|1k9cdw~09{hU+cuXjGB2s)wIW0|fF|8S0sDF12evRDDvp1Hf-b4H1Xrthpg z8KBd(71`(pP+vpXaFZ)8!J_+Hx)T3xg=uZe&zT@Q-{ER%#F^GyS@YYj0o z%u7jl4U&#p{!%!1y+}ZZm7Y`n#sH!)(yl|7vkMwsUp6p*U^WIff{k9ATzvPQ&Nbqm ze5BTs#jRq-U`Ik=9`}dhH9QG5?$qx|Z|>#SM?w_KO|T@djmF4%&hF-9oqZO zUKEbqnnuH5Y zNT*1+qrVfMBWF@lkZGzQu0FuUz*2hW z?MmTZy7r?+b}}zrp2U^UbxsH8)|N=8Q~!Q(HNv=jt#k?PCVC?HsF}mUehZev|#rAb%t6YY#wbzIE_6!TAu=KjoDrtSArBd3Mm3brC0@G#Lov7OGociflc6T zvc+#pY?VZUUb?^wLI~tZe+&Eb@UYDjIWnW4vImPGvJ69eeq9JtduN}?xHNz`b12YP z`g)>4NYIi`qq4rd9MV$SkZ-OAQckF?o*L7bsOL#-nB_a}NW2yu71gt)<6}CHohJKl z&8@1l{%)>5-R@-0fxoh9Y^^PtRT4e6x45FOKIG&wouv7zW2PnFQfdeoq?^? zj7Zmu=8b`Zt4vJ$I|CUBBviSmoxPX2t=GZEN^UCbFNH0BrXv<36l4dwJMhq@O4iUY zvZFJP*3f%TXUu8Oc9Kw5eBqhY zGqPSG0kuf~5fufj)e&rYVt=S$H zMHf#;;!ZQMG`5ba-ZLQKr~a@!|Q2{k>Fnw>;ZxKn9$LwZcAI~=$Gs3 zt=!8`6W)O_GhU|mEY1KKC_*TGkxFbKQwUYQW(0(gw-mp5Pv#s+AYqoL^!dSR*;9<_HNRTA)!V5MWuAK_r zaa%{x6in`i1=?A|`|BJ+c4`P$JS@6+ja$#bvsYhx+x-#SJ9w_bJVPSAn_JYXwKUx<8qk zqP!U9#lMxOdnWtDeevk4Z|P}Xzg@|EKet=G^~KLM7P3xl100X8D&0nESa7PtnM$-HoHoLVpf9nEU()3skR4 zlhHdSv#PdXwGmYE%erOCBUUfX`t^3ayDL(M)3yGXx25)F)_Wu?eT+yMoCu{+uLa5yhgt~6#a#LRzg;IQi`HjA&8Un*zV zsVP5PD-$e-`j!r5!xLY9hSGsjir52s3iwjfB4hOG{uN=9Y-UXVj?qU+kBN5TvU`GG zJ$ddv17XAc^z`GmP`{@L!dH~_$!bT3@DVj(JG_!kA&C>&!4}V&8*P_!yCv^ePTTO# z8r)H#b^6Ys;M0Q=vbM@3&e!Om{CkmXMztpvPa(q__J{^wcfkrKCcpizInm9;%tQ`; zRxT4apA43@@&FlP=Q?cM!+bxX-=fBKlg%Up;tMz<%P@YCFXg1KTfl+dg)E~&IICZ4 zwGkQ5u(oOyT<-+0iH6zbsw%#RmMM|z-SCX8zt_O*GJ#F+AAgeadOy(BJiGMAjpVe% zQ47l%nUn@xsV{VvP;SaH5@|Y?E}@7*gx-S0A}#W6aYhTOUo&Y`BK#|)MI zbPfp%8S272WS6UZRAVKlr!>{TJ1)BEGQ`$2N8BR|{QY8jkN(2wW$nT)(BdCV<0q5z zOCmO?+^T0S#ZA%1Wr7DE`F*1k^M4o1=n)W}Ni z`gsJjI(^nF&fN(1~F-4`-Afs44;F+Dny zvQB>EP)+u4{HBVlB%Cj*Oh)9Egsnl4crAeRll*0wG+PbbCMTnzT*d7V;l0AF^3soQVP?{IHxA2r?c#KK zS08;eXw+};wImUW(8Y6dH%G2ukaNsc>Bb4v{_^Er-n0UyWgN?k*}K7MQ$@$hnN zskRNwZM22#)Qkn7nlaU4>zG@tootKVuRZ7VI13`IdG}gw-s@$gF4{t*tuLg=+p=cYmNd=YlRj)>1Bm;1W{OWpQ6-j|6E8Q|-Tv!;R^sI>p~8VGa;^g{lrwnxh5jJwB;rKyfxZ}Zw*(X&6? zFRbMUfb&CNm9xl;XLf`r{B$c<*FJy#43C$3IZyX4eMMmChfGeDCy?y%Ki*zQkt#GB zUHtc;ukS>^mZJui;;hZxaETV!3Ww zGmNj5G-6lt^S`Z$I^6n2NePT*NC2?-= z7#}b31fKacL7N0&%JcK4PadoA)LwH5e&nF>FNDKEl%e%>nuDv}LzFh$>{rq+7cc^g z#f&bu1aO9d@5|XU)x%D!{69AUqa@N@j6CvQm9}hxU0*T*hCq3=z+tq4y|=x2&m|aL zE&a2JiqVN8U8uX z1_%;H87LBlP|v*Vlld_W%uHediNS}-nK6NC+UNNfl$aD7fx(tF2mnZ&CL!)>?|FXL z22&>iU{u}rTEH1Dk@Ijx+E=Rj=P#0mw5|mN%H8K_>2QZgJf;2qhP>`0Fo@u)zoo+j znY&tYSw)VtR8`>Y!#ifhXKks2;;%#IzTTlBAOCI1#T|6WoL=fZZ9MbPWhVcqmke9YVk=~yWF zW1#w&?oeLI=zP(pB$>Ya=S@@mWQ=HDZ^1YdkaTcxd1z>g4adDoeqaZ6Tj<~0bL`&l zb`wHM8A1Yo-^l3_SBj~9=`Qcc>fW|qO+WAE4F=!lXzH_P3@eNmr>k?|;uS*0OE|(7 zgN$AJGwDjwwRl1Wy?@5z zl&^WjH7Dw9pK6SI`p_`-;U&tVQ+{EwRz|q7>z4%o%Pw7e=ojO`rRu^YA!u2nKL(vH z-B^%c6P+s>|KcV+GGq971{zer9qVZuGbcM7%*Ue*4<6P^)Xk!mCCk<&( z^9mx5vppa_Y@Mj7c=*LfM9<&LyapNUfu3zjFm!s+wV{&qxPI}Qa(e{RaK_V*>e3r4 z>HasPH#axcg+omb@gbS{_nqwpLr`VhN?(!0>v1HVHVpnvJ7RQ)=@UiN07A3gdV1Hf zzodbS;Xs!S-kI#EDF3dt%+Eb=BK3!_AM}L^>0hd_^;o4@&s4RgGrZv=_g@CCM5Uho zRsd#@)z@p6OtU%-`|I@EhJ!}=o9qT$c zLjiwEk)j5Ob>oOP2>~nc`7?(J^~dow&l8kuYK=x>`j;bKi1}^y3*gfL++nj`Jffna zj~+Sw$#}ZEyBnC`hsTb`#>PJXa%*X2g}Bp7!z^l7Yyh(xNRwt3v3XS;91#(LMi6C$ zg@pwLE0h!XZIQLovq%#^%fU>Dl2Z3*j_FBz?Q<^l933u1!E7eM;4jRg%?pu|s(a87rm_x6+bQi&t>WuzgWyMQ zo2!Hm!0y|c zYS)Z(pS`XG6Titd7vOHb>4;=$4WaU0FUV{E!fes(h3ONex%D{TtSA2CC7Q^nsHo7; zS1>yxZS9dyY4O%Q(G2isc{6>qJqtjx`q^EI;4JeQd;qiNFK&3GIV z3A6Xdj_LwbZSp<;Khnr>f|cWW1<&oww}qczH{1b& zw%DpkV@Ck$Od|aKh1%WGv%XtXH4xs;!pC8X4*?#!ra0UVX zaTt^8bD7_IVZqG!Gea-gDU$Ya0_M@-KWcmyT;6qHbX}J^vVJVoP&wV8E zDxlQ{^$*1T+GlpClwA-llkoGGOPzO*0xrYeVwZj6Zu=GtWoLY}7^Ak`i0NNlT?P1* zsH;<=FYLVBYvOm*mJ;3o(7^w6fekk81jx2QFMXjM@SbX_1pa6x-CWQOkVM#wn*l)J zb7sgg1mSpfFzXTxYsBZzw9%hfz1{;fAc@6U9fs9A0)BEXMK zTLLbzdd$_Yq)`~^!Cls9WKXZX`dkQ53FUi`I=q(h$Sf?hkw`dUVqzN3Q=_4TG-JmM z6e4dQtrwMD)PGg|elSJcxp$ujJRnPK3_aZ+R)c(ck}xgFAtEv+)!EfW8(pB4x4gU@ z*4gNZdGPZ4L-XG6aXh+7wyNJBK9xTk_qV7NZnZg4QPzCC4%|O4+@|NO=Sog)?oHdo zeFHzYhLSLS+{u?W!~v>SPB-;=KEfkap2L0anX4pkHz3G`mKQ^F2)QYYv!;Kr1j1My=uz}|;H6PB0_aq3Q$4ZhzT>zDs|WM^js zI>2VSZqTrtTTpN}PS=>rtF_h^IaXr8Al9@LZxGf$;wpCg%Prxlinj^{!Ki?U2ue)L znoAPbl$7uM=LJ_qq4w{RR}R*O^8j&{blda*Brs1ceKtoq0odB-@b9O#TpoMigqMgH zFJ6S-Jo+pVz>&@GQjDc!mo=4kY|M-+i7>v!h## zm+6yonRU%t>3(yG$L{0`=Ch)loLt2Q7Z(@!TUwgkgI+J}dYnx;z_;bb$<0lh@SMX> zRx@xca91%H3_BPspA8AW*=AS%ikG8s@51R`kHGTJNsDwN7oxGVBr21dO~yub$*9V_ z?{IekVEqgr=7duWz|>Pro#Vpu2u4B2`QI&l{0Ti$tAJwEvq*)yvHhCN{!Evvl6;&_ zlzI~~o077*l9v1)hAeu2%i)QsOu47J6HD>Xt=BG(0c_M+f+au+3j>7h@uGv5yk__! zK-$7Om-~{#A%<1e*6pegjas`I{k&2JD_wf*iFmCFvdio|MyK=Y8dP;37&p zw1x{bi&>BHI)D1%q@<$K1YFc}d4Z46!3@Ul`9*zu_+Y(h(gyMbOgiypy3EYWM$s9U z7;#1K-T5|uz!U;pgZ#FtkpVOvplf@2dmrarLL*@Ue=6JFBuaa`l^Hhy)CPcj+%Utc zIK^qT`bQz$$P+jDnWIjWlMq7`QWdwmGOa{*itbse%BROy~RyTba&(w{oL z@d74(KQAz(_~Ir3Be^!yZ~$nFhhF=u(%v}Ig-VrheMHd+SPG*iFRX!mlUeD+Q(SGhRjj@lZ`>L@j80N5{TGf{qoSpl^1k~!58ps@Mj(Pg2J z?PnYPi3B;^NG< z{YG+Cn4Q1Yw*H-H_Vu2DyY?B5RJ`qwB^T_FXOaitywG7Z&D+af8DOxjVii^dV8<1j=`FnXl_! zJ$%4Ha^;~VUQ~OVVzKKZQeF4L|a@{iHWkwqzyxZ!ZzeQ!ug@DDbz-47+ z0UpkKbF@X8XM3^vg7)4CmGd2!f-n_Y0k~;33T;7U0U(g^{Bq%0pZ8_NVas6pxe58t zVKT3;@cf8$+7-^}J&~qO=&1p;3ZM!BdCDAT22gzeCqpCa`DaBPoiPCE_0b|-gdbj$ zSr70qK3=3ci)4VN0?wA1xw!}c@ap`~8Bb47K%@^mqyW6dE~FNGE_`;uW9ArZexwUk zE&vhnPiQr?A%ZXp9i@!394|bXCJEHY<;Ne&OrJz=;9etAO^a2^KuL6JD?m$2aq0uE}SJL0zh|ofdHKJ z@H!AgI`2PkOB(of_J89R!B@|lB2Xx7*iRJ+n!^s3tinp=90LSb&5M;YZ%q#8Mr29B zC&=Mq{u2;kYoPB_CQ<|oy7Qa+TEGf^rzlj)MNO7AvB9+7({Ycv zD#?X)2YYIE4$X`zT}h>p6>mcy(D%~BemoX(P_eno{_z6U(JcNmftws@pT6E%GKLhyDaxl$o;;zcVMOUkFrSHcC z-DTTJaZeaEE5aN7!@wRcC5saFnCMA{ZE;~gYHv22C*h<0Hr{FWpu@y~npG76cOTDJ zv^a52Dlu-b9iM&nWqn-4#P{7!AO0Bk9WyiZDLrLxJcLCTw+;pu5vQ&*({X_TIuz;H zM@EHTkKQ(#@;hAfp-mK9pAD*86)8!Qd9;p&^yq|#j^`l`)1{v-#Go0n4!h+nyg;#ykx%pLYe>5Q0ED5}T|!Za48-r{rxWSjN{PqAk-h>9{LF zHmp+=MNCRd6tY{K(KQ;w))Erj8=N|O%lslD!#Izg!d>iG_C?9ElYg_DIRJ4)(4{Rf z;_*8w#D2LoqSxexoW9Vrjo7$|8C}d4qZJg&9^WW3f$7AAa9NAkL`8+$jnx?!#Zv*N zv$CKz(e)p(t+&GTJsr$V)w3f5kX`v~jjXz&VCdM)rafVI)O7s0h z)tVlcI-U!q3y07}$E#2nh!(}&Q;{ob#! zi}IM|5GtzyqNQ2a^Xv0(o_6(IJ0jogQQ4ebu4&`9-=7 z>y+iGZ}Ue?x_+aRfA^%$1w@`1k_qzfIWkI~Xhtuc3=}mQ2C6 zheu7=j1{2$YrIi^FI~d3KTN3mP8c_q+HWSnU;E&&15wn?Tn@hTS_k)jL+mG;SAJoT zX-GoxBQKfFK>svnw-~gaVZGPZ7<1X$YvYK|k*6r;EQuQHquCBjvr%0pv4+9KZ`X6_ zh?N8=NI1c%-5ys3C=@TQ8u>*)Ye`8SWv!J-zg~98$gkNL;|a?zEaWUKEDQ_HB!2=f znN4J=E2^S{r@=3f*!mYPF-N@?f*ZsfLi_Gm*fQy6?;R`hplTSToc!?b1{ca2Kzy}Ywyr=PchH0~2cUd4{R#Xi zo@YMLV=`qys@xO40cyWD;u8p4C(h9(@_zVsS=<9u`2lZ#zEbU&%i^{)Q!v+Y3cR*Q zUpyTyA;S;eUu!y8JZD$7+f(j!*Pe;Ay@MC@#RV}@t>*_kFA=$4cuuoQ56oCgeUkfP zO4JPLMNh-(E?$Wz624=jEHClwg(U-` z93}X!Bb?&VNu$#f`Qt{X4CHTLu+u{WHmL>0Dh@XTG;+{yIW>~AxB;>QFg8EPDSgtPmFx7gD+5;(yF zSmhKaQh7~c?Lt|-k?yL+6-xA4w5OV z#mbkoNsJEo52T*x`bG8}+9nvtPuq-=ZL&o*H)YF@(V7BZfOlbv$YWe~{sKEp7&;iq zSGZIjZ|%uf#&7gsbH<|uGl0oDt_`n)8~yGS7%D16kr*4W{-eG3jB4lzzckXbYqCFc z4W_L13AvJ9^{|;IjYWSyDV{gkU`h6p|+AEk5YV#kh{ESUTNr`P%J*KU%RQVn8 zv`fiyA%mGiKg961&{9XSJ)s*Z)%=$kHtIDWzAsaDdv&z?$OU!SkjGXKwoUes3u)TW zWv5fxOo`&Vj)QmC6fP&9<$k>d$A$r6EO!{7LBW}TLIplq-?D~>7IGJ6hH0jR-jL+S zRgHYqR3mK?bbHw3f8uUm<^~lN7H)X$r2cW8Nzo_U>nHSAxZS3<#?B^4c2X9TRF5sp z;G-p(X91NLY9ymu?VLX^F4t4G=DV;L7EW#He44rWQjJ6h5T`*o5+kuGQprR5E93a> zG9T&T|B%OTdSwsK59`>%-3rlIyQvMWL6%TA@O7qWPZs`emRyeA7sP${Oj6ywx#~V zkNIT!igDfiNe&PG$3W-q{uz()i~gNRG8ykE{-A78z;(V&I0`XYV;*X2@YY&=yMu0+ z2INXCWV5qVU_4CE4?&scm_5cW$<8+McNco-n9$Tn%v?Eu=4O##2w3OH_YDX?vMOwL zFEWuIqUlaht@_yn5S!c!pcV1SWZal>7lWfxP;T4WHQgC3AzJB= zQ!w`2R#U-z?&J~Wpb`_{-ftqKKf?KgH^Nw2@x(UJA4u8yR2quP(?xf1U@4&s{@c5o zeSf^GUG6{g(&^|Lc=lcH@!8xRP%i1YUb0a zr%UUNM;jPGI8E5TyF3+A$ZsYi_2i+P{u$M;4F2U(2PI}x+}27l*F<>1dq?Pcu#@LT zsLYByqujQ(@+nrE{%tQr{f=IhBJH8T z!rJ7TQSy{*bDmpA2=0f_aJ-#+qJXXVqObc4oR%)f{`Pp{x0(Jjqv?MA5)7Y zbQ|F_ds&1@Wz8I$7R|*pNjtlC2wzIp@q^o)dsIFv>Y)g7fd0fR*u!eGvh0hQa|BL$ zbQTuk;k%}XSaGv4RsKBsEi2WLcD)#d=}x;iT~gqSwS$EkPE1E%FJkE&S}E>gb8_r0 zI`>UJ+g93OfB~26F5~8DNOaE9&wB;Qw$@Tuplu*bZ`GG4K9ir8A^uX>7!4oZ-eyhR z+VjVGZ(GCe;j0Tw)k5sIpK&c4taljLefM(cGme^^YLb4tjkxz*UK_$n%2EFo}SwQRdz>P3v@ zA4Ba{8O43|RQ1!M8TDqrH(BKw$d{t8S*98P>3toUaWh)6p^~TXWK)#sM93FO?cFzR z-8@p7#&^x+q&ECJ-ePvFb(X$>pVm^=O>GbdW5JDujma+-Pl;fZoFX28^)CD?eNp%k z0IZ}44~e9r#Rk*Lmg!X>Mw0!NngqDpb^7CFiR`-a?Y&)$LLBT4yTd4_O9#BXXD_jC z%KqF|_CuJ+->zK<6dyA7@F8|6ppNf1=<=-4+mZyx0M21UShE1zFYH4VTPX)8W-wL*T$zo1&~T?jls9Gx)&Q= zS1~B(O9v63D~rID3;DXgxxfb0o=UbqAhyY&yfZp~N(zkRaqkY@a*lvw!#fj-FaWpk z?Iktx?}mROf+r9-PbWjd`%hr7NpZgxy=9_}EvjXE?>LKP-Sf*9xY8|sMZMOTN1vUX zsCwdhvm4|?pznTGX4$jMXxmVfK&1^?EOx8;VDE;xi_ZNx`&ak3kyovd!|oI=dN^Sv zdx@z;vzS)IY`&3Fg|;ZS*ARL<|Eff*cqUmg4gVm^IORT_%)C9#aAn0`zBSXKPtDW=+@ zRE_gEzG{79dz}@(!=b=n%kNRAyNM(!iD>O+cC5SEZ+p0m4c;Y6-rCSc_&sbZzD{za zK!tp5{+W7JOJAcC>DU-pzWD`}7tlGLoO;^%|Eh4UN{X0v1+6w=4qwCxOzx za@R_ZV9m|Ci2+R-C25k>Uvs)Ud$B;G!E{JQB|6Y3iw;~vEa{v~{$YZYsl1IQpPzE& z7bnQy#eGY|Br{<kY{CR!x#K8gUCSl_S9oe2#d-kPlu$q1n-z4@z6c zFW{Sg)YU!x<&qR2{`t+jG=|r`5BAyF_y=fd0pM8ISWXNPzcXaGNhfB6T=oT(qVD0g z>P6c*#3AWn~`gYve!~a(YDw=DJA(OIVYUUmE*w-egPQrh;15zS)+- z9pgDl!-%WnDF+G5DX8Cq`QH0Mo=gM%J#`zuRyBMVP{t|JF6R1x;qKs%!mJUZbeH>y zYD%p^TH2sXq~lZE?y3f0lYYw_{2VnurjK6P-nTt!iq-oGlPSRB-97WzES8zU*BLa% z@Lhvb`widt3imf|=xs!&^0?JqbdB=c+^Zw3Jg-r$2vZ!-jcjLk!`CC7iT4G+#PEWD zO<0o7xXg2xy5()2F{>DVXSC*US?DRQNrM1NVay3r)CtsRmsYXX<1Gvg%~ULT&xbS% zRm?V;j9d1_B}d>Bn{7Wef#-41u3JW=tpe5sMv9&!L}}=J=PR}RCOlTaKefs2B{;Cf zCe4BGP`O~%xJ!tNGCrC5SuKSR6QM<;5)F^Y9g85VW*~y=Uk&TSO4F*u5mMPL@M#UE z_}w~5Kv7=7JlYzooFY28&d$taA-u)R4(T1S3sK{6=>7BmWYI@>p$%6@R@L|nh&$dh z!FeHfhdb82MRYxG?>UP;Ai!IFv9afjk|qGR(N1y`5A4**v%qh&%(-BMov*&IL9tvW z;Bay(Akax^X#dreHhQhcd1@5qZev>1dx

Bafjn=iv~J99P&c;*?>2M53AHSo1IX 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 literal 0 HcmV?d00001 diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-menu-loading-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-menu-loading-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..32a60c7b42a1dee75f92b8bd8d05132b42f1d473 GIT binary patch literal 6317 zcmeHMXH-*Lw+%J~X-W~PSLyIcQRzY`3WCy`bQ{tXqy`8@K`c~3M5IL!r5XeYp@kp_ zQF;#&k_e%O5+s38QoeKF81MJ@-k&$d8{_6r&e+L0d#}0XoNKRrUfNol^Ky%EgFql& zi)&ZxK_HI9Akd-T#}5G`(y7VkfiI3Qdvg;Id{ANq1QPYNxMJ)WRk)6iev}hYjQKM( z)~xsRhzW>m-sshV!1!5lBO|*rzp_dreRD!@A#O%S`b=cM^U*!xBYO1SjBta9rQ(@P zC)@k3A>ACZ+*gd=mE>eQ*XZbNo;EH^qt^~jPEIl82JN^;PD>*}A?{@BB11u*W2k}*(ykcvnvu-rUhDuV zKRNTYC-&o!OLm4ZwX^Mebl-Q199DTlOR0gA{h!34>PB}{UcTJf$pS__sZBbKT#rjj z&*?&rT(b`kza$4r$;g=N6?<>1_+5+RH>#q8J|zz-J{g zC(Lt9Svjf1R$a7Zl;2S=L-6Em>gHbQ-O_V1=iqB~u`zi)gFv2lcl2Ihc+r%s}lPvm6(ys90B_J5^L1zZAHL zUc19<-??(5y<|Ux(UwiCws3o@Uw|te30n zFJD-kNc)P8^})`%e&m{{u&@&vtSHLECvE6qkA-`_{g(~EmxCZ zAX?nMBpr*yucxMEmvtS?@UkWK@&dc|nJ2!L6WTZ6tHMG;Ga(pB&HMYY?KB!qf1~N{ zWQ}WOW##r(k_Q&w;QzX8Zf-8d^(?uf7?vvRqkK7F?C?fJ4|{P<)pqEH@6=FiCeh1v zw@7v&2%^#}BhrUu|6~(l zRzKIa?_1hqG9;zrcV|;sqXlJv+`Cgx?=kBx!eZP;YZI8Xx$e~Bm;mSVQf~S|_!>{U z?KxUU>eyjjTq1n6SSdvM+KH$HuXlD4tSyQf@3YgpeS^b$CvLzD@f5m(ygZ+%`g$_kaKX9YTo4v?80Dnqr>J9tC(wY6=H{7VngPE%o&fZM zuO3VKhLM8yhZF*AYK9lQeG92O1>~x&^%<}DVoQ**@e^d`c&Z&$~7JDA@g-#J|}8 z?qc9%%{mULAS>Gh*Y_QiumBiL&6U;-oliS+QAE{acmA~vpQIkm9K3I5Y-}7={v)LD z=n0V<`Imn7{iUyuQ{g@>Bq)eC3WVcAOb|<`^;<6bAQowQxTNjtbsGUDi+ni@F3$hzDkS_wF5hl~3$ag=cG+SOC6ddmTw^_Z^a=ENdw# z`F~41I&pfc6%y>_<)to~_Tt4W8nAF@Vgdbt3F!WSPN}WKdYRt7U7~#wfM#JHUuYN? zgYZsN`Pq6-vT`v`*X$ zLQ+v{&*Y3mv`vQdXSazwSYhG6R^~1G6y@X=7{Z^*%YA))q2@SEJ`1_+wO@dL6blOr z59Di}NH$plCD_*Cvt6)2SyavNULp!lAQOr`6?ANaa32)GJ0#q(yVFdz z0=((JVy=zHA3RTy=#DXqfl=FdtO{z+*uxxVRQg<-t+MpC^m2( z9WF5~w<_5AsQ}}Vx~$XIK^+34Ll=5a$cJm}?d^3v<2^x~X^E(Yr0M$&zaRNv4sE?j z(D);0bGa^jWpsIY`HhMTA%V@zKE^LqSX9K^TY`b9{TH)KOG^QRoJ0l_fvpxrU~Y4^ zYgW_T%nS~A>F(yNJ2D7JOUR8IH*|Czwf#qH1Nx(Pel?$V-KiR1c*Vvgm5426ko{IC zKWk`c;9DWyb$7a73Mvrd57q%NG2PwkQ*~YLf1N-7aPIp{KrFLi<^b!_3%Tz0_VxfD zNCSH-HVM;k&sNRA$(-EWjcG(6i?NrLl?6PKx{;oi=23soA{~YUq_5=g$q}3yW6a#& z)(@GxvTOIjEL|_*T}4F&kPfHMT`XGcRCIA6!hM2HfOi%22C8cH{ zV<_E;p*^jW2=IyUh=hQP&sJCQBfzo%x&o{L>aCTfrI>b*2fz-1IYG?}BEcNkh~TE# zXMmGg0k#n$feF!zAkRypV>s)xbJe^J;~Bev__{F|`pVc6lTIYo`}7&mXB-MRJT~zn zc6N3Ud;}I4i(H$sW2)busB!`nQyp({Rz~J7sV5ymj6*`~Ra8{^paq_{Z{LoLj8qq0 z!`2d8DebuSxPwjpE%`YT=__FI%q}8hQ5(2hKS9*bHX_Dl2Xb^nKXo1P`D%7P#ycEc z;iT_773Z?4wYIgjWdPlwt^FFKfR`?c0I>toN$q28a;Jh0c2Goup>Mm=TY);IO> zRn<9;@TbfeUN~3j$z(VYqn9KpTZiJWojVun$udB|bF4WS9MBR(6W2x*e_Dlzghzqi46Fxn|0$`~o`}l= z2XuI7;p5fgL;)Vrc1^Zd_kY-{{R7lLK>goK?~2wAD8Ip0(b3Vv z-ab^>&``C~>CRpLa*Gd7%^uZ%@jJ)>C$t~*p$_<-`VJQVsg8VzyF_lvzhv3;skgTe zTfW~yJJ@fm1&S=l4)(+8DQSE(4Xys3 zn{Ln{pMDCS1w6BjwpH!3u#g?JmZ!H!F~d)3AnG`izbekU>BP^?r>e2xZEYr_lBO3h z45lI`L=0-H!zp*EDJ7+&v%9a2Cw_}G`@xKWpOWc3`Y31ex8d$4iIO4pcAUNFb?*_r z^yxDvM~|&p^IzGg<_a>U=|*??IZt2Z;tizc4pmiE$)>Y@zQ|i%?vdhCO*tht2?G;l zl=PGXZuNXlHxTjQmb>(RE_*aFxc$vI62cG5^xlq0Pbfa-c=P6(RoTbJT2fVp6i}D% z-HzkoKHcLwe$3I{jcg_R9fS2TI7*DwhZ0OIhWZO<8m;UN()pHd6%0Qn2WBq+#y&^A zyo<3J@8b?JwDdDNf9ipQt$j?D>Z+1z-NWmBB3#=VsvaO<_T2OCQG(C8+bjEG+70jF zo__x>^4~x0E`|`y`6AbU0((;zWVWqhL!eD@8Q(fiGd2A)MWfT!q>GG2mecE=g4Y=g z^5mB|4D9fmH`)92btmG7F4vslFBdqcjw1Lc-WbkA;OW@=7NHUfZOWI9So+=k zxjucLuc`YWZ;;(af36a@yG2ApXj5Dkrkp+v{`jifJ;&`j5$gL2G7Ofe#p+irHc?t@ zob{v{TSLr4S=m3RVYfpm0Y5ZM2Av+%hkT4&SVT4LLI~j$DSS_6D>|Cmbp2o6F=Sf3 zHi1xd@CITxN0d6~wkp#1s{W>Bm-8t70b_n_LB$1%UI%i7X8tMaI_4XLOCbYYiT3?q z_pci=6h+<6C1}(d^9*u3u*^>TY|f+gScEovfrxV5XF4?k9VKp`zLJ+a4eS$dsYlg+ zS?>5|nlQb0Ro%}Unl-Nc$D0-MASU3snPh~6F&Ea+HG1zL@T=i;gC-*!{eF450=gk_ zVGdprTQ-|t@?U~j9s_SMVqG>^hrL~36zX0}_{J0xl9`6vSNN_S+{U4GHD@?4vBWkc z1n8`lbOW*kV6OzEzhOkhxa2@{F^6s`atO$Qo}B{O{d4&b4*%at@M^Us2UJmCpM45c zq#FjX8t9kp4&}E160NFIwls2p%>Ouv2?0*G-GJ8h>eZvZb|YoUCM8|Z`JrPukL7zK z@JXEf&rHr*tVx!vC@U&f)YOCn4Tpq9R=R=IZ?_Z2k~sM!Dypis_8wgSt-~kx-d{;o zm9>KlmU9|<{P0lzE8rvu*xDaWGG6j{Ah_AJ1e|dB_}JNv0R3R#KWNlP%36Nqe4sv&5Sa(k5B?AMCpr?yt zNX4ADcf2!VLS+s-EKXOueDT7yEt$c$)x@&i9`c>Iqi`YH#U^g~D?*0cN9St%I55>a zut2$VWe00vu!fQbi`T(cZgZ}v%^a7m33wfh3R<*f?w+)D+>3=Xt@VwI)#tsBzI$h; zV*Aa%&+6ZK9&?{|=>O5qoBP&G2fD^$PKfN7v)?|vfT6CY40yy#hQAn+VrH< z%!Spff#Lli>{=!Fms^r=Hka#~SEeif`gHizQ|{jTX2w(Nz6O3hvAQk;XxE7u=?%9h zE_?VT{c8QcnkPH&Twec#{d#mLS&xb^> zy)STR>CIcE|EGP86$IL>Ydk9_r*7R-^@{Xmm)`qb?d!Z(yc>VLuaiEN$yTMT$=mU)z4CdRu@jU;0`ReVo*K=R)$+oy@ z_vAu4P-@;|kr&5)nYW*=k3a9TTyaV1y_(|-)?Nha-Frgp#WA;cdEcV7?#h+DGy4ZL z@P#YWj*ScVp8U)Iytr3wcQo6f=6>;CU9nN3Aj>}T6a;^h^(lL=9b*w5t8xDi@9i>` z-ENbPd;vOQK{)4wG*R=`zu%>10OL3(q>B&aGL8hG&P56hK-YIPF#zL1feRFGRFzN( kzPvwWFVJj;7dz}3O`Q)PO1|Y<3*<6*y85}Sb4q9e065*Z<^TWy literal 0 HcmV?d00001 diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-nav-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-nav-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..6587c1b481c16ae016a1fbb42c4fa09f480a3c02 GIT binary patch literal 1117 zcmeAS@N?(olHy`uVBq!ia0y~yUKWNlP%36Nqe4sv&5Sa(k5B?AMCxTlL_ zNX4ADcYHHsLKzNxG~a#FOe)9xua~K>VAj_K9v3TKI`S@J$iUFi#K6YDpuoi>!NAa_4PN*w^aT-^Ys4VlkYG0xB=6_0VBpc zeM^tt`uJeig!liS^R_k`m<3jEd+yH#4B>{JwI2@Mso#J3_L-UY%&mp%ek?2c=w$UT zr7k1*(wXo)$yKt`^-BwKfbKLoJbPvD*;vl_x@{pVw|rasWtQjtBQDkq3=Y@cFx|b; zx%g@r&=~~}bKX`Iygk*&0W^Ht%vm`(Wy_wLSDg1*?#_30Tj#x9i&utT2AWpVr+T3` zboJMD)AU=LfB!dg++!lYj4wp|`E>g{8P40~5XW&o_@DKz=*O46Rh@gDZ>?EW4@@ST z(!^h!ld3oSe!=+KOlAg#l=D0V%SG4@J(2#|`TVLr&^`VexJ#_Lm=nKie?3+9w_sDT z&Gv`a^!hk~F4}d5Vf*5G-y5H^>|O@~opFJQy9Au{Bp)1GclYqmFCSm|roVpsa!;zs zO@o}v=|C;>CQtENy5{(Xq^_e$>i^zMT(4z6-(&Wk%Ihw5Ps$j1fMyiyH0I^pmOX2? zv~l*~XSc6_+@LRXpqDq_SFXZhe)g7^S8px+@ZfRn-&Va|V2m_Oi(tCDruApRyO7d# zHGfyXHdl?_rrLQk9w-%;D!e95^jgc?^4SK!yb-ZhL>B1GK!F25(#4Sh=wAU=kfjbH rECy7T@L1OWf67;2=3`j!_#ex&ZD+q~+TXJWav3~b{an^LB{Ts5<2=Lu literal 0 HcmV?d00001 From bf6cd61c7911e9ad09cd8348426dcc7cf5601b3c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 14 May 2025 14:05:51 +0100 Subject: [PATCH 07/15] Add missing files --- ...atic-config-should-render-1-linux.aria.yml | 6 ++++ ...atic-config-should-render-2-linux.aria.yml | 13 +++++++++ ...tion-config-should-render-1-linux.aria.yml | 6 ++++ ...tion-config-should-render-2-linux.aria.yml | 28 +++++++++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-static-config-should-render-1-linux.aria.yml create mode 100644 modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-static-config-should-render-2-linux.aria.yml create mode 100644 modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-univention-config-should-render-1-linux.aria.yml create mode 100644 modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-univention-config-should-render-2-linux.aria.yml diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-static-config-should-render-1-linux.aria.yml b/modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-static-config-should-render-1-linux.aria.yml new file mode 100644 index 0000000000..602fa03a65 --- /dev/null +++ b/modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-static-config-should-render-1-linux.aria.yml @@ -0,0 +1,6 @@ +- navigation: + - button "Show menu": + - img + - link "Show portal": + - /url: https://example.com/portal + - img "Portal logo" diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-static-config-should-render-2-linux.aria.yml b/modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-static-config-should-render-2-linux.aria.yml new file mode 100644 index 0000000000..3ce946d830 --- /dev/null +++ b/modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-static-config-should-render-2-linux.aria.yml @@ -0,0 +1,13 @@ +- dialog "Portal logo Close menu": + - heading "Portal logo Close menu" [level=2]: + - img "Portal logo" + - button "Close menu": + - img + - heading "Applications" [level=2] + - link "E-Mail": + - /url: https://example.com/email + - link "Riot": + - /url: https://riot.im/app + - heading "Links" [level=2] + - link "Link": + - /url: https://example.com/link1 diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-univention-config-should-render-1-linux.aria.yml b/modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-univention-config-should-render-1-linux.aria.yml new file mode 100644 index 0000000000..602fa03a65 --- /dev/null +++ b/modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-univention-config-should-render-1-linux.aria.yml @@ -0,0 +1,6 @@ +- navigation: + - button "Show menu": + - img + - link "Show portal": + - /url: https://example.com/portal + - img "Portal logo" diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-univention-config-should-render-2-linux.aria.yml b/modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-univention-config-should-render-2-linux.aria.yml new file mode 100644 index 0000000000..47446acc17 --- /dev/null +++ b/modules/banner/element-web/tests/snapshots/banner.spec.ts/Banner-univention-config-should-render-2-linux.aria.yml @@ -0,0 +1,28 @@ +- dialog "Portal logo Close menu": + - heading "Portal logo Close menu" [level=2]: + - img "Portal logo" + - button "Close menu": + - img + - heading "Anwendungen" [level=2] + - link "Portal": + - /url: https://example.com/app1 + - link "Aufgaben": + - /url: https://example.com/app2 + - link "Chat": + - /url: https://example.com/app3 + - link "Dateien": + - /url: https://example.com/ap4 + - link "E-Mail": + - /url: https://example.com/email + - link "Kelender": + - /url: https://example.com/app6 + - link "Kontakte": + - /url: https://example.com/app7 + - link "Notizen": + - /url: https://example.com/app8 + - link "Projekte": + - /url: https://example.com/app9 + - link "Videokonferenz": + - /url: https://example.com/app10 + - link "Wiki": + - /url: https://example.com/app11 From 363d0a76545e0dd55ec889f33dddb2ea07051d87 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 15 May 2025 17:03:02 +0100 Subject: [PATCH 08/15] Stash --- modules/banner/element-web/src/Banner.tsx | 28 +++---- modules/banner/element-web/src/Logo.tsx | 11 ++- modules/banner/element-web/src/Menu.tsx | 65 +++++++++------- .../src/Univention/SilentLogin.tsx | 3 +- modules/banner/element-web/src/index.tsx | 4 +- modules/banner/element-web/src/theme.ts | 78 +++++-------------- .../banner/element-web/tests/banner.spec.ts | 3 +- 7 files changed, 81 insertions(+), 111 deletions(-) diff --git a/modules/banner/element-web/src/Banner.tsx b/modules/banner/element-web/src/Banner.tsx index 2d957f9b6e..310f584312 100644 --- a/modules/banner/element-web/src/Banner.tsx +++ b/modules/banner/element-web/src/Banner.tsx @@ -8,26 +8,25 @@ Please see LICENSE files in the repository root for full details. import { type FC } from "react"; import styled, { ThemeProvider } from "styled-components"; import { type Api } from "@element-hq/element-web-module-api"; +import { Heading } from "@vector-im/compound-web"; import { type ModuleConfig } from "./config"; import UniventionMenu from "./Univention/Menu"; import Menu from "./Menu"; -import { theme } from "./theme"; import Logo from "./Logo.tsx"; +import { theme } from "./theme.ts"; const Root = styled.nav` - background-color: ${({ theme }): string => theme.compound.color.bgCanvasDefault}; - border-bottom: ${({ theme }): string => theme.navbar.border}; - height: ${({ theme }): string => theme.navbar.height}; - display: grid; - grid-template-columns: ${({ theme }): string => `${theme.navbar.triggerWidth} auto`}; - gap: 24px; + height: ${({ theme }): string => theme.bannerHeight}; + background-color: ${({ theme }): string => theme.bannerBackgroundColor}; + border-bottom: "1px solid var(--cpd-color-bg-subtle-primary)"; + display: flex; + gap: var(--cpd-space-3x); `; -const Main = styled.div` +const LogoContainer = styled.div` display: flex; - align-items: center; - grid-column: 2; + padding: var(--cpd-space-3x) 0; `; interface Props { @@ -54,9 +53,12 @@ const Banner: FC = ({ api, logoUrl, href, menu }) => { {menuJsx} -

- -
+ + + + + {api.config.get("brand")} + ); diff --git a/modules/banner/element-web/src/Logo.tsx b/modules/banner/element-web/src/Logo.tsx index d515cfdb4e..485f5afbbf 100644 --- a/modules/banner/element-web/src/Logo.tsx +++ b/modules/banner/element-web/src/Logo.tsx @@ -13,19 +13,22 @@ const Anchor = styled.a` display: flex; `; -const Image = styled.img` - height: ${({ theme }): string => theme.navbar.logoHeight}; +const Image = styled.img<{ + height?: string; +}>` align-self: center; + height: ${({ height }): string => height ?? "32px"}; `; interface Props { api: Api; src: string; + height?: string; href?: string; } -const Logo: FC = ({ api, src, href }) => { - const img = {api.i18n.translate("logo_alt")}; +const Logo: FC = ({ api, src, href, height }) => { + const img = {api.i18n.translate("logo_alt")}; if (!href) return img; diff --git a/modules/banner/element-web/src/Menu.tsx b/modules/banner/element-web/src/Menu.tsx index 7b32d53c56..e77dfaf67b 100644 --- a/modules/banner/element-web/src/Menu.tsx +++ b/modules/banner/element-web/src/Menu.tsx @@ -8,47 +8,47 @@ Please see LICENSE files in the repository root for full details. import { type FC, type JSX, useState } from "react"; import { AnimatePresence, motion } from "framer-motion"; import * as Dialog from "@radix-ui/react-dialog"; -import styled from "styled-components"; +import styled, { useTheme } from "styled-components"; import { InlineSpinner } from "@vector-im/compound-web"; import { StaticConfig } from "./config"; -import { theme } from "./theme"; import type { Api } from "@element-hq/element-web-module-api"; import Logo from "./Logo.tsx"; const Sidebar = styled(motion.div)` - padding: 16px 12px 0; - box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3); + padding: 0 var(--cpd-space-3x) var(--cpd-space-4x); + box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.1); overflow: auto; position: fixed; left: 0; top: 0; height: 100%; - width: ${({ theme }): string => theme.menu.width}; - background: white; - border-top-right-radius: 16px; - border-bottom-right-radius: 16px; + width: ${({ theme }): string => theme.menuWidth}; + background: ${({ theme }): string => theme.menuBackgroundColor}; + border-radius: 0 16px 16px 0; `; const SidebarHeading = styled.div` display: flex; justify-content: space-between; align-items: center; - margin-bottom: 20px; + margin-bottom: 20px; // TODO check `; -const Launcher = styled.button` +const Trigger = styled.button` align-items: center; border: none; - color: ${({ theme }): string => theme.compound.color.textPrimary}; cursor: pointer; display: flex; + background-color: ${({ theme }): string => theme.triggerBackgroundColor}; + color: ${({ theme }): string => theme.triggerColor}; + width: ${({ theme }): string => theme.triggerWidth}; &:hover, &:focus, &[data-expanded="true"] { - background-color: ${({ theme }): string => theme.color.accent}; - color: #ffffff; + background-color: ${({ theme }): string => theme.triggerBackgroundColorHover}; + color: ${({ theme }): string => theme.triggerColorHover}; } svg { @@ -71,39 +71,43 @@ const CloseButton = styled.button` &:hover, &:focus { - background-color: rgba(238, 239, 242, 1); + background-color: ${({ theme }): string => theme.menuButtonBackgroundColorHover}; } `; const CategoryHeading = styled.h2` font-weight: 700; font-size: 12px; - color: #203257; + color: #203257; // TODO font margin-top: 16px; margin-bottom: 8px; `; const LinkButton = styled.a` - font-size: 14px; - color: #000000; + font-size: 14px; // TODO font + color: var(--cpd-color-text-action-primary); font-weight: 500; display: flex; border-radius: 8px; padding: 8px; align-items: center; + &:link { + color: var(--cpd-color-text-action-primary); // TODO + } + &:hover { - background-color: #eeeff2; + background-color: #eeeff2; // TODO } `; const LinkLogo = styled.img` height: 24px; width: 24px; - border-radius: 3px; - border: 1px solid #eeeff2; + border-radius: 3px; // TODO + border: 1px solid #eeeff2; // TODO margin-right: 8px; - background-color: #ffffff; + background-color: ${({ theme }): string => theme.menuBackgroundColor}; `; const CentredContainer = styled.div` @@ -134,8 +138,6 @@ interface Props { fallbackLogoUrl: string; } -const WIDTH = parseInt(theme.menu.width.slice(0, -2), 10); - const Category: FC<{ data: StaticConfig["categories"][number]; }> = ({ data }) => { @@ -152,6 +154,8 @@ const Category: FC<{ }; const Menu: FC = ({ api, config, fallbackLogoUrl }) => { + const theme = useTheme(); + const width = parseInt(theme.menuWidth.slice(0, -2), 10); const [open, setOpen] = useState(false); let content: JSX.Element; @@ -180,11 +184,14 @@ const Menu: FC = ({ api, config, fallbackLogoUrl }) => { return ( - - - + + + - + @@ -201,9 +208,9 @@ const Menu: FC = ({ api, config, fallbackLogoUrl }) => { diff --git a/modules/banner/element-web/src/Univention/SilentLogin.tsx b/modules/banner/element-web/src/Univention/SilentLogin.tsx index 06814333c2..46e0f39eb0 100644 --- a/modules/banner/element-web/src/Univention/SilentLogin.tsx +++ b/modules/banner/element-web/src/Univention/SilentLogin.tsx @@ -34,8 +34,7 @@ const SilentLogin: FC = ({ onLoggedIn, icsUrl }) => { }; }, [onLoggedIn, url.origin]); - // TODO title? - return ; + return ; }; export default SilentLogin; diff --git a/modules/banner/element-web/src/index.tsx b/modules/banner/element-web/src/index.tsx index cc1e1e5123..54dc3a0392 100644 --- a/modules/banner/element-web/src/index.tsx +++ b/modules/banner/element-web/src/index.tsx @@ -11,7 +11,7 @@ import { ModuleConfig, CONFIG_KEY } from "./config"; import Banner from "./Banner"; import { name as ModuleName } from "../package.json"; -class TopBarModule implements Module { +class BannerModule implements Module { public static readonly moduleApiVersion = "^1.0.0"; private config?: ModuleConfig; @@ -43,4 +43,4 @@ class TopBarModule implements Module { } } -export default TopBarModule satisfies ModuleFactory; +export default BannerModule satisfies ModuleFactory; diff --git a/modules/banner/element-web/src/theme.ts b/modules/banner/element-web/src/theme.ts index 300cf1924a..f6a6c43f30 100644 --- a/modules/banner/element-web/src/theme.ts +++ b/modules/banner/element-web/src/theme.ts @@ -5,68 +5,26 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE files in the repository root for full details. */ -import { DefaultTheme } from "styled-components"; +const theme = { + textColor: "var(--cpd-color-text-primary)", + bannerBackgroundColor: "var(--cpd-color-bg-canvas-default)", + bannerHeight: "60px", + triggerWidth: "68px", + triggerBackgroundColor: "var(--cpd-color-bg-subtle-primary)", + // triggerBackgroundColorHover: "var(--cpd-color-bg-accent-hovered)", + triggerBackgroundColorHover: "var(--cpd-color-text-action-accent)", + triggerColor: "var(--cpd-color-text-primary)", + triggerColorHover: "var(--cpd-color-bg-canvas-default)", + menuWidth: "320px", + menuBackgroundColor: "var(--cpd-color-bg-canvas-default)", + menuButtonBackgroundColorHover: "var(--cpd-color-bg-subtle-primary)", +}; -const bgCanvasDefault = "var(--cpd-color-bg-canvas-default)"; -const textActionAccent = "var(--cpd-color-text-action-accent)"; -const textPrimary = "var(--cpd-color-text-primary)"; -const iconOnSolidPrimary = "var(--cpd-color-icon-on-solid-primary)"; +type Theme = typeof theme; -const bodyMdSemibold = "var(--cpd-font-body-md-semibold)"; +export { theme }; declare module "styled-components" { - export interface DefaultTheme { - compound: { - color: { - bgCanvasDefault: string; - textActionAccent: string; - textPrimary: string; - iconOnSolidPrimary: string; - }; - font: { - bodyMdSemibold: string; - }; - }; - color: { - accent: string; - }; - navbar: { - border: string; - boxShadow: string; - height: string; - triggerWidth: string; - logoHeight: string; - }; - menu: { - width: string; - }; - } + // eslint-disable-next-line @typescript-eslint/no-empty-object-type + export interface DefaultTheme extends Theme {} } - -export const theme: DefaultTheme = { - compound: { - color: { - bgCanvasDefault, - textActionAccent, - textPrimary, - iconOnSolidPrimary, - }, - font: { - bodyMdSemibold, - }, - }, - color: { - accent: "#571EFA", // primary/700 TODO - }, - navbar: { - border: "1px solid #D3D7DE", // TODO - boxShadow: "4px 4px 12px 0 rgba(118, 131, 156, 0.6)", - height: "60px", - triggerWidth: "68px", - logoHeight: "34px", - }, - menu: { - // TODO - width: "235px", - }, -}; diff --git a/modules/banner/element-web/tests/banner.spec.ts b/modules/banner/element-web/tests/banner.spec.ts index 4857e31865..ae9566ec5d 100644 --- a/modules/banner/element-web/tests/banner.spec.ts +++ b/modules/banner/element-web/tests/banner.spec.ts @@ -136,8 +136,9 @@ test.describe("Banner", () => { if (type === "univention") { await expect(sidebar).toMatchScreenshot(`${type}_menu_loading.png`); - await navigationJsonResolver.resolve(); + navigationJsonResolver.resolve(); } + await page.pause(); const emailApp = page.getByText("E-Mail"); await expect(emailApp).toHaveAttribute("href", "https://example.com/email"); From fc1b07773eb688cd3dc2f77008d4193645c3fb95 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 15 May 2025 17:24:32 +0100 Subject: [PATCH 09/15] Update screenshots --- .../banner.spec.ts/static-menu-linux.png | Bin 14028 -> 13085 bytes .../banner.spec.ts/static-nav-hover-linux.png | Bin 2281 -> 3445 bytes .../banner.spec.ts/static-nav-linux.png | Bin 2323 -> 3451 bytes .../banner.spec.ts/univention-error-linux.png | Bin 8861 -> 8861 bytes .../banner.spec.ts/univention-menu-linux.png | Bin 27234 -> 26330 bytes .../univention-menu-loading-linux.png | Bin 6317 -> 6278 bytes .../univention-nav-hover-linux.png | Bin 1111 -> 2719 bytes .../banner.spec.ts/univention-nav-linux.png | Bin 1117 -> 2706 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/static-menu-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/static-menu-linux.png index ae2531c66bbd75e0a7f0760076db290015acb092..8752e393a547dceb24b9f2054c777035f9afcdf3 100644 GIT binary patch literal 13085 zcmeHuXH-+`x^Bd!vOpjfKv8620TqFzARVHh3l#ws0g)1rPCz;V5)xDpm1P3~0Yhx` zDlPONA_xdUdJiqMKmvgfLP&Bx+;`t|?!9}Ay~iDQoc-gjKO`e_&TqcoJKyp=&pUa1 z&BRbdNJ3>a z{4ny>P0HBX7}6yO88j<+`2O2R+kSbvZSSL7_qU^r-(TP3c(YzY)uXG=QC&h+;=JX&wkKrf+%;#WQ}FmP4Q`WF7uQK_26r^;I(Z<$vF?Qcy`mf1-I19Njpb!3)) zr-wZRa_306tOOffla*DW7TYwvtk6{}un!V`_5tK!S(nS1xH$7bk)an`>!kk2k28~g z zVuYezaA-T^ZONWmXy*HyS*p08DoIFqu%P`TOD)@&t8xrBdaG%KL=yy3>>;pkJnqub zj@bYQHZ|Q~E2LKH4~Rk6l_$}}g^c`t+adNMz-o`j7v7g;xUto-K@zGE2x9w|ou3p= zo?H**Y61oQhh{j&?Abo3oPgaD$S3)^Q0qZGU;Ar&f?}zM=U7)M^ zd{$)C%tSL4THGj&9Lh=&F3#DWl3I0U2fwuQo%9~?*v+jCXac(EwM7Pl0oCWME?6>c z?7tSfnNRr{OAkGLy9IK~F-LaGMxW#J+_@9ANpE>7FCgGKcYcFlX5K}O1W!DL*2zX4 zWQ?HbI5eZlo5&3k9IM?bwrLS+b)L;=QO09=?9Mb}qocb~^Pd`zCD;@;$t8C!==qM< zC*Q4bA1HRGP$;RXsoM0aWejHlxi%J+-Z?927wpjS@v?H&qP|1RY-jrBDmbk`t=W&U zy!BpU+w0RuB7ADM>c@*tWe$rD zL-gdVBSdvq+EMgs^$4G?>xRRj)LbTcz~_rd~u|a?*aoi z_&u5U+mhm3RvFJUb0_2+qU&3-eK(heqUI9PI%myHb(!ffuDe6)8%_U)KlgX$!-@VR zU6v$q?Vbw3$XkcjF?-?g404JtN^foS0eG}1urcj`8K{0Rv)i)qxeUy+uVA@N z+k2+{U8M955vhQYkm=3nV2a(a4V_JmT<5B#Rs@eFW> zg~jT85h-Z41AI3#Gt;oxSf}PkK~sSH>z*~rU^lkxIC$+AhE_hESF=6`t;?}0GSOZr zerFJ+WL=u$Be632`2h*W->7p5?AG-jsgmK&7+Tr}n$t(Bg%{X^?Q6ro zMoXH4Nc{Ff)_=N9M0UQ0Lz92wqrZoECI_AVCg_igA#4%szGRd1qVgeQbsP1m-gIeX z-Rtf1phclGGq+UHYd8{f1fSwkXstG_%<&z@K(LZlfshRsPCpJ~d^^HK;#FMRICLW1 z@@u)xT}`|>@|QAKQVNnBhSb7|%D#$^$4oTnhOU%xXqBu1L_V}G*}G=H{>(rL6^9(@ zucr%VH8QhMAKDA&}dNe{A=$jV?v>=G}F+jSgBEU{V#R zK_MUl4q?{D5>;IFfDNF$ityVjj?^Cc3CUkXf)MW@BxA&jX9} zkCT;r!VUQsadB~y z&hpjamM9raFrUkUf42HEH;$afg$*iBm}pVd*=XKCHkMpt5EX06Zp}*B3mT7{0#mcL z+$N7kYnM+69zWY_6MH39U(gjF76eLQUPWxv_Tfq@NWN1#tc=mTO4v4Rp8^l>4NIuM}+_sW&{euwl%l)2XI1?G{_~mr| z>YKV2f90~7jO&dO;<;VeS^-dk@22tuhHJt&@87?_Drcr4xjysZc^k!#HH;*K)mGya zjjmh~5*E{2vuDwUD+6ZzIxfqf-FP6OczdM<&MPcH_gJ}dX-MMF1U1Fi1TT#ni0KA^ zqABX}qv9ZT+>+0SO>YQWw%&w5-ge*4Gz{;YT_It4%XJK3;qJ#5PR40XzA%`(`>MpL zDWAL8WFtUL&ossB zN!s|FAJbT@y|>ly&wZcB7>@X%Rcoa8G?zu@k4Gz~=!7spJ#lS&qX|-~P9;j%fH~Va zt+2db4;>s55;FGNvO<1UA=qwRy!uG66JOwi&C1ZBcjet>2kaX}C_KyWv^eS>!~&`ZwDI=Pjyte~oY=H+oE6LD~> zk`sY+1z<$Q1V)Ak;n57`QVK(}oH zb@tre&7J=D9JqCM%f`0}QjMB_(8OwPPF4+7Id&RzCcj)B0QuS^&uyEKO{{;RPjB!b zx>mW(eJG0AKQ$^N6JqyO(p( zkIb%rQ4gaq39w|s@rcEN@BRKT9JvV9+Ysh7sFs@WCU7NGx5w^XbzUXqv!WW6)4BBz zPvY=Y`axuSN~Ng#Q2M50(#16dHr8HA8VC}#)@z}4j9|aqnxHW2FayD& zX>`E18DVwu*rRuqGRTI=iG(;yH5UFT@KSb(xZtQfkLTB0qIHN{R2|b)?-+~E=l29o z$n^P*{xKV{6lpnZrEy&|!lxH5hjb&S@f)b*Fn+A7jRx;Pqt4i$pO8c9?o_&0A*J@I z+>o~Kd@HNB%f&>K)gZ=O?q?G<->cgC^_Q@&hOBoV5$)HFC}bkIxPNbw#RcLQdZbQ&=;dXHYk!o!BvuL+I~wa8cLIQAsUO9w6Tj>wsW z_>Ol;T5ga)dkwe9d6#~U6g+`5g~7|F^9%+`6geZ|HTkV*)`RDI*4XMmA$kgzieF%U zap3b7V`b*Cj962m---h&5-QqC90IRm0?aAHj!A9@T>1?TTr>{?Tia_dlFAsx~#qS^%H$6i#$i1< za(EiONTE3@Ysp3wwA>@|mcN*hwAcku{e(7Ynl#en@XO$3I6sBm^9HIP7-)R><*iDi z#$ims!t3ihFbf<|-wGZgW_FDdb=h~u_RR}-l5L2VERe_#YN464DuW((Et^Wg>xD~oCRBrKHnpGt1EJ+n#!0YDi3=1505 z-5#5=CTpac>TzI|tcA{^G&L3MSO-+US4n!$;|qfC!Yb8DN)n-U7hMmPoX@9yz=ToM zjyxM#PEUui7_k3z{g#cHkJI{sduX^|5M(kT8~xC_53xMS+9JNLdc^P3+~)>@2;}Sv zrCC!(oDtZ@!2>8$jIdshJB`X4Eb;k`P|$BBNoLfO;TRCE-u%w`t*b+0a1uH2^Q_@1 z*DKT@>+HKMXdQ~5VtvD=D==4-T;@y2!+Doa6-&yE1k+AL5t(f}Cg>Z8twaqF(};)L zaROYB@XHdX`a`3QO>}8*>ym`?HYNt?yyx+Q>@|#fRgYrx+Z%rcOkG{a6gR zOnK;dwmq(-cYW~#DNmX|T58Qy$m#caa42$^RI^f=YNRlN;!ohYlTpWxeI>7ni|!8_ ztGj5VtVx|ge~W^KGG|K1u@=Da;yWT*0ybsS%OgjkM5J}zE|TqF2PO2^sC(dtemTUA z4&!OfmVY&hf4V<#^xY2Hjawm$7})FO&yA#-wTAN??r2q~D8J!lK5_n|f!L5U*c?&S zvFA|bPEBUngVMnYzNy&0r4?a*+0v>Zrfhk%LeW%f%1~HRxze}pi&4BqS8ml9BUY6A zBM*ypX|SfFeTI}-+MHe(zck;6>+HCmL!_Nfw+n3Qt3(d_w!gj(^H`MGwdwKu^#ogo z!E?QTR`M&X4^=HcB#X)vUL0RcjSvt*AmPUa?ZMsN{}v9CeHJp0FC31$k`~hx6X1LOWJ%U$RnNwW3y(H8&t=Ue zNhI%V4+e@&Y?F(AX+>J8s_hMnc)M;D0OPui47O?{x5ioCoboG|ND*t_nU#g`P)RKH zYQAwIK@+s81gZ5FUt{Ck^+=1O$*tX8U3qg>;AfAI=eN9Ra>228=9-uX8mm#sxe&;x zk%-V}l1Jmqx8_-^rj`)MB3wjAVE(t=#aFB>mB3Zlv&X~z`#oDozqnyc?rn#JYl#Ti zn{py8n!i*4&8Y2(?v6F8%hk*z4PG<}=D8s|ez)4J^0`M5Qz_N>&9A^Orwq;Ty9Vml zMP$)DhoJE_BtItCu$Vn! z;w)X6mUO1e4z*Ckmay*O)8`Nkn2C5mfD}D{2Sk3IDtYQwS$EF^HS(Pn4jnr>sOP*i z{uMP}&N7~8h=krPXO^}S`U+3@g9l|_($O^yQ8uhFzQdo;_SVW!O>Tv01pP2$DI=QQ z4tN(Yi5b#vu>7K13AcEwvGS(8jka^d6IRK+k)N3`uF<_keA5n+b3C ziBigJefUZu?r5~p?qrb@VeWTAoI`4Ud|=KN@n#&KxsNtfhcc5^yUdK@Ptp25nK`t6 zl$T@Cx~X6I8?KtDxVSjmKnneUt^x3pg{xw)&l-36BzB9`OC1WF=v%Di-5U!DUITsewcHAhjTO^(O<~N-O=?K z4L8AQ87HZhFESp>%SA#TiX5;Ye7150)#KF(&U_Iojz~Nl+xjMGU>2C)s;9eYx{PAr z&7f@DK!9EP%!1{~gzqFhz8ia$Ly*CotCXi(C6Uhh)i#-$WMVC|IDE!5hP#g2pqkBz zj)+QYIc>B~2(_@$7$SF-J0U}Vt&O}(O3{@!LEjk--vWTW?=a2M1~V%u9!Fihr5^F3 z)x`uhK>+0XGP&k}+N?H+rUEI%ONi1*(Jx|dGWu?0%@VpV4m^{@0W=*mi+RvdWS4h$ z=rs`Y(BEgS2P&hObK?3M?8(zW1ByJmFi6NJa%(vA%Z;#+rTRUw55;77tJ?H8AyczV zve#hga2FBAoL3>8Qc%WgF5_h*1_qKEi~(Q`w|I9^plte&W7X=4zsj!6Sa*EzzC66X zD=Od(lQI4DK#^JcGjP+5xVWv`cdnH#s1Ib&YqxAoBQiWHidEyTJlz=k#(1JkdYPA- ztGlrXuTnv+0!^!$yEyhGioVDpSF*%GW=iE<6bSA-pDJDPaVqR4igwRmA%0R{kW3~F zlSm5{O=_vOsI)0kYiWHHW|)SW_nk0SPc^zyO6GBFD{{;wYx!)Fp$eZp6=!Lq=SO%c z8?i$M?MC?yICQvq279YUqL9&)E1x&*EYq5&v`ImGjNtyexCcS5{86j!;}IsaioLUP3GO+URYg-e^SNQjaS{f6A`)0=1e zP>js$wsf7}cp%dSCx3EG2f7Y@fXefkd}&B8__FBuY=7WXqU%||+na0eevH=R;|?g^ zu9_blky3H8EBZb$AlZ92-ZwmdW+;=3ysP5PyI-&Vt85oMgJXpSRp@qfe5mLq*T}K> zuax6m=9ZycWY%n~Tl{%&&|Wi1suonZ&U*Ahk9G+sL(TXNs3ee6a5FmS4^u zseoVlyerzTuv>sc8z{B6HuDwA`F!@IGUzN_?(NEr7f+~X-nVFi+d&{1oo^u~>Cx60 zxpT|Q34jdEsU8oHZE~`5ub{|pRZUlOo^|Tjq=t*B4|#qzw{MT%(RaIeBhyLCwlK>T z7@qx7+-*Q~VK9C@OzQT7j)2Qit6rAOQ@~c{jbeT4gt*jbqbD9&h@x^EwPeIMm56(B zM_yj~c%$j&8LJqjpuaIQ(0uBQoudcVhJpRz77fnTU{n7h5wlp+tc71Uw>7i1O>Ut` z>FS?JyqX?u)OqahEg)8)EUQ8;wh17tq${aXx|h_F0lmr-I=>a`VVpz0fAeJbtJn;%<5BJMUnRh?>uz(#1#{V% zS-Ge3zaL{Xsa<@0^L@dYxT|SqUoSr9OCN8WUN#r+?)NOs@p8|~*f07UxL+;OqZHES z>~A{4=~_9Vk`~y@F{GV69YIQOYj3a%g>$u^d`e%-2sg&f0@o06;sRq5nIS8vL zsQ$^gp@8J4*)j7YeTQx3~+cn@Z-=+#9DL37(yJwZDn%lfNmG$jrTI^Su zQ=E;3uQJYz^12i4-ErOUSC(Khvt3jV9kq+fq*^vx@nw(-JBgme<@B z0gcIYN}wT_efGHbn4`w;y0$$TJQoKxs|qyBkLH5gZT4>$1YV{~-1WbZ5Farfj)M{B;_Bq*QEZgoD1 z@bHT~Qd_l&zZ zkXvSFryXDHmOa{;dBOMOQT-Y<_)^b%$(Xj1Ga%%w;99{Uy<=D4Jx; z$pftO*51|5f@9UJsR*cApHHVkzLd2_(fSB%7};)$RkL5t71f=WWN|6?pmp+ibfF!+ zMm7SRR0+PAcXzk0g@G`0yLfw2vo;!0lYwR|n;r`G<{8kjr)P^8SItkpw8<{EJ^6B{ z?8lZXJ+sxT>s(X`y(`amLfNYDXheG+m*3B=A?hq9cVY+AjQhVz0`8+h>FSihYq;l@ zRBTXcQ2K&9WL74KLrBxhzP>797r|a{C%TA^UO2pq!4`eo!LXc)nzO0VBCN!PB&x@o zyPi3KoJ$0PO6hE0s)5yDA>)|%)3ry>VZ7kF2yLKoeo!P5E^?X3kw8+9wO0txF;@qX zcx`%FE|zFaucFcdDxCV-Wo09nJycE4nHNrl7w^k}VD5&i>~L@|EIXdqEa!g=kL4H%vzgaNq6GI=Np7Z{PCe}p@Xtt_B2h3^un!)F4+eRPjSZ;giUx@1d@pzL1p^ic1P zBL3*pXd|g*Xc~ND+_gG17rB(0;9AtbPBqmG`Tpnrd})>S2tyg}pz?E_sRg799^H{I zQMxQ~Y`1IziDICHJ0&C=u<)s873JNVW?<#;01%2g zS+b29t7!+mn#s`aA843#^YvYtC2CS|NEiMr37bj8)IY-IOQX7lm1_d#mx!TUAVdXB z$dnES`Hbaun&`6Gl6E>CU7zr1hPyu+FaXGH`~|bT7~A4tt7#LsU1Kt78qc0=RhO*7 z3pM3dda1hMjD=jaiHmD1>4(rt_!f~t#Go`w#^Q|B z6}6vz_Jqy(YlLh3`vR7rZnw{=T0^3s9{!2VSB(!J9oU;L{Cq=1)(KHWF;dVMbY5tl z^COg2lvZS=c}1xO5)FjyZ$)nQX*tN|a z8%RJ>KtNxM70^h$s@4(~SJdx07P6UI?fOZtaI*ovK>ONr08l6k3-ff`F2F_38F_S^ ztxcVc$$~a3WciibeAsbWE*6~WUh(mS3Md2N6a;89S2~XkfN~VxjaTpnKmH@8_Yc_1 zKjDVp3Pr5sV+dq-%jUZP{|}c1OX*K+U1KKF^%!eKty=qm3*1fsx`(Y|+u^-L^`;94 z=kj%?8G|Nz)9cQZIC5Fb*$EoGsP!|cYV8k|*3CAT^fBWHDg`qxE7QiU3ac!1!HI!i ziyt-M1;V(wVz|I1#l)+tqaT#_RZ&krH^w;h%HYm85gfg%Io?e5?3}C-O0C(t2&bRu zg4IB^8AknCZ6dm}U$2 zlG7d=Pzep7$B-zrFt<5ve_kvp3c9Jo;#cPp@(0WLcVT^M5!Y;OV=o=;p>_BYWIVN9 zy6&|yet=clp{=X?KHjwjqW1s+u}426w{@?D32LSJ)4sOhnKfL z`oP+loh4OokpAA-(Ly}YcT8$jhNfBubWQ&1xOH3kd?{6l-7Wh;*`~~G z_L!?QPK*uJ&p$Mrq>2PfxD|;1I!XXlujfr2;~_P_a^tCRFJyX|jX(7J_&Xw(Xeh5s zB+~}r*#6f=O6APgX8BiAV=8GHZr?Lx&bre!H*NnIEo*-7QS0Vh)>w$;2WAuh6Bt)- z2TBLTV$Z)Mc>G_b!T%omd(ZmvffNFQz(%QeW*0zaTDCSxO77!Vfgu2d@2xfOKC7%- zGw-c#iC)K~{df>Se(OeZ9Jos`M2Tz;4qDs+YVPhX0muuE+Z`IF#hK`z%-%EwBC=K+b=p>*xb!e|T3YOSwPvLNa~fX3r-?)(Haj_RXt00Ub$`pyJ0p)G+0={2n#N=5T@0?klWy5r zrFb_isSgLlqUbdr_U`~K$zG)Ae)>5q79ZriaKn^LEJphVb)I*|RjT`Y5;qtM04f4{ z4kBNa)4$8`(Ao92N?JdH&L#BuEqar*SX40y%v9p^CO~RY;)gApfOG`>HB~^v{9w?! zZ&cQkc@;6`W^Cp@iolL1;q;G9cgn8x z+jGI76RLms6K9L+q?B= zeh{3d@d14p;_9(kr^7Gz`Ce*_Un`?`eR7O?^5lu{#9ganc+pKW-u^G-dp?NHuOh#} zvy%OnXYrO6lWP5G#R!s|F0{;-R^eC&Ix@5LSL~a$`j2t^pSKlF;_sbtItl#2<=_*- zR4Xg)G$j!3q%dz#>IWqgKE@t%Zh{s*-M3oJ;_0pqz`Cl3T=|A9+cdK2W{<{%cFa&cxnR%Vn!y zOSF-<@4elY^rMO`yqo-S@wwrDs-!<+#N|!467f% zBA2?^pcOMN_a~Z2(nGEe%BlIVM4qhbq;C0-P}cwZr|EyW{V%uwx4ypdSHS%haDN5dzxNfYe|HXU@PlaW+s{D+@Bc=|b_)LT z#QxGHjO$5_$|<0+{DgqN{^YQ~{Cv0UZ`1mpXz;~P)_Uou{YQVQHvd1K9;~W@H3ev% z^v^s%_a@Qaf_L)ILAEx=m7N6ts4@J@?>@1g!5}P1K+?crxE`N32GB0#@XMR5Re^I zK-u>tK!PC95LpCS1B4v{gf$CENb)ZIo8PN>H8V9cHT7QAtLlFU;d}47=brPq=brO9 zUtZicz9F*r*j@+(A_DvE*E}c%4N1=)UGJVBifX}Pt&4Ct<)fpmKTn%cTu}ND$Qt=z z-X|8nGjj{H?5${+x^87#}uIG2<_$XOHd%GOt4n6bO&Zt?-IzC&tEm%v!+mAwQi9y>+_JUUtDx!_!*; zterV{pi%6m3G{I~4hW1jzxmYc?s>4(A-;XGu-FnPwW_zl9nZE{*#)_>DjWQu*5vx? z<2Izuxou%E>I4`SdRxJFc|*VhrBGwz&nxny0)@7GgzOZ~Xd))e1&|gmt*(Nxu0QeZ zGcq4DYw=3mm5eTFq5)y8rps^OI#b5kXzhuXF_sWIr z?&YWpjg~!2v^pP1)DhYT7F6QfmoCJipX~T=ZBHjcz_$N{ry}xx z)>B{=r#*J}98Wdlv!wiY6;r*wU=IVOM8WiyLko@}jSnh!G-^zSLYglqzJg%3?|wAf zw@Y#v*j?i}Q0AVOMuEA&Gh*d06;J_4aC(0Z#5nd*??+hNX`^IK_xlX^o$hzwldNNI zW=5k{_VAlm?)7o`#pm7wu^PjL2f%{rr`(zHTMOSmICUn|K3kh~M=cWQ&}e25sz?^D zFtZs(r$305OS+W|>x*;?usq#Y#K7roMynec2r06YLSKJ`9f)CGbUUf=Q(i~a5+w{OYt+}ui3c00ducQgMdUt2E>IVoWWNRnGhoh+n}@$V=KKa!$rZ8-w0)>Y3VVp}?4Mn% z^ANijD%P}^9{SOD2buSYD}3pCD3+1d*xeDm&2MVRt;fzOENgbF3-MH9{%T+DlgbEj z;V?NPtA>L$_Y}g_Evr06Zz4u**28V9w{{TwoyfnnT;8oB@!)$)MyFJ->n;!bjI`VhA?2sf&TNkPZ&aB)v-R5Y zuUvvwyQ%|xFIYC{1`}O3X4*}2jVa{(Oca)uFswQL#%iCeQpRqZ-uFo1F#F_ivDn_D zadPAt{?`ylu!*IGz*>2?o|UQTW{WDil-YF{9<=@;MsFl=sZdblSVgbDF71b@VWNtN z?4$BwDgV*ZhcdcI`mzNa<(uMObyU-B2p~w??|{9zl0>YWO)1h!;ZT%Itk1?e{?1VV z&|d{Do}s5+$j8dTVjnH^WFhbzI+wi)H#5_C&=hLpH|)?r8(_0ZJZb1fuo9cGitjhK zGD^Q3ur~39y^81kv0FH~%aep+P=KEO{rx)2CCxMKaq=eV^?k-VW)>D1o=tnQ`ESl6 zw7EnQ*DqFXx-CXj_ISX|n`{zyEkfVA>`}XH#PJJ()CDjNzt$v-;cjNc%|eAVG&Cd; z^0 z8#*1MkE?KsGtx}DaBwj=iE7Et}Xiuzj#CTC%z~1*t`JE0^@B$s%v>K*Qql95|o2%`Tmc zfVm{GrnhHIZ&n{?ko)Etcpj<^rCPkL_EE|=`7Wckx9)Jl z#ZKRP*W+`=APV#iVB@A9GWYM5VW*uV`pU*Y=mCc|h%f}2wZ4)<&Luf% z8a*8ch{p3ctNvTwVP1ZwVh~p0UJH!Gw2;`g+IEn z)+~x=E#{}#qJe2;)EsY}j&oT}o#_smQ*+m^32@QpQ2SOJ7~|SY1${*^ADq$xJ75;J z0WB}&)2)>xfIoy;3>nWUm^_1e4P=9^FIV z>ONZsoxZ*E0?{p@DkUKg4I;r!f>HVPKg}IubXK-T8-(U8%zrc$b!fPAyV>g%|LI zar)(2@(Y~1|MzQ$b%ArTDI_kvS~k?X>r$@Irl*a~m=>PdX^fE_IM6ax_B&~6W0Ew` z`b_`QqxvbM)k2cM>WeQsiS5!eh_ssHH(kbPUojjn)|7h5TN=1w$DCL!_HOPe@KC|s z`bqmK%6)QP81VUQ=s{xzcNrA*`$2hQC1n_jQaPC5r^j9{2UhTy$BDUy+~E|RHMDx` znKkUyV*h*RE=c1sSr-C+>_&{VuIoU-98yC0K6TW)JHATZDEUVPuipZmri=6=bH@v- z$FVNFW>Njr?s>zQlgBPSdE~;~1b=1GiHOAT06eR|7-T-WYmNNb(;zNr0VC&B>(hrG z(r7fbRL7TG@}9euq1Qlevc+&{{^J3;)F(}$d%zWCbVHB3 zHC=06R1rJSrL#KPk(gcA2`{O!>ehF*!}m*X_EO0%$){n-IW7mFu{qh5#l7)va|)m3n!$vE@Hw|ou>cG{31az*q&BenikjwDaoZ?auiat{as&b!{F zTO_no=i>ZvNRe%jlOTHdyZOQ;%7!bLf9rL|Ryd?H@xH>GZq&K@Hwzv4E zzIg!u+D5>j^5L)d$*nixphmMXhV*Ursu$*c8yJ|yZhu4Nm1TR{6n^1ntLBqtU9T3~ z?=F~CwWty@kAm2)=R!c{Dg9`#dIQwK;aVbTPip(eVYh38=?B4?@ZMt=7{%qV%>8VN z%^ek4j3uI(6UcxDcI8~@i@Iy(Kv3*h^cG=4WiwPO{3)O0U>B0q<8s7@H})5x%yzO5 zWeJ1WQ2VUc749qQ5J*XmvnixIT^9+!E*nZvsdLLOtXkyeFY@)}7_rx5Fvp?qv=Fu? zaKj%R7m~{K#%dJ6EV06`{P$0Uu1y*Cr4$FpE5Ub-{BjQn8#vbvlnho7vRi;`f{ehf z^JH+AMi?|JR~1C1g=4!w3bykU0)f0g0XzbE{s-7B20eKlgYeU;54n&{9UNWRoxSmL3tclKhZ(JVq= z7rx47mD6IT#amBcLxo~4GpERhZT-h&Ru+adfE2OZvML$YH(?&*ODa<~bRHh$KEU?A z5p#T`G-jEYyHRf{%KrB00VQzI!GhJnK;MT3wHz%~oa5@|OQie)RK$d>Om~w;< zH$5&771GyR4i;-7t)S~GHe=zWiZ5FsTu%ZD&gp8053%)c@|VZx>!L!|1=Dy@BpGg8 zR27j{l40xV?ru}W{A_%Qu?V;J^%iWj1k)p|+Eud^sXrFP4v`JL7UkNt&7@_J zmLg2|U*x`rb3Ws;O4YlzKg6jtP_?vBD})=%+~|YSNLIF3ldBp@ck55@s_m&P9rWx% zTvzSm_1KXjZro2GL$q+c0pU$^bHn#bdk)DWb6qy7>ttNH`Gg{DK#HT8pGNnCOfrE1&2eA>Gn}YZg$Uli?y~XZ_=3(w~wMJfA^2@s*@n;81Z<9c`3X zn^nR4(#B=Zco#3%a3qRx+^*Td(F4$noTjDpz?Jy87*5w!HYISr!DKXmbdbU;2M5|t zWMJS-Pqz`0#u1&TR1&`~;>@ftejn!Hsp|uEG6jsJpR-Bn^f&`Lcf%M_&lyjo>#U>; zW?WjTb+L)ln`?mTjUzs`#MJOR`Wu z?|uF93yk$8|M4buqwyr#WL$T{h3RO^8&cTSfW+~duII9CQcPM~M!Ibv`&)HF1E)8G zqY!#-HaKH@wUCh(IO-1-G7zBgnu{^Xa_v-1!}=6K%|NKu8Wk(o9KLU8+Au?BZjIl3 z3k~30Fgv2XYny>gSBU}Q&ecsJe=s}3@;2znxD+g7ijzfQoeZ=v- z0U}z$j~|s6=a(7!du82f#niWL zy6m7d<{UCUUc4WrXqD&oRS(zc!{GSZQF?L! zAn;owsWB2B)%`iV0IHTDvJ1PwVDOt{ zcumq)yOS7`qs%%JuC>c=RkdL6qX7}hs{w0CrrizLtn-*YchMQ)77m>S6`K4IAiRp6 zAooHoPXS<~*<+$;uYR~*HD#zbU1U(kERgLo53h6ny>kiCr8gr9FZ!eaCtF+uhMMby z`;32%5H~mLTN$k2fiB#0xR8_r5Ckoz5Vl4=p=rKCd zO;2;@zmrA*h)E-uK|vYby!arGMu@9MXm1Ri+@D%)w=O<7hV}g2sILod^K`jdbd zETyQ_u~hNw{xk4*HD-NX;54Au-pn88aEjB`nnSQtzhn^`wtA^@d;V2U;Q|W%-r1W( z*-&+(UO5q%VRp)R3Ziqh86B5(KBKr>V@5bE2sd%Gi3*6vM;Ba98!48} zIwajPf$s+uTwR4~u_)Ny7txaqa#HXZfK zPv;T(=Qp`+fPxbnIo3$K)a+dF`3aY_^BqdO5geUWn$wYj-4WF@08s%<3g%Rg@~vm! zs=hgLs4<;RNG9~<0sb?Vt}FQTTKAZh|Gb%@eo)=C!Pn-&&Y;;fJ)+U)<(YV3nk$Oh z?B_p>2M|J&&DER!wv`oeiNJG^!X-C|e;K-NO%8nNiR=>CFZeMx(Jw+`Aw)0p5@3ZMx?lp z@Fu64%;!;e6~Z?egqbz+kzSP zd~i7`mV>_NT)ros8MLmN*oB$MX-T_83^!1N6Bnm5$IxT_)=Xtyfva?5wJ||FGN1Xp zqpW21Q<<-zleTvn*bLQp>_{Ug;*n;?JxlX92^MlGCIvwoU8gDy%?C5{tG@SqgTYsb zts#R)Uyt)Jw9NzwK?dw5lFNdQeR@V--W_H>-mjH1y4AoZg@Xclf#n|cf?J#HyB20n z()BLiV|OzuHnPQYNq_04Dk(J)Lr-f>(^5icPlU9DO(QJp$98Xq zXQ$V%YJND#YUGMr4VJLxU1vcL4@!_sceLr?=8e@qO#>ro0a^Bm!dcU^v z?#3@h041jrdFP#%zB>r=@L?wS{(B?k(*m93-TUmh`fXN-8YVzb z%j4H!i4S_xe7Kd@d>XY)@2)0^K_AL8zh@k7P}A3^n;!oFU^`(tpxka@E{!X};K4m} zH3=0Xeb@Gly5^xlsT3(4S$2nM?W;8Jra%XI3VmI-QF4EKs94uNVKq}IaA=apNJ@Hzt+@kOC-v^eSsU_PU%}*4a`Qvinf{xTE(D6)2??xL?{th zNPtK;c(q_t%tFPkyWc(k_(P1m^lIQ*uthqnEmh*~AT-HpbJb5<0+KTYeNm9yq!LdLE|+Jsz2aKC!@t-Dl+nAE z4&Qy$7n!FX`s$}OF#qrS2e!%;1wNHDSdFi-0cu$I?NS+zkX3fx|q-S15^K z0#&pM;H;HDnp9;DGy*)k;)_Hlpn8{4{+()!fkVl@EA@=cYF^+~a{J&N}D{K4Z+%dqP9lfB556=ou6`sBdb&t;CMx z=O6D`bEYwKs`ngZq}9B-^3eS%_^0;w5>o}u)&Eglg3={U?xRbxoJ(>JOlYUdJO=$O zQPDj@tQQn>>T=3qV)xzt^;O`nD+sC=NTB$?4)P0b5K*{RA2VtpHV!-l!A`OfeyQF> ze$#ggn^b&!Jolf`Zu#Nss+2pmV{bcDusd=VRNRm8(Ss!hthsb>22Z)~ow(I{-?HHI zHf8rtnEfH(a5U;}Y0gG9=wK+gm_nS&Xa5Sr|ML7$qf4^6nPVN#J~N8;xg+QEnI5pd zbKAq$XB8Dk4cn7X#lgylBmWutZ}ibu2dnQGmxO=%W=;ja<`#oh7p{#kj!)#}xdmLa z{AYUt+&b=u1tGl`F5d>s+0x@D%phDI!Xc+XSl~6- zkzFNLDOi}FhvK}Kfe8%pNO$1K#1y_N$xg5X{1*wcwmodU0_^#l4b98E$(I3@ zQGV7=n^|TY1EHi_*x@as#e@NoZIdQw2Z{Xqvl>w@1l!h&3MOfAim&WM8G^T2Dm zcd;z5S^{&iCXd(HQR)D@uO#7JS(|OR7};VkX@Z+y z43909xiFW69S1cAz>&D6{b*+5_oWyGMMRrOqok;+zC-sj`IYmY-zLfkEAXci#UxSL zyYceGf|M~k=YXYEW&I~}N2@!Rs5>bOD3{`+>_kSAxGfzHd`^f5vU(E zn?$(?euNv}ig4NB)`nTEODssr-|3a4SeHI?~hdHd45 zolw*j*YX6FBFc~;rRD($cJYiw1EJv$j_H9*^}RkzaQzzRL|(e?+B>bB?e1k)Y0Kl# zr%vdH%r~H1njb68-2OAkSHwNd2P8_3_j9b$`Rg;$E)-oEod4#MHzL5BY$K!OQb3R+ zPjoEaiVYVlGZQ~KAXPP9bDkq$?!UafnJ57j;%5cf3(z!TlvpwPT@=$d+Z$HRP@x-R z7w2=FT*DcJQQu{4+0YPu3)Eog(%rYGY^dS@nD?4}ydd(h1CcFU*leuRT)1`CJ4K~H zN8{;=mfF@9VH#3jnrFiy5Q)H@cLBDZSI=wM2Cn`g5|KbD zxmv~K!i{VyXijIj+-YB&S}CjO;SKi-_1hK<)o%%>;K!`Qq4zM(!-=it*(?x$PMF&q zZ;W>duuN{x4U2pbZ=^FnrsMkcymbL8#W>QgTlU^7BY zYVG$kh+NoK-_Ivg2Ho5ZyjaVuhU!JDktA4ix)nWOBO0q&toD~Ri=y~18uhl?XPrMJ zxT<&Bw9+lCuxTnhxos{-gJ7?2nsD@70nf?*h>o2zzA7VNDtx%^mCgJsnPRofvxP;s zs*jp}->wdW3dyQxOj=u}A2R5{18BVU;pjHH{B|sgX}}nr7e*T0>it-;y!mq8(HJ>1 z3&n{+o!$P#tPP~{kbc**dS2;CjcRRXmzveN+xkvP^UI(MSE?{7?pz{nc&7ZrSq~H% zMt;kL*3g*AFC_0KZ|=k=*r2Z9MY&FIKRePQCD*O)i_@TCtXyc%YuBe!UAc)Ww#T3f zirocuYY1i&s9CJ%X%{z6s@f{M}0|Kor0_15N$SXV9^4jSbO<_7s+_L^~`64m1$*(C{er? zigg3w2*r-AMa#b&s!%5~*LBj-6RI&1!eME2?x+fzayMOBbw;=tPo1N-@ha!D>dYPy zEG~-&v224}0%Ji$jgvF#Q{N*C>)UC6lb>W$#GuKiU1GyOX7~Ow-&t+7ZT(LQwTQ6m zVrb88=K}Wv6KHSlWvjp$gpe%hHN5Q8>CoF|HvMnwL~6sWZBQgGDw+FTHJEIsH#TUNdX zEiZX7qkC{*w#@NYkl6L4Y5R(Lf~rg<^pu8g7_?2MBqhg1 z)5|?Wu}xWN^VeD1dVxId+Zl~P zpzpcccy#c!#f*_(V;bo6e}_Rd`>+GUo>{Ep&jn#o3ELYZR(?nD%-H0SC^QXUYYixE zF=(t@TL!uXupU^d6YsoVoUaLf4V#;eoSk`y_wGU0jR&kA^dD#Zni!-FgcXsG?LtUlaP}VHe!~4A#X_ zYai~{&otEA$u&ma6Qo1bgBBY9qOW8_!D~;wU0|XNbjXijbW;`Mw;?(pqqeb@VXclH zY^JjYUc~6p?pUC9bf_poX7C67sf8P@HkpO#*F6TDtyt4qR!9+UCbVs}eu_GcXKdsn zY-n{vEUjlsF{VRe zE<25HUz<-0ym$VPfzZS2BC9_t0d}vXRLTd#(=SnGld>rygI2k;5JLv!a8wI|f?ra` zU>4|g((DlnKkn@Aw$#9JjT_tZEg(tx7vja(MrTKH%R5ThXTMTf5_9BXzxAoZdcj#1 zi&Y1wIrO!P#mIiyk1nyNU4FZNwlHWMyaCo7?@>Sn$sX_^L)s1qSUB}>EB*hFKKUO$ zP*|E_d)KnC)&^O(7uJq~M$ESar*iSM`U5}_=WF2LC+1_OUY)}5I%63mx8*h1^&)uH z;LrUB83hB4V2n?OvC*?4f`(5S=q0b>hqo9crO)8&++W-U7NoC0@FPw_J)9K%V zjT;|Z{v`Y#oOr+rzzz&ZS(J_yp{mmFYS=mFsO65V%~Ufu{cL5w@y#ccwTyaZwTq!u z!1N_d3LHK2?YgiVaQ?5wrrmrVHdQ8NBvC z{H85{&US_0qfh<|{g6b7+kfOv74vIH-r`5sZv5;*B>R<2Z}${^)p z^Rzc7jG_{h{zPbIJ?{BaMLG|)P>J0*=`^m}pa~ddjN_^=6PZZDd)9f6OFdami6EWJ zz3mpTZPVvkexq}{I7NSPgs`)EbdL>R>KV~E+&I4IG;ggiDxxpOS=GMEu>);gR9eiIQ2X) ztG4|Nzo^9MZpGRgdpT~K&TbYxPGS^;w#yHB)DuS=Az3-u&^2z;c6wq% z_3-lz{o|Uykf&Y@0eJ;Su@1XGmu-Og>@YEwNXIggnz<4Au{5h@WoUV5&#*;$hi{vF zxR~Z~bMu7o-o-wHJhiCBz2Jp8@X}m^N{TK%XKmp{Mted#=u!v&=1X|Dyb!H8FjnwO z=()!qBHKv|_{~9<*`q!=n4j*`EB-;Fk408eKD#TVW9GM|nLa>=zz~l;6M(&;%fu#a zdNlv8Q_mbLRm1D}%^{4pOR928$Xgv*A9QF}CSKLDYkqeM^6fDbRmL)hlTCO#VPHW7 zi{9&#yhnI`Zk0!BS;ZyfTi#Qk1kJXO=oG_mzcEtG>lNFOx=6{FQBUkSw3P9kUA1SNB&6%!PHq2jHj{{H$fOcq zC9OYb4)9lU4!neJ=y--2IUkfJHyINVGqmx|e}DZ3C)b#B%hF$^4b-hyRNo$oQoMYw zx)apiLEpY!vUwr}3h$xJXOts9!is4B-KsnF&23<<|Fc(^ws%6^=tdD~H^DjD8eib! zx>H2@#2Gs{X(OP|HJU~Ut*B|UgO-~{`gP( z41c5KZ7auC++AdkgRwKHIlr@7%jU-!zX0oS{Ei}SlW~eUib&)H3mSTqNA{1jp zMb_-Q$udTmu@5s7y}xlk_s{o__kI5OJKmG{Ve2b9j5!HsQ0U(lv77Pg+_ZR>pAP@4kH zYo9*qyUyM}{-IFJ zcC$3|z3X3CJhtk9Ju#}x7n$<|j5s75htN7RqyHq3&) z+~1;VIMJyw6S_JV$IG?!ji8W&6^NgQTZ1FIc>Gv1X9iiG03G7YT2UZ=&iwW8|E%!U z5hQp1-qp~9;pO$Z!AFW;QBiSeQ&8&s$EmlRzeYmQS8vud_ylCoS6&^>xvK>(yS1G6 zd^7Z%B)?8p_mtg%(!~7-M+3gM z&}g*bQs*OE|G&0$v#>j!vu|dv2v^w=h;AFYF{kAHu!BSVNR<1ur?d|JH?KuFQ?SiO4l%!HAHU|j9;g^kg&wYMn^coI(K?#Xq#3?E?)N< zAQ-Y&s@>h)p&|6fN6WVY0|U*?&3l!QIXO9EVq)GSt*!Z|GCFWqKndw@{uDw@eUg2kZ_||7HT63H~kMVAbRrHU1NCd zgQ+k!!_Tu#Sy)+Bb)pHwZuy-r|JAD=03?s9ips->5C4pdlTfoSxT2z}N)B5t>r6Yl z^P;xC9tn4IbKBV5oERU6KpsVgBzyMHRa{%hK3k&6UMtPKYwmo z3CUzKCu;p{6moI3V>iw!eYpAU)tLP2;`sl1_+itOhlQzdlgbf(A3fK#WhlEj1aln)0$kd z2$oI7(IU=bdxEM-V_Jb>_gY|#k%<>avl7n;ZRlpD&EG;u5J~eXdFvjVxo)>;udDt< zmTcZq%aGNY_RZ9T8lfjhU>YWeK~Ek{lJ?FdLEjsB8MlX4Gp+eV5Y%EbeemY&X&$({ z2fuNQeyCYyQm{=gLZaKxd zqPMqKh?n;rifUzQY8nyoqx5!lPcEz?VPRo`#bOC|2(ax?pT!DF9$q8;5!mLvqF}*OrR$`(;m%4bj+SL+pn?>-jE{q*)sgn_AO&vjhk=8jbAK{2un#DE_7`8(J>pJuyg{5Rx}4?Y|okP??x$jX4nn9-vYPgB}))xXO{wYsr4NLQkNZmh}Cv0Be|*irH#a|d$8ND;|>Y9y^SC$E22jL zxUV(2Yt`1-+Mf2_E4NLytGL3dh9nA3?eC2y{S`FO5}y)t_s5o7S&t>lJnS7l$n#T2 zEYe1vK!p0(m~_vV<{zo@AdZq$nWnRU9uhbIp7SSVrYdPUIA)0Y5lA47rv)pMvU4LP z0UKw5w8>K}#~o$?RV*g8LY=wH?iJd`0(ql!=1kYSU~et3X*?KTd-?L^Yyo^Dk(fOP zqypsc)Kr4K7LG|t^KL9FqYYTY)RdKPGze`s?f~#$ti^nGp$p}SkWsn;`eCmykQ`}5 zhf%DK--C-4>R<18*$s#H`WjTRzuNU#BC}JP^uC^exM}sGf6mQ6^DMv@=e_z~XVpnS z%(ilGK_Jo1m5X1RAm6tl#Ivx)Cr=U5`t z$|<+wNj(dz_A72pP!A1BTmx!Joza-4pKW}4qk8JW>O@V*Pum$Euup)IP?_#-W`s%k zm|yKrnMhp2371104ykF~<{JIZ>-`v?gQBx}dzwpinwSe&=*@-KJhmO_=kAKDJ0hK& zFiV54W7IzPR_r`^zq3AsaM_+T3|(`ra30tjp{jok&gxczFiI2~%J=DgM~~h}vzmyp z2-gj&=H}4e{a-9A9bG9MDJpwSYb|`a5gT8m{Tp9?K7RZ-TR4)vU&s~rX=6Hkbz5fa zjk|eJP*8=0D9l^`$%hmDZVBpo=@(je*;Fmq-(G&HF}b(k@CwZ%7D6J~WAMWq1X@p( zkcYPC5@Ew5BPFz<5(IR>zjqqZBQ}>KSHBX0b8>P5;!0awyq+kW2-d##Xx{#Pke8Fw z)Y?qz(eup9=Q1CEX42nkITh88dRXY_wUu?Nxvgn4c23TjYL&&trZ4!mXK6m;1x$eq zqV7M|zHTVt>p$K2ebNZS3c7uJj7Zh1OO%IU7rLZMh5$;UVI6ffH8;1u4|qdWRXdrp zOWmbg) ze~kL6>3EKmCJ-u6`>DGOam zgTq9*Q-h3PjD8_?)^X2J@v^pB!oCabe)?w`r;JmIbi?=fYdT-vm0s5x2loU#U9ze{4y8s;w@+HGhDJr^0rlIs? zfIdRSc6mFD+K_f$Q?uLRIi!O@M+SW<&8wKdqgoYt#Q`|53eOrGH={4 zUFD0j{(}?i{bB=P&w_d1pUbcEgmpTHGNbw8bsDA(*ff~6MuyTSC9569Jq~+i&YU#s zE6?t0>x4dfQ0k4^9-ukwkRQ?T4b^dSp$UEWYwW{GoxuPJdk6Fvm{kxNnW%`(g>LV+ z3`&{{c5izmd(NTO*UQgOEGf-7Oj%#w9-bfzO-)L=;p|MOP{c$;MC9c5d!Va7wg#+$ zaNCjoPETL-U3IjzwFQoCd^~Lb2UEf&;+%p)>rBA>{CrVZpI-?7+WxO^j9r*ya@Oi4*A{1vEi)4< Kc=;vQ$NvF?245n5ntp zcG7aAaNmXi)6yJMQ&R&}Y!Tc*5Q9%t_}=~UdXk}E@CPwDyNpopv){kE?B`?(R>C8edMbb9c`Vwwt$KrorieM~@O+#39< ztsq>`jnjgl-&bk+73SO;;Qf(`d94jMWh258oJ9l3{Qta_#!{cXh*> z#xqPAjUTb?hW1gUMTOXHQPysV-MwL>pD_eA3sNDwx)1@|9^U-q$rId~W&r+=UTdAP zl<H&cy+!roexMLdD_puwf5#5jCudkJ*3d=bX-qfAIMz1LA!fMJHUDYdne0c7|b8c=C zgIGW{K|+MjXT_)&L|HzKJ%8# z<(-|KrlzI{I2@$PPIJzc0Bf>ztP3s3EhylSCj0*Sw#GX%d$JCGx~YTQibNvy_3sIj zZ)kQnm6n&E+`R#@1+~^Fgj>BwHJ=|Xv7yX;7Ix(%CMJUaa+c;g@7%fblKQxRa&&Yw zH8pjjy0&)yU734th?SL<8yh|YjjAd7-Me@BJRUN3zL&@2fsgwNVl4D4aqai#=H~h-Kvi+Xm(~?f z_kkrt~m!C?m(9M!#*%)*@*$$DeV-wFlls{FAz`{ z#xsY8hVVkb;#MCqF4FH@0BYp9jYin!E_S!iqWohmBepGv!7EEjgs%gQJdkM0(Bo}+t= z03qNb-M{wz-;mv2;}ufFddm{D<~;RX<1~Z$i$us$@Pb8eveVMj>!OvCev?nBr%>CX zUxc&1cnGV@%F2MjR8~rB!*qc5P*ujHmb&`-fWBFAgFxN7-Z5rL)?UF@O(mg6$$z>7 zSV<9|i9Pnpj(r7JP}JowLrL4w`4TZOi|#$2o@?7hVP`Kyb%*xmJaB?p;=5yHueMn7 z6Os)b9ij-r{)u6sW&hw{#)6D^?%aTB#d8ZgyO@c$kMa)vHX5rO!Q1Ws>O?fXu{D_# z&)$x-eSAK@C=!?n!uHDX0 zG`c9coKEK~2y<%4n*b}EgC&Qtjnfqz2Q<2Y!=Vxg1a9?Jxu^$Q(trB&X=7}M?e(d% zzP`S&M~@#ruB)?(CyX`UT%q%w*~LbJm{(VFoe6|iTwEM@kTS&Z;c~fHJK4+N3YKD7 zDNug-^30E;mVRjUy|WU6UOw3Q(+A<3Y`KCT?nnM`+bG_Ux+DW6hJ=JXAG?K!6!X%z z0r;D(@+rdXssfS~@4R1ZT`0f4ly$W;16;RtfsCi7rV6`-LSadM)YJ?T2xKh01I*(Y z504CBzKT~{{BkEN7!07zQZFr_ zM@a4fUPMI1Pd5}ZTsK@7&8j`wQ1da-9GH|7%q@gH%U=9BZq_+PG< z5?sDYcu_ft~h~vs+qPBoavn0~~MuEjFw4K_@O$>iq4<`k(Xb|0kNmSSZt_|zMY#_`h)E95$GQ#MzWp?cHRsq bAHY~ftVJ=K#CuB8K? diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/static-nav-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/static-nav-linux.png index dfa9b9b2553f216e529ca54293f387920c121075..cb3af0dfb7054612215c26c766bb2ce123b051f5 100644 GIT binary patch literal 3451 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 bzpwBE(o4xeCK!NI`2kp%@M`}WJoY~TkK})w literal 2323 zcmbtVX;f257Jewu8TJtaXtQ)s!D+z&+Mof%#;_ehTDCxtRUjBZc0!0Gv>+;rEF!DH z2rW?z#E6h&P!k&oi-8Ox`!1lOL}Uqs1L(Ymf9Fj9==$+)ovQn8efPUx)xG}P83$#B zy$S#TC_6c#-2gxioC4Oc9pE<=>z)7_nRqt`TcEyMdkz3#T~6psBQX^Rq4&-U&&pal)6bae9wHFghXX8;(E@d|g=l*ftyy-8vO>t;3ey zyWT7dA>+%!Cl?@a03g+Y@wX?QKLI8dd(QTnONDt?g~bAW+82vm zT3QO(czIntt15?*yN$#_A8<7y5{YI&TWc#(JxvB$^E3vb?h zSX&!XF&hBwN`GJgc|DVpwASEQ6!ldJQdL2rkb05beDB^pCNui$=K9ps)V^={@bLQ& z9?UJj7umwYD!db7Z~>l};W&&DY$D|f8VE{klh35CvfXEltm`!m|RyNhvz zh4HPqUOI!pxPSj(!_X+mpqE$8X32;+2}NbGSW6~{4}S&|jB5gShW6~<9m4Y7T;2yM zC@p}sV;;^PG5#@tNA_c1^oxji_};_SRrIc_f*m#DBhEy>!Jp6WgI@i8hD2$Dbot>REH8tJ2 zbLXc4CX>O~ZHupvq&CP8_|4UD`gS(rX?Wt3mNdMbZYU<)!yY)9Ke12Nh z!9$q(H{nNd-M8n&;<3k}*-wjK%@&TN<>}dwmu8%}hd515=7xrJF4qUf3U1A!yWWwP z-4s3My$F0XB0jM`1_>Zg|GeDbp-On*9v4*|)cy>UGH0<^ERjfTuhD2Ufk4pS?ubC6 z(Ju=RoSvEN@9*buID3wSeUPLeUQV@KJs%t#QqkIzs$9t8Du@N{dXFN41Q)e>7ydEV62A1?*D z&dJH?@mGNkH&EAO0(qmopIk&U2E2^@88B5Ze7#)wWUNJK=k6it%A7k6M~_^SNc^5(BF+Sg z_C`B7IVC1awl>xrNXNmV6%-%{KYf!71Ynr{V-2`GtH$Vw=OxI1uYcA-nD}}*?2~!T zeGf6O7S>c$R16Lr=%QK9?01FyH&Lr>V*?ZFD~sY?9RpZhTm zyqVy05ogK;Uj!4AFK-^WTU;DXmVET2P$(%WDXFQ}dZ!@FG+Wubu@`y8X9q8##cZ;9vU=l}R)KLQ;S6B874 zcRmu2N5#JrGRL;1u~`7AFUS78r{}Fm(e2~Cy*x0tI$w6@*0Yv2o0OIC@Nh@+4M$i( zdHL|zSn9^AxUy0g@p6R6vA8j)Opp zjeRrJP}I-Oe}XT%^_72RnT2*1EiJ_nOG`^X>}d+?Dt|A!qpGCT&Xmn-L2kE9b?V!g zW0#ImDSE%_mZ`QGn3=r}YgiAdy)Ftg85Ac`Fxw4dy1PwgkO$+RKMBY~e zkT(6&MIRDSloDtKD5ZJ-jRUt+_^e*sAp_d5Up diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-error-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-error-linux.png index 14f92293ba62f7e1e9cdcc1f91fff4c8a8e7dee1..48f4242c8596de74960859779108a0506b33aeb7 100644 GIT binary patch literal 8861 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 literal 8861 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 ax}xfpNm}ITjO9?RpKK5PSYZA0<^KW==@Ga9 literal 27234 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

Bafjn=iv~J99P&c;*?>2M53AHSo1IX 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 diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-menu-loading-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-menu-loading-linux.png index 32a60c7b42a1dee75f92b8bd8d05132b42f1d473..c2b44b9f6bb62ed54fd00d85d2c567bba2c8ba0b 100644 GIT binary patch literal 6278 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 diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-nav-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-nav-linux.png index 6587c1b481c16ae016a1fbb42c4fa09f480a3c02..1ce126e499914dc4fb32f9d9b3868c5e50ba0cef 100644 GIT binary patch literal 2706 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 From a81bbd9b9cae726f3705f955ddc0ba04d4930a83 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 19 May 2025 11:59:40 +0100 Subject: [PATCH 10/15] Iterate --- modules/banner/element-web/src/Banner.tsx | 2 +- modules/banner/element-web/src/Menu.tsx | 48 +++++++++++------- modules/banner/element-web/src/theme.ts | 14 ++--- .../banner.spec.ts/static-menu-linux.png | Bin 13085 -> 13121 bytes .../banner.spec.ts/univention-menu-linux.png | Bin 26330 -> 26520 bytes 5 files changed, 40 insertions(+), 24 deletions(-) diff --git a/modules/banner/element-web/src/Banner.tsx b/modules/banner/element-web/src/Banner.tsx index 310f584312..27e9fae5b9 100644 --- a/modules/banner/element-web/src/Banner.tsx +++ b/modules/banner/element-web/src/Banner.tsx @@ -19,7 +19,7 @@ import { theme } from "./theme.ts"; const Root = styled.nav` height: ${({ theme }): string => theme.bannerHeight}; background-color: ${({ theme }): string => theme.bannerBackgroundColor}; - border-bottom: "1px solid var(--cpd-color-bg-subtle-primary)"; + border-bottom: "var(--cpd-border-width-1) solid var(--cpd-color-bg-subtle-primary)"; display: flex; gap: var(--cpd-space-3x); `; diff --git a/modules/banner/element-web/src/Menu.tsx b/modules/banner/element-web/src/Menu.tsx index e77dfaf67b..673080a70b 100644 --- a/modules/banner/element-web/src/Menu.tsx +++ b/modules/banner/element-web/src/Menu.tsx @@ -32,7 +32,7 @@ const SidebarHeading = styled.div` display: flex; justify-content: space-between; align-items: center; - margin-bottom: 20px; // TODO check + margin-bottom: var(--cpd-space-5x); // TODO check `; const Trigger = styled.button` @@ -45,10 +45,15 @@ const Trigger = styled.button` width: ${({ theme }): string => theme.triggerWidth}; &:hover, - &:focus, - &[data-expanded="true"] { + &:focus { background-color: ${({ theme }): string => theme.triggerBackgroundColorHover}; - color: ${({ theme }): string => theme.triggerColorHover}; + color: ${({ theme }): string => theme.triggerColorContrast}; + } + + &:active, + &[data-expanded="true"] { + background-color: ${({ theme }): string => theme.triggerBackgroundColorPressed}; + color: ${({ theme }): string => theme.triggerColorContrast}; } svg { @@ -73,41 +78,50 @@ const CloseButton = styled.button` &:focus { background-color: ${({ theme }): string => theme.menuButtonBackgroundColorHover}; } + + &:active { + background-color: ${({ theme }): string => theme.menuButtonBackgroundColorPressed}; + } `; const CategoryHeading = styled.h2` font-weight: 700; font-size: 12px; - color: #203257; // TODO font - margin-top: 16px; - margin-bottom: 8px; + color: ${({ theme }): string => theme.subheadingColor}; + margin-top: var(--cpd-space-4x); + margin-bottom: var(--cpd-space-2x); `; const LinkButton = styled.a` - font-size: 14px; // TODO font + font-size: 14px; color: var(--cpd-color-text-action-primary); - font-weight: 500; + font-weight: var(--cpd-font-weight-medium); display: flex; border-radius: 8px; - padding: 8px; + padding: var(--cpd-space-2x); align-items: center; &:link { - color: var(--cpd-color-text-action-primary); // TODO + color: var(--cpd-color-text-action-primary); } - &:hover { - background-color: #eeeff2; // TODO + &:hover, + &:focus { + background-color: ${({ theme }): string => theme.menuButtonBackgroundColorHover}; + } + + &:active { + background-color: ${({ theme }): string => theme.menuButtonBackgroundColorPressed}; } `; const LinkLogo = styled.img` height: 24px; width: 24px; - border-radius: 3px; // TODO - border: 1px solid #eeeff2; // TODO - margin-right: 8px; + border-radius: 4px; + border: ${({ theme }): string => `var(--cpd-border-width-1) solid ${theme.menuButtonBackgroundColorPressed}`}; background-color: ${({ theme }): string => theme.menuBackgroundColor}; + margin-right: var(--cpd-space-2x); `; const CentredContainer = styled.div` @@ -116,7 +130,7 @@ const CentredContainer = styled.div` width: 100%; align-items: center; text-align: center; - font-weight: 600; + font-weight: var(--cpd-font-weight-semibold); svg { margin: 0 auto; diff --git a/modules/banner/element-web/src/theme.ts b/modules/banner/element-web/src/theme.ts index f6a6c43f30..bdc1285727 100644 --- a/modules/banner/element-web/src/theme.ts +++ b/modules/banner/element-web/src/theme.ts @@ -7,17 +7,19 @@ Please see LICENSE files in the repository root for full details. const theme = { textColor: "var(--cpd-color-text-primary)", + subheadingColor: "var(--cpd-color-text-secondary)", // TODO bannerBackgroundColor: "var(--cpd-color-bg-canvas-default)", bannerHeight: "60px", triggerWidth: "68px", - triggerBackgroundColor: "var(--cpd-color-bg-subtle-primary)", - // triggerBackgroundColorHover: "var(--cpd-color-bg-accent-hovered)", - triggerBackgroundColorHover: "var(--cpd-color-text-action-accent)", - triggerColor: "var(--cpd-color-text-primary)", - triggerColorHover: "var(--cpd-color-bg-canvas-default)", + triggerBackgroundColor: "var(--cpd-color-bg-subtle-secondary)", + triggerBackgroundColorHover: "var(--cpd-color-bg-accent-hovered)", + triggerBackgroundColorPressed: "var(--cpd-color-bg-accent-pressed)", + triggerColor: "var(--cpd-color-icon-primary)", + triggerColorContrast: "var(--cpd-color-icon-on-solid-primary)", menuWidth: "320px", menuBackgroundColor: "var(--cpd-color-bg-canvas-default)", - menuButtonBackgroundColorHover: "var(--cpd-color-bg-subtle-primary)", + menuButtonBackgroundColorHover: "var(--cpd-color-bg-action-secondary-hovered)", + menuButtonBackgroundColorPressed: "var(--cpd-color-bg-action-secondary-pressed)", }; type Theme = typeof theme; diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/static-menu-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/static-menu-linux.png index 8752e393a547dceb24b9f2054c777035f9afcdf3..9970b9ebdec6c8b4fd916936811d1980e0cacdd7 100644 GIT binary patch literal 13121 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 literal 13085 zcmeHuXH-+`x^Bd!vOpjfKv8620TqFzARVHh3l#ws0g)1rPCz;V5)xDpm1P3~0Yhx` zDlPONA_xdUdJiqMKmvgfLP&Bx+;`t|?!9}Ay~iDQoc-gjKO`e_&TqcoJKyp=&pUa1 z&BRbdNJ3>a z{4ny>P0HBX7}6yO88j<+`2O2R+kSbvZSSL7_qU^r-(TP3c(YzY)uXG=QC&h+;=JX&wkKrf+%;#WQ}FmP4Q`WF7uQK_26r^;I(Z<$vF?Qcy`mf1-I19Njpb!3)) zr-wZRa_306tOOffla*DW7TYwvtk6{}un!V`_5tK!S(nS1xH$7bk)an`>!kk2k28~g z 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 Uh1{v@a6p;EwvGp1S)YviSFRG7od5s; literal 26330 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 ax}xfpNm}ITjO9?RpKK5PSYZA0<^KW==@Ga9 From b4aa07c38500331db6d9f7d5e60e1889ed857bef Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 19 May 2025 12:19:30 +0100 Subject: [PATCH 11/15] Iterate --- modules/banner/element-web/src/Menu.tsx | 2 +- modules/banner/element-web/src/theme.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/banner/element-web/src/Menu.tsx b/modules/banner/element-web/src/Menu.tsx index 673080a70b..447582822e 100644 --- a/modules/banner/element-web/src/Menu.tsx +++ b/modules/banner/element-web/src/Menu.tsx @@ -32,7 +32,7 @@ const SidebarHeading = styled.div` display: flex; justify-content: space-between; align-items: center; - margin-bottom: var(--cpd-space-5x); // TODO check + margin-bottom: var(--cpd-space-5x); `; const Trigger = styled.button` diff --git a/modules/banner/element-web/src/theme.ts b/modules/banner/element-web/src/theme.ts index bdc1285727..80d2528418 100644 --- a/modules/banner/element-web/src/theme.ts +++ b/modules/banner/element-web/src/theme.ts @@ -7,7 +7,7 @@ Please see LICENSE files in the repository root for full details. const theme = { textColor: "var(--cpd-color-text-primary)", - subheadingColor: "var(--cpd-color-text-secondary)", // TODO + subheadingColor: "var(--cpd-color-text-secondary)", bannerBackgroundColor: "var(--cpd-color-bg-canvas-default)", bannerHeight: "60px", triggerWidth: "68px", From 6e7cf567db05c8f14c16a88b316bba7a02cc5cd2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 19 May 2025 12:44:58 +0100 Subject: [PATCH 12/15] Finish theming --- modules/banner/element-web/src/Banner.tsx | 23 +++++------ modules/banner/element-web/src/config.ts | 16 +++++++- modules/banner/element-web/src/index.tsx | 16 +++++--- modules/banner/element-web/src/theme.ts | 36 +++++++++--------- .../banner/element-web/tests/banner.spec.ts | 8 +++- .../univention-nav-hover-linux.png | Bin 2719 -> 2705 bytes 6 files changed, 58 insertions(+), 41 deletions(-) diff --git a/modules/banner/element-web/src/Banner.tsx b/modules/banner/element-web/src/Banner.tsx index 27e9fae5b9..81193fbaa2 100644 --- a/modules/banner/element-web/src/Banner.tsx +++ b/modules/banner/element-web/src/Banner.tsx @@ -6,7 +6,7 @@ Please see LICENSE files in the repository root for full details. */ import { type FC } from "react"; -import styled, { ThemeProvider } from "styled-components"; +import styled from "styled-components"; import { type Api } from "@element-hq/element-web-module-api"; import { Heading } from "@vector-im/compound-web"; @@ -14,7 +14,6 @@ import { type ModuleConfig } from "./config"; import UniventionMenu from "./Univention/Menu"; import Menu from "./Menu"; import Logo from "./Logo.tsx"; -import { theme } from "./theme.ts"; const Root = styled.nav` height: ${({ theme }): string => theme.bannerHeight}; @@ -50,17 +49,15 @@ const Banner: FC = ({ api, logoUrl, href, menu }) => { } return ( - - - {menuJsx} - - - - - {api.config.get("brand")} - - - + + {menuJsx} + + + + + {api.config.get("brand")} + + ); }; diff --git a/modules/banner/element-web/src/config.ts b/modules/banner/element-web/src/config.ts index 8b6db1c122..1066a85bc2 100644 --- a/modules/banner/element-web/src/config.ts +++ b/modules/banner/element-web/src/config.ts @@ -5,7 +5,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE files in the repository root for full details. */ -import { z } from "zod"; +import { z, ZodSchema, ZodTypeDef } from "zod"; + +import { Theme } from "./theme.ts"; const StaticConfig = z.object({ type: z.literal("static"), @@ -85,15 +87,25 @@ export const ModuleConfig = z.object({ */ logo_link_url: z.string().url(), + /** + * Configuration for the menu. + */ menu: z.discriminatedUnion("type", [StaticConfig, UniventionConfig]), + + /** + * Theme variable overrides, optional. + */ + theme: Theme.default({}), }); export type ModuleConfig = z.infer; +export type ConfigSchema = ZodSchema, ZodTypeDef, z.input>; + export const CONFIG_KEY = "io.element.element-web-modules.banner"; declare module "@element-hq/element-web-module-api" { export interface Config { - [CONFIG_KEY]: ModuleConfig; + [CONFIG_KEY]: ConfigSchema["_input"]; } } diff --git a/modules/banner/element-web/src/index.tsx b/modules/banner/element-web/src/index.tsx index 54dc3a0392..f6baa9c896 100644 --- a/modules/banner/element-web/src/index.tsx +++ b/modules/banner/element-web/src/index.tsx @@ -5,6 +5,8 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE files in the repository root for full details. */ +import { ThemeProvider } from "styled-components"; + import type { Module, Api, ModuleFactory } from "@element-hq/element-web-module-api"; import Translations from "./translations.json"; import { ModuleConfig, CONFIG_KEY } from "./config"; @@ -33,12 +35,14 @@ class BannerModule implements Module { const root = this.api.createRoot(div); root.render( - , + + + , ); } } diff --git a/modules/banner/element-web/src/theme.ts b/modules/banner/element-web/src/theme.ts index 80d2528418..aadc572c3f 100644 --- a/modules/banner/element-web/src/theme.ts +++ b/modules/banner/element-web/src/theme.ts @@ -5,26 +5,26 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE files in the repository root for full details. */ -const theme = { - textColor: "var(--cpd-color-text-primary)", - subheadingColor: "var(--cpd-color-text-secondary)", - bannerBackgroundColor: "var(--cpd-color-bg-canvas-default)", - bannerHeight: "60px", - triggerWidth: "68px", - triggerBackgroundColor: "var(--cpd-color-bg-subtle-secondary)", - triggerBackgroundColorHover: "var(--cpd-color-bg-accent-hovered)", - triggerBackgroundColorPressed: "var(--cpd-color-bg-accent-pressed)", - triggerColor: "var(--cpd-color-icon-primary)", - triggerColorContrast: "var(--cpd-color-icon-on-solid-primary)", - menuWidth: "320px", - menuBackgroundColor: "var(--cpd-color-bg-canvas-default)", - menuButtonBackgroundColorHover: "var(--cpd-color-bg-action-secondary-hovered)", - menuButtonBackgroundColorPressed: "var(--cpd-color-bg-action-secondary-pressed)", -}; +import { z } from "zod"; -type Theme = typeof theme; +export const Theme = z.object({ + textColor: z.string().default("var(--cpd-color-text-primary)"), + subheadingColor: z.string().default("var(--cpd-color-text-secondary)"), + bannerBackgroundColor: z.string().default("var(--cpd-color-bg-canvas-default)"), + bannerHeight: z.string().default("60px"), + triggerWidth: z.string().default("68px"), + triggerBackgroundColor: z.string().default("var(--cpd-color-bg-subtle-secondary)"), + triggerBackgroundColorHover: z.string().default("var(--cpd-color-bg-accent-hovered)"), + triggerBackgroundColorPressed: z.string().default("var(--cpd-color-bg-accent-pressed)"), + triggerColor: z.string().default("var(--cpd-color-icon-primary)"), + triggerColorContrast: z.string().default("var(--cpd-color-icon-on-solid-primary)"), + menuWidth: z.string().default("320px"), + menuBackgroundColor: z.string().default("var(--cpd-color-bg-canvas-default)"), + menuButtonBackgroundColorHover: z.string().default("var(--cpd-color-bg-action-secondary-hovered)"), + menuButtonBackgroundColorPressed: z.string().default("var(--cpd-color-bg-action-secondary-pressed)"), +}); -export { theme }; +export type Theme = z.infer; declare module "styled-components" { // eslint-disable-next-line @typescript-eslint/no-empty-object-type diff --git a/modules/banner/element-web/tests/banner.spec.ts b/modules/banner/element-web/tests/banner.spec.ts index ae9566ec5d..fe60dfc3a4 100644 --- a/modules/banner/element-web/tests/banner.spec.ts +++ b/modules/banner/element-web/tests/banner.spec.ts @@ -6,7 +6,7 @@ Please see LICENSE files in the repository root for full details. */ import { test as base, expect } from "../../../../playwright/element-web-test.ts"; -import { ModuleConfig } from "../src/config.ts"; +import { type ConfigSchema } from "../src/config.ts"; const test = base.extend<{ // Resolver for when to respond to the navigation.json request @@ -39,7 +39,7 @@ test.describe("Banner", () => { // We don't take a screenshot as we don't want to assert Element's styling, only our own }); - const configs: ModuleConfig[] = [ + const configs: ConfigSchema["_input"][] = [ { logo_url: "http://localhost:8080/logo.svg", logo_link_url: "https://example.com/portal", @@ -84,6 +84,10 @@ test.describe("Banner", () => { logo_url: "http://localhost:8080/opendesk/logofull.svg", ics_url: "http://localhost:8080/ics/", }, + theme: { + triggerBackgroundColorHover: "#571EFA", + triggerBackgroundColorPressed: "#4519C2", + }, }, ]; diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-nav-hover-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-nav-hover-linux.png index 5cbc8775ee71225ed381a7913e7db6097b3e3b70..a72b1cedc1f8b8b4fc59513680e161814d9f0674 100644 GIT binary patch literal 2705 zcmcgu`8(U$7mlU6s8KUiJE%6*s@=D>1)(acXcR3>*SqsEz3j5V2312?Cw4FoPM{MZ8{S#QP6%WIETk2L^-CYlN#S zxO-uJW%VxTEz81ohg__Mp(@8l}m zd&y_Xc_SB_UGS`o_b!aa(3x01O3)h&x3HL6JBTtR?Zg@k7VXBYe(9$~AFzhE7r47Q z=d1#=NU3zIJ89_SfY*c&-y7w^00X%ypGx2Z$m8oEAppNk3&?tBT-E-uO)T+wc?)d9RTJrhef8a5_R<<2EOO;1#d zEM|4dh`u^al{Vbnt56dGH0u8T_tTXlEbR@$4Q%$7*S}7+mTmMG?8cnz1`-5H6X(I}c4pNtX zC)c*1lZ>z3ySYUYq!jzdZKVi72mMlJ6T1Z1wrv#7`UHpgc~nhCRpov9qH{+Y&8}kg zkLN`m3;iKEdTK|cEH>iyOOYjgdchv8CpBpjfFE_@;?Zd{y4gU z{y5RwV(c1UI`gQLyJ~>SH)h-ZYFeWV+%t_+8mZC9e*C|*I<@{TNlCqW$`}6$5OiZT zj=E5&M@roql^~Kxu6_sk!-;jafP|xqvuca$i1k9e_K_edF3FButl~H zLS6MPfkKAYTk9;y@M=LAEapXG`uNpUzcG`x>dV@fMqgG`b;*MVNB7`=@(CQ;P9`h{ z-8ZPMyC|OdN7DZ8T)I)xZ1ZTs(2wfbDnotFOgw{4r6NGwo z;nrgZD~}(pJpSI1nUckZYciN?8ueCtXfd`%!|>}&H+vXNY-|L`LC3>IOhW&WZ`G1| zU2$JRRMmIX=UXm793#J087f2jw`FWF^{AOVbuT>jh?A!udC14D+Zh?sv&{RuZf>z} zrswkv)TYr5VT)1PMnnOoX>RxLW==?Nx;!3RMSt-E z6Mp}p${b63XwP$_93CxY7#JSA7#I^8kPolgd(t07T;=d_O4k<6uAQ(DU2@FHI1f(8ElVVI)kr`xi|_)k!`I?c6Idfv;WB)f(5Ia9uil_fWnHdY|`$qNR^=_RMO*YHjMd^l`d zE3(?cV!7lB*nB}7$VPJZqPD8u)4E?XObf8%mE_rt*0)q{aNe$)93GJ;{D~(5ZO7}} z7GNk!2h`JJCoX~q!~bNDVWPM6xUpbx9Er-kZ=O=B$cTO_VPXvvFW$Zsic4O^vA{-z z;=YUE`t46NjtIs6;I^a~p_jxQ2)JZ=T!y=swfNi0i_K| z^aLQC#Rw=!e3&B{-(WEWf6pXglvfyw{BbXOKuhBhUWg{EjoQz1ip6%Oz zOLXy_J-SE%p{9y7<+l#cU8}RvLAfYN>%h-QozSS6 zQ(2n$p7#pyPN?33H+{TBFP~A*yG!xfF46YYe8(xC>rwo`zU>N_s&Lyheh==7@MvM- zI|7mH;7br;%>LZRu0dx{c=eNft*6PpxscUe$(LTD!Q7Q+SA33)D=ou4iyK6TYbWxx zG6em+;?~*S-guFNdFM;ZpH=jVJdn%`T}&kk$`nmeVZVED5>sptI?!6EAPPjh*}WNY zFFFjde>3x&S~^RA{=1Xwv%6uGINzDz_-`or8=X@u-Q!W;MM}y?L#&BErw?_5!%xup z&oTbs?xYL!0V3$NhKcl)lpIK2E+?}jt;ztn`1+Dlv&uh+#2qXYSs_qh!9hNpc)3p) zzrF1>a0wVx63Y5_C|}V2PC@4;DW7Z~Lw?qSy5$)tNd8VnZs0lJ63V>e?iMDEhXn?l zCU}aD{8`ZsMmYVEpFAosJ@X0;d0UhxXVAA8-2o`3eNFP8*GAMSxwkl<-B&x@0f9dD z-HQE5jL(CB)&e?tA9NBxbwPf00Gm!7YXT7TUkG*#XWqY5@B5BW03w>1Si*=mTp#=k DI2_$L delta 2459 zcmYjTc{JPE7pLoVw1}k`js7exn#4M^_Gz2wl%g3$D?(94Q$lSe_!?8Bw2T@{Z5cvR z31Z&~rA%$9y+SM{$RMpPc7D?H`{Vb{dFR~o-sgVa``q{LJvUL3Ao-^z@ZdK5`n~6w z%dD`w_eNwoR@@P_N_|}?SXoNN6+LhApd{yN&qz;*mgh}v!KD+L1*KVk2i^!se?{_b zYXf1ZDRfT1wgGqn|vz|-6FrjhtwSN@<%vX>-!RNp#Ogw1s8@c77M)mUn z_xWC7!?U}r)-SEZ79k@uRFKd6!55C=#yq&>tizK2`NgleXmAAm{+|8*#A_6V2~K(Y zz|!wd2LfRu0YW1c&|p6EA40%W)c%6F%)nPh!=|h{i6P^EO*ad(7`{I8G})MA2j`Z2 zOzI-mMIQno>e3e$oTueWOwfVjGy7Jwi;RQu7iozwAwE;h7kwVg;_|?!7*NnbVQ6?h zaZJ0%bYnpAkXc<%uZyemAUMwNgsfd1;X?oE3RUU*30oc(_So`(yE6A(~U%`nKF^AE-ybw;hV^3)=li)cXT-si8P)#g2@y7?J<%<8PS_v99g*c;zwK6ck;7V4t26q`a(7Nl0S9*$ z!1HS8hVYZTAzOMtUxH(C9~^$quVM~UFj{$qO4%7Qd77E=$tHyh+eL&&nO}v(X8PJS zG__GB^K^?3mo-_2h-7WYk!c0HWE6x|`$$EWpU6;UFx#2mFsBw$z-;= z#Gx8P2Eyv%qO<+}wk)?q{uKxi>b+_8#br$;Ppzvcmkq$#A)99iYA)GNs?){Ax?}Mw zH)Lgx^fccWJrMp@u;!kc;(a(u0DztMwbx@nQfL23Ts0?$UFU?;X=n5GSjsE$vXujE zOotB`-C+-xE(cWL;Bq*=X%HU@WV zxKS4q${@_#Iv{fpr#e2^`NM=8A%tYnF~lYYu+vrwko59PqPSDjsapCx07?QcaNtA)&p&C#e_9 zV{0I0i#Vl+xVdt@-grc}XB?rYEOuey6fH2I04;%lbGA5o#N+J=HALKc8+WvoFu-VCgE5eh6)O>T_@D8kP` zId5_)W+M}>2&4oE!3q9&K~bS@p$_kap{(HXT%(5IFm!^A$q)jLS@Ep%ZyHhwv42xp zpGr;dq2TewQK5;}^Nj{T4EuY^Moibm*Dgn2I{^`ueiRvgeO#yU#%d|0d941}Jg&l! zzBY)LEffuriwyV|SY1jKsZC8DAx81(!2tMW(YjmmB!m5JOiattIKtSNV{GMRVOd3^QxPz2) zm5fbSVR*%By|zD){P5JO!i+eAUi9oLS-+N9TWMnl`&Wa3ibp0b*%s*c-5q$hake?! ziAu7EDq<$=f3x#82lxHRe-}|ryqtzpx8Wq9>)w6imXMKmTz1uG?Z=~VL!2#b z6g^oOhX=MAbx_X+z6L4fHGZ>P{AO$8#hDCH`C?E~_4hlsdpc)s+KX|DADnL*JM#DC&y5Sl*IRI(rT5R7ULr@S z@6-i7V&R6WodHtequO$-!=X3nhn+$b7wHbQ0M=%>$%Ya@d4OHnf-8lX_8OAi(s0SH zSq!iHK`zs4Fy|5-@li_*glb#A640l4vy|S+=2hU~DC_byJ18OR=k=JN}4reDjj(1Ef8=eUPI=x60qsVF48NQ!}=?fEqTc0$J`3#&E97*gIxFD+>j};b+ zAiCZu^=&N@;e$l=Mtp_V&pGeC;AVaHBIm6(vwxolINk%tJ^f$u1y8kW2NL|j;OcbR zGIF*Cllk3ETJe=!gzL;~yt;_az=VH!D4S|}*lx^coH~WbO!_N^$Zf)o_avQ4C$`}? zEC*T>5)!m_vVHl88f4 Date: Mon, 19 May 2025 13:19:18 +0100 Subject: [PATCH 13/15] Update screenshots --- .../banner.spec.ts/static-nav-hover-linux.png | Bin 3445 -> 3346 bytes .../banner.spec.ts/static-nav-linux.png | Bin 3451 -> 3347 bytes .../univention-nav-hover-linux.png | Bin 2705 -> 2583 bytes .../banner.spec.ts/univention-nav-linux.png | Bin 2706 -> 2597 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/static-nav-hover-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/static-nav-hover-linux.png index c4806ab94c084ba0afeaa4ae177545f36a3b3537..06f9925da1ae9d9f53ed1f9defb0779308f3754e 100644 GIT binary patch literal 3346 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 T<*P-r()<@KVNl|4-bw!eb;(jH literal 3445 zcmbVPc|6o>7auC++AdkgRwKHIlr@7%jU-!zX0oS{Ei}SlW~eUib&)H3mSTqNA{1jp zMb_-Q$udTmu@5s7y}xlk_s{o__kI5OJKmG{Ve2b9j5!HsQ0U(lv77Pg+_ZR>pAP@4kH zYo9*qyUyM}{-IFJ zcC$3|z3X3CJhtk9Ju#}x7n$<|j5s75htN7RqyHq3&) z+~1;VIMJyw6S_JV$IG?!ji8W&6^NgQTZ1FIc>Gv1X9iiG03G7YT2UZ=&iwW8|E%!U z5hQp1-qp~9;pO$Z!AFW;QBiSeQ&8&s$EmlRzeYmQS8vud_ylCoS6&^>xvK>(yS1G6 zd^7Z%B)?8p_mtg%(!~7-M+3gM z&}g*bQs*OE|G&0$v#>j!vu|dv2v^w=h;AFYF{kAHu!BSVNR<1ur?d|JH?KuFQ?SiO4l%!HAHU|j9;g^kg&wYMn^coI(K?#Xq#3?E?)N< zAQ-Y&s@>h)p&|6fN6WVY0|U*?&3l!QIXO9EVq)GSt*!Z|GCFWqKndw@{uDw@eUg2kZ_||7HT63H~kMVAbRrHU1NCd zgQ+k!!_Tu#Sy)+Bb)pHwZuy-r|JAD=03?s9ips->5C4pdlTfoSxT2z}N)B5t>r6Yl z^P;xC9tn4IbKBV5oERU6KpsVgBzyMHRa{%hK3k&6UMtPKYwmo z3CUzKCu;p{6moI3V>iw!eYpAU)tLP2;`sl1_+itOhlQzdlgbf(A3fK#WhlEj1aln)0$kd z2$oI7(IU=bdxEM-V_Jb>_gY|#k%<>avl7n;ZRlpD&EG;u5J~eXdFvjVxo)>;udDt< zmTcZq%aGNY_RZ9T8lfjhU>YWeK~Ek{lJ?FdLEjsB8MlX4Gp+eV5Y%EbeemY&X&$({ z2fuNQeyCYyQm{=gLZaKxd zqPMqKh?n;rifUzQY8nyoqx5!lPcEz?VPRo`#bOC|2(ax?pT!DF9$q8;5!mLvqF}*OrR$`(;m%4bj+SL+pn?>-jE{q*)sgn_AO&vjhk=8jbAK{2un#DE_7`8(J>pJuyg{5Rx}4?Y|okP??x$jX4nn9-vYPgB}))xXO{wYsr4NLQkNZmh}Cv0Be|*irH#a|d$8ND;|>Y9y^SC$E22jL zxUV(2Yt`1-+Mf2_E4NLytGL3dh9nA3?eC2y{S`FO5}y)t_s5o7S&t>lJnS7l$n#T2 zEYe1vK!p0(m~_vV<{zo@AdZq$nWnRU9uhbIp7SSVrYdPUIA)0Y5lA47rv)pMvU4LP z0UKw5w8>K}#~o$?RV*g8LY=wH?iJd`0(ql!=1kYSU~et3X*?KTd-?L^Yyo^Dk(fOP zqypsc)Kr4K7LG|t^KL9FqYYTY)RdKPGze`s?f~#$ti^nGp$p}SkWsn;`eCmykQ`}5 zhf%DK--C-4>R<18*$s#H`WjTRzuNU#BC}JP^uC^exM}sGf6mQ6^DMv@=e_z~XVpnS z%(ilGK_Jo1m5X1RAm6tl#Ivx)Cr=U5`t z$|<+wNj(dz_A72pP!A1BTmx!Joza-4pKW}4qk8JW>O@V*Pum$Euup)IP?_#-W`s%k zm|yKrnMhp2371104ykF~<{JIZ>-`v?gQBx}dzwpinwSe&=*@-KJhmO_=kAKDJ0hK& zFiV54W7IzPR_r`^zq3AsaM_+T3|(`ra30tjp{jok&gxczFiI2~%J=DgM~~h}vzmyp z2-gj&=H}4e{a-9A9bG9MDJpwSYb|`a5gT8m{Tp9?K7RZ-TR4)vU&s~rX=6Hkbz5fa zjk|eJP*8=0D9l^`$%hmDZVBpo=@(je*;Fmq-(G&HF}b(k@CwZ%7D6J~WAMWq1X@p( zkcYPC5@Ew5BPFz<5(IR>zjqqZBQ}>KSHBX0b8>P5;!0awyq+kW2-d##Xx{#Pke8Fw z)Y?qz(eup9=Q1CEX42nkITh88dRXY_wUu?Nxvgn4c23TjYL&&trZ4!mXK6m;1x$eq zqV7M|zHTVt>p$K2ebNZS3c7uJj7Zh1OO%IU7rLZMh5$;UVI6ffH8;1u4|qdWRXdrp zOWmbg) ze~kL6>3EKmCJ-u6`>DGOam zgTq9*Q-h3PjD8_?)^X2J@v^pB!oCabe)?w`r;JmIbi?=fYdT-vm0s5x2loU#U9ze{4y8s;w@+HGhDJr^0rlIs? zfIdRSc6mFD+K_f$Q?uLRIi!O@M+SW<&8wKdqgoYt#Q`|53eOrGH={4 zUFD0j{(}?i{bB=P&w_d1pUbcEgmpTHGNbw8bsDA(*ff~6MuyTSC9569Jq~+i&YU#s zE6?t0>x4dfQ0k4^9-ukwkRQ?T4b^dSp$UEWYwW{GoxuPJdk6Fvm{kxNnW%`(g>LV+ z3`&{{c5izmd(NTO*UQgOEGf-7Oj%#w9-bfzO-)L=;p|MOP{c$;MC9c5d!Va7wg#+$ zaNCjoPETL-U3IjzwFQoCd^~Lb2UEf&;+%p)>rBA>{CrVZpI-?7+WxO^j9r*ya@Oi4*A{1vEi)4< Kc=;vQ$NvF?245Wo~K$`Ix0MmPMamg973cfIv}Re7$OsrM9XpLz?>g)N^C`I!i-95 zG^8SGBrGg*$|+{fJ2l>W-oM|^=Y8ML`}^a*exLjPUDy5n9j|Y~d0Q*+I@NU`5D0wQ z8tDK6{R2=zroaCNJYTJiX$KaCUx9X-@rI!V; zuAO^5J=G9FFB86S6AOoqY$<~|TUK6A?;P+2GoA@OPA)vnKjVKd+bbcn=t9yGG~-l~ zrpFrCZp32Dk%mf0W^^I`9IAf1M-Xn^$1jlSq`uY>OzE%t7DAzldl_p9&)4TVnSbkT z!yj=m`EmNOhG29GCPxW61#|MTTh(IHkAv3Awc_6tcF5O9>(+S4*BGr$F$!{}4&pEcP_y(k!PQMGXR{AN(%lK- zk(t4FA3l80*48#NGb?qX@D$V=gFE2bViJJzX0*J2WsbaPb8W=F?VS zLPcaw2J+rq#9*{E*Ka#GJ~1Jlt`TG|i|5D8=RfNKKJDDOQ%y}xEEdyfw5TKxW_5LT zRu(M&(4j+7RC_G8kHZ<=(Zps4AW8jKaQ?IwNr+%8_R*2MpbbFCin%jN0}DD!Sy=^J z({<{;uY9X(G#6d(7MK~?+uNHji;9R-JeIVzz$7&hrRm`4_%eEBc`F=!_wHTS+Q^F& z2jTFuc6M!TZSKq)l&>f^w`Gn?Ahrfi6I1|*G&e&a=>-LSJf7UETAwrxbHXoC5QK^6 z=dp3Y`2b=YTU)d6h2k6CU0sV(P3NAT9_bPv6}~jxS3{76Lwv7X$u$ggyLF2}T%)9v zlbN|;;_(&S0n$f_jt2YhwepgWu^)yIlwLD#f#O?7hK33eOH(}^hB7T)l(5gqE$l-& zL5)+6mA+FpCt9OWC~IqC1_A5p`WqmMic~vtxodV#4kLj3YT0i8zI}lC%EweSlikCC z-(R<1*6rah6&FMI$!v2E4+8m<)eX;#>&oE6tZ~ZvWK>Gr_HAqEvKi-suAt|X%PfIo zQP54Cw>M8(>b_Lqi&%zv4i9Q25h=Rn{dKAVGIb7yBzk_SN%Xc7f!B2IqoxIQs>v?~{oRIG^+v={Dv{#7k-}v;=Y_-#h8fWOBrp9H) zWbTpj@^ZnO`K6P}Ru6%i0up6-^r-k5mDI}&_PKQF@$_hW1CJ(I-wc#40Kgmc>5acMA&(DQ9yMt$lo`bUHmFF*rDwakb|wmkZaNo}R9w z|AuvOnasVDfn~jUlSz!|FLA=q3`|V8{rxLIuCQ2adwV-j>Cei`(XBWfE<8Lu^`oNH z=4=ngoZeO}*ak@%3$>Y~NuKX{*wUIUXpCMhW~W8p1{f2HLUOi@i?o0;=PD>7a6b_${HZKTR+;cty|m>yx1&&wa-vVsTh# z=)%GRkr*G}RO!`}>EyRv8}nm&njoCULhR8omdG&3t(HvK8Oc_Np&^4AJf@`};?P_a z^BS|YT{f$zV6hr6%>-j(jGL33G&6~HSUj_^@Wg~W;~Li4x!Xgde!%%t$9=t@HTt~4 zXglua(ISy1&v zS$KBK=Wg=@IeF{!T86e+sY;Ga(TfbSF0fCVWU2UeCi11XmAwph8$MX4oI_Ji++b_G z#W_bEl5xXwOoJQ*ZJ1OrmtS!8_pgZ<#~-p8D|0#B-Q8f^JU?DN)gU%DHnj@Hax)K` zyG&8rv}phe)xY-L$SN8r0pi~M`?FVtAY1%)CORTQI!2CmJAeMsZsS+ZLMy<*CXMJ{ z0}G|1fji2hpC5EEnm&E<@2=IpT9YZtV_Yh!6p-uRCrYROyk;6P{sY|pxi>$1HxL3y z`>veYmFE2`R7#a5wd~oaAj;s#`0+p*k=T0RaAYc#cy2>tWY<}^W+7QcRn5rlNlj&W zv+m!Q^p__MXovkQkqEup!=8%dZ4=kZ{HtVy62L={W3r~RrY5V7l^$u=bGd2Bi?zJc zrOdf9-Dk!9{ylQ4yK;1Nw4tE^XpxQHx=Gu#e~x7Vox@}@Q*&Z1f0WW|!!Y+C zsdTJtNm(Kve8syhE8;9%UGp;tjgNK1r-$v$N)o=^b{5Pg46$jzHDF7bdJsm$>Q<^|3sAb@}O50yAwQOr2FR?jpo zH?Q0=uWbF;_-` zqrtO7mPsFO01Uw5yP>}RV#B@lXH2xU*|UTF4-Err#iI}JNMLtHsyrww$V#kO(>H?P z?Vm#=@}(Jeh3>OLaoU%F5l(#C3^cy$3PKg~u&S%KE3H%>C{rf%w!Wjfx_SrIt}bXe zj<|Q;8PBu4#!C(S`pm{?kS&ZeqeEir#49ajo zzzq!0;))s4u?XakAIzQ3@ch3CxqOEqe_nzx#19vZ$*;mU9%IE-(75o293Mxu z1nf;@2r9W6jY2Vqp=;?E`K9+Q!pAFQ&Go8wf}T@MNB1mM8HV(B#;<`SGVi5=0ki|n z2EX9-8-cPZ`|FI2%>`9_%`t#8z+f;S8rK+BNF-FoxYp-jmb+JTcJ^e74EV04b>@#Q z42?6(r*w99`gS~p@xi+c5C#StXHO{}h8>1ULu`9p{;EZVaBu*Y&{hm{(c>*iUoY;t zQ|4Qqb{seSKN{IxXvL#;5oH|=RT;=cJL9}u6yr`A)Ev^%b5+#j|0@~tm zpE@DMEwJ*tRGX`2f`=Bo@M&|a^2;iU2J+Y9$3LsXT98cAO(eJYyyFz5f7`2W($ XxfMA1JEH5C{9mUnZIR_CJZ}FJ_DDMT literal 3451 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 bzpwBE(o4xeCK!NI`2kp%@M`}WJoY~TkK})w diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-nav-hover-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-nav-hover-linux.png index a72b1cedc1f8b8b4fc59513680e161814d9f0674..2c62995b7d27a7edbed008f8dcc2ac10eedf0bea 100644 GIT binary patch literal 2583 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 DI2_$L diff --git a/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-nav-linux.png b/modules/banner/element-web/tests/snapshots/banner.spec.ts/univention-nav-linux.png index 1ce126e499914dc4fb32f9d9b3868c5e50ba0cef..f0870325ddbba510d65939e21381a9fcf869b4bf 100644 GIT binary patch delta 2328 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 From bb4a8b170e4d285e65c1b181a851cf1d961fa9ef Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 20 May 2025 13:43:25 +0100 Subject: [PATCH 14/15] Extract svg --- modules/banner/element-web/package.json | 3 ++- modules/banner/element-web/src/Menu.tsx | 8 ++------ modules/banner/element-web/src/trigger.svg | 3 +++ modules/banner/element-web/src/vite-env.d.ts | 8 ++++++++ modules/banner/element-web/vite.config.ts | 2 ++ 5 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 modules/banner/element-web/src/trigger.svg create mode 100644 modules/banner/element-web/src/vite-env.d.ts diff --git a/modules/banner/element-web/package.json b/modules/banner/element-web/package.json index 6aa9b89e56..f852df5db3 100644 --- a/modules/banner/element-web/package.json +++ b/modules/banner/element-web/package.json @@ -19,7 +19,8 @@ "rollup-plugin-external-globals": "^0.13.0", "typescript": "^5.7.3", "vite": "^6.0.11", - "vite-plugin-node-polyfills": "^0.23.0" + "vite-plugin-node-polyfills": "^0.23.0", + "vite-plugin-svgr": "^4.3.0" }, "dependencies": { "@radix-ui/react-dialog": "^1.1.6", diff --git a/modules/banner/element-web/src/Menu.tsx b/modules/banner/element-web/src/Menu.tsx index 447582822e..4649f64a77 100644 --- a/modules/banner/element-web/src/Menu.tsx +++ b/modules/banner/element-web/src/Menu.tsx @@ -14,6 +14,7 @@ import { InlineSpinner } from "@vector-im/compound-web"; import { StaticConfig } from "./config"; import type { Api } from "@element-hq/element-web-module-api"; import Logo from "./Logo.tsx"; +import TriggerIcon from "./trigger.svg?react"; const Sidebar = styled(motion.div)` padding: 0 var(--cpd-space-3x) var(--cpd-space-4x); @@ -199,12 +200,7 @@ const Menu: FC = ({ api, config, fallbackLogoUrl }) => { - - - + diff --git a/modules/banner/element-web/src/trigger.svg b/modules/banner/element-web/src/trigger.svg new file mode 100644 index 0000000000..72273ad287 --- /dev/null +++ b/modules/banner/element-web/src/trigger.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/modules/banner/element-web/src/vite-env.d.ts b/modules/banner/element-web/src/vite-env.d.ts new file mode 100644 index 0000000000..ef030aec3d --- /dev/null +++ b/modules/banner/element-web/src/vite-env.d.ts @@ -0,0 +1,8 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +/// diff --git a/modules/banner/element-web/vite.config.ts b/modules/banner/element-web/vite.config.ts index 79d308a798..f57993abbd 100644 --- a/modules/banner/element-web/vite.config.ts +++ b/modules/banner/element-web/vite.config.ts @@ -11,6 +11,7 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; import { nodePolyfills } from "vite-plugin-node-polyfills"; import externalGlobals from "rollup-plugin-external-globals"; +import svgr from "vite-plugin-svgr"; const __dirname = dirname(fileURLToPath(import.meta.url)); @@ -31,6 +32,7 @@ export default defineConfig({ }, plugins: [ react(), + svgr(), nodePolyfills({ include: ["events"], }), From 629b58bceaa969c82b7e493ebf77aca5587c9978 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 20 May 2025 13:43:35 +0100 Subject: [PATCH 15/15] Remove commented code --- modules/banner/element-web/tests/fixture/silent/index.html | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/banner/element-web/tests/fixture/silent/index.html b/modules/banner/element-web/tests/fixture/silent/index.html index 84072225b1..969c920d77 100644 --- a/modules/banner/element-web/tests/fixture/silent/index.html +++ b/modules/banner/element-web/tests/fixture/silent/index.html @@ -4,11 +4,6 @@ Univention Silent Login -