feat(theming): consolidate IONOS theming into apps/theming - #321
Open
tanyaka wants to merge 17 commits into
Open
feat(theming): consolidate IONOS theming into apps/theming#321tanyaka wants to merge 17 commits into
tanyaka wants to merge 17 commits into
Conversation
tanyaka
force-pushed
the
ionos-dev-v33-enhanced-theming
branch
5 times, most recently
from
August 27, 2026 13:16
c021630 to
fffdd84
Compare
Move IONOS theme class from apps-custom/nc_theming into the core theming app, mirroring the ncw-server pattern. Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de> Assisted-by: ClaudeCode:claude-sonnet-4-6
Inject IonosTheme into ThemesService so it is selectable and enforceable via enforce_theme = 'ionos' in system config. Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de> Assisted-by: ClaudeCode:claude-sonnet-4-6
tanyaka
force-pushed
the
ionos-dev-v33-enhanced-theming
branch
from
August 27, 2026 13:20
fffdd84 to
99020e8
Compare
There was a problem hiding this comment.
Pull request overview
This PR migrates IONOS-specific theming from external submodules into the core apps/theming app by introducing a native IonosTheme (ITheme implementation) and wiring it into ThemesService, alongside new CSS/assets and targeted tests.
Changes:
- Added
OCA\Theming\Themes\IonosThemeand registered it inThemesService(includingenforce_theme=ionosbehavior). - Migrated IONOS styling into
apps/theming/css/ionos/*and added Open Sans font assets. - Added/updated PHPUnit tests to cover the new theme and enforced-theme theme list.
Reviewed changes
Copilot reviewed 18 out of 34 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| apps/theming/lib/Themes/IonosTheme.php | New theme implementation providing IONOS variables, custom CSS, and font-face generation |
| apps/theming/lib/Service/ThemesService.php | Registers ionos theme provider in service and supports enforced theme selection including ionos |
| apps/theming/tests/Themes/IonosThemeTest.php | New unit tests for IonosTheme metadata/CSS variables/custom CSS |
| apps/theming/tests/Service/ThemesServiceTest.php | Extends themes list assertions and adds enforced-ionos test case |
| apps/theming/css/ionos/_layout.css | IONOS layout overrides (body background, header/content spacing) |
| apps/theming/css/ionos/variables.css | IONOS design tokens expressed as CSS custom properties |
| apps/theming/css/ionos/navigation.css | IONOS navigation styling overrides |
| apps/theming/css/ionos/buttons.css | IONOS button styling overrides across contexts |
| apps/theming/css/ionos/files.css | IONOS Files app UI tweaks (breadcrumbs, dialogs, hover/active styles) |
| apps/theming/css/ionos/files_sharing.css | IONOS public/share page styling overrides |
| apps/theming/css/ionos/guest.css | Guest/login footer styling adjustments and footer text replacement |
| apps/theming/fonts/OpenSans/OpenSans-Bold-webfont.svg | Added Open Sans font asset (SVG) |
| apps/theming/composer/composer/autoload_static.php | Adds classmap entry for IonosTheme |
| apps/theming/composer/composer/autoload_classmap.php | Adds classmap entry for IonosTheme |
| .gitmodules | Removes IONOS theming-related submodules |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
tanyaka
force-pushed
the
ionos-dev-v33-enhanced-theming
branch
2 times, most recently
from
August 28, 2026 08:29
a9dc4e9 to
b9bc12d
Compare
Copy CSS files, Open Sans font variants, and favicon from apps-custom/nc_theming into apps/theming in preparation for submodule removal. Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de> Assisted-by: ClaudeCode:claude-sonnet-4-6
Theming is now fully consolidated in apps/theming. The nc_theming app (override via DI container) and nc-ionos-theme (OC_Theme product identity) are no longer needed. Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de> Assisted-by: ClaudeCode:claude-sonnet-4-6
Updates submodule pointer to include: - enforce_theme: 'ionos' (was 'nc-ionos-theme') - configure.sh: FAVICON_DIR points to apps/theming/img - Makefile: nc_theming build target removed Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de> Assisted-by: ClaudeCode:claude-sonnet-4-6
margin: 0 was removing the top margin that positions content below the NC header. nc-ionos-theme's server.css previously compensated with margin-top: 64px !important. Replace with margin-top: var(--header-height) which is correct now that the OC_Theme is gone. Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de> Assisted-by: ClaudeCode:claude-sonnet-4-6
simplenavigation forces #header to 64px via !important, so --header-height must match for margin-top: var(--header-height) on #content-vue to be correct. --body-container-margin defaults to 8px in NC (2 * grid-baseline) which left a gap at the bottom; IONOS uses a flush full-height layout so 0px is correct. Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de> Assisted-by: ClaudeCode:claude-sonnet-4-6
Port missing rule from nc-ionos-theme/core/css/server.css which was previously loaded as OC_Theme CSS but is no longer applied. Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de> Assisted-by: ClaudeCode:claude-sonnet-4-6
Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de>
on breadcrumb new looking last button with a dropdown in V33 Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de>
… fix) 1.resize header icons References IONOS-Productivity/nc-simplenavigation#42 — mail/account icons 26px→30px, unified-search SVG max-size fix, icon gap 16px→8px. 2. fix parrword protected guest header Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de>
- Add --current-year CSS variable (set from date('Y') in IonosTheme::getCSSVariables())
so the guest-page footer copyright year is not hardcoded
- Use content: '© ' var(--current-year) ' IONOS SE' in public_share.css
Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de>
Assisted-by: ClaudeCode:claude-sonnet-4-6
Removed and fallback to default --default-line-height: 1.5; from css/default.css NC designed --default-line-height as a unitless ratio (like CSS line-height: 1.5), not a length. It is used in expressions such as: calc(var(--default-line-height) * 6 * var(--font-size-small)) With 24px this becomes px * px (invalid unit), which the browser discards — the property silently collapses to 0px. With the unitless default 1.5 it becomes number * number * px = px, which is valid. Setting a px value works where the variable is used directly as a line-height property (lengths are accepted there), but breaks every calc() multiplication. Removing the override lets DefaultTheme's 1.5 apply, which is visually equivalent (1.5 * 15px = 22.5px). Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de> Assisted-by: ClaudeCode:claude-sonnet-4-6
Remove ~560 lines targeting selectors that no longer exist in V33 (PHP-rendered public share UI was replaced by Vue in NC 25+): - @media rules for #header-primary-action / #header-actions-menu (replaced by #public-page-menu--primary / #public-page-menu) - #content.app-files_sharing subtree: .files-filestable, .files-controls, #view-toggle, #uploadprogressbar, .newFileMenu, .breadcrumb .crumbhome, #imgframe, #downloadFile.button, .popovermenu — all PHP-rendered, gone - #notemenu — never existed in V33 - #ionos-global-nav — from old OC_Theme custom header template, gone - .header-info :not(:has(+#content .directDownload)): .directDownload never exists in V33, permanently hiding .header-info (bug) Keep V33-alive selectors: - #app-sidebar-vue .sharingTab / .sharingTabDetailsView__quick-permissions - .guest-box card (password-protected share / file drop form) - li.vs__dropdown-option (SharingInput.vue uses Vue Select) Hide footer on public share pages (body#body-public footer.guest-box): layout.public.php renders a footer that is not part of the IONOS public share design. Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de> Assisted-by: ClaudeCode:claude-sonnet-4-6
…lic_share.css files_sharing.css now only contains sharing sidebar styles (#app-sidebar-vue .sharingTab, li.vs__dropdown-option). public_share.css gets the public page rules: - body#body-public footer.guest-box: hide footer on public share pages - .guest-box: card styling for password-protected shares and file drops Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de> Assisted-by: ClaudeCode:claude-sonnet-4-6
tanyaka
force-pushed
the
ionos-dev-v33-enhanced-theming
branch
from
August 28, 2026 12:54
075c75f to
061ddf6
Compare
… hover The original rule referenced --ion-button-tertiary-text-hover which is not defined anywhere in the IONOS CSS variables. Replace with the existing --ion-button-tertiary-text variable. The #body-login a.button selectors are live code: they target the two-factor provider selection page (twofactorselectchallenge.php), which renders under RENDER_AS_GUEST (body#body-login) and contains <a class="button primary two-factor-primary"> elements. Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de> Assisted-by: ClaudeCode:claude-sonnet-4-6
… SBOM matrix Both submodules (apps-custom/nc_theming and themes/nc-ionos-theme) were removed in a prior commit. Remove their SBOM matrix entries and the comment referencing the legacy theme. IONOS theming is now part of apps/theming which is covered by the root nextcloud entry. Signed-off-by: Tatjana Kaschperko Lindt <kaschperko-lindt@strato.de> Assisted-by: ClaudeCode:claude-sonnet-4-6
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Migrates IONOS-specific theming out of the two external submodules (`apps-custom/nc_theming`, `themes/nc-ionos-theme`) and into the core `apps/theming` app via a native `IonosTheme` class that implements Nextcloud's `ITheme` interface.
What changed
Dependencies
Test plan
AI disclosure
This implementation was assisted by Claude Code (claude-sonnet-4-6). All code has been reviewed, tested in a live Nextcloud container, and browser-verified by the contributor.