From 8a9fd36f3360e3b77036d5b6d0ed62014c0f5335 Mon Sep 17 00:00:00 2001 From: Ronni Baslund Date: Sun, 7 Jun 2026 12:14:04 +0200 Subject: [PATCH] feat(ocis): dezky whitelabel theme for the files web UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Skin OCIS web in the dezky brand so users don't see ownCloud/Infinite Scale. - Custom theme.json (WEB_UI_THEME_PATH + WEB_ASSET_THEMES_PATH): dezky name, slogan, logos (light wordmark for the dark top bar, dark wordmark for the light login, favicon), and the full dezky palette — carbon chrome, signal yellow as a sparing accent, paper/bone surfaces, dezky semantic colours - Pin the light theme as default (single variant) so OS-dark / auto-system always resolves to it - Override only index.html via WEB_ASSET_CORE_PATH (OCIS falls back to the embedded core per-file): hide the ".versions" footer ("Infinite Scale … / ownCloud Web UI …") and set the pre-hydration /theme-color to dezky Apache-2.0 lets us drop the ownCloud marks without trademark fees. NOTE: index.html pins the built bundle hashes — refresh it after an OCIS image bump. --- .../ocis/themes/dezky/assets/favicon.svg | 6 + .../ocis/themes/dezky/assets/logo-dark.svg | 10 + .../ocis/themes/dezky/assets/logo-light.svg | 10 + .../configs/ocis/themes/dezky/theme.json | 186 ++++++++++++++++++ .../configs/ocis/web-core/index.html | 185 +++++++++++++++++ .../docker-compose/docker-compose.yml | 14 ++ 6 files changed, 411 insertions(+) create mode 100644 infrastructure/docker-compose/configs/ocis/themes/dezky/assets/favicon.svg create mode 100644 infrastructure/docker-compose/configs/ocis/themes/dezky/assets/logo-dark.svg create mode 100644 infrastructure/docker-compose/configs/ocis/themes/dezky/assets/logo-light.svg create mode 100644 infrastructure/docker-compose/configs/ocis/themes/dezky/theme.json create mode 100644 infrastructure/docker-compose/configs/ocis/web-core/index.html diff --git a/infrastructure/docker-compose/configs/ocis/themes/dezky/assets/favicon.svg b/infrastructure/docker-compose/configs/ocis/themes/dezky/assets/favicon.svg new file mode 100644 index 0000000..52d9da5 --- /dev/null +++ b/infrastructure/docker-compose/configs/ocis/themes/dezky/assets/favicon.svg @@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"> + <rect x="8" y="8" width="84" height="84" rx="22" fill="#0A0A0A"/> + <path d="M 34.425 52 a 14 14 0 1 0 28 0 a 14 14 0 1 0 -28 0 Z M 41.925 52 a 6.5 6.5 0 1 0 13 0 a 6.5 6.5 0 1 0 -13 0 Z" fill-rule="evenodd" fill="#D4FF3A"/> + <path d="M 58.575 29.5 a 3.5 3.5 0 0 1 7 0 L 65.575 66 L 58.575 66 Z" fill="#D4FF3A"/> + <circle cx="74" cy="26" r="4" fill="#D4FF3A"/> +</svg> diff --git a/infrastructure/docker-compose/configs/ocis/themes/dezky/assets/logo-dark.svg b/infrastructure/docker-compose/configs/ocis/themes/dezky/assets/logo-dark.svg new file mode 100644 index 0000000..1c80500 --- /dev/null +++ b/infrastructure/docker-compose/configs/ocis/themes/dezky/assets/logo-dark.svg @@ -0,0 +1,10 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="300" height="80" viewBox="0 0 300 80" role="img" aria-label="dezky"> + <!-- dezky mark (signal yellow) --> + <g transform="translate(2,12) scale(0.56)" fill="#D4FF3A"> + <path d="M 34.425 52 a 14 14 0 1 0 28 0 a 14 14 0 1 0 -28 0 Z M 41.925 52 a 6.5 6.5 0 1 0 13 0 a 6.5 6.5 0 1 0 -13 0 Z" fill-rule="evenodd"/> + <path d="M 58.575 29.5 a 3.5 3.5 0 0 1 7 0 L 65.575 66 L 58.575 66 Z"/> + <circle cx="74" cy="26" r="4"/> + </g> + <!-- wordmark, dark (for the light login page) --> + <text x="66" y="53" font-family="'Inter Tight','Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif" font-size="44" font-weight="600" letter-spacing="-2" fill="#0A0A0A">dezky</text> +</svg> diff --git a/infrastructure/docker-compose/configs/ocis/themes/dezky/assets/logo-light.svg b/infrastructure/docker-compose/configs/ocis/themes/dezky/assets/logo-light.svg new file mode 100644 index 0000000..ac8f0d7 --- /dev/null +++ b/infrastructure/docker-compose/configs/ocis/themes/dezky/assets/logo-light.svg @@ -0,0 +1,10 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="300" height="80" viewBox="0 0 300 80" role="img" aria-label="dezky"> + <!-- dezky mark (signal yellow) --> + <g transform="translate(2,12) scale(0.56)" fill="#D4FF3A"> + <path d="M 34.425 52 a 14 14 0 1 0 28 0 a 14 14 0 1 0 -28 0 Z M 41.925 52 a 6.5 6.5 0 1 0 13 0 a 6.5 6.5 0 1 0 -13 0 Z" fill-rule="evenodd"/> + <path d="M 58.575 29.5 a 3.5 3.5 0 0 1 7 0 L 65.575 66 L 58.575 66 Z"/> + <circle cx="74" cy="26" r="4"/> + </g> + <!-- wordmark, light (for the dark top bar) --> + <text x="66" y="53" font-family="'Inter Tight','Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif" font-size="44" font-weight="600" letter-spacing="-2" fill="#F4F3EE">dezky</text> +</svg> diff --git a/infrastructure/docker-compose/configs/ocis/themes/dezky/theme.json b/infrastructure/docker-compose/configs/ocis/themes/dezky/theme.json new file mode 100644 index 0000000..21e2e60 --- /dev/null +++ b/infrastructure/docker-compose/configs/ocis/themes/dezky/theme.json @@ -0,0 +1,186 @@ +{ + "clients": { + "android": {}, + "desktop": {}, + "ios": {}, + "web": { + "defaults": { + "appBanner": {}, + "designTokens": { + "breakpoints": { + "large-default": "", + "large-max": "", + "medium-default": "", + "medium-max": "", + "small-default": "", + "small-max": "", + "xlarge": "", + "xsmall-max": "" + }, + "fontSizes": { + "default": "", + "large": "", + "medium": "" + }, + "sizes": { + "form-check-default": "", + "height-small": "", + "height-table-row": "", + "icon-default": "", + "max-height-logo": "", + "max-width-logo": "", + "tiles-default": "", + "tiles-resize-step": "", + "width-medium": "" + }, + "spacing": { + "large": "", + "medium": "", + "small": "", + "xlarge": "", + "xsmall": "", + "xxlarge": "" + } + }, + "loginPage": { + "backgroundImg": "" + }, + "logo": { + "topbar": "themes/dezky/assets/logo-light.svg", + "login": "themes/dezky/assets/logo-dark.svg", + "favicon": "themes/dezky/assets/favicon.svg" + } + }, + "themes": [ + { + "designTokens": { + "colorPalette": { + "background-accentuate": "rgba(212,255,58,0.12)", + "background-default": "#FAFAF7", + "background-highlight": "rgba(212,255,58,0.18)", + "background-hover": "rgba(10,10,10,0.03)", + "background-muted": "#F4F3EE", + "background-secondary": "#FFFFFF", + "border": "#E6E4DC", + "color-components-apptopbar-background": "transparent", + "color-components-apptopbar-border": "rgba(244,243,238,0.12)", + "icon-archive": "#fbbe54", + "icon-audio": "#700460", + "icon-document": "#3b44a6", + "icon-folder": "#0A0A0A", + "icon-image": "#ee6b3b", + "icon-medical": "#0984db", + "icon-pdf": "#ec0d47", + "icon-presentation": "#ee6b3b", + "icon-spreadsheet": "#15c286", + "icon-video": "#045459", + "input-bg": "#FFFFFF", + "input-border": "#D4D2C8", + "input-text-default": "#0A0A0A", + "input-text-muted": "rgba(10,10,10,0.4)", + "swatch-brand-contrast": "#F4F3EE", + "swatch-brand-default": "#0A0A0A", + "swatch-brand-hover": "#1F1F1C", + "swatch-danger-contrast": "#FFFFFF", + "swatch-danger-default": "#E23030", + "swatch-danger-hover": "#C52525", + "swatch-danger-muted": "rgb(204, 117, 117)", + "swatch-inverse-default": "#ffffff", + "swatch-inverse-hover": "#ffffff", + "swatch-inverse-muted": "#bfbfbf", + "swatch-passive-contrast": "#ffffff", + "swatch-passive-default": "#4c5f79", + "swatch-passive-hover": "#43536b", + "swatch-passive-hover-outline": "#f7fafd", + "swatch-passive-muted": "#283e5d", + "swatch-primary-contrast": "#F4F3EE", + "swatch-primary-default": "#0A0A0A", + "swatch-primary-gradient": "#0A0A0A", + "swatch-primary-gradient-hover": "#1F1F1C", + "swatch-primary-hover": "#1F1F1C", + "swatch-primary-muted": "rgba(10,10,10,0.08)", + "swatch-primary-muted-hover": "rgba(10,10,10,0.12)", + "swatch-success-contrast": "#FFFFFF", + "swatch-success-default": "#1F8A5B", + "swatch-success-hover": "#18774E", + "swatch-success-muted": "rgb(83, 150, 10)", + "swatch-warning-contrast": "#0A0A0A", + "swatch-warning-default": "#E89A1F", + "swatch-warning-hover": "#CE8714", + "swatch-warning-muted": "rgba(183, 76, 27, .5)", + "text-default": "#0A0A0A", + "text-inverse": "#F4F3EE", + "text-muted": "rgba(10,10,10,0.55)" + } + }, + "isDark": false, + "name": "dezky" + } + ] + } + }, + "common": { + "logo": "themes/dezky/assets/logo-dark.svg", + "name": "dezky", + "shareRoles": { + "1c996275-f1c9-4e71-abdf-a42f6495e960": { + "iconName": "upload", + "label": "UnifiedRoleEditorLite" + }, + "2d00ce52-1fc2-4dbc-8b95-a73b73395f5a": { + "iconName": "pencil", + "label": "UnifiedRoleFileEditor" + }, + "312c0871-5ef7-4b3a-85b6-0e4074c64049": { + "iconName": "user-star", + "label": "UnifiedRoleManager" + }, + "3284f2d5-0070-4ad8-ac40-c247f7c1fb27": { + "iconName": "pencil", + "label": "UnifiedRoleSpaceEditorWithoutVersions" + }, + "58c63c02-1d89-4572-916a-870abc5a1b7d": { + "iconName": "pencil", + "label": "UnifiedRoleSpaceEditor" + }, + "63e64e19-8d43-42ec-a738-2b6af2610efa": { + "iconName": "stop-circle", + "label": "UnifiedRoleFullDenial" + }, + "a8d5fe5e-96e3-418d-825b-534dbdf22b99": { + "iconName": "eye", + "label": "UnifiedRoleSpaceViewer" + }, + "aa97fe03-7980-45ac-9e50-b325749fd7e6": { + "iconName": "shield", + "label": "UnifiedRoleSecureView" + }, + "b1e2218d-eef8-4d4c-b82d-0f1a1b48f3b5": { + "iconName": "eye", + "name": "UnifiedRoleViewer" + }, + "c1235aea-d106-42db-8458-7d5610fb0a67": { + "iconName": "pencil", + "label": "UnifiedRoleFileEditorListGrants" + }, + "d5041006-ebb3-4b4a-b6a4-7c180ecfb17d": { + "iconName": "eye", + "name": "UnifiedRoleViewerListGrants" + }, + "e8ea8b21-abd4-45d2-b893-8d1546378e9e": { + "iconName": "pencil", + "label": "UnifiedRoleEditorListGrants" + }, + "fb6c3e19-e378-47e5-b277-9732f9de6e21": { + "iconName": "pencil", + "label": "UnifiedRoleEditor" + } + }, + "slogan": "dezky – sikker plads til dine data", + "urls": { + "accessDeniedHelp": "https://dezky.eu", + "imprint": "https://dezky.eu/terms", + "privacy": "https://dezky.eu/privacy" + } + } +} diff --git a/infrastructure/docker-compose/configs/ocis/web-core/index.html b/infrastructure/docker-compose/configs/ocis/web-core/index.html new file mode 100644 index 0000000..4cf106d --- /dev/null +++ b/infrastructure/docker-compose/configs/ocis/web-core/index.html @@ -0,0 +1,185 @@ +<!DOCTYPE html><html lang="en"><head><base href="/"/> + <script>window.WEB_APPS_MAP = {"web-app-activities":"./web-app-activities-C6-nUzaG.mjs","web-app-admin-settings":"./web-app-admin-settings-eamF9H1m.mjs","web-app-epub-reader":"./web-app-epub-reader-CBWsf2Xc.mjs","web-app-external":"./web-app-external-CThGwBtU.mjs","web-app-files":"./web-app-files-jkl0xRBD.mjs","web-app-ocm":"./web-app-ocm-jjhlU3lY.mjs","web-app-pdf-viewer":"./web-app-pdf-viewer-CogKBhpf.mjs","web-app-preview":"./web-app-preview-DpHPMA7r.mjs","web-app-search":"./web-app-search-Bozc2TEu.mjs","web-app-text-editor":"./web-app-text-editor-BogOmQ6Y.mjs","web-app-webfinger":"./web-app-webfinger-CpqRkzON.mjs","web-app-app-store":"./web-app-app-store-C5GXswMi.mjs"}</script> + + <meta charset="utf-8"/> + <meta name="viewport" content="initial-scale=1.0, minimum-scale=1.0"/> + <meta name="theme-color" content="#0A0A0A"/> + <meta http-equiv="x-ua-compatible" content="IE=edge"/> + + <title>dezky + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +

