Compare commits

..
Author SHA1 Message Date
deepend 9e3daf494f msi/msix support 2026-10-13 19:13:50 -06:00
deepend 4f7add046c match theme better 2026-10-12 19:05:31 -06:00
deepend-tildeclub 61ec9af5e3 Merge pull request #420 from ZoiteChat/docs-theme-update
update theme to match new site
2026-10-12 17:11:27 -07:00
deepend 412dc92b10 update theme to match new site 2026-10-12 18:04:49 -06:00
deepend-tildeclub 04dab3dcd6 Merge pull request #412 from TehPeGaSuS/wrap-align-no-indent
Add option to align wrapped lines under the nick or message
2026-10-12 15:28:33 -07:00
ThePeGaSuS c51f885253 add option to align wrapped lines under the nick or message
When nick indentation is off, lines after the first wrap back to the
left edge, under the timestamp. Add a text_wrap_align preference
(start of line, prefix, message) so they can line up under the nick or
the message text instead. It is applied at wrap time, so existing
scrollback is re-wrapped when the setting changes, and the menu is
greyed out while nick indentation is on.
2026-10-12 17:43:09 +02:00
deepend-tildeclub aa7e20fee9 Merge pull request #417 from botovq/push-kwovwrnwwuzn
Minor simplification of _SSL_get_cert_info ()
2026-10-12 06:40:46 -07:00
deepend-tildeclub 480b99b1e7 Merge pull request #413 from B4reMetal/hex-color-parsing
feat(xtext): render \x04 hex color codes in chat text
2026-10-12 06:37:19 -07:00
BareMetal 0a4367b1da fix(xtext): move hexcolor_parse to its own file for the standalone xtext tests
master's new xtext_tests target compiles xtext.c on its own with only
GTK linked, so hexcolor_parse cannot live in util.c. Keep it in a
dependency-free hexcolor.c that both test targets compile, and register
it in the Visual Studio project for the Windows build.

Claude-Session: https://claude.ai/code/session_01Jxd4AknGzdAENADWAGHCzx
2026-10-11 23:58:09 -06:00
BareMetal 39daca9d22 feat(xtext): render \x04 hex color codes in chat text 2026-10-11 23:54:08 -06:00
deepend-tildeclub d614e25792 Merge pull request #419 from ZoiteChat/xtext-modernize
modernize rendering and fix scrollback resizing
2026-10-11 22:48:52 -07:00
deepend 30209d0c99 modernize rendering and fix scrollback resizing 2026-10-11 23:02:13 -06:00
Theo Buehler e1c44feb01 Minor simplification of _SSL_get_cert_info ()
Instead of retrieving the AlgorithmIdentifier and then reaching into it
to get the OID, the relevant OID can be obtained directly from the same
function.
2026-10-11 17:45:37 +02:00
deepend 5af8f4ede1 correct echo-message capability negotiation 2026-10-03 19:52:16 -06:00
deepend-tildeclub e11604fd62 Merge pull request #405 from ZoiteChat/fix-dialog-layout
make dialog content fill available space
2026-10-01 05:23:22 -07:00
deepend a2e8d9087e make dialog content fill available space 2026-09-30 16:22:47 -06:00
deepend-tildeclub edf268dc0f Merge pull request #404 from ZoiteChat/run-as-root
Block root unless --run-as-root
2026-09-30 10:23:51 -07:00
deepend e03ea59f3c Block root unless --run-as-root 2026-09-30 10:42:28 -06:00
deepend f0b2840668 ensure fixes added to main site are reflected on docs site 2026-09-29 15:33:41 -06:00
deepend-tildeclub 4f2fc49475 Merge pull request #402 from ZoiteChat/docs-theme-fixes
docs site theme consistency fixes
2026-09-29 08:51:46 -07:00
deepend 2e4155bbfc docs site theme consistency fixes 2026-09-29 09:50:22 -06:00
deepend-tildeclub ca2456cbc6 Merge pull request #401 from ZoiteChat/fix-ircv3-typing
Fix IRCv3 typing notifications
2026-09-26 05:52:36 -07:00
deepend 222b4868f5 Fix IRCv3 typing notifications 2026-09-26 06:10:20 -06:00
deepend-tildeclub 2cf1f7e833 Merge pull request #398 from ZoiteChat/fix-issue-361
restrict input redraws to the entry widget
2026-09-19 22:33:03 -07:00
deepend 776d24695e keep X11 selection ownership off the chat window 2026-09-18 05:29:03 -06:00
deepend-tildeclub 64a9c6e5d7 Merge pull request #397 from ZoiteChat/fix-issue-392
Fix Wayland text selection crash
2026-09-17 10:14:14 -07:00
deepend 66196013bc Fix Wayland text selection crash 2026-09-16 16:23:38 -06:00
deepend-tildeclub 61ff308c9f Merge pull request #395 from B4reMetal/fix-userlist-color-pref
fix(userlist): decouple userlist nick colors from text_color_nicks
2026-09-16 14:00:16 -07:00
deepend 2672f9b087 Start acknowleding 2.20 development 2026-09-16 01:16:35 -06:00
deepend 4315a75a12 add 2.19.1 release notes 2026-09-16 00:10:49 -06:00
BareMetal 15905bebb1 fix(userlist): decouple userlist nick colors from text_color_nicks 2026-09-15 19:38:34 -06:00
deepend-tildeclub fc4a7454ad Merge pull request #391 from ZoiteChat/fix-away-tracking
Fix away tracking
2026-09-15 11:45:16 -07:00
deepend 87410aea50 Fix away tracking 2026-09-15 12:30:04 -06:00
deepend-tildeclub de98d00a1c Merge pull request #390 from ZoiteChat/fix-issue-369
defer channel tree scrolling until realized
2026-09-14 05:36:00 -07:00
deepend e94ffd9d79 defer channel tree scrolling until realized 2026-09-14 04:11:23 -06:00
deepend-tildeclub d7aebb784d Merge pull request #387 from ZoiteChat/tab-font-custom
add custom tab fonts and reduce close button size
2026-09-14 02:56:19 -07:00
deepend-tildeclub 20b8cb939d Merge pull request #389 from ZoiteChat/fix-issue-386
fix theme service tests
2026-09-14 02:47:50 -07:00
deepend ff4217c3d1 fix theme service tests 2026-09-13 15:34:56 -06:00
deepend 4fb72d30d8 add custom tab fonts and reduce close button size 2026-09-12 06:43:08 -06:00
deepend-tildeclub d2b8fc0bda Merge pull request #352 from ZoiteChat/inline-images
support inline images in chat.
2026-09-11 02:51:36 -07:00
deepend 951181628a Bundle GIO TLS support in AppImage 2026-09-11 03:30:43 -06:00
deepend-tildeclub ccee274847 Merge pull request #384 from salahcoronya/build-improvements
Fix build bug and improve build process
2026-09-11 02:13:17 -07:00
deepend 967f6728ef Use OpenSSL for Win HTTPS image downloads 2026-09-11 02:58:53 -06:00
deepend-tildeclub bf11ffb626 Merge pull request #379 from ZoiteChat/fix-issue-373
Add formatting status bar to input box
2026-09-11 01:14:09 -07:00
deepend c12cabbe4e Add formatting status bar to input box 2026-09-10 22:40:11 -06:00
deepend-tildeclub e997594db9 Merge pull request #346 from ZoiteChat/emoji-major-updates
New Emoji Menu and Emoji Version 17.0 support.
2026-09-10 19:16:01 -07:00
deepend 6f5e3b395f fix failed CI builds 2026-09-10 19:55:33 -06:00
deepend 8bf2caf20d Unified emoji support across builds, fixed picker bugs, and added CI checks. 2026-09-10 07:13:41 -06:00
Christopher Byrne 040021ee0e buuld: Fix deprecated features since 0.56
Now the the minimum is 0.59, silence some warning in Meson:

dependency.get_pkgconfig_variable becomes
depenency.get_variable(pkgconfig: 'var_name')
executable(gui_app = true) becomes
executable(win_subsystem = 'windows')

Signed-off-by: Christopher Byrne <[email protected]>
2026-09-07 20:57:29 -05:00
Christopher Byrne 5018a3a848 meson.build: Reflect usage of 0.59 Meson features
src/fe-gtk/meson.build calls feature_opt.allowed() which wasn't
added until 0.59.

Signed-off-by: Christopher Byrne <[email protected]>
2026-09-07 20:57:29 -05:00
Christopher Byrne df1c74a91d data/misc/meson.build: Fix referencing possibly undefined variable "appstreamcli"
If meson is passed -Dinstall-plugin-metainfo=false, the "appstreamcli"
will not be defined, but it is later referenced in global scope, which
causes and "undefined variable" error in Meson

Signed-off-by: Christopher Byrne <[email protected]>
2026-09-07 20:57:21 -05:00
deepend bb3893d36c Fix channel ACTION routing after self-message handling 2026-09-03 09:27:07 -06:00
deepend-tildeclub fe57449f6c Merge pull request #374 from TehPeGaSuS/fix/weechat-relay-pm-split
Fix private messages splitting into two windows over WeeChat's IRC relay
2026-09-03 08:20:55 -07:00
ThePeGaSuS c725adaa09 Fix CTCP ACTION not rerouting self-sent /me to correct PM window
Mirrors the PRIVMSG fix: replayed /me messages sent by our own nick
via WeeChat relay backlog were always passed with fromme=FALSE,
so they never got rerouted to the actual PM query window.
2026-09-03 08:51:21 +02:00
deepend-tildeclub 7731bfa4e0 Merge pull request #377 from ZoiteChat/retain-searched-text-view
unblock navigation when in search
2026-09-02 09:46:13 -07:00
deepend e72546aaec fix accidental removal of mg_apply_emoji_fallback_widget (entry); 2026-09-02 10:43:09 -06:00
deepend d6d648f0f4 unblock navigation when in search 2026-09-02 10:41:21 -06:00
deepend-tildeclub 56fddd56f5 Merge pull request #340 from bgermann/winspell
Require Enchant 2.8.19+ and drop win8 provider
2026-09-01 15:06:11 -07:00
Bastian Germann 3c9c350bc0 win32: Set Enchant prefix dir to install location
Enchant looks for its providers (including the WinSpell spellcheck
provider) under a hardcoded default path derived from its build
prefix, which is C:\gtk-build\gtk\x64\release\lib\enchant-2 when
built via gvsbuild. After installation, the provider DLLs live
under ZoiteChat's own install directory, so Enchant fails to find
them and spellcheck silently stops working.

Call enchant_set_prefix_dir() to redirect Enchant's provider search
to <install_dir> before the first enchant_broker_init().
enchant_set_prefix_dir() expects the installation prefix itself;
Enchant adds lib\enchant-2 when searching for providers.
The symbol is loaded optionally since it may not exist in older
Enchant builds; if missing, behavior is unchanged.
2026-09-01 21:36:40 +02:00
Bastian Germann 8340a04bd6 win32: Use parentheses to be independent of and/or evaluation order
The Version.NTPlatform shall be true for every evaluation of the if
branch.
2026-08-31 14:45:31 +02:00
Bastian Germann ccef70fd3d Clarify comments about spelling provider 2026-08-31 14:29:16 +02:00
Bastian Germann 0650fa7bbe win32: Reference enchant-2 in installer 2026-08-31 14:17:58 +02:00
Bastian Germann 5cffa06385 Update gvsbuild to version with updated enchant 2026-08-31 14:17:58 +02:00
Bastian Germann 4df17a151e Require Enchant 2.8.19+ and drop win8 provider
Require Enchant 2.8.19 or newer so Windows can use upstream winspell.
Remove the in-tree libenchant_win8 provider project and sources.
Update runtime library probing to prefer Enchant 2 library names.
2026-08-31 14:17:58 +02:00
deepend c8e314b690 docs version uses VERSION file 2026-08-30 23:39:07 -06:00
deepend 3d91f3c235 fix build issue for readthedocs.io 2026-08-30 23:19:20 -06:00
deepend 32cd536ada combine docs into zoitechat repo 2026-08-30 23:13:52 -06:00
ThePeGaSuS 0ba523d071 Fix: private messages split into two windows over WeeChat's IRC relay
When you send a private message, ZoiteChat sometimes gets the same
message echoed back by the server so it can show it in the right
window. Whether it recognizes that echo depended on the server first
confirming a feature called "echo-message" during connection setup.

WeeChat's relay doesn't seem to confirm that feature the way other
servers (or ZNC) do, so ZoiteChat didn't recognize its own echoed
messages and treated them as brand new incoming messages from
yourself, opening a second, separate conversation window instead of
using the one you were already typing in.

