diff --git a/apps/build-docs/package.json b/apps/build-docs/package.json index 7534509f1c..ef5a0053bc 100644 --- a/apps/build-docs/package.json +++ b/apps/build-docs/package.json @@ -11,7 +11,7 @@ "license": "AGPL-3.0-only", "packageManager": "pnpm@10.27.0", "devDependencies": { - "@redocly/cli": "2.14.2", + "@redocly/cli": "2.14.3", "archiver": "7.0.1", "fs-extra": "11.3.3", "react": "19.2.3", diff --git a/apps/client/package.json b/apps/client/package.json index 52a7f7dc1b..57628fd371 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -56,7 +56,7 @@ "mark.js": "8.11.1", "marked": "17.0.1", "mermaid": "11.12.2", - "mind-elixir": "5.3.8", + "mind-elixir": "5.4.0", "normalize.css": "8.0.1", "panzoom": "9.4.3", "preact": "10.28.1", diff --git a/apps/client/src/stylesheets/theme-next/base.css b/apps/client/src/stylesheets/theme-next/base.css index 426c0fe62c..69f77569db 100644 --- a/apps/client/src/stylesheets/theme-next/base.css +++ b/apps/client/src/stylesheets/theme-next/base.css @@ -17,6 +17,8 @@ */ :root { + color-scheme: var(--theme-style); + --main-font-family: "Inter", sans-serif; --main-font-size: normal; diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index cd016eee12..f81e8fcf72 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -1260,13 +1260,15 @@ body.layout-horizontal #rest-pane > .classic-toolbar-widget { padding-top: 2px; background-color: var(--note-split-background-color, var(--main-background-color)); transition: border-color 250ms ease-in; - border: 1px solid transparent; - - &.active { - border-color: var(--link-selection-outline-color); - } + border: 2px solid transparent; } +/* The active split in a multi-split view */ +#center-pane > .split-note-container-widget:has(> .note-split.visible ~ .note-split.visible) > .note-split.active { + border-color: var(--link-selection-outline-color); +} + + body:not(.background-effects) #center-pane .note-split { animation: note-entrance 100ms linear; } diff --git a/apps/client/src/translations/cn/translation.json b/apps/client/src/translations/cn/translation.json index f4bbe4a352..651b3a2e01 100644 --- a/apps/client/src/translations/cn/translation.json +++ b/apps/client/src/translations/cn/translation.json @@ -1595,7 +1595,9 @@ "create-child-note": "创建子笔记", "unhoist": "取消聚焦", "toggle-sidebar": "切换侧边栏", - "dropping-not-allowed": "不允许移动笔记到此处。" + "dropping-not-allowed": "不允许移动笔记到此处。", + "shared-indicator-tooltip": "此笔记已公开分享", + "shared-indicator-tooltip-with-url": "此笔记已公开分享至:{{- url}}" }, "title_bar_buttons": { "window-on-top": "保持此窗口置顶" @@ -2224,5 +2226,11 @@ }, "attributes_panel": { "title": "笔记属性" + }, + "pdf": { + "attachments_other": "{{count}} 个附件", + "pages_other": "共{{count}}页", + "pages_alt": "第{{pageNumber}}页", + "pages_loading": "加载中..." } } diff --git a/apps/client/src/translations/hi/translation.json b/apps/client/src/translations/hi/translation.json index dcffce6e0a..6d3e6dfde5 100644 --- a/apps/client/src/translations/hi/translation.json +++ b/apps/client/src/translations/hi/translation.json @@ -9,7 +9,11 @@ }, "bundle-error": { "title": "एक कस्टम स्क्रिप्ट लोड करने में विफल रहा" - } + }, + "widget-list-error": { + "title": "सर्वर से विजेट्स की सूची प्राप्त करने में विफल" + }, + "open-script-note": "स्क्रिप्ट नोट खोलें" }, "update_available": { "update_available": "उपलब्ध अद्यतन" @@ -24,5 +28,8 @@ }, "show_floating_buttons_button": { "button_title": "बटन दिखाएं" + }, + "add_link": { + "note": "नोट" } } diff --git a/apps/client/src/translations/ja/translation.json b/apps/client/src/translations/ja/translation.json index 1851128ed8..6b4d7f5e29 100644 --- a/apps/client/src/translations/ja/translation.json +++ b/apps/client/src/translations/ja/translation.json @@ -1245,7 +1245,11 @@ "saved-search-note-refreshed": "保存した検索ノートが更新されました。", "refresh-saved-search-results": "保存した検索結果を更新", "toggle-sidebar": "サイドバーを切り替え", - "dropping-not-allowed": "この場所にノートをドロップすることはできません。" + "dropping-not-allowed": "この場所にノートをドロップすることはできません。", + "clone-indicator-tooltip": "このノートには {{- count}} 個の親があります: {{- parents}}", + "clone-indicator-tooltip-single": "このノートは複製されています (親が 1 件追加: {{- parent}})", + "shared-indicator-tooltip": "このノートは公開されています", + "shared-indicator-tooltip-with-url": "このノートは以下で公開されています: {{- url}}" }, "bulk_actions": { "bulk_actions": "一括操作", @@ -2224,5 +2228,12 @@ }, "attributes_panel": { "title": "ノート属性" + }, + "pdf": { + "attachments_other": "{{count}} 添付ファイル", + "layers_other": "{{count}} 層", + "pages_other": "{{count}} ページ", + "pages_alt": "ページ {{pageNumber}}", + "pages_loading": "読み込み中..." } } diff --git a/apps/client/src/translations/nb-NO/translation.json b/apps/client/src/translations/nb-NO/translation.json index 0967ef424b..a8681785d4 100644 --- a/apps/client/src/translations/nb-NO/translation.json +++ b/apps/client/src/translations/nb-NO/translation.json @@ -1 +1,22 @@ -{} +{ + "about": { + "title": "Om Trilium Notes", + "app_version": "App versjon:", + "db_version": "DB versjon:", + "sync_version": "Synk versjon:", + "build_date": "Byggdato:", + "build_revision": "Bygg versjon:", + "data_directory": "Datamappe:", + "homepage": "Hjemmeside:" + }, + "experimental_features": { + "new_layout_description": "Prøv det nye grensesnittet for et mer moderne utseende og forbedret brukervenlighet. Det må påregnes betydelige endringer i kommende versjoner." + }, + "cpu_arch_warning": { + "recommendation": "For den beste brukeropplevelsen, vennligst last ned den tilpassede ARM64-versjonen av TriliumNext fra siden for utgivelser." + }, + "zpetne_odkazy": { + "backlink_one": "{{count}} Tilbakelenke", + "backlink_other": "{{count}} Tilbakelenker" + } +} diff --git a/apps/client/src/widgets/note_wrapper.ts b/apps/client/src/widgets/note_wrapper.ts index 2b8959d113..fa912e25a8 100644 --- a/apps/client/src/widgets/note_wrapper.ts +++ b/apps/client/src/widgets/note_wrapper.ts @@ -64,7 +64,8 @@ export default class NoteWrapperWidget extends FlexContainer { this.$widget.addClass(utils.getMimeTypeClass(note.mime)); this.$widget.addClass(`view-mode-${this.noteContext?.viewScope?.viewMode ?? "default"}`); this.$widget.addClass(note.getColorClass()); - this.$widget.toggleClass(["bgfx", "options"], note.isOptions()); + this.$widget.toggleClass("options", note.isOptions()); + this.$widget.toggleClass("bgfx", this.#hasBackgroundEffects(note)); this.$widget.toggleClass("protected", note.isProtected); const noteLanguage = note?.getLabelValue("language"); @@ -88,6 +89,22 @@ export default class NoteWrapperWidget extends FlexContainer { return !!note?.isLabelTruthy("fullContentWidth"); } + #hasBackgroundEffects(note: FNote): boolean { + const MIME_TYPES_WITH_BACKGROUND_EFFECTS = [ + "application/pdf" + ] + + if (note.isOptions()) { + return true; + } + + if (note.type === "file" && MIME_TYPES_WITH_BACKGROUND_EFFECTS.includes(note.mime)) { + return true; + } + + return false; + } + async entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) { // listening on changes of note.type and CSS class const LABELS_CAUSING_REFRESH = ["cssClass", "language", "viewType", "color"]; diff --git a/apps/client/src/widgets/type_widgets/file/Pdf.tsx b/apps/client/src/widgets/type_widgets/file/Pdf.tsx index c915a0a5d4..cf1f2a3373 100644 --- a/apps/client/src/widgets/type_widgets/file/Pdf.tsx +++ b/apps/client/src/widgets/type_widgets/file/Pdf.tsx @@ -13,7 +13,8 @@ const VARIABLE_WHITELIST = new Set([ "root-background", "main-background-color", "main-border-color", - "main-text-color" + "main-text-color", + "theme-style" ]); export default function PdfPreview({ note, blob, componentId, noteContext }: { @@ -151,25 +152,6 @@ export default function PdfPreview({ note, blob, componentId, noteContext }: { } }, [ blob ]); - // Trigger focus when iframe content is clicked (iframe focus doesn't bubble) - useEffect(() => { - const iframe = iframeRef.current; - if (!iframe) return; - - const handleIframeClick = () => { - if (noteContext.ntxId) { - appContext.tabManager.activateNoteContext(noteContext.ntxId); - } - }; - - // Listen for clicks on the iframe's content window - const iframeDoc = iframe.contentWindow?.document; - if (iframeDoc) { - iframeDoc.addEventListener('click', handleIframeClick); - return () => iframeDoc.removeEventListener('click', handleIframeClick); - } - }, [ iframeRef.current?.contentWindow, noteContext ]); - return (historyConfig &&