Your browser is not supported

+
+
+ +
+ + +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/infrastructure/docker-compose/docker-compose.yml b/infrastructure/docker-compose/docker-compose.yml index c69eb03..05fc0f5 100644 --- a/infrastructure/docker-compose/docker-compose.yml +++ b/infrastructure/docker-compose/docker-compose.yml @@ -357,11 +357,25 @@ services: OCIS_ADD_RUN_SERVICES: audit AUDIT_LOG_FILE_PATH: /var/log/ocis/audit.log AUDIT_LOG_FORMAT: json + # Whitelabel: serve our dezky theme dir under /themes/ and make it the + # active web theme (replaces the built-in ownCloud branding — name, logos, + # favicon, colours). Apache-2.0 lets us drop the ownCloud marks entirely. + WEB_ASSET_THEMES_PATH: /etc/ocis/web-themes + WEB_UI_THEME_PATH: /themes/dezky/theme.json + # Override ONLY index.html (OCIS layers WEB_ASSET_CORE_PATH over the + # embedded core via a fallback FS, so every other asset still serves from + # the binary). Our index hides the version footer (.versions) and sets the + # pre-hydration /theme-color to dezky. NOTE: index.html pins the + # built bundle hashes — refresh it from the live `/` after an OCIS image + # bump (or drop this mount) so the script refs stay valid. + WEB_ASSET_CORE_PATH: /etc/ocis/web-core volumes: - ocis_config:/etc/ocis - ocis_data:/var/lib/ocis - ocis_audit_log:/var/log/ocis - ./configs/ocis/csp.yaml:/etc/ocis/csp.yaml:ro + - ./configs/ocis/themes:/etc/ocis/web-themes:ro + - ./configs/ocis/web-core:/etc/ocis/web-core:ro networks: [dezky] depends_on: - authentik-server