This makes ZoiteChat recognize its own message by checking who sent
it, instead of only trusting that feature confirmation. That way,
sent and received messages always end up in the same conversation
window, regardless of how well the server/relay announces its
capabilities.
2026-08-28 20:48:12 +02:00
deepend-tildeclub 314171b2b1 Merge pull request #367 from ZoiteChat/release/2.19
WIN32: fix installer theme download URL.
2026-08-16 01:38:36 -06:00
deepend-tildeclub 32b6de0c3a Merge pull request #366 from ZoiteChat/release/2.19-flatpak-error-startup
fix startup error on flatpak
2026-08-15 12:38:30 -06:00
deepend-tildeclub 7e22e7b67d Merge pull request #365 from ZoiteChat/release/2.19
Release/2.19
2026-08-15 12:37:35 -06:00
deepend 36f0d7450c fix startup error on flatpak 2026-08-15 12:20:18 -06:00
228 changed files with 60960 additions and 1999 deletions
+25 -20
View File
@@ -30,13 +30,13 @@ jobs:
gettext \
libcanberra-dev libglib2.0-dev \
libarchive-dev \
libgtk-3-dev \
libgtk-3-dev libfontconfig1-dev libpango1.0-dev xvfb xauth dbus-daemon at-spi2-core \
libwayland-client0 libwayland-cursor0 libwayland-egl1 \
libxkbcommon0 \
libgtk-3-bin libglib2.0-bin shared-mime-info gsettings-desktop-schemas \
libgtk-3-bin libglib2.0-bin glib-networking shared-mime-info gsettings-desktop-schemas \
liblua5.4-dev libpci-dev libperl-dev libssl-dev libayatana-appindicator3-dev \
perl python3 python3-minimal python3-dev python3-cffi mono-devel desktop-file-utils \
fonts-noto-color-emoji breeze-gtk-theme \
breeze-gtk-theme \
patchelf file curl
- name: Configure
@@ -56,6 +56,9 @@ jobs:
set -eux
ninja -C build
- name: Test emoji catalog, font coverage and picker
run: xvfb-run -a dbus-run-session -- meson test -C build --print-errorlogs "Emoji Data Tests" "Emoji Font Tests" "Emoji UI Tests"
- name: Install to AppDir
run: |
set -eux
@@ -119,15 +122,8 @@ jobs:
cp -a /usr/lib/x86_64-linux-gnu/libpython3*.so* AppDir/usr/lib/x86_64-linux-gnu/
fi
if [ -d "/usr/share/gtk-3.0/emoji" ]; then
install -d AppDir/usr/share/gtk-3.0
cp -a /usr/share/gtk-3.0/emoji AppDir/usr/share/gtk-3.0/
fi
if [ -f "/usr/share/fonts/truetype/noto/NotoColorEmoji.ttf" ]; then
install -d AppDir/usr/share/fonts/truetype/noto
cp -a /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf AppDir/usr/share/fonts/truetype/noto/
fi
# Every package ships the pinned font, including portable builds.
cmp data/fonts/NotoColorEmoji.ttf AppDir/usr/share/fonts/zoitechat/NotoColorEmoji.ttf
if [ -d "/usr/lib/x86_64-linux-gnu/gtk-3.0/modules" ]; then
install -d AppDir/usr/lib/x86_64-linux-gnu/gtk-3.0
@@ -139,6 +135,20 @@ jobs:
cp -a /usr/lib/gtk-3.0/modules AppDir/usr/lib/gtk-3.0/
fi
# HTTPS inline-image downloads use GSocketClient TLS on Linux.
# GLib provides the API, but TLS and system-proxy support live in
# loadable GIO modules shipped by glib-networking. Bundle those
# modules so the AppImage does not depend on the host copy.
gio_module_dir="$(pkg-config --variable=giomoduledir gio-2.0)"
test -n "$gio_module_dir"
test -f "${gio_module_dir}/libgiognutls.so"
install -d "AppDir${gio_module_dir}"
cp -a "${gio_module_dir}"/libgio*.so "AppDir${gio_module_dir}/"
gio-querymodules "AppDir${gio_module_dir}"
test -f "AppDir${gio_module_dir}/libgiognutls.so"
test -s "AppDir${gio_module_dir}/giomodule.cache"
- name: Verify bundled plugins
run: |
set -eux
@@ -192,14 +202,6 @@ jobs:
export GTK_PATH="$gtk_path_entries${GTK_PATH:+:$GTK_PATH}"
fi
if [ -d "$APPDIR/etc/fonts" ]; then
export FONTCONFIG_SYSROOT="$APPDIR"
export FONTCONFIG_PATH="$APPDIR/etc/fonts${FONTCONFIG_PATH:+:$FONTCONFIG_PATH}"
if [ -f "$APPDIR/etc/fonts/fonts.conf" ]; then
export FONTCONFIG_FILE="$APPDIR/etc/fonts/fonts.conf"
fi
fi
if [ -d "$APPDIR/usr/lib/x86_64-linux-gnu/zoitechat/plugins" ]; then
export ZOITECHAT_LIBDIR="$APPDIR/usr/lib/x86_64-linux-gnu/zoitechat/plugins"
elif [ -d "$APPDIR/usr/lib/zoitechat/plugins" ]; then
@@ -258,6 +260,9 @@ jobs:
export PYTHONPATH="$pythonpath_entries${PYTHONPATH:+:$PYTHONPATH}"
fi
# Register the private font without hiding the host's normal fonts.
export ZOITECHAT_EMOJI_FONT="${ZOITECHAT_EMOJI_FONT:-$APPDIR/usr/share/fonts/zoitechat/NotoColorEmoji.ttf}"
# OpenSSL trust store override
export SSL_CERT_FILE="${SSL_CERT_FILE:-$APPDIR/etc/ssl/certs/ca-certificates.crt}"
export SSL_CERT_DIR="${SSL_CERT_DIR:-$APPDIR/etc/ssl/certs}"
+41 -1
View File
@@ -66,9 +66,33 @@ jobs:
Download-WithRetry -Url https://github.com/jrsoftware/issrc/releases/download/is-6_7_1/innosetup-6.7.1.exe -OutFile deps\innosetup-unicode.exe
& deps\innosetup-unicode.exe /VERYSILENT | Out-Null
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.18.1/GTK3_Gvsbuild_zoitechat-2.18.1_x64.zip -OutFile deps\gtk-${{ matrix.arch }}.zip
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.20.0-alpha.1/GTK3_Gvsbuild_zoitechat-2.20.0-alpha.1_x64.zip -OutFile deps\gtk-${{ matrix.arch }}.zip
Expand-Archive -LiteralPath deps\gtk-${{ matrix.arch }}.zip -DestinationPath C:\gtk-build\gtk\x64\release -Force
# The GTK3 archive omits librsvg. Add only its renderer, loader and
# license from the companion release, keeping the GTK3 DLLs intact.
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.20.0-alpha.1/GTK4_Gvsbuild_zoitechat-2.20.0-alpha.1_x64.zip -OutFile deps\svg-runtime.zip
if ((Get-FileHash deps\svg-runtime.zip -Algorithm SHA256).Hash -ne 'fb657f9ebae3a6807defb15e66091d643a703ee66cb37488e3e11e5646f45adb') {
throw 'Unexpected SVG runtime archive checksum'
}
$svgArchive = [System.IO.Compression.ZipFile]::OpenRead((Resolve-Path deps\svg-runtime.zip))
try {
foreach ($name in @('bin/rsvg-2-2.dll', 'lib/gdk-pixbuf-2.0/2.10.0/loaders/pixbufloader_svg.dll', 'share/doc/librsvg/COPYING.LIB')) {
$entry = $svgArchive.GetEntry($name)
if ($null -eq $entry) { throw "Missing SVG runtime file: $name" }
$destination = Join-Path 'C:\gtk-build\gtk\x64\release' $name
New-Item -ItemType Directory -Path (Split-Path $destination) -Force | Out-Null
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $destination, $true)
}
}
finally { $svgArchive.Dispose() }
# This loads the module now, catching missing DLLs before the build.
& C:\gtk-build\gtk\x64\release\bin\gdk-pixbuf-query-loaders.exe --update-cache
if ($LASTEXITCODE -ne 0) { throw 'Could not generate the pixbuf loader cache' }
if (-not (Select-String -LiteralPath 'C:\gtk-build\gtk\x64\release\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache' -SimpleMatch '"svg"')) {
throw 'SVG loader could not be loaded with the GTK3 runtime'
}
Download-WithRetry -Url https://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-hicolor-icon-theme-0.18-1-any.pkg.tar.zst -OutFile deps\hicolor-icon-theme.pkg.tar.zst
python -c "import tarfile,zstandard,pathlib;archive=pathlib.Path(r'deps\\hicolor-icon-theme.pkg.tar.zst');target=pathlib.Path(r'C:\\gtk-build\\gtk\\x64\\release');dctx=zstandard.ZstdDecompressor();f=archive.open('rb');reader=dctx.stream_reader(f);tf=tarfile.open(fileobj=reader,mode='r|');[tf.extract(m,path=target) for m in tf if m.name.startswith('mingw64/share/icons/hicolor/')];tf.close();reader.close();f.close()"
@@ -174,6 +198,22 @@ jobs:
)
shell: cmd
- name: Test emoji catalog, font coverage and picker
shell: cmd
run: |
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
set "PATH=%CD%\..\zoitechat-build\x64\rel;%PATH%"
set "GDK_PIXBUF_MODULE_FILE=%CD%\..\zoitechat-build\x64\rel\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache"
set "ZOITECHAT_EMOJI_FONT=%CD%\..\zoitechat-build\x64\rel\share\fonts\zoitechat\NotoColorEmoji.ttf"
fc /b data\fonts\NotoColorEmoji.ttf "%ZOITECHAT_EMOJI_FONT%"
if errorlevel 1 exit /b 1
for %%T in (data font ui) do (
msbuild win32\emoji-tests.vcxproj /m /verbosity:minimal /p:Configuration=Release /p:Platform=x64 /p:EmojiTestKind=%%T
if errorlevel 1 exit /b 1
..\zoitechat-build\x64\tests\emoji-%%T-tests.exe --tap
if errorlevel 1 exit /b 1
)
- name: Preparing Artifacts
run: |
move ..\zoitechat-build\${{ matrix.platform }}\ZoiteChat-*.exe .\
+57 -11
View File
@@ -71,9 +71,36 @@ jobs:
Download-WithRetry -Url https://github.com/jrsoftware/issrc/releases/download/is-6_7_1/innosetup-6.7.1.exe -OutFile deps\innosetup-unicode.exe
& deps\innosetup-unicode.exe /VERYSILENT | Out-Null
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.18.1/GTK3_Gvsbuild_zoitechat-2.18.1_x64.zip -OutFile deps\gtk-${{ matrix.arch }}.zip
# Use the same GTK runtime as the existing Windows EXE workflow.
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.20.0-alpha.1/GTK3_Gvsbuild_zoitechat-2.20.0-alpha.1_x64.zip -OutFile deps\gtk-${{ matrix.arch }}.zip
Expand-Archive -LiteralPath deps\gtk-${{ matrix.arch }}.zip -DestinationPath C:\gtk-build\gtk\x64\release -Force
# The GTK3 bundle does not contain librsvg. Restore the renderer,
# pixbuf loader, and license from the matching GTK4 bundle. Do not
# replace the rest of the GTK3 runtime with GTK4 libraries.
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.20.0-alpha.1/GTK4_Gvsbuild_zoitechat-2.20.0-alpha.1_x64.zip -OutFile deps\svg-runtime.zip
if ((Get-FileHash deps\svg-runtime.zip -Algorithm SHA256).Hash -ne 'fb657f9ebae3a6807defb15e66091d643a703ee66cb37488e3e11e5646f45adb') {
throw 'Unexpected SVG runtime archive checksum'
}
$svgArchive = [System.IO.Compression.ZipFile]::OpenRead((Resolve-Path deps\svg-runtime.zip))
try {
foreach ($name in @('bin/rsvg-2-2.dll', 'lib/gdk-pixbuf-2.0/2.10.0/loaders/pixbufloader_svg.dll', 'share/doc/librsvg/COPYING.LIB')) {
$entry = $svgArchive.GetEntry($name)
if ($null -eq $entry) { throw "Missing SVG runtime file: $name" }
$destination = Join-Path 'C:\gtk-build\gtk\x64\release' $name
New-Item -ItemType Directory -Path (Split-Path $destination) -Force | Out-Null
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $destination, $true)
}
}
finally { $svgArchive.Dispose() }
# Ensure SVG remains loadable before compiling or packaging.
& C:\gtk-build\gtk\x64\release\bin\gdk-pixbuf-query-loaders.exe --update-cache
if ($LASTEXITCODE -ne 0) { throw 'Could not generate the pixbuf loader cache' }
if (-not (Select-String -LiteralPath 'C:\gtk-build\gtk\x64\release\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache' -SimpleMatch '"svg"')) {
throw 'SVG loader could not be loaded with the GTK3 runtime'
}
Download-WithRetry -Url https://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-hicolor-icon-theme-0.18-1-any.pkg.tar.zst -OutFile deps\hicolor-icon-theme.pkg.tar.zst
python -c "import tarfile,zstandard,pathlib;archive=pathlib.Path(r'deps\\hicolor-icon-theme.pkg.tar.zst');target=pathlib.Path(r'C:\\gtk-build\\gtk\\x64\\release');dctx=zstandard.ZstdDecompressor();f=archive.open('rb');reader=dctx.stream_reader(f);tf=tarfile.open(fileobj=reader,mode='r|');[tf.extract(m,path=target) for m in tf if m.name.startswith('mingw64/share/icons/hicolor/')];tf.close();reader.close();f.close()"
@@ -180,6 +207,24 @@ jobs:
exit /b 1
)
# Master added native emoji font staging and tests after the release
# branch split. Run these before packaging so MSI/MSIX use verified files.
- name: Test emoji catalog, font coverage and picker
shell: cmd
run: |
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
set "PATH=%CD%\..\zoitechat-build\x64\rel;%PATH%"
set "GDK_PIXBUF_MODULE_FILE=%CD%\..\zoitechat-build\x64\rel\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache"
set "ZOITECHAT_EMOJI_FONT=%CD%\..\zoitechat-build\x64\rel\share\fonts\zoitechat\NotoColorEmoji.ttf"
fc /b data\fonts\NotoColorEmoji.ttf "%ZOITECHAT_EMOJI_FONT%"
if errorlevel 1 exit /b 1
for %%T in (data font ui) do (
msbuild win32\emoji-tests.vcxproj /m /verbosity:minimal /p:Configuration=Release /p:Platform=x64 /p:EmojiTestKind=%%T
if errorlevel 1 exit /b 1
..\zoitechat-build\x64\tests\emoji-%%T-tests.exe --tap
if errorlevel 1 exit /b 1
)
- name: Install WiX Toolset
shell: pwsh
run: |
@@ -202,12 +247,12 @@ jobs:
throw "VERSION '$rawVersion' does not begin with an MSI-compatible major.minor.patch version"
}
# Windows Installer ProductVersion is numeric. Keep the full project
# version in the artifact filename while using major.minor.patch in MSI.
# Keep the full development version in the filename, while MSI's
# ProductVersion is numeric (e.g. 2.20.0-dev -> 2.20.0).
$msiVersion = "$($Matches[1]).$($Matches[2]).$($Matches[3])"
$safeVersion = $rawVersion -replace '[^0-9A-Za-z._-]', '-'
$sourceDir = (Resolve-Path "..\zoitechat-build\${{ matrix.platform }}\rel").Path
$outputPath = Join-Path $PWD "ZoiteChat-$safeVersion_${{ matrix.arch }}.msi"
$outputPath = Join-Path $PWD "ZoiteChat-${safeVersion}_${{ matrix.arch }}.msi"
if (-not (Test-Path (Join-Path $sourceDir 'zoitechat.exe'))) {
throw "Staged ZoiteChat executable is missing from $sourceDir"
@@ -253,7 +298,9 @@ jobs:
'system.png',
'hcperl.dll',
'hcpython3.dll',
'hcpython38.dll'
'hcpython38.dll',
'NotoColorEmoji.ttf',
'OFL.txt'
)) {
$match = Get-ChildItem -Path $adminImage -Filter $requiredFile -File -Recurse | Select-Object -First 1
if ($null -eq $match) {
@@ -312,16 +359,15 @@ jobs:
}
}
# Partner Center reserves the fourth version field and requires it to
# be zero in submitted Windows 10/11 app packages.
# Partner Center reserves the fourth field as 0. A -dev version
# is packaged as a valid 2.20.0.0, without changing VERSION.
$packageVersion = "$($versionParts[0]).$($versionParts[1]).$($versionParts[2]).0"
$safeVersion = $rawVersion -replace '[^0-9A-Za-z._-]', '-'
$sourceDir = (Resolve-Path "..\zoitechat-build\${{ matrix.platform }}\rel").Path
$outputPath = Join-Path $PWD "ZoiteChat-$safeVersion_${{ matrix.arch }}.msix"
$outputPath = Join-Path $PWD "ZoiteChat-${safeVersion}_${{ matrix.arch }}.msix"
# Microsoft Store identity reserved for ZoiteChat in Partner Center.
# These three values are case-sensitive and must exactly match the
# Product identity page for the Store submission.
# Reserved ZoiteChat identity from the release branch. Adjust only
# if the Product identity page in Partner Center changes.
$identityName = 'deependtilde.ZoiteChat'
$publisher = 'CN=6C7766BB-6AC6-488B-A09E-E3F8E68E63E4'
$publisherDisplayName = 'deepend_tilde'
+7
View File
@@ -0,0 +1,7 @@
version: 2
sphinx:
configuration: 'docs/conf.py'
build:
os: 'ubuntu-22.04'
tools:
python: '3.11'
+23
View File
@@ -336,3 +336,26 @@ proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
======================================================================
ADDITIONAL LICENSE NOTICE
======================================================================
ZoiteChat source code:
GPL version 2
See Above.
Unicode Emoji and CLDR data:
Unicode License v3
data/emoji/LICENSE-UNICODE.txt
gemoji shortcode data:
MIT License
Copyright (c) 2019 GitHub, Inc.
data/emoji/LICENSE-GEMOJI.txt
Noto Color Emoji:
SIL Open Font License 1.1
data/fonts/OFL.txt
+1 -1
View File
@@ -1 +1 @@
2.19.1
2.20.0-dev
+39
View File
@@ -0,0 +1,39 @@
UNICODE LICENSE V3
COPYRIGHT AND PERMISSION NOTICE
Copyright © 1991-2026 Unicode, Inc.
NOTICE TO USER: Carefully read the following legal agreement. BY
DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR
SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT
DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
Permission is hereby granted, free of charge, to any person obtaining a
copy of data files and any associated documentation (the "Data Files") or
software and any associated documentation (the "Software") to deal in the
Data Files or Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, and/or sell
copies of the Data Files or Software, and to permit persons to whom the
Data Files or Software are furnished to do so, provided that either (a)
this copyright and permission notice appear with all copies of the Data
Files or Software, or (b) this copyright and permission notice appear in
associated Documentation.
THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
THIRD PARTY RIGHTS.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA
FILES OR SOFTWARE.
Except as contained in this notice, the name of a copyright holder shall
not be used in advertising or otherwise to promote the sale, use or other
dealings in these Data Files or Software without prior written
authorization of the copyright holder.
+30
View File
@@ -0,0 +1,30 @@
# Bundled emoji data
These are pinned copies of the upstream data files that
`tools/gen-emoji-data.py` compiles into ZoiteChat's emoji picker catalog
at build time. Bundling them means every ZoiteChat package exposes the
same emoji, names, categories and search keywords, independent of the
GTK runtime version or the emoji data a distribution installs under
`/usr/share/gtk-3.0/emoji`.
Nothing here affects what is sent over IRC: the picker inserts plain
Unicode sequences. Official builds register the bundled Noto Color Emoji
font privately for consistent rendering, while preserving platform font
fallback if registration is unavailable.
| File | Source | Version |
| ---- | ------ | ------- |
| `emoji-test.txt` | [Unicode emoji data](https://unicode.org/Public/emoji/17.0/emoji-test.txt) (mirrored at [unicode-org/unicodetools](https://github.com/unicode-org/unicodetools/blob/main/unicodetools/data/emoji/17.0/emoji-test.txt)) | Emoji 17.0 |
| `cldr-annotations-en.xml` | [unicode-org/cldr](https://github.com/unicode-org/cldr/blob/release-48/common/annotations/en.xml) `common/annotations/en.xml` | CLDR release 48 |
| `cldr-annotations-derived-en.xml` | [unicode-org/cldr](https://github.com/unicode-org/cldr/blob/release-48/common/annotationsDerived/en.xml) `common/annotationsDerived/en.xml` | CLDR release 48 |
| `gemoji.json` | [github/gemoji](https://github.com/github/gemoji/blob/v4.1.0/db/emoji.json) `db/emoji.json` | v4.1.0 |
The pinned versions are recorded in `VERSIONS`.
## Licenses
- `emoji-test.txt`, `cldr-annotations-en.xml`,
`cldr-annotations-derived-en.xml`: © Unicode, Inc., distributed under
the [Unicode License v3](https://www.unicode.org/license.txt).
- `gemoji.json`: from the gemoji project, MIT licensed,
© GitHub, Inc.
+6
View File
@@ -0,0 +1,6 @@
# Pinned versions of the emoji source data in this directory.
# Keep in sync with the files themselves; tools/gen-emoji-data.py
# verifies unicode-emoji against the emoji-test.txt header.
unicode-emoji=17.0
cldr=48
gemoji=4.1.0
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+23479
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.
+91
View File
@@ -0,0 +1,91 @@
Copyright 2013 Google LLC
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) shall not be
used to promote, endorse or advertise any Modified Version, except to
acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s)
or with their explicit written permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
+43
View File
@@ -0,0 +1,43 @@
# Bundled emoji font
`NotoColorEmoji.ttf` reports Noto Color Emoji version 2.051 and covers
Unicode Emoji 17.0. It is vendored from Debian's
`fonts-noto-color-emoji` 2.051 package, built from the corresponding
Google Noto Emoji release.
Every GTK build installs this exact file: Windows (installer and portable
build files), AppImage, Flatpak and native Meson/RPM builds. It is loaded
into a private Pango/FreeType font map as `ZoiteChat Emoji`; an older system
Noto font cannot replace it. No font is installed globally on Windows.
Chat windows and the emoji picker share this map. Fontconfig still loads
system fonts and configuration for ordinary text, and the configured text
font, size and style remain in effect. In particular, plain digits, `#`
and `*` are not assigned emoji metrics.
Windows uses the same FreeType backend rather than GDI registration or an
OS-version-specific picker. The dependency bundle already ships FreeType,
Fontconfig and PangoFT2. This rendering path does not require Windows' native
color-font support. Actual Windows 7 execution still needs testing on that OS.
Meson requires PangoFT2 >= 1.44 and Fontconfig >= 2.13. Normal installations
load `share/fonts/zoitechat/NotoColorEmoji.ttf` beneath the configured data
directory; Windows resolves it relative to the executable. AppImage sets
`ZOITECHAT_EMOJI_FONT` to its own copy. For an uninstalled development build:
```sh
ZOITECHAT_EMOJI_FONT="$PWD/data/fonts/NotoColorEmoji.ttf" build/src/fe-gtk/zoitechat
```
A missing/unloadable file logs a warning and retains system-font fallback.
CI verifies the installed copy and tests catalog/font coverage; AppImage and
Windows also run the interactive picker regression tests. Native themes,
DPI and different Pango/Cairo versions can still affect pixel-level output.
Upstream release: https://github.com/googlefonts/noto-emoji/releases/tag/v2.051
Vendored file SHA-256:
`dac5c27651082d6c53dab5081f50d2022ddf6877d730fa919cf6a4fc2af22de0`
The font is distributed under the SIL Open Font License 1.1. See
`OFL.txt`.
+13
View File
@@ -0,0 +1,13 @@
emoji_font_dir = join_paths(get_option('datadir'), 'fonts', 'zoitechat')
emoji_font_doc_dir = join_paths(get_option('datadir'), 'doc', 'zoitechat', 'fonts')
install_data(
'NotoColorEmoji.ttf',
install_dir: emoji_font_dir,
)
install_data(
'OFL.txt',
'README.md',
install_dir: emoji_font_doc_dir,
)
+1
View File
@@ -3,6 +3,7 @@ if get_option('plugin')
endif
if get_option('gtk-frontend')
subdir('fonts')
subdir('icons')
subdir('misc')
subdir('man')
@@ -29,6 +29,22 @@
<id>zoitechat.desktop</id>
</provides>
<releases>
<release date="2026-09-15" version="2.19.1">
<description>
<ul>
<li>Fixed /msg messages showing twice on servers using IRCv3 <code>echo-message</code>.</li>
<li>Fixed escaping a leading command slash so <code>//text</code> sends <code>/text</code> as normal chat.</li>
<li>Fixed automatic away clearing when sending messages on servers using <code>echo-message</code>.</li>
<li>Fixed other users' away status not updating until rejoining a channel when <code>away-notify</code> updates are missed.</li>
<li>Fixed private messages and <code>/me</code> actions being routed to the wrong window when using WeeChat's IRC relay, while preserving channel ACTION routing.</li>
<li>Fixed a Flatpak startup error caused by the D-Bus service still using the old HexChat app ID.</li>
<li>Fixed optional Windows 10 theme downloads in the Windows installer.</li>
<li>Fixed the GTK warning when switching from channel tabs to the channel tree.</li>
<li>Fixed GTK3 theme archive root detection so themes with an <code>index.theme</code> file are preferred correctly.</li>
<li>Fixed source-build configuration when plugin AppStream metadata installation is disabled, and corrected the minimum Meson version to 0.59.</li>
</ul>
</description>
</release>
<release date="2026-07-28" version="2.19.0">
<description>
<ul>
+15
View File
@@ -0,0 +1,15 @@
# Source https://coderwall.com/p/wws2uq
sudo: false
language: python
python:
- "2.7"
cache:
pip: true
custom_install: true
# command to install dependencies
install: pip install --upgrade Sphinx
# command to run tests
script: sphinx-build -n -b html -d _build/doctrees . _build/html
# Flags used here, not in `make html`:
# -n Run in nit-picky mode. Currently, this generates warnings for all missing references.
# -W Turn warnings into errors. This means that the build stops at the first warning and sphinx-build exits with exit status 1.
+94
View File
@@ -0,0 +1,94 @@
[main]
host = https://www.transifex.com
type = PO
[zoitechat-documentation.addons]
file_filter = po/<lang>/LC_MESSAGES/addons.po
source_file = _build/locale/addons.pot
source_lang = en
[zoitechat-documentation.appearance]
file_filter = po/<lang>/LC_MESSAGES/appearance.po
source_file = _build/locale/appearance.pot
source_lang = en
[zoitechat-documentation.building]
file_filter = po/<lang>/LC_MESSAGES/building.po
source_file = _build/locale/building.pot
source_lang = en
[zoitechat-documentation.changelog]
file_filter = po/<lang>/LC_MESSAGES/changelog.po
source_file = _build/locale/changelog.pot
source_lang = en
[zoitechat-documentation.commands]
file_filter = po/<lang>/LC_MESSAGES/commands.po
source_file = _build/locale/commands.pot
source_lang = en
#[zoitechat-documentation.developers]
#file_filter = po/<lang>/LC_MESSAGES/developers.po
#source_file = _build/locale/developers.pot
#source_lang = en
[zoitechat-documentation.faq]
file_filter = po/<lang>/LC_MESSAGES/faq.po
source_file = _build/locale/faq.pot
source_lang = en
#[zoitechat-documentation.getting_started]
#file_filter = po/<lang>/LC_MESSAGES/getting_started.po
#source_file = _build/locale/getting_started.pot
#source_lang = en
#[zoitechat-documentation.helping]
#file_filter = po/<lang>/LC_MESSAGES/helping.po
#source_file = _build/locale/helping.pot
#source_lang = en
#[zoitechat-documentation.index]
#file_filter = po/<lang>/LC_MESSAGES/index.po
#source_file = _build/locale/index.pot
#source_lang = en
#[zoitechat-documentation.perl_modules]
#file_filter = po/<lang>/LC_MESSAGES/perl_modules.po
#source_file = _build/locale/perl_modules.pot
#source_lang = en
#[zoitechat-documentation.plugins]
#file_filter = po/<lang>/LC_MESSAGES/plugins.po
#source_file = _build/locale/plugins.pot
#source_lang = en
#[zoitechat-documentation.script_dbus]
#file_filter = po/<lang>/LC_MESSAGES/script_dbus.po
#source_file = _build/locale/script_dbus.pot
#source_lang = en
#[zoitechat-documentation.script_javascript]
#file_filter = po/<lang>/LC_MESSAGES/script_javascript.po
#source_file = _build/locale/script_javascript.pot
#source_lang = en
#[zoitechat-documentation.script_perl]
#file_filter = po/<lang>/LC_MESSAGES/script_perl.po
#source_file = _build/locale/script_perl.pot
#source_lang = en
#[zoitechat-documentation.script_python]
#file_filter = po/<lang>/LC_MESSAGES/script_python.po
#source_file = _build/locale/script_python.pot
#source_lang = en
[zoitechat-documentation.settings]
file_filter = po/<lang>/LC_MESSAGES/settings.po
source_file = _build/locale/settings.pot
source_lang = en
[zoitechat-documentation.tips]
file_filter = po/<lang>/LC_MESSAGES/tips.po
source_file = _build/locale/tips.pot
source_lang = en
+157
View File
@@ -0,0 +1,157 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
-rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/ZoiteChat.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ZoiteChat.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/ZoiteChat"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ZoiteChat"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
server:
@cd $(BUILDDIR)/html
@python -u -m SimpleHTTPServer
+85
View File
@@ -0,0 +1,85 @@
# ZoiteChat documentation
## Getting started
* Install [Python 3](https://www.python.org/)
* Install pip for Python 3
* Install Sphinx: `python -m pip install sphinx`
* On Windows: ensure your Python 3 installation is on `PATH`
* Run `make html` to build the HTML files
* Run the Python webserver to test your changes: `make server`
(http://localhost:8000/)
## Conventions
* 4 Spaces are used for indentation.
* Ordered or unordered lists use visual indentation, where any non-list
subelement would use an indentation of a multiple of 4 again.
Example:
```rest
- a list item
- a list item
with a visually indented continuation
- a list item with a sub-list
- that is also visually indented
- a list item with a code block
.. code-block:: none
that is not visually indented
```
## HTML theme
The `zoitechat` theme inherits Sphinx's built-in `basic` theme. It uses the
same compact layout, blue navigation, and system fonts as zoitechat.org.
Appearance starts in System mode on each page. Light and Dark are available
for the current page; no cookies or browser storage are used.
The theme's templates are in `_theme/zoitechat/`. Its readable CSS and
JavaScript are in `_static/css/zoitechat-docs.css` and
`_static/js/zoitechat-docs.js`. No minification, JavaScript package manager,
external fonts, or CDN assets are required.
Navigation URLs, including `zoite_atlas_url`, are configured through
`html_context` in `conf.py`. The logo
is `_static/zoitechat-logo.svg`. Standard Sphinx search, indexes, source
links, anchors, translations, and previous/next links remain available.
The HTML output also works as locally installed documentation; project-site
links only access the network when clicked.
Build from the repository root:
```sh
sphinx-build -b html docs docs/_build/html
```
Use a clean output directory when switching themes, so stale Basicstrap
assets from an earlier build are not included in a package.
## Debian packaging
The active theme does not use the bundled Basicstrap, Bootstrap, jQuery,
jQuery Cookie, Font Awesome, or icon fonts. Its font stack includes DejaVu
Sans and DejaVu Sans Mono; no font files are bundled by the theme.
Packagers may exclude `docs/_theme/basicstrap/` from the source package.
The default theme continues to build without that directory. No pre-minified
third-party assets need to be added or rebuilt for this theme.
Build with the distribution's `python3-sphinx`. After installing the HTML
into the package staging directory, use `dh_sphinxdoc` (or `dh --with
sphinxdoc`) to replace Sphinx's standard JavaScript files with system
symlinks. Include `${sphinxdoc:Depends}` in the package dependencies and
`${sphinxdoc:Built-Using}` where required for generated assets. The custom
`zoitechat-docs.js` remains a small, readable project source file.
A built-in theme is still selectable with `-D html_theme=classic` if a
packager needs a different layout. The old RST content has existing build
diagnostics; changing the theme does not suppress or alter them.
Shared website chrome is in `_static/css/zoitechat-site.css`, copied from the main site. Keep that readable stylesheet in sync when changing the shared header, navigation, typography, or colours.
Binary file not shown.
+843
View File
@@ -0,0 +1,843 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Keep the docs close to the desktop client and the main project's website. */
:root {
color-scheme: light;
--page: #ffffff;
--panel: #f1f2f3;
--text: #25282c;
--muted: #58616b;
--line: #bdc3c9;
--soft-line: #dce0e4;
--blue: #215a9e;
--link: #174f92;
--selection: #e6effa;
--code: #f2f4f6;
--comment: #58616b;
--string: #236741;
--number: #7842ab;
--font: system-ui, -apple-system, "Segoe UI", "DejaVu Sans", sans-serif;
--mono: Consolas, "DejaVu Sans Mono", "Liberation Mono", monospace;
}
html[data-theme="dark"] {
color-scheme: dark;
--page: #191c1f;
--panel: #25292d;
--text: #eef0f2;
--muted: #b2bbc4;
--line: #50575e;
--soft-line: #353c43;
--blue: #2865a8;
--link: #8dc0ff;
--selection: #233951;
--code: #111518;
--comment: #b2bbc4;
--string: #92d5ab;
--number: #dfacff;
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme]) {
color-scheme: dark;
--page: #191c1f;
--panel: #25292d;
--text: #eef0f2;
--muted: #b2bbc4;
--line: #50575e;
--soft-line: #353c43;
--blue: #2865a8;
--link: #8dc0ff;
--selection: #233951;
--code: #111518;
--comment: #b2bbc4;
--string: #92d5ab;
--number: #dfacff;
}
}
* {
box-sizing: border-box;
}
html {
scroll-padding-top: 16px;
}
body {
margin: 0;
padding: 0;
background: var(--page);
color: var(--text);
font: 14px/1.7 var(--font);
}
a,
a:visited {
color: var(--link);
text-underline-offset: 3px;
}
a:hover {
text-decoration: underline;
}
:focus-visible {
outline: 3px solid var(--link);
outline-offset: 3px;
}
[hidden] {
display: none !important;
}
button,
input,
select {
font: inherit;
}
button,
summary,
select {
touch-action: manipulation;
}
button,
summary {
cursor: pointer;
}
img {
max-width: 100%;
height: auto;
}
h1,
h2,
h3,
h4 {
color: var(--text);
font-family: var(--font);
font-weight: 600;
line-height: 1.35;
}
h1 {
margin: 0 0 20px;
font-size: 28px;
letter-spacing: -0.5px;
}
h2 {
margin: 28px 0 12px;
font-size: 21px;
}
h3 {
margin: 22px 0 10px;
font-size: 17px;
}
h4 {
font-size: 15px;
}
p {
margin: 0 0 15px;
}
input,
select,
button {
min-height: 34px;
border: 1px solid var(--line);
border-radius: 2px;
padding: 6px 9px;
background: var(--page);
color: var(--text);
}
input[type="submit"],
button {
background: var(--panel);
}
input[type="submit"]:hover,
button:hover {
background: var(--selection);
}
.skip-link {
position: absolute;
top: -100px;
left: 15px;
z-index: 10;
padding: 10px;
background: var(--page);
}
.skip-link:focus {
top: 10px;
}
.site-header,
.docs-layout,
.site-footer {
width: min(1200px, calc(100% - 48px));
margin-inline: auto;
}
.site-header {
padding-top: 32px;
}
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20px;
padding-bottom: 16px;
}
.brand {
display: flex;
align-items: center;
gap: 12px;
color: var(--text) !important;
text-decoration: none;
}
.brand img {
display: block;
width: 38px;
height: 42px;
}
.brand strong {
font-size: 28px;
font-weight: 650;
letter-spacing: -0.8px;
}
.appearance {
display: flex;
align-items: center;
gap: 10px;
color: var(--muted);
font-size: 11px;
}
.appearance select {
min-height: 30px;
padding: 3px 7px;
font-size: 12px;
}
.site-nav {
display: flex;
flex-wrap: wrap;
align-items: stretch;
border: 1px solid var(--line);
background: var(--panel);
}
.site-nav > a,
.support-menu > summary {
display: flex;
align-items: center;
min-height: 36px;
padding: 6px 15px;
color: var(--text);
font-size: 13px;
text-decoration: none;
}
.site-nav > a:hover,
.support-menu > summary:hover {
background: var(--selection);
color: var(--link);
}
.site-nav > a.selected {
background: var(--blue);
color: #ffffff;
}
.support-menu {
position: relative;
}
.support-menu > summary {
list-style: none;
}
.support-menu > summary::after {
content: "⌄";
margin-left: 8px;
}
.support-menu > summary::-webkit-details-marker {
display: none;
}
.support-links {
position: absolute;
right: 0;
top: 100%;
z-index: 5;
min-width: 235px;
padding: 5px;
border: 1px solid var(--line);
background: var(--page);
}
.support-links a {
display: block;
padding: 10px 12px;
text-decoration: none;
}
.support-links a:hover {
background: var(--selection);
}
.support-links small {
display: block;
color: var(--muted);
font-size: 11px;
}
.docs-location {
display: flex;
justify-content: space-between;
align-items: start;
gap: 20px;
margin-top: 12px;
color: var(--muted);
font-size: 11px;
}
.docs-location nav {
min-width: 0;
overflow-wrap: anywhere;
}
.docs-location nav > span {
margin-inline: 5px;
}
.docs-version {
flex-shrink: 0;
font-family: var(--mono);
}
.docs-layout {
display: grid;
grid-template-columns: 240px minmax(0, 1fr);
align-items: start;
gap: 36px;
padding-block: 26px 30px;
}
.docs-layout.no-sidebar {
display: block;
}
.docs-sidebar {
position: sticky;
top: 16px;
max-height: calc(100vh - 32px);
overflow: auto;
padding-right: 15px;
border-right: 1px solid var(--soft-line);
font-size: 13px;
}
.docs-navigation > summary {
margin-bottom: 14px;
padding: 5px 0;
color: var(--text);
font-weight: 600;
}
.docs-sidebar h2,
.docs-sidebar h3 {
margin: 20px 0 8px;
padding-bottom: 5px;
border-bottom: 1px solid var(--line);
font-size: 14px;
letter-spacing: 0;
}
.docs-sidebar ul {
margin: 0;
padding-left: 17px;
list-style: none;
}
.docs-sidebar nav > ul {
padding-left: 0;
}
.docs-sidebar li {
margin: 5px 0;
line-height: 1.55;
}
.docs-sidebar li.current > a,
.docs-sidebar a.current {
font-weight: 600;
}
.docs-sidebar .current > a {
text-decoration-thickness: 2px;
}
.docs-search > label {
display: block;
margin-bottom: 5px;
color: var(--muted);
font-size: 11px;
}
.search-inputs {
display: flex;
align-items: stretch;
gap: 5px;
}
.search-inputs input {
width: 100%;
min-width: 0;
font-size: 12px;
}
.search-inputs button {
flex-shrink: 0;
padding-inline: 7px;
font-size: 11px;
}
.docs-content {
min-width: 0;
overflow-wrap: break-word;
}
.docs-content > :first-child,
.docs-content > section:first-child > :first-child {
margin-top: 0;
}
.docs-content li {
margin-bottom: 5px;
}
.docs-content dl {
margin-bottom: 20px;
}
.docs-content dt {
margin-top: 14px;
color: var(--text);
}
.docs-content dd {
margin-left: 24px;
}
.docs-content code,
.docs-content pre,
.docs-content kbd {
font-family: var(--mono);
font-size: 0.9em;
}
.docs-content code.literal {
padding: 1px 4px;
border: 1px solid var(--soft-line);
background: var(--code);
}
.docs-content pre {
margin: 0;
white-space: pre;
line-height: 1.7;
}
.docs-content .highlight,
.docs-content .literal-block {
max-width: 100%;
margin: 16px 0;
padding: 14px;
overflow-x: auto;
border: 1px solid var(--line);
background: var(--code);
color: var(--text);
}
.highlight pre {
background: transparent;
}
.highlight span {
color: var(--text) !important;
}
.highlight .k,
.highlight .kc,
.highlight .kd,
.highlight .kn,
.highlight .kp,
.highlight .kr,
.highlight .kt,
.highlight .o,
.highlight .ow,
.highlight .nb,
.highlight .nf {
color: var(--link) !important;
}
.highlight .c,
.highlight .c1,
.highlight .cm,
.highlight .cp,
.highlight .cs,
.highlight .sd {
color: var(--comment) !important;
}
.highlight .s,
.highlight .s1,
.highlight .s2,
.highlight .sa,
.highlight .sb,
.highlight .sc,
.highlight .se,
.highlight .sh,
.highlight .si,
.highlight .sr,
.highlight .ss {
color: var(--string) !important;
}
.highlight .m,
.highlight .mb,
.highlight .mf,
.highlight .mh,
.highlight .mi,
.highlight .mo,
.highlight .il {
color: var(--number) !important;
}
table.docutils,
table.indextable,
table.genindextable {
width: 100%;
margin: 16px 0;
border-collapse: collapse;
font-size: 13px;
}
table.docutils th,
table.docutils td {
padding: 9px 12px;
border: 1px solid var(--line);
text-align: left;
vertical-align: top;
}
table.docutils th {
background: var(--panel);
}
table.docutils tbody tr:nth-child(even) {
background: var(--panel);
}
table.genindextable td,
table.indextable td {
vertical-align: top;
}
.docs-content .admonition,
.docs-content .topic,
.docs-content .sidebar {
float: none;
width: auto;
margin: 18px 0;
padding: 12px 16px;
border: 1px solid var(--soft-line);
border-left: 3px solid var(--blue);
background: var(--panel);
color: var(--text);
}
.docs-content .admonition-title,
.docs-content .topic-title,
.docs-content .sidebar-title {
margin-bottom: 6px;
font-size: 14px;
font-weight: 600;
}
.docs-content .admonition > :last-child,
.docs-content .topic > :last-child {
margin-bottom: 0;
}
.docs-content img,
.docs-content .figure {
max-width: 100%;
}
.docs-content img {
height: auto;
}
.docs-content .figure {
margin-inline: 0;
}
.docs-content .caption {
color: var(--muted);
font-size: 12px;
}
a.headerlink {
padding-left: 6px;
color: var(--muted);
font-size: 0.8em;
text-decoration: none;
visibility: hidden;
}
h1:hover > .headerlink,
h2:hover > .headerlink,
h3:hover > .headerlink,
h4:hover > .headerlink,
dt:hover > .headerlink,
a.headerlink:focus-visible {
visibility: visible;
}
.highlighted {
background: var(--selection);
color: var(--text);
}
.page-relations {
display: flex;
justify-content: space-between;
gap: 24px;
margin-top: 32px;
padding-top: 16px;
border-top: 1px solid var(--line);
font-size: 13px;
}
.page-relations > div {
max-width: 46%;
}
.page-relations > div:last-child {
margin-left: auto;
text-align: right;
}
.page-relations small {
display: block;
color: var(--muted);
font-size: 11px;
}
.site-footer {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
gap: 12px 20px;
padding: 17px 0 28px;
border-top: 1px solid var(--line);
color: var(--muted);
font-size: 11px;
}
.site-footer nav {
display: flex;
flex-wrap: wrap;
gap: 5px 16px;
}
@media (max-width: 1000px) {
.docs-layout {
grid-template-columns: 220px minmax(0, 1fr);
gap: 26px;
}
.site-nav > a,
.support-menu > summary {
padding-inline: 10px;
}
}
@media (max-width: 760px) {
.site-header,
.docs-layout,
.site-footer {
width: calc(100% - 30px);
}
.site-header {
padding-top: 18px;
}
.brand strong {
font-size: 25px;
}
.brand img {
width: 32px;
height: 36px;
}
.appearance > span {
display: none;
}
.site-nav > a,
.support-menu > summary {
min-height: 38px;
padding: 7px 9px;
font-size: 12px;
}
.docs-layout {
display: block;
padding-top: 18px;
}
.docs-sidebar {
position: static;
max-height: none;
margin-bottom: 23px;
padding: 0;
border: 0;
}
.docs-navigation {
padding: 7px 12px;
border: 1px solid var(--line);
background: var(--panel);
}
.docs-navigation > summary {
margin: 0;
}
.sidebar-content {
padding-top: 12px;
}
.docs-sidebar ul {
margin-bottom: 12px;
}
.docs-sidebar .sidebar-content {
max-height: 60vh;
overflow: auto;
}
h1 {
font-size: 26px;
}
.docs-version {
font-size: 10px;
}
.support-links {
right: 0;
min-width: 210px;
}
.docs-content table {
display: block;
max-width: 100%;
overflow-x: auto;
}
}
@media print {
.site-header,
.docs-sidebar,
.site-footer,
.page-relations,
a.headerlink {
display: none;
}
.docs-layout,
.docs-layout.no-sidebar {
display: block;
width: 100%;
padding: 0;
}
.docs-content,
.docs-content * {
color: #000000 !important;
background: #ffffff !important;
}
.docs-content .highlight,
.docs-content .literal-block {
overflow: visible;
}
.docs-content pre {
white-space: pre-wrap;
}
.docs-content .highlight span {
color: #000000 !important;
}
}
/* The shared site stylesheet owns the page shell and primary navigation. */
:root {
--page: var(--bg);
--panel: var(--chrome);
--font: system-ui, -apple-system, "Segoe UI", sans-serif;
}
.site-header { padding: 0; }
.appearance select { min-height: 0; border-radius: 3px; }
.docs-layout {
width: min(1040px, calc(100% - 48px));
grid-template-columns: minmax(0, 1fr) 220px;
gap: 40px;
padding-block: 28px 20px;
}
.docs-content { grid-column: 1; grid-row: 1; }
.docs-sidebar {
grid-column: 2;
grid-row: 1;
padding: 3px 0 0;
border: 0;
}
.site-footer { display: block; }
.site-footer .footer-links { gap: 5px 14px; }
.docs-location { width: 100%; margin-top: 0; margin-bottom: 20px; }
@media (max-width: 800px) {
.docs-layout { grid-template-columns: minmax(0, 1fr) 185px; gap: 26px; }
}
@media (max-width: 760px) {
.docs-layout { display: block; }
}
@media (max-width: 600px) {
.docs-layout { width: calc(100% - 30px); padding-top: 23px; }
}
@media print {
.docs-layout, .docs-layout.no-sidebar { width: 100%; padding: 0; }
}
.site-footer, .footer-grid { font-size: inherit; color: inherit; }
+526
View File
@@ -0,0 +1,526 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Shared chrome copied from ZoiteChat/site assets/css/site.css (1df996a). */
:root {
color-scheme: light;
--bg: #fff;
--surface: #fff;
--chrome: #f1f2f3;
--chrome2: #e3e5e7;
--text: #25282c;
--muted: #58616b;
--line: #bdc3c9;
--soft-line: #dce0e4;
--blue: #215a9e;
--link: #174f92;
--selection: #e6effa;
--success: #236741;
--code: #f2f4f6;
--shadow: none;
--mono: Consolas,"Liberation Mono",monospace;
}
html[data-theme=dark] {
color-scheme: dark;
--bg: #111416;
--surface: #191c1f;
--chrome: #25292d;
--chrome2: #30353a;
--text: #eef0f2;
--muted: #b2bbc4;
--line: #50575e;
--soft-line: #353c43;
--blue: #2865a8;
--link: #8dc0ff;
--selection: #233951;
--success: #92d5ab;
--code: #111518;
--shadow: none;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
background: var(--bg);
color: var(--text);
font: 15px/1.6 system-ui,-apple-system,"Segoe UI",sans-serif;
}
a {
color: var(--link);
text-underline-offset: 3px;
}
a:hover {
text-decoration: underline;
}
button, input, select {
font: inherit;
}
button, summary {
cursor: pointer;
}
img {
display: block;
max-width: 100%;
height: auto;
}
button, a, input, select, summary {
touch-action: manipulation;
}
:focus-visible {
outline: 3px solid var(--link);
outline-offset: 3px;
}
[hidden] {
display: none!important;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip-path: inset(50%);
white-space: nowrap;
border: 0;
}
.skip-link {
position: absolute;
left: 12px;
top: -100px;
z-index: 10;
padding: 10px;
background: var(--surface);
}
.skip-link:focus {
top: 12px;
}
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20px;
padding: 0 0 16px;
background: var(--surface);
border-bottom: 1px solid var(--line);
border: 0;
}
.brand {
display: flex;
gap: 12px;
align-items: center;
color: var(--text);
text-decoration: none;
}
.brand img {
width: 38px;
height: 42px;
}
.brand strong {
font-size: 28px;
letter-spacing: -.8px;
font-weight: 650;
}
.brand small {
display: block;
font-size: 12px;
color: var(--muted);
line-height: 1.2;
}
.appearance {
display: flex;
align-items: center;
gap: 10px;
font-size: 11px;
color: var(--muted);
}
select {
border: 1px solid var(--line);
border-radius: 3px;
padding: 5px 8px;
background: var(--surface);
color: var(--text);
}
.navigation {
display: flex;
align-items: center;
justify-content: flex-start;
gap: 12px;
background: var(--chrome);
border-bottom: 1px solid var(--line);
padding: 0;
border: 1px solid var(--line);
border-radius: 0;
}
.nav-links {
display: flex;
align-items: stretch;
flex-wrap: wrap;
gap: 0;
}
.nav-links>a, .nav-menu summary {
display: flex;
align-items: center;
min-height: 36px;
padding: 6px 15px;
color: var(--text);
font-size: 13px;
text-decoration: none;
border-bottom: 0;
}
.nav-links>a[aria-current=page] {
color: #fff;
border-bottom-color: var(--blue);
font-weight: 500;
background: var(--blue);
}
.nav-links>a:hover, .nav-menu summary:hover {
background: var(--selection);
}
.nav-menu {
position: relative;
}
.nav-menu summary {
list-style: none;
}
.nav-menu summary::after {
content: "⌄";
margin-left: 9px;
}
.nav-menu summary::-webkit-details-marker {
display: none;
}
.nav-menu-panel {
position: absolute;
right: 0;
top: 100%;
z-index: 5;
min-width: 280px;
background: var(--surface);
border: 1px solid var(--line);
box-shadow: var(--shadow);
padding: 5px;
}
.nav-menu-panel a {
display: block;
padding: 10px 12px;
text-decoration: none;
}
.nav-menu-panel a:hover {
background: var(--selection);
}
.nav-menu-panel span {
display: block;
font-size: 12px;
color: var(--muted);
}
.site-main {
min-height: 0;
}
h1, h2, h3, p {
margin-top: 0;
}
h1 {
font-size: clamp(30px,3.9vw,46px);
line-height: 1.16;
letter-spacing: -1.5px;
font-weight: 650;
margin-bottom: 20px;
}
h2 {
font-size: 20px;
line-height: 1.3;
letter-spacing: 0;
margin-bottom: 12px;
}
h3 {
font-size: 16px;
line-height: 1.4;
}
p {
color: var(--text);
font-size: 14px;
line-height: 1.7;
margin-bottom: 15px;
}
.site-footer {
padding: 17px 0;
background: var(--surface);
border-top: 1px solid var(--line);
}
.footer-grid {
display: flex;
align-items: start;
justify-content: space-between;
gap: 20px;
}
.footer-copy {
font-size: 11px;
max-width: 62ch;
margin: 0;
color: var(--muted);
}
.footer-links {
display: flex;
flex-wrap: wrap;
gap: 5px 14px;
max-width: 400px;
font-size: 11px;
}
@media (max-width:1000px) {
.navigation {
padding: 0 15px;
}
.nav-links>a, .nav-menu summary {
padding: 8px 10px;
}
}
@media (max-width:650px) {
.topbar {
padding: 13px 16px;
gap: 8px;
}
.brand strong {
font-size: 20px;
}
.brand small {
font-size: 10px;
}
.brand img {
width: 28px;
height: 31px;
}
.appearance {
gap: 5px;
}
.appearance>span {
display: none;
}
.appearance select {
font-size: 12px;
max-width: 98px;
}
.navigation {
padding: 0 6px;
}
.nav-links {
gap: 0;
}
.nav-links>a, .nav-menu summary {
min-height: 44px;
padding: 8px;
font-size: 12px;
}
h1 {
font-size: 34px;
letter-spacing: -1px;
}
.footer-grid {
display: grid;
gap: 20px;
}
.site-footer {
padding: 20px 17px;
}
.nav-menu-panel {
position: fixed;
right: 10px;
left: 10px;
top: auto;
min-width: 0;
}
}
@media (prefers-reduced-motion:reduce) {
* {
scroll-behavior: auto!important;
}
}
.appearance select {
font-size: 12px;
padding: 3px 7px;
}
.nav-links>a:hover {
background: var(--selection);
color: var(--link);
}
h1 {
font-size: 28px;
font-weight: 600;
letter-spacing: -.5px;
line-height: 1.3;
margin: 0 0 16px;
max-width: none;
}
@media (max-width:1100px) {
.navigation {
padding: 0;
}
}
@media (max-width:800px) {
.nav-links>a, .nav-menu summary {
padding: 6px 10px;
}
}
@media (max-width:600px) {
.topbar {
padding: 0 0 14px;
}
.brand strong {
font-size: 25px;
}
.brand img {
width: 32px;
height: 36px;
}
.nav-links>a, .nav-menu summary {
padding: 7px 9px;
min-height: 38px;
font-size: 12px;
}
.footer-grid {
display: block;
}
.footer-links {
margin-top: 10px;
max-width: none;
}
.site-footer {
padding: 14px 0;
}
h1 {
font-size: 26px;
}
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme]) {
color-scheme: dark;
--bg: #111416;
--surface: #191c1f;
--chrome: #25292d;
--chrome2: #30353a;
--text: #eef0f2;
--muted: #b2bbc4;
--line: #50575e;
--soft-line: #353c43;
--blue: #2865a8;
--link: #8dc0ff;
--selection: #233951;
--success: #92d5ab;
--code: #111518;
--shadow: none;
}
}
.site-header, .site-main, .site-footer {
width: min(1040px, calc(100% - 48px));
margin-inline: auto;
}
.site-header {
margin-top: 32px;
}
.site-main {
padding-block: 28px 20px;
}
.site-header .topbar {
padding: 0 0 16px;
}
.site-header .navigation {
padding: 0;
}
@media (max-width: 600px) {
.site-header, .site-main, .site-footer {
width: calc(100% - 30px);
}
.site-header {
margin-top: 18px;
}
.site-main {
padding-top: 23px;
}
}
/* Match the browser's heading defaults used by the main site. */
h2, h3 { font-weight: bold; }
h2 { margin-top: .83em; }
h3 { margin-block: 1em; }
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

