Compare commits

...

27 Commits

Author SHA1 Message Date
Adorian Doran
79d2010bfa style/note title actions: properly align when the content is centered 2025-12-28 10:18:50 +02:00
Adorian Doran
3f86c809ce style/note title actions: properly align when the content is centered 2025-12-28 10:12:01 +02:00
Elian Doran
5174deac07 fix(status_bar): attribute count displays system links 2025-12-27 23:02:35 +02:00
Elian Doran
a6c515aea0 Translations update from Hosted Weblate (#8189) 2025-12-26 23:02:47 +02:00
green
850710926e Translated using Weblate (Japanese)
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-26 21:50:48 +01:00
noobhjy
904da14895 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-26 21:50:47 +01:00
Kuzma Simonov
4c5bc3a3d3 Translated using Weblate (Russian)
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-12-26 21:50:47 +01:00
Elian Doran
af4fc11a4e docs(release): fix link to new layout 2025-12-26 14:13:52 +02:00
Elian Doran
a63b8b2031 chore(release): prepare for v0.101.1 2025-12-26 14:01:04 +02:00
Elian Doran
7b02d87558 docs(release): prepare for v0.101.1 2025-12-26 13:59:49 +02:00
Elian Doran
16737b93dd fix(client): not working in HTTPs (closes #8165) 2025-12-26 13:51:01 +02:00
Elian Doran
c23fe7cf13 fix(table_of_contents): not showing on first render of read-only notes 2025-12-26 13:28:29 +02:00
Adorian Doran
6d80323a76 style/text selection: refactor, apply custom color tint over the note title selection 2025-12-26 11:45:42 +02:00
Adorian Doran
8b630c6e2e UI fixes (#8180) 2025-12-26 11:25:29 +02:00
Adorian Doran
047a8d9644 Fix #8177 2025-12-26 10:56:48 +02:00
Adorian Doran
f14ae01fab style/links: fix background color 2025-12-26 10:42:53 +02:00
Adorian Doran
785470b0ae style/global menu: fix icon alignment 2025-12-26 10:31:06 +02:00
Adorian Doran
73918c042b Fix #8170 2025-12-26 10:28:25 +02:00
Elian Doran
8d6eb6fa53 fix(right_pane): toggle shortcut not working on new layout 2025-12-25 23:42:45 +02:00
Elian Doran
f97fbf8325 Translations update from Hosted Weblate (#8161) 2025-12-25 23:24:14 +02:00
Mohammed Saati
e7d6e646be Translated using Weblate (Arabic)
Currently translated at 60.9% (1054 of 1730 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ar/
2025-12-25 21:22:36 +00:00
Mohammed Saati
839444af47 Translated using Weblate (Arabic)
Currently translated at 57.8% (88 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ar/
2025-12-25 21:22:35 +00:00
Hosted Weblate
24a58da4b6 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/
2025-12-25 21:22:34 +00:00
Elian Doran
aa37196169 fix(layout): missing right pane toggle on macos vertical layout (closes #8157) 2025-12-25 23:22:17 +02:00
Elian Doran
f821d7fcd6 fix(desktop): right margin on icon 2025-12-25 23:16:07 +02:00
Elian Doran
b417831507 Merge branch 'main' of github.com:TriliumNext/Trilium 2025-12-25 22:52:04 +02:00
Elian Doran
a4dbefd7ef fix(launch_bar): note launcher no longer hoisting in same tab (closes #8160) 2025-12-25 22:52:01 +02:00
32 changed files with 339 additions and 171 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "@triliumnext/client",
"version": "0.101.0",
"version": "0.101.1",
"description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)",
"private": true,
"license": "AGPL-3.0-only",

View File

@@ -92,7 +92,7 @@ export default class DesktopLayout {
.optChild(launcherPaneIsHorizontal, <LeftPaneToggle isHorizontalLayout={true} />)
.child(<TabHistoryNavigationButtons />)
.child(new TabRowWidget().class("full-width"))
.optChild(launcherPaneIsHorizontal && isNewLayout, <RightPaneToggle />)
.optChild(isNewLayout, <RightPaneToggle />)
.optChild(customTitleBarButtons, <TitleBarButtons />)
.css("height", "40px")
.css("background-color", "var(--launcher-pane-background-color)")

View File

@@ -3,7 +3,7 @@ import { signal } from "@preact/signals";
import appContext from "../components/app_context.js";
import froca from "./froca.js";
import { t } from "./i18n.js";
import utils from "./utils.js";
import utils, { randomString } from "./utils.js";
export interface ToastOptions {
id?: string;
@@ -86,7 +86,7 @@ export async function showErrorForScriptNote(noteId: string, message: string) {
export const toasts = signal<ToastOptionsWithRequiredId[]>([]);
function addToast(opts: ToastOptions) {
const id = opts.id ?? crypto.randomUUID();
const id = opts.id ?? randomString();
const toast = { ...opts, id };
toasts.value = [ ...toasts.value, toast ];
return id;

View File

@@ -1,8 +1,9 @@
import { dayjs } from "@triliumnext/commons";
import type { ViewMode, ViewScope } from "./link.js";
import FNote from "../entities/fnote";
import { snapdom } from "@zumer/snapdom";
import FNote from "../entities/fnote";
import type { ViewMode, ViewScope } from "./link.js";
const SVG_MIME = "image/svg+xml";
export const isShare = !window.glob;
@@ -113,9 +114,8 @@ function formatDateISO(date: Date) {
export function formatDateTime(date: Date, userSuppliedFormat?: string): string {
if (userSuppliedFormat?.trim()) {
return dayjs(date).format(userSuppliedFormat);
} else {
return `${formatDate(date)} ${formatTime(date)}`;
}
return `${formatDate(date)} ${formatTime(date)}`;
}
function localNowDateTime() {
@@ -191,9 +191,9 @@ export function formatSize(size: number | null | undefined) {
if (size < 1024) {
return `${size} KiB`;
} else {
return `${Math.round(size / 102.4) / 10} MiB`;
}
return `${Math.round(size / 102.4) / 10} MiB`;
}
function toObject<T, R>(array: T[], fn: (arg0: T) => [key: string, value: R]) {
@@ -208,7 +208,7 @@ function toObject<T, R>(array: T[], fn: (arg0: T) => [key: string, value: R]) {
return obj;
}
export function randomString(len: number) {
export function randomString(len: number = 16) {
let text = "";
const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
@@ -297,18 +297,18 @@ function formatHtml(html: string) {
let indent = "\n";
const tab = "\t";
let i = 0;
let pre: { indent: string; tag: string }[] = [];
const pre: { indent: string; tag: string }[] = [];
html = html
.replace(new RegExp("<pre>([\\s\\S]+?)?</pre>"), function (x) {
.replace(new RegExp("<pre>([\\s\\S]+?)?</pre>"), (x) => {
pre.push({ indent: "", tag: x });
return "<--TEMPPRE" + i++ + "/-->";
return `<--TEMPPRE${i++}/-->`;
})
.replace(new RegExp("<[^<>]+>[^<]?", "g"), function (x) {
.replace(new RegExp("<[^<>]+>[^<]?", "g"), (x) => {
let ret;
const tagRegEx = /<\/?([^\s/>]+)/.exec(x);
let tag = tagRegEx ? tagRegEx[1] : "";
let p = new RegExp("<--TEMPPRE(\\d+)/-->").exec(x);
const tag = tagRegEx ? tagRegEx[1] : "";
const p = new RegExp("<--TEMPPRE(\\d+)/-->").exec(x);
if (p) {
const pInd = parseInt(p[1]);
@@ -318,24 +318,22 @@ function formatHtml(html: string) {
if (["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "menuitem", "meta", "param", "source", "track", "wbr"].indexOf(tag) >= 0) {
// self closing tag
ret = indent + x;
} else if (x.indexOf("</") < 0) {
//open tag
if (x.charAt(x.length - 1) !== ">") ret = indent + x.substr(0, x.length - 1) + indent + tab + x.substr(x.length - 1, x.length);
else ret = indent + x;
!p && (indent += tab);
} else {
if (x.indexOf("</") < 0) {
//open tag
if (x.charAt(x.length - 1) !== ">") ret = indent + x.substr(0, x.length - 1) + indent + tab + x.substr(x.length - 1, x.length);
else ret = indent + x;
!p && (indent += tab);
} else {
//close tag
indent = indent.substr(0, indent.length - 1);
if (x.charAt(x.length - 1) !== ">") ret = indent + x.substr(0, x.length - 1) + indent + x.substr(x.length - 1, x.length);
else ret = indent + x;
}
//close tag
indent = indent.substr(0, indent.length - 1);
if (x.charAt(x.length - 1) !== ">") ret = indent + x.substr(0, x.length - 1) + indent + x.substr(x.length - 1, x.length);
else ret = indent + x;
}
return ret;
});
for (i = pre.length; i--;) {
html = html.replace("<--TEMPPRE" + i + "/-->", pre[i].tag.replace("<pre>", "<pre>\n").replace("</pre>", pre[i].indent + "</pre>"));
html = html.replace(`<--TEMPPRE${i}/-->`, pre[i].tag.replace("<pre>", "<pre>\n").replace("</pre>", `${pre[i].indent}</pre>`));
}
return html.charAt(0) === "\n" ? html.substr(1, html.length - 1) : html;
@@ -364,11 +362,11 @@ type dynamicRequireMappings = {
export function dynamicRequire<T extends keyof dynamicRequireMappings>(moduleName: T): Awaited<dynamicRequireMappings[T]>{
if (typeof __non_webpack_require__ !== "undefined") {
return __non_webpack_require__(moduleName);
} else {
// explicitly pass as string and not as expression to suppress webpack warning
// 'Critical dependency: the request of a dependency is an expression'
return require(`${moduleName}`);
}
// explicitly pass as string and not as expression to suppress webpack warning
// 'Critical dependency: the request of a dependency is an expression'
return require(`${moduleName}`);
}
function timeLimit<T>(promise: Promise<T>, limitMs: number, errorMessage?: string) {
@@ -509,8 +507,8 @@ export function escapeRegExp(str: string) {
function areObjectsEqual(...args: unknown[]) {
let i;
let l;
let leftChain: Object[];
let rightChain: Object[];
let leftChain: object[];
let rightChain: object[];
function compare2Objects(x: unknown, y: unknown) {
let p;
@@ -695,9 +693,9 @@ async function downloadAsSvg(nameWithoutExtension: string, svgSource: string | S
try {
const result = await snapdom(element, {
backgroundColor: "transparent",
scale: 2
});
backgroundColor: "transparent",
scale: 2
});
triggerDownload(`${nameWithoutExtension}.svg`, result.url);
} finally {
cleanup();
@@ -733,9 +731,9 @@ async function downloadAsPng(nameWithoutExtension: string, svgSource: string | S
try {
const result = await snapdom(element, {
backgroundColor: "transparent",
scale: 2
});
backgroundColor: "transparent",
scale: 2
});
const pngImg = await result.toPng();
await triggerDownload(`${nameWithoutExtension}.png`, pngImg.src);
} finally {
@@ -763,11 +761,11 @@ export function getSizeFromSvg(svgContent: string) {
return {
width: parseFloat(width),
height: parseFloat(height)
}
} else {
console.warn("SVG export error", svgDocument.documentElement);
return null;
};
}
console.warn("SVG export error", svgDocument.documentElement);
return null;
}
/**
@@ -896,9 +894,9 @@ export function mapToKeyValueArray<K extends string | number | symbol, V>(map: R
export function getErrorMessage(e: unknown) {
if (e && typeof e === "object" && "message" in e && typeof e.message === "string") {
return e.message;
} else {
return "Unknown error";
}
return "Unknown error";
}
/**

View File

@@ -436,7 +436,6 @@ body.desktop .tabulator-popup-container,
opacity: 1;
}
.dropdown-menu a:hover:not(.disabled),
.dropdown-item:hover:not(.disabled, .dropdown-container-item),
.tabulator-menu-item:hover,
:root .excalidraw .context-menu .context-menu-item:hover {
@@ -1952,6 +1951,10 @@ body.electron.platform-darwin:not(.native-titlebar) .tab-row-container {
padding-inline-start: 1em;
}
.tab-row-widget {
contain: inline-size;
}
#tab-row-left-spacer {
width: env(titlebar-area-x);
-webkit-app-region: drag;
@@ -1961,7 +1964,7 @@ body.electron.platform-darwin:not(.native-titlebar):not(.full-screen) #tab-row-l
width: 80px;
}
.tab-row-container {
body.electron:not(.platform-darwin) .tab-row-container {
padding-inline-end: calc(100vw - env(titlebar-area-width, 100vw));
}

View File

@@ -349,5 +349,5 @@ body .todo-list input[type="checkbox"]:not(:checked):before {
.note-split.with-hue *::selection,
.quick-edit-dialog-wrapper.with-hue *::selection {
background: hsl(var(--custom-color-hue), 49.2%, 35%);
--selection-background-color: hsl(var(--custom-color-hue), 49.2%, 35%);
}

View File

@@ -320,5 +320,5 @@
.note-split.with-hue *::selection,
.quick-edit-dialog-wrapper.with-hue *::selection {
background: hsl(var(--custom-color-hue), 60%, 90%);
--selection-background-color: hsl(var(--custom-color-hue), 60%, 90%);
}

View File

@@ -634,6 +634,10 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child {
font-weight: 300;
}
.ck-content strong {
font-weight: 600;
}
.ck-content hr {
margin: 5px 0;
height: 1px;

View File

@@ -11,11 +11,25 @@
},
"toast": {
"critical-error": {
"title": "خطأ فادح"
"title": "خطأ فادح",
"message": "حدث خطأ حرج يمنع تشغيل تطبيق العميل:\n\n{{message}}\n\nيُرجّح أن يكون سبب هذا الخطأ هو تعطل أحد البرامج النصية بشكل غير متوقع. حاول تشغيل التطبيق في الوضع الآمن لحل المشكلة."
},
"widget-error": {
"title": "فشل في البدء بعنصر الواجهة"
}
"title": "فشل في البدء بعنصر الواجهة",
"message-custom": "تعذر تهيئة عنصر واجهة المستخدم المخصص من الملاحظة ذات المعرّف \"{{id}}\" والعنوان \"{{title}}\" بسبب:\n\n{{message}}",
"message-unknown": "تعذر تهيئة عنصر واجهة المستخدم غير المعروف بسبب:\n\n{{message}}"
},
"bundle-error": {
"title": "فشل تحميل البرنامج النصي المخصص",
"message": "تعذر تنفيذ البرنامج النصي بسبب:\n\n{{message}}"
},
"widget-list-error": {
"title": "فشل في الحصول على قائمة الأدوات من الخادم"
},
"widget-render-error": {
"title": "فشل عرض عنصر واجهة مستخدم React مخصص"
},
"widget-missing-parent": "لا تحتوي الأداة المخصصة على خاصية إلزامية '{{property}}'.\n\nإذا كان من المفترض تشغيل هذا البرنامج النصي بدون عنصر واجهة مستخدم، فاستخدم '#run=frontendStartup' بدلاً من ذلك."
},
"add_link": {
"add_link": "أضافة رابط",

View File

@@ -29,7 +29,7 @@
"widget-render-error": {
"title": "渲染自定义 React 小部件失败"
},
"widget-missing-parent": "自定义小部件未定义强制性的 \"{{property}}\" 属性。",
"widget-missing-parent": "自定义小部件未定义强制性的 \"{{property}}\" 属性。\n\n如果此脚本需要在没有 UI 元素的情况下运行,请改用“#run=frontendStartup”。",
"open-script-note": "打开脚本笔记",
"scripting-error": "自定义脚本错误:{{title}}"
},
@@ -1597,7 +1597,11 @@
"note_detail": {
"could_not_find_typewidget": "找不到类型为 '{{type}}' 的 typeWidget",
"printing": "正在打印…",
"printing_pdf": "正在导出为PDF…"
"printing_pdf": "正在导出为PDF…",
"print_report_title": "打印报告",
"print_report_collection_content_other": "集合中的 {{count}} 篇笔记无法打印,因为它们不受支持或受到保护。",
"print_report_collection_details_button": "查看详情",
"print_report_collection_details_ignored_notes": "忽略的笔记"
},
"note_title": {
"placeholder": "请输入笔记标题...",

View File

@@ -29,7 +29,7 @@
"widget-render-error": {
"title": "カスタム React ウィジェットのレンダリングに失敗しました"
},
"widget-missing-parent": "カスタムウィジェットに必須の '{{property}}' プロパティが定義されていません。",
"widget-missing-parent": "カスタムウィジェットに必須の '{{property}}' プロパティが定義されていません。\n\nこのスクリプトを UI 要素なしで実行する場合は、代わりに '#run=frontendStartup' を使用してください。",
"open-script-note": "スクリプトノートを開く",
"scripting-error": "カスタムスクリプトエラー: {{title}}"
},
@@ -1930,7 +1930,11 @@
"note_detail": {
"could_not_find_typewidget": "タイプ {{type}} の typeWidget が見つかりませんでした",
"printing": "印刷中です...",
"printing_pdf": "PDF へのエクスポート中です..."
"printing_pdf": "PDF へのエクスポート中です...",
"print_report_title": "レポートを印刷",
"print_report_collection_content_other": "コレクション内の {{count}} 件のノートは、サポートされていないか保護されているため、印刷できませんでした。",
"print_report_collection_details_button": "詳細を見る",
"print_report_collection_details_ignored_notes": "無視されたノート"
},
"watched_file_update_status": {
"ignore_this_change": "この変更を無視する",

View File

@@ -29,7 +29,7 @@
"widget-render-error": {
"title": "Не удалось отобразить пользовательский React виджет"
},
"widget-missing-parent": "В пользовательском виджете не определено обязательное свойство '{{property}}'.",
"widget-missing-parent": "В пользовательском виджете не определено обязательное свойство '{{property}}'.\n\nЕсли этот скрипт предназначен для запуска без элемента пользовательского интерфейса, используйте '#run=frontendStartup'.",
"open-script-note": "Открыть заметку со скриптом",
"scripting-error": "Ошибка пользовательского скрипта: {{title}}"
},
@@ -2112,7 +2112,13 @@
"note_detail": {
"could_not_find_typewidget": "Не удалось найти typeWidget для типа '{{type}}'",
"printing_pdf": "Выполняется экспорт PDF...",
"printing": "Выполняется печать..."
"printing": "Выполняется печать...",
"print_report_title": "Отчет по печати",
"print_report_collection_content_one": "{{count}} заметка в коллекции не удалось распечатать, поскольку она не поддерживается или защищена.",
"print_report_collection_content_few": "{{count}} заметки в коллекции не удалось распечатать, поскольку они не поддерживаются или защищены.",
"print_report_collection_content_many": "{{count}} заметок в коллекции не удалось распечатать, поскольку они не поддерживаются или защищены.",
"print_report_collection_details_button": "Подробнее",
"print_report_collection_details_ignored_notes": "Пропущенные заметки"
},
"book": {
"no_children_help": "В этой коллекции нет дочерних заметок, поэтому отображать нечего. Подробности см. в <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a>.",

View File

@@ -13,6 +13,7 @@ import debounce from "../services/debounce";
import { t } from "../services/i18n";
import { DefinitionObject, extractAttributeDefinitionTypeAndName, LabelType } from "../services/promoted_attribute_definition_parser";
import server from "../services/server";
import { randomString } from "../services/utils";
import ws from "../services/ws";
import { useNoteContext, useNoteLabel, useTriliumEvent, useUniqueName } from "./react/hooks";
import NoteAutocomplete from "./react/NoteAutocomplete";
@@ -116,7 +117,7 @@ export function usePromotedAttributeData(note: FNote | null | undefined, compone
valueAttr.attributeId = "";
}
const uniqueId = crypto.randomUUID();
const uniqueId = randomString();
cells.push({ definitionAttr, definition, valueAttr, valueName, uniqueId });
}
}
@@ -319,7 +320,7 @@ function MultiplicityCell({ cell, cells, setCells, setCellToFocus, note, compone
const index = cells.indexOf(cell);
const newCell: Cell = {
...cell,
uniqueId: crypto.randomUUID(),
uniqueId: randomString(),
valueAttr: {
attributeId: "",
type: cell.valueAttr.type,

View File

@@ -4,6 +4,7 @@ import Component, { TypedComponent } from "../components/component.js";
import froca from "../services/froca.js";
import { t } from "../services/i18n.js";
import toastService, { showErrorForScriptNote } from "../services/toast.js";
import { randomString } from "../services/utils.js";
import { renderReactWidget } from "./react/react_utils.jsx";
export class TypedBasicWidget<T extends TypedComponent<any>> extends TypedComponent<T> {
@@ -180,7 +181,7 @@ export class TypedBasicWidget<T extends TypedComponent<any>> extends TypedCompon
});
} else {
toastService.showPersistent({
id: `custom-widget-failure-unknown-${crypto.randomUUID()}`,
id: `custom-widget-failure-unknown-${randomString()}`,
title: t("toast.widget-error.title"),
icon: "bx bx-error-circle",
message: t("toast.widget-error.message-unknown", {

View File

@@ -108,14 +108,6 @@ button.global-menu-button {
margin-inline-end: 5px;
}
.global-menu .dropdown-item .bx {
position: relative;
top: 3px;
font-size: 120%;
margin-inline-end: 6px;
}
.global-menu-button-wrapper:hover .global-menu-button-update-available-button {
opacity: 1;
}

View File

@@ -30,7 +30,7 @@ export function CustomNoteLauncher({ launcherNote, getTargetNoteId, getHoistedNo
const activate = !!evt.shiftKey;
await appContext.tabManager.openInNewTab(targetNoteId, hoistedNoteIdWithDefault, activate);
} else {
await appContext.tabManager.openInSameTab(targetNoteId);
await appContext.tabManager.openInSameTab(targetNoteId, hoistedNoteIdWithDefault);
}
}, [ launcherNote, getTargetNoteId, getHoistedNoteId ]);

View File

@@ -5,9 +5,14 @@ body.experimental-feature-new-layout {
.title-actions {
display: flex;
max-width: var(--max-content-width);
flex-direction: column;
gap: 0.5em;
body.prefers-centered-content & {
margin-inline: auto;
}
&:not(:empty) {
padding: 0.75em 15px;
}

View File

@@ -340,7 +340,7 @@ function AttributesButton({ note, attributesShown, setAttributesShown }: Attribu
// React to note changes.
useEffect(() => {
setCount(note.attributes.length);
setCount(note.getAttributes().filter(a => !a.isAutoLink).length);
}, [ note ]);
// React to changes in count.

View File

@@ -21,6 +21,7 @@ div.note-title-widget {
&::selection {
color: var(--main-text-color);
background: var(--selection-background-color);
}
}

View File

@@ -1177,7 +1177,7 @@ export function useContentElement(noteContext: NoteContext | null | undefined) {
const requestId = ++requestIdRef.current;
noteContext?.getContentElement().then(contentElement => {
// Prevent stale async.
if (requestId !== requestIdRef.current) return;
if (!contentElement || requestId !== requestIdRef.current) return;
setContentElement(contentElement?.[0] ?? null);
forceUpdate(v => v + 1);
});

View File

@@ -3,6 +3,7 @@ import { createPortal } from "preact/compat";
import { useCallback, useEffect, useState } from "preact/hooks";
import { t } from "../../services/i18n";
import { randomString } from "../../services/utils";
import { useActiveNoteContext, useContentElement, useIsNoteReadOnly, useNoteProperty, useTextEditor, useTriliumOptionJson } from "../react/hooks";
import Modal from "../react/Modal";
import { HighlightsListOptions } from "../type_widgets/options/text_notes";
@@ -201,7 +202,7 @@ function extractHighlightsFromTextEditor(editor: CKTextEditor) {
if (Object.values(attrs).some(Boolean)) {
result.push({
id: crypto.randomUUID(),
id: randomString(),
text: item.data,
attrs,
textNode: item.textNode,
@@ -269,7 +270,7 @@ function extractHighlightsFromStaticHtml(el: HTMLElement | null) {
if (Object.values(attrs).some(Boolean)) {
highlights.push({
id: crypto.randomUUID(),
id: randomString(),
text: node.textContent,
element: el,
attrs

View File

@@ -11,7 +11,7 @@ import { t } from "../../services/i18n";
import options from "../../services/options";
import { DEFAULT_GUTTER_SIZE } from "../../services/resizer";
import Button from "../react/Button";
import { useActiveNoteContext, useLegacyWidget, useNoteProperty, useTriliumOptionBool, useTriliumOptionJson } from "../react/hooks";
import { useActiveNoteContext, useLegacyWidget, useNoteProperty, useTriliumEvent, useTriliumOptionBool, useTriliumOptionJson } from "../react/hooks";
import Icon from "../react/Icon";
import LegacyRightPanelWidget from "../right_panel_widget";
import HighlightsList from "./HighlightsList";
@@ -30,6 +30,9 @@ export default function RightPanelContainer({ widgetsByParent }: { widgetsByPare
const [ rightPaneVisible, setRightPaneVisible ] = useTriliumOptionBool("rightPaneVisible");
const items = useItems(rightPaneVisible, widgetsByParent);
useSplit(rightPaneVisible);
useTriliumEvent("toggleRightPane", () => {
setRightPaneVisible(!rightPaneVisible);
});
return (
<div id="right-pane">

View File

@@ -5,6 +5,7 @@ import clsx from "clsx";
import { useCallback, useEffect, useState } from "preact/hooks";
import { t } from "../../services/i18n";
import { randomString } from "../../services/utils";
import { useActiveNoteContext, useContentElement, useIsNoteReadOnly, useNoteProperty, useTextEditor } from "../react/hooks";
import Icon from "../react/Icon";
import RightPanelWidget from "./RightPanelWidget";
@@ -172,7 +173,7 @@ function extractTocFromTextEditor(editor: CKTextEditor) {
// Assign a unique ID
let tocId = item.getAttribute(TOC_ID) as string | undefined;
if (!tocId) {
tocId = crypto.randomUUID();
tocId = randomString();
writer.setAttribute(TOC_ID, tocId, item);
}
@@ -210,7 +211,7 @@ function extractTocFromStaticHtml(el: HTMLElement | null) {
const headings: DomHeading[] = [];
for (const headingEl of el.querySelectorAll<HTMLHeadingElement>("h1,h2,h3,h4,h5,h6")) {
headings.push({
id: crypto.randomUUID(),
id: randomString(),
level: parseInt(headingEl.tagName.substring(1), 10),
text: headingEl.textContent,
element: headingEl

View File

@@ -1,6 +1,6 @@
{
"name": "@triliumnext/desktop",
"version": "0.101.0",
"version": "0.101.1",
"description": "Build your personal knowledge base with Trilium Notes",
"private": true,
"main": "src/main.ts",

View File

@@ -1,6 +1,6 @@
{
"name": "@triliumnext/server",
"version": "0.101.0",
"version": "0.101.1",
"description": "The server-side component of TriliumNext, which exposes the client via the web, allows for sync and provides a REST API for both internal and external use.",
"private": true,
"main": "./src/main.ts",

View File

@@ -20,13 +20,19 @@
"hero_section": {
"github": "GitHub",
"get_started": "ابدأ الان",
"dockerhub": "مستودع Docker"
"dockerhub": "مستودع Docker",
"title": "رتب أفكارك. ابنِ قاعدة معرفتك الشخصية.",
"subtitle": "تريليوم هو حل مفتوح المصدر لتدوين الملاحظات وتنظيم قاعدة المعرفة الشخصية. استخدمه محليًا على جهاز الكمبيوتر الخاص بك، أو قم بمزامنته مع خادمك المستضاف ذاتيًا للاحتفاظ بملاحظاتك أينما كنت.",
"screenshot_alt": "لقطة شاشة لتطبيق Trilium Notes لسطح المكتب"
},
"organization_benefits": {
"title": "تنظيم",
"note_structure_title": "هيكيلية الملاحظة",
"hoisting_title": "مساحات العمل والتركيز على الملاحظة",
"attributes_title": "العلاقات وجداول الملاحظة"
"attributes_title": "العلاقات وجداول الملاحظة",
"note_structure_description": "يمكن تنظيم الملاحظات بشكل هرمي. لا حاجة للمجلدات، إذ يمكن أن تحتوي كل ملاحظة على ملاحظات فرعية. ويمكن إضافة الملاحظة الواحدة في عدة مواضع ضمن التسلسل الهرمي.",
"attributes_description": "استخدم العلاقات بين الملاحظات أو أضف تصنيفات لتسهيل عملية التصنيف. استخدم السمات المُروَّجة لإدخال معلومات مُهيكلة يمكن استخدامها في الجداول واللوحات.",
"hoisting_description": "يمكنك بسهولة فصل ملاحظاتك الشخصية وملاحظات العمل عن طريق تجميعها ضمن مساحة عمل، مما يركز شجرة الملاحظات الخاصة بك لعرض مجموعة محددة من الملاحظات فقط."
},
"productivity_benefits": {
"sync_title": "‎المزامنة",

72
docs/README-ar.md vendored
View File

@@ -11,14 +11,14 @@
# ملاحظات تريليوم
![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran)
![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\
![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium)
![GitHub Downloads (all assets, all
releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\
![رعاة GitHub](https://img.shields.io/github/sponsors/eliandoran) ![داعمو
LiberaPay](https://img.shields.io/liberapay/patrons/ElianDoran)\
![عمليات سحب Docker](https://img.shields.io/docker/pulls/triliumnext/trilium)
![تنزيلات GitHub (جميع الأصول، جميع
الإصدارات)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\
[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp)
[![Translation
status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/)
[![حالة
الترجمة](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/)
<!-- translate:off -->
<!-- LANGUAGE SWITCHER -->
@@ -38,22 +38,20 @@ script)](./README-ZH_TW.md) | [English](../README.md) | [French](./README-fr.md)
## ⬇️ تنزيل
- [النسخة الأخيرة](https://github.com/TriliumNext/Trilium/releases/latest)
نسخة مستقرة، محبذة لأكثر المستخدمين.
- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly)
unstable development version, updated daily with the latest features and
fixes.
- [الإصدار الليلي](https://github.com/TriliumNext/Trilium/releases/tag/nightly)
إصدار تطوير غير مستقر، يتم تحديثه يوميًا بأحدث الميزات والإصلاحات.
## 📚توثيق
**Visit our comprehensive documentation at
**يمكنكم الاطلاع على وثائقنا الشاملة على الرابط التالي:
[docs.triliumnotes.org](https://docs.triliumnotes.org/)**
يتوفر التوثيق لدينا بصيغ متعددة:
- **Online Documentation**: Browse the full documentation at
- **الوثائق الإلكترونية**: تصفح الوثائق الكاملة على
[docs.triliumnotes.org](https://docs.triliumnotes.org/)
- **In-App Help**: Press `F1` within Trilium to access the same documentation
directly in the application
- **GitHub**: Navigate through the [User Guide](./User%20Guide/User%20Guide/) in
this repository
- **المساعدة داخل التطبيق**: اضغط على مفتاح `F1` داخل تطبيق Trilium للوصول إلى
نفس الوثائق مباشرةً داخل التطبيق
- **GitHub**: تصفح [دليل المستخدم](./User%20Guide/User%20Guide/) في هذا المستودع
### روابط سريعة
- [دليل البدء السريع](https://docs.triliumnotes.org/)
@@ -64,30 +62,30 @@ script)](./README-ZH_TW.md) | [English](../README.md) | [French](./README-fr.md)
للملاحظات](https://docs.triliumnotes.org/user-guide/setup/upgrading)
- [مفاهيم ومميزات
اساسية](https://docs.triliumnotes.org/user-guide/concepts/notes)
- [Patterns of Personal Knowledge
Base](https://docs.triliumnotes.org/user-guide/misc/patterns-of-personal-knowledge)
- [أنماط قاعدة المعرفة
الشخصية](https://docs.triliumnotes.org/user-guide/misc/patterns-of-personal-knowledge)
## 🎁الميزات
* Notes can be arranged into arbitrarily deep tree. Single note can be placed
into multiple places in the tree (see
[cloning](https://docs.triliumnotes.org/user-guide/concepts/notes/cloning))
* Rich WYSIWYG note editor including e.g. tables, images and
[math](https://docs.triliumnotes.org/user-guide/note-types/text) with markdown
[autoformat](https://docs.triliumnotes.org/user-guide/note-types/text/markdown-formatting)
* Support for editing [notes with source
code](https://docs.triliumnotes.org/user-guide/note-types/code), including
syntax highlighting
* Fast and easy [navigation between
notes](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-navigation),
full text search and [note
hoisting](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-hoisting)
* Seamless [note
versioning](https://docs.triliumnotes.org/user-guide/concepts/notes/note-revisions)
* Note
[attributes](https://docs.triliumnotes.org/user-guide/advanced-usage/attributes)
can be used for note organization, querying and advanced
[scripting](https://docs.triliumnotes.org/user-guide/scripts)
* يمكن ترتيب النوتات الموسيقية في شجرة ذات عمق غير محدود. ويمكن وضع نوتة واحدة
في أماكن متعددة في الشجرة (انظر
[الاستنساخ](https://docs.triliumnotes.org/user-guide/concepts/notes/cloning))
* محرر ملاحظات WYSIWYG غني يتضمن على سبيل المثال الجداول والصور
و[الرياضيات](https://docs.triliumnotes.org/user-guide/note-types/text) مع
تنسيق تلقائي لـ Markdown[2]
* دعم تحرير [الملاحظات التي تحتوي على شفرة
المصدر](https://docs.triliumnotes.org/user-guide/note-types/code)، بما في ذلك
تمييز بناء الجملة
* التنقل السريع والسهل بين الملاحظات
(https://docs.triliumnotes.org/user-guide/concepts/navigation/note-navigation)،
والبحث في النص الكامل، ورفع الملاحظات
(https://docs.triliumnotes.org/user-guide/concepts/navigation/note-hoisting)
* سلس [ملاحظة حول إصدار
النظام](https://docs.triliumnotes.org/user-guide/concepts/notes/note-revisions)
* يمكن استخدام
[السمات](https://docs.triliumnotes.org/user-guide/advanced-usage/attributes)
لتنظيم الملاحظات والاستعلام عنها و[البرمجة
النصية](https://docs.triliumnotes.org/user-guide/scripts) المتقدمة
* UI available in English, German, Spanish, French, Romanian, and Chinese
(simplified and traditional)
* Direct [OpenID and TOTP

View File

@@ -1,6 +1,6 @@
{
"formatVersion": 2,
"appVersion": "0.100.0",
"appVersion": "0.101.1",
"files": [
{
"isClone": false,
@@ -61,6 +61,32 @@
"attachments": [],
"dirFileName": "Release Notes",
"children": [
{
"isClone": false,
"noteId": "AgUcrU9nFXuW",
"notePath": [
"hD3V4hiu2VW4",
"AgUcrU9nFXuW"
],
"title": "v0.101.1",
"notePosition": 10,
"prefix": null,
"isExpanded": false,
"type": "text",
"mime": "text/html",
"attributes": [
{
"type": "relation",
"name": "template",
"value": "wyurrlcDl416",
"isInheritable": false,
"position": 60
}
],
"format": "markdown",
"dataFileName": "v0.101.1.md",
"attachments": []
},
{
"isClone": false,
"noteId": "uYwlZ594eyJu",
@@ -69,7 +95,7 @@
"uYwlZ594eyJu"
],
"title": "v0.101.0",
"notePosition": 10,
"notePosition": 20,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -95,7 +121,7 @@
"iPGKEk7pwJXK"
],
"title": "v0.100.0",
"notePosition": 20,
"notePosition": 30,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -121,7 +147,7 @@
"7HKMTjmopLcM"
],
"title": "v0.99.5",
"notePosition": 30,
"notePosition": 40,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -147,7 +173,7 @@
"RMBaNYPsRpIr"
],
"title": "v0.99.4",
"notePosition": 40,
"notePosition": 50,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -173,7 +199,7 @@
"yuroLztFfpu5"
],
"title": "v0.99.3",
"notePosition": 50,
"notePosition": 60,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -199,7 +225,7 @@
"z207sehwMJ6C"
],
"title": "v0.99.2",
"notePosition": 60,
"notePosition": 70,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -225,7 +251,7 @@
"WGQsXq2jNyTi"
],
"title": "v0.99.1",
"notePosition": 70,
"notePosition": 80,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -251,7 +277,7 @@
"cyw2Yue9vXf3"
],
"title": "v0.99.0",
"notePosition": 80,
"notePosition": 90,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -277,7 +303,7 @@
"QOJwjruOUr4k"
],
"title": "v0.98.1",
"notePosition": 90,
"notePosition": 100,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -303,7 +329,7 @@
"PLUoryywi0BC"
],
"title": "v0.98.0",
"notePosition": 100,
"notePosition": 110,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -329,7 +355,7 @@
"lvOuiWsLDv8F"
],
"title": "v0.97.2",
"notePosition": 110,
"notePosition": 120,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -355,7 +381,7 @@
"OtFZ6Nd9vM3n"
],
"title": "v0.97.1",
"notePosition": 120,
"notePosition": 130,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -381,7 +407,7 @@
"SJZ5PwfzHSQ1"
],
"title": "v0.97.0",
"notePosition": 130,
"notePosition": 140,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -407,7 +433,7 @@
"mYXFde3LuNR7"
],
"title": "v0.96.0",
"notePosition": 140,
"notePosition": 150,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -433,7 +459,7 @@
"jthwbL0FdaeU"
],
"title": "v0.95.0",
"notePosition": 150,
"notePosition": 160,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -459,7 +485,7 @@
"7HGYsJbLuhnv"
],
"title": "v0.94.1",
"notePosition": 160,
"notePosition": 170,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -485,7 +511,7 @@
"Neq53ujRGBqv"
],
"title": "v0.94.0",
"notePosition": 170,
"notePosition": 180,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -511,7 +537,7 @@
"VN3xnce1vLkX"
],
"title": "v0.93.0",
"notePosition": 180,
"notePosition": 190,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -529,7 +555,7 @@
"WRaBfQqPr6qo"
],
"title": "v0.92.7",
"notePosition": 190,
"notePosition": 200,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -555,7 +581,7 @@
"a2rwfKNmUFU1"
],
"title": "v0.92.6",
"notePosition": 200,
"notePosition": 210,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -573,7 +599,7 @@
"fEJ8qErr0BKL"
],
"title": "v0.92.5-beta",
"notePosition": 210,
"notePosition": 220,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -591,7 +617,7 @@
"kkkZQQGSXjwy"
],
"title": "v0.92.4",
"notePosition": 220,
"notePosition": 230,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -609,7 +635,7 @@
"vAroNixiezaH"
],
"title": "v0.92.3-beta",
"notePosition": 230,
"notePosition": 240,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -627,7 +653,7 @@
"mHEq1wxAKNZd"
],
"title": "v0.92.2-beta",
"notePosition": 240,
"notePosition": 250,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -645,7 +671,7 @@
"IykjoAmBpc61"
],
"title": "v0.92.1-beta",
"notePosition": 250,
"notePosition": 260,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -663,7 +689,7 @@
"dq2AJ9vSBX4Y"
],
"title": "v0.92.0-beta",
"notePosition": 260,
"notePosition": 270,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -681,7 +707,7 @@
"3a8aMe4jz4yM"
],
"title": "v0.91.6",
"notePosition": 270,
"notePosition": 280,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -699,7 +725,7 @@
"8djQjkiDGESe"
],
"title": "v0.91.5",
"notePosition": 280,
"notePosition": 290,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -717,7 +743,7 @@
"OylxVoVJqNmr"
],
"title": "v0.91.4-beta",
"notePosition": 290,
"notePosition": 300,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -735,7 +761,7 @@
"tANGQDvnyhrj"
],
"title": "v0.91.3-beta",
"notePosition": 300,
"notePosition": 310,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -753,7 +779,7 @@
"hMoBfwSoj1SC"
],
"title": "v0.91.2-beta",
"notePosition": 310,
"notePosition": 320,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -771,7 +797,7 @@
"a2XMSKROCl9z"
],
"title": "v0.91.1-beta",
"notePosition": 320,
"notePosition": 330,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -789,7 +815,7 @@
"yqXFvWbLkuMD"
],
"title": "v0.90.12",
"notePosition": 330,
"notePosition": 340,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -807,7 +833,7 @@
"veS7pg311yJP"
],
"title": "v0.90.11-beta",
"notePosition": 340,
"notePosition": 350,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -825,7 +851,7 @@
"sq5W9TQxRqMq"
],
"title": "v0.90.10-beta",
"notePosition": 350,
"notePosition": 360,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -843,7 +869,7 @@
"yFEGVCUM9tPx"
],
"title": "v0.90.9-beta",
"notePosition": 360,
"notePosition": 370,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -861,7 +887,7 @@
"o4wAGqOQuJtV"
],
"title": "v0.90.8",
"notePosition": 370,
"notePosition": 380,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -894,7 +920,7 @@
"i4A5g9iOg9I0"
],
"title": "v0.90.7-beta",
"notePosition": 380,
"notePosition": 390,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -912,7 +938,7 @@
"ThNf2GaKgXUs"
],
"title": "v0.90.6-beta",
"notePosition": 390,
"notePosition": 400,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -930,7 +956,7 @@
"G4PAi554kQUr"
],
"title": "v0.90.5-beta",
"notePosition": 400,
"notePosition": 410,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -957,7 +983,7 @@
"zATRobGRCmBn"
],
"title": "v0.90.4",
"notePosition": 410,
"notePosition": 420,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -975,7 +1001,7 @@
"sCDLf8IKn3Iz"
],
"title": "v0.90.3",
"notePosition": 420,
"notePosition": 430,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -993,7 +1019,7 @@
"VqqyBu4AuTjC"
],
"title": "v0.90.2-beta",
"notePosition": 430,
"notePosition": 440,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -1011,7 +1037,7 @@
"RX3Nl7wInLsA"
],
"title": "v0.90.1-beta",
"notePosition": 440,
"notePosition": 450,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -1029,7 +1055,7 @@
"GyueACukPWjk"
],
"title": "v0.90.0-beta",
"notePosition": 450,
"notePosition": 460,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -1047,7 +1073,7 @@
"kzjHexDTTeVB"
],
"title": "v0.48",
"notePosition": 460,
"notePosition": 470,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -1114,7 +1140,7 @@
"wyurrlcDl416"
],
"title": "Release Template",
"notePosition": 470,
"notePosition": 480,
"prefix": null,
"isExpanded": false,
"type": "text",

View File

@@ -12,7 +12,7 @@
* A new layout was introduced which heavily changes both existing UI elements, as well as adds some new ones (by @eliandoran and @adoriandoran, with special thanks for @rom1dep for the valuable suggestions).
* The goal of this new layout is to modernize the application and to make it more intuitive but at the same time to reduce clutter.
* See [documentation](https://docs.triliumnotes.org/user-guide/concepts/ui/New%20Layout) of the changes and the new UI elements.
* See [documentation](https://docs.triliumnotes.org/user-guide/concepts/ui/new-layout) of the changes and the new UI elements.
* Notes can be more easily navigated across the hierarchy using the breadcrumbs displayed underneath the tab bar.
* The old layout can still be used, for now. Feedback is welcome.
* Near the tab bar now there are [built-in buttons to go the previous or the next note in history](https://github.com/TriliumNext/Trilium/pull/8003/files) (only if the back/forward buttons are not already placed in the launch bar).

View File

@@ -0,0 +1,100 @@
# v0.101.1
> [!NOTE]
> This is a hotfix for yesterday's release, which marked the 8-year anniversary of Trilium, celebrating its [first public release](https://github.com/TriliumNext/Trilium/releases/tag/v0.0.9) on December 25th, 2017.  
> [!IMPORTANT]
> If you enjoyed this release, consider showing a token of appreciation by:
>
> * Pressing the “Star” button on [GitHub](https://github.com/TriliumNext/Trilium) (top-right).
> * Considering a one-time or recurrent donation to the [lead developer](https://github.com/eliandoran) via [GitHub Sponsors](https://github.com/sponsors/eliandoran) or [PayPal](https://paypal.me/eliandoran).
## 💡 Key highlights
* A new layout was introduced which heavily changes both existing UI elements, as well as adds some new ones (by @eliandoran and @adoriandoran, with special thanks for @rom1dep for the valuable suggestions).
* The goal of this new layout is to modernize the application and to make it more intuitive but at the same time to reduce clutter.
* See [documentation](https://docs.triliumnotes.org/user-guide/concepts/ui/new-layout) of the changes and the new UI elements.
* Notes can be more easily navigated across the hierarchy using the breadcrumbs displayed underneath the tab bar.
* The old layout can still be used, for now. Feedback is welcome.
* Near the tab bar now there are [built-in buttons to go the previous or the next note in history](https://github.com/TriliumNext/Trilium/pull/8003/files) (only if the back/forward buttons are not already placed in the launch bar).
* **Scripting overhaul:** Custom widgets and Render note can now be written in Preact using JSX instead of the legacy format (jQuery + custom component framework). For more information, see [documentation on Preact in Trilium](https://docs.triliumnotes.org/user-guide/scripts/frontend-basics/Preact).
## 🐞 New bugfixes in v0.101.1
* [Right pane toggle missing on macOS vertical layout](https://github.com/TriliumNext/Trilium/issues/8157)
* [Launchpad Note Launcher hoisting no longer working](https://github.com/TriliumNext/Trilium/issues/8160)
* Toggle right pane keyboard button not working on new layout
* [Tabs do not appear when using vertical layout and legacy theme](https://github.com/TriliumNext/Trilium/issues/8170) by @adoriandoran
* [Text in headings do not respond to being bolded](https://github.com/TriliumNext/Trilium/issues/8177) by @adoriandoran
* Table of contents in new layout: not displaying correctly on first render.
* [The text editor keeps crashing in non-HTTPS](https://github.com/TriliumNext/Trilium/issues/8165)
## 🐞 Bugfixes in v0.101.0
* [Ctrl+F when a dialog is open opens different search dialog](https://github.com/TriliumNext/Trilium/issues/5735)
* Toast: Icon missing for error messages
* Launch bar calendar would jump to the wrong week note if it was in between years.
* Launch bar calendar month selector was wrongly positioned.
* Tooltips would sometimes be duplicated if an element is focused.
* Text notes:
* Missing padding in `<pre>` without `<code>`.
* [Content disappears when inserting code block via Markdown formatting](https://github.com/TriliumNext/Trilium/issues/5776)
* [Data loss for opened tabs after CKEditor crash](https://github.com/TriliumNext/Trilium/issues/7739)
* [Mind Map export does not show text in links between nodes](https://github.com/TriliumNext/Trilium/issues/7829) by @lzinga
* Webview: Layout issues when no source site is set.
* Incorrect help button for content language.
* Links in inherited attributes not underlined.
* Mermaid preview did not render full-height if in read-only while in vertical layout.
* Icons: `border-left` icon was missing.
* Auto-complete shows empty name for hoisted note.
* [Missing null check for canvas elements in fulltext search](https://github.com/TriliumNext/Trilium/pull/8090) by @Soein
* Share badge would always indicate “Shared locally” when accessing the server version.
* Clicking in the outer area of a menu dismisses it.
* Geomap: street names not rendering in vector maps.
* In code options modal (ribbon), the tooltip is behind the modal.
* [Archived deeply nested notes appear in classic collections without #includeArchived](https://github.com/TriliumNext/Trilium/issues/8127)
* [Grid collection not displaying images properly](https://github.com/TriliumNext/Trilium/issues/7969)
* Printing collections: skip protected notes (if they are not unlocked) and files.
* [Attachment auto-deletion displayed time is off by a factor of 1000](https://github.com/TriliumNext/Trilium/issues/7987)
* [Note title color for legacy themes](https://github.com/TriliumNext/Trilium/pull/7997) by @Nriver
* [First input box of the promoted multi relation edits last relation](https://github.com/TriliumNext/Trilium/issues/7992)
## ✨ Improvements
* Improved error handling for custom widgets.
* Launch bar:
* The horizontal launch bar can now be scrolled simply by scrolling the mouse wheel.
* Tooltips are shown faster (no fade).
* Improved error handling
* HTTP errors are now more user-friendly.
* Warn on Traefik request failures.
* CKEditor crashes are notified, including an easy way to provide information for error reports.
* Hide ribbon in Options.
* Removed margins and rounded corners for the code editor.
* Backend logs: reduced extra padding & decrease font size for readability.
* Improved error handling for custom widgets.
* Code notes will now have a default icon based on the language (e.g. custom icon for JS code notes). Only a subset of languages have a dedicated icon.
* Printing collections will now display a message if one or more notes are not printable.
* UI improvements by @adoriandoran
## 📖 Documentation
* [Wrong links in README](https://github.com/TriliumNext/Trilium/issues/7246)
* [Improve organization of links](https://github.com/TriliumNext/Trilium/pull/8057)
* Widget scripts are now better documented, in both the legacy (jQuery) and Preact/JSX format.
## 🌍 Internationalization
* Untranslated error message for custom widgets.
## 🛠️ Technical updates
* Ported the following components to React. If you notice any issues with your launchers or the bar itself, feel free to report them.
* The launch bar and all its widgets.
* The toast/notification system.
* [Add dev shell and direnv support](https://github.com/TriliumNext/Trilium/pull/8011) by @yzx9 and @contributor
* **Minor breaking change**: custom widgets using the typo `node-detail-pane` will not be supported anymore. Use `note-detail-pane` instead.
* [ETAPI OpenAPI: Add missing share format](https://github.com/TriliumNext/Trilium/pull/8125) by @kalbasit
## 🔒️ Security fixes
* A security vulnerability was reported by @sivaadityacoder and fixed by @perfectra1n. More information to be provided in around a month.

View File

@@ -1,6 +1,6 @@
{
"name": "@triliumnext/source",
"version": "0.101.0",
"version": "0.101.1",
"description": "Build your personal knowledge base with Trilium Notes",
"directories": {
"doc": "docs"

View File

@@ -1,6 +1,6 @@
{
"name": "@triliumnext/commons",
"version": "0.101.0",
"version": "0.101.1",
"description": "Shared library between the clients (e.g. browser, Electron) and the server, mostly for type definitions and utility methods.",
"private": true,
"type": "module",