This commit is contained in:
2026-11-04 20:35:46 +01:00
parent 5f4de5e60c
commit 86abc097f4
348 changed files with 10300 additions and 0 deletions
@@ -0,0 +1,14 @@
{
"files": {
"Paths.xcu": "f0249a769fed68b4329baf57ac5c1bac",
"README.md": "c36760d40cae238078e2c8ceae480730",
"Theme_Colors.xcu": "9e3918407865e787a1081059d19187fd",
"apply.sh": "79b637c398e457e22e1975169c1f7f2f",
"description.xml": "810920710dcde3c1bfe9fb1ea671316c",
"light-screenshot.png": "ad688f5dc4feda44ed3da38827165497",
"pkg-description.en": "50f53d956476e61f87005bf9399e36f4",
"screenshot.png": "8f29907e3b5fd8a6471914503a3c8b2b",
"template.toml": "e1da6de79923919b05291dddf6ff5fd0"
},
"version": 1
}
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:name="Paths" oor:package="org.openoffice.Office">
<node oor:name="Paths">
<node oor:name="Palette">
<node oor:name="InternalPaths">
<node oor:name="%origin%/palettes" oor:op="fuse"/>
</node>
</node>
</node>
</oor:component-data>
@@ -0,0 +1,104 @@
# LibreOffice
Tested against LibreOffice 26.2.4.2 (Flatpak, `org.libreoffice.LibreOffice`).
## Why this ships as an extension, not a rendered config file
LibreOffice's main window chrome (menus, toolbars, buttons, dialogs) is drawn by its own widget
framework, not read from `gtk.css`. Confirmed live: an unmistakable
`window { background-color: #ff0000; }` override in
`~/.var/app/org.libreoffice.LibreOffice/config/gtk-3.0/gtk.css` had zero effect, even with the
GTK3 VCL plugin explicitly forced (`SAL_USE_VCLPLUGIN=gtk3`). LibreOffice's real theming
mechanism is its own **ColorScheme** system (Tools > Options > LibreOffice > Application Colors),
distributed as an installable `.oxt` extension package, the same format real community themes
like [libre-nord](https://github.com/gomesluiz/libre-nord) use.
## The property list is confirmed against LibreOffice's own source, not guessed
Every `ColorScheme` property name and its real meaning is confirmed against
[`officecfg/registry/schema/org/openoffice/Office/UI.xcs`](https://github.com/LibreOffice/core/blob/master/officecfg/registry/schema/org/openoffice/Office/UI.xcs)
in the LibreOffice/core repository, not a partial third-party example. This mattered in practice:
`FieldColor`'s own schema description is "Allows to overwrite the system field color", it
controls input/dropdown widget backgrounds, not document-embedded field shading the way its name
first suggests. An earlier pass mapped it to a literal document-shading color by analogy with a
third-party reference theme, and dropdown boxes, the Options sidebar, and text fields stayed on
a stock dark color as a result, exactly the kind of "confirmed working" that only turns out to
be partially true once someone actually looks closely. Fixed by mapping `FieldColor` to a real
Noctalia surface role, then cross-checking the *entire* property list against the schema (several
other properties, `DisabledColor`, `ActiveTextColor`, `InactiveColor`, and their pairs, were
missing from the theme entirely and are now set too).
Colors below are hex placeholders in the template source; `Theme_Colors.xcu` uses this schema's
own decimal-integer format, not hex, so `apply.sh` converts every value at render time (plain
`int(hex, 16)`, confirmed against the Document Foundation's own blog post examples).
## Document canvas and BASIC editor colors stay literal, deliberately
Same reasoning as darktable's neutral photo-viewing background: `DocColor`, `FontColor`,
`DocBoundaries`, `CalcGrid`, and the BASIC IDE syntax-highlighting colors are kept as sensible
literal light/dark values regardless of how dark the surrounding chrome is. A document is still
meant to look like a normal page (or be printed), and code syntax highlighting needs
distinguishable, conventional colors (keywords, strings, comments), not four or five UI accent
roles stretched over a dozen token types. These are functional, not chrome.
## Real gotchas found building this, not theoretical
- **The scheme has to be selected manually, once.** Installing the extension registers "Noctalia"
as an available option in the Scheme dropdown, it does not auto-select it. Confirmed live: same
behavior class as darktable's own theme dropdown. Go to Tools > Options > LibreOffice >
Application Colors, pick "Noctalia" from the Scheme dropdown, click Apply/OK. After that one
manual step, every later theme change re-renders and reinstalls the extension automatically
through Noctalia's own template pipeline, no further manual selection needed.
- **A restart is needed to see updated colors**, same as Heroic's own documented limitation.
Confirmed live: switching Noctalia's theme mode while LibreOffice was already open did not
change the running window at all; closing and reopening it did. This is not a bug in the
template, extensions are loaded at LibreOffice startup.
- **`unopkg add --force` alone is not reliable for reinstalling the same extension identifier.**
Confirmed live, the hard way: after several reinstalls it left the extension in a broken state,
`unopkg list` reported nothing installed at all, while a stale binary cache index
(`uno_packages/cache/uno_packages.pmap`) still pointed at a deleted temp directory, causing
every subsequent install attempt to fail with "file opening ... NOT_EXISTING" until the whole
cache directory was cleared by hand. `apply.sh` now explicitly `unopkg remove`s the extension
identifier before every `add`, ignoring failure since it may not be installed yet, rather than
relying on `--force` to handle that atomically.
- **`unopkg add` while LibreOffice is running can corrupt the install the same way.** `apply.sh`
checks for a running `soffice.bin` process first and skips the install step entirely if found,
rather than risk it, the `.oxt` is still rebuilt with the current colors either way, so the next
render (once LibreOffice is closed) or the next manual re-apply installs them, and a restart is
already required regardless.
- **`unopkg` is not on the sandbox's `PATH`** inside the Flatpak. Confirmed live:
`flatpak run --command=unopkg ...` fails with "No such file or directory", the full path
`/app/libreoffice/program/unopkg` is required.
- **If LibreOffice was open at the exact moment the theme changed, the install-skip above has no
automatic retry.** The `.oxt` still gets rebuilt with the current colors every render, but
since the install step is skipped while LibreOffice is running, closing LibreOffice alone is
not enough, nothing re-triggers the install afterward on its own. Confirmed live: after
changing the palette while LibreOffice was open, colors stayed stale even after closing and
reopening it, until `apply.sh` was run again by hand with LibreOffice closed. In practice this
means a color change made while LibreOffice happens to be open may need the theme re-applied
once more (`noctalia msg templates-apply`) after closing it, not just a restart.
## Native install
Same `unopkg` mechanism, invoked directly. `apply.sh` resolves `unopkg` from `PATH` first, then
falls back to the official TDF install layout (`/opt/libreoffice*/program/unopkg`,
`/usr/lib/libreoffice/program/unopkg`, `/usr/lib64/libreoffice/program/unopkg`) so the official
`.deb`/`.rpm` packages, which do **not** put `unopkg` on `PATH`, are detected too. If no native
`unopkg` is found it falls back to the Flatpak `flatpak run --command=` form.
**Verified live** against LibreOffice 26.2.4.2 from the official TDF `.deb` packages on
Kali Linux (amd64), including a clean-PATH run where `command -v unopkg` returned nothing and
`/opt/libreoffice26.2/program/unopkg` was picked up by the fallback; the extension installed
and registered correctly.
## Flatpak install (`org.libreoffice.LibreOffice`)
Extension cache lives at
`~/.var/app/org.libreoffice.LibreOffice/config/libreoffice/4/user/uno_packages/`. No
`flatpak override` needed.
## Status
Verified live against LibreOffice 26.2.4.2 (Flatpak) through Noctalia's own real render pipeline,
`community_ids` + local `community-templates/libreoffice/`, both dark and light mode, confirmed
after a restart in each case. Native install path is implemented but not live-tested.
@@ -0,0 +1,64 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Colors below are hex placeholders, {{ config_dir }}/apply.sh converts them to the decimal
integers this schema actually requires (standard int(hex, 16) RRGGBB conversion, confirmed
against LibreOffice/core's own officecfg/registry/schema/org/openoffice/Office/UI.xcs, the
authoritative source for every ColorScheme property name and description used below,
including FieldColor, which really does control input-widget backgrounds despite its name
reading like a document-field-shading setting at first glance). Chrome roles map to Noctalia
colors. Document/BASIC-editor colors stay literal, legible regardless of chrome darkness,
same reasoning as darktable's neutral photo-viewing background: these are functional, not
chrome. -->
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" oor:name="UI" oor:package="org.openoffice.Office">
<node oor:name="ColorScheme">
<node oor:name="ColorSchemes">
<node oor:name="Noctalia" oor:op="fuse">
<node oor:name="AppBackground"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface.default.hex_stripped}}</value></prop></node>
<node oor:name="DocColor"><prop oor:name="Color" oor:op="fuse"><value>f7f7fa</value></prop></node>
<node oor:name="FontColor"><prop oor:name="Color" oor:op="fuse"><value>1a1a1a</value></prop></node>
<node oor:name="DocBoundaries"><prop oor:name="Color" oor:op="fuse"><value>cccccc</value></prop></node>
<node oor:name="WindowColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface.default.hex_stripped}}</value></prop></node>
<node oor:name="WindowTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_surface.default.hex_stripped}}</value></prop></node>
<node oor:name="BaseColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface.default.hex_stripped}}</value></prop></node>
<node oor:name="ButtonColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface_container_high.default.hex_stripped}}</value></prop></node>
<node oor:name="ButtonTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_surface.default.hex_stripped}}</value></prop></node>
<node oor:name="AccentColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.primary.default.hex_stripped}}</value></prop></node>
<node oor:name="DisabledColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.outline_variant.default.hex_stripped}}</value></prop></node>
<node oor:name="DisabledTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_surface_variant.default.hex_stripped}}</value></prop></node>
<node oor:name="ShadowColor"><prop oor:name="Color" oor:op="fuse"><value>808080</value></prop></node>
<node oor:name="Shadow"><prop oor:name="Color" oor:op="fuse"><value xsi:nil="false" /></prop><prop oor:name="IsVisible" oor:op="fuse"><value>false</value></prop></node>
<node oor:name="SeparatorColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.outline_variant.default.hex_stripped}}</value></prop></node>
<node oor:name="FaceColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface_container.default.hex_stripped}}</value></prop></node>
<node oor:name="ActiveColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.primary.default.hex_stripped}}</value></prop></node>
<node oor:name="ActiveTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_primary.default.hex_stripped}}</value></prop></node>
<node oor:name="ActiveBorderColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.primary.default.hex_stripped}}</value></prop></node>
<node oor:name="FieldColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface_container_high.default.hex_stripped}}</value></prop></node>
<node oor:name="MenuBarColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface_container.default.hex_stripped}}</value></prop></node>
<node oor:name="MenuBarTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_surface.default.hex_stripped}}</value></prop></node>
<node oor:name="MenuBarHighlightColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.primary.default.hex_stripped}}</value></prop></node>
<node oor:name="MenuBarHighlightTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_primary.default.hex_stripped}}</value></prop></node>
<node oor:name="MenuColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface_container.default.hex_stripped}}</value></prop></node>
<node oor:name="MenuTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_surface.default.hex_stripped}}</value></prop></node>
<node oor:name="MenuHighlightColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.primary.default.hex_stripped}}</value></prop></node>
<node oor:name="MenuHighlightTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_primary.default.hex_stripped}}</value></prop></node>
<node oor:name="MenuBorderColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.outline.default.hex_stripped}}</value></prop></node>
<node oor:name="InactiveColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface_container.default.hex_stripped}}</value></prop></node>
<node oor:name="InactiveTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_surface_variant.default.hex_stripped}}</value></prop></node>
<node oor:name="InactiveBorderColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.outline_variant.default.hex_stripped}}</value></prop></node>
<node oor:name="BASICEditor"><prop oor:name="Color" oor:op="fuse"><value>ffffff</value></prop></node>
<node oor:name="BASICError"><prop oor:name="Color" oor:op="fuse"><value>d32f2f</value></prop></node>
<node oor:name="BASICIdentifier"><prop oor:name="Color" oor:op="fuse"><value>1a1a1a</value></prop></node>
<node oor:name="BASICKeyword"><prop oor:name="Color" oor:op="fuse"><value>0b57d0</value></prop></node>
<node oor:name="BASICNumber"><prop oor:name="Color" oor:op="fuse"><value>d97706</value></prop></node>
<node oor:name="BASICOperator"><prop oor:name="Color" oor:op="fuse"><value>444444</value></prop></node>
<node oor:name="BASICString"><prop oor:name="Color" oor:op="fuse"><value>15803d</value></prop></node>
<node oor:name="BASICComment"><prop oor:name="Color" oor:op="fuse"><value>6b7280</value></prop></node>
<node oor:name="WriterIdxShadings"><prop oor:name="Color" oor:op="fuse"><value>e8e8e8</value></prop><prop oor:name="IsVisible" oor:op="fuse"><value>true</value></prop></node>
<node oor:name="WriterFieldShadings"><prop oor:name="Color" oor:op="fuse"><value>e8e8e8</value></prop><prop oor:name="IsVisible" oor:op="fuse"><value>true</value></prop></node>
<node oor:name="CalcGrid"><prop oor:name="Color" oor:op="fuse"><value>d9d9d9</value></prop></node>
</node>
</node>
</node>
</oor:component-data>
@@ -0,0 +1,130 @@
#!/usr/bin/env bash
# Runs on every theme change (post_hook). Converts the rendered Theme_Colors.xcu's
# hex color values to the decimal integers LibreOffice's ColorScheme schema
# actually requires, assembles a fresh .oxt from this directory's static files
# plus the converted colors, and installs it via unopkg.
set -euo pipefail
CONFIG_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
RENDERED="${XDG_STATE_HOME:-$HOME/.local/state}/noctalia/libreoffice-theme-staging/Theme_Colors.xcu"
BUILD_DIR="$CONFIG_DIR/build"
OXT_PATH="$BUILD_DIR/noctalia-theme.oxt"
if [ ! -f "$RENDERED" ]; then
echo "noctalia libreoffice: rendered Theme_Colors.xcu not found at $RENDERED" >&2
exit 1
fi
rm -rf "$BUILD_DIR/pkg"
mkdir -p "$BUILD_DIR/pkg/META-INF"
# Convert every 6-hex-digit <value>...</value> to its decimal equivalent.
# ColorScheme's schema stores colors as base-10 integers, not hex strings.
python3 - "$RENDERED" "$BUILD_DIR/pkg/Theme_Colors.xcu" << 'PYEOF'
import re
import sys
src, dst = sys.argv[1], sys.argv[2]
with open(src) as f:
content = f.read()
def hex_to_dec(match):
return f"<value>{int(match.group(1), 16)}</value>"
converted = re.sub(r"<value>([0-9a-fA-F]{6})</value>", hex_to_dec, content)
with open(dst, "w") as f:
f.write(converted)
PYEOF
cp "$CONFIG_DIR/Paths.xcu" "$BUILD_DIR/pkg/Paths.xcu"
cp "$CONFIG_DIR/description.xml" "$BUILD_DIR/pkg/description.xml"
cp "$CONFIG_DIR/pkg-description.en" "$BUILD_DIR/pkg/pkg-description.en"
# Write the package manifest inline rather than copying it from the template directory.
# The template distribution pipeline only ships top-level files, so the
# META-INF/manifest.xml that used to live here was never delivered to users and
# the previous `cp` aborted under set -euo pipefail before the .oxt was built.
# The manifest is static and small, so generating it here keeps the template
# self-contained and removes the only subdirectory dependency.
cat > "$BUILD_DIR/pkg/META-INF/manifest.xml" <<'MANIFEST'
<?xml version="1.0" encoding="UTF-8"?>
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
<manifest:file-entry manifest:full-path="Theme_Colors.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
<manifest:file-entry manifest:full-path="Paths.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
</manifest:manifest>
MANIFEST
rm -f "$OXT_PATH"
(cd "$BUILD_DIR/pkg" && zip -qr "$OXT_PATH" .)
# unopkg add --force while LibreOffice is running has been confirmed live to
# silently corrupt the install (it can remove the old registration before
# failing to add the new one, leaving nothing installed at all). Skip the
# install step entirely rather than risk that -- the .oxt is still rebuilt
# above so the next run (once LibreOffice is closed) installs the current
# colors, and a restart is already required to see any change regardless.
if pgrep -x soffice.bin >/dev/null 2>&1; then
# The .oxt above is already rebuilt with the current colors, only the
# install step is skipped here. A restart alone does NOT pick up anything
# new, the previously-installed extension is still what's registered.
# Close LibreOffice, then re-run the theme apply (or wait for the next
# theme change) to actually install this build.
echo "noctalia libreoffice: LibreOffice is running, skipping extension install this run (installing while it's open has been confirmed to corrupt the existing install). Close LibreOffice, then re-apply the theme to actually install these colors, a restart alone will not pick them up." >&2
exit 0
fi
EXT_ID="dev.noctalia.libreoffice.theme"
INSTALLED_ANY=0
# `add --force` alone has been confirmed live to leave the extension in a
# broken state (a stale cache index pointing at a deleted temp dir, `list`
# then reports nothing installed at all, and every later reinstall fails
# with "file opening ... NOT_EXISTING" until the cache is cleared by hand).
# Explicitly removing the old registration first, ignoring failure since it
# may not be installed yet, avoids relying on --force to do that atomically.
# Install to every LibreOffice found, not just whichever `unopkg` a plain
# PATH lookup happens to resolve first. A machine with both a native
# LibreOffice (providing `unopkg` on PATH) and the Flatpak (the tested
# target) installed would otherwise only get themed on whichever one won
# that lookup, silently leaving the other one unthemed.
#
# Native detection here also covers the official TDF `.deb`/`.rpm` layout,
# which installs into /opt/libreoffice<major>.<minor>/ and does NOT place
# `unopkg` on PATH. `command -v unopkg` alone misses it, so fall back to the
# known install dirs before concluding there is no native install.
UNOPKG="$(command -v unopkg || true)"
if [ -z "$UNOPKG" ]; then
for candidate in /opt/libreoffice*/program/unopkg \
/usr/lib/libreoffice/program/unopkg \
/usr/lib64/libreoffice/program/unopkg; do
if [ -x "$candidate" ]; then
UNOPKG="$candidate"
break
fi
done
fi
if [ -n "$UNOPKG" ]; then
"$UNOPKG" remove "$EXT_ID" >/dev/null 2>&1 || true
if "$UNOPKG" add --force "$OXT_PATH" 2>&1; then
INSTALLED_ANY=1
else
echo "noctalia libreoffice: native unopkg install failed ($UNOPKG)" >&2
fi
fi
if flatpak info org.libreoffice.LibreOffice >/dev/null 2>&1; then
flatpak run --command=/app/libreoffice/program/unopkg org.libreoffice.LibreOffice remove "$EXT_ID" >/dev/null 2>&1 || true
if flatpak run --command=/app/libreoffice/program/unopkg org.libreoffice.LibreOffice add --force "$OXT_PATH" 2>&1; then
INSTALLED_ANY=1
else
echo "noctalia libreoffice: Flatpak unopkg install failed" >&2
fi
fi
if [ "$INSTALLED_ANY" -eq 0 ]; then
echo "noctalia libreoffice: no LibreOffice installation found (neither native unopkg on PATH nor the org.libreoffice.LibreOffice Flatpak)" >&2
fi
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
<manifest:file-entry manifest:full-path="Theme_Colors.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
<manifest:file-entry manifest:full-path="Paths.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
</manifest:manifest>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:name="Paths" oor:package="org.openoffice.Office">
<node oor:name="Paths">
<node oor:name="Palette">
<node oor:name="InternalPaths">
<node oor:name="%origin%/palettes" oor:op="fuse"/>
</node>
</node>
</node>
</oor:component-data>
@@ -0,0 +1,64 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Colors below are hex placeholders, /home/yuri/.local/state/noctalia/community-templates/libreoffice/apply.sh converts them to the decimal
integers this schema actually requires (standard int(hex, 16) RRGGBB conversion, confirmed
against LibreOffice/core's own officecfg/registry/schema/org/openoffice/Office/UI.xcs, the
authoritative source for every ColorScheme property name and description used below,
including FieldColor, which really does control input-widget backgrounds despite its name
reading like a document-field-shading setting at first glance). Chrome roles map to Noctalia
colors. Document/BASIC-editor colors stay literal, legible regardless of chrome darkness,
same reasoning as darktable's neutral photo-viewing background: these are functional, not
chrome. -->
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" oor:name="UI" oor:package="org.openoffice.Office">
<node oor:name="ColorScheme">
<node oor:name="ColorSchemes">
<node oor:name="Noctalia" oor:op="fuse">
<node oor:name="AppBackground"><prop oor:name="Color" oor:op="fuse"><value>1250068</value></prop></node>
<node oor:name="DocColor"><prop oor:name="Color" oor:op="fuse"><value>16250874</value></prop></node>
<node oor:name="FontColor"><prop oor:name="Color" oor:op="fuse"><value>1710618</value></prop></node>
<node oor:name="DocBoundaries"><prop oor:name="Color" oor:op="fuse"><value>13421772</value></prop></node>
<node oor:name="WindowColor"><prop oor:name="Color" oor:op="fuse"><value>1250068</value></prop></node>
<node oor:name="WindowTextColor"><prop oor:name="Color" oor:op="fuse"><value>15000290</value></prop></node>
<node oor:name="BaseColor"><prop oor:name="Color" oor:op="fuse"><value>1250068</value></prop></node>
<node oor:name="ButtonColor"><prop oor:name="Color" oor:op="fuse"><value>2763306</value></prop></node>
<node oor:name="ButtonTextColor"><prop oor:name="Color" oor:op="fuse"><value>15000290</value></prop></node>
<node oor:name="AccentColor"><prop oor:name="Color" oor:op="fuse"><value>12568530</value></prop></node>
<node oor:name="DisabledColor"><prop oor:name="Color" oor:op="fuse"><value>4474699</value></prop></node>
<node oor:name="DisabledTextColor"><prop oor:name="Color" oor:op="fuse"><value>12961483</value></prop></node>
<node oor:name="ShadowColor"><prop oor:name="Color" oor:op="fuse"><value>8421504</value></prop></node>
<node oor:name="Shadow"><prop oor:name="Color" oor:op="fuse"><value xsi:nil="false" /></prop><prop oor:name="IsVisible" oor:op="fuse"><value>false</value></prop></node>
<node oor:name="SeparatorColor"><prop oor:name="Color" oor:op="fuse"><value>4474699</value></prop></node>
<node oor:name="FaceColor"><prop oor:name="Color" oor:op="fuse"><value>2039584</value></prop></node>
<node oor:name="ActiveColor"><prop oor:name="Color" oor:op="fuse"><value>12568530</value></prop></node>
<node oor:name="ActiveTextColor"><prop oor:name="Color" oor:op="fuse"><value>2699577</value></prop></node>
<node oor:name="ActiveBorderColor"><prop oor:name="Color" oor:op="fuse"><value>12568530</value></prop></node>
<node oor:name="FieldColor"><prop oor:name="Color" oor:op="fuse"><value>2763306</value></prop></node>
<node oor:name="MenuBarColor"><prop oor:name="Color" oor:op="fuse"><value>2039584</value></prop></node>
<node oor:name="MenuBarTextColor"><prop oor:name="Color" oor:op="fuse"><value>15000290</value></prop></node>
<node oor:name="MenuBarHighlightColor"><prop oor:name="Color" oor:op="fuse"><value>12568530</value></prop></node>
<node oor:name="MenuBarHighlightTextColor"><prop oor:name="Color" oor:op="fuse"><value>2699577</value></prop></node>
<node oor:name="MenuColor"><prop oor:name="Color" oor:op="fuse"><value>2039584</value></prop></node>
<node oor:name="MenuTextColor"><prop oor:name="Color" oor:op="fuse"><value>15000290</value></prop></node>
<node oor:name="MenuHighlightColor"><prop oor:name="Color" oor:op="fuse"><value>12568530</value></prop></node>
<node oor:name="MenuHighlightTextColor"><prop oor:name="Color" oor:op="fuse"><value>2699577</value></prop></node>
<node oor:name="MenuBorderColor"><prop oor:name="Color" oor:op="fuse"><value>9343381</value></prop></node>
<node oor:name="InactiveColor"><prop oor:name="Color" oor:op="fuse"><value>2039584</value></prop></node>
<node oor:name="InactiveTextColor"><prop oor:name="Color" oor:op="fuse"><value>12961483</value></prop></node>
<node oor:name="InactiveBorderColor"><prop oor:name="Color" oor:op="fuse"><value>4474699</value></prop></node>
<node oor:name="BASICEditor"><prop oor:name="Color" oor:op="fuse"><value>16777215</value></prop></node>
<node oor:name="BASICError"><prop oor:name="Color" oor:op="fuse"><value>13840175</value></prop></node>
<node oor:name="BASICIdentifier"><prop oor:name="Color" oor:op="fuse"><value>1710618</value></prop></node>
<node oor:name="BASICKeyword"><prop oor:name="Color" oor:op="fuse"><value>743376</value></prop></node>
<node oor:name="BASICNumber"><prop oor:name="Color" oor:op="fuse"><value>14251782</value></prop></node>
<node oor:name="BASICOperator"><prop oor:name="Color" oor:op="fuse"><value>4473924</value></prop></node>
<node oor:name="BASICString"><prop oor:name="Color" oor:op="fuse"><value>1409085</value></prop></node>
<node oor:name="BASICComment"><prop oor:name="Color" oor:op="fuse"><value>7041664</value></prop></node>
<node oor:name="WriterIdxShadings"><prop oor:name="Color" oor:op="fuse"><value>15263976</value></prop><prop oor:name="IsVisible" oor:op="fuse"><value>true</value></prop></node>
<node oor:name="WriterFieldShadings"><prop oor:name="Color" oor:op="fuse"><value>15263976</value></prop><prop oor:name="IsVisible" oor:op="fuse"><value>true</value></prop></node>
<node oor:name="CalcGrid"><prop oor:name="Color" oor:op="fuse"><value>14277081</value></prop></node>
</node>
</node>
</node>
</oor:component-data>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<description xmlns="http://openoffice.org/extensions/description/2006"
xmlns:d="http://openoffice.org/extensions/description/2006"
xmlns:xlink="http://www.w3.org/1999/xlink">
<identifier value="dev.noctalia.libreoffice.theme" />
<version value="1.0.0" />
<publisher>
<name xlink:href="https://github.com/noctalia-dev/community-templates" lang="en">Noctalia</name>
</publisher>
<display-name>
<name lang="en">Noctalia Theme</name>
</display-name>
<extension-description>
<src xlink:href="pkg-description.en" lang="en" />
</extension-description>
</description>
@@ -0,0 +1,2 @@
Colors LibreOffice's application chrome (menus, toolbars, buttons, dialogs) to match the active
Noctalia palette. Installed and kept in sync automatically by Noctalia's own template pipeline.
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<description xmlns="http://openoffice.org/extensions/description/2006"
xmlns:d="http://openoffice.org/extensions/description/2006"
xmlns:xlink="http://www.w3.org/1999/xlink">
<identifier value="dev.noctalia.libreoffice.theme" />
<version value="1.0.0" />
<publisher>
<name xlink:href="https://github.com/noctalia-dev/community-templates" lang="en">Noctalia</name>
</publisher>
<display-name>
<name lang="en">Noctalia Theme</name>
</display-name>
<extension-description>
<src xlink:href="pkg-description.en" lang="en" />
</extension-description>
</description>
Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

@@ -0,0 +1,2 @@
Colors LibreOffice's application chrome (menus, toolbars, buttons, dialogs) to match the active
Noctalia palette. Installed and kept in sync automatically by Noctalia's own template pipeline.
Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

@@ -0,0 +1,8 @@
[catalog.libreoffice]
name = "LibreOffice"
category = "editor"
[templates.libreoffice]
input_path = "Theme_Colors.xcu"
output_path = "$XDG_STATE_HOME/noctalia/libreoffice-theme-staging/Theme_Colors.xcu"
post_hook = "bash '{{ config_dir }}/apply.sh'"