From 9ea13716963046c32de8272e59c4b58cd2e41e44 Mon Sep 17 00:00:00 2001 From: Cedric Date: Sat, 3 Oct 2026 15:39:15 +0200 Subject: [PATCH 1/3] Compact density and built-in Iosevka font for denser log display Settings > Interface > Log display gets a Density switch (Normal/Compact) that tightens row padding and line height, and the font list gets Iosevka, a narrow SIL OFL monospace font served from web/fonts (Latin subset, 13 KB per weight) so it works offline, unlike the Bunny Fonts ones. Co-Authored-By: Claude Opus 5.5 (1M context) --- README.fr.md | 19 ++++--- README.md | 15 +++-- web/app.js | 40 ++++++++++--- web/fonts/OFL-Iosevka.txt | 110 ++++++++++++++++++++++++++++++++++++ web/fonts/iosevka-400.woff2 | Bin 0 -> 13184 bytes web/fonts/iosevka-700.woff2 | Bin 0 -> 13152 bytes web/index.html | 5 ++ web/style.css | 13 ++++- 8 files changed, 179 insertions(+), 23 deletions(-) create mode 100644 web/fonts/OFL-Iosevka.txt create mode 100644 web/fonts/iosevka-400.woff2 create mode 100644 web/fonts/iosevka-700.woff2 diff --git a/README.fr.md b/README.fr.md index bd300f9..febd70e 100644 --- a/README.fr.md +++ b/README.fr.md @@ -243,14 +243,17 @@ couleur, est mémorisé par navigateur. - **Interface** - *Thème* : Système (suit la préférence de l'ordinateur ou du téléphone), Clair ou Sombre. Le bouton soleil/lune de l'en-tête bascule entre clair et sombre. - - *Affichage des logs* : taille du texte (très petite, petite, moyenne, grande) et police : - la police monospace du système, ou l'une des 12 polices libres conçues pour le texte dense - (JetBrains Mono, Fira Code, Source Code Pro, IBM Plex Mono, Cascadia Code, Roboto Mono, - Ubuntu Mono, Inconsolata, Red Hat Mono, Noto Sans Mono, Victor Mono, DM Mono). Elles sont - chargées par le navigateur depuis [Bunny Fonts](https://fonts.bunny.net), un service - européen de polices respectueux de la vie privée ; sans accès à internet, la police du - système est utilisée. Les ligatures sont désactivées pour que `->` ou `!=` s'affichent tels - quels. + - *Affichage des logs* : taille du texte (très petite, petite, moyenne, grande), densité + (normale, ou compacte pour afficher environ 50 % de lignes en plus à l'écran) et police : + la police monospace du système, [Iosevka](https://github.com/be5invis/Iosevka) (étroite, + donc plus de texte par ligne ; servie par LogStream lui-même, fonctionne hors ligne), ou + l'une des 12 polices libres conçues pour le texte dense (JetBrains Mono, Fira Code, Source + Code Pro, IBM Plex Mono, Cascadia Code, Roboto Mono, Ubuntu Mono, Inconsolata, Red Hat Mono, + Noto Sans Mono, Victor Mono, DM Mono). Ces 12 polices sont chargées par le navigateur depuis + [Bunny Fonts](https://fonts.bunny.net), un service européen de polices respectueux de la vie + privée ; sans accès à internet, la police du système est utilisée. Les ligatures sont + désactivées pour que `->` ou `!=` s'affichent tels quels. Le réglage le plus dense est Très + petite + Compacte + Iosevka. - **Données** : « Supprimer tous les logs » efface définitivement tous les logs stockés (il faut taper `PURGE` pour confirmer). Les tags et les paramètres sont conservés. VictoriaLogs doit être lancé avec `-delete.enable` (déjà présent dans `docker-compose.yml`) ; mettez diff --git a/README.md b/README.md index edcf628..bb4f266 100644 --- a/README.md +++ b/README.md @@ -222,12 +222,15 @@ remembered per browser. - **Interface** - *Theme*: System (follows the computer/phone preference), Light or Dark. The sun/moon button in the header switches between light and dark. - - *Log display*: font size (tiny, small, medium, large) and font: the system monospace - font, or one of 12 free fonts made for dense text (JetBrains Mono, Fira Code, Source - Code Pro, IBM Plex Mono, Cascadia Code, Roboto Mono, Ubuntu Mono, Inconsolata, Red Hat - Mono, Noto Sans Mono, Victor Mono, DM Mono). They are loaded by the browser from - [Bunny Fonts](https://fonts.bunny.net), a privacy-friendly European font service; without - internet access, the system font is used. Ligatures are disabled so `->` or `!=` show as typed. + - *Log display*: font size (tiny, small, medium, large), density (normal, or compact to + fit about 50% more lines on screen) and font: the system monospace font, + [Iosevka](https://github.com/be5invis/Iosevka) (narrow, so more text fits on each line; + served by LogStream itself, works offline), or one of 12 free fonts made for dense text + (JetBrains Mono, Fira Code, Source Code Pro, IBM Plex Mono, Cascadia Code, Roboto Mono, + Ubuntu Mono, Inconsolata, Red Hat Mono, Noto Sans Mono, Victor Mono, DM Mono). These 12 are + loaded by the browser from [Bunny Fonts](https://fonts.bunny.net), a privacy-friendly + European font service; without internet access, the system font is used. Ligatures are + disabled so `->` or `!=` show as typed. The densest setting is Tiny + Compact + Iosevka. - **Data**: "Delete all logs" permanently erases every stored log (you must type `PURGE` to confirm). Tags and settings are kept. VictoriaLogs needs `-delete.enable` (already set in `docker-compose.yml`); set `ALLOW_PURGE=false` to disable the feature. diff --git a/web/app.js b/web/app.js index 45314a1..9243ee7 100644 --- a/web/app.js +++ b/web/app.js @@ -120,8 +120,9 @@ const I18N = { themeHelp: 'System follows the light/dark preference of your computer or phone.', logDisplay: 'Log display', fontSize: 'Font size', sizeTiny: 'Tiny', sizeSmall: 'Small', sizeMedium: 'Medium', sizeLarge: 'Large', - fontLabel: 'Font', fontSystem: 'System monospace (no download)', - fontHelp: 'Free fonts (SIL Open Font License) loaded by your browser from Bunny Fonts, a privacy-friendly European font service. Without internet access, the system font is used.', + density: 'Density', densityNormal: 'Normal', densityCompact: 'Compact', + fontLabel: 'Font', fontSystem: 'System monospace (no download)', fontBuiltin: 'built in, narrow', + fontHelp: 'Free fonts (SIL Open Font License). Iosevka is served by LogStream itself and works offline; it is narrow, so more text fits on each line. The others are loaded by your browser from Bunny Fonts, a privacy-friendly European font service; without internet access, the system font is used.', previewMsgs: ['error: link down on eth1, carrier lost', 'warning: disk /dev/sda temperature 58°C', 'backup finished: ok (12.4 GB in 00:14:32)'], dangerZone: 'Danger zone', purgeHelp: 'Permanently delete every stored log to start from scratch. Color tags and settings are kept.', @@ -273,8 +274,9 @@ const I18N = { themeHelp: 'Système suit la préférence clair/sombre de votre ordinateur ou de votre téléphone.', logDisplay: 'Affichage des logs', fontSize: 'Taille du texte', sizeTiny: 'Très petite', sizeSmall: 'Petite', sizeMedium: 'Moyenne', sizeLarge: 'Grande', - fontLabel: 'Police', fontSystem: 'Monospace du système (aucun téléchargement)', - fontHelp: 'Polices libres (licence SIL Open Font) chargées par votre navigateur depuis Bunny Fonts, un service européen respectueux de la vie privée. Sans accès à internet, la police du système est utilisée.', + density: 'Densité', densityNormal: 'Normale', densityCompact: 'Compacte', + fontLabel: 'Police', fontSystem: 'Monospace du système (aucun téléchargement)', fontBuiltin: 'intégrée, étroite', + fontHelp: 'Polices libres (licence SIL Open Font). Iosevka est servie par LogStream lui-même et fonctionne hors ligne ; elle est étroite, donc chaque ligne affiche plus de texte. Les autres sont chargées par votre navigateur depuis Bunny Fonts, un service européen respectueux de la vie privée ; sans accès à internet, la police du système est utilisée.', previewMsgs: ['error: link down on eth1, carrier lost', 'warning: disk /dev/sda temperature 58°C', 'backup finished: ok (12.4 GB in 00:14:32)'], dangerZone: 'Zone de danger', purgeHelp: 'Supprime définitivement tous les logs stockés pour repartir de zéro. Les tags de couleur et les réglages sont conservés.', @@ -537,9 +539,11 @@ $('#themeSwitch').addEventListener('click', (ev) => { /* ================= Log font and size ================= */ -// Free monospace fonts, served by Bunny Fonts (https://fonts.bunny.net). +// Free monospace fonts, served by Bunny Fonts (https://fonts.bunny.net), except the +// built-in ones (web/fonts, declared in style.css), which also work offline. const LOG_FONTS = [ { id: 'system' }, + { id: 'iosevka', family: 'Iosevka', builtin: true }, { id: 'jetbrains-mono', family: 'JetBrains Mono' }, { id: 'fira-code', family: 'Fira Code' }, { id: 'source-code-pro', family: 'Source Code Pro' }, @@ -554,7 +558,8 @@ const LOG_FONTS = [ { id: 'dm-mono', family: 'DM Mono', weights: '400,500' }, ]; const LOG_SIZES = { tiny: '10.5px', small: '11.5px', medium: '12.5px', large: '14px' }; -const ui = { font: 'system', size: 'medium' }; +const LOG_DENSITIES = ['normal', 'compact']; +const ui = { font: 'system', size: 'medium', density: 'normal' }; function applyLogFont(id) { const f = LOG_FONTS.find((x) => x.id === id) || LOG_FONTS[0]; @@ -564,6 +569,10 @@ function applyLogFont(id) { root.removeProperty('--log-font'); return; } + if (f.builtin) { + root.setProperty('--log-font', `'${f.family}', var(--mono)`); + return; + } const href = `https://fonts.bunny.net/css?family=${f.id}:${f.weights || '400,700'}&display=swap`; let link = document.getElementById('logFontCss'); if (!link) { @@ -579,13 +588,22 @@ function applyLogSize(id) { document.documentElement.style.setProperty('--log-size', LOG_SIZES[ui.size]); } +function applyLogDensity(id) { + ui.density = LOG_DENSITIES.includes(id) ? id : 'normal'; + document.documentElement.dataset.density = ui.density; +} + function renderInterface() { renderThemeSwitch(); for (const b of document.querySelectorAll('#sizeSwitch [data-size]')) { b.setAttribute('aria-checked', String(b.dataset.size === ui.size)); } + for (const b of document.querySelectorAll('#densitySwitch [data-density]')) { + b.setAttribute('aria-checked', String(b.dataset.density === ui.density)); + } const sel = $('#fontSelect'); - sel.innerHTML = LOG_FONTS.map((f) => ``).join(''); + const fontName = (f) => (!f.family ? t('fontSystem') : f.builtin ? `${f.family} (${t('fontBuiltin')})` : f.family); + sel.innerHTML = LOG_FONTS.map((f) => ``).join(''); sel.value = ui.font; renderFontPreview(); renderHistoSettings(); @@ -609,6 +627,13 @@ $('#sizeSwitch').addEventListener('click', (ev) => { store.set('logSize', ui.size); renderInterface(); }); +$('#densitySwitch').addEventListener('click', (ev) => { + const b = ev.target.closest('[data-density]'); + if (!b) return; + applyLogDensity(b.dataset.density); + store.set('logDensity', ui.density); + renderInterface(); +}); $('#fontSelect').addEventListener('change', (ev) => { applyLogFont(ev.target.value); store.set('logFont', ui.font); @@ -2190,6 +2215,7 @@ $('#settingsDlg').addEventListener('click', (ev) => { if (ev.target === ev.curre } applyLogFont(store.get('logFont', 'system')); applyLogSize(store.get('logSize', 'medium')); +applyLogDensity(store.get('logDensity', 'normal')); applyLang(); $('#range').value = store.get('range', '1h'); if (!$('#range').value) $('#range').value = '1h'; diff --git a/web/fonts/OFL-Iosevka.txt b/web/fonts/OFL-Iosevka.txt new file mode 100644 index 0000000..b2a7b6a --- /dev/null +++ b/web/fonts/OFL-Iosevka.txt @@ -0,0 +1,110 @@ +Copyright (c) 2015-2023, Renzhi Li (aka. Belleve Invis, belleve@typeof.net) + +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: +http://scripts.sil.org/OFL + +-------------------------- + + +SIL Open Font License v1.1 +==================================================== + + +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) of the Font + Software 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. diff --git a/web/fonts/iosevka-400.woff2 b/web/fonts/iosevka-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..80d83abb3c5c753cbbead64a3a3b3a783c2732a6 GIT binary patch literal 13184 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 literal 0 HcmV?d00001 diff --git a/web/fonts/iosevka-700.woff2 b/web/fonts/iosevka-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..cf34747049c0d1b94a2adb1b993ad8b57d8add4e GIT binary patch literal 13152 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 G0096&_hvEx literal 0 HcmV?d00001 diff --git a/web/index.html b/web/index.html index 89116ed..f4b0ed4 100644 --- a/web/index.html +++ b/web/index.html @@ -282,6 +282,11 @@ + Density +
+ + +
diff --git a/web/style.css b/web/style.css index 3035f8f..87a8982 100644 --- a/web/style.css +++ b/web/style.css @@ -1,3 +1,8 @@ +/* Iosevka (SIL OFL, web/fonts/OFL-Iosevka.txt): a narrow monospace font served by LogStream + itself, so it also works offline. Latin subset only; other scripts fall back to --mono. */ +@font-face { font-family: "Iosevka"; src: url("fonts/iosevka-400.woff2") format("woff2"); font-weight: 400 500; font-display: swap; } +@font-face { font-family: "Iosevka"; src: url("fonts/iosevka-700.woff2") format("woff2"); font-weight: 600 800; font-display: swap; } + /* ---------- Theme: everything goes through these variables ---------- */ :root { --bg: #f6f7f9; @@ -342,6 +347,9 @@ body.col-resizing, body.col-resizing * { cursor: col-resize !important; user-sel cursor: pointer; } .row:last-child { border-bottom: 0; } +/* Settings > Interface > Density: compact fits about 50% more lines on screen */ +:root[data-density="compact"] .row { padding-top: 1px; padding-bottom: 1px; line-height: 1.25; } +:root[data-density="compact"] .row .sev { padding-top: 0; padding-bottom: 0; line-height: 1.3; } .row:hover { background: var(--row-hover); } .row:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; } .row.new { animation: flash 1.2s ease-out; } @@ -678,8 +686,9 @@ input.switch:focus-visible { outline: 2px solid var(--accent); outline-offset: 2 } .set-nav button span { max-width: 100%; overflow: hidden; text-overflow: ellipsis; } .set-panels { padding: 0 16px 18px; } - #sizeSwitch { display: flex; } - #sizeSwitch button { flex: 1; padding: 0 4px; white-space: nowrap; font-size: 12px; } + #sizeSwitch, #densitySwitch { display: flex; } + #sizeSwitch button, #densitySwitch button { flex: 1; padding: 0 4px; white-space: nowrap; font-size: 12px; } + :root[data-density="compact"] .row { padding-top: 3px; padding-bottom: 3px; } .field-grid select { margin-bottom: 6px; } .status { padding: 6px 16px; } .tag-row { grid-template-columns: auto 38px 1fr 36px; } -- 2.54.0 From 8228bc140fa25173b73050449ec189aac29cb8a5 Mon Sep 17 00:00:00 2001 From: Cedric Date: Sat, 3 Oct 2026 15:39:58 +0200 Subject: [PATCH 2/3] Keep tag code badges from making compact rows taller Co-Authored-By: Claude Opus 5.5 (1M context) --- web/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/web/style.css b/web/style.css index 87a8982..f32a3b3 100644 --- a/web/style.css +++ b/web/style.css @@ -350,6 +350,7 @@ body.col-resizing, body.col-resizing * { cursor: col-resize !important; user-sel /* Settings > Interface > Density: compact fits about 50% more lines on screen */ :root[data-density="compact"] .row { padding-top: 1px; padding-bottom: 1px; line-height: 1.25; } :root[data-density="compact"] .row .sev { padding-top: 0; padding-bottom: 0; line-height: 1.3; } +:root[data-density="compact"] .row .codes b { padding-top: 0; padding-bottom: 0; line-height: 1.2; } .row:hover { background: var(--row-hover); } .row:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; } .row.new { animation: flash 1.2s ease-out; } -- 2.54.0 From 236c936a9d841af4838efe15dda3d8a8697cf141 Mon Sep 17 00:00:00 2001 From: Cedric Date: Sat, 3 Oct 2026 15:44:02 +0200 Subject: [PATCH 3/3] Built-in Ubuntu Mono and Inconsolata Condensed fonts Inconsolata Condensed (Inconsolata pinned at width 75, 0.4em per character) is now the narrowest option. Ubuntu Mono moves from Bunny Fonts to the built-in fonts, so it works offline too. Co-Authored-By: Claude Opus 5.5 (1M context) --- README.fr.md | 18 ++-- README.md | 16 ++-- web/app.js | 7 +- web/fonts/OFL-Inconsolata.txt | 93 +++++++++++++++++++++ web/fonts/UFL-Ubuntu-Mono.txt | 96 ++++++++++++++++++++++ web/fonts/inconsolata-condensed-400.woff2 | Bin 0 -> 9928 bytes web/fonts/inconsolata-condensed-700.woff2 | Bin 0 -> 10076 bytes web/fonts/ubuntu-mono-400.woff2 | Bin 0 -> 9296 bytes web/fonts/ubuntu-mono-700.woff2 | Bin 0 -> 9228 bytes web/style.css | 9 +- 10 files changed, 217 insertions(+), 22 deletions(-) create mode 100644 web/fonts/OFL-Inconsolata.txt create mode 100644 web/fonts/UFL-Ubuntu-Mono.txt create mode 100644 web/fonts/inconsolata-condensed-400.woff2 create mode 100644 web/fonts/inconsolata-condensed-700.woff2 create mode 100644 web/fonts/ubuntu-mono-400.woff2 create mode 100644 web/fonts/ubuntu-mono-700.woff2 diff --git a/README.fr.md b/README.fr.md index febd70e..b3d6473 100644 --- a/README.fr.md +++ b/README.fr.md @@ -245,15 +245,15 @@ couleur, est mémorisé par navigateur. bouton soleil/lune de l'en-tête bascule entre clair et sombre. - *Affichage des logs* : taille du texte (très petite, petite, moyenne, grande), densité (normale, ou compacte pour afficher environ 50 % de lignes en plus à l'écran) et police : - la police monospace du système, [Iosevka](https://github.com/be5invis/Iosevka) (étroite, - donc plus de texte par ligne ; servie par LogStream lui-même, fonctionne hors ligne), ou - l'une des 12 polices libres conçues pour le texte dense (JetBrains Mono, Fira Code, Source - Code Pro, IBM Plex Mono, Cascadia Code, Roboto Mono, Ubuntu Mono, Inconsolata, Red Hat Mono, - Noto Sans Mono, Victor Mono, DM Mono). Ces 12 polices sont chargées par le navigateur depuis - [Bunny Fonts](https://fonts.bunny.net), un service européen de polices respectueux de la vie - privée ; sans accès à internet, la police du système est utilisée. Les ligatures sont - désactivées pour que `->` ou `!=` s'affichent tels quels. Le réglage le plus dense est Très - petite + Compacte + Iosevka. + la police monospace du système, l'une des 3 polices étroites intégrées, servies par + LogStream lui-même et utilisables hors ligne (Inconsolata Condensed, la plus étroite, + Iosevka et Ubuntu Mono), ou l'une des 11 polices libres conçues pour le texte dense + (JetBrains Mono, Fira Code, Source Code Pro, IBM Plex Mono, Cascadia Code, Roboto Mono, + Inconsolata, Red Hat Mono, Noto Sans Mono, Victor Mono, DM Mono). Ces 11 polices sont + chargées par le navigateur depuis [Bunny Fonts](https://fonts.bunny.net), un service + européen de polices respectueux de la vie privée ; sans accès à internet, la police du + système est utilisée. Les ligatures sont désactivées pour que `->` ou `!=` s'affichent tels + quels. Le réglage le plus dense est Très petite + Compacte + Inconsolata Condensed. - **Données** : « Supprimer tous les logs » efface définitivement tous les logs stockés (il faut taper `PURGE` pour confirmer). Les tags et les paramètres sont conservés. VictoriaLogs doit être lancé avec `-delete.enable` (déjà présent dans `docker-compose.yml`) ; mettez diff --git a/README.md b/README.md index bb4f266..dcde535 100644 --- a/README.md +++ b/README.md @@ -223,14 +223,14 @@ remembered per browser. - *Theme*: System (follows the computer/phone preference), Light or Dark. The sun/moon button in the header switches between light and dark. - *Log display*: font size (tiny, small, medium, large), density (normal, or compact to - fit about 50% more lines on screen) and font: the system monospace font, - [Iosevka](https://github.com/be5invis/Iosevka) (narrow, so more text fits on each line; - served by LogStream itself, works offline), or one of 12 free fonts made for dense text - (JetBrains Mono, Fira Code, Source Code Pro, IBM Plex Mono, Cascadia Code, Roboto Mono, - Ubuntu Mono, Inconsolata, Red Hat Mono, Noto Sans Mono, Victor Mono, DM Mono). These 12 are - loaded by the browser from [Bunny Fonts](https://fonts.bunny.net), a privacy-friendly - European font service; without internet access, the system font is used. Ligatures are - disabled so `->` or `!=` show as typed. The densest setting is Tiny + Compact + Iosevka. + fit about 50% more lines on screen) and font: the system monospace font, one of 3 narrow + built-in fonts served by LogStream itself, which work offline (Inconsolata Condensed, the + narrowest, Iosevka and Ubuntu Mono), or one of 11 free fonts made for dense text (JetBrains + Mono, Fira Code, Source Code Pro, IBM Plex Mono, Cascadia Code, Roboto Mono, Inconsolata, + Red Hat Mono, Noto Sans Mono, Victor Mono, DM Mono). These 11 are loaded by the browser from + [Bunny Fonts](https://fonts.bunny.net), a privacy-friendly European font service; without + internet access, the system font is used. Ligatures are disabled so `->` or `!=` show as + typed. The densest setting is Tiny + Compact + Inconsolata Condensed. - **Data**: "Delete all logs" permanently erases every stored log (you must type `PURGE` to confirm). Tags and settings are kept. VictoriaLogs needs `-delete.enable` (already set in `docker-compose.yml`); set `ALLOW_PURGE=false` to disable the feature. diff --git a/web/app.js b/web/app.js index 9243ee7..d19762f 100644 --- a/web/app.js +++ b/web/app.js @@ -122,7 +122,7 @@ const I18N = { sizeTiny: 'Tiny', sizeSmall: 'Small', sizeMedium: 'Medium', sizeLarge: 'Large', density: 'Density', densityNormal: 'Normal', densityCompact: 'Compact', fontLabel: 'Font', fontSystem: 'System monospace (no download)', fontBuiltin: 'built in, narrow', - fontHelp: 'Free fonts (SIL Open Font License). Iosevka is served by LogStream itself and works offline; it is narrow, so more text fits on each line. The others are loaded by your browser from Bunny Fonts, a privacy-friendly European font service; without internet access, the system font is used.', + fontHelp: 'Free fonts. The built-in ones (Inconsolata Condensed, the narrowest, Iosevka and Ubuntu Mono) are served by LogStream itself and work offline; they are narrow, so more text fits on each line. The others are loaded by your browser from Bunny Fonts, a privacy-friendly European font service; without internet access, the system font is used.', previewMsgs: ['error: link down on eth1, carrier lost', 'warning: disk /dev/sda temperature 58°C', 'backup finished: ok (12.4 GB in 00:14:32)'], dangerZone: 'Danger zone', purgeHelp: 'Permanently delete every stored log to start from scratch. Color tags and settings are kept.', @@ -276,7 +276,7 @@ const I18N = { sizeTiny: 'Très petite', sizeSmall: 'Petite', sizeMedium: 'Moyenne', sizeLarge: 'Grande', density: 'Densité', densityNormal: 'Normale', densityCompact: 'Compacte', fontLabel: 'Police', fontSystem: 'Monospace du système (aucun téléchargement)', fontBuiltin: 'intégrée, étroite', - fontHelp: 'Polices libres (licence SIL Open Font). Iosevka est servie par LogStream lui-même et fonctionne hors ligne ; elle est étroite, donc chaque ligne affiche plus de texte. Les autres sont chargées par votre navigateur depuis Bunny Fonts, un service européen respectueux de la vie privée ; sans accès à internet, la police du système est utilisée.', + fontHelp: 'Polices libres. Les polices intégrées (Inconsolata Condensed, la plus étroite, Iosevka et Ubuntu Mono) sont servies par LogStream lui-même et fonctionnent hors ligne ; elles sont étroites, donc chaque ligne affiche plus de texte. Les autres sont chargées par votre navigateur depuis Bunny Fonts, un service européen respectueux de la vie privée ; sans accès à internet, la police du système est utilisée.', previewMsgs: ['error: link down on eth1, carrier lost', 'warning: disk /dev/sda temperature 58°C', 'backup finished: ok (12.4 GB in 00:14:32)'], dangerZone: 'Zone de danger', purgeHelp: 'Supprime définitivement tous les logs stockés pour repartir de zéro. Les tags de couleur et les réglages sont conservés.', @@ -543,14 +543,15 @@ $('#themeSwitch').addEventListener('click', (ev) => { // built-in ones (web/fonts, declared in style.css), which also work offline. const LOG_FONTS = [ { id: 'system' }, + { id: 'inconsolata-condensed', family: 'Inconsolata Condensed', builtin: true }, { id: 'iosevka', family: 'Iosevka', builtin: true }, + { id: 'ubuntu-mono', family: 'Ubuntu Mono', builtin: true }, { id: 'jetbrains-mono', family: 'JetBrains Mono' }, { id: 'fira-code', family: 'Fira Code' }, { id: 'source-code-pro', family: 'Source Code Pro' }, { id: 'ibm-plex-mono', family: 'IBM Plex Mono' }, { id: 'cascadia-code', family: 'Cascadia Code' }, { id: 'roboto-mono', family: 'Roboto Mono' }, - { id: 'ubuntu-mono', family: 'Ubuntu Mono' }, { id: 'inconsolata', family: 'Inconsolata' }, { id: 'red-hat-mono', family: 'Red Hat Mono' }, { id: 'noto-sans-mono', family: 'Noto Sans Mono' }, diff --git a/web/fonts/OFL-Inconsolata.txt b/web/fonts/OFL-Inconsolata.txt new file mode 100644 index 0000000..79721ad --- /dev/null +++ b/web/fonts/OFL-Inconsolata.txt @@ -0,0 +1,93 @@ +Copyright 2006 The Inconsolata Project Authors (https://github.com/cyrealtype/Inconsolata) + +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: +http://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) of the Font +Software 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. diff --git a/web/fonts/UFL-Ubuntu-Mono.txt b/web/fonts/UFL-Ubuntu-Mono.txt new file mode 100644 index 0000000..aa36342 --- /dev/null +++ b/web/fonts/UFL-Ubuntu-Mono.txt @@ -0,0 +1,96 @@ +------------------------------- +UBUNTU FONT LICENCE Version 1.0 +------------------------------- + +PREAMBLE +This licence allows the licensed fonts to be used, studied, modified and +redistributed freely. The fonts, including any derivative works, can be +bundled, embedded, and redistributed provided the terms of this licence +are met. The fonts and derivatives, however, cannot be released under +any other licence. The requirement for fonts to remain under this +licence does not require any document created using the fonts or their +derivatives to be published under this licence, as long as the primary +purpose of the document is not to be a vehicle for the distribution of +the fonts. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this licence and clearly marked as such. This may +include source files, build scripts and documentation. + +"Original Version" refers to the collection of Font Software components +as received under this licence. + +"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. + +"Copyright Holder(s)" refers to all individuals and companies who have a +copyright ownership of the Font Software. + +"Substantially Changed" refers to Modified Versions which can be easily +identified as dissimilar to the Font Software by users of the Font +Software comparing the Original Version with the Modified Version. + +To "Propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification and with or without charging +a redistribution fee), making available to the public, and in some +countries other activities as well. + +PERMISSION & CONDITIONS +This licence does not grant any rights under trademark law and all such +rights are reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of the Font Software, to propagate the Font Software, subject to +the below conditions: + +1) Each copy of the Font Software must contain the above copyright +notice and this licence. 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. + +2) The font name complies with the following: +(a) The Original Version must retain its name, unmodified. +(b) Modified Versions which are Substantially Changed must be renamed to +avoid use of the name of the Original Version or similar names entirely. +(c) Modified Versions which are not Substantially Changed must be +renamed to both (i) retain the name of the Original Version and (ii) add +additional naming elements to distinguish the Modified Version from the +Original Version. The name of such Modified Versions must be the name of +the Original Version, with "derivative X" where X represents the name of +the new work, appended to that name. + +3) The name(s) of the Copyright Holder(s) and any contributor to the +Font Software shall not be used to promote, endorse or advertise any +Modified Version, except (i) as required by this licence, (ii) to +acknowledge the contribution(s) of the Copyright Holder(s) or (iii) with +their explicit written permission. + +4) The Font Software, modified or unmodified, in part or in whole, must +be distributed entirely under this licence, and must not be distributed +under any other licence. The requirement for fonts to remain under this +licence does not affect any document created using the Font Software, +except any version of the Font Software extracted from a document +created using the Font Software may only be distributed under this +licence. + +TERMINATION +This licence 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. \ No newline at end of file diff --git a/web/fonts/inconsolata-condensed-400.woff2 b/web/fonts/inconsolata-condensed-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..218f90598391ba3e05c734608d3840830bc10fcd GIT binary patch literal 9928 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 GF@*qEf9-t$ literal 0 HcmV?d00001 diff --git a/web/fonts/inconsolata-condensed-700.woff2 b/web/fonts/inconsolata-condensed-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7c742cc1d4e487df437c6d54c022aace94789445 GIT binary patch literal 10076 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 literal 0 HcmV?d00001 diff --git a/web/fonts/ubuntu-mono-400.woff2 b/web/fonts/ubuntu-mono-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..467b8d6bfc6a09eb79dd142ecc2da1b33bef3596 GIT binary patch literal 9296 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 literal 0 HcmV?d00001 diff --git a/web/fonts/ubuntu-mono-700.woff2 b/web/fonts/ubuntu-mono-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f77e5f2cd86b5b4ad651f75b76e2d71c7bb986fe GIT binary patch literal 9228 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