+44
View File
@@ -0,0 +1,44 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
(() => {
'use strict';
const initialise = () => {
const picker = document.getElementById('theme-picker');
const preference = window.matchMedia('(prefers-color-scheme: dark)');
if (picker instanceof HTMLSelectElement) {
const applyTheme = () => {
const dark = picker.value === 'dark'
|| (picker.value === 'system' && preference.matches);
document.documentElement.dataset.theme = dark ? 'dark' : 'light';
document.querySelectorAll('meta[name="theme-color"]').forEach((meta) => {
meta.setAttribute('content', dark ? '#111416' : '#ffffff');
});
};
// Follow the OS on every visit, including browser back/forward navigation.
const resetTheme = () => {
picker.value = 'system';
applyTheme();
};
picker.addEventListener('change', applyTheme);
preference.addEventListener('change', applyTheme);
window.addEventListener('pageshow', resetTheme);
resetTheme();
}
const navigation = document.getElementById('docs-navigation');
const compact = window.matchMedia('(max-width: 760px)');
if (navigation instanceof HTMLDetailsElement) {
const fitNavigation = () => { navigation.open = !compact.matches; };
compact.addEventListener('change', fitNavigation);
fitNavigation();
}
};
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initialise, { once: true });
} else {
initialise();
}
})();
+56
View File
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

