Skip to content
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
f01bebe
client: create a Vite plugin to generate a contributor list JSON at t…
adoriandoran Mar 21, 2026
4d75339
refactor: normalize to double quotes
adoriandoran Mar 21, 2026
6481b90
client: retrieve the contributor list
adoriandoran Mar 21, 2026
92f1048
client/contributor list: add support for honorific contributors
adoriandoran Mar 21, 2026
fb691f6
client/contributor list: add extra bot exclusion
adoriandoran Mar 21, 2026
0525114
Merge branch 'main' of https://github.com/TriliumNext/Trilium into fe…
adoriandoran Mar 21, 2026
8d5e82f
client/contributor list: refine filtering
adoriandoran Mar 22, 2026
3157852
client/about dialog: create a new UI
adoriandoran Mar 22, 2026
19dfbaa
client/about dialog: improve, add GitHub and donate buttons
adoriandoran Mar 22, 2026
75da044
client/about dialog: add a link for the build revision
adoriandoran Mar 22, 2026
8f23874
client/about dialog: add an indication for the nightly version, use S…
adoriandoran Mar 22, 2026
1b91244
client/about dialog: switch to boxicons
adoriandoran Mar 22, 2026
555d997
client/about dialog: show the dialog only after the required informat…
adoriandoran Mar 22, 2026
b4d0af6
client/modals: make the title optional
adoriandoran Mar 22, 2026
978e023
client: revert the Vite build script
adoriandoran Mar 22, 2026
7646d8b
client: update the contributor list via a script, persist the list in…
adoriandoran Mar 22, 2026
e7adf08
scripts/update contributor list: add role for pinned contributors
adoriandoran Mar 22, 2026
f00e051
scripts/update contributor list: add completion feedback
adoriandoran Mar 22, 2026
015e50c
scripts/update contributor list: refactor
adoriandoran Mar 22, 2026
b32dd94
scripts/update contributor list: add full name support for pinned con…
adoriandoran Mar 22, 2026
a7a1e5c
scripts/update contributor list: optimize
adoriandoran Mar 23, 2026
db98884
scripts/update contributor list: refactor
adoriandoran Mar 23, 2026
f6e92c4
client/about dialog: show the contributor list
adoriandoran Mar 23, 2026
129f1cc
client/about dialog: add a full list link, improve layout
adoriandoran Mar 23, 2026
fc6bdb5
client/about dialog: refactor
adoriandoran Mar 23, 2026
dfd68ca
scripts/update contributor list: update indentation size
adoriandoran Mar 23, 2026
97e52e5
Update scripts/update-contributor-list.ts
adoriandoran Mar 23, 2026
3502324
client/about dialog: add keys to the contributor list
adoriandoran Mar 23, 2026
680fb41
Merge branch 'feat/about-dialog-overhaul' of https://github.com/Trili…
adoriandoran Mar 23, 2026
0a0157a
style/about dialog: improve appearance
adoriandoran Mar 23, 2026
11a46f0
client/about dialog: reduce the contributor list length to 10
adoriandoran Mar 24, 2026
1c74a01
style/about dialog: create a card-like table style
adoriandoran Mar 24, 2026
8c86f9f
client/about dialog: fix unwanted array mutation
adoriandoran Mar 24, 2026
9d3c997
style/about dialog: improve appearance
adoriandoran Mar 24, 2026
3889d7a
client/about dialog: add a license link
adoriandoran Mar 24, 2026
0fb3f98
client/about dialog: add some tooltips
adoriandoran Mar 24, 2026
2d21627
client/about dialog: refactor
adoriandoran Mar 24, 2026
a6b1af6
style/about dialog: improve appearance
adoriandoran Mar 24, 2026
d370ee2
style/about dialog: select the icon using CSS class names
adoriandoran Mar 24, 2026
a81dae2
client/about dialog: allow toggling to the classic icon
adoriandoran Mar 24, 2026
591b3a1
style/about dialog: add icon animation
adoriandoran Mar 24, 2026
496405d
client/about dialog: add custom tooltips
adoriandoran Mar 25, 2026
573ab07
client/about dialog: add a delay for contributor link hover event
adoriandoran Mar 25, 2026
0386e7d
style/about dialog: add a clue about contributor links with a tooltip
adoriandoran Mar 25, 2026
8dafd91
Merge branch 'main' of https://github.com/TriliumNext/Trilium into fe…
adoriandoran Mar 27, 2026
d4552fa
client/about dialog: refactor
adoriandoran Mar 27, 2026
72cc5cc
style/about dialog: update the donate button link on light theme
adoriandoran Mar 27, 2026
3552097
style/tooltips: use higher contrast on the light theme
adoriandoran Mar 27, 2026
87fb568
style/about dialog: customize the style of tooltips used for brief hi…
adoriandoran Mar 27, 2026
2432bb1
style/about dialog: allow long directory paths to be wrapped
adoriandoran Mar 27, 2026
ce4883e
Merge branch 'main' of https://github.com/TriliumNext/Trilium into fe…
adoriandoran Mar 31, 2026
601f246
style/about dialog: move the brief history tooltip from the contribut…
adoriandoran Mar 31, 2026
d61e399
style/about dialog: add an animation to the donate button
adoriandoran Mar 31, 2026
3720851
Merge branch 'main' of https://github.com/TriliumNext/Trilium into fe…
adoriandoran Apr 12, 2026
3a8f0e0
Merge branch 'main' of https://github.com/TriliumNext/Trilium into fe…
adoriandoran Apr 12, 2026
d3c927e
style/about dialog: exclude the brackets from the contributor role to…
adoriandoran Apr 12, 2026
e6db4a5
client/about dialog: update the version format
adoriandoran Apr 12, 2026
7f75ab0
client/about dialog: define the strings for a brief history
adoriandoran Apr 16, 2026
262c89d
style/about dialog: tweak the tooltip clues
adoriandoran Apr 16, 2026
12a8351
style/about dialog: add a different background color for nightly builds
adoriandoran Apr 16, 2026
d65d7db
client/about dialog: refactor
adoriandoran Apr 16, 2026
4bc1d93
style/about dialog: lower CSS selector specificity
adoriandoran Apr 16, 2026
28b1eb7
Merge branch 'main' of https://github.com/TriliumNext/Trilium into fe…
adoriandoran Apr 16, 2026
d240fb3
style/about dialog: refactor
adoriandoran Apr 18, 2026
5539c90
style/about dialog: make the property sheet responsive
adoriandoran Apr 18, 2026
426d5da
client/refactor: create a separate property sheet component
adoriandoran Apr 18, 2026
8cc5e02
client/about dialog: refactor
adoriandoran Apr 18, 2026
3ce2af9
client/property sheet component: add support for CSS class names
adoriandoran Apr 18, 2026
683814c
client/about dialog: refactor
adoriandoran Apr 18, 2026
2c6c7cb
client: create a fluid wrapper component
adoriandoran Apr 18, 2026
7c3bb8c
client: refactor
adoriandoran Apr 18, 2026
837cb37
Merge branch 'main' of https://github.com/TriliumNext/Trilium into fe…
adoriandoran Apr 18, 2026
e624c20
client/fluid container: fix a bug
adoriandoran Apr 18, 2026
e2c79ff
client: refactor
adoriandoran Apr 18, 2026
83d08d8
style/about dialog: improve appearance
adoriandoran Apr 18, 2026
c031a99
client/about dialog: update the license URL
adoriandoran Apr 18, 2026
2742df7
client/about dialog: fix a typo
adoriandoran Apr 18, 2026
dbea88f
client/modal dialog: add support for full page dialogs on mobile
adoriandoran Apr 18, 2026
b349922
client/about dialog: make full page on mobile
adoriandoran Apr 18, 2026
3627039
git mailmap: update
adoriandoran Apr 18, 2026
1d8a810
style/property sheet component: improve appearance
adoriandoran Apr 18, 2026
ac1bcef
client/property sheet component: fix width limit on mobile
adoriandoran Apr 18, 2026
4e55b29
Merge branch 'main' of https://github.com/TriliumNext/Trilium into fe…
adoriandoran Apr 18, 2026
900f308
contributor list: switch to manual update, add a tool for a reference…
adoriandoran Apr 19, 2026
415d936
Merge remote-tracking branch 'origin/main' into feat/about-dialog-ove…
eliandoran Apr 19, 2026
e6e6c1f
chore(scripts): filter contributors by role
eliandoran Apr 19, 2026
e7f85bb
chore(scripts): filter contributors by minimum commits
eliandoran Apr 19, 2026
a403aca
chore(scripts): group translators separately
eliandoran Apr 19, 2026
adc648d
chore(scripts): tweak criteria for contributors
eliandoran Apr 19, 2026
2c74412
chore: update contributors list
eliandoran Apr 19, 2026
b04945e
chore(client): remove limit on contributors
eliandoran Apr 19, 2026
5921d1f
client/about dialog: fix some issues
adoriandoran Apr 19, 2026
c4d832e
contributor list: update script name, change a comment
adoriandoran Apr 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions apps/client/src/assets/icon-alt.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
28 changes: 28 additions & 0 deletions apps/client/src/assets/icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 12 additions & 9 deletions apps/client/src/translations/en/translation.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
{
"about": {
"title": "About Trilium Notes",
"homepage": "Homepage:",
"app_version": "App version:",
"db_version": "DB version:",
"sync_version": "Sync version:",
"build_date": "Build date:",
"build_revision": "Build revision:",
"data_directory": "Data directory:"
"about": {
"version_label": "Version:",
"version": "app: {{appVersion}}, database: {{dbVersion}}, sync protocol: {{syncVersion}}",
"build_info": "{{buildDate}}, revision: <buildRevision />",
"contributors_label": "Contributors:",
"contributor_roles": {
"lead-dev": "lead developer",
"original-dev": "original developer"
},
"contributor_full_list": "See the full list",
"data_directory": "Data directory:",
"donate": "Donate"
},
"toast": {
"critical-error": {
Expand Down
47 changes: 47 additions & 0 deletions apps/client/src/widgets/dialogs/about.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
.about-dialog {
.about-dialog-content {
display: flex;
flex-direction: column;
align-items: center;
}

.property-sheet-card {
margin-block: 30px;
font-size: .85em;

.tn-card-section {
display: flex;

> :first-child {
width: 100px;
}
}
}

.contributor-list {
a, span {
white-space: nowrap;
}
}

footer {
display: flex;
justify-content: center;
gap: 20px;
margin-bottom: 30px;

a {
display: flex;
flex-direction: column;
align-items: center;

&::after {
display: none;
}

i {
font-size: 32px;
}
}
}
}
173 changes: 120 additions & 53 deletions apps/client/src/widgets/dialogs/about.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,79 +5,146 @@ import server from "../../services/server.js";
import utils from "../../services/utils.js";
import openService from "../../services/open.js";
import { useState } from "preact/hooks";
import type { CSSProperties } from "preact/compat";
import type { AppInfo } from "@triliumnext/commons";
import type { AppInfo, Contributor, ContributorList } from "@triliumnext/commons";
import { useTriliumEvent } from "../react/hooks.jsx";
import { Card, CardSection } from "../react/Card.js";
import "./about.css";
import { Trans } from "react-i18next";
import type React from "react";
import icon from "../../assets/icon.svg";
import iconAlt from "../../assets/icon-alt.svg";
import { useCallback, useEffect } from "react";
import contributors from "../../../../../contributors.json";

export default function AboutDialog() {
const [appInfo, setAppInfo] = useState<AppInfo | null>(null);
const [shown, setShown] = useState(false);
const forceWordBreak: CSSProperties = { wordBreak: "break-all" };
const [isNightly, setNightly] = useState(false);

useTriliumEvent("openAboutDialog", () => setShown(true));
const onLoad = useCallback(async () => {
if (!appInfo) {
setAppInfo(await server.get<AppInfo>("app-info"));
}
setShown(true);
}, []);
Comment thread
adoriandoran marked this conversation as resolved.
Comment thread
adoriandoran marked this conversation as resolved.
Comment thread
adoriandoran marked this conversation as resolved.

useTriliumEvent("openAboutDialog", onLoad);

useEffect(() => {
setNightly(!!appInfo?.appVersion.includes("test"));
}, [appInfo])

return (
<Modal className="about-dialog"
size="lg"
title={t("about.title")}
<Modal
className="about-dialog"
size="md"
show={shown}
onShown={async () => {
const appInfo = await server.get<AppInfo>("app-info");
setAppInfo(appInfo);
}}
onHidden={() => setShown(false)}
>
<table className="table table-borderless">
<tbody>
<tr>
<th>{t("about.homepage")}</th>
<td className="selectable-text"><a className="tn-link external" href="https://github.com/TriliumNext/Trilium" style={forceWordBreak}>https://github.com/TriliumNext/Trilium</a></td>
</tr>
<tr>
<th>{t("about.app_version")}</th>
<td className="app-version selectable-text">{appInfo?.appVersion}</td>
</tr>
<tr>
<th>{t("about.db_version")}</th>
<td className="db-version selectable-text">{appInfo?.dbVersion}</td>
</tr>
<tr>
<th>{t("about.sync_version")}</th>
<td className="sync-version selectable-text">{appInfo?.syncVersion}</td>
</tr>
<tr>
<th>{t("about.build_date")}</th>
<td className="build-date selectable-text">
{appInfo?.buildDate ? formatDateTime(appInfo.buildDate) : ""}
</td>
</tr>
<tr>
<th>{t("about.build_revision")}</th>
<td className="selectable-text">
{appInfo?.buildRevision && <a className="tn-link build-revision external" href={`https://github.com/TriliumNext/Trilium/commit/${appInfo.buildRevision}`} target="_blank" style={forceWordBreak}>{appInfo.buildRevision}</a>}
</td>
</tr>
<tr>
<th>{t("about.data_directory")}</th>
<td className="data-directory">
{appInfo?.dataDirectory && (<DirectoryLink directory={appInfo.dataDirectory} style={forceWordBreak} />)}
</td>
</tr>
</tbody>
</table>
<div className="about-dialog-content">
<img src={(isNightly) ? iconAlt : icon} width="128" />
<h2>Trilium Notes {isNightly && <span>Nightly</span>}</h2>
<a className="tn-link" href="https://triliumnotes.org/" target="_blank">
triliumnotes.org
</a>

<Card className="property-sheet-card">
<CardSection>
<div>{t("about.version_label")}</div>
<div className="selectable-text">
{t("about.version", {
appVersion: appInfo?.appVersion,
dbVersion: appInfo?.dbVersion,
syncVersion: appInfo?.syncVersion
})}
<div>
<Trans
i18nKey="about.build_info"
values={{
buildDate: appInfo?.buildDate ? formatDateTime(appInfo.buildDate) : ""
}}
components={{
buildRevision: revisionLink(appInfo)
}}
/>
</div>
</div>
</CardSection>

<CardSection>
<div>{t("about.contributors_label")}</div>
<div className="contributor-list use-tn-links">
<Contributors data={contributors as ContributorList} />
<a href="https://github.com/TriliumNext/Trilium/graphs/contributors" target="_blank">
{t("about.contributor_full_list")}
</a>
</div>
</CardSection>

<CardSection>
<div>{t("about.data_directory")}</div>
<div className="selectable-text">
{appInfo?.dataDirectory && (<DirectoryLink directory={appInfo.dataDirectory} />)}
</div>
</CardSection>
</Card>
</div>

<footer>
<a href="https://github.com/TriliumNext/Trilium" target="_blank">
<i class='bx bxl-github'></i>
GitHub
</a>
<a href="https://triliumnotes.org/en/support-us" target="_blank">
<i class='bx bx-heart' ></i>
{t("about.donate")}
</a>
</footer>
</Modal>
);
}

function DirectoryLink({ directory, style }: { directory: string, style?: CSSProperties }) {
function revisionLink(appInfo: AppInfo | null) {
return <>
{appInfo?.buildRevision && <a href={`https://github.com/TriliumNext/Trilium/commit/${appInfo.buildRevision}`} target="_blank" className="tn-link">
{appInfo.buildRevision.substring(0, 7)}
</a>}
</> as React.ReactElement;
}

function Contributors(params: {data: ContributorList}) {
return params.data.contributors.map((c, index, array) => {
return <>
<ContributorListItem data={c} />

{/* Add a comma between items */}
{(index < array.length - 1) ? ", " : ". "}
</>
});
Comment thread
adoriandoran marked this conversation as resolved.
Outdated
}

function ContributorListItem({data}: {data: Contributor}) {
let roleString = "";
if (data.role) {
roleString = t(`about.contributor_roles.${data.role}`);
}

return <>
<a href={data.url} target="_blank">{data.fullName ?? data.name}</a>

{roleString && <span>&nbsp;({roleString})</span>}
</>
}

function DirectoryLink({ directory }: { directory: string}) {
if (utils.isElectron()) {
const onClick = (e: MouseEvent) => {
e.preventDefault();
openService.openDirectory(directory);
};

return <a className="tn-link selectable-text" href="#" onClick={onClick} style={style}>{directory}</a>
return <a className="tn-link selectable-text" href="#" onClick={onClick}>{directory}</a>
} else {
return <span className="selectable-text" style={style}>{directory}</span>;
return <span className="selectable-text">{directory}</span>;
}
}
}
Comment thread
adoriandoran marked this conversation as resolved.
2 changes: 1 addition & 1 deletion apps/client/src/widgets/react/Modal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ interface CustomTitleBarButton {

export interface ModalProps {
className: string;
title: string | ComponentChildren;
title?: string | ComponentChildren;
customTitleBarButtons?: (CustomTitleBarButton | null)[];
size: "xl" | "lg" | "md" | "sm";
children: ComponentChildren;
Expand Down
Loading
Loading