+366
View File
@@ -0,0 +1,366 @@
{#
basicstrap/layout.html
~~~~~~~~~~~~~~~~~~~~~~~~~
Master layout template for Sphinx themes. on Twitter Bootstrap
:copyright: Copyright 2012 by tell-k.
:license: MIT Licence, see LICENSE for details.
#}
{%- block doctype -%}
<!DOCTYPE html>
{%- endblock %}
{%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}
{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and
(sidebars != []) %}
{%- set url_root = pathto('', 1) %}
{# XXX necessary? #}
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
{%- if not embedded and docstitle %}
{%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
{%- else %}
{%- set titlesuffix = "" %}
{%- endif %}
{%- if theme_bootstrap_version == "3" %}
{%- set bs_span_prefix = "col-md-" %}
{%- set class_device_xs= "xs" %}
{%- set class_device_sm= "sm" %}
{%- set class_device_md= "md" %}
{%- set class_row = "row" %}
{%- else %}
{%- set bs_span_prefix = "span" %}
{%- set class_device_xs= "phone" %}
{%- set class_device_sm= "tablet" %}
{%- set class_device_md= "desktop" %}
{%- if (not theme_row_fixed|tobool) %}
{%- set class_row = "row-fluid" %}
{%- else %}
{%- set class_row = "row" %}
{%- endif %}
{%- endif %}
{%- macro relbar() %}
<div id="navbar-related" class=" related navbar {% if (theme_relbar_inverse|tobool) %}navbar-inverse{% else %}navbar-default{% endif %}" role="navigation" aria-label="related navigation">
<div class="navbar-inner">
<ul class="nav navbar-nav {% if theme_noresponsiverelbar|tobool %}text-center{% endif %}">
<li><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a></li>
</ul>
<ul class="nav navbar-nav {% if not theme_noresponsiverelbar|tobool %}pull-right hidden-{{ class_device_xs }} hidden-{{ class_device_sm }}{% else %}text-center{% endif %}">
{% if not (theme_nosidebar|tobool) %}
{%- for rellink in rellinks|reverse %}
<li><a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags|e }}" {{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a></li>
{%- endfor %}
{%- block rootrellink %}
{%- endblock %}
{%- for parent in parents %}
<li><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a></li>
{%- endfor %}
<li><a href="#">top</a></li>
{%- block relbaritems %} {% endblock %}
{% else %}
{%- if prev %}
<li><a href="{{ prev.link|e }}"><i class="icon icon-double-angle-left"></i>&nbsp;{{ prev.title }}</a></li>
{%- endif %}
<li><a class="uplink" href="{{ pathto(master_doc) }}">{{ _('Contents') }}</a></li>
{%- if next %}
<li><a href="{{ next.link|e }}">{{ next.title }}&nbsp;<i class="icon icon-double-angle-right"></i></a></li>
{%- endif %}
<li><a href="#">top</a></li>
{%- endif %}
</ul>
</div>
</div>
{%- endmacro %}
{%- macro sidebar() %}
{%- if render_sidebar %}
<div class="{{ bs_span_prefix }}{{ theme_sidebar_span }} hidden-{{ class_device_xs }}" id="sidebar-wrapper">
<div class="sidebar hidden-{{ class_device_xs }}" role="navigation" aria-label="main navigation">
{%- block sidebarlogo %}
{%- if logo %}
<p class="logo"><a href="{{ pathto(master_doc) }}">
<img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
</a></p>
{%- endif %}
{%- endblock %}
{%- if sidebars != None %}
{#- new style sidebar: explicitly include/exclude templates #}
{%- for sidebartemplate in sidebars %}
{%- include sidebartemplate %}
{%- endfor %}
{%- else %}
{#- old style sidebars: using blocks -- should be deprecated #}
{%- block sidebartoc %}
{%- include "localtoc.html" %}
{%- endblock %}
{%- block sidebarrel %}
{%- include "relations.html" %}
{%- endblock %}
{%- block sidebarsourcelink %}
{%- include "sourcelink.html" %}
{%- endblock %}
{%- if customsidebar %}
{%- include customsidebar %}
{%- endif %}
{%- block sidebarsearch %}
{%- include "searchbox.html" %}
{%- endblock %}
{%- endif %}
</div>
</div>
{%- endif %}
{%- endmacro %}
{% set script_files = (['_static/js/jquery.min.js'] if '_static/js/jquery.min.js' not in script_files else []) + script_files + ['_static/js/bootstrap' + theme_bootstrap_version + '.min.js'] %}
{%- macro script() %}
{%- if '_static/documentation_options.js' not in script_files %}
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '{{ url_root }}',
VERSION: '{{ release|e }}',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}',
HAS_SOURCE: {{ has_source|lower }}
};
</script>
{%- endif %}
{%- for scriptfile in script_files %}
{%- if scriptfile is string -%}
<script src="{{ pathto(scriptfile, 1) }}"></script>
{%- else -%}
{{ js_tag(scriptfile) }}
{%- endif -%}
{%- endfor %}
<script type="text/javascript" src="{{ pathto('_static/js/jquery.cookie.min.js', 1) }}"></script>
<script type="text/javascript" src="{{ pathto('_static/js/basicstrap.js', 1) }}"></script>
<script type="text/javascript">
DOCUMENTATION_OPTIONS.FILE_SUFFIX = DOCUMENTATION_OPTIONS.FILE_SUFFIX || '.html';
DOCUMENTATION_OPTIONS.LINK_SUFFIX = DOCUMENTATION_OPTIONS.LINK_SUFFIX || '.html';
</script>
{%- endmacro %}
{%- macro css() %}
{%- if (theme_googlewebfont|tobool) %}
<link rel="stylesheet" href="{{ pathto(theme_googlewebfont_url, 1) }}" media="screen and (min-width:481px)" type="text/css" />
{%- endif %}
<link rel="stylesheet" href="{{ pathto('_static/css/basicstrap-base.css', 1) }}" type="text/css" />
{%- if (theme_inner_theme|tobool) %}
<link rel="stylesheet" id="current-theme" href="{{ pathto('_static/css/bootstrap' + theme_bootstrap_version + '/' + theme_inner_theme_name + '.css', 1) }}" type="text/css" />
<link rel="stylesheet" id="current-adjust-theme" href="{{ pathto('_static/css/adjust_theme/' + theme_inner_theme_name + '.css', 1) }}" type="text/css" />
{%- else %}
<link rel="stylesheet" id="current-theme" href="{{ pathto('_static/css/bootstrap' + theme_bootstrap_version + '/bootstrap.min.css', 1) }}" type="text/css" />
<link rel="stylesheet" id="current-adjust-theme" type="text/css" />
{%- endif %}
{%- if theme_bootstrap_version == "3" and theme_noflatdesign|tobool %}
<link rel="stylesheet" href="{{ pathto('_static/css/bootstrap' + theme_bootstrap_version + '/bootstrap-theme.min.css', 1) }}" type="text/css" />
{%- endif %}
<link rel="stylesheet" href="{{ pathto('_static/css/font-awesome.min.css', 1) }}">
{% if (theme_nav_fixed_top|tobool) %}
<style type="text/css">
body {
{%- if theme_bootstrap_version == "3" %}
padding-top: 60px;
padding-bottom: 40px;
{%- else %}
padding-top: 60px;
padding-bottom: 40px;
{%- endif %}
}
</style>
{% endif %}
<link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
{%- if (not theme_noresponsive|tobool) and theme_bootstrap_version == "2" %}
<link rel="stylesheet" href="{{ pathto('_static/css/bootstrap2/bootstrap-responsive.min.css', 1) }}" type="text/css" />
{%- endif %}
{%- if theme_noresponsive|tobool and theme_bootstrap_version == "3" %}
<link rel="stylesheet" href="{{ pathto('_static/css/bootstrap3/bootstrap-non-responsive.css', 1) }}" type="text/css" />
{%- endif %}
{# Keep project CSS last so Bootstrap/basicstrap cannot re-float or resize the docs columns. #}
{%- for cssfile in css_files %}
{%- if cssfile is string -%}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
{%- else -%}
{{ css_tag(cssfile) }}
{%- endif -%}
{%- endfor %}
{%- endmacro %}
<html lang="{{ theme_lang }}">
<head>
<meta charset="{{ encoding }}" />
{{ metatags }}
{%- block htmltitle %}
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
{%- endblock %}
{%- if theme_noresponsive|tobool and theme_bootstrap_version == "3" %}
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{%- endif %}
<meta name="description" content="">
<meta name="author" content="">
<meta name="theme-color" content="#eee5d3" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#161514" media="(prefers-color-scheme: dark)">
{{ css() }}
{%- if not embedded %}
{{ script() }}
{%- if use_opensearch %}
<link rel="search" type="application/opensearchdescription+xml"
title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
href="{{ pathto('_static/opensearch.xml', 1) }}"/>
{%- endif %}
{%- if favicon %}
<link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
{%- endif %}
{%- endif %}
{%- block linktags %}
{%- if hasdoc('about') %}
<link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
{%- endif %}
{%- if hasdoc('genindex') %}
<link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
{%- endif %}
{%- if hasdoc('search') %}
<link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
{%- endif %}
{%- if hasdoc('copyright') %}
<link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
{%- endif %}
<link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}" />
{%- if parents %}
<link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}" />
{%- endif %}
{%- if next %}
<link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
{%- endif %}
{%- if prev %}
<link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
{%- endif %}
{%- endblock %}
{%- block extrahead %} {% endblock %}
</head>
<body role="document">
{%- block header %}
<header id="navbar-top" class="site-header" role="banner">
<div class="shell nav-shell">
<a class="brand" href="https://zoitechat.org/" aria-label="ZoiteChat home">
<img class="brand-logo" src="{{ pathto('_static/zoitechat-logo.svg', 1) }}" alt="" width="44" height="48">
<span class="brand-text">ZoiteChat</span>
</a>
<nav class="site-nav" aria-label="Primary">
<a href="https://zoitechat.org/">Home</a>
<a href="https://zoitechat.org/addons.php">Addons</a>
<a href="https://zoitechat.org/announcements.php">Announcements</a>
<a href="https://zoitechat.org/download.php">Download</a>
<a href="{{ pathto(master_doc) }}" aria-current="page">Docs</a>
<a href="https://github.com/ZoiteChat/zoitechat" target="_blank" rel="noopener">GitHub</a>
<details class="nav-menu">
<summary>IRC Support</summary>
<div class="nav-menu-panel" aria-label="IRC support channels">
<a href="https://zoite.net/webchat/?join=%23zoitechat" target="_blank" rel="noopener">
<strong>Zoite IRC</strong>
<span>Official network, #zoitechat</span>
</a>
<a href="https://web.libera.chat/#zoitechat" target="_blank" rel="noopener">
<strong>Libera.Chat</strong>
<span>Secondary support channel, #zoitechat</span>
</a>
</div>
</details>
</nav>
</div>
</header>
{% endblock %}
<!-- container -->
<div class="{% if (not theme_content_fixed|tobool) %}container-fluid{% else %}container{% endif %} docs-shell">
<!-- row -->
<div class="{{ class_row }} docs-main-row">
{%- block content %}
{%- block sidebar1 %}
{% if (not theme_rightsidebar|tobool) %} {{ sidebar() }} {% endif %}
{% endblock %}
<div class="{% if (not theme_nosidebar|tobool) %}{{ bs_span_prefix }}{{ 12 - theme_sidebar_span|int }}{% else %}{{ bs_span_prefix }}12{% endif %}" id="content-wrapper">
<div class="document" role="main">
{%- block document %}
<div class="documentwrapper">
{%- if render_sidebar %}
<div class="bodywrapper">
{%- endif %}
<div class="body">
{% block body %} {% endblock %}
</div>
{%- if render_sidebar %}
</div>
{%- endif %}
</div>
{%- endblock %}
</div>
</div>
{%- block sidebar2 %}
{% if (theme_rightsidebar|tobool) %} {{ sidebar() }} {% endif %}
{% endblock %}
{%- endblock %}{# /content block #}
</div><!-- /row -->
<!-- row -->
<div class="{{ class_row }} footer-relbar">
{%- block relbar2 %}{{ relbar() }}{% endblock %}
</div><!-- /row -->
<!-- footer -->
{%- block footer %}
<footer class="site-footer" role="contentinfo">
<div class="shell footer-grid">
<div>
<div class="footer-brand-wrap">
<img class="footer-logo" src="{{ pathto('_static/zoitechat-logo.svg', 1) }}" alt="" width="40" height="44">
<div class="footer-brand">ZoiteChat</div>
</div>
<p class="footer-copy">ZoiteChat is a HexChat fork, carrying that client lineage forward with care. Built on the foundation HexChat left behind, and grateful to the project and people that made it possible.</p>
</div>
<div class="footer-links">
<a href="https://zoitechat.org/download.php">Download</a>
<a href="https://zoitechat.org/addons.php">Addons</a>
<a href="https://zoitechat.org/announcements.php">Announcements</a>
<a href="https://zoitechat.org/privacy.php">Privacy Policy</a>
<a href="{{ pathto(master_doc) }}">Documentation</a>
<a href="https://github.com/ZoiteChat/zoitechat" target="_blank" rel="noopener">Source code</a>
<a href="https://zoite.net/webchat/?join=%23zoitechat" target="_blank" rel="noopener">Official IRC support</a>
<a href="https://web.libera.chat/#zoitechat" target="_blank" rel="noopener">Libera IRC support</a>
</div>
<div class="footer-meta">
<div>Documentation source: Read the Docs / Sphinx</div>
<div>Theme skin: ZoiteChat main site</div>
</div>
</div>
</footer>
{%- endblock %}
<!-- /footer -->
</div>
<!-- /container -->
{%- if theme_theme_preview|tobool %}
{%- include "_theme_preview.html" %}
{%- endif %}
</body>
</html>
+63
View File
@@ -0,0 +1,63 @@
{#
basicstrap/search.html
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Template for the search page.
:copyright: Copyright 2012 by tell-k.
:license: MIT Licence, see LICENSE for details.
#}
{% extends "layout.html" %}
{% set title = _('Search') %}
{% set script_files = script_files + (['_static/language_data.js'] if '_static/language_data.js' not in script_files else []) + ['_static/searchtools.js'] %}
{% block extrahead %}
<script type="text/javascript">
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
</script>
{{ super() }}
{% endblock %}
{% block body %}
<h1 id="search-documentation">{{ _('Search') }}</h1>
<div id="fallback" class="admonition warning">
<script type="text/javascript">$('#fallback').hide();</script>
<p>
{% trans %}Please activate JavaScript to enable the search
functionality.{% endtrans %}
</p>
</div>
<p>
{% trans %}From here you can search these documents. Enter your search
words into the box below and click "search". Note that the search
function will automatically search for all of the words. Pages
containing fewer words won't appear in the result list.{% endtrans %}
</p>
<form class="form-search form-inline" action="" method="get">
<div class="input-append input-group">
<input type="text" class="search-query form-control" name="q" value="" placeholder="Search...">
<span class="input-group-btn">
<input type="submit" class="btn" value="{{ _('search') }}" />
</span>
</div>
<span id="search-progress" style="padding-left: 10px"></span>
</form>
<div role="main">
{% if search_performed %}
<h2>{{ _('Search Results') }}</h2>
{% if not search_results %}
<p>{{ _('Your search did not match any results.') }}</p>
{% endif %}
{% endif %}
<div id="search-results">
{% if search_results %}
<ul>
{% for href, caption, context in search_results %}
<li><a href="{{ pathto(href) }}">{{ caption }}</a>
<div class="context">{{ context|e }}</div>
</li>
{% endfor %}
</ul>
{% endif %}
</div>
</div>
{% endblock %}
+27
View File
@@ -0,0 +1,27 @@
{#
basicstrap/searchbox.html
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sphinx sidebar template: quick search box.
:copyright: Copyright 2012 by tell-k.
:license: MIT Licence, see LICENSE for details.
#}
{%- if pagename != "search" %}
<div id="searchbox" role="search">
<h3>{{ _('Quick search') }}</h3>
<form class="search form-inline" action="{{ pathto('search') }}" method="get">
<div class="input-append input-group">
<input type="text" class="search-query form-control" name="q" placeholder="Search...">
<span class="input-group-btn">
<input type="submit" class="btn" value="{{ _('Go') }}" />
</span>
</div>
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
{{ _('Enter search terms or a module, class or function name.') }}
</p>
</div>
{%- endif %}
+38
View File
@@ -0,0 +1,38 @@
{#
basicstrap/searchresults.html
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Template for the body of the search results page.
:copyright: Copyright 2012 by tell-k.
:license: MIT Licence, see LICENSE for details.
#}
<h1 id="search-documentation">Search</h1>
<p>
From here you can search these documents. Enter your search
words into the box below and click "search".
</p>
<form class="form-search" action="" method="get">
<div class="input-append">
<input type="text" class="search-query" name="q">
<input type="submit" class="btn" value="{{ _('search') }}" />
</div>
<span id="search-progress" style="padding-left: 10px"></span>
</form>
{%- if search_performed %}
<h2>Search Results</h2>
{%- if not search_results %}
<p>Your search did not match any results.</p>
{%- endif %}
{%- endif %}
<div id="search-results">
{%- if search_results %}
<ul class="search">
{% for href, caption, context in search_results %}
<li><a href="{{ docroot }}{{ href }}/?highlight={{ q }}">{{ caption }}</a>
<div class="context">{{ context|e }}</div>
</li>
{% endfor %}
</ul>
{%- endif %}
</div>
@@ -0,0 +1,67 @@
/* Table
---------------------------------------------------------*/
table.docutils {
border-color: {{ table_border_color }};
}
table.docutils th,
table.docutils td
{
border-color: {{ table_border_color }};
}
table.docutils tbody + tbody {
border-color: {{ table_border_color }};
}
/* Table-bordered
---------------------------------------------------------*/
table.table-bordered {
border-color: {{ table_border_color }};
}
/* -- admonition -- */
div.admonition {
color: {{ warning_color }};
background-color: {{ warning_background_color }};
border-color: {{ warning_border_color }};
}
/* -- danger, error -- */
div.danger,
div.error {
color: {{ danger_color }};
background-color: {{ danger_background_color }};
border-color: {{ danger_border_color }};
}
/* -- warning, caution, attention -- */
div.warning,
div.caution,
div.attention {
color: {{ warning_color }};
background-color: {{ warning_background_color }};
border-color: {{ warning_border_color }};
}
/* -- note, important -- */
div.note,
div.important {
color: {{ note_color }};
background-color: {{ note_background_color }};
border-color: {{ note_border_color }};
}
/* -- hint, tip -- */
div.hint,
div.tip {
color: {{ hint_color }};
background-color: {{ hint_background_color }};
border-color: {{ hint_border_color }};
}
div.topic {
background-color: {{ table_oddrow_color }};
border-color: {{ table_border_color }};
}
@@ -0,0 +1,62 @@
{% set table_border_color = "#357279" %}
{% set danger_color = "rgba(255, 255, 255, 0.9)" %}
{% set danger_background_color = "#d5b321" %}
{% set danger_border_color = "#d5b321" %}
{% set warning_color = "rgba(255, 255, 255, 0.9)" %}
{% set warning_background_color = "#df6e1e" %}
{% set warning_border_color = "#df6e1e" %}
{% set note_color = "rgba(255, 255, 255, 0.9)" %}
{% set note_background_color = "#48ca3b" %}
{% set note_border_color = "#48ca3b" %}
{% set hint_color = "rgba(255, 255, 255, 0.9)" %}
{% set hint_background_color = "#4d3a7d" %}
{% set hint_border_color = "#4d3a7d" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #00747d !important;
}
/* Contents
---------------------------------------------------------*/
div.contents {
background-color: #00747d;
border: none;
box-shadow: none;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #00747d;
border-top: 1px solid #00747d;
border-bottom: 1px solid #00747d;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a{
color: #ffffff;
}
ul.sp-localtoc ul a:hover{
background-color: #d92432;
color: #ffffff;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #ffffff;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
background-color: #e5c953;
color: #ffffff;
}
@@ -0,0 +1,46 @@
{% set table_border_color = "#dddddd" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #eeeeee !important;
}
/* Contents
---------------------------------------------------------*/
div.contents {
background-color: #eeeeee;
border: 1px solid #eeeeee;
box-shadow: none;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #eeeeee;
border-top: 1px solid #eeeeee;
border-bottom: 1px solid #eeeeee;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a{
color: #ffffff;
}
ul.sp-localtoc ul a:hover{
background-color: #178acc;
color: #ffffff;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #ffffff;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
background-color: #022f5a;
color: #ffffff;
}
@@ -0,0 +1,71 @@
{% set table_border_color = "#dddddd" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#ff0039" %}
{% set danger_border_color = "transparent" %}
{% set warning_color = "#ffffff" %}
{% set warning_background_color = "#ff7518" %}
{% set warning_border_color = "transparent" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#3fb618" %}
{% set note_border_color = "#transparent" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#9954bb" %}
{% set hint_border_color = "transparent" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #e6e6e6 !important;
}
/* Contents
---------------------------------------------------------*/
div.contents {
background-color: #e6e6e6;
border: 1px solid #e6e6e6;
box-shadow: none;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #e6e6e6;
border-top: 1px solid #e6e6e6;
border-bottom: 1px solid #e6e6e6;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a{
color: #ffffff;
}
ul.sp-localtoc ul a:hover{
background-color: #090909;
color: #ffffff;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #ffffff;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
background-color: #0066cc;
color: #ffffff;
}
{% if theme_bootstrap_version == "2" %}
/* Docutils
---------------------------------------------------------*/
table.docutils td.label {
min-height: 0px;
}
{% endif %}
@@ -0,0 +1,73 @@
{% set table_border_color = "#222222" %}
{% set danger_color = "#eeeeee" %}
{% set danger_background_color = "#cc0000" %}
{% set danger_border_color = "transparent" %}
{% set warning_color = "#eeeeee" %}
{% set warning_background_color = "#666666" %}
{% set warning_border_color = "transparent" %}
{% set note_color = "#eeeeee" %}
{% set note_background_color = "#5c8a00" %}
{% set note_border_color = "#transparent" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#007399" %}
{% set hint_border_color = "transparent" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #282828 !important;
}
/* Field-list
---------------------------------------------------------*/
table.field-list {
background-color: #060606;
}
/* Citation
---------------------------------------------------------*/
table.citation{
background-color: #060606;
}
/* Footnote
---------------------------------------------------------*/
table.footnote {
background-color: #060606;
}
/* Contents
---------------------------------------------------------*/
div.contents {
background-color: #222222;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #282828;
border-top: 1px solid #282828;
border-bottom: 1px solid #282828;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a:hover{
color: #ffffff;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
color: #ffffff;
}
@@ -0,0 +1,60 @@
{% set table_border_color = "#464545" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#e94b35" %}
{% set danger_border_color = "#e94b35" %}
{% set warning_color = "#ffffff" %}
{% set warning_background_color = "#f59d00" %}
{% set warning_border_color = "#f59d00" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#00bd8b" %}
{% set note_border_color = "#00bd8b" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#2c97de" %}
{% set hint_border_color = "#2c97de" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #464545 !important;
}
/* Contents
---------------------------------------------------------*/
div.contents {
background-color: #464545;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #464545;
border-top: 1px solid #464545;
border-bottom: 1px solid #464545;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a{
color: #ffffff;
}
ul.sp-localtoc ul a:hover{
background-color: transparent;
color: #00bc8c;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #ffffff;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
background-color: transparent;
color: #375a7f;
}
@@ -0,0 +1,54 @@
{% set table_border_color = "#ecf0f1" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#dd4838" %}
{% set danger_border_color = "#dd4838" %}
{% set warning_color = "#ffffff" %}
{% set warning_background_color = "#ec9B00" %}
{% set warning_border_color = "#ec9B00" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#40bc9c" %}
{% set note_border_color = "#40bc9c" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#4b99dc" %}
{% set hint_border_color = "#4b99dc" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #ecf0f1 !important;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #ecf0f1;
border-top: 1px solid #ecf0f1;
border-bottom: 1px solid #ecf0f1;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a{
color: #ffffff;
}
ul.sp-localtoc ul a:hover{
background-color: transparent;
color: #00bc8c;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #ffffff;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
background-color: transparent;
color: #2c3e50;
}
@@ -0,0 +1,69 @@
{% set table_border_color = "#dddddd" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#ed6761" %}
{% set danger_border_color = "#ed6761" %}
{% set warning_color = "#ffffff" %}
{% set warning_background_color = "#f77400" %}
{% set warning_border_color = "#f77400" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#11b446" %}
{% set note_border_color = "#11b446" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#306598" %}
{% set hint_border_color = "#306598" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #eeeeee !important;
}
/* Contents
---------------------------------------------------------*/
div.contents {
background-color: #eeeeee;
border-color: #eeeeee;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #eeeeee;
border-top: 1px solid #eeeeee;
border-bottom: 1px solid #eeeeee;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a{
color: #000000;
}
ul.sp-localtoc ul a:hover{
background-color: #eeeeee;
color: #000000;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #ffffff;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
background-color: #e74b47;
color: #ffffff;
}
/* Etc
---------------------------------------------------------*/
div.navbar-inner ul.pull-right li a{
font-size: 15px;
}
@@ -0,0 +1,61 @@
{% set table_border_color = "#dddddd" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#ff3f2c" %}
{% set danger_border_color = "#ff3f2c" %}
{% set warning_color = "#ffffff" %}
{% set warning_background_color = "#ff8500" %}
{% set warning_border_color = "#ff8500" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#18B81D" %}
{% set note_border_color = "#18B81D" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#71CAED" %}
{% set hint_border_color = "#71CAED" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #eeeeee !important;
}
/* Contents
---------------------------------------------------------*/
div.contents {
background-color: #fafafa;
border-color: #eeeeee;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #eeeeee;
border-top: 1px solid #eeeeee;
border-bottom: 1px solid #eeeeee;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a{
color: #999999;
}
ul.sp-localtoc ul a:hover{
background-color: transparent;
color: #333333;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #999999;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
background-color: transparent;
color: #333333;
}
@@ -0,0 +1,20 @@
{% set table_border_color = "#dddddd" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#d23f3c" %}
{% set danger_border_color = "#d23f3c" %}
{% set warning_color = "#ffffff" %}
{% set warning_background_color = "#f19842" %}
{% set warning_border_color = "#f19842" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#69a858" %}
{% set note_border_color = "#69a858" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#8e45ab" %}
{% set hint_border_color = "#8e45ab" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
@@ -0,0 +1,73 @@
{% set table_border_color = "#dddddd" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#db524b" %}
{% set danger_border_color = "#db524b" %}
{% set warning_color = "#ffffff" %}
{% set warning_background_color = "#f2ae43" %}
{% set warning_border_color = "#f2ae43" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#39af40" %}
{% set note_border_color = "#39af40" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#56C0E0" %}
{% set hint_border_color = "#56C0E0" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #eeeeee !important;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #eeeeee;
border-top: 1px solid #eeeeee;
border-bottom: 1px solid #eeeeee;
}
/* Contents
---------------------------------------------------------*/
div.contents {
background-color: #f7f7f7;
border-color: #eeeeee;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a{
margin-left: 7px;
margin-right: 7px;
border: 1px solid transparent;
border-radius: 4px;
color: #4582ec;
}
ul.sp-localtoc ul a:hover{
border-color: #dddddd;
color: #4582ec;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #333333;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
color: #333333;
}
/* Etc
---------------------------------------------------------*/
div.navbar-inner ul.pull-right li a{
font-size: 15px;
}
@@ -0,0 +1,19 @@
{% set table_border_color = "#dddddd" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#c9605a" %}
{% set danger_border_color = "#c9605a" %}
{% set warning_color = "#ffffff" %}
{% set warning_background_color = "#e48353" %}
{% set warning_border_color = "#e48353" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#9fbe5b" %}
{% set note_border_color = "#9fbe5b" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#55abda" %}
{% set hint_border_color = "#55abda" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
@@ -0,0 +1,60 @@
{% set table_border_color = "#dddddd" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#d88400" %}
{% set danger_border_color = "#d88400" %}
{% set warning_color = "#ffffff" %}
{% set warning_background_color = "#9c43a1" %}
{% set warning_border_color = "#9c43a1" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#439500" %}
{% set note_border_color = "#439500" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#0099d1" %}
{% set hint_border_color = "#0099d1" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #dddddd !important;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #dddddd;
border-top: 1px solid #dddddd;
border-bottom: 1px solid #dddddd;
}
/* Contents
---------------------------------------------------------*/
div.contents {
background-color: #f4f4f4;
border: none;
box-shadow: none;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a{
color: #333333;
}
ul.sp-localtoc ul a:hover{
color: #d9230f;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #ffffff;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
color: #fac0ba;
}
@@ -0,0 +1,83 @@
{% set table_border_color = "#1c1e22" %}
{% set danger_color = "rgba(255, 255, 255, 0.9)" %}
{% set danger_background_color = "#f05e57" %}
{% set danger_border_color = "#ef4b60" %}
{% set warning_color = "rgba(255, 255, 255, 0.9)" %}
{% set warning_background_color = "#fa9500" %}
{% set warning_border_color = "#eb6500" %}
{% set note_color = "rgba(255, 255, 255, 0.9)" %}
{% set note_background_color = "#468847" %}
{% set note_border_color = "#5ec65d" %}
{% set hint_color = "rgba(255, 255, 255, 0.9)" %}
{% set hint_background_color = "#56C0E0" %}
{% set hint_border_color = "#31ced9" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #1c1e22 !important;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #1c1e22;
border-top: 1px solid #1c1e22;
border-bottom: 1px solid #1c1e22;
}
/* Field-list
---------------------------------------------------------*/
table.field-list {
background-color: #272B30;
}
/* Citation
---------------------------------------------------------*/
table.citation{
background-color: #272B30;
}
/* Footnote
---------------------------------------------------------*/
table.footnote {
background-color: #272B30;
}
/* Contents
---------------------------------------------------------*/
div.contents {
background-color: #1c1e22;
border-color: #0b0b0d;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a{
color: #c8c8c8;
}
ul.sp-localtoc ul a:hover{
background-color: #272b2e;
color: #ffffff;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #c8c8c8;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
background-color: #272b2e;
color: #ffffff;
}
@@ -0,0 +1,72 @@
{% set table_border_color = "#dddddd" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#cd0200" %}
{% set danger_border_color = "#be001e" %}
{% set warning_color = "#ffffff" %}
{% set warning_background_color = "#d47500" %}
{% set warning_border_color = "#c54c00" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#3cb521" %}
{% set note_border_color = "#4b9f1d" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#3399f3" %}
{% set hint_border_color = "#11adf1" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #eeeeee !important;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #eeeeee;
border-top: 1px solid #eeeeee;
border-bottom: 1px solid #eeeeee;
}
/* Contents
---------------------------------------------------------*/
div.contents {
background-color: #eeeeee;
border: none;
box-shadow: none;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a{
color: #777777;
}
ul.sp-localtoc ul a:hover{
color: #3399f3;
-webkit-transition: color ease-in-out .2s;
transition: color ease-in-out .2s;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #c8c8c8;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
color: #ffffff;
-webkit-transition: color ease-in-out .2s;
transition: color ease-in-out .2s;
}
/* Etc
---------------------------------------------------------*/
div.navbar-inner ul.pull-right li a{
font-size: 12px;
}
@@ -0,0 +1,36 @@
{% set table_border_color = "#999999" %}
{% set table_oddrow_color = "#eaeaea;" %}
{% set table_hover_color = "#dddddd" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#d14432" %}
{% set danger_border_color = "#c72d35" %}
{% set warning_color = "#ffffff" %}
{% set warning_background_color = "#f26522" %}
{% set warning_border_color = "#f13614" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#24c00b" %}
{% set note_border_color = "#3aa80a" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#185af9" %}
{% set hint_border_color = "#066ee7" %}
div.navbar-inner ul.pull-right li a{
font-size: 15px;
}
@media (max-width: 480px) {
a.brand {
line-height: 25px;
}
}
table.docutils th.head {
background-color: #015b4e;
color: #fff;
}
{% include "static/css/adjust_theme/_common_adjust.css" %}
@@ -0,0 +1,123 @@
{% set table_border_color = "#4d5d6d" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#db524b" %}
{% set danger_border_color = "#db524b" %}
{% set warning_color = "#ffffff" %}
{% set warning_background_color = "#f2ae43" %}
{% set warning_border_color = "#f2ae43" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#58b957" %}
{% set note_border_color = "#58b957" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#56c0e0" %}
{% set hint_border_color = "#56c0e0" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #4d5d6d !important;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #4d5d6d;
border-top: 1px solid #4d5d6d;
border-bottom: 1px solid #4d5d6d;
}
/* Contents
---------------------------------------------------------*/
div.contents {
background-color: #4d5d6d;
border: none;
box-shadow: none;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a{
font-size: 12px;
color: #ebebeb;
}
ul.sp-localtoc ul a:hover{
color: #ebebeb;
background-color: #485563;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #ebebeb;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
color: #ebebeb;
background-color: #c85e17;
}
/* Code
---------------------------------------------------------*/
code, pre {
padding:0 3px 2px;
font-family:Menlo,Monaco,Consolas,"Courier New",monospace;
font-size:12px;
color:#3a3f44;
-webkit-border-radius:3px;
-moz-border-radius:3px;
border-radius:3px;
}
code{
padding:2px 4px;
color:#d14;
background-color:#f7f7f9;
border:1px solid #e1e1e8;
white-space:nowrap;
}
pre{
display:block;
padding:10px;
margin:0 0 10.5px;
font-size:13px;
line-height:21px;
word-break:break-all;
word-wrap:break-word;
white-space:pre;
white-space:pre-wrap;
background-color:#f5f5f5;
border:1px solid #ccc;
border:1px solid rgba(0, 0, 0, 0.15);
-webkit-border-radius:4px;
-moz-border-radius:4px;
border-radius:4px;
}
pre.prettyprint{
margin-bottom:21px;
}
pre code{
padding:0;
color:inherit;
white-space:pre;
white-space:pre-wrap;
background-color:transparent;
border:0;
}
div.navbar-inner ul.pull-right li a{
font-size: 15px;
}
@media (max-width: 480px) {
a.brand {
line-height: 30px;
}
}
@@ -0,0 +1,62 @@
{% set table_border_color = "#dddddd" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#e13622" %}
{% set danger_border_color = "#e13622" %}
{% set warning_color = "#ffffff" %}
{% set warning_background_color = "#f0b82d" %}
{% set warning_border_color = "#f0b82d" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#30b644" %}
{% set note_border_color = "#30b644" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#782753" %}
{% set hint_border_color = "#782753" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #eeeeee !important;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #eeeeee;
border-top: 1px solid #eeeeee;
border-bottom: 1px solid #eeeeee;
}
/* Contents
---------------------------------------------------------*/
div.contents {
background-color: #eeeeee;
border: none;
box-shadow: none;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a{
color: #ffffff;
}
ul.sp-localtoc ul a:hover{
color: #ffffff;
background-color: #97310e;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #ffffff;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
color: #ffffff;
background-color: #3e152b;
}
@@ -0,0 +1,62 @@
{% set table_border_color = "#dddddd" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#f33f13" %}
{% set danger_border_color = "#ed2c00" %}
{% set warning_color = "#ffffff" %}
{% set warning_background_color = "#eb9100" %}
{% set warning_border_color = "#d28100" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#3ead68" %}
{% set note_border_color = "#379b5d" %}
{% set hint_color = "#ffffff" %}
{% set hint_background_color = "#56c0e0" %}
{% set hint_border_color = "#3ab5da" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
/* Heading
---------------------------------------------------------*/
h2, h3, h4, h5, h6 {
border-bottom: 1px solid #dddddd !important;
}
/* Genindex
---------------------------------------------------------*/
div.genindex-jumpbox {
color: #dddddd;
border-top: 1px solid #dddddd;
border-bottom: 1px solid #dddddd;
}
/* Contents
---------------------------------------------------------*/
div.contents {
background-color: #fafafa;
border: none;
box-shadow: none;
}
/* Smartphone Local Toc
---------------------------------------------------------*/
ul.sp-localtoc ul a{
color: #ffffff;
}
ul.sp-localtoc ul a:hover{
color: #ffffff;
background-color: #272727;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #ffffff;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
color: #ffffff;
background-color: #006687;
}
@@ -0,0 +1,36 @@
{% set table_border_color = "#228000" %}
{% set danger_color = "#ffffff" %}
{% set danger_background_color = "#f40000" %}
{% set danger_border_color = "#a20000" %}
{% set warning_color = "#000000" %}
{% set warning_background_color = "#fcfe00" %}
{% set warning_border_color = "#f40000" %}
{% set note_color = "#ffffff" %}
{% set note_background_color = "#228000" %}
{% set note_border_color = "#2faa00" %}
{% set hint_color = "#000000" %}
{% set hint_background_color = "#57ffff" %}
{% set hint_border_color = "#a8a900" %}
{% include "static/css/adjust_theme/_common_adjust.css" %}
table.docutils {
-webkit-border-radius: 0px;
-moz-border-radius: 0px;
border-radius: 0px;
}
div.admonition {
-webkit-border-radius: 0px;
-moz-border-radius: 0px;
border-radius: 0px;
}
div.topic {
background: url("../../img/stars.gif") !important;
}
+350
View File
@@ -0,0 +1,350 @@
@import url("../basic.css");
/* Table
---------------------------------------------------------*/
table {
border: 0;
max-width: 100%;
background-color: transparent;
border-collapse: collapse;
border-spacing: 0 !important;
}
table.docutils {
width: 100%;
margin-bottom: 20px;
border: 1px solid #dddddd;
border-collapse: separate;
*border-collapse: collapse;
border-left: 0;
border-right: 0;
}
table.docutils th {
font-weight: bold;
}
table.docutils th,
table.docutils td
{
padding: 8px;
line-height: 20px;
text-align: left;
vertical-align: top;
border: none;
border-spacing: 0 !important;
border-collapse: none;
border-top: 1px solid #dddddd;
}
table.docutils caption + thead tr:first-child th,
table.docutils caption + tbody tr:first-child th,
table.docutils caption + tbody tr:first-child td,
table.docutils colgroup + thead tr:first-child th,
table.docutils colgroup + tbody tr:first-child th,
table.docutils colgroup + tbody tr:first-child td,
table.docutils thead:first-child tr:first-child th,
table.docutils tbody:first-child tr:first-child th,
table.docutils tbody:first-child tr:first-child td {
border-top: 0;
}
table.docutils thead th {
vertical-align: bottom;
}
table.docutils tbody + tbody {
border-top: 2px solid #dddddd;
}
/* Table-bordered
---------------------------------------------------------*/
table.table-bordered {
border-top: 1px solid #dddddd;
border-left: 1px solid #dddddd;
border-right: none;
}
table.table-bordered > thead > tr > th,
table.table-bordered > tbody > tr > th,
table.table-bordered > tfoot > tr > th,
table.table-bordered > thead > tr > td,
table.table-bordered > tbody > tr > td,
table.table-bordered > tfoot > tr > td {
border-left: none;
border-bottom-width: 0;
}
/* Highlight Table
---------------------------------------------------------*/
.highlighttable .code pre {
font-size: 12px;
}
.highlighttable .linenos pre {
word-break: normal;
font-size: 12px;
}
div.highlight {
background: none;
}
/* Field-list
---------------------------------------------------------*/
table.field-list {
width: auto;
border: none;
}
/* Citation
---------------------------------------------------------*/
table.citation{
width: auto;
margin-bottom: 0;
border: none;
}
table.citation td.label {
font-size: 100%;
display: block;
line-height: normal;
background: inherit;
}
/* Footnote
---------------------------------------------------------*/
a.footnote-reference {
vertical-align: super;
font-size: 75%;
}
table.footnote td.label {
font-size: 100%;
display: block;
line-height: normal;
background: inherit;
}
table.footnote {
width: auto;
margin-bottom: 0px;
border: none;
}
/* Footer
---------------------------------------------------------*/
footer {
width: 100%;
margin: 0;
text-align: center;
padding: 0px;
padding-left: auto;
padding-right: auto;
}
/* Sidebar
------------------------------------------------------- */
div.sidebar {
border: none;
margin: 0;
padding: 0;
background: none;
width: 100%;
float: none;
}
div.sidebar ul:second-child {
color: red;
background-color: #000 !important;
list-style: none !important;
}
/* Definition lists
----------------------------------------------------------- */
dl dd {
padding-left: 1em;
}
/* Admonition styles
----------------------------------------------------------- */
div.admonition {
padding: 8px 35px 8px 0px;
margin-bottom: 20px;
color: #c09853;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
background-color: #fcf8e3;
border: 1px solid #fbeed5;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
div.admonition p {
margin: 0.5em 1em 0.5em 1em;
padding: 0;
}
div.admonition pre {
margin: 0.4em 1em 0.4em 1em;
}
div.admonition p.admonition-title {
margin: 0;
padding: 0.1em 0 0.1em 0.5em;
font-weight: bold;
}
div.admonition ul, div.admonition ol {
margin: 0.1em 0.5em 0.5em 3em;
padding: 0;
}
/* -- danger, error -- */
div.danger,
div.error {
color: #b94a48;
background-color: #f2dede;
border-color: #eed3d7;
}
/* -- warning, caution, attention -- */
div.warning,
div.caution,
div.attention {
}
/* -- note, important -- */
div.note,
div.important {
color: #468847;
background-color: #dff0d8;
border-color: #d6e9c6;
}
/* -- hint, tip -- */
div.hint,
div.tip {
color: #3a87ad;
background-color: #d9edf7;
border-color: #bce8f1;
}
/* Etc
----------------------------------------------------------- */
div.figure-round img {
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
}
div.figure-polaroid img{
padding: 4px;
background-color: #fff;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
div.figure-circle img {
-webkit-border-radius: 500px;
-moz-border-radius: 500px;
border-radius: 500px;
}
a.headerlink {
font-size: 60% !important;
padding-left: 5px;
}
/*
#searchbox .search-query {
width: 60%;
}
*/
div.topic {
min-height: 20px;
padding: 9px;
margin-bottom: 20px;
background-color: #f5f5f5;
border: 1px solid #e3e3e3;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
ul.sp-localtoc {
list-style: none;
padding: 0;
}
ul.sp-localtoc ul{
list-style: none;
padding-left: 0;
}
ul.sp-localtoc ul a{
padding-left: 15px;
padding-top:7px;
padding-bottom:7px;
display: block;
text-decoration: none;
color: #777777;
}
ul.sp-localtoc ul a:hover{
color: #555555;
}
ul.sp-localtoc ul ul{
list-style: none;
}
ul.sp-localtoc ul ul a{
padding-left: 25px;
}
ul.sp-localtoc ul ul ul a{
padding-left: 35px;
}
ul.sp-localtoc ul ul ul ul a{
padding-left: 45px;
}
ul.sp-localtoc ul ul ul ul ul a{
padding-left: 55px;
}
ul.sp-localtoc ul ul ul ul ul a{
padding-left: 65px;
}
div.navbar-inverse ul.sp-localtoc ul a{
color: #999999;
}
div.navbar-inverse ul.sp-localtoc ul a:hover{
color: #ffffff;
}
div.footer-relbar {
margin-top:10px;
}
div.sidebar ul {
list-style: none;
padding-left: 10px;
}
div.sidebar ul ul {
list-style: initial;
padding-left: 40px;
}
div.sidebar p.topless {
padding-left: 10px;
}
+186
View File
@@ -0,0 +1,186 @@
/* Bootstrap
------------------------------------------------------- */
/* apply font awesome
------------------------------------------------------- */
div.danger p.admonition-title:before,
div.error p.admonition-title:before,
div.warning p.admonition-title:before,
div.caution p.admonition-title:before,
div.attention p.admonition-title:before,
div.important p.admonition-title:before,
div.note p.admonition-title:before,
div.hint p.admonition-title:before,
div.tip p.admonition-title:before
{
display: inline-block;
font-family: FontAwesome;
font-style: normal;
font-weight: normal;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
div.danger p.admonition-title:before,
div.error p.admonition-title:before {
content: "\f06a\00a0";
}
div.warning p.admonition-title:before,
div.caution p.admonition-title:before,
div.attention p.admonition-title:before {
content: "\f071\00a0";
}
div.important p.admonition-title:before,
div.note p.admonition-title:before {
content: "\f05a\00a0";
}
div.hint p.admonition-title:before,
div.tip p.admonition-title:before {
content: "\f0eb\00a0";
}
{%- if theme_h1_size != '' %}
h1 { font-size: {{ theme_h1_size }}; line-height: {{ theme_h1_size }};}
{% endif %}
{%- if theme_h2_size != '' %}
h2 { font-size: {{ theme_h2_size }}; line-height: {{ theme_h2_size }};}
{% endif %}
{%- if theme_h3_size != '' %}
h3 { font-size: {{ theme_h3_size }}; line-height: {{ theme_h3_size }};}
{% endif %}
{%- if theme_h4_size != '' %}
h4 { font-size: {{ theme_h4_size }}; line-height: {{ theme_h4_size }};}
{% endif %}
{%- if theme_h5_size != '' %}
h5 { font-size: {{ theme_h5_size }}; line-height: {{ theme_h5_size }};}
{% endif %}
{%- if theme_h6_size != '' %}
h6 { font-size: {{ theme_h6_size }}; line-height: {{ theme_h6_size }};}
{% endif %}
{%- if (theme_googlewebfont|tobool) %}
body,
h1,
h2,
h3,
h4,
h5,
h6,
input,
button,
select,
textarea,
h1 small,
h2 small,
h3 small,
h4 small,
h5 small,
h6 small,
.navbar,
.navbar-search .search-query,
.navbar .navbar-search .search-query,
/*
.navbar .search-query::-moz-placeholder,
.navbar .search-query::-webkit-input-placeholder,
*/
.navbar .brand,
.navbar .nav>li>a,
.navbar .navbar-text,
.navbar .dropdown-menu li>a,
.nav li>a,
div.subnav,
div.subnav .nav>li>a,
div.subnav .nav>li:first-child>a,
div.subnav .nav>li.active>a,
legend,
.btn,
.alert-heading
{
{{ theme_googlewebfont_style }}
}
{%- endif %}
h2, h3, h4, h5, h6 {
padding-bottom: 10px;
border-bottom: 1px solid #d0d0d0;
}
{%- if theme_bootstrap_version == '2' %}
div.sidebar ul {
margin-left: 0;
}
ul.sp-localtoc{
margin-left: 0 !important;
}
ul.sp-localtoc ul{
margin-left: 0 !important;
}
ul.sp-localtoc ul ul{
margin-left: 0 !important;
}
ul.sp-localtoc ul ul a{
margin-left: 25px;
}
ul.sp-localtoc ul ul ul a{
margin-left: 35px;
}
ul.sp-localtoc ul ul ul ul a{
margin-left: 45px;
}
ul.sp-localtoc ul ul ul ul ul a{
margin-left: 55px;
}
ul.sp-localtoc ul ul ul ul ul a{
margin-left: 65px;
}
{% endif %}
/* for tablet */
@media (max-width: 767px) {
form.sp-searchbox div.input-append {
margin-top: 10px;
margin-left: 12px;
}
form.sp-searchbox div.input-append {
{%- if theme_bootstrap_version == '2' %}
width: 70%;
{% else %}
width: 90%;
{% endif %}
}
form.sp-searchbox input.search-query {
width: 100%;
}
}
/* for smartphone */
@media (max-width: 480px) {
a.brand {
width: 80%;
}
a.navbar-brand {
width: 80%;
height: 100%;
}
.searchbox .search-query {
width: 90%;
}
}
/* for desktop */
@media (min-width: 768px) {
{% if theme_nav_fixed %}
.navbar-inner div.container {
width: {{ theme_nav_width }};
}
{% endif %}
{% if theme_content_fixed %}
div.container {
width: {{ theme_content_width }};
}
{% endif %}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,82 @@
/* Template-specific stuff
*
* Customizations just for the template; these are not necessary for anything
* with disabling the responsiveness.
*/
/* Account for fixed navbar */
body {
min-width: 970px;
}
/* Finesse the page header spacing */
.page-header {
margin-bottom: 30px;
}
.page-header .lead {
margin-bottom: 10px;
}
/* Non-responsive overrides
*
* Utilitze the following CSS to disable the responsive-ness of the container,
* grid system, and navbar.
*/
/* Reset the container */
.container {
width: 970px;
max-width: none !important;
}
/* Demonstrate the grids */
.col-xs-3 {
}
.container .navbar-header,
.container .navbar-collapse {
margin-right: 0;
margin-left: 0;
}
/* Always float the navbar header */
.navbar-header {
float: left;
}
/* Undo the collapsing navbar */
.navbar-collapse {
display: block !important;
height: auto !important;
padding-bottom: 0;
overflow: visible !important;
}
.navbar-toggle {
display: none;
}
.navbar-collapse {
border-top: 0;
}
.navbar-brand {
margin-left: -15px;
}
/* Always apply the floated nav */
.navbar-nav {
float: left;
margin: 0;
}
.navbar-nav > li {
float: left;
}
.navbar-nav > li > a {
padding: 15px;
}
/* Redeclare since we override the float above */
.navbar-nav.navbar-right {
float: right;
}
/* Undo custom dropdowns */
.navbar .navbar-nav .open .dropdown-menu {
position: absolute;
float: left;
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More